production.
=== Configuration changes in 1.28 ===
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+ made by MediaWiki via a proxy. Relying on the http_proxy environment
+ variable is no longer supported.
* The load.php entry point now enforces the existing policy of not allowing
access to session data, which includes the session user and the session
user's language. If such access is attempted, an exception will be thrown.
* $wgForeignUploadTargets now defaults to `[ 'local' ]`, where `'local'`
signifies local uploads. A value of `[]` (empty array) now means that
no upload targets are allowed, effectively disabling the upload dialog.
+* The deprecated $wgEditEncoding variable has been removed; it was only used
+ for Esperanto language character conversion. You are now recommended to use
+ input methods provided by the UniversalLanguageSelector extension.
+* When $wgPingback is true, MediaWiki will periodically ping
+ https://www.mediawiki.org/beacon with basic information about the local
+ MediaWiki installation. This data includes, for example, the type of system,
+ PHP version, and chosen database backend. This behavior is off by default.
=== New features in 1.28 ===
* User::isBot() method for checking if an account is a bot role account.
* Added a new hook, 'UploadVerifyUpload', which can be used to reject a file
upload. Unlike 'UploadVerifyFile' it provides information about upload comment
and the file description page, but does not run for uploads to stash.
+* (T141604) Extensions can now provide a better error message when their
+ maintenance scripts are run without the extension being installed.
+* (T8948) Numeric sorting in categories is now supported by setting $wgCategoryCollation
+ to uca-default-u-kn or uca-<langcode>-u-kn. If migrating from another
+ collation, you will need to run the updateCollation.php maintenance script.
=== External library changes in 1.28 ===
=== Bug fixes in 1.28 ===
=== Action API changes in 1.28 ===
+* Added 'maxarticlesize' property to action=query&meta=siteinfo which contains
+ the value of $wgMaxArticleSize.
+* Property 'modulemessages' from action=parse&prop=modules was removed
+ (deprecated since 1.26).
+* The following response properties from action=login, deprecated in 1.27, are
+ now removed: lgtoken, cookieprefix, sessionid. Clients should handle cookies
+ to properly manage session state.
=== Action API internal changes in 1.28 ===
* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
* (T137411) ban (Balinese), thanks to translators Adi Mayndra, Andru,
BASAbali, M. Adiputra, Naval Scene, Nemo bis, NoiX180, and 아라.
+* (T135867) shn (Shan), thanks to translators Khun Sar, Piangpha,
+ Saiddzone Saimawnkham, Saosukham, and Sengwan.
=== Other changes in 1.28 ===
* (T128697) Improved handling of large diffs.
use or update a custom session provider if needed.
* Deprecated APIEditBeforeSave hook in favor of EditFilterMergedContent.
* The 'UploadVerification' hook is deprecated. Use 'UploadVerifyFile' instead.
+* SiteConfiguration::isLocalVHost() was removed (deprecated since 1.25).
+* The 'UserLoginComplete' hook has a new parameter to differentiate between actual
+ login and visiting the login page while already logged in.
+* ResourceLoader::makeLoaderURL() was removed (deprecated since 1.24).
+* $.fn.liveAndTestAtStart was removed (deprecated since 1.24).
+* Linker::link() and Linker::linkKnown() were deprecated; please instead use
+ MediaWiki\Linker\LinkRenderer. In addition, the LinkBegin and LinkEnd hooks
+ were replaced by HtmlPageLinkRendererBegin and HtmlPageLinkRendererEnd
+ respectively. See docs/hooks.txt for the specific changes needed for those hooks.
+* Aliases for Linker methods, deprecated since 1.21, were removed from Skin:
+ * Skin::commentBlock() (use Linker::commentBlock() instead)
+ * Skin::generateRollback() (use Linker::generateRollback() instead)
+ * Skin::link() (use MediaWiki\Linker\LinkRenderer instead)
+ * Skin::linkKnown() (use MediaWiki\Linker\LinkRenderer instead)
+ * Skin::userLink() (use Linker::userLink() instead)
+ * Skin::userToolLinks() (use Linker::userToolLinks() instead)
+* The 'ParserLimitReportFormat' hook was removed.
+* Disabled "bug 2702" HTML tidying of parsed UI messages on wikis where Tidy is
+ disabled.
+* DifferenceEngine::generateDiffBody() was removed (deprecated since 1.21).
+* UploadBase::stashFileGetKey() and UploadBase::stashSession() were deprecated.
+ Use ...->stashFile()->getFileKey() instead.
== Compatibility ==
-
This file provides an overview of the MediaWiki upgrade process. For help with
specific problems, check
-* the documentation at https://www.mediawiki.org
+* the documentation at https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/
* the mediawiki-l mailing list archive at
http://lists.wikimedia.org/pipermail/mediawiki-l/
-* the bug tracker at https://phabricator.wikimedia.org
+* the bug tracker at https://phabricator.wikimedia.org/
for information and workarounds to common issues.
== Overview ==
Comprehensive documentation on upgrading to the latest version of the software
-is available at https://www.mediawiki.org/wiki/Manual:Upgrading.
+is available at https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Upgrading
=== Consult the release notes ===
the upgrade scripts are somewhat robust, there is no guarantee that things will
not fail, leaving the database in an inconsistent state.
-https://www.mediawiki.org/wiki/Manual:Backing_up_a_wiki provides an overview of
+https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Backing_up_a_wiki provides an overview of
the backup process. You should also refer to the documentation for your
database management system for information on backing up a database, and to
your operating system documentation for information on making copies of files.
'ApiClientLogin' => __DIR__ . '/includes/api/ApiClientLogin.php',
'ApiComparePages' => __DIR__ . '/includes/api/ApiComparePages.php',
'ApiContinuationManager' => __DIR__ . '/includes/api/ApiContinuationManager.php',
- 'ApiCreateAccount' => __DIR__ . '/includes/api/ApiCreateAccount.php',
'ApiDelete' => __DIR__ . '/includes/api/ApiDelete.php',
'ApiDisabled' => __DIR__ . '/includes/api/ApiDisabled.php',
'ApiEditPage' => __DIR__ . '/includes/api/ApiEditPage.php',
'AuthManagerSpecialPage' => __DIR__ . '/includes/specialpage/AuthManagerSpecialPage.php',
'AuthPlugin' => __DIR__ . '/includes/AuthPlugin.php',
'AuthPluginUser' => __DIR__ . '/includes/AuthPlugin.php',
+ 'AutoCommitUpdate' => __DIR__ . '/includes/deferred/AutoCommitUpdate.php',
'AutoLoader' => __DIR__ . '/includes/AutoLoader.php',
'AutoloadGenerator' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
'Autopromote' => __DIR__ . '/includes/Autopromote.php',
'ClassCollector' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
'CleanupAncientTables' => __DIR__ . '/maintenance/cleanupAncientTables.php',
'CleanupBlocks' => __DIR__ . '/maintenance/cleanupBlocks.php',
+ 'CleanupEmptyCategories' => __DIR__ . '/maintenance/cleanupEmptyCategories.php',
'CleanupPreferences' => __DIR__ . '/maintenance/cleanupPreferences.php',
'CleanupRemovedModules' => __DIR__ . '/maintenance/cleanupRemovedModules.php',
'CleanupSpam' => __DIR__ . '/maintenance/cleanupSpam.php',
'DateFormats' => __DIR__ . '/maintenance/language/date-formats.php',
'DateFormatter' => __DIR__ . '/includes/parser/DateFormatter.php',
'DeadendPagesPage' => __DIR__ . '/includes/specials/SpecialDeadendpages.php',
+ 'DeferrableCallback' => __DIR__ . '/includes/deferred/DeferrableCallback.php',
'DeferrableUpdate' => __DIR__ . '/includes/deferred/DeferrableUpdate.php',
'DeferredStringifier' => __DIR__ . '/includes/libs/DeferredStringifier.php',
'DeferredUpdates' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
'GitInfo' => __DIR__ . '/includes/GitInfo.php',
'GlobalDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
'GlobalVarConfig' => __DIR__ . '/includes/config/GlobalVarConfig.php',
- 'HTMLApiField' => __DIR__ . '/includes/htmlform/HTMLApiField.php',
- 'HTMLAutoCompleteSelectField' => __DIR__ . '/includes/htmlform/HTMLAutoCompleteSelectField.php',
- 'HTMLButtonField' => __DIR__ . '/includes/htmlform/HTMLButtonField.php',
+ 'HTMLApiField' => __DIR__ . '/includes/htmlform/fields/HTMLApiField.php',
+ 'HTMLAutoCompleteSelectField' => __DIR__ . '/includes/htmlform/fields/HTMLAutoCompleteSelectField.php',
+ 'HTMLButtonField' => __DIR__ . '/includes/htmlform/fields/HTMLButtonField.php',
'HTMLCacheUpdate' => __DIR__ . '/includes/deferred/HTMLCacheUpdate.php',
'HTMLCacheUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/HTMLCacheUpdateJob.php',
- 'HTMLCheckField' => __DIR__ . '/includes/htmlform/HTMLCheckField.php',
- 'HTMLCheckMatrix' => __DIR__ . '/includes/htmlform/HTMLCheckMatrix.php',
- 'HTMLComboboxField' => __DIR__ . '/includes/htmlform/HTMLComboboxField.php',
- 'HTMLEditTools' => __DIR__ . '/includes/htmlform/HTMLEditTools.php',
+ 'HTMLCheckField' => __DIR__ . '/includes/htmlform/fields/HTMLCheckField.php',
+ 'HTMLCheckMatrix' => __DIR__ . '/includes/htmlform/fields/HTMLCheckMatrix.php',
+ 'HTMLComboboxField' => __DIR__ . '/includes/htmlform/fields/HTMLComboboxField.php',
+ 'HTMLEditTools' => __DIR__ . '/includes/htmlform/fields/HTMLEditTools.php',
'HTMLFileCache' => __DIR__ . '/includes/cache/HTMLFileCache.php',
- 'HTMLFloatField' => __DIR__ . '/includes/htmlform/HTMLFloatField.php',
+ 'HTMLFloatField' => __DIR__ . '/includes/htmlform/fields/HTMLFloatField.php',
'HTMLForm' => __DIR__ . '/includes/htmlform/HTMLForm.php',
'HTMLFormField' => __DIR__ . '/includes/htmlform/HTMLFormField.php',
- 'HTMLFormFieldCloner' => __DIR__ . '/includes/htmlform/HTMLFormFieldCloner.php',
+ 'HTMLFormFieldCloner' => __DIR__ . '/includes/htmlform/fields/HTMLFormFieldCloner.php',
'HTMLFormFieldRequiredOptionsException' => __DIR__ . '/includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
- 'HTMLFormFieldWithButton' => __DIR__ . '/includes/htmlform/HTMLFormFieldWithButton.php',
- 'HTMLHiddenField' => __DIR__ . '/includes/htmlform/HTMLHiddenField.php',
- 'HTMLInfoField' => __DIR__ . '/includes/htmlform/HTMLInfoField.php',
- 'HTMLIntField' => __DIR__ . '/includes/htmlform/HTMLIntField.php',
- 'HTMLMultiSelectField' => __DIR__ . '/includes/htmlform/HTMLMultiSelectField.php',
+ 'HTMLFormFieldWithButton' => __DIR__ . '/includes/htmlform/fields/HTMLFormFieldWithButton.php',
+ 'HTMLHiddenField' => __DIR__ . '/includes/htmlform/fields/HTMLHiddenField.php',
+ 'HTMLInfoField' => __DIR__ . '/includes/htmlform/fields/HTMLInfoField.php',
+ 'HTMLIntField' => __DIR__ . '/includes/htmlform/fields/HTMLIntField.php',
+ 'HTMLMultiSelectField' => __DIR__ . '/includes/htmlform/fields/HTMLMultiSelectField.php',
'HTMLNestedFilterable' => __DIR__ . '/includes/htmlform/HTMLNestedFilterable.php',
- 'HTMLRadioField' => __DIR__ . '/includes/htmlform/HTMLRadioField.php',
- 'HTMLSelectAndOtherField' => __DIR__ . '/includes/htmlform/HTMLSelectAndOtherField.php',
- 'HTMLSelectField' => __DIR__ . '/includes/htmlform/HTMLSelectField.php',
- 'HTMLSelectLimitField' => __DIR__ . '/includes/htmlform/HTMLSelectLimitField.php',
- 'HTMLSelectNamespace' => __DIR__ . '/includes/htmlform/HTMLSelectNamespace.php',
- 'HTMLSelectNamespaceWithButton' => __DIR__ . '/includes/htmlform/HTMLSelectNamespaceWithButton.php',
- 'HTMLSelectOrOtherField' => __DIR__ . '/includes/htmlform/HTMLSelectOrOtherField.php',
- 'HTMLSubmitField' => __DIR__ . '/includes/htmlform/HTMLSubmitField.php',
- 'HTMLTagFilter' => __DIR__ . '/includes/htmlform/HTMLTagFilter.php',
- 'HTMLTextAreaField' => __DIR__ . '/includes/htmlform/HTMLTextAreaField.php',
- 'HTMLTextField' => __DIR__ . '/includes/htmlform/HTMLTextField.php',
- 'HTMLTextFieldWithButton' => __DIR__ . '/includes/htmlform/HTMLTextFieldWithButton.php',
- 'HTMLTitleTextField' => __DIR__ . '/includes/htmlform/HTMLTitleTextField.php',
- 'HTMLUserTextField' => __DIR__ . '/includes/htmlform/HTMLUserTextField.php',
+ 'HTMLRadioField' => __DIR__ . '/includes/htmlform/fields/HTMLRadioField.php',
+ 'HTMLSelectAndOtherField' => __DIR__ . '/includes/htmlform/fields/HTMLSelectAndOtherField.php',
+ 'HTMLSelectField' => __DIR__ . '/includes/htmlform/fields/HTMLSelectField.php',
+ 'HTMLSelectLimitField' => __DIR__ . '/includes/htmlform/fields/HTMLSelectLimitField.php',
+ 'HTMLSelectNamespace' => __DIR__ . '/includes/htmlform/fields/HTMLSelectNamespace.php',
+ 'HTMLSelectNamespaceWithButton' => __DIR__ . '/includes/htmlform/fields/HTMLSelectNamespaceWithButton.php',
+ 'HTMLSelectOrOtherField' => __DIR__ . '/includes/htmlform/fields/HTMLSelectOrOtherField.php',
+ 'HTMLSubmitField' => __DIR__ . '/includes/htmlform/fields/HTMLSubmitField.php',
+ 'HTMLTagFilter' => __DIR__ . '/includes/htmlform/fields/HTMLTagFilter.php',
+ 'HTMLTextAreaField' => __DIR__ . '/includes/htmlform/fields/HTMLTextAreaField.php',
+ 'HTMLTextField' => __DIR__ . '/includes/htmlform/fields/HTMLTextField.php',
+ 'HTMLTextFieldWithButton' => __DIR__ . '/includes/htmlform/fields/HTMLTextFieldWithButton.php',
+ 'HTMLTitleTextField' => __DIR__ . '/includes/htmlform/fields/HTMLTitleTextField.php',
+ 'HTMLUserTextField' => __DIR__ . '/includes/htmlform/fields/HTMLUserTextField.php',
'HWLDFWordAccumulator' => __DIR__ . '/includes/diff/DairikiDiff.php',
'HashBagOStuff' => __DIR__ . '/includes/libs/objectcache/HashBagOStuff.php',
'HashConfig' => __DIR__ . '/includes/config/HashConfig.php',
'LanguageConverter' => __DIR__ . '/languages/LanguageConverter.php',
'LanguageCu' => __DIR__ . '/languages/classes/LanguageCu.php',
'LanguageDsb' => __DIR__ . '/languages/classes/LanguageDsb.php',
- 'LanguageEo' => __DIR__ . '/languages/classes/LanguageEo.php',
'LanguageEs' => __DIR__ . '/languages/classes/LanguageEs.php',
'LanguageEt' => __DIR__ . '/languages/classes/LanguageEt.php',
'LanguageFi' => __DIR__ . '/languages/classes/LanguageFi.php',
'LoggedOutEditToken' => __DIR__ . '/includes/user/LoggedOutEditToken.php',
'LoggedUpdateMaintenance' => __DIR__ . '/maintenance/Maintenance.php',
'LoginForm' => __DIR__ . '/includes/specialpage/LoginSignupSpecialPage.php',
- 'LoginFormAuthManager' => __DIR__ . '/includes/specialpage/LoginSignupSpecialPage.php',
- 'LoginFormPreAuthManager' => __DIR__ . '/includes/specials/pre-authmanager/SpecialUserlogin.php',
'LoginHelper' => __DIR__ . '/includes/specials/helpers/LoginHelper.php',
'LoginSignupSpecialPage' => __DIR__ . '/includes/specialpage/LoginSignupSpecialPage.php',
'LonelyPagesPage' => __DIR__ . '/includes/specials/SpecialLonelypages.php',
'LongPagesPage' => __DIR__ . '/includes/specials/SpecialLongpages.php',
'MIMEsearchPage' => __DIR__ . '/includes/specials/SpecialMIMEsearch.php',
- 'MWCallableUpdate' => __DIR__ . '/includes/deferred/CallableUpdate.php',
+ 'MWCallableUpdate' => __DIR__ . '/includes/deferred/MWCallableUpdate.php',
'MWContentSerializationException' => __DIR__ . '/includes/content/ContentHandler.php',
'MWCryptHKDF' => __DIR__ . '/includes/utils/MWCryptHKDF.php',
'MWCryptHash' => __DIR__ . '/includes/utils/MWCryptHash.php',
'MarkpatrolledAction' => __DIR__ . '/includes/actions/MarkpatrolledAction.php',
'McTest' => __DIR__ . '/maintenance/mctest.php',
'MediaHandler' => __DIR__ . '/includes/media/MediaHandler.php',
+ 'MediaHandlerFactory' => __DIR__ . '/includes/media/MediaHandlerFactory.php',
'MediaStatisticsPage' => __DIR__ . '/includes/specials/SpecialMediaStatistics.php',
'MediaTransformError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
'MediaTransformInvalidParametersException' => __DIR__ . '/includes/media/MediaTransformInvalidParametersException.php',
'PNGMetadataExtractor' => __DIR__ . '/includes/media/PNGMetadataExtractor.php',
'PPCustomFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
'PPCustomFrame_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
- 'PPDAccum_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
'PPDPart' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
'PPDPart_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
'PPDStack' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
'PermissionsError' => __DIR__ . '/includes/exception/PermissionsError.php',
'PhpHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
'PhpXmlBugTester' => __DIR__ . '/includes/installer/PhpBugTests.php',
+ 'Pingback' => __DIR__ . '/includes/Pingback.php',
'PoolCounter' => __DIR__ . '/includes/poolcounter/PoolCounter.php',
'PoolCounterRedis' => __DIR__ . '/includes/poolcounter/PoolCounterRedis.php',
'PoolCounterWork' => __DIR__ . '/includes/poolcounter/PoolCounterWork.php',
'ResourceLoaderUserDefaultsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserDefaultsModule.php',
'ResourceLoaderUserModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserModule.php',
'ResourceLoaderUserOptionsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserOptionsModule.php',
+ 'ResourceLoaderUserStylesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserStylesModule.php',
'ResourceLoaderUserTokensModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserTokensModule.php',
'ResourceLoaderWikiModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderWikiModule.php',
'RestbaseVirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/RestbaseVirtualRESTService.php',
'SpecialChangeContentModel' => __DIR__ . '/includes/specials/SpecialChangeContentModel.php',
'SpecialChangeCredentials' => __DIR__ . '/includes/specials/SpecialChangeCredentials.php',
'SpecialChangeEmail' => __DIR__ . '/includes/specials/SpecialChangeEmail.php',
- 'SpecialChangeEmailPreAuthManager' => __DIR__ . '/includes/specials/pre-authmanager/SpecialChangeEmail.php',
'SpecialChangePassword' => __DIR__ . '/includes/specials/SpecialChangePassword.php',
- 'SpecialChangePasswordPreAuthManager' => __DIR__ . '/includes/specials/pre-authmanager/SpecialChangePassword.php',
'SpecialComparePages' => __DIR__ . '/includes/specials/SpecialComparePages.php',
'SpecialContributions' => __DIR__ . '/includes/specials/SpecialContributions.php',
'SpecialCreateAccount' => __DIR__ . '/includes/specials/SpecialCreateAccount.php',
- 'SpecialCreateAccountPreAuthManager' => __DIR__ . '/includes/specials/pre-authmanager/SpecialCreateAccount.php',
'SpecialDiff' => __DIR__ . '/includes/specials/SpecialDiff.php',
'SpecialEditTags' => __DIR__ . '/includes/specials/SpecialEditTags.php',
'SpecialEditWatchlist' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
'SpecialPageLanguage' => __DIR__ . '/includes/specials/SpecialPageLanguage.php',
'SpecialPagesWithProp' => __DIR__ . '/includes/specials/SpecialPagesWithProp.php',
'SpecialPasswordReset' => __DIR__ . '/includes/specials/SpecialPasswordReset.php',
- 'SpecialPasswordResetPreAuthManager' => __DIR__ . '/includes/specials/pre-authmanager/SpecialPasswordReset.php',
'SpecialPermanentLink' => __DIR__ . '/includes/specials/SpecialPermanentLink.php',
'SpecialPreferences' => __DIR__ . '/includes/specials/SpecialPreferences.php',
'SpecialPrefixindex' => __DIR__ . '/includes/specials/SpecialPrefixindex.php',
'SpecialUploadStashTooLargeException' => __DIR__ . '/includes/specials/SpecialUploadStash.php',
'SpecialUserLogin' => __DIR__ . '/includes/specials/SpecialUserLogin.php',
'SpecialUserLogout' => __DIR__ . '/includes/specials/SpecialUserLogout.php',
- 'SpecialUserlogoutPreAuthManager' => __DIR__ . '/includes/specials/pre-authmanager/SpecialUserlogout.php',
'SpecialVersion' => __DIR__ . '/includes/specials/SpecialVersion.php',
'SpecialWatchlist' => __DIR__ . '/includes/specials/SpecialWatchlist.php',
'SpecialWhatLinksHere' => __DIR__ . '/includes/specials/SpecialWhatlinkshere.php',
'UpdateArticleCount' => __DIR__ . '/maintenance/updateArticleCount.php',
'UpdateCollation' => __DIR__ . '/maintenance/updateCollation.php',
'UpdateDoubleWidthSearch' => __DIR__ . '/maintenance/updateDoubleWidthSearch.php',
+ 'UpdateExtensionJsonSchema' => __DIR__ . '/maintenance/updateExtensionJsonSchema.php',
'UpdateLogging' => __DIR__ . '/maintenance/archives/upgradeLogging.php',
'UpdateMediaWiki' => __DIR__ . '/maintenance/update.php',
'UpdateRestrictions' => __DIR__ . '/maintenance/updateRestrictions.php',
'UserOptions' => __DIR__ . '/maintenance/userOptions.inc',
'UserPasswordPolicy' => __DIR__ . '/includes/password/UserPasswordPolicy.php',
'UserRightsProxy' => __DIR__ . '/includes/user/UserRightsProxy.php',
- 'UsercreateTemplate' => __DIR__ . '/includes/templates/Usercreate.php',
- 'UserloginTemplate' => __DIR__ . '/includes/templates/Userlogin.php',
'UserrightsPage' => __DIR__ . '/includes/specials/SpecialUserrights.php',
'UsersPager' => __DIR__ . '/includes/specials/pagers/UsersPager.php',
'UtfNormal' => __DIR__ . '/includes/compat/normal/UtfNormal.php',
'WikiReference' => __DIR__ . '/includes/WikiMap.php',
'WikiRevision' => __DIR__ . '/includes/import/WikiRevision.php',
'WikiStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
+ 'WikiTextStructure' => __DIR__ . '/includes/content/WikiTextStructure.php',
'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php',
'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php',
'WinCacheBagOStuff' => __DIR__ . '/includes/libs/objectcache/WinCacheBagOStuff.php',
"ext-xml": "*",
"liuggio/statsd-php-client": "1.0.18",
"mediawiki/at-ease": "1.1.0",
- "oojs/oojs-ui": "0.17.6",
+ "oojs/oojs-ui": "0.17.7",
"oyejorge/less.php": "1.7.0.10",
"php": ">=5.5.9",
"psr/log": "1.0.0",
"wikimedia/relpath": "1.0.3",
"wikimedia/running-stat": "1.1.0",
"wikimedia/utfnormal": "1.0.3",
- "wikimedia/wrappedstring": "2.1.1",
+ "wikimedia/wrappedstring": "2.2.0",
"zordius/lightncandy": "0.23"
},
"require-dev": {
"jakub-onderka/php-parallel-lint": "0.9.2",
- "justinrainbow/json-schema": "~1.3",
+ "justinrainbow/json-schema": "~1.6",
"mediawiki/mediawiki-codesniffer": "0.7.2",
"monolog/monolog": "~1.18.2",
"nikic/php-parser": "1.4.1",
the most important parts of the code of MediaWiki. More in-depth documentation
can be found at:
https://www.mediawiki.org/wiki/Manual:Code
-
+ https://www.mediawiki.org/wiki/Developer_hub
API documentation is automatically generated and updated daily at:
https://doc.wikimedia.org/mediawiki-core/master/php/html/
This document is intended to provide useful advice for parties seeking to
-redistribute MediaWiki to end users. It's targeted particularly at maintainers
+redistribute MediaWiki to end users. It's targeted particularly at maintainers
for Linux distributions, since it's been observed that distribution packages of
-MediaWiki often break. We've consistently had to recommend that users seeking
+MediaWiki often break. We've consistently had to recommend that users seeking
support use official tarballs instead of their distribution's packages, and
-this often solves whatever problem the user is having. It would be nice if
+this often solves whatever problem the user is having. It would be nice if
this could change.
== Background: why web applications are different ==
MediaWiki is intended to be usable on any web host that provides support for
-PHP and a database. Many users of low-end shared hosting have very limited
+PHP and a database. Many users of low-end shared hosting have very limited
access to their machine: often only FTP access to some subdirectory of the web
-root. Support for these users entails several restrictions, such as:
+root. Support for these users entails several restrictions, such as:
- 1) We cannot require installation of any files outside the web root. Few of
+ 1) We cannot require installation of any files outside the web root. Few of
our users have access to directories like /usr or /etc.
2) We cannot require the ability to run any utility on the command line.
Many shared hosts have exec() and similar PHP functions disabled.
- 3) We cannot assume that the software has write access anywhere useful. The
+ 3) We cannot assume that the software has write access anywhere useful. The
user account that MediaWiki (including its installer) runs under is often
different from the account the user used to upload the files, and we might be
restricted by PHP settings such as safe mode or open_basedir.
Since anything that works on cheap shared hosting will work if you have shell
or root access too, MediaWiki's design is based around catering to the lowest
-common denominator. Although we support higher-end setups as well (like
+common denominator. Although we support higher-end setups as well (like
Wikipedia!), the way many things work by default is tailored toward shared
-hosting. These defaults are unconventional from the point of view of normal
+hosting. These defaults are unconventional from the point of view of normal
(non-web) applications -- they might conflict with distributors' policies, and
they certainly aren't ideal for someone who's installing MediaWiki as root.
== Directory structure ==
Because of constraint (1) above, MediaWiki does not conform to normal
-Unix filesystem layout. Hopefully we'll offer direct support for standard
+Unix filesystem layout. Hopefully we'll offer direct support for standard
layouts in the future, but for now *any change to the location of files is
-unsupported*. Moving things and leaving symlinks will *probably* not break
+unsupported*. Moving things and leaving symlinks will *probably* not break
anything, but it is *strongly* advised not to try any more intrusive changes to
-get MediaWiki to conform more closely to your filesystem hierarchy. Any such
+get MediaWiki to conform more closely to your filesystem hierarchy. Any such
attempt will almost certainly result in unnecessary bugs.
The standard recommended location to install MediaWiki, relative to the web
-root, is /w (so, e.g., /var/www/w). Rewrite rules can then be used to enable
-"pretty URLs" like /wiki/Article instead of /w/index.php?title=Article. (This
+root, is /w (so, e.g., /var/www/w). Rewrite rules can then be used to enable
+"pretty URLs" like /wiki/Article instead of /w/index.php?title=Article. (This
is the convention Wikipedia uses.) In theory, it should be possible to enable
the appropriate rewrite rules by default, if you can reconfigure the web
-server, but you'd need to alter LocalSettings.php too. See
+server, but you'd need to alter LocalSettings.php too. See
<https://www.mediawiki.org/wiki/Manual:Short_URL> for details on short URLs.
If you really must mess around with the directory structure, note that the
correctly:
* api.php, img_auth.php, index.php, load.php, opensearch_desc.php, thumb.php,
- profileinfo.php, redirect.php, trackback.php. These are the entry points for
- normal usage. This list may be incomplete and is subject to change.
+ profileinfo.php. These are the entry points for normal usage. This list may be
+ incomplete and is subject to change.
* mw-config/index.php: Used for web-based installation (sets up the database,
prompts for the name of the wiki, etc.).
- * images/: Used for uploaded files. This could be somewhere else if
+ * images/: Used for uploaded files. This could be somewhere else if
$wgUploadDirectory and $wgUploadPath are changed appropriately.
* skins/*/: Subdirectories of skins/ contain CSS and JavaScript files that
- must be accessible to web browsers. The PHP files and Skin.sample in skins/
- don't need to be accessible. This could be somewhere else if
+ must be accessible to web browsers. The PHP files and Skin.sample in skins/
+ don't need to be accessible. This could be somewhere else if
$wgStyleDirectory and $wgStylePath are changed appropriately.
* extensions/: Many extensions include CSS and JavaScript files in their
- extensions directory, and will break if they aren't web-accessible. Some
+ extensions directory, and will break if they aren't web-accessible. Some
extensions might theoretically provide additional entry points as well, at
least in principle.
But all files should keep their position relative to the web-visible
-installation directory no matter what. If you must move includes/ somewhere in
-/usr/share, provide a symlink from /var/www/w. If you don't, you *will* break
-something. You have been warned.
+installation directory no matter what. If you must move includes/ somewhere in
+/usr/share, provide a symlink from /var/www/w. If you don't, you *will* break
+something. You have been warned.
== Configuration ==
-MediaWiki is configured using LocalSettings.php. This is a PHP file that's
+MediaWiki is configured using LocalSettings.php. This is a PHP file that's
generated when the user visits mw-config/index.php to install the software, and
-which the user can edit by hand thereafter. It's just a plain old PHP file,
-and can contain any PHP statements. It usually sets global variables that are
+which the user can edit by hand thereafter. It's just a plain old PHP file,
+and can contain any PHP statements. It usually sets global variables that are
used for configuration, and includes files used by any extensions.
-Distributors can easily add extra statements to the autogenerated
-LocalSettings.php by changing mw-config/overrides.php (see that file for details
-and examples).
+Distributors can easily change the installer behavior, including LocalSettings
+generated, by placing their overrides into mw-config/overrides directory. Doing
+that is highly preferred to modifying MediaWiki code directly. See
+mw-config/overrides/README for more details and examples.
There's a new maintenance/install.php script which could be used for performing
an install through the command line.
intelligently:
* $wgEmergencyContact: An e-mail address that can be used to contact the wiki
- administrator. By default, "wikiadmin@ServerName".
+ administrator. By default, "wikiadmin@ServerName".
* $wgPasswordSender: The e-mail address to use when sending password e-mails.
By default, "MediaWiki Mail <apache@ServerName>".
(with ServerName guessed from the http request)
an inconsistent wiki that may produce blank pages (php errors) when new features
using the changed schema would be used.
-Since MediaWiki 1.17 it is possible to upgrade using the installer by providing
+Since MediaWiki 1.17 it is possible to upgrade using the web installer by providing
an arbitrary secret value stored as $wgUpgradeKey in LocalSettings (older versions
needed to rename LocalSettings.php in order to upgrade using the installer).
== Documentation ==
MediaWiki's official documentation is split between two places: the source
-code, and <https://www.mediawiki.org/>. The source code documentation is written
+code, and <https://www.mediawiki.org/>. The source code documentation is written
exclusively by developers, and so is likely to be reliable (at worst,
-outdated). However, it can be pretty sparse. mediawiki.org documentation is
+outdated). However, it can be pretty sparse. mediawiki.org documentation is
often much more thorough, but it's maintained by a wiki that's open to
anonymous edits, so its quality is sometimes sketchy -- don't assume that
anything there is officially endorsed!
== Upstream ==
MediaWiki is a project hosted and led by the Wikimedia Foundation, the
-not-for-profit charity that operates Wikipedia. Wikimedia employs the lead
+not-for-profit charity that operates Wikipedia. Wikimedia employs the lead
developer and several other paid developers, but commit access is given out
-liberally and there are multiple very active volunteer developers as well. A
+liberally and there are multiple very active volunteer developers as well. A
list of developers can be found at <https://www.mediawiki.org/wiki/Developers>.
-MediaWiki's bug tracker is at <https://bugzilla.wikimedia.org>. However, most
-developers follow the bug tracker little or not at all. The best place to
-post if you want to get developers' attention is the wikitech-l mailing list
-<https://lists.wikimedia.org/mailman/listinfo/wikitech-l>. Posts to wikitech-l
-will inevitably be read by multiple experienced MediaWiki developers. There's
+MediaWiki's bug tracker is at <https://phabricator.wikimedia.org>. However, you
+might find that the best place to post if you want to get developers' attention
+is the wikitech-l mailing list
+<https://lists.wikimedia.org/mailman/listinfo/wikitech-l>. Posts to wikitech-l
+will inevitably be read by multiple experienced MediaWiki developers. There's
also an active IRC chat at <irc://irc.freenode.net/mediawiki>, where there are
usually several developers at reasonably busy times of day.
-Unfortunately, we don't have a very good system for patch review. Patches
-should be submitted on Bugzilla (as unified diffs produced with "svn diff"
-against the latest trunk revision), but many patches languish without review
-until they bitrot into uselessness. You might want to get a developer to
-commit to reviewing your patch before you put too much effort into it.
-Reasonably straightforward patches shouldn't be too hard to get accepted if
-there's an interested developer, however -- posting to Bugzilla and then
-dropping a note on wikitech-l if nobody responds is a good tactic.
+Our Git repositories are hosted at <https://gerrit.wikimedia.org>, see
+<https://www.mediawiki.org/wiki/Gerrit> for more information. Patches should
+be submitted there. If you know which developers are best suited to review your
+patch, add them to it, otherwise ask on IRC to get better review time.
All redistributors of MediaWiki should be subscribed to mediawiki-announce
-<https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce>. It's
-extremely low-traffic, with an average of less than one post per month. All
+<https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce>. It's
+extremely low-traffic, with an average of less than one post per month. All
new releases are announced here, including critical security updates.
== Useful software to install ==
* APC (Alternative PHP Cache), XCache, or similar: Will greatly speed up the
execution of MediaWiki, and all other PHP applications, at some cost in
- memory usage. Will be used automatically for the most part.
- * clamav: Can be used for virus scanning of uploaded files. Enable with
+ memory usage. Will be used automatically for the most part.
+ * clamav: Can be used for virus scanning of uploaded files. Enable with
"$wgAntivirus = 'clamav';".
- * DjVuLibre: Allows processing of DjVu files. To enable this, set
+ * DjVuLibre: Allows processing of DjVu files. To enable this, set
"$wgDjvuDump = 'djvudump'; $wgDjvuRenderer = 'ddjvu'; $wgDjvuTxt = 'djvutxt';".
- * HTML Tidy: Fixes errors in HTML at runtime. Can be enabled with
+ * HTML Tidy: Fixes errors in HTML at runtime. Can be enabled with
"$wgUseTidy = true;".
- * ImageMagick: For resizing images. "$wgUseImageMagick = true;" will enable
- it. PHP's GD can also be used, but ImageMagick is preferable.
- * Squid: Can provide a drastic speedup and a major cut in resource
- consumption, but enabling it may interfere with other applications. It might
- be suitable for a separate mediawiki-squid package. For setup details, see:
- <https://www.mediawiki.org/wiki/Manual:Squid_caching>
+ * ImageMagick: For resizing images. "$wgUseImageMagick = true;" will enable
+ it. PHP's GD can also be used, but ImageMagick is preferable.
+ * HTTP cache such as Varnish or Squid: can provide a drastic speedup and a
+ major cut in resource consumption, but enabling it may interfere with other
+ applications. It might be suitable for a separate package. For setup details, see:
+ - <https://www.mediawiki.org/wiki/Manual:Varnish_caching>
+ - <https://www.mediawiki.org/wiki/Manual:Squid_caching>
* rsvg or other SVG rasterizer: ImageMagick can be used for SVG support, but
- is not ideal. Wikipedia (as of the time of this writing) uses rsvg. To
+ is not ideal. Wikipedia (as of the time of this writing) uses rsvg. To
enable, set "$wgSVGConverter = 'rsvg';" (or other as appropriate).
- * texvc: Included with MediaWiki. Instructions for compiling and
- installing it are in the math/ directory.
-MediaWiki uses some standard GNU utilities as well, such as diff and diff3. If
+MediaWiki uses some standard GNU utilities as well, such as diff and diff3. If
these are present in /usr/bin or some other reasonable location, they will be
configured automatically on install.
-MediaWiki also has a "job queue" that handles background processing. Because
+MediaWiki also has a "job queue" that handles background processing. Because
shared hosts often don't provide access to cron, the job queue is run on every
-page view by default. This means the background tasks aren't really done in
-the background. Busy wikis can set $wgJobRunRate to 0 and run
-maintenance/runJobs.php periodically out of cron. Distributors probably
+page view by default. This means the background tasks aren't really done in
+the background. Busy wikis can set $wgJobRunRate to 0 and run
+maintenance/runJobs.php periodically out of cron. Distributors probably
shouldn't set this up as a default, however, since the extra cron job is
unnecessary overhead for a little-used wiki.
== Web server configuration ==
MediaWiki includes several .htaccess files to restrict access to some
-directories. If the web server is not configured to support these files, and
+directories. If the web server is not configured to support these files, and
the relevant directories haven't been moved someplace inaccessible anyway (e.g.
symlinked in /usr/share with the web server configured to not follow symlinks),
then it might be useful to deny web access to those directories in the web
"type": "string",
"description": "Group with which this module should be loaded"
},
+ "deprecated": {
+ "type": ["object", "boolean"],
+ "description": "Whether the module is deprecated and usage is discouraged. Either a boolean or an object with key message can be used to customise deprecation message."
+ },
"position": {
"type": "string",
"description": "Position on the page to load this module at",
"capitallinkoverride": {
"type": "boolean",
"description": "Set $wgCapitalLinks on a per-namespace basis"
+ },
+ "conditional": {
+ "type": "boolean",
+ "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
+ "default": false
}
},
"required": ["id", "constant", "name"]
],
"description": "A function to be called right after MediaWiki processes this file"
},
+ "config_prefix": {
+ "type": "string",
+ "default": "wg",
+ "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+ },
"config": {
"type": "object",
"description": "Configuration options for this extension",
- "properties": {
- "_prefix": {
- "type": "string",
- "default": "wg",
- "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
- }
- },
"patternProperties": {
"^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
+ "type": "object",
"properties": {
- "_merge_strategy": {
+ "value": {
+ "required": true
+ },
+ "merge_strategy": {
"type": "string",
"enum": [
"array_merge_recursive",
"array_merge"
],
"default": "array_merge"
+ },
+ "path": {
+ "description": "Whether this should be interpreted as a filesystem path, relative to extension directory root",
+ "type": "boolean",
+ "default": false
+ },
+ "description": {
+ "type": ["string", "array"],
+ "description": "A description of the config setting, mostly for documentation/developers"
}
}
}
--- /dev/null
+{
+ "$schema": "http://json-schema.org/schema#",
+ "description": "MediaWiki extension.json schema",
+ "type": "object",
+ "properties": {
+ "manifest_version": {
+ "type": "integer",
+ "description": "Version of the extension.json schema the extension.json file is in.",
+ "required": true
+ },
+ "name": {
+ "type": "string",
+ "description": "The extension's canonical name.",
+ "required": true
+ },
+ "namemsg": {
+ "type": "string",
+ "description": "i18n message key of the extension's name."
+ },
+ "type": {
+ "type": "string",
+ "description": "The extension's type, as an index to $wgExtensionCredits.",
+ "default": "other"
+ },
+ "author": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "Extension's authors.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of this release of the extension."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL to the homepage for the extension.",
+ "format": "uri"
+ },
+ "description": {
+ "type": "string",
+ "description": "Raw description of the extension."
+ },
+ "descriptionmsg": {
+ "type": "string",
+ "description": "Message key for a i18n message describing the extension."
+ },
+ "license-name": {
+ "type": "string",
+ "description": "Short identifier for the license under which the extension is released.",
+ "enum": [
+ "AFL-1.1",
+ "AFL-1.2",
+ "AFL-2.0",
+ "AFL-2.1",
+ "AFL-3.0",
+ "APL-1.0",
+ "Aladdin",
+ "ANTLR-PD",
+ "Apache-1.0",
+ "Apache-1.1",
+ "Apache-2.0",
+ "APSL-1.0",
+ "APSL-1.1",
+ "APSL-1.2",
+ "APSL-2.0",
+ "Artistic-1.0",
+ "Artistic-1.0-cl8",
+ "Artistic-1.0-Perl",
+ "Artistic-2.0",
+ "AAL",
+ "BitTorrent-1.0",
+ "BitTorrent-1.1",
+ "BSL-1.0",
+ "BSD-2-Clause",
+ "BSD-2-Clause-FreeBSD",
+ "BSD-2-Clause-NetBSD",
+ "BSD-3-Clause",
+ "BSD-3-Clause-Clear",
+ "BSD-4-Clause",
+ "BSD-4-Clause-UC",
+ "CECILL-1.0",
+ "CECILL-1.1",
+ "CECILL-2.0",
+ "CECILL-B",
+ "CECILL-C",
+ "ClArtistic",
+ "CNRI-Python",
+ "CNRI-Python-GPL-Compatible",
+ "CPOL-1.02",
+ "CDDL-1.0",
+ "CDDL-1.1",
+ "CPAL-1.0",
+ "CPL-1.0",
+ "CATOSL-1.1",
+ "Condor-1.1",
+ "CC-BY-1.0",
+ "CC-BY-2.0",
+ "CC-BY-2.5",
+ "CC-BY-3.0",
+ "CC-BY-ND-1.0",
+ "CC-BY-ND-2.0",
+ "CC-BY-ND-2.5",
+ "CC-BY-ND-3.0",
+ "CC-BY-NC-1.0",
+ "CC-BY-NC-2.0",
+ "CC-BY-NC-2.5",
+ "CC-BY-NC-3.0",
+ "CC-BY-NC-ND-1.0",
+ "CC-BY-NC-ND-2.0",
+ "CC-BY-NC-ND-2.5",
+ "CC-BY-NC-ND-3.0",
+ "CC-BY-NC-SA-1.0",
+ "CC-BY-NC-SA-2.0",
+ "CC-BY-NC-SA-2.5",
+ "CC-BY-NC-SA-3.0",
+ "CC-BY-SA-1.0",
+ "CC-BY-SA-2.0",
+ "CC-BY-SA-2.5",
+ "CC-BY-SA-3.0",
+ "CC0-1.0",
+ "CUA-OPL-1.0",
+ "D-FSL-1.0",
+ "WTFPL",
+ "EPL-1.0",
+ "eCos-2.0",
+ "ECL-1.0",
+ "ECL-2.0",
+ "EFL-1.0",
+ "EFL-2.0",
+ "Entessa",
+ "ErlPL-1.1",
+ "EUDatagrid",
+ "EUPL-1.0",
+ "EUPL-1.1",
+ "Fair",
+ "Frameworx-1.0",
+ "FTL",
+ "AGPL-1.0",
+ "AGPL-3.0",
+ "GFDL-1.1",
+ "GFDL-1.2",
+ "GFDL-1.3",
+ "GPL-1.0",
+ "GPL-1.0+",
+ "GPL-2.0",
+ "GPL-2.0+",
+ "GPL-2.0-with-autoconf-exception",
+ "GPL-2.0-with-bison-exception",
+ "GPL-2.0-with-classpath-exception",
+ "GPL-2.0-with-font-exception",
+ "GPL-2.0-with-GCC-exception",
+ "GPL-3.0",
+ "GPL-3.0+",
+ "GPL-3.0-with-autoconf-exception",
+ "GPL-3.0-with-GCC-exception",
+ "LGPL-2.1",
+ "LGPL-2.1+",
+ "LGPL-3.0",
+ "LGPL-3.0+",
+ "LGPL-2.0",
+ "LGPL-2.0+",
+ "gSOAP-1.3b",
+ "HPND",
+ "IBM-pibs",
+ "IPL-1.0",
+ "Imlib2",
+ "IJG",
+ "Intel",
+ "IPA",
+ "ISC",
+ "JSON",
+ "LPPL-1.3a",
+ "LPPL-1.0",
+ "LPPL-1.1",
+ "LPPL-1.2",
+ "LPPL-1.3c",
+ "Libpng",
+ "LPL-1.02",
+ "LPL-1.0",
+ "MS-PL",
+ "MS-RL",
+ "MirOS",
+ "MIT",
+ "Motosoto",
+ "MPL-1.0",
+ "MPL-1.1",
+ "MPL-2.0",
+ "MPL-2.0-no-copyleft-exception",
+ "Multics",
+ "NASA-1.3",
+ "Naumen",
+ "NBPL-1.0",
+ "NGPL",
+ "NOSL",
+ "NPL-1.0",
+ "NPL-1.1",
+ "Nokia",
+ "NPOSL-3.0",
+ "NTP",
+ "OCLC-2.0",
+ "ODbL-1.0",
+ "PDDL-1.0",
+ "OGTSL",
+ "OLDAP-2.2.2",
+ "OLDAP-1.1",
+ "OLDAP-1.2",
+ "OLDAP-1.3",
+ "OLDAP-1.4",
+ "OLDAP-2.0",
+ "OLDAP-2.0.1",
+ "OLDAP-2.1",
+ "OLDAP-2.2",
+ "OLDAP-2.2.1",
+ "OLDAP-2.3",
+ "OLDAP-2.4",
+ "OLDAP-2.5",
+ "OLDAP-2.6",
+ "OLDAP-2.7",
+ "OPL-1.0",
+ "OSL-1.0",
+ "OSL-2.0",
+ "OSL-2.1",
+ "OSL-3.0",
+ "OLDAP-2.8",
+ "OpenSSL",
+ "PHP-3.0",
+ "PHP-3.01",
+ "PostgreSQL",
+ "Python-2.0",
+ "QPL-1.0",
+ "RPSL-1.0",
+ "RPL-1.1",
+ "RPL-1.5",
+ "RHeCos-1.1",
+ "RSCPL",
+ "Ruby",
+ "SAX-PD",
+ "SGI-B-1.0",
+ "SGI-B-1.1",
+ "SGI-B-2.0",
+ "OFL-1.0",
+ "OFL-1.1",
+ "SimPL-2.0",
+ "Sleepycat",
+ "SMLNJ",
+ "SugarCRM-1.1.3",
+ "SISSL",
+ "SISSL-1.2",
+ "SPL-1.0",
+ "Watcom-1.0",
+ "NCSA",
+ "VSL-1.0",
+ "W3C",
+ "WXwindows",
+ "Xnet",
+ "X11",
+ "XFree86-1.1",
+ "YPL-1.0",
+ "YPL-1.1",
+ "Zimbra-1.3",
+ "Zlib",
+ "ZPL-1.1",
+ "ZPL-2.0",
+ "ZPL-2.1",
+ "Unlicense"
+ ]
+ },
+ "requires": {
+ "type": "object",
+ "description": "Indicates what versions of MediaWiki core are required. This syntax may be extended in the future, for example to check dependencies between other extensions.",
+ "properties": {
+ "MediaWiki": {
+ "type": "string",
+ "description": "Version constraint string against MediaWiki core."
+ }
+ }
+ },
+ "ResourceFileModulePaths": {
+ "type": "object",
+ "description": "Default paths to use for all ResourceLoader file modules",
+ "additionalProperties": false,
+ "properties": {
+ "localBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all local paths, relative to current directory"
+ },
+ "remoteExtPath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths, relative to $wgExtensionAssetsPath"
+ },
+ "remoteSkinPath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths, relative to $wgStylePath"
+ }
+ }
+ },
+ "ResourceModules": {
+ "type": "object",
+ "description": "ResourceLoader modules to register",
+ "patternProperties": {
+ "^[a-zA-Z0-9-\\.]+$": {
+ "type": "object",
+ "anyOf": [
+ {
+ "description": "A ResourceLoaderFileModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "localBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+ },
+ "remoteBasePath": {
+ "type": "string",
+ "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+ },
+ "remoteExtPath": {
+ "type": "string",
+ "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+ },
+ "skipFunction": {
+ "type": "string",
+ "description": "Path to a file containing a JavaScript \"skip function\", if desired."
+ },
+ "scripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to always include (array of file paths)",
+ "items": {
+ "type": "string"
+ }
+ },
+ "languageScripts": {
+ "type": "object",
+ "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+ "patternProperties": {
+ "^[a-zA-Z0-9-]{2,}$": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "skinScripts": {
+ "type": "object",
+ "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+ "patternProperties": {
+ ".+": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "debugScripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to include in debug contexts",
+ "items": {
+ "type": "string"
+ }
+ },
+ "loaderScripts": {
+ "type": ["string", "array"],
+ "description": "Scripts to include in the startup module",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dependencies": {
+ "type": ["string", "array"],
+ "description": "Modules which must be loaded before this module",
+ "items": {
+ "type": "string"
+ }
+ },
+ "styles": {
+ "type": ["string", "array", "object"],
+ "description": "Styles to always load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "skinStyles": {
+ "type": "object",
+ "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+ "patternProperties": {
+ ".+": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "messages": {
+ "type": ["string", "array"],
+ "description": "Messages to always load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "group": {
+ "type": "string",
+ "description": "Group which this module should be loaded together with"
+ },
+ "deprecated": {
+ "type": ["object", "boolean"],
+ "description": "Whether the module is deprecated and usage is discouraged. Either a boolean or an object with key message can be used to customise deprecation message."
+ },
+ "position": {
+ "type": "string",
+ "description": "Position on the page to load this module at",
+ "enum": [
+ "bottom",
+ "top"
+ ]
+ },
+ "templates": {
+ "type": ["object", "array"],
+ "description": "Templates to be loaded for client-side usage"
+ },
+ "targets": {
+ "type": ["string", "array"],
+ "description": "ResourceLoader target the module can run on",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ {
+ "description": "A ResourceLoaderWikiModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "class": {
+ "enum": ["ResourceLoaderWikiModule"]
+ },
+ "group": {
+ "type": "string",
+ "description": "Group which this module should be loaded together with"
+ },
+ "position": {
+ "type": "string",
+ "description": "Position on the page to load this module at",
+ "enum": [
+ "bottom",
+ "top"
+ ]
+ },
+ "targets": {
+ "type": ["string", "array"],
+ "description": "ResourceLoader target the module can run on",
+ "items": {
+ "type": "string"
+ }
+ },
+ "scripts": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "styles": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ {
+ "description": "A ResourceLoaderImageModule definition",
+ "additionalProperties": false,
+ "properties": {
+ "class": {
+ "enum": ["ResourceLoaderImageModule"]
+ },
+ "data": {
+ "type": "string"
+ },
+ "prefix": {
+ "type": "string"
+ },
+ "selector": {
+ "type": "string"
+ },
+ "selectorWithoutVariant": {
+ "type": "string"
+ },
+ "selectorWithVariant": {
+ "type": "string"
+ },
+ "variants": {
+ "type": "object"
+ },
+ "images": {
+ "type": "object"
+ },
+ "position": {
+ "enum": [
+ "top",
+ "bottom"
+ ]
+ }
+ }
+ },
+ {
+ "description": "An arbitrary ResourceLoaderModule definition",
+ "properties": {
+ "class": {
+ "type": "string",
+ "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+ }
+ },
+ "required": ["class"]
+ }
+ ]
+ }
+ }
+ },
+ "ResourceModuleSkinStyles": {
+ "type": "object",
+ "description": "ResourceLoader modules for custom skin styles"
+ },
+ "ResourceLoaderSources": {
+ "type": "object",
+ "description": "ResourceLoader sources to register"
+ },
+ "ResourceLoaderLESSVars": {
+ "type": "object",
+ "description": "ResourceLoader LESS variables"
+ },
+ "ConfigRegistry": {
+ "type": "object",
+ "description": "Registry of factory functions to create Config objects"
+ },
+ "SessionProviders": {
+ "type": "object",
+ "description": "Session providers"
+ },
+ "AuthManagerAutoConfig": {
+ "type": "object",
+ "description": "AuthManager auto-configuration",
+ "additionalProperties": false,
+ "properties": {
+ "preauth": {
+ "type": "object",
+ "description": "Pre-authentication providers"
+ },
+ "primaryauth": {
+ "type": "object",
+ "description": "Primary authentication providers"
+ },
+ "secondaryauth": {
+ "type": "object",
+ "description": "Secondary authentication providers"
+ }
+ }
+ },
+ "CentralIdLookupProviders": {
+ "type": "object",
+ "description": "Central ID lookup providers"
+ },
+ "namespaces": {
+ "type": "array",
+ "description": "Method to add extra namespaces",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "constant": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "gender": {
+ "type": "object",
+ "properties": {
+ "male": {
+ "type": "string"
+ },
+ "female": {
+ "type": "string"
+ }
+ }
+ },
+ "subpages": {
+ "type": "boolean",
+ "default": false
+ },
+ "content": {
+ "type": "boolean",
+ "default": false
+ },
+ "defaultcontentmodel": {
+ "type": "string"
+ },
+ "protection": {
+ "type": ["string", "array"],
+ "description": "Userright(s) required to edit in this namespace"
+ },
+ "capitallinkoverride": {
+ "type": "boolean",
+ "description": "Set $wgCapitalLinks on a per-namespace basis"
+ },
+ "conditional": {
+ "type": "boolean",
+ "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)",
+ "default": false
+ }
+ },
+ "required": ["id", "constant", "name"]
+ }
+ },
+ "TrackingCategories": {
+ "type": "array",
+ "description": "Tracking category message keys",
+ "items": {
+ "type": "string"
+ }
+ },
+ "DefaultUserOptions": {
+ "type": "object",
+ "description": "Default values of user options"
+ },
+ "HiddenPrefs": {
+ "type": "array",
+ "description": "Preferences users cannot set",
+ "items": {
+ "type": "string"
+ }
+ },
+ "GroupPermissions": {
+ "type": "object",
+ "description": "Default permissions to give to user groups",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "RevokePermissions": {
+ "type": "object",
+ "description": "Default permissions to revoke from user groups",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "GrantPermissions": {
+ "type": "object",
+ "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "boolean"
+ }
+ }
+ }
+ }
+ },
+ "GrantPermissionGroups": {
+ "type": "object",
+ "description": "Map of grants to their UI grouping",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "type": "string"
+ }
+ }
+ },
+ "ImplicitGroups": {
+ "type": "array",
+ "description": "Implicit groups"
+ },
+ "GroupsAddToSelf": {
+ "type": "object",
+ "description": "Groups a user can add to themselves"
+ },
+ "GroupsRemoveFromSelf": {
+ "type": "object",
+ "description": "Groups a user can remove from themselves"
+ },
+ "AddGroups": {
+ "type": "object",
+ "description": "Groups a user can add to users"
+ },
+ "RemoveGroups": {
+ "type": "object",
+ "description": "Groups a user can remove from users"
+ },
+ "AvailableRights": {
+ "type": "array",
+ "description": "User rights added by the extension",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ContentHandlers": {
+ "type": "object",
+ "description": "Mapping of model ID to class name",
+ "patternProperties": {
+ "^[A-Za-z]+$": {
+ "type": "string"
+ }
+ }
+ },
+ "RateLimits": {
+ "type": "object",
+ "description": "Rate limits"
+ },
+ "RecentChangesFlags": {
+ "type": "object",
+ "description": "Flags (letter symbols) shown on RecentChanges pages"
+ },
+ "MediaHandlers": {
+ "type": "object",
+ "description": "Plugins for media file type handling. Each entry in the array maps a MIME type to a PHP class name."
+ },
+ "ExtensionFunctions": {
+ "type": [
+ "array",
+ "string"
+ ],
+ "description": "Function to call after setup has finished",
+ "items": {
+ "type": "string"
+ }
+ },
+ "ExtensionMessagesFiles": {
+ "type": "object",
+ "description": "File paths containing PHP internationalization data"
+ },
+ "MessagesDirs": {
+ "type": "object",
+ "description": "Directory paths containing JSON internationalization data"
+ },
+ "ExtensionEntryPointListFiles": {
+ "type": "object"
+ },
+ "SpecialPages": {
+ "type": "object",
+ "description": "SpecialPages implemented in this extension (mapping of page name to class name)"
+ },
+ "AutoloadClasses": {
+ "type": "object"
+ },
+ "Hooks": {
+ "type": [ "string", "object" ],
+ "description": "Hooks this extension uses (mapping of hook name to callback)"
+ },
+ "JobClasses": {
+ "type": "object",
+ "description": "Job types this extension implements (mapping of job type to class name)"
+ },
+ "LogTypes": {
+ "type": "array",
+ "description": "List of new log types this extension uses"
+ },
+ "LogRestrictions": {
+ "type": "object"
+ },
+ "FilterLogTypes": {
+ "type": "object"
+ },
+ "ActionFilteredLogs": {
+ "type": "object",
+ "description": "List of log types which can be filtered by log actions",
+ "patternProperties": {
+ "^[a-z-]+$": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z-]+$": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "LogNames": {
+ "type": "object"
+ },
+ "LogHeaders": {
+ "type": "object"
+ },
+ "LogActions": {
+ "type": "object"
+ },
+ "LogActionsHandlers": {
+ "type": "object"
+ },
+ "Actions": {
+ "type": "object"
+ },
+ "APIModules": {
+ "type": "object"
+ },
+ "APIFormatModules": {
+ "type": "object"
+ },
+ "APIMetaModules": {
+ "type": "object"
+ },
+ "APIPropModules": {
+ "type": "object"
+ },
+ "APIListModules": {
+ "type": "object"
+ },
+ "ValidSkinNames": {
+ "type": "object"
+ },
+ "FeedClasses": {
+ "type": "object",
+ "description": "Available feeds objects"
+ },
+ "SkinOOUIThemes": {
+ "type": "object"
+ },
+ "callback": {
+ "type": [
+ "array",
+ "string"
+ ],
+ "description": "A function to be called right after MediaWiki processes this file"
+ },
+ "config": {
+ "type": "object",
+ "description": "Configuration options for this extension",
+ "properties": {
+ "_prefix": {
+ "type": "string",
+ "default": "wg",
+ "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+ }
+ },
+ "patternProperties": {
+ "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
+ "properties": {
+ "_merge_strategy": {
+ "type": "string",
+ "enum": [
+ "array_merge_recursive",
+ "array_plus_2d",
+ "array_plus",
+ "array_merge"
+ ],
+ "default": "array_merge"
+ }
+ }
+ }
+ }
+ },
+ "ParserTestFiles": {
+ "type": "array",
+ "description": "Parser test suite files to be run by parserTests.php when no specific filename is passed to it"
+ },
+ "load_composer_autoloader": {
+ "type": "boolean",
+ "description": "Load the composer autoloader for this extension, if one is present"
+ }
+ }
+}
$id: id of the article that was deleted
$content: the Content of the deleted page
$logEntry: the ManualLogEntry used to record the deletion
+$archivedRevisionCount: the number of revisions archived during the deletion
'ArticleEditUpdateNewTalk': Before updating user_newtalk when a user talk page
was changed.
$id: User identifier
$title: User page title
&$tools: Array of tool links
+$specialPage: SpecialPage instance for context and services. Can be either
+ SpecialContributions or DeletedContributionsPage. Extensions should type
+ hint against a generic SpecialPage though.
'ConvertContent': Called by AbstractContent::convert when a conversion to
another content model is requested.
$row: the DB row for this line
&$classes: the classes to add to the surrounding <li>
+'DifferenceEngineMarkPatrolledLink': Allows extensions to change the "mark as patrolled" link
+which is shown both on the diff header as well as on the bottom of a page, usually
+wrapped in a span element which has class="patrollink".
+$differenceEngine: DifferenceEngine object
+&$markAsPatrolledLink: The "mark as patrolled" link HTML (string)
+$rcid: Recent change ID (rc_id) for this change (int)
+$token: Patrol token; $rcid is used in generating this variable
+
+'DifferenceEngineMarkPatrolledRCID': Allows extensions to possibly change the rcid parameter.
+For example the rcid might be set to zero due to the user being the same as the
+performer of the change but an extension might still want to show it under certain
+conditions.
+&$rcid: rc_id (int) of the change or 0
+$differenceEngine: DifferenceEngine object
+$change: RecentChange object
+$user: User object representing the current user
+
+'DifferenceEngineNewHeader': Allows extensions to change the $newHeader variable, which
+contains information about the new revision, such as the revision's author, whether
+the revision was marked as a minor edit or not, etc.
+$differenceEngine: DifferenceEngine object
+&$newHeader: The string containing the various #mw-diff-otitle[1-5] divs, which
+include things like revision author info, revision comment, RevisionDelete link and more
+$formattedRevisionTools: Array containing revision tools, some of which may have
+been injected with the DiffRevisionTools hook
+$nextlink: String containing the link to the next revision (if any); also included in $newHeader
+$rollback: Rollback link (string) to roll this revision back to the previous one, if any
+$newminor: String indicating if the new revision was marked as a minor edit
+$diffOnly: Boolean parameter passed to DifferenceEngine#showDiffPage, indicating
+whether we should show just the diff; passed in as a query string parameter to the
+various URLs constructed here (i.e. $nextlink)
+$rdel: RevisionDelete link for the new revision, if the current user is allowed
+to use the RevisionDelete feature
+$unhide: Boolean parameter indicating whether to show RevisionDeleted revisions
+
+'DifferenceEngineOldHeader': Allows extensions to change the $oldHeader variable, which
+contains information about the old revision, such as the revision's author, whether
+the revision was marked as a minor edit or not, etc.
+$differenceEngine: DifferenceEngine object
+&$oldHeader: The string containing the various #mw-diff-otitle[1-5] divs, which
+include things like revision author info, revision comment, RevisionDelete link and more
+$prevlink: String containing the link to the previous revision (if any); also included in $oldHeader
+$oldminor: String indicating if the old revision was marked as a minor edit
+$diffOnly: Boolean parameter passed to DifferenceEngine#showDiffPage, indicating
+whether we should show just the diff; passed in as a query string parameter to the
+various URLs constructed here (i.e. $prevlink)
+$ldel: RevisionDelete link for the old revision, if the current user is allowed
+to use the RevisionDelete feature
+$unhide: Boolean parameter indicating whether to show RevisionDeleted revisions
+
+'DifferenceEngineOldHeaderNoOldRev': Change the $oldHeader variable in cases when
+there is no old revision
+&$oldHeader: empty string by default
+
+'DifferenceEngineRenderRevisionAddParserOutput': Allows extensions to change the parser output.
+Return false to not add parser output via OutputPage's addParserOutput method.
+$differenceEngine: DifferenceEngine object
+$out: OutputPage object
+$parserOutput: ParserOutput object
+$wikiPage: WikiPage object
+
+DifferenceEngineRenderRevisionShowFinalPatrolLink': An extension can hook into this hook
+point and return false to not show the final "mark as patrolled" link on the bottom
+of a page.
+This hook has no arguments.
+
+'DifferenceEngineShowDiff': Allows extensions to affect the diff text which
+eventually gets sent to the OutputPage object.
+$differenceEngine: DifferenceEngine object
+
+'DifferenceEngineShowEmptyOldContent': Allows extensions to change the diff table
+body (without header) in cases when there is no old revision or the old and new
+revisions are identical.
+$differenceEngine: DifferenceEngine object
+
+'DifferenceEngineShowDiffPage': Add additional output via the available OutputPage
+object into the diff view
+$out: OutputPage object
+
'DiffRevisionTools': Override or extend the revision tools available from the
diff view, i.e. undo, etc.
$newRev: Revision object of the "new" revision
&$parser: Parser object
&$varCache: variable cache (array)
-'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare and
-ParserLimitReportFormat instead.
+'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare instead.
Called at the end of Parser:parse() when the parser will
include comments about size of the text parsed.
$parser: Parser object
&$limitReport: text that will be included (without comment tags)
-'ParserLimitReportFormat': Called for each row in the parser limit report that
-needs formatting. If nothing handles this hook, the default is to use "$key" to
-get the label, and "$key-value" or "$key-value-text"/"$key-value-html" to
-format the value.
-$key: Key for the limit report item (string)
-&$value: Value of the limit report item
-&$report: String onto which to append the data
-$isHTML: If true, $report is an HTML table with two columns; if false, it's
- text intended for display in a monospaced font.
-$localize: If false, $report should be output in English.
-
'ParserLimitReportPrepare': Called at the end of Parser:parse() when the parser
will include comments about size of the text parsed. Hooks should use
$output->setLimitReportData() to populate data. Functions for this hook should
$title: Current Title object being displayed in search results.
&$id: Revision ID (default is false, for latest)
+'SearchIndexFields': Add fields to search index mapping.
+&$fields: Array of fields, all implement SearchIndexField
+$engine: SearchEngine instance for which mapping is being built.
+
+'SearchDataForIndex': Add data to search document. Allows to add any data to
+the field map used to index the document.
+&$fields: Array of name => value pairs for fields
+$handler: ContentHandler for the content being indexed
+$page: WikiPage that is being indexed
+$output: ParserOutput that is produced from the page
+$engine: SearchEngine for which the indexing is intended
+
'SecondaryDataUpdates': Allows modification of the list of DataUpdates to
perform when page content is modified. Currently called by
AbstractContent::getSecondaryDataUpdates.
For functionality that needs to run after any login (API or web) use UserLoggedIn.
&$user: the user object that was created on login
&$inject_html: Any HTML to inject after the "logged in" message.
+$direct: (bool) The hook is called directly after a successful login. This will only happen once
+ per login. A UserLoginComplete call with direct=false can happen when the user visits the login
+ page while already logged in.
'UserLoginForm': DEPRECATED! Create an AuthenticationProvider instead.
Manipulate the login form.
+== User Information ==
+
Extensions are distributed separately. Drop them into this directory and enable
as per the extension's installation instructions.
You can find a list of extensions and documentation at
-<https://www.mediawiki.org/wiki/Category:Extensions>.
+<https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions>.
+== Development Information ==
If you are a developer, you might want to fetch the extension tree in another
directory and make a symbolic link:
}
}
+ $options = []; // HTTP header options
+ if ( isset( $_SERVER['HTTP_RANGE'] ) ) {
+ $options['range'] = $_SERVER['HTTP_RANGE'];
+ }
+ if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
+ $options['if-modified-since'] = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
+ }
+
if ( $request->getCheck( 'download' ) ) {
$headers[] = 'Content-Disposition: attachment';
}
// Stream the requested file
wfDebugLog( 'img_auth', "Streaming `" . $filename . "`." );
- $repo->streamFile( $filename, $headers );
+ $repo->streamFile( $filename, $headers, $options );
}
/**
require $filename;
}
- /**
- * Force a class to be run through the autoloader, helpful for things like
- * Sanitizer that have define()s outside of their class definition. Of course
- * this wouldn't be necessary if everything in MediaWiki was class-based. Sigh.
- *
- * @param string $class
- * @return bool Return the results of class_exists() so we know if we were successful
- */
- static function loadClass( $class ) {
- return class_exists( $class );
- }
-
/**
* Method to clear the protected class property $autoloadLocalClassesLower.
* Used in tests.
$this->mSubcats = 0;
$this->mFiles = 0;
+ # If the title exists, call refreshCounts to add a row for it.
+ if ( $this->mTitle->exists() ) {
+ DeferredUpdates::addCallableUpdate( [ $this, 'refreshCounts' ] );
+ }
+
return true;
} else {
return false; # Fail
[ 'LOCK IN SHARE MODE' ]
);
+ $shouldExist = $result->pages > 0 || $this->getTitle()->exists();
+
if ( $this->mID ) {
- # The category row already exists, so do a plain UPDATE instead
- # of INSERT...ON DUPLICATE KEY UPDATE to avoid creating a gap
- # in the cat_id sequence. The row may or may not be "affected".
- $dbw->update(
- 'category',
- [
- 'cat_pages' => $result->pages,
- 'cat_subcats' => $result->subcats,
- 'cat_files' => $result->files
- ],
- [ 'cat_title' => $this->mName ],
- __METHOD__
- );
- } else {
+ if ( $shouldExist ) {
+ # The category row already exists, so do a plain UPDATE instead
+ # of INSERT...ON DUPLICATE KEY UPDATE to avoid creating a gap
+ # in the cat_id sequence. The row may or may not be "affected".
+ $dbw->update(
+ 'category',
+ [
+ 'cat_pages' => $result->pages,
+ 'cat_subcats' => $result->subcats,
+ 'cat_files' => $result->files
+ ],
+ [ 'cat_title' => $this->mName ],
+ __METHOD__
+ );
+ } else {
+ # The category is empty and has no description page, delete it
+ $dbw->delete(
+ 'category',
+ [ 'cat_title' => $this->mName ],
+ __METHOD__
+ );
+ $this->mID = false;
+ }
+ } elseif ( $shouldExist ) {
+ # The category row doesn't exist but should, so create it. Use
+ # upsert in case of races.
$dbw->upsert(
'category',
[
],
__METHOD__
);
+ // @todo: Should we update $this->mID here? Or not since Category
+ // objects tend to be short lived enough to not matter?
}
$dbw->endAtomic( __METHOD__ );
*
* $cf = new CategoryFinder;
* $cf->seed(
- * array( 12345 ),
- * array( 'Category 1', 'Category 2' ),
+ * [ 12345 ],
+ * [ 'Category 1', 'Category 2' ],
* 'AND'
* );
* $a = $cf->run();
/** @var array Array of DBKEY category names for categories that don't have a page */
protected $deadend = [];
- /** @var array Array of [ID => array()] */
+ /** @var array Array of [ ID => [] ] */
protected $parents = [];
/** @var array Array of article/category IDs */
return $r;
}
+ /**
+ * Return pretty name which is display name if given and different from prefix text or
+ * the unprefixed page name.
+ *
+ * @return string HTML safe name.
+ */
+ function getPrettyPageNameHtml() {
+ $displayTitle = $this->getOutput()->getPageTitle();
+ if ( $displayTitle === $this->getTitle()->getPrefixedText() ) {
+ return htmlspecialchars( $this->getTitle()->getText() );
+ } else {
+ return $displayTitle;
+ }
+ }
+
/**
* @return string
*/
function getPagesSection() {
- $ti = wfEscapeWikiText( $this->title->getText() );
+ $name = $this->getPrettyPageNameHtml();
# Don't show articles section if there are none.
$r = '';
if ( $rescnt > 0 ) {
$r = "<div id=\"mw-pages\">\n";
- $r .= '<h2>' . $this->msg( 'category_header', $ti )->parse() . "</h2>\n";
+ $r .= '<h2>' . $this->msg( 'category_header' )->rawParams( $name )->parse() . "</h2>\n";
$r .= $countmsg;
$r .= $this->getSectionPagingLinks( 'page' );
$r .= $this->formatList( $this->articles, $this->articles_start_char );
* @return string
*/
function getImageSection() {
+ $name = $this->getPrettyPageNameHtml();
$r = '';
$rescnt = $this->showGallery ? $this->gallery->count() : count( $this->imgsNoGallery );
$dbcnt = $this->cat->getFileCount();
if ( $rescnt > 0 ) {
$r .= "<div id=\"mw-category-media\">\n";
$r .= '<h2>' .
- $this->msg(
- 'category-media-header',
- wfEscapeWikiText( $this->title->getText() )
- )->text() .
+ $this->msg( 'category-media-header' )->rawParams( $name )->parse() .
"</h2>\n";
$r .= $countmsg;
$r .= $this->getSectionPagingLinks( 'file' );
}
/**
- * Format a list of articles chunked by letter in a three-column
- * list, ordered vertically.
+ * Format a list of articles chunked by letter in a three-column list, ordered
+ * vertically. This is used for categories with a significant number of pages.
*
* TODO: Take the headers into account when creating columns, so they're
* more visually equal.
*
* TODO: shortList and columnList are similar, need merging
*
- * @param array $articles
- * @param string[] $articles_start_char
- * @return string
+ * @param string[] $articles HTML links to each article
+ * @param string[] $articles_start_char The header characters for each article
+ * @return string HTML to output
* @private
*/
static function columnList( $articles, $articles_start_char ) {
}
/**
- * Format a list of articles chunked by letter in a bullet list.
- * @param array $articles
- * @param string[] $articles_start_char
- * @return string
+ * Format a list of articles chunked by letter in a bullet list. This is used
+ * for categories with a small number of pages (when columns aren't needed).
+ * @param string[] $articles HTML links to each article
+ * @param string[] $articles_start_char The header characters for each article
+ * @return string HTML to output
* @private
*/
static function shortList( $articles, $articles_start_char ) {
$wgEnableAsyncUploads = false;
/**
- * These are additional characters that should be replaced with '-' in filenames
+ * Additional characters that are not allowed in filenames. They are replaced with '-' when
+ * uploading. Like $wgLegalTitleChars, this is a regexp character class.
+ *
+ * Slashes and backslashes are disallowed regardless of this setting, but included here for
+ * completeness.
*/
-$wgIllegalFileChars = ":";
+$wgIllegalFileChars = ":\\/\\\\";
/**
* What directory to place deleted uploads in.
/**
* Plugins for media file type handling.
* Each entry in the array maps a MIME type to a class name
+ *
+ * Core media handlers are listed in MediaHandlerFactory,
+ * and extensions should use extension.json.
*/
-$wgMediaHandlers = [
- 'image/jpeg' => 'JpegHandler',
- 'image/png' => 'PNGHandler',
- 'image/gif' => 'GIFHandler',
- 'image/tiff' => 'TiffHandler',
- 'image/webp' => 'WebPHandler',
- 'image/x-ms-bmp' => 'BmpHandler',
- 'image/x-bmp' => 'BmpHandler',
- 'image/x-xcf' => 'XCFHandler',
- 'image/svg+xml' => 'SvgHandler', // official
- 'image/svg' => 'SvgHandler', // compat
- 'image/vnd.djvu' => 'DjVuHandler', // official
- 'image/x.djvu' => 'DjVuHandler', // compat
- 'image/x-djvu' => 'DjVuHandler', // compat
-];
+$wgMediaHandlers = [];
/**
* Plugins for page content model handling.
'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize
'imageWidth' => 120, // Width of the cells containing images in galleries (in "px")
'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
- 'captionLength' => 25, // Length to truncate filename to in caption when using "showfilename"
+ 'captionLength' => true, // Deprecated @since 1.28
+ // Length to truncate filename to in caption when using "showfilename".
+ // A value of 'true' will truncate the filename to one line using CSS
+ // and will be the behaviour after deprecation.
'showBytes' => true, // Show the filesize in bytes in categories
'mode' => 'traditional',
];
/**
* Kept for extension compatibility; see $wgParserCacheType
- * @deprecated 1.26
+ * @deprecated since 1.26
*/
$wgEnableParserCache = true;
'zh-yue' => 'yue',
];
-/**
- * Character set for use in the article edit box. Language-specific encodings
- * may be defined.
- *
- * This historic feature is one of the first that was added by former MediaWiki
- * team leader Brion Vibber, and is used to support the Esperanto x-system.
- */
-$wgEditEncoding = '';
-
/**
* Set this to true to replace Arabic presentation forms with their standard
* forms in the U+0600-U+06FF block. This only works if $wgLanguageCode is
],
];
-/**
- * Disable AuthManager
- * @since 1.27
- * @deprecated since 1.27, for use during development only
- */
-$wgDisableAuthManager = false;
-
/**
* Configure AuthManager
*
$wgGroupPermissions['user']['reupload'] = true;
$wgGroupPermissions['user']['reupload-shared'] = true;
$wgGroupPermissions['user']['minoredit'] = true;
-$wgGroupPermissions['user']['purge'] = true; // can use ?action=purge without clicking "ok"
+$wgGroupPermissions['user']['purge'] = true;
$wgGroupPermissions['user']['sendemail'] = true;
$wgGroupPermissions['user']['applychangetags'] = true;
$wgGroupPermissions['user']['changetags'] = true;
CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
];
-/**
- * Whether the user must enter their password to change their e-mail address
- *
- * @since 1.20
- */
-$wgRequirePasswordforEmailChange = true;
-
/**
* Register handlers for specific types of sites.
*
]
];
+/**
+ * Share data about this installation with MediaWiki developers
+ *
+ * When set to true, MediaWiki will periodically ping https://www.mediawiki.org/ with basic
+ * data about this MediaWiki instance. This data includes, for example, the type of system,
+ * PHP version, and chosen database backend. The Wikimedia Foundation shares this data with
+ * MediaWiki developers to help guide future development efforts.
+ *
+ * For details about what data is sent, see: https://www.mediawiki.org/wiki/Pingback
+ *
+ * @var bool
+ * @since 1.28
+ */
+$wgPingback = false;
+
/**
* For really cool vim folding this needs to be at the end:
* vim: foldmarker=@{,@} foldmethod=marker
);
}
+ /**
+ * @deprecated since 1.28, use LinkRenderer::getLinkClasses() instead
+ */
public function getLinkColour( $t, $threshold ) {
+ wfDeprecated( __METHOD__, '1.28' );
return Linker::getLinkColour( $t, $threshold );
}
* @file
*/
+use MediaWiki\Logger\LoggerFactory;
+
/**
* The edit page/HTML interface (split from Article)
* The actual database and text munging is still in Article,
/** @var bool */
public $tooBig = false;
- /** @var bool */
- public $kblength = false;
-
/** @var bool */
public $missingComment = false;
/** @var bool */
protected $edit;
+ /** @var bool|int */
+ protected $contentLength = false;
+
/**
* @var bool Set in ApiEditPage, based on ContentHandler::allowsDirectApiEditing
*/
return $handler->makeEmptyContent();
} else {
- # nasty side-effect, but needed for consistency
- $this->contentModel = $rev->getContentModel();
- $this->contentFormat = $rev->getContentFormat();
+ // Content models should always be the same since we error
+ // out if they are different before this point.
+ $logger = LoggerFactory::getInstance( 'editpage' );
+ if ( $this->contentModel !== $rev->getContentModel() ) {
+ $logger->warning( "Overriding content model from current edit {prev} to {new}", [
+ 'prev' => $this->contentModel,
+ 'new' => $rev->getContentModel(),
+ 'title' => $this->getTitle()->getPrefixedDBkey(),
+ 'method' => __METHOD__
+ ] );
+ $this->contentModel = $rev->getContentModel();
+ }
+
+ // Given that the content models should match, the current selected
+ // format should be supported.
+ if ( !$content->isSupportedFormat( $this->contentFormat ) ) {
+ $logger->warning( "Current revision content format unsupported. Overriding {prev} to {new}", [
+
+ 'prev' => $this->contentFormat,
+ 'new' => $rev->getContentFormat(),
+ 'title' => $this->getTitle()->getPrefixedDBkey(),
+ 'method' => __METHOD__
+ ] );
+ $this->contentFormat = $rev->getContentFormat();
+ }
return $content;
}
return $this->mPreloadContent;
}
- $handler = ContentHandler::getForTitle( $this->getTitle() );
+ $handler = ContentHandler::getForModelID( $this->contentModel );
if ( $preload === '' ) {
return $handler->makeEmptyContent();
return $status;
}
- $this->kblength = (int)( strlen( $this->textbox1 ) / 1024 );
- if ( $this->kblength > $wgMaxArticleSize ) {
+ $this->contentLength = strlen( $this->textbox1 );
+ if ( $this->contentLength > $wgMaxArticleSize * 1024 ) {
// Error will be displayed by showEditForm()
$this->tooBig = true;
$status->setResult( false, self::AS_CONTENT_TOO_BIG );
}
// Check for length errors again now that the section is merged in
- $this->kblength = (int)( strlen( $this->toEditText( $content ) ) / 1024 );
- if ( $this->kblength > $wgMaxArticleSize ) {
+ $this->contentLength = strlen( $this->toEditText( $content ) );
+ if ( $this->contentLength > $wgMaxArticleSize * 1024 ) {
$this->tooBig = true;
$status->setResult( false, self::AS_MAX_ARTICLE_SIZE_EXCEEDED );
return $status;
$wgOut->addHTML( Html::rawElement( 'div', [ 'class' => 'hiddencats' ],
Linker::formatHiddenCategories( $this->page->getHiddenCategories() ) ) );
- $wgOut->addHTML( Html::rawElement( 'div', [ 'class' => 'limitreport' ],
- self::getPreviewLimitReport( $this->mParserOutput ) ) );
+ if ( $this->mParserOutput ) {
+ $wgOut->setLimitReportData( $this->mParserOutput->getLimitReportData() );
+ }
$wgOut->addModules( 'mediawiki.action.edit.collapsibleFooter' );
'wrap' => "<div class=\"mw-titleprotectedwarning\">\n$1</div>" ] );
}
- if ( $this->kblength === false ) {
- $this->kblength = (int)( strlen( $this->textbox1 ) / 1024 );
+ if ( $this->contentLength === false ) {
+ $this->contentLength = strlen( $this->textbox1 );
}
- if ( $this->tooBig || $this->kblength > $wgMaxArticleSize ) {
+ if ( $this->tooBig || $this->contentLength > $wgMaxArticleSize * 1024 ) {
$wgOut->wrapWikiMsg( "<div class='error' id='mw-edit-longpageerror'>\n$1\n</div>",
[
'longpageerror',
- $wgLang->formatNum( $this->kblength ),
+ $wgLang->formatNum( round( $this->contentLength / 1024, 3 ) ),
$wgLang->formatNum( $wgMaxArticleSize )
]
);
* @param string $summary The text of the summary to display
*/
protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
- global $wgOut, $wgContLang;
+ global $wgOut;
# Add a class if 'missingsummary' is triggered to allow styling of the summary line
$summaryClass = $this->missingSummary ? 'mw-summarymissed' : 'mw-summary';
if ( $isSubjectPreview ) {
return;
}
}
- $summary = $wgContLang->recodeForEdit( $summary );
$labelText = wfMessage( $isSubjectPreview ? 'subject' : 'summary' )->parse();
list( $label, $input ) = $this->getSummaryInput(
$summary,
return '';
}
- $limitReport = Html::rawElement( 'div', [ 'class' => 'mw-limitReportExplanation' ],
- wfMessage( 'limitreport-title' )->parseAsBlock()
+ return ResourceLoader::makeInlineScript(
+ ResourceLoader::makeConfigSetScript(
+ [ 'wgPageParseReport' => $output->getLimitReportData() ],
+ true
+ )
);
-
- // Show/hide animation doesn't work correctly on a table, so wrap it in a div.
- $limitReport .= Html::openElement( 'div', [ 'class' => 'preview-limit-report-wrapper' ] );
-
- $limitReport .= Html::openElement( 'table', [
- 'class' => 'preview-limit-report wikitable'
- ] ) .
- Html::openElement( 'tbody' );
-
- foreach ( $output->getLimitReportData() as $key => $value ) {
- if ( Hooks::run( 'ParserLimitReportFormat',
- [ $key, &$value, &$limitReport, true, true ]
- ) ) {
- $keyMsg = wfMessage( $key );
- $valueMsg = wfMessage( [ "$key-value-html", "$key-value" ] );
- if ( !$valueMsg->exists() ) {
- $valueMsg = new RawMessage( '$1' );
- }
- if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
- $limitReport .= Html::openElement( 'tr' ) .
- Html::rawElement( 'th', null, $keyMsg->parse() ) .
- Html::rawElement( 'td', null, $valueMsg->params( $value )->parse() ) .
- Html::closeElement( 'tr' );
- }
- }
- }
-
- $limitReport .= Html::closeElement( 'tbody' ) .
- Html::closeElement( 'table' ) .
- Html::closeElement( 'div' );
-
- return $limitReport;
}
protected function showStandardInputs( &$tabindex = 2 ) {
if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$this, &$wgOut ] ) ) {
$stats = $wgOut->getContext()->getStats();
$stats->increment( 'edit.failures.conflict' );
- if ( $this->mTitle->isTalkPage() ) {
- $stats->increment( 'edit.failures.conflict.byType.talk' );
- } else {
- $stats->increment( 'edit.failures.conflict.byType.subject' );
- }
- if ( $this->mTitle->getNamespace() === NS_PROJECT ) {
- $stats->increment( 'edit.failures.conflict.byNamespace.project' );
+ // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
+ if (
+ $this->mTitle->getNamespace() >= NS_MAIN &&
+ $this->mTitle->getNamespace() <= NS_CATEGORY_TALK
+ ) {
+ $stats->increment( 'edit.failures.conflict.byNamespaceId.' . $this->mTitle->getNamespace() );
}
$wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
* @return string
*/
protected function safeUnicodeOutput( $text ) {
- global $wgContLang;
- $codedText = $wgContLang->recodeForEdit( $text );
return $this->checkUnicodeCompliantBrowser()
- ? $codedText
- : $this->makeSafe( $codedText );
+ ? $text
+ : $this->makesafe( $text );
}
/**
global $wgRequest, $wgUser;
$purge = $wgRequest->getVal( 'action' ) === 'purge';
+ // Allow users with 'purge' right to clear feed caches
if ( $purge && $wgUser->isAllowed( 'purge' ) ) {
$cache = ObjectCache::getMainWANInstance();
$cache->delete( $timekey, 1 );
$dbw->endAtomic( __METHOD__ );
} else {
// Page deleted but file still there? rollback page delete
- $dbw->rollback( __METHOD__ );
+ wfGetLBFactory()->rollbackMasterChanges( __METHOD__ );
}
} else {
// Done; nothing changed
* Merge arrays in the style of getUserPermissionsErrors, with duplicate removal
* e.g.
* wfMergeErrorArrays(
- * array( array( 'x' ) ),
- * array( array( 'x', '2' ) ),
- * array( array( 'x' ) ),
- * array( array( 'y' ) )
+ * [ [ 'x' ] ],
+ * [ [ 'x', '2' ] ],
+ * [ [ 'x' ] ],
+ * [ [ 'y' ] ]
* );
* returns:
- * array(
- * array( 'x', '2' ),
- * array( 'x' ),
- * array( 'y' )
- * )
+ * [
+ * [ 'x', '2' ],
+ * [ 'x' ],
+ * [ 'y' ]
+ * ]
*
* @param array $array1,...
* @return array
$bits = parse_url( $url );
MediaWiki\restoreWarnings();
// parse_url() returns an array without scheme for some invalid URLs, e.g.
- // parse_url("%0Ahttp://example.com") == array( 'host' => '%0Ahttp', 'path' => 'example.com' )
+ // parse_url("%0Ahttp://example.com") == [ 'host' => '%0Ahttp', 'path' => 'example.com' ]
if ( !$bits || !isset( $bits['scheme'] ) ) {
return false;
}
* Supports base 2 through 36; digit values 10-36 are represented
* as lowercase letters a-z. Input is case-insensitive.
*
- * @deprecated 1.27 Use Wikimedia\base_convert() directly
+ * @deprecated since 1.27 Use Wikimedia\base_convert() directly
*
* @param string $input Input number
* @param int $sourceBase Base of the input number
}
/**
- * Replace all invalid characters with -
- * Additional characters can be defined in $wgIllegalFileChars (see bug 20489)
- * By default, $wgIllegalFileChars = ':'
+ * Replace all invalid characters with '-'.
+ * Additional characters can be defined in $wgIllegalFileChars (see T22489).
+ * By default, $wgIllegalFileChars includes ':', '/', '\'.
*
* @param string $name Filename to process
* @return string
function wfStripIllegalFilenameChars( $name ) {
global $wgIllegalFileChars;
$illegalFileChars = $wgIllegalFileChars ? "|[" . $wgIllegalFileChars . "]" : '';
- $name = wfBaseName( $name );
$name = preg_replace(
"/[^" . Title::legalChars() . "]" . $illegalFileChars . "/",
'-',
$name
);
+ // $wgIllegalFileChars may not include '/' and '\', so we still need to do this
+ $name = wfBaseName( $name );
return $name;
}
* @param string|null $deprecatedVersion Optionally mark hook as deprecated with version number
*
* @return bool True if no handler aborted the hook
- * @deprecated 1.25 - use Hooks::run
+ * @deprecated since 1.25 - use Hooks::run
*/
function wfRunHooks( $event, array $args = [], $deprecatedVersion = null ) {
return Hooks::run( $event, $args, $deprecatedVersion );
$attribs['version'] = $wgHtml5Version;
}
- $html = self::openElement( 'html', $attribs );
-
- if ( $html ) {
- $html .= "\n";
- }
-
- $ret .= $html;
+ $ret .= self::openElement( 'html', $attribs );
return $ret;
}
static function srcSet( array $urls ) {
$candidates = [];
foreach ( $urls as $density => $url ) {
- // Cast density to float to strip 'x'.
- $candidates[] = $url . ' ' . (float)$density . 'x';
+ // Cast density to float to strip 'x', then back to string to serve
+ // as array index.
+ $density = (string)(float)$density;
+ $candidates[$density] = $url;
}
+
+ // Remove duplicates that are the same as a smaller value
+ ksort( $candidates, SORT_NUMERIC );
+ $candidates = array_unique( $candidates );
+
+ // Append density info to the url
+ foreach ( $candidates as $density => $url ) {
+ $candidates[$density] = $url . ' ' . $density . 'x';
+ }
+
return implode( ", ", $candidates );
}
}
return Http::request( 'POST', $url, $options, $caller );
}
- /**
- * Check if the URL can be served by localhost
- *
- * @param string $url Full url to check
- * @return bool
- */
- public static function isLocalURL( $url ) {
- global $wgCommandLineMode, $wgLocalVirtualHosts;
-
- if ( $wgCommandLineMode ) {
- return false;
- }
-
- // Extract host part
- $matches = [];
- if ( preg_match( '!^http://([\w.-]+)[/:].*$!', $url, $matches ) ) {
- $host = $matches[1];
- // Split up dotwise
- $domainParts = explode( '.', $host );
- // Check if this domain or any superdomain is listed as a local virtual host
- $domainParts = array_reverse( $domainParts );
-
- $domain = '';
- $countParts = count( $domainParts );
- for ( $i = 0; $i < $countParts; $i++ ) {
- $domainPart = $domainParts[$i];
- if ( $i == 0 ) {
- $domain = $domainPart;
- } else {
- $domain = $domainPart . '.' . $domain;
- }
-
- if ( in_array( $domain, $wgLocalVirtualHosts ) ) {
- return true;
- }
- }
- }
-
- return false;
- }
-
/**
* A standard user-agent we can use for external requests.
* @return string
}
/**
- * Gets the relevant proxy from $wgHTTPProxy/http_proxy (when set).
+ * Gets the relevant proxy from $wgHTTPProxy
*
* @return mixed The proxy address or an empty string if not set.
*/
return $wgHTTPProxy;
}
- $envHttpProxy = getenv( "http_proxy" );
- if ( $envHttpProxy ) {
- return $envHttpProxy;
- }
-
return "";
}
}
return;
}
- // Otherwise, fallback to $wgHTTPProxy/http_proxy (when set) if this is not a machine
+ // Otherwise, fallback to $wgHTTPProxy if this is not a machine
// local URL and proxies are not disabled
- if ( Http::isLocalURL( $this->url ) || $this->noProxy ) {
+ if ( self::isLocalURL( $this->url ) || $this->noProxy ) {
$this->proxy = '';
} else {
$this->proxy = Http::getProxy();
}
}
+ /**
+ * Check if the URL can be served by localhost
+ *
+ * @param string $url Full url to check
+ * @return bool
+ */
+ private static function isLocalURL( $url ) {
+ global $wgCommandLineMode, $wgLocalVirtualHosts;
+
+ if ( $wgCommandLineMode ) {
+ return false;
+ }
+
+ // Extract host part
+ $matches = [];
+ if ( preg_match( '!^https?://([\w.-]+)[/:].*$!', $url, $matches ) ) {
+ $host = $matches[1];
+ // Split up dotwise
+ $domainParts = explode( '.', $host );
+ // Check if this domain or any superdomain is listed as a local virtual host
+ $domainParts = array_reverse( $domainParts );
+
+ $domain = '';
+ $countParts = count( $domainParts );
+ for ( $i = 0; $i < $countParts; $i++ ) {
+ $domainPart = $domainParts[$i];
+ if ( $i == 0 ) {
+ $domain = $domainPart;
+ } else {
+ $domain = $domainPart . '.' . $domain;
+ }
+
+ if ( in_array( $domain, $wgLocalVirtualHosts ) ) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
/**
* Set the user agent
* @param string $UA
/**
* Return the CSS colour of a known link
*
+ * @deprecated since 1.28, use LinkRenderer::getLinkClasses() instead
+ *
* @since 1.16.3
* @param LinkTarget $t
* @param int $threshold User defined threshold
* @return string CSS class
*/
public static function getLinkColour( LinkTarget $t, $threshold ) {
- $linkCache = MediaWikiServices::getInstance()->getLinkCache();
- // Make sure the target is in the cache
- $id = $linkCache->addLinkObj( $t );
- if ( $id == 0 ) {
- // Doesn't exist
- return '';
- }
-
- if ( $linkCache->getGoodLinkFieldObj( $t, 'redirect' ) ) {
- # Page is a redirect
- return 'mw-redirect';
- } elseif ( $threshold > 0 && MWNamespace::isContent( $t->getNamespace() )
- && $linkCache->getGoodLinkFieldObj( $t, 'length' ) < $threshold
- ) {
- # Page is a stub
- return 'stub';
+ wfDeprecated( __METHOD__, '1.28' );
+ $services = MediaWikiServices::getInstance();
+ $linkRenderer = $services->getLinkRenderer();
+ if ( $threshold !== $linkRenderer->getStubThreshold() ) {
+ // Need to create a new instance with the right stub threshold...
+ $linkRenderer = $services->getLinkRendererFactory()->create();
+ $linkRenderer->setStubThreshold( $threshold );
}
- return '';
+ return $linkRenderer->getLinkClasses( $t );
}
/**
* link() replaces the old functions in the makeLink() family.
*
* @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
+ * @deprecated since 1.28, use MediaWiki\Linker\LinkRenderer instead
*
* @param Title $target Can currently only be a Title, but this may
* change to support Images, literal URLs, etc.
/**
* Identical to link(), except $options defaults to 'known'.
+ *
* @since 1.16.3
+ * @deprecated since 1.28, use MediaWiki\Linker\LinkRenderer instead
* @see Linker::link
* @return string
*/
*/
use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
/**
* The MediaWiki class is the helper class for the index.php entry point.
* @param string $mode Use 'fast' to always skip job running
*/
public function restInPeace( $mode = 'fast' ) {
+ $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
// Assure deferred updates are not in the main transaction
- wfGetLBFactory()->commitMasterChanges( __METHOD__ );
+ $factory->commitMasterChanges( __METHOD__ );
// Loosen DB query expectations since the HTTP client is unblocked
$trxProfiler = Profiler::instance()->getTransactionProfiler();
wfLogProfilingData();
// Commit and close up!
- $factory = wfGetLBFactory();
$factory->commitMasterChanges( __METHOD__ );
$factory->shutdown( LBFactory::SHUTDOWN_NO_CHRONPROT );
use LinkCache;
use Liuggio\StatsdClient\Factory\StatsdDataFactory;
use LoadBalancer;
+use MediaHandlerFactory;
use MediaWiki\Linker\LinkRenderer;
use MediaWiki\Linker\LinkRendererFactory;
use MediaWiki\Services\SalvageableService;
return $this->getService( 'WatchedItemQueryService' );
}
+ /**
+ * @since 1.28
+ * @return MediaHandlerFactory
+ */
+ public function getMediaHandlerFactory() {
+ return $this->getService( 'MediaHandlerFactory' );
+ }
+
/**
* @since 1.28
* @return GenderCache
$reason,
$nullRevision
];
- $dbw->onTransactionIdle( function () use ( $params, $dbw ) {
- // Keep each single hook handler atomic
- $dbw->setFlag( DBO_TRX ); // flag is automatically reset by DB layer
- Hooks::run( 'TitleMoveComplete', $params );
- } );
+ // Keep each single hook handler atomic
+ DeferredUpdates::addUpdate(
+ new AtomicSectionUpdate(
+ $dbw,
+ __METHOD__,
+ function () use ( $params ) {
+ Hooks::run( 'TitleMoveComplete', $params );
+ }
+ )
+ );
return Status::newGood();
}
*/
protected $styles = [];
- /**
- * Whether jQuery is already handled.
- */
- protected $mJQueryDone = false;
-
private $mIndexPolicy = 'index';
private $mFollowPolicy = 'follow';
private $mVaryHeader = [
*/
private $copyrightUrl;
+ /** @var array Profiling data */
+ private $limitReportData = [];
+
/**
* Constructor for OutputPage. This should not be called directly.
* Instead a new RequestContext should be created and it will implicitly create
$this->mModuleStyles = array_merge( $this->mModuleStyles, (array)$modules );
}
- /**
- * Get the list of module messages to include on this page
- *
- * @deprecated since 1.26 Obsolete
- * @param bool $filter
- * @param string|null $position
- * @return array Array of module names
- */
- public function getModuleMessages( $filter = false, $position = null ) {
- wfDeprecated( __METHOD__, '1.26' );
- return [];
- }
-
- /**
- * Load messages of one or more ResourceLoader modules.
- *
- * @deprecated since 1.26 Use addModules() instead
- * @param string|array $modules Module name (string) or array of module names
- */
- public function addModuleMessages( $modules ) {
- wfDeprecated( __METHOD__, '1.26' );
- }
-
/**
* @return null|string ResourceLoader target
*/
}
/**
- * Add or replace an header item to the output
+ * Add or replace a head item to the output
*
* Whenever possible, use more specific options like ResourceLoader modules,
* OutputPage::addLink(), OutputPage::addMetaLink() and OutputPage::addFeedLink()
$this->mHeadItems[$name] = $value;
}
+ /**
+ * Add one or more head items to the output
+ *
+ * @since 1.28
+ * @param string|string[] $value Raw HTML
+ */
+ public function addHeadItems( $values ) {
+ $this->mHeadItems = array_merge( $this->mHeadItems, (array)$values );
+ }
+
/**
* Check if the header item $name is already set
*
}
}
- // enable OOUI if requested via ParserOutput
+ // Enable OOUI if requested via ParserOutput
if ( $parserOutput->getEnableOOUI() ) {
$this->enableOOUI();
}
+ // Include profiling data
+ $this->setLimitReportData( $parserOutput->getLimitReportData() );
+
// Link flags are ignored for now, but may in the future be
// used to mark individual language links.
$linkFlags = [];
$bodyClasses[] = 'capitalize-all-nouns';
}
+ // Parser feature migration class
+ // The idea is that this will eventually be removed, after the wikitext
+ // which requires it is cleaned up.
+ $bodyClasses[] = 'mw-hide-empty-elt';
+
$bodyClasses[] = $sk->getPageClasses( $this->getTitle() );
$bodyClasses[] = 'skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
$bodyClasses[] =
continue;
}
+ if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
+ if ( $module->getType() !== ResourceLoaderModule::LOAD_STYLES ) {
+ $logger = $resourceLoader->getLogger();
+ $logger->debug( 'Unexpected general module "{module}" in styles queue.', [
+ 'module' => $name,
+ ] );
+ } else {
+ $links['states'][$name] = 'ready';
+ }
+ }
+
$sortedModules[$module->getSource()][$module->getGroup()][$name] = $module;
}
* @return string
*/
function getBottomScripts() {
- return $this->getScriptsForBottomQueue();
+ return $this->getScriptsForBottomQueue() .
+ ResourceLoader::makeInlineScript(
+ ResourceLoader::makeConfigSetScript(
+ [ 'wgPageParseReport' => $this->limitReportData ],
+ true
+ )
+ );
}
/**
) {
// We're on a preview of a CSS subpage
// Exclude this page from the user module in case it's in there (bug 26283)
- $link = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES,
+ $link = $this->makeResourceLoaderLink( 'user.styles', ResourceLoaderModule::TYPE_STYLES,
[ 'excludepage' => $this->getTitle()->getPrefixedDBkey() ]
);
$otherTags = array_merge( $otherTags, $link['html'] );
$otherTags[] = Html::inlineStyle( $previewedCSS );
} else {
// Load the user styles normally
- $moduleStyles[] = 'user';
+ $moduleStyles[] = 'user.styles';
}
// Per-user preference styles
// public API or you'll be severely disappointed when T87871 is fixed and it disappears.
$this->addMeta( 'X-OOUI-PHP', '1' );
}
+
+ /**
+ * @param array $data Data from ParserOutput::getLimitReportData()
+ * @since 1.28
+ */
+ public function setLimitReportData( array $data ) {
+ $this->limitReportData = $data;
+ }
}
--- /dev/null
+<?php
+/**
+ * Send information about this MediaWiki instance to MediaWiki.org.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use Psr\Log\LoggerInterface;
+use MediaWiki\Logger\LoggerFactory;
+
+/**
+ * Send information about this MediaWiki instance to MediaWiki.org.
+ *
+ * @since 1.28
+ */
+class Pingback {
+
+ /**
+ * @var int Revision ID of the JSON schema that describes the pingback
+ * payload. The schema lives on MetaWiki, at
+ * <https://meta.wikimedia.org/wiki/Schema:MediaWikiPingback>.
+ */
+ const SCHEMA_REV = 15781718;
+
+ /** @var LoggerInterface */
+ protected $logger;
+
+ /** @var Config */
+ protected $config;
+
+ /** @var string updatelog key (also used as cache/db lock key) */
+ protected $key;
+
+ /** @var string Randomly-generated identifier for this wiki */
+ protected $id;
+
+ /**
+ * @param Config $config
+ * @param LoggerInterface $logger
+ */
+ public function __construct( Config $config = null, LoggerInterface $logger = null ) {
+ $this->config = $config ?: RequestContext::getMain()->getConfig();
+ $this->logger = $logger ?: LoggerFactory::getInstance( __CLASS__ );
+ $this->key = 'Pingback-' . $this->config->get( 'Version' );
+ }
+
+ /**
+ * Should a pingback be sent?
+ * @return bool
+ */
+ private function shouldSend() {
+ return $this->config->get( 'Pingback' ) && !$this->checkIfSent();
+ }
+
+ /**
+ * Has a pingback already been sent for this MediaWiki version?
+ * @return bool
+ */
+ private function checkIfSent() {
+ $dbr = wfGetDB( DB_SLAVE );
+ $sent = $dbr->selectField(
+ 'updatelog', '1', [ 'ul_key' => $this->key ], __METHOD__ );
+ return $sent !== false;
+ }
+
+ /**
+ * Record the fact that we have sent a pingback for this MediaWiki version,
+ * to ensure we don't submit data multiple times.
+ */
+ private function markSent() {
+ $dbw = wfGetDB( DB_MASTER );
+ return $dbw->insert(
+ 'updatelog', [ 'ul_key' => $this->key ], __METHOD__, 'IGNORE' );
+ }
+
+ /**
+ * Acquire lock for sending a pingback
+ *
+ * This ensures only one thread can attempt to send a pingback at any given
+ * time and that we wait an hour before retrying failed attempts.
+ *
+ * @return bool Whether lock was acquired
+ */
+ private function acquireLock() {
+ $cache = ObjectCache::getLocalClusterInstance();
+ if ( !$cache->add( $this->key, 1, 60 * 60 ) ) {
+ return false; // throttled
+ }
+
+ $dbw = wfGetDB( DB_MASTER );
+ if ( !$dbw->lock( $this->key, __METHOD__, 0 ) ) {
+ return false; // already in progress
+ }
+
+ return true;
+ }
+
+ /**
+ * Collect basic data about this MediaWiki installation and return it
+ * as an associative array conforming to the Pingback schema on MetaWiki
+ * (<https://meta.wikimedia.org/wiki/Schema:MediaWikiPingback>).
+ *
+ * This is public so we can display it in the installer
+ *
+ * @return array
+ */
+ public function getSystemInfo() {
+ $event = [
+ 'database' => $this->config->get( 'DBtype' ),
+ 'MediaWiki' => $this->config->get( 'Version' ),
+ 'PHP' => PHP_VERSION,
+ 'OS' => PHP_OS . ' ' . php_uname( 'r' ),
+ 'arch' => PHP_INT_SIZE === 8 ? 64 : 32,
+ 'machine' => php_uname( 'm' ),
+ ];
+
+ if ( isset( $_SERVER['SERVER_SOFTWARE'] ) ) {
+ $event['serverSoftware'] = $_SERVER['SERVER_SOFTWARE'];
+ }
+
+ $limit = ini_get( 'memory_limit' );
+ if ( $limit && $limit != -1 ) {
+ $event['memoryLimit'] = $limit;
+ }
+
+ return $event;
+ }
+
+ /**
+ * Get the EventLogging packet to be sent to the server
+ *
+ * @return array
+ */
+ private function getData() {
+ return [
+ 'schema' => 'MediaWikiPingback',
+ 'revision' => self::SCHEMA_REV,
+ 'wiki' => $this->getOrCreatePingbackId(),
+ 'event' => $this->getSystemInfo(),
+ ];
+ }
+
+ /**
+ * Get a unique, stable identifier for this wiki
+ *
+ * If the identifier does not already exist, create it and save it in the
+ * database. The identifier is randomly-generated.
+ *
+ * @return string 32-character hex string
+ */
+ private function getOrCreatePingbackId() {
+ if ( !$this->id ) {
+ $id = wfGetDB( DB_SLAVE )->selectField(
+ 'updatelog', 'ul_value', [ 'ul_key' => 'PingBack' ] );
+
+ if ( $id == false ) {
+ $id = MWCryptRand::generateHex( 32 );
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->insert(
+ 'updatelog',
+ [ 'ul_key' => 'PingBack', 'ul_value' => $id ],
+ __METHOD__,
+ 'IGNORE'
+ );
+
+ if ( !$dbw->affectedRows() ) {
+ $id = $dbw->selectField(
+ 'updatelog', 'ul_value', [ 'ul_key' => 'PingBack' ] );
+ }
+ }
+
+ $this->id = $id;
+ }
+
+ return $this->id;
+ }
+
+ /**
+ * Serialize pingback data and send it to MediaWiki.org via a POST
+ * to its event beacon endpoint.
+ *
+ * The data encoding conforms to the expectations of EventLogging,
+ * a software suite used by the Wikimedia Foundation for logging and
+ * processing analytic data.
+ *
+ * Compare:
+ * <https://github.com/wikimedia/mediawiki-extensions-EventLogging/
+ * blob/7e5fe4f1ef/includes/EventLogging.php#L32-L74>
+ *
+ * @param array $data Pingback data as an associative array
+ * @return bool true on success, false on failure
+ */
+ private function postPingback( array $data ) {
+ $json = FormatJson::encode( $data );
+ $queryString = rawurlencode( str_replace( ' ', '\u0020', $json ) ) . ';';
+ $url = 'https://www.mediawiki.org/beacon/event?' . $queryString;
+ return Http::post( $url ) !== false;
+ }
+
+ /**
+ * Send information about this MediaWiki instance to MediaWiki.org.
+ *
+ * The data is structured and serialized to match the expectations of
+ * EventLogging, a software suite used by the Wikimedia Foundation for
+ * logging and processing analytic data.
+ *
+ * Compare:
+ * <https://github.com/wikimedia/mediawiki-extensions-EventLogging/
+ * blob/7e5fe4f1ef/includes/EventLogging.php#L32-L74>
+ *
+ * The schema for the data is located at:
+ * <https://meta.wikimedia.org/wiki/Schema:MediaWikiPingback>
+ */
+ public function sendPingback() {
+ if ( !$this->acquireLock() ) {
+ $this->logger->debug( __METHOD__ . ": couldn't acquire lock" );
+ return false;
+ }
+
+ $data = $this->getData();
+ if ( !$this->postPingback( $data ) ) {
+ $this->logger->warning( __METHOD__ . ": failed to send pingback; check 'http' log" );
+ return false;
+ }
+
+ $this->markSent();
+ $this->logger->debug( __METHOD__ . ": pingback sent OK ({$this->key})" );
+ return true;
+ }
+
+ /**
+ * Schedule a deferred callable that will check if a pingback should be
+ * sent and (if so) proceed to send it.
+ */
+ public static function schedulePingback() {
+ DeferredUpdates::addCallableUpdate( function () {
+ $instance = new Pingback;
+ if ( $instance->shouldSend() ) {
+ $instance->sendPingback();
+ }
+ } );
+ }
+}
* @return void
*/
static function profilePreferences( $user, IContextSource $context, &$defaultPreferences ) {
- global $wgAuth, $wgContLang, $wgParser, $wgDisableAuthManager;
+ global $wgContLang, $wgParser;
+ $authManager = AuthManager::singleton();
$config = $context->getConfig();
// retrieving user name for GENDER and misc.
$userName = $user->getName();
$canEditPrivateInfo = $user->isAllowed( 'editmyprivateinfo' );
// Actually changeable stuff
- $realnameChangeAllowed = $wgDisableAuthManager ? $wgAuth->allowPropChange( 'realname' )
- : AuthManager::singleton()->allowsPropertyChange( 'realname' );
$defaultPreferences['realname'] = [
// (not really "private", but still shouldn't be edited without permission)
- 'type' => $canEditPrivateInfo && $realnameChangeAllowed ? 'text' : 'info',
+ 'type' => $canEditPrivateInfo && $authManager->allowsPropertyChange( 'realname' )
+ ? 'text' : 'info',
'default' => $user->getRealName(),
'section' => 'personal/info',
'label-message' => 'yourrealname',
'help-message' => 'prefs-help-realname',
];
- $allowPasswordChange = $wgDisableAuthManager ? $wgAuth->allowPasswordChange()
- : AuthManager::singleton()->allowsAuthenticationDataChange(
- new PasswordAuthenticationRequest(), false )->isGood();
- if ( $canEditPrivateInfo && $allowPasswordChange ) {
+ if ( $canEditPrivateInfo && $authManager->allowsAuthenticationDataChange(
+ new PasswordAuthenticationRequest(), false )->isGood()
+ ) {
$link = Linker::link( SpecialPage::getTitleFor( 'ChangePassword' ),
$context->msg( 'prefs-resetpass' )->escaped(), [],
[ 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ] );
'default' => $oldsigHTML,
'section' => 'personal/signature',
];
- $nicknameChangeAllowed = $wgDisableAuthManager ? $wgAuth->allowPropChange( 'nickname' )
- : AuthManager::singleton()->allowsPropertyChange( 'nickname' );
$defaultPreferences['nickname'] = [
- 'type' => $nicknameChangeAllowed ? 'text' : 'info',
+ 'type' => $authManager->allowsPropertyChange( 'nickname' ) ? 'text' : 'info',
'maxlength' => $config->get( 'MaxSigChars' ),
'label-message' => 'yournick',
'validation-callback' => [ 'Preferences', 'validateSignature' ],
}
$emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
- $emailChangeAllowed = $wgDisableAuthManager ? $wgAuth->allowPropChange( 'emailaddress' )
- : AuthManager::singleton()->allowsPropertyChange( 'emailaddress' );
- if ( $canEditPrivateInfo && $emailChangeAllowed ) {
+ if ( $canEditPrivateInfo && $authManager->allowsPropertyChange( 'emailaddress' ) ) {
$link = Linker::link(
SpecialPage::getTitleFor( 'ChangeEmail' ),
$context->msg( $user->getEmail() ? 'prefs-changeemail' : 'prefs-setemail' )->escaped(),
/**
* List for revision table items for a single page
*/
-abstract class RevisionListBase extends ContextSource {
+abstract class RevisionListBase extends ContextSource implements Iterator {
/** @var Title */
public $title;
return $this->current;
}
+ public function rewind() {
+ $this->reset();
+ }
+
/**
* Get the current list item, or false if we are at the end
* @return Revision
return $this->current;
}
+ public function key() {
+ return $this->res ? $this->res->key(): 0;
+ }
+
+ public function valid() {
+ return $this->res ? $this->res->valid() : false;
+ }
+
/**
* Get the number of items in the list.
* @return int
return new WatchedItemQueryService( $services->getDBLoadBalancer() );
},
+ 'MediaHandlerFactory' => function( MediaWikiServices $services ) {
+ return new MediaHandlerFactory(
+ $services->getMainConfig()->get( 'MediaHandlers' )
+ );
+ },
+
'LinkCache' => function( MediaWikiServices $services ) {
return new LinkCache(
$services->getTitleFormatter()
'LinkRendererFactory' => function( MediaWikiServices $services ) {
return new LinkRendererFactory(
- $services->getTitleFormatter()
+ $services->getTitleFormatter(),
+ $services->getLinkCache()
);
},
return $service;
}
+ /**
+ * @param string $name
+ * @return bool Whether the service is disabled
+ * @since 1.28
+ */
+ public function isServiceDisabled( $name ) {
+ return isset( $this->disabled[$name] );
+ }
}
$wgDebugLogFile = '';
}
-// Disable AuthManager API modules if $wgDisableAuthManager
-if ( $wgDisableAuthManager ) {
- $wgAPIModules += [
- 'clientlogin' => 'ApiDisabled',
- 'createaccount' => 'ApiCreateAccount', // Use the non-AuthManager version
- 'linkaccount' => 'ApiDisabled',
- 'unlinkaccount' => 'ApiDisabled',
- 'changeauthenticationdata' => 'ApiDisabled',
- 'removeauthenticationdata' => 'ApiDisabled',
- 'resetpassword' => 'ApiDisabled',
- ];
- $wgAPIMetaModules += [
- 'authmanagerinfo' => 'ApiQueryDisabled',
- ];
-}
-
// Backwards compatibility with old password limits
if ( $wgMinimalPasswordLength !== false ) {
$wgPasswordPolicy['policies']['default']['MinimalPasswordLength'] = $wgMinimalPasswordLength;
* @var Language $wgContLang
*/
$wgContLang = Language::factory( $wgLanguageCode );
-$wgContLang->initEncoding();
$wgContLang->initContLang();
// Now that variant lists may be available...
$wgRequest->interpolateTitle();
if ( !is_object( $wgAuth ) ) {
- $wgAuth = $wgDisableAuthManager ? new AuthPlugin : new MediaWiki\Auth\AuthManagerAuthPlugin;
+ $wgAuth = new MediaWiki\Auth\AuthManagerAuthPlugin;
Hooks::run( 'AuthPluginSetup', [ &$wgAuth ] );
}
-if ( !$wgDisableAuthManager &&
- $wgAuth && !$wgAuth instanceof MediaWiki\Auth\AuthManagerAuthPlugin
-) {
+if ( $wgAuth && !$wgAuth instanceof MediaWiki\Auth\AuthManagerAuthPlugin ) {
MediaWiki\Auth\AuthManager::singleton()->forcePrimaryAuthenticationProviders( [
new MediaWiki\Auth\TemporaryPasswordPrimaryAuthenticationProvider( [
'authoritative' => false,
$sessionUser = MediaWiki\Session\SessionManager::getGlobalSession()->getUser();
if ( $sessionUser->getId() === 0 && User::isValidUserName( $sessionUser->getName() ) ) {
$ps_autocreate = Profiler::instance()->scopedProfileIn( $fname . '-autocreate' );
- if ( $wgDisableAuthManager ) {
- $res = MediaWiki\Session\SessionManager::autoCreateUser( $sessionUser );
- } else {
- $res = MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
- $sessionUser,
- MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
- true
- );
- }
+ $res = MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
+ $sessionUser,
+ MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
+ true
+ );
Profiler::instance()->scopedProfileOut( $ps_autocreate );
\MediaWiki\Logger\LoggerFactory::getInstance( 'authmanager' )->info( 'Autocreation attempt', [
'event' => 'autocreate',
unset( $sessionUser );
}
+if ( !$wgCommandLineMode ) {
+ Pingback::schedulePingback();
+}
+
wfDebug( "Fully initialised\n" );
$wgFullyInitialised = true;
*
* @code
* $conf = new SiteConfiguration;
- * $conf->wikis = array( 'de', 'en', 'beta' );
+ * $conf->wikis = [ 'de', 'en', 'beta' ];
* @endcode
*
* When configuring the MediaWiki global settings (the $wg variables),
* the identifiers will be available to specify settings on a per wiki basis.
*
* @code
- * $conf->settings = array(
- * 'wgSomeSetting' => array(
+ * $conf->settings = [
+ * 'wgSomeSetting' => [
*
* # production:
* 'de' => false,
*
* # test:
* 'beta => true,
- * ),
- * );
+ * ],
+ * ];
* @endcode
*
* With three wikis, that is easy to manage. But what about a farm with
* the above code could be written:
*
* @code
- * $conf->settings = array(
- * 'wgSomeSetting' => array(
+ * $conf->settings = [
+ * 'wgSomeSetting' => [
*
* 'default' => false,
*
* # Enable feature on test
* 'beta' => true,
- * ),
- * );
+ * ],
+ * ];
* @endcode
*
*
* on a per wiki basis.
*
* @code
- * $conf->settings = array(
- * 'wgMergeSetting' = array(
+ * $conf->settings = [
+ * 'wgMergeSetting' = [
* # Value that will be shared among all wikis:
- * 'default' => array( NS_USER => true ),
+ * 'default' => [ NS_USER => true ],
*
* # Leading '+' means merging the array of value with the defaults
- * '+beta' => array( NS_HELP => true ),
- * ),
- * );
+ * '+beta' => [ NS_HELP => true ],
+ * ],
+ * ];
*
* # Get configuration for the German site:
* $conf->get( 'wgMergeSetting', 'de' );
- * // --> array( NS_USER => true );
+ * // --> [ NS_USER => true ];
*
* # Get configuration for the testing site:
* $conf->get( 'wgMergeSetting', 'beta' );
- * // --> array( NS_USER => true, NS_HELP => true );
+ * // --> [ NS_USER => true, NS_HELP => true ];
* @endcode
*
* Finally, to load all configuration settings, extract them in global context:
* extract( $globals );
* @endcode
*
+ * @note For WikiMap to function, the configuration must define string values for
+ * $wgServer (or $wgCanonicalServer) and $wgArticlePath, even if these are the
+ * same for all wikis or can be correctly determined by the logic in
+ * Setup.php.
+ *
* @todo Give examples for,
* suffixes:
- * $conf->suffixes = array( 'wiki' );
+ * $conf->suffixes = [ 'wiki' ];
* localVHosts
* callbacks!
*/
return $multi ? $res : current( $res );
}
- /**
- * Returns true if the given vhost is handled locally.
- *
- * @deprecated since 1.25; check if the host is in $wgLocalVirtualHosts instead.
- * @param string $vhost
- * @return bool
- */
- public function isLocalVHost( $vhost ) {
- return in_array( $vhost, $this->localVHosts );
- }
-
/**
* Merge multiple arrays together.
* On encountering duplicate keys, merge the two, but ONLY if they're arrays.
* Static accessor class for site_stats and related things
*/
class SiteStats {
- /** @var bool|ResultWrapper */
+ /** @var bool|stdClass */
private static $row;
/** @var bool */
}
/**
- * @return bool|ResultWrapper
+ * @return bool|stdClass
*/
static function loadAndLazyInit() {
global $wgMiserMode;
/**
* @param IDatabase $db
- * @return bool|ResultWrapper
+ * @return bool|stdClass
*/
static function doLoad( $db ) {
return $db->selectRow( 'site_stats', [
'ss_users',
'ss_active_users',
'ss_images',
- ], false, __METHOD__ );
+ ], [], __METHOD__ );
}
/**
*
* @return array A list in which each entry is an array with a message key as its first element.
* The remaining array elements are the message parameters.
- * @deprecated 1.25
+ * @deprecated since 1.25
*/
public function getErrorsArray() {
return $this->getStatusArray( 'error' );
*
* @return array A list in which each entry is an array with a message key as its first element.
* The remaining array elements are the message parameters.
- * @deprecated 1.25
+ * @deprecated since 1.25
*/
public function getWarningsArray() {
return $this->getStatusArray( 'warning' );
* Functions related to the output of file content
*/
class StreamFile {
- const READY_STREAM = 1;
- const NOT_MODIFIED = 2;
+ // Do not send any HTTP headers unless requested by caller (e.g. body only)
+ const STREAM_HEADLESS = 1;
+ // Do not try to tear down any PHP output buffers
+ const STREAM_ALLOW_OB = 2;
/**
* Stream a file to the browser, adding all the headings and fun stuff.
* and Content-Disposition.
*
* @param string $fname Full name and path of the file to stream
- * @param array $headers Any additional headers to send
+ * @param array $headers Any additional headers to send if the file exists
* @param bool $sendErrors Send error messages if errors occur (like 404)
+ * @param array $optHeaders HTTP request header map (e.g. "range") (use lowercase keys)
+ * @param integer $flags Bitfield of STREAM_* constants
* @throws MWException
* @return bool Success
*/
- public static function stream( $fname, $headers = [], $sendErrors = true ) {
+ public static function stream(
+ $fname, $headers = [], $sendErrors = true, $optHeaders = [], $flags = 0
+ ) {
+ $section = new ProfileSection( __METHOD__ );
if ( FileBackend::isStoragePath( $fname ) ) { // sanity
throw new MWException( __FUNCTION__ . " given storage path '$fname'." );
}
- MediaWiki\suppressWarnings();
- $stat = stat( $fname );
- MediaWiki\restoreWarnings();
-
- $res = self::prepareForStream( $fname, $stat, $headers, $sendErrors );
- if ( $res == self::NOT_MODIFIED ) {
- $ok = true; // use client cache
- } elseif ( $res == self::READY_STREAM ) {
- $ok = readfile( $fname );
- } else {
- $ok = false; // failed
+ // Don't stream it out as text/html if there was a PHP error
+ if ( ( ( $flags & self::STREAM_HEADLESS ) == 0 || $headers ) && headers_sent() ) {
+ echo "Headers already sent, terminating.\n";
+ return false;
}
- return $ok;
- }
+ $headerFunc = ( $flags & self::STREAM_HEADLESS )
+ ? function ( $header ) {
+ // no-op
+ }
+ : function ( $header ) {
+ is_int( $header ) ? HttpStatus::header( $header ) : header( $header );
+ };
+
+ MediaWiki\suppressWarnings();
+ $info = stat( $fname );
+ MediaWiki\restoreWarnings();
- /**
- * Call this function used in preparation before streaming a file.
- * This function does the following:
- * (a) sends Last-Modified, Content-type, and Content-Disposition headers
- * (b) cancels any PHP output buffering and automatic gzipping of output
- * (c) sends Content-Length header based on HTTP_IF_MODIFIED_SINCE check
- *
- * @param string $path Storage path or file system path
- * @param array|bool $info File stat info with 'mtime' and 'size' fields
- * @param array $headers Additional headers to send
- * @param bool $sendErrors Send error messages if errors occur (like 404)
- * @return int|bool READY_STREAM, NOT_MODIFIED, or false on failure
- */
- public static function prepareForStream(
- $path, $info, $headers = [], $sendErrors = true
- ) {
if ( !is_array( $info ) ) {
if ( $sendErrors ) {
- HttpStatus::header( 404 );
- header( 'Cache-Control: no-cache' );
- header( 'Content-Type: text/html; charset=utf-8' );
- $encFile = htmlspecialchars( $path );
- $encScript = htmlspecialchars( $_SERVER['SCRIPT_NAME'] );
- echo "<html><body>
- <h1>File not found</h1>
- <p>Although this PHP script ($encScript) exists, the file requested for output
- ($encFile) does not.</p>
- </body></html>
- ";
+ self::send404Message( $fname, $flags );
}
return false;
}
- // Sent Last-Modified HTTP header for client-side caching
- header( 'Last-Modified: ' . wfTimestamp( TS_RFC2822, $info['mtime'] ) );
+ // Send Last-Modified HTTP header for client-side caching
+ $headerFunc( 'Last-Modified: ' . wfTimestamp( TS_RFC2822, $info['mtime'] ) );
- // Cancel output buffering and gzipping if set
- wfResetOutputBuffers();
+ if ( ( $flags & self::STREAM_ALLOW_OB ) == 0 ) {
+ // Cancel output buffering and gzipping if set
+ wfResetOutputBuffers();
+ }
- $type = self::contentTypeFromPath( $path );
+ $type = self::contentTypeFromPath( $fname );
if ( $type && $type != 'unknown/unknown' ) {
- header( "Content-type: $type" );
+ $headerFunc( "Content-type: $type" );
} else {
// Send a content type which is not known to Internet Explorer, to
// avoid triggering IE's content type detection. Sending a standard
// unknown content type here essentially gives IE license to apply
// whatever content type it likes.
- header( 'Content-type: application/x-wiki' );
+ $headerFunc( 'Content-type: application/x-wiki' );
}
- // Don't stream it out as text/html if there was a PHP error
- if ( headers_sent() ) {
- echo "Headers already sent, terminating.\n";
- return false;
+ // Don't send if client has up to date cache
+ if ( isset( $optHeaders['if-modified-since'] ) ) {
+ $modsince = preg_replace( '/;.*$/', '', $optHeaders['if-modified-since'] );
+ if ( wfTimestamp( TS_UNIX, $info['mtime'] ) <= strtotime( $modsince ) ) {
+ ini_set( 'zlib.output_compression', 0 );
+ $headerFunc( 304 );
+ return true; // ok
+ }
}
// Send additional headers
foreach ( $headers as $header ) {
- header( $header );
+ header( $header ); // always use header(); specifically requested
}
- // Don't send if client has up to date cache
- if ( !empty( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
- $modsince = preg_replace( '/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
- if ( wfTimestamp( TS_UNIX, $info['mtime'] ) <= strtotime( $modsince ) ) {
- ini_set( 'zlib.output_compression', 0 );
- HttpStatus::header( 304 );
- return self::NOT_MODIFIED; // ok
+ if ( isset( $optHeaders['range'] ) ) {
+ $range = self::parseRange( $optHeaders['range'], $info['size'] );
+ if ( is_array( $range ) ) {
+ $headerFunc( 206 );
+ $headerFunc( 'Content-Length: ' . $range[2] );
+ $headerFunc( "Content-Range: bytes {$range[0]}-{$range[1]}/{$info['size']}" );
+ } elseif ( $range === 'invalid' ) {
+ if ( $sendErrors ) {
+ $headerFunc( 416 );
+ $headerFunc( 'Cache-Control: no-cache' );
+ $headerFunc( 'Content-Type: text/html; charset=utf-8' );
+ $headerFunc( 'Content-Range: bytes */' . $info['size'] );
+ }
+ return false;
+ } else { // unsupported Range request (e.g. multiple ranges)
+ $range = null;
+ $headerFunc( 'Content-Length: ' . $info['size'] );
+ }
+ } else {
+ $range = null;
+ $headerFunc( 'Content-Length: ' . $info['size'] );
+ }
+
+ if ( is_array( $range ) ) {
+ $handle = fopen( $fname, 'rb' );
+ if ( $handle ) {
+ $ok = true;
+ fseek( $handle, $range[0] );
+ $remaining = $range[2];
+ while ( $remaining > 0 && $ok ) {
+ $bytes = min( $remaining, 8 * 1024 );
+ $data = fread( $handle, $bytes );
+ $remaining -= $bytes;
+ $ok = ( $data !== false );
+ print $data;
+ }
+ } else {
+ return false;
}
+ } else {
+ return readfile( $fname ) !== false; // faster
}
- header( 'Content-Length: ' . $info['size'] );
+ return true;
+ }
+
+ /**
+ * Send out a standard 404 message for a file
+ *
+ * @param string $fname Full name and path of the file to stream
+ * @param integer $flags Bitfield of STREAM_* constants
+ * @since 1.24
+ */
+ public static function send404Message( $fname, $flags = 0 ) {
+ if ( ( $flags & self::STREAM_HEADLESS ) == 0 ) {
+ HttpStatus::header( 404 );
+ header( 'Cache-Control: no-cache' );
+ header( 'Content-Type: text/html; charset=utf-8' );
+ }
+ $encFile = htmlspecialchars( $fname );
+ $encScript = htmlspecialchars( $_SERVER['SCRIPT_NAME'] );
+ echo "<!DOCTYPE html><html><body>
+ <h1>File not found</h1>
+ <p>Although this PHP script ($encScript) exists, the file requested for output
+ ($encFile) does not.</p>
+ </body></html>
+ ";
+ }
- return self::READY_STREAM; // ok
+ /**
+ * Convert a Range header value to an absolute (start, end) range tuple
+ *
+ * @param string $range Range header value
+ * @param integer $size File size
+ * @return array|string Returns error string on failure (start, end, length)
+ * @since 1.24
+ */
+ public static function parseRange( $range, $size ) {
+ $m = [];
+ if ( preg_match( '#^bytes=(\d*)-(\d*)$#', $range, $m ) ) {
+ list( , $start, $end ) = $m;
+ if ( $start === '' && $end === '' ) {
+ $absRange = [ 0, $size - 1 ];
+ } elseif ( $start === '' ) {
+ $absRange = [ $size - $end, $size - 1 ];
+ } elseif ( $end === '' ) {
+ $absRange = [ $start, $size - 1 ];
+ } else {
+ $absRange = [ $start, $end ];
+ }
+ if ( $absRange[0] >= 0 && $absRange[1] >= $absRange[0] ) {
+ if ( $absRange[0] < $size ) {
+ $absRange[1] = min( $absRange[1], $size - 1 ); // stop at EOF
+ $absRange[2] = $absRange[1] - $absRange[0] + 1;
+ return $absRange;
+ } elseif ( $absRange[0] == 0 && $size == 0 ) {
+ return 'unrecognized'; // the whole file should just be sent
+ }
+ }
+ return 'invalid';
+ }
+ return 'unrecognized';
}
/**
* @param string $interwiki The interwiki prefix
* @return Title The new object
*/
- public static function &makeTitle( $ns, $title, $fragment = '', $interwiki = '' ) {
+ public static function makeTitle( $ns, $title, $fragment = '', $interwiki = '' ) {
$t = new Title();
$t->mInterwiki = $interwiki;
$t->mFragment = $fragment;
*
* @param array $query
* @param bool $query2
- * @param string $proto Protocol to use; setting this will cause a full URL to be used
+ * @param string|int|bool $proto A PROTO_* constant on how the URL should be expanded,
+ * or false (default) for no expansion
* @see self::getLocalURL for the arguments.
* @return string The URL
*/
- public function getLinkURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
- if ( $this->isExternal() || $proto !== PROTO_RELATIVE ) {
+ public function getLinkURL( $query = '', $query2 = false, $proto = false ) {
+ if ( $this->isExternal() || $proto !== false ) {
$ret = $this->getFullURL( $query, $query2, $proto );
} elseif ( $this->getPrefixedText() === '' && $this->hasFragment() ) {
$ret = $this->getFragmentForURL();
return true; // avoid gap locking if we know it's not there
}
- $method = __METHOD__;
- $dbw = wfGetDB( DB_MASTER );
$conds = $this->pageCond();
- $dbw->onTransactionIdle( function () use ( $dbw, $conds, $method, $purgeTime ) {
- $dbTimestamp = $dbw->timestamp( $purgeTime ?: time() );
- $dbw->update(
- 'page',
- [ 'page_touched' => $dbTimestamp ],
- $conds + [ 'page_touched < ' . $dbw->addQuotes( $dbTimestamp ) ],
- $method
- );
- } );
+ DeferredUpdates::addUpdate(
+ new AutoCommitUpdate(
+ wfGetDB( DB_MASTER ),
+ __METHOD__,
+ function ( IDatabase $dbw, $fname ) use ( $conds, $purgeTime ) {
+ $dbTimestamp = $dbw->timestamp( $purgeTime ?: time() );
+ $dbw->update(
+ 'page',
+ [ 'page_touched' => $dbTimestamp ],
+ $conds + [ 'page_touched < ' . $dbw->addQuotes( $dbTimestamp ) ],
+ $fname
+ );
+ }
+ ),
+ DeferredUpdates::PRESEND
+ );
return true;
}
return new self( $user, $title, self::DEPRECATED_USAGE_TIMESTAMP, (bool)$checkRights );
}
- /**
- * @deprecated since 1.27 Use WatchedItemStore::resetNotificationTimestamp()
- */
- public function resetNotificationTimestamp( $force = '', $oldid = 0 ) {
- wfDeprecated( __METHOD__, '1.27' );
- if ( $this->checkRights && !$this->user->isAllowed( 'editmywatchlist' ) ) {
- return;
- }
- MediaWikiServices::getInstance()->getWatchedItemStore()->resetNotificationTimestamp(
- $this->user,
- $this->getTitle(),
- $force,
- $oldid
- );
- }
-
- /**
- * @deprecated since 1.27 Use WatchedItemStore::addWatchBatch()
- */
- public static function batchAddWatch( array $items ) {
- wfDeprecated( __METHOD__, '1.27' );
- if ( !$items ) {
- return false;
- }
-
- $targets = [];
- $users = [];
- /** @var WatchedItem $watchedItem */
- foreach ( $items as $watchedItem ) {
- $user = $watchedItem->getUser();
- if ( $watchedItem->checkRights && !$user->isAllowed( 'editmywatchlist' ) ) {
- continue;
- }
- $userId = $user->getId();
- $users[$userId] = $user;
- $targets[$userId][] = $watchedItem->getTitle()->getSubjectPage();
- $targets[$userId][] = $watchedItem->getTitle()->getTalkPage();
- }
-
- $store = MediaWikiServices::getInstance()->getWatchedItemStore();
- $success = true;
- foreach ( $users as $userId => $user ) {
- $success &= $store->addWatchBatchForUser( $user, $targets[$userId] );
- }
-
- return $success;
- }
-
/**
* @deprecated since 1.27 Use User::addWatch()
* @return bool
*/
public function updateNotificationTimestamp( User $editor, LinkTarget $target, $timestamp ) {
$dbw = $this->getConnection( DB_MASTER );
- $res = $dbw->select( [ 'watchlist' ],
- [ 'wl_user' ],
+ $uids = $dbw->selectFieldValues(
+ 'watchlist',
+ 'wl_user',
[
'wl_user != ' . intval( $editor->getId() ),
'wl_namespace' => $target->getNamespace(),
'wl_title' => $target->getDBkey(),
'wl_notificationtimestamp IS NULL',
- ], __METHOD__
+ ],
+ __METHOD__
);
+ $this->reuseConnection( $dbw );
- $watchers = [];
- foreach ( $res as $row ) {
- $watchers[] = intval( $row->wl_user );
- }
-
+ $watchers = array_map( 'intval', $uids );
if ( $watchers ) {
// Update wl_notificationtimestamp for all watching users except the editor
$fname = __METHOD__;
- $dbw->onTransactionIdle(
- function () use ( $dbw, $timestamp, $watchers, $target, $fname ) {
+ DeferredUpdates::addCallableUpdate(
+ function () use ( $timestamp, $watchers, $target, $fname ) {
global $wgUpdateRowsPerQuery;
+ $dbw = $this->getConnection( DB_MASTER );
+
$watchersChunks = array_chunk( $watchers, $wgUpdateRowsPerQuery );
foreach ( $watchersChunks as $watchersChunk ) {
$dbw->update( 'watchlist',
}
}
$this->uncacheLinkTarget( $target );
+
+ $this->reuseConnection( $dbw );
}
);
}
- $this->reuseConnection( $dbw );
-
return $watchers;
}
/**
* Fetch a text string from the given array or return $default if it's not
- * set. Carriage returns are stripped from the text, and with some language
- * modules there is an input transliteration applied. This should generally
- * be used for form "<textarea>" and "<input>" fields. Used for
- * user-supplied freeform text input (for which input transformations may
- * be required - e.g. Esperanto x-coding).
+ * set. Carriage returns are stripped from the text. This should generally
+ * be used for form "<textarea>" and "<input>" fields, and for
+ * user-supplied freeform text input.
*
* @param string $name
* @param string $default Optional
* @return string
*/
public function getText( $name, $default = '' ) {
- global $wgContLang;
$val = $this->getVal( $name, $default );
- return str_replace( "\r\n", "\n",
- $wgContLang->recodeInput( $val ) );
+ return str_replace( "\r\n", "\n", $val );
}
/**
$path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
[ 'lang' => $minor, 'site' => $major ] );
+
+ // If we don't have a canonical server or a path containing $1, the
+ // WikiReference isn't going to function properly. Just return null in
+ // that case.
+ if ( !is_string( $canonicalServer ) || !is_string( $path ) || strpos( $path, '$1' ) === false ) {
+ return null;
+ }
+
return new WikiReference( $canonicalServer, $path, $server );
}
*/
/**
- * User-requested page cache purging.
- *
- * For users with 'purge', this will directly trigger the cache purging and
- * for users without that right, it will show a confirmation form.
+ * User-requested page cache purging
*
* @ingroup Actions
*/
return $this->page->doPurge();
}
- /**
- * purge is slightly weird because it can be either formed or formless depending
- * on user permissions
- */
public function show() {
$this->setHeaders();
return;
}
- if ( $user->isAllowed( 'purge' ) ) {
- // This will update the database immediately, even on HTTP GET.
- // Lots of uses may exist for this feature, so just ignore warnings.
- Profiler::instance()->getTransactionProfiler()->resetExpectations();
-
+ if ( $this->getRequest()->wasPosted() ) {
$this->redirectParams = wfArrayToCgi( array_diff_key(
$this->getRequest()->getQueryValues(),
[ 'title' => null, 'action' => null ]
}
public function onSuccess() {
- $this->getOutput()->addWikiMsg( 'removedwatchtext', $this->getTitle()->getPrefixedText() );
+ $msgKey = $this->getTitle()->isTalkPage() ? 'removedwatchtext-talk' : 'removedwatchtext';
+ $this->getOutput()->addWikiMsg( $msgKey, $this->getTitle()->getPrefixedText() );
}
public function doesWrites() {
}
public function onSuccess() {
- $this->getOutput()->addWikiMsg( 'addedwatchtext', $this->getTitle()->getPrefixedText() );
+ $msgKey = $this->getTitle()->isTalkPage() ? 'addedwatchtext-talk' : 'addedwatchtext';
+ $this->getOutput()->addWikiMsg( $msgKey, $this->getTitle()->getPrefixedText() );
}
/* Static utility methods */
$helper = new ApiAuthManagerHelper( $this );
$manager = AuthManager::singleton();
- // Make sure it's possible to log in
+ // Make sure it's possible to create accounts
if ( !$manager->canCreateAccounts() ) {
$this->getResult()->addValue( null, 'createaccount', $helper->formatAuthenticationResponse(
AuthenticationResponse::newFail(
$this->msg( 'userlogin-cannot-' . AuthManager::ACTION_CREATE )
)
) );
+ $helper->logAuthenticationResult( 'accountcreation',
+ 'userlogin-cannot-' . AuthManager::ACTION_CREATE );
return;
}
$this->getResult()->addValue( null, 'createaccount',
$helper->formatAuthenticationResponse( $res ) );
+ $helper->logAuthenticationResult( 'accountcreation', $res );
}
public function isReadMode() {
use MediaWiki\Auth\AuthenticationRequest;
use MediaWiki\Auth\AuthenticationResponse;
use MediaWiki\Auth\CreateFromLoginAuthenticationRequest;
+use MediaWiki\Logger\LoggerFactory;
/**
* Helper class for AuthManager-using API modules. Intended for use via
return $ret;
}
+ /**
+ * Logs successful or failed authentication.
+ * @param string|AuthenticationResponse $result Response or error message
+ * @param string $event Event type (e.g. 'accountcreation')
+ */
+ public function logAuthenticationResult( $event, $result ) {
+ if ( is_string( $result ) ) {
+ $status = Status::newFatal( $result );
+ } elseif ( $result->status === AuthenticationResponse::PASS ) {
+ $status = Status::newGood();
+ } elseif ( $result->status === AuthenticationResponse::FAIL ) {
+ $status = Status::newFatal( $result->message );
+ } else {
+ return;
+ }
+
+ $module = $this->module->getModuleName();
+ LoggerFactory::getInstance( 'authmanager' )->info( "$module API attempt", [
+ 'event' => $event,
+ 'status' => $status,
+ 'module' => $module,
+ ] );
+ }
+
/**
* Fetch the preserved CreateFromLoginAuthenticationRequest, if any
* @return CreateFromLoginAuthenticationRequest|null
/**
* Return the error message related to a certain array
* @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
- * @return array('code' => code, 'info' => info)
+ * @return [ 'code' => code, 'info' => info ]
*/
public function parseMsg( $error ) {
// Check whether someone passed the whole array, instead of one element as
$this->getResult()->addValue( null, 'clientlogin', $helper->formatAuthenticationResponse(
AuthenticationResponse::newFail( $this->msg( 'userlogin-cannot-' . AuthManager::ACTION_LOGIN ) )
) );
+ $helper->logAuthenticationResult( 'login', 'userlogin-cannot-' . AuthManager::ACTION_LOGIN );
return;
}
$this->getResult()->addValue( null, 'clientlogin',
$helper->formatAuthenticationResponse( $res ) );
+ $helper->logAuthenticationResult( 'login', $res );
}
public function isReadMode() {
/**
* Fetch continuation result data
- * @return array Array( (array)$data, (bool)$batchcomplete )
+ * @return array [ (array)$data, (bool)$batchcomplete ]
*/
public function getContinuation() {
$data = [];
+++ /dev/null
-<?php
-/**
- * Created on August 7, 2012
- *
- * Copyright © 2012 Tyler Romeo <tylerromeo@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-use MediaWiki\Logger\LoggerFactory;
-
-/**
- * Unit to authenticate account registration attempts to the current wiki.
- *
- * @ingroup API
- * @deprecated since 1.27, only used when $wgDisableAuthManager is true
- */
-class ApiCreateAccount extends ApiBase {
- public function execute() {
- // If we're in a mode that breaks the same-origin policy, no tokens can
- // be obtained
- if ( $this->lacksSameOriginSecurity() ) {
- $this->dieUsage(
- 'Cannot create account when the same-origin policy is not applied', 'aborted'
- );
- }
-
- // $loginForm->addNewaccountInternal will throw exceptions
- // if wiki is read only (already handled by api), user is blocked or does not have rights.
- // Use userCan in order to hit GlobalBlock checks (according to Special:userlogin)
- $loginTitle = SpecialPage::getTitleFor( 'Userlogin' );
- if ( !$loginTitle->userCan( 'createaccount', $this->getUser() ) ) {
- $this->dieUsage(
- 'You do not have the right to create a new account',
- 'permdenied-createaccount'
- );
- }
- if ( $this->getUser()->isBlockedFromCreateAccount() ) {
- $this->dieUsage(
- 'You cannot create a new account because you are blocked',
- 'blocked',
- 0,
- [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $this->getUser()->getBlock() ) ]
- );
- }
-
- $params = $this->extractRequestParams();
-
- // Make sure session is persisted
- MediaWiki\Session\SessionManager::getGlobalSession()->persist();
-
- if ( $params['mailpassword'] && !$params['email'] ) {
- $this->dieUsageMsg( 'noemail' );
- }
-
- if ( $params['language'] && !Language::isSupportedLanguage( $params['language'] ) ) {
- $this->dieUsage( 'Invalid language parameter', 'langinvalid' );
- }
-
- $context = new DerivativeContext( $this->getContext() );
- $context->setRequest( new DerivativeRequest(
- $this->getContext()->getRequest(),
- [
- 'type' => 'signup',
- 'uselang' => $params['language'],
- 'wpName' => $params['name'],
- 'wpPassword' => $params['password'],
- 'wpRetype' => $params['password'],
- 'wpDomain' => $params['domain'],
- 'wpEmail' => $params['email'],
- 'wpRealName' => $params['realname'],
- 'wpCreateaccountToken' => $params['token'],
- 'wpCreateaccount' => $params['mailpassword'] ? null : '1',
- 'wpCreateaccountMail' => $params['mailpassword'] ? '1' : null
- ]
- ) );
-
- $loginForm = new LoginForm();
- $loginForm->setContext( $context );
- Hooks::run( 'AddNewAccountApiForm', [ $this, $loginForm ] );
- $loginForm->load();
-
- $status = $loginForm->addNewAccountInternal();
- LoggerFactory::getInstance( 'authmanager' )->info( 'Account creation attempt via API', [
- 'event' => 'accountcreation',
- 'status' => $status,
- ] );
- $result = [];
- if ( $status->isGood() ) {
- // Success!
- $user = $status->getValue();
-
- if ( $params['language'] ) {
- $user->setOption( 'language', $params['language'] );
- }
-
- if ( $params['mailpassword'] ) {
- // If mailpassword was set, disable the password and send an email.
- $user->setPassword( null );
- $status->merge( $loginForm->mailPasswordInternal(
- $user,
- false,
- 'createaccount-title',
- 'createaccount-text'
- ) );
- } elseif ( $this->getConfig()->get( 'EmailAuthentication' ) &&
- Sanitizer::validateEmail( $user->getEmail() )
- ) {
- // Send out an email authentication message if needed
- $status->merge( $user->sendConfirmationMail() );
- }
-
- // Save settings (including confirmation token)
- $user->saveSettings();
-
- Hooks::run( 'AddNewAccount', [ $user, $params['mailpassword'] ] );
-
- if ( $params['mailpassword'] ) {
- $logAction = 'byemail';
- } elseif ( $this->getUser()->isLoggedIn() ) {
- $logAction = 'create2';
- } else {
- $logAction = 'create';
- }
- $user->addNewUserLogEntry( $logAction, (string)$params['reason'] );
-
- // Add username, id, and token to result.
- $result['username'] = $user->getName();
- $result['userid'] = $user->getId();
- $result['token'] = $user->getToken();
- }
-
- $apiResult = $this->getResult();
-
- if ( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
- // Token was incorrect, so add it to result, but don't throw an exception
- // since not having the correct token is part of the normal
- // flow of events.
- $result['token'] = LoginForm::getCreateaccountToken()->toString();
- $result['result'] = 'NeedToken';
- $this->setWarning( 'Fetching a token via action=createaccount is deprecated. ' .
- 'Use action=query&meta=tokens&type=createaccount instead.' );
- $this->logFeatureUsage( 'action=createaccount&!token' );
- } elseif ( !$status->isOK() ) {
- // There was an error. Die now.
- $this->dieStatus( $status );
- } elseif ( !$status->isGood() ) {
- // Status is not good, but OK. This means warnings.
- $result['result'] = 'Warning';
-
- // Add any warnings to the result
- $warnings = $status->getErrorsByType( 'warning' );
- if ( $warnings ) {
- foreach ( $warnings as &$warning ) {
- ApiResult::setIndexedTagName( $warning['params'], 'param' );
- }
- ApiResult::setIndexedTagName( $warnings, 'warning' );
- $result['warnings'] = $warnings;
- }
- } else {
- // Everything was fine.
- $result['result'] = 'Success';
- }
-
- // Give extensions a chance to modify the API result data
- Hooks::run( 'AddNewAccountApiResult', [ $this, $loginForm, &$result ] );
-
- $apiResult->addValue( null, 'createaccount', $result );
- }
-
- public function mustBePosted() {
- return true;
- }
-
- public function isReadMode() {
- return false;
- }
-
- public function isWriteMode() {
- return true;
- }
-
- public function getAllowedParams() {
- return [
- 'name' => [
- ApiBase::PARAM_TYPE => 'user',
- ApiBase::PARAM_REQUIRED => true
- ],
- 'password' => [
- ApiBase::PARAM_TYPE => 'password',
- ],
- 'domain' => null,
- 'token' => [
- ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => false, // for BC
- ApiBase::PARAM_HELP_MSG => [ 'api-help-param-token', 'createaccount' ],
- ],
- 'email' => [
- ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => $this->getConfig()->get( 'EmailConfirmToEdit' ),
- ],
- 'realname' => null,
- 'mailpassword' => [
- ApiBase::PARAM_TYPE => 'boolean',
- ApiBase::PARAM_DFLT => false
- ],
- 'reason' => null,
- 'language' => null
- ];
- }
-
- protected function getExamplesMessages() {
- return [
- 'action=createaccount&name=testuser&password=test123'
- => 'apihelp-createaccount-example-pass',
- 'action=createaccount&name=testmailuser&mailpassword=true&reason=MyReason'
- => 'apihelp-createaccount-example-mail',
- ];
- }
-
- public function getHelpUrls() {
- return 'https://www.mediawiki.org/wiki/API:Account_creation';
- }
-}
}
protected function getDescriptionMessage() {
- if ( $this->getConfig()->get( 'DisableAuthManager' ) ) {
- return 'apihelp-login-description-nonauthmanager';
- } elseif ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
+ if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
return 'apihelp-login-description';
} else {
return 'apihelp-login-description-nobotpasswords';
}
if ( $authRes === false ) {
- if ( $this->getConfig()->get( 'DisableAuthManager' ) ) {
- // Non-AuthManager login
- $context->setRequest( new DerivativeRequest(
- $this->getContext()->getRequest(),
- [
- 'wpName' => $params['name'],
- 'wpPassword' => $params['password'],
- 'wpDomain' => $params['domain'],
- 'wpLoginToken' => $params['token'],
- 'wpRemember' => ''
- ]
- ) );
- $loginForm = new LoginForm();
- $loginForm->setContext( $context );
- $authRes = $loginForm->authenticateUserData();
- $loginType = 'LoginForm';
-
- switch ( $authRes ) {
- case LoginForm::SUCCESS:
- $authRes = 'Success';
- break;
- case LoginForm::NEED_TOKEN:
- $authRes = 'NeedToken';
- break;
- }
- } else {
- // Simplified AuthManager login, for backwards compatibility
- $manager = AuthManager::singleton();
- $reqs = AuthenticationRequest::loadRequestsFromSubmission(
- $manager->getAuthenticationRequests( AuthManager::ACTION_LOGIN, $this->getUser() ),
- [
- 'username' => $params['name'],
- 'password' => $params['password'],
- 'domain' => $params['domain'],
- 'rememberMe' => true,
- ]
- );
- $res = AuthManager::singleton()->beginAuthentication( $reqs, 'null:' );
- switch ( $res->status ) {
- case AuthenticationResponse::PASS:
- if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
- $warn = 'Main-account login via action=login is deprecated and may stop working ' .
- 'without warning.';
- $warn .= ' To continue login with action=login, see [[Special:BotPasswords]].';
- $warn .= ' To safely continue using main-account login, see action=clientlogin.';
- } else {
- $warn = 'Login via action=login is deprecated and may stop working without warning.';
- $warn .= ' To safely log in, see action=clientlogin.';
- }
- $this->setWarning( $warn );
- $authRes = 'Success';
- $loginType = 'AuthManager';
- break;
-
- case AuthenticationResponse::FAIL:
- // Hope it's not a PreAuthenticationProvider that failed...
- $authRes = 'Failed';
- $message = $res->message;
- \MediaWiki\Logger\LoggerFactory::getInstance( 'authentication' )
- ->info( __METHOD__ . ': Authentication failed: ' . $message->plain() );
- break;
-
- default:
- $authRes = 'Aborted';
- break;
- }
+ // Simplified AuthManager login, for backwards compatibility
+ $manager = AuthManager::singleton();
+ $reqs = AuthenticationRequest::loadRequestsFromSubmission(
+ $manager->getAuthenticationRequests( AuthManager::ACTION_LOGIN, $this->getUser() ),
+ [
+ 'username' => $params['name'],
+ 'password' => $params['password'],
+ 'domain' => $params['domain'],
+ 'rememberMe' => true,
+ ]
+ );
+ $res = AuthManager::singleton()->beginAuthentication( $reqs, 'null:' );
+ switch ( $res->status ) {
+ case AuthenticationResponse::PASS:
+ if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
+ $warn = 'Main-account login via action=login is deprecated and may stop working ' .
+ 'without warning.';
+ $warn .= ' To continue login with action=login, see [[Special:BotPasswords]].';
+ $warn .= ' To safely continue using main-account login, see action=clientlogin.';
+ } else {
+ $warn = 'Login via action=login is deprecated and may stop working without warning.';
+ $warn .= ' To safely log in, see action=clientlogin.';
+ }
+ $this->setWarning( $warn );
+ $authRes = 'Success';
+ $loginType = 'AuthManager';
+ break;
+
+ case AuthenticationResponse::FAIL:
+ // Hope it's not a PreAuthenticationProvider that failed...
+ $authRes = 'Failed';
+ $message = $res->message;
+ \MediaWiki\Logger\LoggerFactory::getInstance( 'authentication' )
+ ->info( __METHOD__ . ': Authentication failed: ' . $message->plain() );
+ break;
+
+ default:
+ $authRes = 'Aborted';
+ break;
}
}
$result['result'] = $authRes;
switch ( $authRes ) {
case 'Success':
- if ( $this->getConfig()->get( 'DisableAuthManager' ) ) {
- $user = $context->getUser();
- $this->getContext()->setUser( $user );
- $user->setCookies( $this->getRequest(), null, true );
- } else {
- $user = $session->getUser();
- }
+ $user = $session->getUser();
ApiQueryInfo::resetTokenCache();
// Deprecated hook
$injected_html = '';
- Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html ] );
+ Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html, true ] );
$result['lguserid'] = intval( $user->getId() );
$result['lgusername'] = $user->getName();
}
break;
- // Results from LoginForm for when $wgDisableAuthManager is true
- case LoginForm::WRONG_TOKEN:
- $result['result'] = 'WrongToken';
- break;
-
- case LoginForm::NO_NAME:
- $result['result'] = 'NoName';
- break;
-
- case LoginForm::ILLEGAL:
- $result['result'] = 'Illegal';
- break;
-
- case LoginForm::WRONG_PLUGIN_PASS:
- $result['result'] = 'WrongPluginPass';
- break;
-
- case LoginForm::NOT_EXISTS:
- $result['result'] = 'NotExists';
- break;
-
- // bug 20223 - Treat a temporary password as wrong. Per SpecialUserLogin:
- // The e-mailed temporary password should not be used for actual logins.
- case LoginForm::RESET_PASS:
- case LoginForm::WRONG_PASS:
- $result['result'] = 'WrongPass';
- break;
-
- case LoginForm::EMPTY_PASS:
- $result['result'] = 'EmptyPass';
- break;
-
- case LoginForm::CREATE_BLOCKED:
- $result['result'] = 'CreateBlocked';
- $result['details'] = 'Your IP address is blocked from account creation';
- $block = $context->getUser()->getBlock();
- if ( $block ) {
- $result = array_merge( $result, ApiQueryUserInfo::getBlockInfo( $block ) );
- }
- break;
-
- case LoginForm::THROTTLED:
- $result['result'] = 'Throttled';
- $result['wait'] = intval( $loginForm->mThrottleWait );
- break;
-
- case LoginForm::USER_BLOCKED:
- $result['result'] = 'Blocked';
- $block = User::newFromName( $params['name'] )->getBlock();
- if ( $block ) {
- $result = array_merge( $result, ApiQueryUserInfo::getBlockInfo( $block ) );
- }
- break;
-
- case LoginForm::ABORTED:
- $result['result'] = 'Aborted';
- $result['reason'] = $loginForm->mAbortLoginErrorMsg;
- break;
-
default:
ApiBase::dieDebug( __METHOD__, "Unhandled case value: {$authRes}" );
}
}
public function isDeprecated() {
- return !$this->getConfig()->get( 'DisableAuthManager' ) &&
- !$this->getConfig()->get( 'EnableBotPasswords' );
+ return !$this->getConfig()->get( 'EnableBotPasswords' );
}
public function mustBePosted() {
// @codingStandardsIgnoreStart String contenation on "msg" not allowed to break long line
/**
* List of user roles that are specifically relevant to the API.
- * array( 'right' => array ( 'msg' => 'Some message with a $1',
- * 'params' => array ( $someVarToSubst ) ),
- * );
+ * [ 'right' => [ 'msg' => 'Some message with a $1',
+ * 'params' => [ $someVarToSubst ] ],
+ * ];
*/
private static $mRights = [
'writeapi' => [
*
* @code
* $modules['foo'] = 'ApiFoo';
- * $modules['bar'] = array(
+ * $modules['bar'] = [
* 'class' => 'ApiBar',
* 'factory' => function( $main, $name ) { ... }
- * );
- * $modules['xyzzy'] = array(
+ * ];
+ * $modules['xyzzy'] = [
* 'class' => 'ApiXyzzy',
- * 'factory' => array( 'XyzzyFactory', 'newApiModule' )
- * );
+ * 'factory' => [ 'XyzzyFactory', 'newApiModule' ]
+ * ];
* @endcode
*
* @param array $modules A map of ModuleName => ModuleSpec; The ModuleSpec
if ( $this->allowedParams !== null ) {
return $this->allowedParams;
}
- $this->allowedParams = [
- 'search' => null,
- 'limit' => [
- ApiBase::PARAM_DFLT => $this->getConfig()->get( 'OpenSearchDefaultLimit' ),
- ApiBase::PARAM_TYPE => 'limit',
- ApiBase::PARAM_MIN => 1,
- ApiBase::PARAM_MAX => 100,
- ApiBase::PARAM_MAX2 => 100
- ],
- 'namespace' => [
- ApiBase::PARAM_DFLT => NS_MAIN,
- ApiBase::PARAM_TYPE => 'namespace',
- ApiBase::PARAM_ISMULTI => true
- ],
+ $this->allowedParams = $this->buildCommonApiParams( false ) + [
'suggest' => false,
'redirects' => [
ApiBase::PARAM_TYPE => [ 'return', 'resolve' ],
'warningsaserror' => false,
];
- $profileParam = $this->buildProfileApiParam( SearchEngine::COMPLETION_PROFILE_TYPE,
- 'apihelp-query+prefixsearch-param-profile' );
- if ( $profileParam ) {
- $this->allowedParams['profile'] = $profileParam;
- }
+ // Use open search specific default limit
+ $this->allowedParams['limit'][ApiBase::PARAM_DFLT] = $this->getConfig()->get(
+ 'OpenSearchDefaultLimit'
+ );
+
return $this->allowedParams;
}
public function getSearchProfileParams() {
- if ( isset( $this->getAllowedParams()['profile'] ) ) {
- return [ SearchEngine::COMPLETION_PROFILE_TYPE => 'profile' ];
- }
- return [];
+ return [
+ 'profile' => [
+ 'profile-type' => SearchEngine::COMPLETION_PROFILE_TYPE,
+ 'help-message' => 'apihelp-query+prefixsearch-param-profile'
+ ],
+ ];
}
protected function getExamplesMessages() {
private $mGoodTitles = [];
private $mMissingPages = []; // [ns][dbkey] => fake page_id
private $mMissingTitles = [];
- /** @var array [fake_page_id] => array( 'title' => $title, 'invalidreason' => $reason ) */
+ /** @var array [fake_page_id] => [ 'title' => $title, 'invalidreason' => $reason ] */
private $mInvalidTitles = [];
private $mMissingPageIDs = [];
private $mRedirectTitles = [];
$res = $db->select( 'page', $this->getPageTableFields(), $set,
__METHOD__ );
- // Hack: get the ns:titles stored in array(ns => array(titles)) format
+ // Hack: get the ns:titles stored in [ ns => [ titles ] ] format
$this->initFromQueryResult( $res, $linkBatch->data, true ); // process Titles
// Resolve any found redirects
// Get pageIDs data from the `page` table
$res = $db->select( 'page', $pageFlds, $set, __METHOD__ );
- // Hack: get the ns:titles stored in array(ns => array(titles)) format
+ // Hack: get the ns:titles stored in [ns => array(titles)] format
$this->initFromQueryResult( $res, $linkBatch->data, true );
}
}
$titleObj->getPrefixedText();
}
- if ( isset( $prop['headitems'] ) || isset( $prop['headhtml'] ) ) {
+ if ( isset( $prop['headitems'] ) ) {
+ $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() );
+ $this->logFeatureUsage( 'action=parse&prop=headitems' );
+ $this->setWarning( 'headitems is deprecated since MediaWiki 1.28. '
+ . 'Use prop=headhtml when creating new HTML documents, or '
+ . 'prop=modules|jsconfigvars when updating a document client-side.' );
+ }
+
+ if ( isset( $prop['headhtml'] ) ) {
$context = new DerivativeContext( $this->getContext() );
$context->setTitle( $titleObj );
$context->setWikiPage( $pageObj );
$output = new OutputPage( $context );
$output->addParserOutputMetadata( $p_result );
- if ( isset( $prop['headitems'] ) ) {
- $headItems = $this->formatHeadItems( $p_result->getHeadItems() );
-
- $css = $this->formatCss( $output->buildCssLinksArray() );
-
- $scripts = [ $output->getHeadScripts() ];
-
- $result_array['headitems'] = array_merge( $headItems, $css, $scripts );
- }
-
- if ( isset( $prop['headhtml'] ) ) {
- $result_array['headhtml'] = $output->headElement( $context->getSkin() );
- $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'headhtml';
- }
+ $result_array['headhtml'] = $output->headElement( $context->getSkin() );
+ $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'headhtml';
}
if ( isset( $prop['modules'] ) ) {
$result_array['modules'] = array_values( array_unique( $p_result->getModules() ) );
$result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) );
$result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) );
- // To be removed in 1.27
- $result_array['modulemessages'] = [];
- $this->setWarning( 'modulemessages is deprecated since MediaWiki 1.26' );
}
if ( isset( $prop['jsconfigvars'] ) ) {
'indicators' => 'ind',
'modulescripts' => 'm',
'modulestyles' => 'm',
- 'modulemessages' => 'm',
'properties' => 'pp',
'limitreportdata' => 'lr',
];
return $result;
}
- private function formatCss( $css ) {
- $result = [];
- foreach ( $css as $file => $link ) {
- $entry = [];
- $entry['file'] = $file;
- ApiResult::setContentValue( $entry, 'link', $link );
- $result[] = $entry;
- }
-
- return $result;
- }
-
private function formatLimitReportData( $limitReportData ) {
$result = [];
# Parse content; note that HTML generation is only needed if we want to cache the result.
$content = $page->getContent( Revision::RAW );
- $enableParserCache = $this->getConfig()->get( 'EnableParserCache' );
- $p_result = $content->getParserOutput(
- $title,
- $page->getLatest(),
- $popts,
- $enableParserCache
- );
-
- # Logging to better see expensive usage patterns
- if ( $forceRecursiveLinkUpdate ) {
- LoggerFactory::getInstance( 'RecursiveLinkPurge' )->info(
- "Recursive link purge enqueued for {title}",
- [
- 'user' => $this->getUser()->getName(),
- 'title' => $title->getPrefixedText()
- ]
+ if ( $content ) {
+ $enableParserCache = $this->getConfig()->get( 'EnableParserCache' );
+ $p_result = $content->getParserOutput(
+ $title,
+ $page->getLatest(),
+ $popts,
+ $enableParserCache
);
- }
-
- # Update the links tables
- $updates = $content->getSecondaryDataUpdates(
- $title, null, $forceRecursiveLinkUpdate, $p_result );
- DataUpdate::runUpdates( $updates );
-
- $r['linkupdate'] = true;
- if ( $enableParserCache ) {
- $pcache = ParserCache::singleton();
- $pcache->save( $p_result, $page, $popts );
+ # Logging to better see expensive usage patterns
+ if ( $forceRecursiveLinkUpdate ) {
+ LoggerFactory::getInstance( 'RecursiveLinkPurge' )->info(
+ "Recursive link purge enqueued for {title}",
+ [
+ 'user' => $this->getUser()->getName(),
+ 'title' => $title->getPrefixedText()
+ ]
+ );
+ }
+
+ # Update the links tables
+ $updates = $content->getSecondaryDataUpdates(
+ $title, null, $forceRecursiveLinkUpdate, $p_result );
+ DataUpdate::runUpdates( $updates );
+
+ $r['linkupdate'] = true;
+
+ if ( $enableParserCache ) {
+ $pcache = ParserCache::singleton();
+ $pcache->save( $p_result, $page, $popts );
+ }
}
} else {
$error = $this->parseMsg( [ 'actionthrottledtext' ] );
$exporter->pageByTitle( $title );
}
$exporter->closeStream();
- $exportxml = $sink->getOutput();
// Don't check the size of exported stuff
// It's not continuable, so it would cause more
if ( $this->mParams['exportnowrap'] ) {
$result->reset();
// Raw formatter will handle this
- $result->addValue( null, 'text', $exportxml, ApiResult::NO_SIZE_CHECK );
+ $result->addValue( null, 'text', $sink, ApiResult::NO_SIZE_CHECK );
$result->addValue( null, 'mime', 'text/xml', ApiResult::NO_SIZE_CHECK );
} else {
- $result->addValue( 'query', 'export', $exportxml, ApiResult::NO_SIZE_CHECK );
+ $result->addValue( 'query', 'export', $sink, ApiResult::NO_SIZE_CHECK );
$result->addValue( 'query', ApiResult::META_BC_SUBELEMENTS, [ 'export' ] );
}
}
/**
* Add a set of JOIN conditions to the internal array
*
- * JOIN conditions are formatted as array( tablename => array(jointype,
- * conditions) e.g. array('page' => array('LEFT JOIN',
- * 'page_id=rev_page')) . conditions may be a string or an
- * addWhere()-style array
+ * JOIN conditions are formatted as [ tablename => [ jointype, conditions ] ]
+ * e.g. [ 'page' => [ 'LEFT JOIN', 'page_id=rev_page' ] ].
+ * Conditions may be a string or an addWhere()-style array.
* @param array $join_conds JOIN conditions
*/
protected function addJoinConds( $join_conds ) {
/**
* Add a set of WHERE clauses to the internal array.
- * Clauses can be formatted as 'foo=bar' or array('foo' => 'bar'),
+ * Clauses can be formatted as 'foo=bar' or [ 'foo' => 'bar' ],
* the latter only works if the value is a constant (i.e. not another field)
*
* If $value is an empty array, this function does nothing.
*
- * For example, array('foo=bar', 'baz' => 3, 'bla' => 'foo') translates
+ * For example, [ 'foo=bar', 'baz' => 3, 'bla' => 'foo' ] translates
* to "foo=bar AND baz='3' AND bla='foo'"
* @param string|array $value
*/
* @param string $method Function the query should be attributed to.
* You should usually use __METHOD__ here
* @param array $extraQuery Query data to add but not store in the object
- * Format is array(
+ * Format is [
* 'tables' => ...,
* 'fields' => ...,
* 'where' => ...,
* 'options' => ...,
* 'join_conds' => ...
- * )
+ * ]
* @return ResultWrapper
*/
protected function select( $method, $extraQuery = [] ) {
}
// find all files with the hashes, result format is:
- // array( hash => array( dup1, dup2 ), hash1 => ... )
+ // [ hash => [ dup1, dup2 ], hash1 => ... ]
$filesToFindBySha1s = array_unique( array_values( $sha1s ) );
if ( $params['localonly'] ) {
$filesBySha1s = RepoGroup::singleton()->getLocalRepo()->findBySha1s( $filesToFindBySha1s );
* The prototype for a token function is func($pageid, $title)
* it should return a token or false (permission denied)
* @deprecated since 1.24
- * @return array Array(tokenname => function)
+ * @return array [ tokenname => function ]
*/
protected function getTokenFunctions() {
// Don't call the hooks twice
if ( $this->allowedParams !== null ) {
return $this->allowedParams;
}
- $this->allowedParams = [
- 'search' => [
- ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => true,
- ],
- 'namespace' => [
- ApiBase::PARAM_DFLT => NS_MAIN,
- ApiBase::PARAM_TYPE => 'namespace',
- ApiBase::PARAM_ISMULTI => true,
- ],
- 'limit' => [
- ApiBase::PARAM_DFLT => 10,
- ApiBase::PARAM_TYPE => 'limit',
- ApiBase::PARAM_MIN => 1,
- // Non-standard value for compatibility with action=opensearch
- ApiBase::PARAM_MAX => 100,
- ApiBase::PARAM_MAX2 => 200,
- ],
- 'offset' => [
- ApiBase::PARAM_DFLT => 0,
- ApiBase::PARAM_TYPE => 'integer',
- ],
- ];
- $profileParam = $this->buildProfileApiParam( SearchEngine::COMPLETION_PROFILE_TYPE,
- 'apihelp-query+prefixsearch-param-profile' );
- if ( $profileParam ) {
- $this->allowedParams['profile'] = $profileParam;
- }
+ $this->allowedParams = $this->buildCommonApiParams();
+
return $this->allowedParams;
}
public function getSearchProfileParams() {
- if ( isset( $this->getAllowedParams()['profile'] ) ) {
- return [ SearchEngine::COMPLETION_PROFILE_TYPE => 'profile' ];
- }
- return [];
+ return [
+ 'profile' => [
+ 'profile-type' => SearchEngine::COMPLETION_PROFILE_TYPE,
+ 'help-message' => 'apihelp-query+prefixsearch-param-profile',
+ ],
+ ];
}
protected function getExamplesMessages() {
* The prototype for a token function is func($pageid, $title, $rc)
* it should return a token or false (permission denied)
* @deprecated since 1.24
- * @return array Array(tokenname => function)
+ * @return array [ tokenname => function ]
*/
protected function getTokenFunctions() {
// Don't call the hooks twice
/** @var array list of api allowed params */
private $allowedParams;
- /**
- * When $wgSearchType is null, $wgSearchAlternatives[0] is null. Null isn't
- * a valid option for an array for PARAM_TYPE, so we'll use a fake name
- * that can't possibly be a class name and describes what the null behavior
- * does
- */
- const BACKEND_NULL_PARAM = 'database-backed';
-
public function __construct( ApiQuery $query, $moduleName ) {
parent::__construct( $query, $moduleName, 'sr' );
}
global $wgContLang;
$params = $this->extractRequestParams();
- if ( isset( $params['backend'] ) && $params['backend'] == self::BACKEND_NULL_PARAM ) {
- unset( $params['backend'] );
- }
-
// Extract parameters
$query = $params['search'];
$what = $params['what'];
return $this->allowedParams;
}
- $this->allowedParams = [
- 'search' => [
- ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => true
- ],
- 'namespace' => [
- ApiBase::PARAM_DFLT => NS_MAIN,
- ApiBase::PARAM_TYPE => 'namespace',
- ApiBase::PARAM_ISMULTI => true,
- ],
+ $this->allowedParams = $this->buildCommonApiParams() + [
'what' => [
ApiBase::PARAM_TYPE => [
'title',
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
],
- 'offset' => [
- ApiBase::PARAM_DFLT => 0,
- ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
- ],
- 'limit' => [
- ApiBase::PARAM_DFLT => 10,
- ApiBase::PARAM_TYPE => 'limit',
- ApiBase::PARAM_MIN => 1,
- ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
- ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
- ],
'interwiki' => false,
'enablerewrites' => false,
];
- $searchConfig = MediaWikiServices::getInstance()->getSearchEngineConfig();
- $alternatives = $searchConfig->getSearchTypes();
- if ( count( $alternatives ) > 1 ) {
- if ( $alternatives[0] === null ) {
- $alternatives[0] = self::BACKEND_NULL_PARAM;
- }
- $this->allowedParams['backend'] = [
- ApiBase::PARAM_DFLT => $searchConfig->getSearchType(),
- ApiBase::PARAM_TYPE => $alternatives,
- ];
- // @todo: support profile selection when multiple
- // backends are available. The solution could be to
- // merge all possible profiles and let ApiBase
- // subclasses do the check. Making ApiHelp and ApiSandbox
- // comprehensive might be more difficult.
- } else {
- $profileParam = $this->buildProfileApiParam( SearchEngine::FT_QUERY_INDEP_PROFILE_TYPE,
- 'apihelp-query+search-param-qiprofile' );
- if ( $profileParam ) {
- $this->allowedParams['qiprofile'] = $profileParam;
- }
- }
-
return $this->allowedParams;
}
public function getSearchProfileParams() {
- if ( isset( $this->getAllowedParams()['qiprofile'] ) ) {
- return [ SearchEngine::FT_QUERY_INDEP_PROFILE_TYPE => 'qiprofile' ];
- }
- return [];
+ return [
+ 'qiprofile' => [
+ 'profile-type' => SearchEngine::FT_QUERY_INDEP_PROFILE_TYPE,
+ 'help-message' => 'apihelp-query+search-param-qiprofile',
+ ],
+ ];
}
protected function getExamplesMessages() {
$ret['description'] = $ext['description'];
}
if ( isset( $ext['descriptionmsg'] ) ) {
- // Can be a string or array( key, param1, param2, ... )
+ // Can be a string or [ key, param1, param2, ... ]
if ( is_array( $ext['descriptionmsg'] ) ) {
$ret['descriptionmsg'] = $ext['descriptionmsg'][0];
$ret['descriptionmsgparams'] = array_slice( $ext['descriptionmsg'], 1 );
parent::__construct( $query, $moduleName, 'uc' );
}
- private $params, $prefixMode, $userprefix, $multiUserMode, $usernames, $parentLens;
+ private $params, $prefixMode, $userprefix, $multiUserMode, $idMode, $usernames, $userids,
+ $parentLens;
private $fld_ids = false, $fld_title = false, $fld_timestamp = false,
$fld_comment = false, $fld_parsedcomment = false, $fld_flags = false,
$fld_patrolled = false, $fld_tags = false, $fld_size = false, $fld_sizediff = false;
// TODO: if the query is going only against the revision table, should this be done?
$this->selectNamedDB( 'contributions', DB_SLAVE, 'contributions' );
+ $this->idMode = false;
if ( isset( $this->params['userprefix'] ) ) {
$this->prefixMode = true;
$this->multiUserMode = true;
$this->userprefix = $this->params['userprefix'];
} else {
+ $anyIPs = false;
+ $this->userids = [];
$this->usernames = [];
if ( !is_array( $this->params['user'] ) ) {
$this->params['user'] = [ $this->params['user'] ];
$this->dieUsage( 'User parameter may not be empty.', 'param_user' );
}
foreach ( $this->params['user'] as $u ) {
- $this->prepareUsername( $u );
+ if ( is_null( $u ) || $u === '' ) {
+ $this->dieUsage( 'User parameter may not be empty', 'param_user' );
+ }
+
+ if ( User::isIP( $u ) ) {
+ $anyIPs = true;
+ $this->usernames[] = $u;
+ } else {
+ $name = User::getCanonicalName( $u, 'valid' );
+ if ( $name === false ) {
+ $this->dieUsage( "User name {$u} is not valid", 'param_user' );
+ }
+ $this->usernames[] = $name;
+ }
}
$this->prefixMode = false;
$this->multiUserMode = ( count( $this->params['user'] ) > 1 );
+
+ if ( !$anyIPs ) {
+ $dbr = $this->getDB();
+ $res = $dbr->select( 'user', 'user_id', [ 'user_name' => $this->usernames ], __METHOD__ );
+ foreach ( $res as $row ) {
+ $this->userids[] = $row->user_id;
+ }
+ $this->idMode = count( $this->userids ) === count( $this->usernames );
+ }
}
$this->prepareQuery();
);
}
- /**
- * Validate the 'user' parameter and set the value to compare
- * against `revision`.`rev_user_text`
- *
- * @param string $user
- */
- private function prepareUsername( $user ) {
- if ( !is_null( $user ) && $user !== '' ) {
- $name = User::isIP( $user )
- ? $user
- : User::getCanonicalName( $user, 'valid' );
- if ( $name === false ) {
- $this->dieUsage( "User name {$user} is not valid", 'param_user' );
- } else {
- $this->usernames[] = $name;
- }
- } else {
- $this->dieUsage( 'User parameter may not be empty', 'param_user' );
- }
- }
-
/**
* Prepares the query and returns the limit of rows requested
*/
$continue = explode( '|', $this->params['continue'] );
$db = $this->getDB();
if ( $this->multiUserMode ) {
- $this->dieContinueUsageIf( count( $continue ) != 3 );
+ $this->dieContinueUsageIf( count( $continue ) != 4 );
+ $modeFlag = array_shift( $continue );
+ $this->dieContinueUsageIf( !in_array( $modeFlag, [ 'id', 'name' ] ) );
+ if ( $this->idMode && $modeFlag === 'name' ) {
+ // The users were created since this query started, but we
+ // can't go back and change modes now. So just keep on with
+ // name mode.
+ $this->idMode = false;
+ }
+ $this->dieContinueUsageIf( ( $modeFlag === 'id' ) !== $this->idMode );
+ $userField = $this->idMode ? 'rev_user' : 'rev_user_text';
$encUser = $db->addQuotes( array_shift( $continue ) );
} else {
$this->dieContinueUsageIf( count( $continue ) != 2 );
$op = ( $this->params['dir'] == 'older' ? '<' : '>' );
if ( $this->multiUserMode ) {
$this->addWhere(
- "rev_user_text $op $encUser OR " .
- "(rev_user_text = $encUser AND " .
+ "$userField $op $encUser OR " .
+ "($userField = $encUser AND " .
"(rev_timestamp $op $encTS OR " .
"(rev_timestamp = $encTS AND " .
"rev_id $op= $encId)))"
if ( $this->prefixMode ) {
$this->addWhere( 'rev_user_text' .
$this->getDB()->buildLike( $this->userprefix, $this->getDB()->anyString() ) );
+ } elseif ( $this->idMode ) {
+ $this->addWhereFld( 'rev_user', $this->userids );
} else {
$this->addWhereFld( 'rev_user_text', $this->usernames );
}
// ... and in the specified timeframe.
- // Ensure the same sort order for rev_user_text and rev_timestamp
+ // Ensure the same sort order for rev_user/rev_user_text and rev_timestamp
// so our query is indexed
if ( $this->multiUserMode ) {
- $this->addWhereRange( 'rev_user_text', $this->params['dir'], null, null );
+ $this->addWhereRange( $this->idMode ? 'rev_user' : 'rev_user_text',
+ $this->params['dir'], null, null );
}
$this->addTimestampWhereRange( 'rev_timestamp',
$this->params['dir'], $this->params['start'], $this->params['end'] );
$this->addWhereIf( 'rev_parent_id = 0', isset( $show['new'] ) );
}
$this->addOption( 'LIMIT', $this->params['limit'] + 1 );
- $index = [ 'revision' => 'usertext_timestamp' ];
// Mandatory fields: timestamp allows request continuation
// ns+title checks if the user has access rights for this page
$this->addWhereFld( 'ct_tag', $this->params['tag'] );
}
- $this->addOption( 'USE INDEX', $index );
+ if ( isset( $index ) ) {
+ $this->addOption( 'USE INDEX', $index );
+ }
}
/**
private function continueStr( $row ) {
if ( $this->multiUserMode ) {
- return "$row->rev_user_text|$row->rev_timestamp|$row->rev_id";
+ if ( $this->idMode ) {
+ return "id|$row->rev_user|$row->rev_timestamp|$row->rev_id";
+ } else {
+ return "name|$row->rev_user_text|$row->rev_timestamp|$row->rev_id";
+ }
} else {
return "$row->rev_timestamp|$row->rev_id";
}
}
} else {
$data[$u]['missing'] = true;
- if ( isset( $this->prop['cancreate'] ) && !$this->getConfig()->get( 'DisableAuthManager' ) ) {
+ if ( isset( $this->prop['cancreate'] ) ) {
$status = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u );
$data[$u]['cancreate'] = $status->isGood();
if ( !$status->isGood() ) {
}
public function getAllowedParams() {
- $ret = [
+ return [
'prop' => [
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_TYPE => [
'emailable',
'gender',
'centralids',
+ 'cancreate',
// When adding a prop, consider whether it should be added
// to self::$publicProps
],
ApiBase::PARAM_ISMULTI => true
],
];
- if ( !$this->getConfig()->get( 'DisableAuthManager' ) ) {
- $ret['prop'][ApiBase::PARAM_TYPE][] = 'cancreate';
- }
- return $ret;
}
protected function getExamplesMessages() {
/**
* This class represents the result of the API operations.
- * It simply wraps a nested array() structure, adding some functions to simplify
+ * It simply wraps a nested array structure, adding some functions to simplify
* array's modifications. As various modules execute, they add different pieces
* of information to this result, structuring it as it will be given to the client.
*
* set to '*'. This may be skipped by including 'no*' in the value
* array.
* - Tags listed in META_BC_SUBELEMENTS will have their values changed to
- * array( '*' => $value ). This may be skipped by including 'nosub' in
+ * [ '*' => $value ]. This may be skipped by including 'nosub' in
* the value array.
* - If META_TYPE is 'BCarray', set it to 'default'
* - If META_TYPE is 'BCassoc', set it to 'default'
* as objects.
* - ArmorKVP: (string) If provided, transform arrays with META_TYPE 'kvp'
* and 'BCkvp' into arrays of two-element arrays, something like this:
- * $output = array();
+ * $output = [];
* foreach ( $input as $key => $value ) {
- * $pair = array();
+ * $pair = [];
* $pair[$META_KVP_KEY_NAME ?: $ArmorKVP_value] = $key;
* ApiResult::setContentValue( $pair, 'value', $value );
* $output[] = $pair;
* Add value to the output data at the given path.
*
* Path can be an indexed array, each element specifying the branch at which to add the new
- * value. Setting $path to array('a','b','c') is equivalent to data['a']['b']['c'] = $value.
+ * value. Setting $path to [ 'a', 'b', 'c' ] is equivalent to data['a']['b']['c'] = $value.
* If $path is null, the value will be inserted at the data root.
*
* @param array|string|int|null $path
const ERROR_PARSE = 'error_parse';
const ERROR_CACHE = 'error_cache';
const ERROR_UNCACHEABLE = 'uncacheable';
+ const ERROR_BUSY = 'busy';
const PRESUME_FRESH_TTL_SEC = 30;
const MAX_CACHE_TTL = 300; // 5 minutes
$this->dieUsage( 'This interface is not supported for bots', 'botsnotsupported' );
}
+ $cache = ObjectCache::getLocalClusterInstance();
$page = $this->getTitleOrPageId( $params );
$title = $page->getTitle();
$this->dieUsage( 'Unsupported content model/format', 'badmodelformat' );
}
- // Trim and fix newlines so the key SHA1's match (see RequestContext::getText())
- $text = rtrim( str_replace( "\r\n", "\n", $params['text'] ) );
+ if ( strlen( $params['stashedtexthash'] ) ) {
+ // Load from cache since the client indicates the text is the same as last stash
+ $textHash = $params['stashedtexthash'];
+ $textKey = $cache->makeKey( 'stashedit', 'text', $textHash );
+ $text = $cache->get( $textKey );
+ if ( !is_string( $text ) ) {
+ $this->dieUsage( 'No stashed text found with the given hash', 'missingtext' );
+ }
+ } elseif ( $params['text'] !== null ) {
+ // Trim and fix newlines so the key SHA1's match (see WebRequest::getText())
+ $text = rtrim( str_replace( "\r\n", "\n", $params['text'] ) );
+ $textHash = sha1( $text );
+ } else {
+ $this->dieUsage(
+ 'The text or stashedtexthash parameter must be given', 'missingtextparam' );
+ }
+
$textContent = ContentHandler::makeContent(
$text, $title, $params['contentmodel'], $params['contentformat'] );
// The user will abort the AJAX request by pressing "save", so ignore that
ignore_user_abort( true );
- // Use the master DB for fast blocking locks
- $dbw = wfGetDB( DB_MASTER );
-
- // Get a key based on the source text, format, and user preferences
- $key = self::getStashKey( $title, $content, $user );
- // De-duplicate requests on the same key
if ( $user->pingLimiter( 'stashedit' ) ) {
$status = 'ratelimited';
- } elseif ( $dbw->lock( $key, __METHOD__, 1 ) ) {
- $status = self::parseAndStash( $page, $content, $user, $params['summary'] );
- $dbw->unlock( $key, __METHOD__ );
} else {
- $status = 'busy';
+ $status = self::parseAndStash( $page, $content, $user, $params['summary'] );
+ $textKey = $cache->makeKey( 'stashedit', 'text', $textHash );
+ $cache->set( $textKey, $text, self::MAX_CACHE_TTL );
}
$this->getStats()->increment( "editstash.cache_stores.$status" );
- $this->getResult()->addValue( null, $this->getModuleName(), [ 'status' => $status ] );
+ $this->getResult()->addValue(
+ null,
+ $this->getModuleName(),
+ [
+ 'status' => $status,
+ 'texthash' => $textHash
+ ]
+ );
}
/**
$cache = ObjectCache::getLocalClusterInstance();
$logger = LoggerFactory::getInstance( 'StashEdit' );
- $format = $content->getDefaultFormat();
- $editInfo = $page->prepareContentForEdit( $content, null, $user, $format, false );
$title = $page->getTitle();
+ $key = self::getStashKey( $title, self::getContentHash( $content ), $user );
- if ( $editInfo && $editInfo->output ) {
- $key = self::getStashKey( $title, $content, $user );
+ // Use the master DB for fast blocking locks
+ $dbw = wfGetDB( DB_MASTER );
+ if ( !$dbw->lock( $key, __METHOD__, 1 ) ) {
+ // De-duplicate requests on the same key
+ return self::ERROR_BUSY;
+ }
+ $unlocker = new ScopedCallback( function () use ( $dbw, $key ) {
+ $dbw->unlock( $key, __METHOD__ );
+ } );
+
+ $cutoffTime = time() - self::PRESUME_FRESH_TTL_SEC;
+
+ // Reuse any freshly build matching edit stash cache
+ $editInfo = $cache->get( $key );
+ if ( $editInfo && wfTimestamp( TS_UNIX, $editInfo->timestamp ) >= $cutoffTime ) {
+ $alreadyCached = true;
+ } else {
+ $format = $content->getDefaultFormat();
+ $editInfo = $page->prepareContentForEdit( $content, null, $user, $format, false );
+ $alreadyCached = false;
+ }
+ if ( $editInfo && $editInfo->output ) {
// Let extensions add ParserOutput metadata or warm other caches
Hooks::run( 'ParserOutputStashForEdit',
[ $page, $content, $editInfo->output, $summary, $user ] );
+ if ( $alreadyCached ) {
+ $logger->debug( "Already cached parser output for key '$key' ('$title')." );
+ return self::ERROR_NONE;
+ }
+
list( $stashInfo, $ttl, $code ) = self::buildStashValue(
$editInfo->pstContent,
$editInfo->output,
$logger = LoggerFactory::getInstance( 'StashEdit' );
$stats = RequestContext::getMain()->getStats();
- $key = self::getStashKey( $title, $content, $user );
+ $key = self::getStashKey( $title, self::getContentHash( $content ), $user );
$editInfo = $cache->get( $key );
if ( !is_object( $editInfo ) ) {
$start = microtime( true );
return wfTimestampOrNull( TS_MW, $time );
}
+ /**
+ * Get hash of the content, factoring in model/format
+ *
+ * @param Content $content
+ * @return string
+ */
+ private static function getContentHash( Content $content ) {
+ return sha1( implode( "\n", [
+ $content->getModel(),
+ $content->getDefaultFormat(),
+ $content->serialize( $content->getDefaultFormat() )
+ ] ) );
+ }
+
/**
* Get the temporary prepared edit stash key for a user
*
* - b) The parser output was made from the PST using cannonical matching options
*
* @param Title $title
- * @param Content $content
+ * @param string $contentHash Result of getContentHash()
* @param User $user User to get parser options from
* @return string
*/
- private static function getStashKey( Title $title, Content $content, User $user ) {
- $hash = sha1( implode( ':', [
+ private static function getStashKey( Title $title, $contentHash, User $user ) {
+ return ObjectCache::getLocalClusterInstance()->makeKey(
+ 'prepared-edit',
+ md5( $title->getPrefixedDBkey() ),
// Account for the edit model/text
- $content->getModel(),
- $content->getDefaultFormat(),
- sha1( $content->serialize( $content->getDefaultFormat() ) ),
+ $contentHash,
// Account for user name related variables like signatures
- $user->getId(),
- md5( $user->getName() )
- ] ) );
-
- return wfMemcKey( 'prepared-edit', md5( $title->getPrefixedDBkey() ), $hash );
+ md5( $user->getId() . "\n" . $user->getName() )
+ );
}
/**
*
* This makes a simple version of WikiPage::prepareContentForEdit() as stash info
*
- * @param Content $pstContent
+ * @param Content $pstContent Pre-Save transformed content
* @param ParserOutput $parserOutput
* @param string $timestamp TS_MW
* @param User $user
],
'text' => [
ApiBase::PARAM_TYPE => 'text',
- ApiBase::PARAM_REQUIRED => true
+ ApiBase::PARAM_DFLT => null
+ ],
+ 'stashedtexthash' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_DFLT => null
],
'summary' => [
ApiBase::PARAM_TYPE => 'string',
$status = UnwatchAction::doUnwatch( $title, $user );
$res['unwatched'] = $status->isOK();
if ( $status->isOK() ) {
- $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )
+ $msgKey = $title->isTalkPage() ? 'removedwatchtext-talk' : 'removedwatchtext';
+ $res['message'] = $this->msg( $msgKey, $title->getPrefixedText() )
->title( $title )->parseAsBlock();
}
} else {
$status = WatchAction::doWatch( $title, $user );
$res['watched'] = $status->isOK();
if ( $status->isOK() ) {
- $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )
+ $msgKey = $title->isTalkPage() ? 'addedwatchtext-talk' : 'addedwatchtext';
+ $res['message'] = $this->msg( $msgKey, $title->getPrefixedText() )
->title( $title )->parseAsBlock();
}
}
* @ingroup API
*/
trait SearchApi {
+
+ /**
+ * When $wgSearchType is null, $wgSearchAlternatives[0] is null. Null isn't
+ * a valid option for an array for PARAM_TYPE, so we'll use a fake name
+ * that can't possibly be a class name and describes what the null behavior
+ * does
+ */
+ private static $BACKEND_NULL_PARAM = 'database-backed';
+
/**
- * Build the profile api param definitions.
+ * The set of api parameters that are shared between api calls that
+ * call the SearchEngine. Primarily this defines parameters that
+ * are utilized by self::buildSearchEngine().
*
- * @param string $profileType type of profile to customize
- * @param string $helpMsg i18n message
- * @param string|null $backendType SearchEngine backend type or null for default engine
- * @return array|null the api param definition or null if profiles are
- * not supported by the searchEngine implementation.
+ * @param bool $isScrollable True if the api offers scrolling
+ * @return array
*/
- public function buildProfileApiParam( $profileType, $helpMsg, $backendType = null ) {
- $searchEngine = null;
- if ( $backendType !== null ) {
- $searchEngine = MediaWikiServices::getInstance()
- ->getSearchEngineFactory()->create( $backendType );
+ public function buildCommonApiParams( $isScrollable = true ) {
+ $params = [
+ 'search' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true,
+ ],
+ 'namespace' => [
+ ApiBase::PARAM_DFLT => NS_MAIN,
+ ApiBase::PARAM_TYPE => 'namespace',
+ ApiBase::PARAM_ISMULTI => true,
+ ],
+ 'limit' => [
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2,
+ ],
+ ];
+ if ( $isScrollable ) {
+ $params['offset'] = [
+ ApiBase::PARAM_DFLT => 0,
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
+ ];
+ }
+
+ $searchConfig = MediaWikiServices::getInstance()->getSearchEngineConfig();
+ $alternatives = $searchConfig->getSearchTypes();
+ if ( count( $alternatives ) > 1 ) {
+ if ( $alternatives[0] === null ) {
+ $alternatives[0] = self::$BACKEND_NULL_PARAM;
+ }
+ $this->allowedParams['backend'] = [
+ ApiBase::PARAM_DFLT => $searchConfig->getSearchType(),
+ ApiBase::PARAM_TYPE => $alternatives,
+ ];
+ // @todo: support profile selection when multiple
+ // backends are available. The solution could be to
+ // merge all possible profiles and let ApiBase
+ // subclasses do the check. Making ApiHelp and ApiSandbox
+ // comprehensive might be more difficult.
} else {
- $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
+ $params += $this->buildProfileApiParam();
}
- $profiles = $searchEngine->getProfiles( $profileType );
- if ( $profiles ) {
+ return $params;
+ }
+
+ /**
+ * Build the profile api param definitions. Makes bold assumption only one search
+ * engine is available, ensure that is true before calling.
+ *
+ * @return array array containing available additional api param definitions.
+ * Empty if profiles are not supported by the searchEngine implementation.
+ */
+ private function buildProfileApiParam() {
+ $configs = $this->getSearchProfileParams();
+ $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
+ $params = [];
+ foreach ( $configs as $paramName => $paramConfig ) {
+ $profiles = $searchEngine->getProfiles( $paramConfig['profile-type'] );
+ if ( !$profiles ) {
+ continue;
+ }
+
$types = [];
$helpMessages = [];
$defaultProfile = null;
$defaultProfile = $profile['name'];
}
}
- return [
+
+ $params[$paramName] = [
ApiBase::PARAM_TYPE => $types,
- ApiBase::PARAM_HELP_MSG => $helpMsg,
+ ApiBase::PARAM_HELP_MSG => $paramConfig['help-message'],
ApiBase::PARAM_HELP_MSG_PER_VALUE => $helpMessages,
ApiBase::PARAM_DFLT => $defaultProfile,
];
}
- return null;
+
+ return $params;
}
/**
* Build the search engine to use.
* If $params is provided then the following searchEngine options
* will be set:
+ * - backend: which search backend to use
* - limit: mandatory
* - offset: optional, if set limit will be incremented by
* one ( to support the continue parameter )
public function buildSearchEngine( array $params = null ) {
if ( $params != null ) {
$type = isset( $params['backend'] ) ? $params['backend'] : null;
+ if ( $type === self::$BACKEND_NULL_PARAM ) {
+ $type = null;
+ }
$searchEngine = MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $type );
$limit = $params['limit'];
$searchEngine->setNamespaces( $params['namespace'] );
$limit += 1;
}
$searchEngine->setLimitOffset( $limit, $offset );
- foreach ( $this->getSearchProfileParams() as $type => $param ) {
- if ( isset( $params[$param] ) ) {
- $searchEngine->setFeatureData( $type, $params[$param] );
+
+ // Initialize requested search profiles.
+ $configs = $this->getSearchProfileParams();
+ foreach ( $configs as $paramName => $paramConfig ) {
+ if ( isset( $params[$paramName] ) ) {
+ $searchEngine->setFeatureData(
+ $paramConfig['profile-type'],
+ $params[$paramName]
+ );
}
}
} else {
}
/**
- * @return string[] the list of supported search profile types. Key is
- * the profile type and its associated value is the request param.
+ * @return array[] array of arrays mapping from parameter name to a two value map
+ * containing 'help-message' and 'profile-type' keys.
*/
abstract public function getSearchProfileParams();
}
"apihelp-parse-paramvalue-prop-displaytitle": "Вики-текстың синтаксик анализына исем ҡуя.",
"apihelp-parse-paramvalue-prop-headitems": "<код> & ЛТ -ҡа һалыу өсөн элементтар бирә; башы & GT; биттең </ код>",
"apihelp-parse-paramvalue-prop-headhtml": "Айырылған <код> & лт бирә; & баштары GТ; биттең </ код>.",
- "apihelp-parse-paramvalue-prop-jsconfigvars": "Бит өсөн үҙенсәлекле JavaScript үҙгәреүсән конфигурациялар бирә.",
+ "apihelp-parse-paramvalue-prop-jsconfigvars": "Бит өсөн үҙенсәлекле JavaScript үҙгәреүсән конфигурациялар бирә. Ҡулланыр өсөн, <code>mw.config.set()</code> ҡабыҙырға.",
"apihelp-parse-paramvalue-prop-encodedjsconfigvars": "JavaScriptтың JSON юлы һымаҡ үҙенсәлекле биттәренә алышына торған конфигурация бирә.",
"apihelp-parse-paramvalue-prop-iwlinks": "Вики-текстың синтаксик анализында интервиктарға һылтанма бирә.",
"apihelp-parse-paramvalue-prop-wikitext": "Һығымта яҺау өсөн тәүге вики-тексты күрһәтә",
"apihelp-protect-param-tags": "Юйҙырылғандар журналындағы яҙмаларға мөрәжәғәт итер өсөн, билдәләрҙе үҙгәртергә.",
"apihelp-protect-param-watchlist": "Ағымдағы ҡулланыусының теҙмәһенән битте һүҙһеҙ өҫтәргә йәки юйырға, һылтанмаларҙы файҙаланығыҙ йәки сәғәтте алмаштырмаҫҡа.",
"apihelp-protect-example-protect": "Битте һаҡларға.",
- "apihelp-protect-example-unprotect": "<kbd>всех</kbd> өсөн сикләүҙәр ҡуйып,биттән һаҡлауҙы алырға.",
+ "apihelp-protect-example-unprotect": "<kbd>all</kbd> сикләүҙәрен (йәғни һәр береһе эшләй ала) ҡуйып, бит һағын асырға.",
"apihelp-protect-example-unprotect2": "Бер ниндәй сикләүҙәр ҡуймай биттән һаҡлауҙы алырға.",
"apihelp-purge-param-forcelinkupdate": "Таблицалар бәйләнешен яңыртыу.",
"apihelp-purge-param-forcerecursivelinkupdate": "Һылтанманы һәм таблицаны яңыртығыҙ һәм был битте шаблон итеп ҡулланған башҡа биттәр өсөн һылтанмаларҙы ла яңыртығыҙ.",
"apihelp-main-param-requestid": "Любое значэньне, пададзенае тут, будзе ўключанае ў адказ. Можа быць выкарыстанае для адрозьненьня запытаў.",
"apihelp-main-param-servedby": "Уключае ў вынік назву сэрвэра, які апрацаваў запыт.",
"apihelp-main-param-curtimestamp": "Уключае ў вынік пазнаку актуальнага часу.",
- "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST). Ён мусіць супадаць з адной з крыніц у загалоўку <code>Origin</code>, павінна быць зададзена нешта кшталту <kbd>https://en.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Калі парамэтар не супадае з загалоўкам <code>Origin</code>, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам <code>Origin</code> і крыніца знаходзіцца ў белым сьпісе, будзе выстаўлены загаловак <code>Access-Control-Allow-Origin</code>.",
+ "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST).\n\nДля аўтэнтыфікаваных запытаў ён мусіць супадаць з адной з крыніц у загалоўку <code>Origin</code>, павінна быць зададзена нешта кшталту <kbd>https://en.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Калі парамэтар не супадае з загалоўкам <code>Origin</code>, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам <code>Origin</code> і крыніца знаходзіцца ў белым сьпісе, будуць выстаўленыя загалоўкі <code>Access-Control-Allow-Origin</code> і <code>Access-Control-Allow-Credentials</code>.\n\nДля неаўтэнтыфікаваных запытаў выстаўце значэньне <kbd>*</kbd>. Гэта прывядзе да выстаўленьня загалоўку <code>Access-Control-Allow-Origin</code>, але <code>Access-Control-Allow-Credentials</code> будзе мець значэньне <code>false</code> і ўсе зьвесткі пра карыстальніка будуць абмежаваныя.",
"apihelp-main-param-uselang": "Мова для выкарыстаньня ў перакладах паведамленьняў. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> вяртае сьпіс кодаў мовы, або трэба вызначыць <kbd>user</kbd>, каб ужываць налады мовы цяперашняга карыстальніка, або вызначыць <kbd>content</kbd>, каб ужываць мову зьместу гэтай вікі.",
"apihelp-block-description": "Блякаваньне ўдзельніка.",
"apihelp-block-param-user": "Імя ўдзельніка, IP-адрас або IP-дыяпазон, якія вы хочаце заблякаваць.",
"apihelp-main-param-requestid": "Libovolná zde uvedená hodnota bude zahrnuta v odpovědi. Lze použít pro rozlišení požadavků.",
"apihelp-main-param-servedby": "Zahrnout do odpovědi název hostitele, který požadavek obsloužil.",
"apihelp-main-param-curtimestamp": "Zahrnout do odpovědi aktuální časové razítko.",
- "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu). Hodnota musí přesně odpovídat jednomu z původů v hlavičce <code>Origin</code>, takže musí být nastavena na něco jako <kbd>https://en.wikipedia.org</kbd> nebo <kbd>https://meta.wikimedia.org</kbd>. Pokud parametr neodpovídá hlavičce <code>Origin</code>, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce <code>Origin</code> a tento původ je na bílé listině, bude nastavena hlavička <code>Access-Control-Allow-Origin</code>.",
+ "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu).\n\nU autentizovaných požadavků hodnota musí přesně odpovídat jednomu z původů v hlavičce <code>Origin</code>, takže musí být nastavena na něco jako <kbd>https://en.wikipedia.org</kbd> nebo <kbd>https://meta.wikimedia.org</kbd>. Pokud parametr neodpovídá hlavičce <code>Origin</code>, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce <code>Origin</code> a tento původ je na bílé listině, budou nastaveny hlavičky <code>Access-Control-Allow-Origin</code> a <code>Access-Control-Allow-Credentials</code>.\n\nU neautentizovaných požadavků uveďte hodnotu <kbd>*</kbd>. To způsobí nastavení hlavičky <code>Access-Control-Allow-Origin</code>, ale hlavička <code>Access-Control-Allow-Credentials</code> bude <code>false</code> a budou omezena všechna data specifická pro uživatele.",
"apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Pomocí <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> se <kbd>siprop=languages</kbd> získáte seznam jazykových kódů nebo zadejte „<kbd>user</kbd>“ pro použití předvoleného jazyka aktuálního uživatele či „<kbd>content</kbd>“ pro použití jazyka obsahu této wiki.",
"apihelp-block-description": "Zablokovat uživatele.",
"apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat.",
"apihelp-parse-paramvalue-prop-sections": "Gibt die Abschnitte im geparsten Wikitext zurück.",
"apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.",
"apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.",
- "apihelp-parse-paramvalue-prop-jsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite aus.",
+ "apihelp-parse-paramvalue-prop-jsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite aus. Zur Anwendung verwende <code>mw.config.set()</code>.",
"apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite als JSON-Zeichenfolge aus.",
"apihelp-parse-paramvalue-prop-indicators": "Gibt das HTML der Seitenstatusindikatoren zurück, die auf der Seite verwendet werden.",
"apihelp-parse-paramvalue-prop-iwlinks": "Gibt Interwiki-Links des geparsten Wikitextes zurück.",
"apihelp-protect-description": "Ändert den Schutzstatus einer Seite.",
"apihelp-protect-param-title": "Titel der Seite, die du (ent-)sperren möchtest. Kann nicht zusammen mit $1pageid verwendet werden.",
"apihelp-protect-param-pageid": "Seitenkennung der Seite, die du (ent-)sperren möchtest. Kann nicht zusammen mit $1title verwendet werden.",
- "apihelp-protect-param-protections": "Liste der Schutzebenen nach dem Format <kbd>Aktion=Ebene</kbd> (z.B. <kbd>edit=sysop</kbd>).\n\n<strong>HINWEIS:</strong> Wenn eine Aktion nicht angegeben wird, wird deren Schutz entfernt.",
+ "apihelp-protect-param-protections": "Listet die Schutzebenen nach dem Format <kbd>Aktion=Ebene</kbd> (z. B. <kbd>edit=sysop</kbd>) auf. Die Ebene <kbd>all</kbd> bedeutet, dass jeder die Aktion ausführen darf, z. B. keine Beschränkung.\n\n<strong>HINWEIS:</strong> Wenn eine Aktion nicht angegeben wird, wird deren Schutz entfernt.",
"apihelp-protect-param-expiry": "Zeitstempel des Schutzablaufs. Wenn nur ein Zeitstempel übergeben wird, ist dieser für alle Seitenschutze gültig. Um eine unendliche Schutzdauer festzulegen, kannst du die Werte <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> oder <kbd>never</kbd> übergeben.",
"apihelp-protect-param-reason": "Grund für den Seitenschutz oder dessen Aufhebung.",
"apihelp-protect-param-tags": "Auf den Seitenschutz-Logbuch-Eintrag anzuwendende Änderungsmarkierungen.",
"apihelp-protect-param-watch": "Wenn vorhanden, fügt dieser Parameter die zu (ent-)sperrende Seite der Beobachtungsliste des aktuellen Benutzers hinzu.",
"apihelp-protect-param-watchlist": "Die Seite bedingungslos zur Beobachtungsliste des aktuellen Benutzers hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
"apihelp-protect-example-protect": "Schützt eine Seite",
- "apihelp-protect-example-unprotect": "Eine Seite entsperren, indem die Einschränkungen durch den Schutz auf <kbd>all</kbd> gestellt werden.",
+ "apihelp-protect-example-unprotect": "Entsperrt eine Seite, indem die Einschränkungen durch den Schutz auf <kbd>all</kbd> gestellt werden (z. B. darf jeder die Aktion ausführen).",
"apihelp-protect-example-unprotect2": "Eine Seite entsperren, indem keine Einschränkungen übergeben werden",
"apihelp-purge-description": "Setzt den Cache der angegebenen Seiten zurück.\n\nFalls kein Benutzer angemeldet ist, müssen POST-Anfragen genutzt werden.",
"apihelp-purge-param-forcelinkupdate": "Aktualisiert die Linktabellen.",
"apihelp-query+watchlist-paramvalue-prop-userid": "Ergänzt die Kennung des Benutzers, der die Bearbeitung ausgeführt hat.",
"apihelp-query+watchlist-paramvalue-prop-comment": "Ergänzt den Kommentar der Bearbeitung.",
"apihelp-query+watchlist-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel der Bearbeitung.",
+ "apihelp-query+watchlist-paramvalue-prop-patrol": "Markiert Bearbeitungen, die kontrolliert sind.",
"apihelp-query+watchlist-paramvalue-prop-sizes": "Ergänzt die alten und neuen Längen der Seite.",
"apihelp-query+watchlist-paramvalue-type-new": "Seitenerstellungen.",
"apihelp-query+watchlist-paramvalue-type-log": "Logbucheinträge.",
"apihelp-query+watchlistraw-param-prop": "Zusätzlich zurückzugebende Eigenschaften:",
+ "apihelp-resetpassword-param-user": "Benutzer, der zurückgesetzt werden soll.",
"apihelp-rsd-description": "Ein RSD-Schema (Really Simple Discovery) exportieren.",
"apihelp-rsd-example-simple": "Das RSD-Schema exportieren",
"apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.",
+ "apihelp-stashedit-param-sectiontitle": "Der Titel für einen neuen Abschnitt.",
"apihelp-stashedit-param-text": "Seiteninhalt.",
+ "apihelp-stashedit-param-summary": "Änderungszusammenfassung.",
"apihelp-tag-param-reason": "Grund für die Änderung.",
+ "apihelp-tokens-param-type": "Abzufragende Tokentypen.",
+ "apihelp-tokens-example-edit": "Ruft einen Bearbeitungstoken ab (Standard).",
+ "apihelp-tokens-example-emailmove": "Ruft einen E-Mail- und Verschiebungstoken ab.",
"apihelp-unblock-description": "Einen Benutzer freigeben.",
"apihelp-unblock-param-id": "ID der Sperre zum Entsperren (über <kbd>list=blocks</kbd> erhalten). Darf nicht zusammen mit <var>$1user</var> verwendet werden.",
+ "apihelp-unblock-param-user": "Freizugebender Benutzername, IP-Adressbereich oder freizugebende IP-Adresse. Kann nicht zusammen mit <var>$1id</var> verwendet werden.",
"apihelp-unblock-param-reason": "Grund für die Freigabe.",
"apihelp-unblock-param-tags": "Auf den Benutzersperr-Logbuch-Eintrag anzuwendende Änderungsmarkierungen.",
"apihelp-unblock-example-id": "Sperrkennung #<kbd>105</kbd> freigeben.",
"api-help-permissions-granted-to": "{{PLURAL:$1|Gewährt an}}: $2",
"api-help-right-apihighlimits": "Höhere Beschränkungen in API-Anfragen verwenden (langsame Anfragen: $1; schnelle Anfragen: $2). Die Beschränkungen für langsame Anfragen werden auch auf Mehrwertparameter angewandt.",
"api-help-open-in-apisandbox": "<small>[in Spielwiese öffnen]</small>",
+ "api-help-authmanagerhelper-messageformat": "Zu verwendendes Format zur Rückgabe von Nachrichten.",
"api-credits-header": "Danksagungen",
"api-credits": "API-Entwickler:\n* Roan Kattouw (Hauptentwickler von September 2007 bis 2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (Autor, Hauptentwickler von September 2006 bis September 2007)\n* Brad Jorsch (Hauptentwickler seit 2013)\n\nBitte sende deine Kommentare, Vorschläge und Fragen an mediawiki-api@lists.wikimedia.org\noder reiche einen Fehlerbericht auf https://phabricator.wikimedia.org/ ein."
}
"apihelp-login-description": "Log in and get authentication cookies.\n\nThis action should only be used in combination with [[Special:BotPasswords]]; use for main-account login is deprecated and may fail without warning. To safely log in to the main account, use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
"apihelp-login-description-nobotpasswords": "Log in and get authentication cookies.\n\nThis action is deprecated and may fail without warning. To safely log in, use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
- "apihelp-login-description-nonauthmanager": "Log in and get authentication cookies.\n\nIn the event of a successful log-in, the needed cookies will be included in the HTTP response headers. In the event of a failed log-in, further attempts may be throttled to limit automated password guessing attacks.",
"apihelp-login-param-name": "User name.",
"apihelp-login-param-password": "Password.",
"apihelp-login-param-domain": "Domain (optional).",
"apihelp-parse-paramvalue-prop-sections": "Gives the sections in the parsed wikitext.",
"apihelp-parse-paramvalue-prop-revid": "Adds the revision ID of the parsed page.",
"apihelp-parse-paramvalue-prop-displaytitle": "Adds the title of the parsed wikitext.",
- "apihelp-parse-paramvalue-prop-headitems": "Gives items to put in the <code><head></code> of the page.",
+ "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Deprecated.</span> Gives items to put in the <code><head></code> of the page.",
"apihelp-parse-paramvalue-prop-headhtml": "Gives parsed <code><head></code> of the page.",
- "apihelp-parse-paramvalue-prop-modules": "Gives the ResourceLoader modules used on the page. Either <kbd>jsconfigvars</kbd> or <kbd>encodedjsconfigvars</kbd> must be requested jointly with <kbd>modules</kbd>.",
- "apihelp-parse-paramvalue-prop-jsconfigvars": "Gives the JavaScript configuration variables specific to the page.",
+ "apihelp-parse-paramvalue-prop-modules": "Gives the ResourceLoader modules used on the page. To load, use <code>mw.loader.using()</code>. Either <kbd>jsconfigvars</kbd> or <kbd>encodedjsconfigvars</kbd> must be requested jointly with <kbd>modules</kbd>.",
+ "apihelp-parse-paramvalue-prop-jsconfigvars": "Gives the JavaScript configuration variables specific to the page. To apply, use <code>mw.config.set()</code>.",
"apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gives the JavaScript configuration variables specific to the page as a JSON string.",
"apihelp-parse-paramvalue-prop-indicators": "Gives the HTML of page status indicators used on the page.",
"apihelp-parse-paramvalue-prop-iwlinks": "Gives interwiki links in the parsed wikitext.",
"apihelp-protect-description": "Change the protection level of a page.",
"apihelp-protect-param-title": "Title of the page to (un)protect. Cannot be used together with $1pageid.",
"apihelp-protect-param-pageid": "ID of the page to (un)protect. Cannot be used together with $1title.",
- "apihelp-protect-param-protections": "List of protection levels, formatted <kbd>action=level</kbd> (e.g. <kbd>edit=sysop</kbd>).\n\n<strong>Note:</strong> Any actions not listed will have restrictions removed.",
+ "apihelp-protect-param-protections": "List of protection levels, formatted <kbd>action=level</kbd> (e.g. <kbd>edit=sysop</kbd>). A level of <kbd>all</kbd> means everyone is allowed to take the action, i.e. no restriction.\n\n<strong>Note:</strong> Any actions not listed will have restrictions removed.",
"apihelp-protect-param-expiry": "Expiry timestamps. If only one timestamp is set, it'll be used for all protections. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, or <kbd>never</kbd>, for a never-expiring protection.",
"apihelp-protect-param-reason": "Reason for (un)protecting.",
"apihelp-protect-param-tags": "Change tags to apply to the entry in the protection log.",
"apihelp-protect-param-watch": "If set, add the page being (un)protected to the current user's watchlist.",
"apihelp-protect-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
"apihelp-protect-example-protect": "Protect a page.",
- "apihelp-protect-example-unprotect": "Unprotect a page by setting restrictions to <kbd>all</kbd>.",
+ "apihelp-protect-example-unprotect": "Unprotect a page by setting restrictions to <kbd>all</kbd> (i.e. everyone is allowed to take the action).",
"apihelp-protect-example-unprotect2": "Unprotect a page by setting no restrictions.",
"apihelp-purge-description": "Purge the cache for the given titles.\n\nRequires a POST request if the user is not logged in.",
"apihelp-stashedit-param-section": "Section number. <kbd>0</kbd> for the top section, <kbd>new</kbd> for a new section.",
"apihelp-stashedit-param-sectiontitle": "The title for a new section.",
"apihelp-stashedit-param-text": "Page content.",
+ "apihelp-stashedit-param-stashedtexthash": "Page content hash from a prior stash to use instead.",
"apihelp-stashedit-param-contentmodel": "Content model of the new content.",
"apihelp-stashedit-param-contentformat": "Content serialization format used for the input text.",
"apihelp-stashedit-param-baserevid": "Revision ID of the base revision.",
"apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
"apihelp-main-param-servedby": "Incluir el nombre del host que ha servido la solicitud en los resultados.",
"apihelp-main-param-curtimestamp": "Incluir la marca de tiempo actual en el resultado.",
- "apihelp-main-param-origin": "Cuando se accede a la API usando una petición AJAX de distinto dominio (CORS), establece este valor al dominio de origen. Debe ser incluido en cualquier petición pre-vuelo, y por lo tanto debe ser parte de la URI de la petición (no del cuerpo POST). Debe coincidir exactamente con uno de los orígenes de la cabecera <code>Origin</code>, por lo que debería ser algo como <kbd>https://en.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si este parámetro no coincide con la cabecera <code>Origin</code>, se devolverá una respuesta 403.\nSi este parámetro coincide con la cabecera <code>Origin</code> y el origen está en lista blanca, se creará una cabecera <code>Access-Control-Allow-Origin</code>.",
+ "apihelp-main-param-origin": "Cuando se accede a la API usando una petición AJAX de distinto dominio (CORS), se establece este valor al dominio de origen. Debe ser incluido en cualquier petición pre-vuelo, y por lo tanto debe ser parte de la URI de la petición (no del cuerpo POST). Debe coincidir exactamente con uno de los orígenes de la cabecera <code>Origin</code>, por lo que debería ser algo como <kbd>https://en.wikipedia.org</kbd> o <kbd>https://meta.wikimedia.org</kbd>. Si este parámetro no coincide con la cabecera <code>Origin</code>, se devolverá una respuesta 403.\nSi este parámetro coincide con la cabecera <code>Origin</code> y el origen está en lista blanca, se creará una cabecera <code>Access-Control-Allow-Origin</code>.",
"apihelp-main-param-uselang": "El idioma que se usará para las traducciones de mensajes. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd> devuelve una lista de códigos de idiomas, o especifica <kbd>user</kbd> para usar la preferencia de idioma del usuario actual, o especifica <kbd>content</kbd> para usar el idioma de contenido de este wiki.",
"apihelp-block-description": "Bloquear a un usuario.",
"apihelp-block-param-user": "El nombre de usuario, dirección IP o intervalo de IP que quieres bloquear.",
"apihelp-createaccount-param-language": "Código de idioma a establecer como predeterminado para el usuario (opcional, predeterminado al contenido del idioma).",
"apihelp-createaccount-example-pass": "Crear usuario <kbd>testuser</kbd> con la contraseña <kbd>test123</kbd>.",
"apihelp-createaccount-example-mail": "Crear usuario <kbd>testmailuser</kbd> y enviar una contraseña generada aleatoriamente.",
+ "apihelp-cspreport-description": "Utilizado por los navegadores para reportar violaciones de la política de seguridad de contenidos. Este módulo no debe usarse nunca, excepto cuando se usa automáticamente por un navegador web CSP compatible.",
+ "apihelp-cspreport-param-reportonly": "Marcar un informe de una política de vigilancia y no a una política forzada",
"apihelp-cspreport-param-source": "Qué generó la cabecera CSP que provocó este informe",
"apihelp-delete-description": "Borrar una página.",
"apihelp-delete-param-title": "Título de la página a eliminar. No se puede utilizar junto a <var>$1pageid</var>.",
"apihelp-delete-param-watch": "Añadir esta página a la lista de seguimiento del usuario actual.",
"apihelp-delete-param-watchlist": "Incondicionalmente agregar o remover la página de la lista de seguimiento del usuario actual, usar las preferencias o no cambiar el seguimiento.",
"apihelp-delete-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
+ "apihelp-delete-param-oldimage": "El nombre de la imagen antigua es proporcionado conforme a lo dispuesto por [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
"apihelp-delete-example-simple": "Borrar <kbd>Main Page</kbd>.",
"apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd> con el motivo <kbd>Preparing for move</kbd>.",
"apihelp-disabled-description": "Se desactivó este módulo.",
"apihelp-edit-param-nocreate": "Producir un error si la página no existe.",
"apihelp-edit-param-watch": "Añadir la página a la lista de seguimiento del usuario actual.",
"apihelp-edit-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
+ "apihelp-edit-param-watchlist": "Incondicionalmente añadir o eliminar la página de lista del usuario actual, utilice referencias o no cambiar el reloj.",
+ "apihelp-edit-param-md5": "El hash MD5 del parámetro $1text, o los parámetros concatenados $1prependtext y $1appendtext. Si se establece, la edición no se hará a menos que el hash sea correcto.",
"apihelp-edit-param-prependtext": "Añadir este texto al principio de la página. Reemplaza $1text.",
"apihelp-edit-param-appendtext": "Añadir este texto al principio de la página. Reemplaza $1text.\n\nUtiliza $1section=new para añadir una nueva sección, en lugar de este parámetro.",
"apihelp-edit-param-undo": "Deshacer esta revisión. Reemplaza $1text, $1prependtext y $1appendtext.",
"apihelp-expandtemplates-param-title": "Título de la página.",
"apihelp-expandtemplates-param-text": "Sintaxis wiki que se convertirá.",
"apihelp-expandtemplates-param-revid": "Revisión de ID, para <nowiki>{{REVISIONID}}</nowiki> y variables similares.",
+ "apihelp-expandtemplates-param-prop": "Qué elementos de información se utilizan para llegar.\n\nTenga en cuenta que si no se seleccionan los valores, el resultado contendrá el wikitexto, pero la salida será en un formato obsoleto.",
"apihelp-expandtemplates-paramvalue-prop-wikitext": "El wikitexto expandido.",
"apihelp-expandtemplates-paramvalue-prop-categories": "Cualesquiera categorías presentes en la entrada que no están representadas en salida de wikitexto.",
"apihelp-expandtemplates-paramvalue-prop-properties": "Propiedades de página definidas por palabras mágicas en el wikitexto.",
+ "apihelp-expandtemplates-paramvalue-prop-volatile": "Si la salida es volátil y no debe ser reutilizada en otro lugar dentro de la página.",
"apihelp-expandtemplates-paramvalue-prop-ttl": "El tiempo máximo tras el cual deberían invalidarse los resultados en caché.",
"apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Da las variables de configuración JavaScript específicas para la página.",
"apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Da las variables de configuración JavaScript específicas para la página como una cadena JSON.",
+ "apihelp-expandtemplates-paramvalue-prop-parsetree": "El árbol XML analiza el árbol de la entrada.",
"apihelp-expandtemplates-param-includecomments": "Incluir o no los comentarios HTML en la salida.",
"apihelp-expandtemplates-param-generatexml": "Generar un árbol de análisis XML (remplazado por $1prop=parsetree).",
"apihelp-expandtemplates-example-simple": "Expandir el wikitexto <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiquetas.",
"apihelp-feedrecentchanges-param-target": "Mostrar solo los cambios en las páginas enlazadas en esta.",
"apihelp-feedrecentchanges-param-showlinkedto": "Mostrar los cambios en páginas enlazadas con la página seleccionada.",
+ "apihelp-feedrecentchanges-param-categories": "Mostrar sólo cambios en las páginas en todas estas categorías.",
+ "apihelp-feedrecentchanges-param-categories_any": "Mostrar sólo cambios en las páginas en cualquiera de las categorías en lugar.",
"apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes.",
"apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días.",
"apihelp-feedwatchlist-description": "Devuelve el canal de una lista de seguimiento.",
"apihelp-help-param-submodules": "Incluir ayuda para submódulos del módulo con nombre.",
"apihelp-help-param-recursivesubmodules": "Incluir ayuda para submódulos recursivamente.",
"apihelp-help-param-helpformat": "Formato de salida de la ayuda.",
+ "apihelp-help-param-wrap": "Envolver el producto en una estructura de respuesta de la API estándar.",
"apihelp-help-param-toc": "Incluir una tabla de contenidos en la salida HTML.",
"apihelp-help-example-main": "Ayuda del módulo principal",
"apihelp-help-example-submodules": "Ayuda para <kbd>action=query</kbd> y todos sus submódulos.",
"apihelp-imagerotate-param-rotation": "Grados que rotar una imagen en sentido horario.",
"apihelp-imagerotate-example-simple": "Rotar <kbd>File:Example.png</kbd> <kbd>90</kbd> grados.",
"apihelp-imagerotate-example-generator": "Rotar todas las imágenes en <kbd>Category:Flip</kbd> <kbd>180</kbd> grados.",
+ "apihelp-import-description": "Importar una página desde otra wiki, o desde un archivo XML.\n\nTenga en cuenta que el HTTP POST debe hacerse como una carga de archivos (es decir, el uso de multipart/form-data) al enviar un archivo para el parámetro <var>xml</var>.",
"apihelp-import-param-summary": "Resumen de importación de entrada del registro.",
"apihelp-import-param-xml": "Se cargó el archivo XML.",
"apihelp-import-param-interwikisource": "Para importaciones interwiki: wiki desde la que importar.",
"apihelp-import-param-namespace": "Importar a este espacio de nombres. No puede usarse simultáneamente con <var>$1rootpage</var>.",
"apihelp-import-param-rootpage": "Importar como subpágina de esta página. No puede usarse simultáneamente con <var>$1namespace</var>.",
"apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] al espacio de nombres 100 con todo el historial.",
- "apihelp-login-description": "Iniciar sesión y obtener cookies de autenticación.\n\nSi inicias sesión sin problemas, las cookies necesarias se incluirán en los encabezados de respuesta HTTP. Si se produce algún error al iniciar sesión y este persiste, se puede regular para evitar los ataques masivos automatizados para adivinar contraseñas.",
+ "apihelp-linkaccount-description": "Vincular una cuenta de un proveedor de terceros para el usuario actual.",
+ "apihelp-linkaccount-example-link": "Iniciar el proceso de vincular a una cuenta de <kbd>Ejemplo</kbd>.",
+ "apihelp-login-description": "Iniciar sesión y obtener las cookies de autenticación.\n\nEsta acción solo se debe utilizar en combinación con [[Special:BotPasswords]]; para la cuenta de inicio de sesión no se utiliza y puede fallar sin previo aviso. Para iniciar la sesión de forma segura a la cuenta principal, utilice <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+ "apihelp-login-description-nobotpasswords": "Iniciar sesión y obtener las cookies de autenticación.\n\nEsta acción esta obsoleta y puede fallar sin previo aviso. Para conectarse de forma segura, utilice <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+ "apihelp-login-description-nonauthmanager": "Iniciar sesión y obtener cookies de autenticación.\n\nSi inicias sesión sin problemas, las cookies necesarias se incluirán en los encabezados de respuesta HTTP. Si se produce algún error al iniciar sesión y este persiste, se puede regular para evitar los ataques masivos automatizados de adivinar contraseñas.",
"apihelp-login-param-name": "Nombre de usuario.",
"apihelp-login-param-password": "Contraseña.",
"apihelp-login-param-domain": "Dominio (opcional).",
"apihelp-managetags-param-operation": "Qué operación realizar:\n;create: Crear una nueva etiqueta de cambio de uso manual.\n;delete: Eliminar una etiqueta de cambio de la base de datos, eliminando la etiqueta de todas las revisiones, cambios en entradas recientes y registros en los que se ha utilizado.\n;activate: Activar una etiqueta de cambio, permitiendo a los usuarios aplicarla manualmente.\n;deactivate: Desactivar una etiqueta de cambio, evitando que los usuarios la apliquen manualmente.",
"apihelp-managetags-param-tag": "Etiqueta para crear, eliminar, activar o desactivar. Para crear una etiqueta, esta debe no existir. Para eliminarla, debe existir. Para activarla, debe existir y no estar en uso por ninguna extensión. Para desactivarla, debe estar activada y definida manualmente.",
"apihelp-managetags-param-reason": "Un motivo opcional para crear, eliminar, activar o desactivar la etiqueta.",
+ "apihelp-managetags-param-ignorewarnings": "Ya sea para ignorar las advertencias que se emiten durante la operación.",
"apihelp-managetags-example-create": "Crear una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
"apihelp-managetags-example-delete": "Eliminar la etiqueta <kbd>vandlaism</kbd> con el motivo <kbd>Misspelt</kbd>",
"apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
"apihelp-managetags-example-deactivate": "Desactivar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>No longer required</kbd>",
"apihelp-mergehistory-description": "Fusionar historiales de páginas.",
+ "apihelp-mergehistory-param-from": "El título de la página desde la que se combinará la historia. No se puede utilizar junto con <var>$1fromid</var>.",
+ "apihelp-mergehistory-param-fromid": "Page ID de la página desde la que se combinara el historial. No se puede utilizar junto con <var>$1from</var>.",
+ "apihelp-mergehistory-param-to": "El título de la página desde la que se combinara el historial. No se puede utilizar junto con <var>$1toid</var>.",
+ "apihelp-mergehistory-param-toid": "Page ID de la página desde la que se combinara el historial. No se puede utilizar junto con <var>$1to</var>.",
+ "apihelp-mergehistory-param-timestamp": "La marca de tiempo de las revisiones se moverá del historial de la página de origen al historial de la página de destino. Si se omite, todo el historial de la página de la página de origen se fusionará en la página de destino.",
"apihelp-mergehistory-param-reason": "Motivo para la fusión del historial.",
+ "apihelp-mergehistory-example-merge": "Combinar todo el historial de <kbd>Oldpage</kbd> en <kbd>Newpage</kbd>.",
+ "apihelp-mergehistory-example-merge-timestamp": "Combinar las revisiones de <kbd>Oldpage</kbd> hasta el <kbd>2015-12-31T04:37:41Z</kbd> en <kbd>Newpage</kbd>.",
"apihelp-move-description": "Trasladar una página.",
"apihelp-move-param-from": "Título de la página a renombrar. No se puede utilizar con <var>$1fromid</var>.",
"apihelp-move-param-fromid": "ID de la página a renombrar. No se puede utilizar con <var>$1from</var>.",
"apihelp-move-param-noredirect": "No crear una redirección.",
"apihelp-move-param-watch": "Añadir la página y su redirección a la lista de seguimiento del usuario actual.",
"apihelp-move-param-unwatch": "Eliminar la página y la redirección de la lista de seguimiento del usuario.",
+ "apihelp-move-param-watchlist": "Incondicionalmente puede añadir o eliminar la página de lista del usuario actual, utilizar referencias o no cambiar el reloj.",
"apihelp-move-param-ignorewarnings": "Ignorar cualquier aviso.",
"apihelp-move-example-move": "Trasladar <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sin dejar una redirección.",
"apihelp-opensearch-description": "Buscar en el wiki mediante el protocolo OpenSearch.",
"apihelp-paraminfo-param-modules": "Lista de los nombres de los módulos (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se pueden especificar los submódulos con un <kbd>+</kbd>.",
"apihelp-paraminfo-param-helpformat": "Formato de las cadenas de ayuda.",
"apihelp-paraminfo-param-querymodules": "Lista de los nombres de los módulos de consulta (valor de los parámetros <var>prop</var>, <var>meta</var> or <var>list</var>). Utiliza <kbd>$1modules=query+foo</kbd> en vez de <kbd>$1querymodules=foo</kbd>.",
+ "apihelp-paraminfo-param-mainmodule": "Obtener también información sobre el módulo principal (primer nivel). Utilizar <kbd>$1modules=main</kbd> en su lugar.",
+ "apihelp-paraminfo-param-pagesetmodule": "Obtener también información sobre el módulo PageSet (Proporcionar títulos= y amigos).",
"apihelp-paraminfo-param-formatmodules": "Lista de los nombres del formato de los módulos (valor del parámetro <var>format</var>). Utiliza <var>$1modules</var> en su lugar.",
"apihelp-paraminfo-example-1": "Mostrar información para <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> y <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
"apihelp-parse-param-title": "Título de la página a la que pertenece el texto. Si se omite se debe especificar <var>$1contentmodel</var> y se debe utilizar el [[API]] como título.",
"apihelp-parse-paramvalue-prop-properties": "Da varias propiedades definidas en el wikitexto analizado.",
"apihelp-parse-paramvalue-prop-limitreportdata": "Da el informe del límite de forma estructurada. No da datos si <var>$1disablelimitreport</var> está establecido.",
"apihelp-parse-paramvalue-prop-limitreporthtml": "Da la versión HTML del informe del límite. No da datos si <var>$1disablelimitreport</var> está establecido.",
+ "apihelp-parse-paramvalue-prop-parsetree": "El árbol de análisis sintáctico XML del contenido de la revisión (requiere modelo de contenido <code>$1</code>)",
+ "apihelp-parse-param-pst": "Guardar previamente los cambios antes de transformar la entrada antes de analizarla. Sólo es válido cuando se utiliza con el texto.",
+ "apihelp-parse-param-onlypst": "Guardar previamente los cambios antes de transformar (PST) en la entrada. Devuelve el mismo wikitexto, después de que un PST se ha aplicado. Sólo es válido cuando se utiliza con <var>$1text</var>.",
"apihelp-parse-param-effectivelanglinks": "Incluye enlaces de idiomas proporcionados por las extensiones (para utilizar con <kbd>$1prop=langlinks</kbd>).",
+ "apihelp-parse-param-disablelimitreport": "Omitir el informe de límite (\"NewPP limit report\") desde la salida del analizador.",
"apihelp-parse-param-disablepp": "Usa <var>$1disablelimitreport</var> en su lugar.",
"apihelp-parse-param-disableeditsection": "Omitir los enlaces de edición de sección de la salida del analizador.",
+ "apihelp-parse-param-disabletidy": "No ejecute la limpieza HTML (por ejemplo ordenada) en la salida del analizador.",
+ "apihelp-parse-param-generatexml": "Generar árbol de análisis sintáctico XML (requiere modelo de contenido <code>$1</code>; sustituido por <kbd>$2prop=parsetree</kbd>).",
"apihelp-parse-param-preview": "Analizar en modo de vista previa.",
"apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (también activa el modo de vista previa).",
"apihelp-parse-param-disabletoc": "Omitir la tabla de contenidos en la salida.",
+ "apihelp-parse-param-contentformat": "Formato de serialización de contenido utilizado para la introducción de texto. Sólo es válido cuando se utiliza con $1text.",
"apihelp-parse-example-page": "Analizar una página.",
"apihelp-parse-example-text": "Analizar wikitexto.",
"apihelp-parse-example-texttitle": "Analizar wikitexto, especificando el título de la página.",
"apihelp-protect-param-pageid": "ID de la página a (des)proteger. No se puede utilizar con $1title.",
"apihelp-protect-param-protections": "Lista de los niveles de protección, con formato <kbd>action=level</kbd> (por ejemplo: <kbd>edit=sysop</kbd>).\n\n<strong>Nota:</strong> Cualquier acción no mencionada tendrá las restricciones eliminadas.",
"apihelp-protect-param-reason": "Motivo de la (des)protección.",
+ "apihelp-protect-param-tags": "Cambiar las etiquetas para aplicar a la entrada en el registro de protección.",
"apihelp-protect-param-cascade": "Activar la protección en cascada (o sea, proteger plantillas e imágenes transcluidas usadas en esta página). Se ignorará si ninguno de los niveles de protección dados son compatibles con la función de cascada.",
"apihelp-protect-example-protect": "Proteger una página",
"apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>all</kbd>.",
"apihelp-query+allfileusages-example-generator": "Recupera las páginas que contienen los archivos.",
"apihelp-query+allimages-description": "Enumerar todas las imágenes secuencialmente.",
"apihelp-query+allimages-param-sort": "Propiedad por la que realizar la ordenación.",
+ "apihelp-query+allimages-param-dir": "La dirección en la que se listará.",
"apihelp-query+allimages-param-from": "El título de la imagen para comenzar la enumeración. Solo puede utilizarse con $1sort=name.",
"apihelp-query+allimages-param-to": "El título de la imagen para detener la enumeración. Solo puede utilizarse con $1sort=name.",
"apihelp-query+allimages-param-start": "El sello de tiempo para comenzar la enumeración. Solo puede utilizarse con $1sort=timestamp.",
"apihelp-query+alllinks-paramvalue-prop-title": "Añade el título del enlace.",
"apihelp-query+alllinks-param-namespace": "El espacio de nombres que enumerar.",
"apihelp-query+alllinks-param-limit": "Cuántos elementos en total se devolverán.",
+ "apihelp-query+alllinks-param-dir": "La dirección en la que se listará.",
+ "apihelp-query+alllinks-example-unique": "Lista de títulos vinculados únicamente.",
"apihelp-query+alllinks-example-unique-generator": "Obtiene todos los títulos enlazados, marcando los que falten.",
+ "apihelp-query+alllinks-example-generator": "Obtiene páginas que contienen los enlaces.",
+ "apihelp-query+allmessages-description": "Devolver los mensajes de este sitio.",
"apihelp-query+allmessages-param-prop": "Qué propiedades se obtendrán.",
+ "apihelp-query+allmessages-param-nocontent": "Si se establece, no incluya el contenido de los mensajes en la salida.",
+ "apihelp-query+allmessages-param-args": "Los argumentos que se sustituyen en el mensaje.",
"apihelp-query+allmessages-param-filter": "Devolver solo mensajes con nombres que contengan esta cadena.",
"apihelp-query+allmessages-param-customised": "Devolver solo mensajes en este estado de personalización.",
"apihelp-query+allmessages-param-lang": "Devolver mensajes en este idioma.",
"apihelp-query+allpages-param-maxsize": "Limitar a páginas con este número máximo de bytes.",
"apihelp-query+allpages-param-prtype": "Limitar a páginas protegidas.",
"apihelp-query+allpages-param-limit": "Cuántas páginas en total se devolverán.",
+ "apihelp-query+allpages-param-dir": "La dirección en la que se listará.",
+ "apihelp-query+allpages-param-filterlanglinks": "Filtrar en función de si una página tiene langlinks. Tenga en cuenta que esto no puede considerar langlinks agregados por extensiones.",
"apihelp-query+allpages-example-B": "Mostrar una lista de páginas que empiecen con la letra <kbd>B</kbd>.",
"apihelp-query+allpages-example-generator": "Mostrar información acerca de 4 páginas que empiecen por la letra <kbd>T</kbd>.",
"apihelp-query+allpages-example-generator-revisions": "Mostrar el contenido de las 2 primeras páginas que no redirijan y empiecen por <kbd>Re</kbd>.",
"apihelp-query+allredirects-description": "Obtener la lista de todas las redirecciones a un espacio de nombres.",
+ "apihelp-query+allredirects-param-from": "El título de la redirección para iniciar la enumeración.",
+ "apihelp-query+allredirects-param-to": "El título de la redirección para detener la enumeración.",
"apihelp-query+allredirects-param-prefix": "Buscar todas las páginas de destino que empiecen con este valor.",
"apihelp-query+allredirects-param-prop": "Qué piezas de información incluir:",
"apihelp-query+allredirects-paramvalue-prop-title": "Añade el título de la redirección.",
+ "apihelp-query+allredirects-param-namespace": "El espacio de nombres a enumerar.",
"apihelp-query+allredirects-param-limit": "Cuántos elementos se devolverán.",
+ "apihelp-query+allredirects-param-dir": "La dirección en la que se listará.",
+ "apihelp-query+allredirects-example-unique": "La lista de páginas de destino.",
+ "apihelp-query+allredirects-example-unique-generator": "Obtiene todas las páginas de destino, marcando los que faltan.",
+ "apihelp-query+allredirects-example-generator": "Obtiene páginas que contienen las redirecciones.",
"apihelp-query+allrevisions-description": "Listar todas las revisiones.",
+ "apihelp-query+allrevisions-param-start": "La marca de tiempo para iniciar la enumeración.",
+ "apihelp-query+allrevisions-param-end": "La marca de tiempo para detener la enumeración.",
"apihelp-query+allrevisions-param-user": "Listar solo las revisiones de este usuario.",
"apihelp-query+allrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
"apihelp-query+allrevisions-param-namespace": "Listar solo las páginas en este espacio de nombres.",
"apihelp-query+allrevisions-example-user": "Listar las últimas 50 contribuciones del usuario <kbd>Example</kbd>.",
"apihelp-query+allrevisions-example-ns-main": "Listar las primeras 50 revisiones en el espacio de nombres principal.",
+ "apihelp-query+mystashedfiles-description": "Obtener una lista de archivos en la corriente de carga de usuarios.",
+ "apihelp-query+mystashedfiles-param-prop": "Propiedades a buscar para los archivos.",
+ "apihelp-query+mystashedfiles-paramvalue-prop-size": "Buscar el tamaño del archivo y las dimensiones de la imagen.",
"apihelp-query+mystashedfiles-param-limit": "Cuántos archivos obtener.",
"apihelp-query+alltransclusions-param-from": "El título de la transclusión por la que empezar la enumeración.",
"apihelp-query+alltransclusions-param-to": "El título de la transclusión por la que terminar la enumeración.",
"apihelp-query+allpages-param-minsize": "محدودکردن به صفحههایی که همراه دست کم این تعداد بایت است.",
"apihelp-query+allpages-param-limit": "میزان کل صفحهها برای بازگرداندن.",
"apihelp-query+allredirects-param-limit": "تعداد آیتمها برای بازگرداندن.",
+ "apihelp-query+allrevisions-description": "فهرست همه نسخهها",
+ "apihelp-query+mystashedfiles-param-limit": "تعداد پروندههایی که باید بگیرد.",
+ "apihelp-query+allusers-param-dir": "جهتی که باید مرتب شود.",
+ "apihelp-query+allusers-paramvalue-prop-rights": "فهرست دسترسیهایی که کاربر دارد.",
"apihelp-query+allusers-paramvalue-prop-editcount": "شمار ويرایش کاربر را میافزايد",
"apihelp-query+allusers-paramvalue-prop-registration": "زمان ثبت نام کاربر را در صورت وجود میافزايد (ممکن است خالی باشد)",
"apihelp-query+allusers-param-limit": "تعداد کل نامهای کاربری برای بازگرداندن.",
"apihelp-query+categories-param-limit": "چه میزان رده بازگردانده شود.",
"apihelp-query+categories-param-categories": "فقط این ردهها فهرست شود. کاربردی برای بررسی وجود یک صفحهٔ مشخص در یک ردهٔ مشخص.",
"apihelp-query+categorymembers-description": "فهرستکردن همهٔ صفحهها در یک ردهٔ مشخصشده.",
+ "apihelp-query+categorymembers-paramvalue-prop-ids": "افزودن شناسه صفحه",
"apihelp-query+categorymembers-param-sort": "خصوصیت برای مرتبسازی",
"apihelp-query+categorymembers-param-dir": "جهت مرتب شدن",
"apihelp-query+categorymembers-param-startsortkey": "جایش از $1starthexsortkey استفاده کنید.",
+ "apihelp-query+deletedrevs-param-from": "شروع فهرست کردن مواردی که این عنوان را دارند.",
+ "apihelp-query+deletedrevs-param-to": "خاتمه فهرست کردن مواردی که این عنوان را دارند.",
"apihelp-query+deletedrevs-param-namespace": "فقط صفحات ین فضای نام را فهرست کن.",
"apihelp-query+deletedrevs-param-limit": "حداکثر تعداد بازنگریهايي که فهرست شوند.",
+ "apihelp-query+fileusage-paramvalue-prop-title": "عنوان هر صفحه.",
+ "apihelp-query+fileusage-param-limit": "تعدادی که باید بازگردانده شود.",
+ "apihelp-query+imageinfo-paramvalue-prop-dimensions": "نام مستعار برای size",
+ "apihelp-query+imageinfo-paramvalue-prop-sha1": "افزودن SHA-1 hash برای پرونده",
+ "apihelp-query+imageinfo-paramvalue-prop-mime": "افزودن نوع MIME برای پرونده",
"apihelp-query+imageinfo-param-end": "زمان توقف فهرست کردن.",
"apihelp-query+imageinfo-param-urlheight": "مشابه $1urlwidth.",
+ "apihelp-query+images-param-limit": "تعداد پروندههایی که باید بازگرداند.",
"apihelp-query+info-description": "دریافت اطلاعات سادهٔ صفحه.",
"apihelp-query+iwbacklinks-param-prefix": "پیشوند میانویکی.",
"apihelp-query+iwbacklinks-param-title": "پیوند میانویکی برای جستجو. باید همراه <var>$1blprefix</var> استفاده شود.",
"apihelp-query+iwbacklinks-param-limit": "تعداد صفحهها برای بازگرداندن.",
+ "apihelp-query+iwbacklinks-param-prop": "خصوصیتی که باید گرفته شود.",
+ "apihelp-query+iwlinks-paramvalue-prop-url": "افزودن نشانی اینترنتی کامل.",
+ "apihelp-query+langbacklinks-param-prop": "خصوصیتی که باید گرفته شود:",
+ "apihelp-query+langlinks-paramvalue-prop-url": "افزودن نشانی اینترنتی کامل.",
+ "apihelp-query+links-param-limit": "تعداد پیوندهایی که باید بازگرداند.",
+ "apihelp-query+linkshere-param-prop": "خصوصیتی که باید گرفته شود:",
+ "apihelp-query+linkshere-paramvalue-prop-pageid": "شناسه صفحه هر صفحه.",
+ "apihelp-query+linkshere-paramvalue-prop-title": "عنوان هر صفحه.",
+ "apihelp-query+linkshere-paramvalue-prop-redirect": "اگر صفحه تغییر مسیر بود برچسب بزن.",
+ "apihelp-query+linkshere-param-namespace": "فقط صفحات این فضای نام را فهرست کن.",
"apihelp-query+linkshere-param-limit": "تعداد برای بازگرداندن.",
"apihelp-query+logevents-description": "دریافت رویدادها از سیاههها.",
+ "apihelp-query+logevents-param-prop": "خصوصیتی که باید گرفته شود.",
+ "apihelp-query+logevents-paramvalue-prop-ids": "افزودن شناسه سیاهه رویداد.",
+ "apihelp-query+pageswithprop-paramvalue-prop-ids": "افزودن شناسه صفحه",
+ "apihelp-query+pageswithprop-param-dir": "جهت مرتب شدن",
"apihelp-query+prefixsearch-param-search": "جستجوی رشته",
"apihelp-query+prefixsearch-param-namespace": "فضاهای نامی برای جستجو",
"apihelp-query+prefixsearch-param-limit": "حداکثر تعداد نتایج برای بازگرداندن.",
"apihelp-query+random-example-generator": "بازگرداندن اطلاعات صفحه دربارهٔ دو صفحهٔ تصادفی از فضای نام اصلی",
"apihelp-query+recentchanges-param-start": "برچسب زمانی برای آغاز شمارش از.",
"apihelp-query+recentchanges-param-end": "برچسب زمانی برای پایان شمارش.",
+ "apihelp-query+recentchanges-paramvalue-prop-flags": "افزودن برچسب برای ویرایش.",
+ "apihelp-query+recentchanges-paramvalue-prop-timestamp": "افزودن زمان ویرایش.",
+ "apihelp-query+redirects-paramvalue-prop-title": "عنوان هر تغییرمسیر.",
"apihelp-query+redirects-param-limit": "تعداد تغییرمسیرها برای بازگرداندن.",
+ "apihelp-query+revisions+base-paramvalue-prop-content": "متن نسخه ویرایش.",
+ "apihelp-query+revisions+base-paramvalue-prop-tags": "برچسب برای نسخههای ویرایش.",
+ "apihelp-query+siteinfo-param-prop": "اطلاعاتی که باید گرفتهشود:",
+ "apihelp-query+siteinfo-paramvalue-prop-statistics": "بازرگرداندن آمار سایت.",
+ "apihelp-query+siteinfo-example-simple": "دریافت اطلاعات سایت.",
+ "apihelp-query+tags-description": "فهرست تغییرات برچسبها.",
+ "apihelp-query+tags-param-limit": "حداکثر تعداد برچسبها برای فهرست شدن.",
+ "apihelp-query+tags-param-prop": "خصوصیتی که باید گرفته شود:",
+ "apihelp-query+tags-paramvalue-prop-name": "افزودن نام برچسب.",
+ "apihelp-query+transcludedin-paramvalue-prop-title": "عنوان هر صفحه.",
+ "apihelp-query+watchlist-paramvalue-type-log": "مدخلهای سیاهه.",
+ "apihelp-stashedit-param-text": "محتوای صفحه.",
+ "apihelp-stashedit-param-contentmodel": "مدل محتوایی محتوای جدید",
+ "apihelp-stashedit-param-summary": "خلاصه تغییرات.",
+ "apihelp-tag-param-reason": "دلیل تغییر.",
+ "apihelp-unblock-description": "بازکردن کاربر.",
+ "apihelp-undelete-param-reason": "دلیل احیا.",
+ "apihelp-upload-param-filename": "نام پرونده مقصد.",
"apihelp-upload-param-ignorewarnings": "چشمپوشی از همهٔ هشدارها.",
+ "apihelp-upload-param-file": "محتوی پرونده.",
+ "apihelp-upload-param-url": "نشانی اینترنتی برای دریافت فایل.",
"apihelp-userrights-param-user": "نام کاربری.",
+ "apihelp-userrights-param-userid": "شناسه کاربر.",
+ "apihelp-userrights-param-reason": "دلیل تغییر.",
+ "apihelp-none-description": "بیرونریزی هیچ.",
+ "api-format-title": "نتیجه ایپیآی مدیاویکی",
+ "api-help-main-header": "پودمان اصلی",
+ "api-help-source": "منبع: $1",
"api-help-param-deprecated": "توصیه.",
"api-help-param-limit": "بيش از $1 مجاز نيست",
"api-help-param-limit2": "بيش از $1 (برای رباتها $2) مجاز نيست",
+ "api-help-param-default": "پیشفرض: $1",
"api-credits-header": "اعتبار"
}
"apihelp-parse-paramvalue-prop-sections": "Fournit les sections dans le wikitexte analysé.",
"apihelp-parse-paramvalue-prop-revid": "Ajoute l’ID de révision de la page analysée.",
"apihelp-parse-paramvalue-prop-displaytitle": "Ajoute le titre du wikitexte analysé.",
- "apihelp-parse-paramvalue-prop-headitems": "Fournit les éléments à mettre dans le <code><head></code> de la page.",
+ "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Obsolète.</span> Fournit les éléments à mettre dans le <code><head></code> de la page.",
"apihelp-parse-paramvalue-prop-headhtml": "Fournit le <code><head></code> analysé de la page.",
- "apihelp-parse-paramvalue-prop-modules": "Fournit les modules ResourceLoader utilisés sur la page. Soit <kbd>jsconfigvars</kbd> soit <kbd>encodedjsconfigvars</kbd> doit être demandé avec <kbd>modules</kbd>.",
- "apihelp-parse-paramvalue-prop-jsconfigvars": "Fournit les variables de configuration JavaScript spécifiques à la page.",
+ "apihelp-parse-paramvalue-prop-modules": "Fournit les modules ResourceLoader utilisés sur la page. Pour les charger, utiliser <code>mw.loader.using()</code>. Soit <kbd>jsconfigvars</kbd> soit <kbd>encodedjsconfigvars</kbd> doit être demandé avec <kbd>modules</kbd>.",
+ "apihelp-parse-paramvalue-prop-jsconfigvars": "Fournit les variables de configuration JavaScript spécifiques à la page. Pour les appliquer, utiliser <code>mw.config.set()</code>.",
"apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Fournit les variables de configuration JavaScript spécifiques à la page comme chaîne JSON.",
"apihelp-parse-paramvalue-prop-indicators": "Fournit le HTML des indicateurs d’état de page utilisés sur la page.",
"apihelp-parse-paramvalue-prop-iwlinks": "Fournit les liens interwikis dans le wikitexte analysé.",
"apihelp-protect-description": "Modifier le niveau de protection d’une page.",
"apihelp-protect-param-title": "Titre de la page à (dé)protéger. Impossible à utiliser avec $1pageid.",
"apihelp-protect-param-pageid": "ID de la page à (dé)protéger. Impossible à utiliser avec $1title.",
- "apihelp-protect-param-protections": "Liste des niveaux de protection, au format <kbd>action=niveau</kbd> (par ex. <kbd>edit=sysop</kbd>).\n\n<strong>NOTE :<strong> Toutes les actions non listées auront leur restrictions supprimées.",
+ "apihelp-protect-param-protections": "Liste des niveaux de protection, au format <kbd>action=niveau</kbd> (par exemple <kbd>edit=sysop</kbd>). Un niveau de <kbd>tout</kbd>, indique que tout le monde est autorisé à faire l'action, c'est à dire aucune restriction.\n\n<strong>NOTE :<strong> Toutes les actions non listées auront leur restrictions supprimées.",
"apihelp-protect-param-expiry": "Horodatages d’expiration. Si un seul horodatage est fourni, il sera utilisé pour toutes les protections. Utiliser <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> ou <kbd>never</kbd> pour une protection sans expiration.",
"apihelp-protect-param-reason": "Motif de (dé)protection.",
"apihelp-protect-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de protection.",
"apihelp-protect-param-watch": "Si activé, ajouter la page (dé)protégée à la liste de suivi de l'utilisateur actuel.",
"apihelp-protect-param-watchlist": "Ajouter ou supprimer sans condition la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne pas modifier le suivi.",
"apihelp-protect-example-protect": "Protéger une page",
- "apihelp-protect-example-unprotect": "Enlever la protection d’une page en mettant les restrictions à <kbd>all</kbd>.",
+ "apihelp-protect-example-unprotect": "Enlever la protection d’une page en mettant les restrictions à <kbd>all</kbd> (c'est à dire tout le monde est autorisé à faire l'action).",
"apihelp-protect-example-unprotect2": "Enlever la protection de la page en ne mettant aucune restriction",
"apihelp-purge-description": "Vider le cache des titres fournis.\n\nNécessite une requête POST si l’utilisateur n’est pas connecté.",
"apihelp-purge-param-forcelinkupdate": "Mettre à jour les tables de liens.",
"api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Doit être vide|Peut être vide, ou $2}}",
"api-help-param-limit": "Pas plus de $1 autorisé.",
"api-help-param-limit2": "Pas plus de $1 autorisé ($2 pour les robots).",
- "api-help-param-integer-min": "{{PLURAL:$1|1=La valeur doit être inférieure|2=Les valeurs doivent être inférieures}} à $2.",
+ "api-help-param-integer-min": "{{PLURAL:$1|1=La valeur ne doit pas être inférieure|2=Les valeurs ne doivent pas être inférieures}} à $2.",
"api-help-param-integer-max": "{{PLURAL:$1|1=La valeur ne doit pas être supérieure|2=Les valeurs ne doivent pas être supérieures}} à $3.",
"api-help-param-integer-minmax": "{{PLURAL:$1|1=La valeur doit|2=Les valeurs doivent}} être entre $2 et $3.",
"api-help-param-upload": "Doit être envoyé comme un fichier importé utilisant multipart/form-data.",
"apihelp-createaccount-example-pass": "Crear usuario <kbd>testuser</kbd> con contrasinal <kbd>test123</kbd>.",
"apihelp-createaccount-example-mail": "Crear usuario <kbd>testmailuser</kbd>\"testmailuser\" e enviar por correo electrónico un contrasinal xenerado de forma aleatoria.",
"apihelp-cspreport-description": "Usado polos navegadores para informar de violacións da política de confidencialidade de contido. Este módulo non debe se usado nunca, excepto cando é usado automaticamente por un navegador web compatible con CSP.",
+ "apihelp-cspreport-param-reportonly": "Marcar un informe dunha política de vixiancia e non unha política esixida",
"apihelp-cspreport-param-source": "Que xerou a cabeceira CSP que lanzou este informe",
"apihelp-delete-description": "Borrar a páxina.",
"apihelp-delete-param-title": "Título da páxina a eliminar. Non pode usarse xunto con <var>$1pageid</var>.",
"apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] ó espazo de nomes 100 con todo o historial.",
"apihelp-linkaccount-description": "Vincular unha conta dun provedor externo ó usuario actual.",
"apihelp-linkaccount-example-link": "Comezar o proceso de vincular a unha conta de <kbd>Exemplo</kbd>.",
- "apihelp-login-description": "No caso dunha conexión correcta, as cookies necesarias incluiranse nas cabeceiras HTTP de resposta. No caso dunha conexión fallida, os intentos posteriores poden ser reducidos para limitar ataques automaticos de roubo de contrasinais.",
+ "apihelp-login-description": "Iniciar sesión e obter as cookies de autenticación.\n\nEsta acción só debe utilizarse en combinación con [[Special:BotPasswords]]; para a cuenta de inicio de sesión non se utiliza e pode fallar sen previo aviso. Para iniciar a sesión de forma segura na conta principal, utilice <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
"apihelp-login-description-nobotpasswords": "Conectarse e obter as cookies de autenticación. \n\nEsta acción está obsoleta e pode fallar sen avisar. Para conectarse sen problema use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
- "apihelp-login-description-nonauthmanager": "Conectarse e obter as cookies de autenticación. \n\nNo caso dunha conexión correcta, as cookies necesarias incluiranse nas cabeceiras HTTP de resposta. No caso dunha conexión fallida, os intentos posteriores poden ser reducidos para limitar ataques automaticos de roubo de contrasinais.",
"apihelp-login-param-name": "Nome de usuario.",
"apihelp-login-param-password": "Contrasinal",
"apihelp-login-param-domain": "Dominio (opcional).",
"apihelp-parse-paramvalue-prop-sections": "Devolve as seccións do texto wiki analizado.",
"apihelp-parse-paramvalue-prop-revid": "Engade o identificador de edición do texto wiki analizado.",
"apihelp-parse-paramvalue-prop-displaytitle": "Engade o título do texto wiki analizado.",
- "apihelp-parse-paramvalue-prop-headitems": "Devolve os elementos a poñer na <code><cabeceira></code> da páxina.",
+ "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Obsoleto.</span> Devolve os elementos a poñer na <code><cabeceira></code> da páxina.",
"apihelp-parse-paramvalue-prop-headhtml": "Devolve <code><cabeceira></code> analizada da páxina.",
- "apihelp-parse-paramvalue-prop-modules": "Devolve os módulos ResourceLoader usados na páxina. <kbd>jsconfigvars</kbd> ou <kbd>encodedjsconfigvars</kbd> deben ser solicitados xunto con <kbd>modules</kbd>.",
- "apihelp-parse-paramvalue-prop-jsconfigvars": "Devolve as variables específicas de configuración JavaScript da páxina.",
+ "apihelp-parse-paramvalue-prop-modules": "Devolve os módulos ResourceLoader usados na páxina. Para cargar, use <code>mw.loader.using()</code>. <kbd>jsconfigvars</kbd> ou <kbd>encodedjsconfigvars</kbd> deben ser solicitados xunto con <kbd>modules</kbd>.",
+ "apihelp-parse-paramvalue-prop-jsconfigvars": "Devolve as variables específicas de configuración JavaScript da páxina. Para aplicalo, use <code>mw.config.set()</code>.",
"apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Devolve as variables específicas de configuración JavaScript da páxina como unha cadea de texto JSON.",
"apihelp-parse-paramvalue-prop-indicators": "Devolve o HTML dos indicadores de estado de páxina usados na páxina.",
"apihelp-parse-paramvalue-prop-iwlinks": "Devolve as ligazóns interwiki do texto wiki analizado.",
"apihelp-protect-description": "Cambiar o nivel de protección dunha páxina.",
"apihelp-protect-param-title": "Título da páxina que quere (des)protexer. Non pode usarse xunto con $1pageid.",
"apihelp-protect-param-pageid": "Identificador da páxina que quere (des)protexer. Non pode usarse xunto con $1title.",
- "apihelp-protect-param-protections": "Lista dos niveis de protección, con formato <kbd>action=level</kbd> (p.ex. <kbd>edit=sysop</kbd>).\n\n<strong>Nota:</strong> Todas as accións que non estean listadas terán restriccións para ser eliminadas.",
+ "apihelp-protect-param-protections": "Lista dos niveis de protección, con formato <kbd>action=level</kbd> (p.ex. <kbd>edit=sysop</kbd>). Un nivel de <kbd>all</kbd> quere dicir que todo o mundo ten permiso para realizar a acción, sen restricións.\n\n<strong>Nota:</strong> Todas as accións que non estean listadas terán restriccións para ser eliminadas.",
"apihelp-protect-param-expiry": "Selos de tempo de caducidade. Se só se indica un selo de tempo, usarase para todas as proteccións. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, ou <kbd>never</kbd>, para unha protección sen caducidade.",
"apihelp-protect-param-reason": "Razón para (des)protexer.",
"apihelp-protect-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de protección.",
"apihelp-protect-param-watch": "Se se define este parámetro, engadir a páxina que se (des)protexe á lista de vixilancia do usuario actual.",
"apihelp-protect-param-watchlist": "Engadir ou eliminar sen condicións a páxina da lista de vixiancia do usuario actual, use as preferencias ou non cambie a vixiancia.",
"apihelp-protect-example-protect": "Protexer unha páxina",
- "apihelp-protect-example-unprotect": "Desprotexer unha páxina poñendo as restricións a <kbd>all</kbd>.",
+ "apihelp-protect-example-unprotect": "Desprotexer unha páxina poñendo as restricións a <kbd>all</kbd>. (isto quere dicir que todo o mundo pode realizar a acción).",
"apihelp-protect-example-unprotect2": "Desprotexer unha páxina quitando as restricións.",
"apihelp-purge-description": "Borrar a caché para os títulos indicados.\n\nPrecisa dunha petición POST se o usuario non está conectado.",
"apihelp-purge-param-forcelinkupdate": "Actualizar as táboas de ligazóns.",
"apihelp-edit-param-section": "מספר הפסקה <kbd>0</kbd> לפסקה העליונה, <kbd>new</kbd> לפסקה חדשה.",
"apihelp-edit-param-sectiontitle": "הכותרת לפסקה החדשה.",
"apihelp-edit-param-text": "תוכן הדף.",
- "apihelp-edit-param-summary": "תקצ×\99ר ער×\99×\9b×\94. ×\92×\9d ×\92ותרת פסקה כש־$1section=new ו־$1sectiontitle אינו מוגדר.",
+ "apihelp-edit-param-summary": "תקצ×\99ר ער×\99×\9b×\94. ×\92×\9d ×\9bותרת פסקה כש־$1section=new ו־$1sectiontitle אינו מוגדר.",
"apihelp-edit-param-tags": "אילו תגי שינוי להחיל על הגרסה.",
"apihelp-edit-param-minor": "עריכה משנית.",
"apihelp-edit-param-notminor": "שינוי לא משני.",
"apihelp-parse-paramvalue-prop-sections": "מתן הפסקאות בקוד הוויקי המפוענח.",
"apihelp-parse-paramvalue-prop-revid": "הוספת מזהה הגרסה של הדף המפוענח.",
"apihelp-parse-paramvalue-prop-displaytitle": "הוספת הכותרת של קוד הוויקי המפוענח.",
- "apihelp-parse-paramvalue-prop-headitems": "נותן פריטים לשים ב־<code><head></code> של הדף.",
+ "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">לא בשימוש.</span> נותן פריטים לשים ב־<code><head></code> של הדף.",
"apihelp-parse-paramvalue-prop-headhtml": "נותן את ה־<code><head></code> המפוענח של הדף.",
- "apihelp-parse-paramvalue-prop-modules": "×\9eצ×\9f ×\99×\97×\99×\93×\95ת ResourceLoader ש×\9eש×\9eש×\95ת ×\91×\93×£. יש לבקש את <kbd>jsconfigvars</kbd> או את <kbd>encodedjsconfigvars</kbd> יחד עם <kbd>modules</kbd>.",
- "apihelp-parse-paramvalue-prop-jsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה.",
+ "apihelp-parse-paramvalue-prop-modules": "×\9eת×\9f ×\99×\97×\99×\93×\95ת ResourceLoader ש×\9eש×\9eש×\95ת ×\91×\93×£. ×\9b×\93×\99 ×\9c×\98×¢×\95×\9f, ×\99ש ×\9c×\94שת×\9eש ×\91<code dir=\"ltr\">mw.loader.using()</code>. יש לבקש את <kbd>jsconfigvars</kbd> או את <kbd>encodedjsconfigvars</kbd> יחד עם <kbd>modules</kbd>.",
+ "apihelp-parse-paramvalue-prop-jsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה. כדי להחיל, יש להשתמש ב<code dir=\"ltr\">mw.config.set()</code>.",
"apihelp-parse-paramvalue-prop-encodedjsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה בתור מחרוזת JSON.",
"apihelp-parse-paramvalue-prop-indicators": "נותן את ה־HTML של מחווני מצב דף שמשמשים בדף.",
"apihelp-parse-paramvalue-prop-iwlinks": "מתן קישורי בינוויקי בקוד הוויקי המפוענח.",
"apihelp-protect-description": "לשנות את רמת ההגנה של דף.",
"apihelp-protect-param-title": "כותרת הדף להגנה או הסרת הגנה. לא ניתן להשתמש בזה יחד עם $1pageid.",
"apihelp-protect-param-pageid": "מזהה הדף להגנה או הסרת הגנה. לא ניתן להשתמש בזה יחד עם $1title.",
- "apihelp-protect-param-protections": "רש×\99×\9eת ר×\9e×\95ת ×\94×\9b× ×\94, ×\91תס×\93×\99ר <kbd>action=level</kbd> (×\9c×\9eש×\9c <kbd>edit=sysop</kbd>).",
+ "apihelp-protect-param-protections": "רש×\99×\9eת ר×\9e×\95ת ×\94×\92× ×\94, ×\91תס×\93×\99ר <kbd>action=level</kbd> (×\9c×\9eש×\9c <kbd>edit=sysop</kbd>). ר×\9eת <kbd>all</kbd> פ×\99ר×\95ש×\94 ש×\9b×\95×\9c×\9d ×\9e×\95רש×\99×\9d ×\9c×\91צע ×\90ת ×\94פע×\95×\9c×\94, ×\9b×\9c×\95×\9eר ×\90×\99×\9f ×\94×\92× ×\94.\n\n<strong>×\94ער×\94:</strong> ×\94×\94×\92×\91×\9c×\95ת ×\99×\95סר×\95 ×\9e×\9b×\9c ×\94פע×\95×\9c×\95ת ש×\9c×\90 ×\9bת×\95×\91×\95ת ×\91רש×\99×\9e×\94.",
"apihelp-protect-param-expiry": "חותמי־זמן של תפוגה. אם הוגדר רק חותם־זמן אחד, הוא ישמש לכל ההגנות. יש להשתמש ב־<kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, או <kbd>never</kbd> להגנה שלא פגה לעולם.",
"apihelp-protect-param-reason": "סיבה להגנה או הסרת הגנה.",
"apihelp-protect-param-tags": "תגי שינוי שיחולו על העיול ביומן ההגנה.",
"apihelp-protect-param-watch": "אם זה מוגדר, הוספת הדף שהגנה נוספת אליו או מוסרת ממנו לרשימת המעקב של המשתמש הנוכחי.",
"apihelp-protect-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
"apihelp-protect-example-protect": "הגנה על דף.",
- "apihelp-protect-example-unprotect": "להסיר את ההגנה מהדף על־ידי הגדרת מגבלות על <kbd>all</kbd>.",
+ "apihelp-protect-example-unprotect": "להסיר את ההגנה מהדף על־ידי הגדרת מגבלות על <kbd>all</kbd> (למשל: כולם מורשים לבצע את הפעולה).",
"apihelp-protect-example-unprotect2": "הסרת הגנה מדף על־ידי הגדרה של אפס הגבלות.",
"apihelp-purge-description": "ניקוי המטמון לכותרות שניתנו.\n\nדורש בקשת POST אם המשתמש לא נכנס לחשבון.",
"apihelp-purge-param-forcelinkupdate": "עדכון טבלאות הקישורים.",
"apihelp-protect-param-pageid": "ID della pagina da (s)proteggere. Non può essere usato insieme con $1title.",
"apihelp-protect-param-tags": "Modifica etichette da applicare all'elemento del registro delle protezioni.",
"apihelp-protect-example-protect": "Proteggi una pagina.",
- "apihelp-protect-example-unprotect": "Sproteggi una pagina impostando restrizione su <kbd>all</kbd>.",
+ "apihelp-protect-example-unprotect": "Sproteggi una pagina impostando restrizione su <kbd>all</kbd> (cioè a tutti è consentito intraprendere l'azione).",
"apihelp-protect-example-unprotect2": "Sproteggi una pagina impostando nessuna restrizione.",
"apihelp-purge-param-forcelinkupdate": "Aggiorna la tabella dei collegamenti.",
"apihelp-purge-param-forcerecursivelinkupdate": "Aggiorna la tabella dei collegamenti per questa pagina, e per ogni pagina che usa questa pagina come template.",
"api-help-examples": "{{PLURAL:$1|Esempio|Esempi}}:",
"api-help-permissions": "{{PLURAL:$1|Permesso|Permessi}}:",
"api-help-open-in-apisandbox": "<small>[apri in una sandbox]</small>",
- "api-help-authmanager-general-usage": "La procedura generale per usare questo modulo é:\n# Ottenere i campi disponibili da <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$4</kbd>, e un token <kbd>$5</kbd> da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Mostra i campi all'utente e ottieni i dati che invia.\n# Esegui un post a questo modulo, fornendo <var>$1returnurl</var> e ogni campo rilevante.\n# Controlla <samp>status</samp> nella response.\n#* Se hai ricevuto <samp>PASS</samp> o <samp>FAIL</samp>, hai finito. L'operazione nel primo caso è andata a buon fine, nel secondo no.\n#* Se hai ricevuto <samp>UI</samp>, mostra i nuovi campi all'utente e ottieni i dati che invia. Esegui un post a questo modulo con <var>$1continue</var> e i campi rilevanti settati, quindi ripeti il punto 4.\n#* Se hai ricevuto <samp>REDIRECT</samp>, dirigi l'utente a <samp>redirecttarget</samp> e aspetta che ritorni a <var>$1returnurl</var>. A quel punto esegui un post a questo modulo con <var>$1continue</var> e ogni campo passato all'URL di ritorno, e ripeti il punto 4.\n#* Se hai ricevuto <samp>RESTART</samp>, vuol dire che l'autenticazione ha funzionato ma non abbiamo un account collegato. Potresti considerare questo caso come <samp>UI</samp> o come <samp>FAIL</samp>.",
+ "api-help-authmanager-general-usage": "La procedura generale per usare questo modulo è:\n# Ottenere i campi disponibili da <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$4</kbd>, e un token <kbd>$5</kbd> da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Mostra i campi all'utente e ottieni i dati che invia.\n# Esegui un post a questo modulo, fornendo <var>$1returnurl</var> e ogni campo rilevante.\n# Controlla <samp>status</samp> nella response.\n#* Se hai ricevuto <samp>PASS</samp> o <samp>FAIL</samp>, hai finito. L'operazione nel primo caso è andata a buon fine, nel secondo no.\n#* Se hai ricevuto <samp>UI</samp>, mostra i nuovi campi all'utente e ottieni i dati che invia. Esegui un post a questo modulo con <var>$1continue</var> e i campi rilevanti settati, quindi ripeti il punto 4.\n#* Se hai ricevuto <samp>REDIRECT</samp>, dirigi l'utente a <samp>redirecttarget</samp> e aspetta che ritorni a <var>$1returnurl</var>. A quel punto esegui un post a questo modulo con <var>$1continue</var> e ogni campo passato all'URL di ritorno, e ripeti il punto 4.\n#* Se hai ricevuto <samp>RESTART</samp>, vuol dire che l'autenticazione ha funzionato ma non abbiamo un account collegato. Potresti considerare questo caso come <samp>UI</samp> o come <samp>FAIL</samp>.",
"api-help-authmanagerhelper-messageformat": "Formato da utilizzare per per la restituzione dei messaggi.",
"api-help-authmanagerhelper-preservestate": "Conserva lo stato da un precedente tentativo di accesso non riuscito, se possibile.",
"api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
"apihelp-feedcontributions-param-deletedonly": "削除された投稿記録のみ表示します。",
"apihelp-feedcontributions-param-toponly": "最新版の編集のみ表示します。",
"apihelp-feedcontributions-param-newonly": "ページ作成を伴う編集のみを表示します。",
+ "apihelp-feedcontributions-param-hideminor": "細部の編集を非表示",
"apihelp-feedcontributions-param-showsizediff": "版間のサイズの増減を表示する。",
"apihelp-feedcontributions-example-simple": "利用者 <kbd>Example</kbd> の投稿記録を取得する。",
"apihelp-feedrecentchanges-description": "最近の更新フィードを返します。",
"apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd>에 대해 <kbd>First strike</kbd>라는 이유로 3일 간 차단하기",
"apihelp-block-example-user-complex": "사용자 <kbd>Vandal</kbd>을 <kbd>Vandalism</kbd>이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기",
"apihelp-changeauthenticationdata-description": "현재 사용자의 인증 데이터를 변경합니다.",
- "apihelp-changeauthenticationdata-example-password": "í\98\84ì\9e¬ ì\82¬ì\9a©ì\9e\90ì\9d\98 ë¹\84ë°\80ë²\88í\98¸ë¥¼ <kbd>ExamplePassword</kbd>ë¡\9c ë³\80ê²½í\95\98는 것을 시도합니다.",
+ "apihelp-changeauthenticationdata-example-password": "í\98\84ì\9e¬ ì\82¬ì\9a©ì\9e\90ì\9d\98 ë¹\84ë°\80ë²\88í\98¸ë¥¼ <kbd>ExamplePassword</kbd>ë¡\9c ë°\94꾸는 것을 시도합니다.",
"apihelp-checktoken-description": "<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>의 토큰의 유효성을 확인합니다.",
"apihelp-checktoken-param-type": "테스트되는 토큰의 종류.",
"apihelp-checktoken-param-token": "테스트할 토큰",
"apihelp-emailuser-param-subject": "제목 헤더.",
"apihelp-emailuser-param-text": "메일 본문.",
"apihelp-emailuser-param-ccme": "자신에게 메일의 복사본을 보냅니다.",
- "apihelp-emailuser-example-email": "<kbd>WikiSysop</kbd> 사용자에게 텍스트 <kbd>콘텐츠</kbd>로 이메일을 보냅니다.",
+ "apihelp-emailuser-example-email": "<kbd>WikiSysop</kbd> 사용자에게 텍스트 <kbd>Content</kbd>로 이메일을 보냅니다.",
"apihelp-expandtemplates-description": "모든 틀을 위키텍스트로 확장.",
"apihelp-expandtemplates-param-title": "문서 제목",
"apihelp-expandtemplates-param-text": "변환할 위키텍스트.",
"apihelp-paraminfo-description": "API 모듈의 정보를 가져옵니다.",
"apihelp-paraminfo-param-helpformat": "도움말 문자열 포맷.",
"apihelp-parse-param-summary": "구문 분석할 요약입니다.",
+ "apihelp-parse-paramvalue-prop-text": "위키텍스트의 구문 분석된 텍스트를 제공합니다.",
+ "apihelp-parse-paramvalue-prop-langlinks": "구문 분석된 위키텍스트의 언어 링크를 제공합니다.",
+ "apihelp-parse-paramvalue-prop-categories": "구문 분석된 위키텍스트의 분류를 제공합니다.",
"apihelp-parse-paramvalue-prop-categorieshtml": "분류의 HTML 버전을 제공합니다.",
"apihelp-parse-paramvalue-prop-links": "구문 분석된 위키텍스트의 내부 링크를 제공합니다.",
"apihelp-parse-paramvalue-prop-templates": "구문 분석된 위키텍스트의 틀을 제공합니다.",
"apihelp-parse-paramvalue-prop-sections": "구문 분석된 위키텍스트의 문단을 제공합니다.",
"apihelp-parse-paramvalue-prop-revid": "구문 분석된 페이지의 판 ID를 추가합니다.",
"apihelp-parse-paramvalue-prop-displaytitle": "구문 분석된 위키텍스트의 제목을 추가합니다.",
+ "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">사용되지 않습니다.</span> 문서의 <code><head></code> 안에 넣을 항목을 제공합니다.",
+ "apihelp-parse-paramvalue-prop-headhtml": "문서의 구문 분석된 <code><head></code>를 제공합니다.",
+ "apihelp-parse-paramvalue-prop-modules": "문서에 사용되는 ResourceLoader 모듈을 제공합니다. 불러오려면, <code>mw.loader.using()</code>을 사용하세요. <kbd>jsconfigvars</kbd> 또는 <kbd>encodedjsconfigvars</kbd>는 <kbd>modules</kbd>와 함께 요청해야 합니다.",
+ "apihelp-parse-paramvalue-prop-jsconfigvars": "문서에 특화된 자바스크립트 구성 변수를 제공합니다. 적용하려면 <code>mw.config.set()</code>을 사용하세요.",
"apihelp-parse-paramvalue-prop-iwlinks": "구문 분석된 위키텍스트의 인터위키 링크를 제공합니다.",
"apihelp-parse-paramvalue-prop-wikitext": "구문 분석된 위키텍스트 원문을 제공합니다.",
"apihelp-parse-paramvalue-prop-properties": "구문 분석된 위키텍스트에 정의된 다양한 속성을 제공합니다.",
"apihelp-query+blocks-param-ids": "나열할 차단 ID 목록 (선택 사항).",
"apihelp-query+blocks-param-users": "검색할 사용자 목록 (선택 사항).",
"apihelp-query+blocks-param-prop": "얻고자 하는 속성:",
+ "apihelp-query+blocks-paramvalue-prop-id": "블록의 ID를 추가합니다.",
"apihelp-query+blocks-paramvalue-prop-user": "차단된 사용자의 사용자 이름을 추가합니다.",
"apihelp-query+blocks-paramvalue-prop-userid": "차단된 사용자의 사용자 ID를 추가합니다.",
"apihelp-query+blocks-paramvalue-prop-by": "차단을 수행하는 사용자의 사용자 이름을 추가합니다.",
"api-help-license-noname": "라이선스: [[$1|링크 참조]]",
"api-help-license-unknown": "라이선스: <span class=\"apihelp-unknown\">알 수 없음</span>",
"api-help-parameters": "{{PLURAL:$1|변수}}:",
- "api-help-param-deprecated": "사용 중지됨.",
+ "api-help-param-deprecated": "사용되지 않습니다.",
"api-help-param-required": "이 변수는 필수 입력 사항입니다.",
"api-help-datatypes-header": "데이터 유형",
"api-help-datatypes": "API 요청 내 몇몇 매개변수형에 대해 더 자세히 설명해보겠습니다:\n;boolean\n:Boolean 매개변수들은 HTML 체크박스처럼 동작합니다: 만약 매개변수가 지정되었다면, 값에 상관없이 참의 값으로 여겨집니다. 거짓값은 매개변수 전체를 생략하세요.\n;timestamp\n:타임스탬프들은 여러 형식으로 표현될 수 있으나 ISO 8601 날짜와 시간이 추천됩니다. 모든 시간은 UTC이어야 하며, 포함된 시간대는 모두 무시됩니다.\n:* ISO 8601 날짜와 시간, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (구두점과 <kbd>Z</kbd>는 선택입니다.)\n:* ISO 8601 날짜와 시간과 (무시되는) 소수 초, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (대시, 콜론과 <kbd>Z</kbd>는 선택입니다.)\n:* 미디어위키 형식, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 일반적인 수 형식 <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (<kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, 또는 <kbd>-<var>##</var></kbd>와 같은 선택적 시간대는 무시됩니다)\n:*RFC 2822 형식 (시간대는 생략될 수 있음), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 형식 (시간대는 생략될 수 있음), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime 형식, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 1부터 13자리까지의 숫자로 표현된 1970-01-01T00:00:00Z 부터 흐른 시간(초) (<kbd>0</kbd>을 제외)\n:* 문자열 <kbd>now</kbd>",
"api-help-param-type-limit": "유형: 정수 또는 <kbd>max</kbd>",
"api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}",
"api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])",
- "api-help-param-list": "{{PLURAL:$1|1=하나의 값|2=값 (\"{{!}}\"로 구분)}}: $2",
+ "api-help-param-list": "{{PLURAL:$1|1=다음 값 중 하나|2=값 (<kbd>{{!}}</kbd>로 구분)}}: $2",
"api-help-param-list-can-be-empty": "{{PLURAL:$1|0=비어 있어야 함|비어 있을 수 있거나 $2}}",
"api-help-param-limit": "$1 초과는 허용되지 않습니다.",
"api-help-param-limit2": "$1 초과는 허용되지 않습니다. (봇의 경우 $2)",
"api-help-permissions-granted-to": "{{PLURAL:$1|다음 그룹에 부여됨}}: $2",
"api-help-open-in-apisandbox": "<small>[연습장에서 열기]</small>",
"api-help-authmanagerhelper-messageformat": "반환 메시지에 사용할 형식.",
- "api-credits": "API 개발자:\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (초기 개발자, 선임 개발자 2006년 9월~2007년 9월)\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시거나,\nhttps://phabricator.wikimedia.org/ 에 버그 신고를 해 주시기 바랍니다.."
+ "api-credits": "API 개발자:\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (초기 개발자, 선임 개발자 2006년 9월~2007년 9월)\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시거나,\nhttps://phabricator.wikimedia.org/ 에 버그 보고를 해 주시기 바랍니다."
}
"apihelp-imagerotate-param-rotation": "Öm wi vill Jrahd sulle de Bellder noh de Uhr drieh wääde?",
"apihelp-imagerotate-example-simple": "Drieh de <kbd>Dattei:Beijschpell.png</kbd> öm <kbd>90</kbd> Jrahd.",
"apihelp-imagerotate-example-generator": "Drieh alle Bellder en dä <kbd>Saachjropp:Ömdriehje</kbd> öm <kbd>180</kbd> Jrahd.",
- "apihelp-import-param-summary": "Zersammefaßong för der Empohrt.",
+ "apihelp-import-param-summary": "Zersammefaßong för der Empohrt för et Logbohch.",
"apihelp-import-param-xml": "Donn en Dattei em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommaht huhjahde.",
"apihelp-import-param-interwikisource": "För et Empottehre us enem andere Wikki: Dat Wikki vun woh der Empohrt kumme sull.",
"apihelp-import-param-interwikipage": "För et Empottehre us enem andere Wikki: De Sigg zom Empottehre.",
"apihelp-managetags-example-delete": "Schmiiß de Makkehrong mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">vandlaism</kbd>“ fott mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Misspelt</kbd>“.",
"apihelp-managetags-example-activate": "Donn en Makkehrong aktevehre mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">For use in edit patrolling</kbd>“.",
"apihelp-managetags-example-deactivate": "Donn en Makkehrong mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ nit mieh aktihv maache, mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">For use in edit patrolling</kbd>“.",
+ "apihelp-mergehistory-description": "Väsjohne fun Sigge zosamme lähje.",
+ "apihelp-mergehistory-param-from": "De Övverschreff vun dä Sigg, vun däh de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1fromid</var> bruche.",
+ "apihelp-mergehistory-param-fromid": "De Kännong vun dä Sigg, vun däh de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1fromid</var> bruche.",
+ "apihelp-mergehistory-param-to": "De Övverschreff vun dä Sigg, wohen de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1toid</var> bruche.",
+ "apihelp-mergehistory-param-toid": "De Kännong vun dä Sigg, wohen de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1toid</var> bruche.",
"apihelp-mergehistory-param-reason": "Der Jrond för et Zesammelähje vun dä älldere Väsjohne.",
"apihelp-mergehistory-example-merge": "Donn de jannze älldere Väsjohne vun dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Oldpage</kbd>“ met dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Newpage</kbd>“ zesammelähje.",
"apihelp-mergehistory-example-merge-timestamp": "Donn de älldere Väsjohne vun dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Oldpage</kbd>“ bes zom <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">2015-12-31T04:37:41Z</kbd> met dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Newpage</kbd>“ zesammelähje.",
"apihelp-parse-paramvalue-prop-headitems": "Jitt de Saacher för enn der <code><head></code> vun dä Sigg ze donn.",
"apihelp-parse-paramvalue-prop-modules": "Jitt dem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Delivery system in MediaWiki for the optimized run-time loading and managing of modules\">ResourceLoader</i> sing Moduhle uß, di en dä Sigg jebruch wähde. Äntwehder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">jsconfigvars</kbd>“ udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">encodedjsconfigvars</kbd>“ moß mer met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">modules</kbd>“ zesamme aanforrdere.",
"apihelp-parse-paramvalue-prop-jsconfigvars": "Livvert de Varrejahble vun dä Ennschtällonge vum JavaSkrep, di äxtra för heh di Sigg enjeschtallt sin.",
+ "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Livvert de Varrejahble vun dä Ennschtällonge vum JavaSkrep, di äxtra för heh di Sigg enjeschtallt sin als ene Täx em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"JavaScript Object Notation\">JSON</i>-Fommaht.",
"apihelp-parse-paramvalue-prop-iwlinks": "Jitt de Engewikkilengks em jepahßde Wikkitäx uß.",
"apihelp-parse-paramvalue-prop-wikitext": "Jitt de der ojinahl Wikkitäx us, dä jepahß woode es.",
"apihelp-parse-paramvalue-prop-properties": "Jitt devärse Eijeschafte uß, di em jepahßde Wikkitäx faßjelaat woode sen.",
"apihelp-parse-param-section": "Donn blohß der Ennhalld vun däm Affschnett met dä Nommer paase.\n\nWann „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ enjejovve es, donn dä Täx <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1text</var> un de Övverschreff <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sectiontitle</var> paase, wi wänn_enne neuje Affschnett en dä Sigg derbei köhm.\n\nDä Parramehter „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ es blohß zohjelohße, wann och <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">text</var> aanjejovve es.",
"apihelp-parse-param-sectiontitle": "De Övverschreff för dä neuje Afschnet, wann <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">section</var> = <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd> es.\n\nAnders wi beim Beärbeide vun dä Sigg weed dä Parramehter nit dorsch de <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">summary</var> ußjetuusch, wann hä fottjelohße udder läddesch es.",
"apihelp-parse-param-disablelimitreport": "Jiff keine Bereesch vum Vüürbereijde zom Paase (der „<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">NewPP limit report</i>“) mem Paaser singe Dahte zosamme uß.",
+ "apihelp-parse-param-disablepp": "Nämm <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1disablelimitreport</var> schtatt dämm.",
"apihelp-parse-param-disableeditsection": "Donn de Lenks för Affschnedde ze änndere en de Ußjahbe vum Paaser eruß lohße.",
+ "apihelp-parse-param-disabletidy": "Donn et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> vun dä Ußjahbe nit oprühme, för e Beijschpell met <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"correct and cleans up HTML and XML documents fixing markup errors and upgrading legacy code\">tidy</i>.",
"apihelp-parse-param-disabletoc": "Donn et Ennhaldsverzeijscheneß en de Ußjahbe vottlohße.",
"apihelp-parse-example-page": "Donn en Sigg pahse.",
"apihelp-parse-example-text": "Donn Wikkitäx pahse.",
"apihelp-protect-param-reason": "Der Jrond för et Schöze udder Freijävve.",
"apihelp-protect-param-tags": "Donn de Makehronge aanpaße, dat se för dä Enndraach em Logbohch vum Sigge Schöze jehühre.",
"apihelp-protect-param-cascade": "Donn en Schotz-Kaskahd zohlohße, alsu ene Schoz för ennjeföhschte Schablohne un upjerohfe Bellder vun dä Sigg. Deiht nix, wann keine von dä aanjejovve Zoote Schoz en Kaskahd zohlöht.",
+ "apihelp-protect-param-watchlist": "Donn di Sigg ohne Bedengonge op däm aktoälle Metmaacher sing Oppaßleß udder nemm se druß fott, donn de Enschtällonge nämme, udder donn de Oppaßleß jaa nit verändere.",
"apihelp-protect-example-protect": "Donn en Sigg schöze.",
+ "apihelp-protect-example-unprotect": "Donn en Sigg nit mih schöze un doh för saz de Beschrängkonge op <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">all</kbd>“. <!-- https://phabricator.wikimedia.org/T141367 -->",
+ "apihelp-protect-example-unprotect2": "Donn dä Schoz för en Sigg ophävve, un doh för kein Beschrängkonge säze.",
"apihelp-purge-param-forcelinkupdate": "Bräng de Tabälle met de lengks obb ene neue Schtand.",
"apihelp-purge-example-simple": "Donn fö de Sigge „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ un „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">API</kbd>“ de zweschejeschpeijscherte Väsjohn fottschmiiße.",
"apihelp-purge-example-generator": "Donn fö de eezte zehn Sigge em Schtanndadd_Appachtemang de zweschejeschpeijscherte Väsjohn fottschmiiße.",
"apihelp-query+allredirects-param-to": "De Övverschreff vun dä Sigg, woh et Zälle ophühre sull.",
"apihelp-query+allredirects-param-prefix": "Söhk not Sigge, di esu aanfange.",
"apihelp-query+allredirects-param-unique": "Zeijsch blohß de ongerscheidlijje Zihl_Sigg. Kam_mer nit zesamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=ids|fragment|interwiki</code>“ bruche. Wam_mer et als ene Jenerahtor bruche deiht, kritt mer Zihlsiggge anschtatt vun Quällesigge.",
+ "apihelp-query+allredirects-param-prop": "Wat för en Aanjahbe ennschlehße:",
+ "apihelp-query+allredirects-paramvalue-prop-ids": "Deiht de Kännonge vun dä Ömleijdongssigg derbei. Kam_mer nit zersamme met „< var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1unique</var>“ bruche.",
"apihelp-query+allredirects-paramvalue-prop-title": "Deiht dä Ömleijdong ehr Övverschreff derbei.",
"apihelp-query+allredirects-param-namespace": "Dat Appachtemang zom opzälle.",
"apihelp-query+allredirects-param-limit": "Wi vill sulle överhoup aanjezeisch wääde?",
"apihelp-query+allrevisions-param-generatetitles": "Wann als ene Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.",
"apihelp-query+allrevisions-example-user": "Donn de läzde fuffzisch Beijdrähsch vum Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ opleßte.",
"apihelp-query+allrevisions-example-ns-main": "Donn de eezde fuffzisch Väsjohne em Houp-Appachemang opleßte.",
+ "apihelp-query+mystashedfiles-description": "Holl en Leß vun dem aktoälle Metmaacher singe upload stash.",
"apihelp-query+mystashedfiles-param-prop": "Wat för en Aanjahbe holle för di Datteije.",
"apihelp-query+mystashedfiles-param-limit": "Wi vill Datteije holle?",
"apihelp-query+alltransclusions-param-from": "De Övverschreff vun dä ennjeföhschte Sigg, woh de Leß medd aanfange sull.",
"apihelp-query+allusers-param-group": "Donn blohß Metmaacher uß dä aanjejovve Jroppe enschlehße.",
"apihelp-query+allusers-param-excludegroup": "Donn keine Metmaacher uß dä aanjejovve Jroppe enschlehße.",
"apihelp-query+allusers-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+ "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Donn alle Jroppe opleste, woh dä Metmaacher automattesch dren es.",
"apihelp-query+allusers-paramvalue-prop-rights": "De Rääschde vn däm Memaacher.",
"apihelp-query+allusers-paramvalue-prop-editcount": "Donn de Aanzahl Änderonge derbei, di dä Metmaacher em Wikki jemaat hät.",
+ "apihelp-query+allusers-paramvalue-prop-registration": "Wann aanjejovve, deihd dat heh et Dattom un de Zigg derbei, wann dä Metmaacher sesch aanjemälld hät, wann müjjelech. Dat kann läddesch blihve.",
"apihelp-query+allusers-param-limit": "Wi vill Nahme Metmaacher sulle mer krijje?",
"apihelp-query+allusers-param-witheditsonly": "Blohß Metmahcher, di och ens jät verändert han.",
"apihelp-query+allusers-param-activeusers": "Donn blohß Metmaacher opleßte, di {{PLURAL:$1|der läzde Daach|en de läzde $1 Dääsch|keine läzde Daach}} aktihf wohre.",
"apihelp-query+iwbacklinks-example-simple": "Holl Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[wikibooks:Test]]</code>“ verlengke.",
"apihelp-query+iwbacklinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[wikibooks:Test]]</code>“ verlengke.",
"apihelp-query+iwlinks-description": "Jiff alle Engerwikki_Lengks vun de aanjejovve Sigge uß.",
+ "apihelp-query+iwlinks-paramvalue-prop-url": "Deiht dä kumplätte <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> derbei.",
"apihelp-query+iwlinks-param-limit": "Wi vill Engerwikki_Lengks zem ußjävve?",
"apihelp-query+iwlinks-param-prefix": "Jiff blohß de Engerwikki_Lengks uß, di dermet aanfange.",
+ "apihelp-query+iwlinks-param-title": "Dä Engerwiki Lengk för dernoh ze söhke. Moß met <var>$1prefix</var> zesamme jebruch wähde.",
"apihelp-query+iwlinks-param-dir": "En wälsche Reihjefollsch opleßte.",
"apihelp-query+langbacklinks-param-lang": "Schprohch för dä Schprohche_Lengk.",
"apihelp-query+langbacklinks-param-title": "Der Schprohche_Lengk för noh ze söhke. Moß zersamme met <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1lang</code> jebruch wähde.",
"apihelp-query+langbacklinks-param-limit": "Wi vill Sigge ensjesammp zem ußjävve?",
+ "apihelp-query+langbacklinks-param-prop": "Wat för en Prijoretähte holle:",
+ "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Deiht de Kännong för de Schprohch för dä Schprohchelengk derbei.",
+ "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Deiht de Övverschreff för dä Schprohchelengk derbei.",
"apihelp-query+langbacklinks-param-dir": "En wälsche Reihjefollsch opleßte.",
"apihelp-query+langbacklinks-example-simple": "Holl Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[:fr:Test]]</code>“ verlengke.",
"apihelp-query+langbacklinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[:fr:Test]]</code>“ verlengke.",
"apihelp-query+langlinks-description": "Jiff alle Schprohche_Lengks vun de aanjejovve Sigge uß.",
"apihelp-query+langlinks-param-limit": "Wi vill Schprohche_Lengks holle?",
+ "apihelp-query+langlinks-paramvalue-prop-url": "Deiht dä kumplätte <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> derbei.",
+ "apihelp-query+langlinks-paramvalue-prop-autonym": "Deiht dä Nahme vun de Moterschprohch derbei.",
"apihelp-query+langlinks-param-lang": "Donn blohß de Schprohche_Lengks met däm aanjejovve Schprohche_Köözel.",
"apihelp-query+langlinks-param-dir": "En wälsche Reihjefollsch opleßte.",
"apihelp-query+links-description": "Jiff alle Lengks vun de aanjejovve Sigge uß.",
+ "apihelp-query+links-param-namespace": "Zeijsch blohß de Lengks en dä Appachtemangs.",
"apihelp-query+links-param-limit": "Wi vill Lengks ußjävve?",
"apihelp-query+links-param-titles": "Donn blohß e Lengks of heh di Övverschreffte opleßte. Dadd es johd, öm eruß ze fenge ovv en en beschtemmpte Sigg op ene beschtemmpte Övverschreff verlengk es.",
"apihelp-query+links-param-dir": "En wälsche Reihjefollsch opleßte.",
+ "apihelp-query+links-example-simple": "Holl de Lengks vun dä Sigg <kbd>Main Page</kbd>",
"apihelp-query+linkshere-description": "Fengk alle Sigge, di op de aanjejovve Sigge lengke.",
"apihelp-query+linkshere-param-prop": "Wat för en Eijeschaffte holle:",
"apihelp-query+linkshere-paramvalue-prop-pageid": "Page ID of each page.",
"apihelp-query+linkshere-example-simple": "Holl en Leß vun Sigge, di op de Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Main Page]]</code>“ lengke donn.",
"apihelp-query+linkshere-example-generator": "Holl Ennfommazjuhne övver Sigge, di op de Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Main Page]]</code>“ lengke.",
"apihelp-query+logevents-description": "Holl Enndrähsch us de Logböhscher.",
+ "apihelp-query+logevents-param-prop": "Wat för en Eijeschaffte holle:",
"apihelp-query+logevents-param-type": "Söhk blohß heh di Zood Enndrähsch us de Logböhscher.",
"apihelp-query+logevents-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
"apihelp-query+logevents-param-end": "Dattum un Uhrzigg, bes wann opzälle.",
"apihelp-query+pageprops-description": "Jitt devärse Eijeschafte uß, di em Ennhald vun dä Sigg faßjelaat wohde sen.",
"apihelp-query+pageprops-example-simple": "Holl de Eijeschaffte för di Sigge „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ un „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">MediaWiki</kbd>“.",
"apihelp-query+pageswithprop-description": "Donn alle Sigge met bechtemmpte Sigge_Eijeschaff opleßte.",
+ "apihelp-query+pageswithprop-param-prop": "Wat för en Aanjahbe ennschlehße:",
"apihelp-query+pageswithprop-paramvalue-prop-ids": "Deiht de Kännong vun de Sigge derbei.",
+ "apihelp-query+pageswithprop-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för di Sigg derbei.",
"apihelp-query+pageswithprop-paramvalue-prop-value": "Deiht der Wäät för de Eijeschaff vun dä Sigg derbei.",
"apihelp-query+pageswithprop-param-limit": "De jrüüßte Zahl Sigge för ußzejävve.",
"apihelp-query+pageswithprop-param-dir": "En wälsche Reihjefollsch opleßte.",
"apihelp-query+recentchanges-description": "Donn de neußte Änderonge opleßte.",
"apihelp-query+recentchanges-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
"apihelp-query+recentchanges-param-end": "Dattum un Uhrzigg, bes wann opzälle.",
+ "apihelp-query+recentchanges-param-namespace": "Donn de Änderonge blohß us de aanjejovve Appachtemans nämme.",
"apihelp-query+recentchanges-param-user": "Donn blohß Änderonge vun heh däm Metmaacher opleßte.",
"apihelp-query+recentchanges-param-excludeuser": "Donn kein Änderonge vun heh däm Metmaacher opleßte.",
"apihelp-query+recentchanges-param-tag": "Donn blohß Änderonge met heh dä Makkehrong opleßte.",
+ "apihelp-query+recentchanges-param-prop": "Donn zohsäzlejje Aanjahbe ennschlehße:",
+ "apihelp-query+recentchanges-paramvalue-prop-flags": "Deihd de Makkehronge vun dä Änderong derbei.",
+ "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
+ "apihelp-query+recentchanges-paramvalue-prop-title": "Deihd de neuje Övverschreff noh dä Änderong derbei.",
"apihelp-query+recentchanges-paramvalue-prop-tags": "Donn de Makkehronge för dä Enndraach opleßte.",
"apihelp-query+recentchanges-paramvalue-prop-sha1": "Donn de Pröhvsom för di Enndrähsch oplesßte, di met enne Väsjohn zesamme hange.",
"apihelp-query+recentchanges-param-token": "Nemm „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>“ schtatt dämm.",
"apihelp-query+revisions+base-paramvalue-prop-userid": "Däm Metmaacher sing Kännong, dä di Väsjohn aanjelaat hät.",
"apihelp-query+revisions+base-paramvalue-prop-size": "Der Ömvang en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i> vun dä Väsjohn.",
"apihelp-query+revisions+base-paramvalue-prop-sha1": "De <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"secure hash algorithm\">SHA-1 (base 16)</i> Prööfsomm vun dä Väsjohn.",
- "apihelp-query+revisions+base-paramvalue-prop-comment": "De Aanmärkong vum Metmaacher för di äsjohn.",
+ "apihelp-query+revisions+base-paramvalue-prop-comment": "De Aanmärkong vum Metmaacher för di Väsjohn.",
+ "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "De jepaaste Aanmärkong vum Metmaacher för di Väsjohn.",
"apihelp-query+revisions+base-paramvalue-prop-content": "Der Täx vun dä Väsjohn.",
"apihelp-query+revisions+base-paramvalue-prop-tags": "Makkehronge vun dä Väsjohn.",
"apihelp-query+revisions+base-param-limit": "Wi vill Väsjohne sulle ußjejovve wähde?",
"apihelp-query+search-param-what": "Wat för en Aat ze Söhke?",
"apihelp-query+search-param-info": "Wat för en Metta_Dahte ußzejävve.",
"apihelp-query+search-param-prop": "Wat för en Eijeschaffte holle:",
+ "apihelp-query+search-paramvalue-prop-wordcount": "Deiht de Aanzahl Wööter en dä Sigg derbeij.",
+ "apihelp-query+search-paramvalue-prop-timestamp": "Deihd et Dattum un de Uhrzigg derbei, wann di Sigg et läz veränndert wohd.",
+ "apihelp-query+search-paramvalue-prop-redirecttitle": "Deiht dä zopaß Ömleijdong ehr Övverschreff derbei.",
"apihelp-query+search-param-limit": "Wi vill Sigge ensjesamp ußjävve?",
"apihelp-query+search-param-interwiki": "Donn de Engerwiki Lengks met ußjävve beim Söhke, wann_er doh sin.",
"apihelp-query+search-example-simple": "Söhk noh „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">meaning</kbd>“.",
"apihelp-query+search-example-text": "Söhk en Täxte noh „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">meaning</kbd>“.",
"apihelp-query+search-example-generator": "Holl anjahbe övver di Sigge, di jefonge wähde beim söhke noh \n„<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">meaning</kbd>“",
"apihelp-query+siteinfo-description": "Jiff alljemeine Ennfommazjuhne övver heh di ẞaid_uß.",
+ "apihelp-query+siteinfo-param-prop": "Wat för en Ennfommazjuhne holle:",
+ "apihelp-query+siteinfo-paramvalue-prop-general": "Alljemeine Aanjabe zom Süßtehm.",
+ "apihelp-query+siteinfo-paramvalue-prop-statistics": "Jivv Schtatistike vum Wikki uß.",
+ "apihelp-query+siteinfo-paramvalue-prop-variables": "Jid en Leß med de verföhschbahre Kännonge us.",
"apihelp-query+siteinfo-param-filteriw": "Donn blohß de Enndrähsch för heh et Wikki udder blohß de Enndrähsch för ußerhallef en di Leß.",
"apihelp-query+siteinfo-param-showalldb": "Donn alle ẞööver för de Dahtebangke opleßte, nit blohß di am mihßte hengerher sin.",
"apihelp-query+siteinfo-param-numberingroup": "Donn de Aanzahl Metmaacher en de Jroppe vun Metmaacher opleßte.",
"apihelp-query+usercontribs-paramvalue-prop-ids": "Donn de Kännong för jehde Sigg un jehe Väsjohn derbei.",
"apihelp-query+usercontribs-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för et Appachtemang derbei.",
"apihelp-query+usercontribs-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
+ "apihelp-query+usercontribs-paramvalue-prop-comment": "Deihd de Zosammefaßong vun dä Änderong derbei.",
+ "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Deihd de jepaaste Zosammefaßong vun dä Änderong derbei.",
"apihelp-query+usercontribs-paramvalue-prop-size": "Deihd de neuje Jrühße noh dä Änderong derbei.",
"apihelp-query+usercontribs-paramvalue-prop-sizediff": "Deihd de Änderong vun dä Jrühße vun dä Änderong derbei.",
"apihelp-query+usercontribs-paramvalue-prop-flags": "Deihd de Makkehronge vun dä Änderong derbei.",
+ "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Nohjelohrte Änderonge makkehre.",
"apihelp-query+usercontribs-paramvalue-prop-tags": "Donn de Makkehronge vun dä Änderong opleßte.",
"apihelp-query+usercontribs-param-tag": "Donn blohß Väsjohne met heh dä Makehrong opleßte.",
"apihelp-query+usercontribs-param-toponly": "Bloß Änderonge aanzeije, woh de neußte Väsjohn beij eruß kohm.",
"apihelp-query+userinfo-example-data": "Holl zohsäzlejje Aanjahbe övver dä aktoälle Metmaacher.",
"apihelp-query+users-description": "Holl Aanjahbe övver en Leß vun Metmaacher.",
"apihelp-query+users-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+ "apihelp-query+users-paramvalue-prop-groups": "Donn alle Jroppe opleßte, woh all de Metmaacher dren sin.",
+ "apihelp-query+users-paramvalue-prop-implicitgroups": "Donn alle Jroppe opleßte, woh ene Metmaacher aotomattesch dren es.",
"apihelp-query+users-paramvalue-prop-rights": "Donn alle Rääschte opleßte, di alle Metmaacher han.",
"apihelp-query+users-paramvalue-prop-editcount": "Donn däm Metmaacher sing Aanzahl Ännderonge derbeij.",
"apihelp-query+users-paramvalue-prop-registration": "Donn et Dattom vun dämm Metmaacher singe eetze Aanmäldong derbei.",
"apihelp-query+watchlist-paramvalue-prop-flags": "Deihd de Makkehronge vun dä Änderong derbei.",
"apihelp-query+watchlist-paramvalue-prop-user": "Deiht dä Metmaacher derbei, dä di Änderong jemaat hät.",
"apihelp-query+watchlist-paramvalue-prop-userid": "Deiht de kännong vn äm Metmaacher derbei, dä di Änderong jemaat hät.",
+ "apihelp-query+watchlist-paramvalue-prop-comment": "Deihd de Zosammefaßong vun dä Änderong derbei.",
+ "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Deihd de jepaaste Zosammefaßong vun dä Änderong derbei.",
"apihelp-query+watchlist-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
+ "apihelp-query+watchlist-paramvalue-prop-patrol": "Makkehrt de nohjelohrte Ännderonge.",
+ "apihelp-query+watchlist-paramvalue-prop-sizes": "Deiht de vörrijje un de neuje Läng vun dä Sigg derbei.",
"apihelp-query+watchlist-param-type": "Wat för en Änderonge aanzeije:",
"apihelp-query+watchlist-paramvalue-type-edit": "Jewöhnlejje Ännderonge aan Sigge.",
"apihelp-query+watchlist-paramvalue-type-external": "Änderonge vun Ußerhallef.",
"apihelp-query+watchlistraw-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
"apihelp-query+watchlistraw-param-limit": "Wi vell Äjehbneße ennsjesammp pro Oprohv ußjejovve wähde sulle.",
"apihelp-query+watchlistraw-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle:",
+ "apihelp-query+watchlistraw-param-dir": "En wälsche Reihjefollsch opleßte.",
"apihelp-query+watchlistraw-example-simple": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß opleßte.",
"apihelp-removeauthenticationdata-example-simple": "Versöhk dem aktoäle Metmaacher sing Dahte för <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">FooAuthenticationRequest</kbd> fott ze nämme.",
"apihelp-resetpassword-example-email": "Schegg en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> mem Passwod neu säze aan alle Matmaacher met dä Addräß <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user@example.com</kbd>.",
"apihelp-tag-example-log": "Donn de Makkehrong „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ vun dämm Enndrahch met dä Kännong „<kbd>123</kbd>“ em Logbohch fott nämme un als Jrond draaach „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Wrongly applied</kbd>“ enn.",
"apihelp-unblock-description": "Don en Schpärr för ene Metmaacher ophävve.",
"apihelp-unblock-param-reason": "Der Jrond för de Schpärr opzehävve.",
+ "apihelp-unblock-param-tags": "Donn de Makehronge änndere, di för dä Enndraach em Logbohch vum Schpärre jesaz wähde sulle.",
"apihelp-undelete-param-title": "De Övverschreff vun dä Sigg zom zerök holle.",
"apihelp-undelete-param-reason": "Der Jrond för et Zerök holle.",
"apihelp-undelete-param-tags": "Donn de Makehronge aanpaße, dat se för dä Enndraach em Logbohch vum Sigge fott Schmihße jehühre.",
"api-help-param-default": "Schtandatt: $1",
"api-help-param-default-empty": "Schtandatt: <span class=\"apihelp-empty\">(läddesch)</span>",
"api-help-param-disabled-in-miser-mode": "Dadd es wäje em [[mw:Manual:$wgMiserMode|miser mode]] affjeschalldt.",
- "api-help-param-limited-in-miser-mode": "<strong>opjepaß:</strong> Weil der [[mw:Manual:$wgMiserMode|miser mode]] enjeschalld es, künne heh winnijer wi <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> Äjehpneße ußjejejovve wähde, vör em Wigger_Mache. En Jränzfäll künne et Noll sin.",
+ "api-help-param-limited-in-miser-mode": "<strong>Opjepaß:</strong> Weil der [[mw:Manual:$wgMiserMode|miser mode]] enjeschalld es, künne heh winnijer wi <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> Äjehpneße ußjejejovve wähde, vör em Wigger_Mache. En Jränzfäll künne et Noll sin.",
"api-help-param-direction": "En wälsche Reihjefollsch opleßte:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">newer</code>:De Ählsde et eez. Opjepaß: „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1start</code>“ moß fröhjer sin wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1end</code>“.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">older</code>:De Neuste et eez, der Schtanndatt. Opjepaß: „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1start</code>“ moß schpääder sin wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1end</code>“.",
"api-help-param-continue": "Wann mih ze holle es, nemm dat för wigger ze maache.",
"api-help-param-no-description": "<span class=\"apihelp-empty\">(nix drövver bikannt)</span>",
"apihelp-emailuser-param-target": "Bikarhênerê ku e-name jê rê bê şandin.",
"apihelp-expandtemplates-param-title": "Sernavê rûpelê.",
"apihelp-feedcontributions-param-deletedonly": "Tenê beşdariyên jêbirî nîşan bide.",
+ "apihelp-feedcontributions-param-hideminor": "Guherandinên biçûk veşêre.",
+ "apihelp-feedrecentchanges-param-hideminor": "Guherandinên biçûk veşêre.",
+ "apihelp-feedrecentchanges-param-hidebots": "Guherandinên botan veşêre.",
"apihelp-feedrecentchanges-example-simple": "Guherandinên dawî nîşan bide.",
"apihelp-feedrecentchanges-example-30days": "Guherandinên dawî yên 30 rojan nîşan bide",
"apihelp-filerevert-param-comment": "Şîroveyê bar bike.",
"apihelp-parse-example-summary": "Kurteyekê analîz bike",
"apihelp-protect-description": "Asta parastinê ya rûpelekê biguherîne.",
"apihelp-protect-example-protect": "Rûpelekê biparêze.",
- "apihelp-tag-param-reason": "Sedemê bo guherandinê."
+ "apihelp-query+alllinks-paramvalue-prop-title": "Sernavê girêdanê lê zêde dike.",
+ "apihelp-tag-param-reason": "Sedemê bo guherandinê.",
+ "api-help-parameters": "{{PLURAL:$1|Parametre}}:"
}
"apihelp-feedcontributions-param-year": "A partir de l’annada (e mai recent) :",
"apihelp-feedcontributions-param-month": "A partir del mes (e mai recent) :",
"apihelp-feedrecentchanges-param-feedformat": "Lo format del flux.",
+ "apihelp-feedrecentchanges-param-hideminor": "Amagar las modificacions menoras.",
"apihelp-feedrecentchanges-param-tagfilter": "Filtrar per balisa.",
"apihelp-filerevert-param-comment": "Telecargar lo comentari.",
"apihelp-filerevert-param-archivename": "Nom d’archiu de la revision de restablir.",
"apihelp-protect-param-reason": "Powód zabezpieczania/odbezpieczania.",
"apihelp-protect-param-cascade": "Włącz ochronę kaskadową (chronione są wszystkie osadzone szablony i obrazki na tej stronie). Ignorowane, jeśli żaden z danych poziomów ochrony nie wspiera kaskadowania.",
"apihelp-protect-example-protect": "Zabezpiecz stronę",
- "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>all</kbd>.",
+ "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>all</kbd> (czyli każdy może wykonać działanie).",
"apihelp-protect-example-unprotect2": "Odbezpiecz stronę ustawiając brak ograniczeń.",
"apihelp-purge-param-forcelinkupdate": "Uaktualnij tabele linków.",
"apihelp-purge-example-generator": "Przeczyść pierwsze 10 stron w przestrzeni głównej.",
"api-help-lead": "Esta é uma página de documentação API do MediaWiki gerada automaticamente.\n\nDocumentação e exemplos: https://www.mediawiki.org/wiki/API",
"api-help-main-header": "Módulo principal",
"api-help-flag-deprecated": "Este módulo está obsoleto.",
+ "api-help-flag-readrights": "Este módulo requer direitos de leitura.",
+ "api-help-flag-writerights": "Este módulo requer direitos de leitura.",
+ "api-help-flag-mustbeposted": "Este módulo aceita somente solicitações POST.",
"api-help-source": "Fonte: $1",
"api-help-license": "Licença: [[$1|$2]]",
"api-help-license-noname": "Licença: [[$1|Ver ligação]]",
"api-help-param-deprecated": "Obsoleto.",
"api-help-param-required": "Este parâmetro é obrigatório.",
"api-help-datatypes-header": "Tipo de dados",
+ "api-help-datatypes": "Alguns tipos de parâmetro na API necessitam de mais explicações:\n;boolean\n:Os parâmetros booleanos funcionam como as caixas de seleção HTML: se o parâmetro for especificado, independentemente do valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:Timestamps podem ser especificados em vários formatos. Formato de data e hora ISO 8601 é recomendado. Todos os horários estão em UTC, qualquer inclusão de fuso horário é ignorado.\n:* Data e hora ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (pontuação e <kbd>Z</kbd> são opcionais)\n:* Data e hora ISO 8601 com segundos fracionários (ignorado), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (traços, dois pontos e <kbd>Z</kbd> são opcionais)\n:* Formato do MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato numérico genérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (fuso horário opcional do <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, or <kbd>-<var>##</var></kbd> são ignorados)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (o fuso horário pode ser omitido), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (o fuso horário pode ser omitido), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato C ctime, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 dígitos (excluindo <kbd>0</kbd>)\n:* A string <kbd>now</kbd>",
"api-help-param-type-limit": "Tipo: inteiro ou <kbd>max</kbd>",
"api-help-param-type-boolean": "Tipo: boolean ([[Special:ApiHelp/main#main/datatypes|detalhes]])",
"api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de utilizador|2=lista de nomes de utilizadores}}",
"api-help-param-list": "{{PLURAL:$1|1=Um dos seguintes valores|2=Valores (separar com <kbd>{{!}}</kbd>)}}: $2",
"api-help-param-multi-separate": "Separe os valores com <kbd>|</kbd>.",
+ "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para robôs).",
"api-help-param-default": "Padrão: $1",
"api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
"api-help-param-no-description": "<span class=\"apihelp-empty\">(sem descrição)</span>",
"apihelp-linkaccount-example-link": "{{doc-apihelp-example|linkaccount}}",
"apihelp-login-description": "{{doc-apihelp-description|login|info=This message is used when <code>$wgEnableBotPasswords</code> is true.|seealso=* {{msg-mw|apihelp-login-description-nobotpasswords}}}}",
"apihelp-login-description-nobotpasswords": "{{doc-apihelp-description|login|info=This message is used when <code>$wgEnableBotPasswords</code> is false.|seealso=* {{msg-mw|apihelp-login-description}}}}",
- "apihelp-login-description-nonauthmanager": "{{doc-apihelp-description|login|info=This message is used when <code>$wgDisableAuthManager</code> is true.|seealso=* {{msg-mw|apihelp-login-description}}}}",
"apihelp-login-param-name": "{{doc-apihelp-param|login|name}}\n{{Identical|Username}}",
"apihelp-login-param-password": "{{doc-apihelp-param|login|password}}\n{{Identical|Password}}",
"apihelp-login-param-domain": "{{doc-apihelp-param|login|domain}}",
"apihelp-stashedit-param-section": "{{doc-apihelp-param|stashedit|section}}",
"apihelp-stashedit-param-sectiontitle": "{{doc-apihelp-param|stashedit|sectiontitle}}",
"apihelp-stashedit-param-text": "{{doc-apihelp-param|stashedit|text}}",
+ "apihelp-stashedit-param-stashedtexthash": "{{doc-apihelp-param|stashedit|stashedtexthash}}",
"apihelp-stashedit-param-contentmodel": "{{doc-apihelp-param|stashedit|contentmodel}}",
"apihelp-stashedit-param-contentformat": "{{doc-apihelp-param|stashedit|contentformat}}",
"apihelp-stashedit-param-baserevid": "{{doc-apihelp-param|stashedit|baserevid}}",
"apihelp-main-param-requestid": "Любое заданное здесь значение будет включено в ответ. Может быть использовано для различения запросов.",
"apihelp-main-param-servedby": "Включить в результаты имя хоста, обработавшего запрос.",
"apihelp-main-param-curtimestamp": "Включить в результаты временную метку.",
- "apihelp-main-param-origin": "При обращении к API, используя кросс-доменный AJAX-запрос (CORS), задайте параметру значение исходного домена. Он должен быть включён в любой предварительный запрос и таким образом должен быть частью URI-запроса (не тела POST). Он должен точно соответствовать одному из источников в заголовке <code>Origin<code>, так что он должен быть задан наподобие <kbd>https://ru.wikipedia.org</kbd> или <kbd>https://meta.wikimedia.org</kbd>. Если параметр не соответствует заголовку <code>Origin<code>, будет возвращён ответ с кодом ошибки 403. Если параметр соответствует заголовку <code>Origin</code>, и источник находится в белом списке, будет установлен заголовок <code>Access-Control-Allow-Origin</code>.",
+ "apihelp-main-param-origin": "При обращении к API, используя кросс-доменный AJAX-запрос (CORS), задайте параметру значение исходного домена. Он должен быть включён в любой предварительный запрос и таким образом должен быть частью URI-запроса (не тела POST).\n\nДля аутентифицированных запросов он должен точно соответствовать одному из источников в заголовке <code>Origin<code>, так что он должен быть задан наподобие <kbd>https://ru.wikipedia.org</kbd> или <kbd>https://meta.wikimedia.org</kbd>. Если параметр не соответствует заголовку <code>Origin<code>, будет возвращён ответ с кодом ошибки 403. Если параметр соответствует заголовку <code>Origin</code>, и источник находится в белом списке, будут установлены заголовки <code>Access-Control-Allow-Origin</code> и <code>Access-Control-Allow-Credentials</code>.\n\nДля неаутентифицированных запросов укажите значение <kbd>*</kbd>. Это приведёт к установке заголовка <code>Access-Control-Allow-Origin</code> заголовка должен быть установлен, но <code>Access-Control-Allow-Credentials</code> примет значение <code>false</code> и все пользовательские данные будут ограничены.",
"apihelp-block-description": "Блокировка участника.",
"apihelp-block-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите заблокировать.",
"apihelp-block-param-reason": "Причина блокировки.",
"apihelp-feedcontributions-param-deletedonly": "Показать только удалённые правки.",
"apihelp-feedcontributions-param-toponly": "Показать только правки, являющиеся последними версиями.",
"apihelp-feedcontributions-param-newonly": "Показывать только правки, являющиеся созданием страниц.",
+ "apihelp-feedcontributions-param-hideminor": "Скрыть малые правки.",
"apihelp-feedcontributions-param-showsizediff": "Показать размер различия между версиями.",
"apihelp-feedcontributions-example-simple": "Показать вклад участника <kbd>Example</kbd>.",
"apihelp-feedrecentchanges-param-invert": "Все пространства имён, кроме выбранного.",
"apihelp-imagerotate-param-rotation": "На сколько градусов по часовой стрелке повернуть изображение.",
"apihelp-imagerotate-example-simple": "Повернуть <kbd>File:Example.png</kbd> на <kbd>90</kbd> градусов.",
"apihelp-imagerotate-example-generator": "Повернуть все изображения в <kbd>Category:Flip</kbd> на <kbd>180</kbd> градусов.",
- "apihelp-import-param-summary": "Ð\98мпоÑ\80Ñ\82 иÑ\82ога",
+ "apihelp-import-param-summary": "Ð\9eпиÑ\81ание запиÑ\81и жÑ\83Ñ\80нала импоÑ\80Ñ\82а.",
"apihelp-import-param-xml": "Загруженный XML-файл.",
"apihelp-import-example-import": "Импортировать [[meta:Help:ParserFunctions]] с полной историей в пространство имён 100.",
"apihelp-login-param-name": "Имя участника.",
"apihelp-protect-param-title": "Бит атамаһы. $1pageid менән бергә ҡулланылмай.",
"apihelp-protect-param-reason": "(ООН) һағы сәбәптәре.",
"apihelp-protect-example-protect": "Защитить страницу.",
- "apihelp-protect-example-unprotect": "<kbd>всех</kbd> өсөн сикләүҙәр ҡуйып,биттән һаҡлауҙы алырға.",
+ "apihelp-protect-example-unprotect": "Снять защиту страницы, установив ограничения <kbd>all</kbd> (т. е. любой желающий может принять меры).",
"apihelp-protect-example-unprotect2": "Бер ниндәй сикләүҙәр ҡуймай биттән һаҡлауҙы алырға.",
"apihelp-purge-param-forcelinkupdate": "Обновление связей таблиц.",
"apihelp-purge-param-forcerecursivelinkupdate": "Һылтанманы һәм таблицаны яңыртығыҙ һәм был битте шаблон итеп ҡулланған башҡа биттәр өсөн һылтанмаларҙы ла яңыртығыҙ.",
"apihelp-query+allimages-param-maxsize": "Бар һүрәттәр лимиты (байттарҙа).",
"apihelp-query+allimages-param-limit": "Кире ҡайтыу өсөн образдар һаны.",
"apihelp-query+allimages-example-B": "<kbd>Б</kbd> хәрефенән башланған файлдар исемлеген күрһәтергә.",
- "apihelp-query+allimages-example-recent": "Ð\9aүпÑ\82Ó\99н Ñ\82үгел Ñ\82ейÓ\99лгÓ\99н Ò»Ó\99м [[Ñ\81пеÑ\86иалÑ\8cнÑ\8bе:NewFiles]] оҡÑ\88аÑ\88 Ñ\84айлдаÑ\80 иÑ\81емлеген күÑ\80Ò»Ó\99Ñ\82еÑ\80гÓ\99.",
+ "apihelp-query+allimages-example-recent": "Ð\9fоказаÑ\82Ñ\8c Ñ\81пиÑ\81ок недавно загÑ\80Ñ\83женнÑ\8bÑ\85 Ñ\84айлов, аналогиÑ\87но [[Special:NewFiles]].",
"apihelp-query+allimages-example-generator": "<kbd>Т</kbd> хәрефенән башланған 4 файл хаҡында мәғлүмәтте күрһәтергә.",
"apihelp-query+alllinks-description": "Бирелгән исемдәр арауығына йүнәлткән барлыҡ һылтанмаларҙы һанап сығырға.",
"apihelp-query+alllinks-param-from": "Һанауҙы башлау өсөн һылтанма атамаһы.",
"apihelp-createaccount-param-language": "Код мови для встановлення за замовчуванням для користувача (необов'язково, за замовчуванням — мова вмісту).",
"apihelp-createaccount-example-pass": "Створити користувача <kbd>testuser</kbd> з паролем <kbd>test123</kbd>.",
"apihelp-createaccount-example-mail": "Створити користувача <kbd>testmailuser</kbd> і надіслати на електронну пошту випадково-згенерований пароль.",
+ "apihelp-cspreport-description": "Використовується браузерами для повідомлення порушень Правил безпеки контенту (Content Security Policy). Цей модуль не повинен використовуватися, окрім випадків автоматичного використання веб-браузером для CSP-скарги.",
+ "apihelp-cspreport-param-reportonly": "Позначити як доповідь із моніторингової політики, не примусової політики",
+ "apihelp-cspreport-param-source": "Що згенерувало CSP-заголовок, який запустив цю доповідь",
"apihelp-delete-description": "Вилучити сторінку.",
"apihelp-delete-param-title": "Назва сторінки для вилучення. Не можна використати разом з <var>$1pageid</var>.",
"apihelp-delete-param-pageid": "ID-сторінки на вилучення. Не можна використати разом з <var>$1title</var>.",
"apihelp-linkaccount-example-link": "Почати процес пов'язування з обліковм записом з <kbd>Example</kbd>.",
"apihelp-login-description": "Увійти в систему й отримати куки автентифікації.\n\nЦю дію треба використовувати лише в комбінації з [[Special:BotPasswords]]; використання для входу в основний обліковий запис застаріле і може ламатися без попередження. Щоб безпечно увійти в основний обліковий запис, використовуйте <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
"apihelp-login-description-nobotpasswords": "Увійти й отримати куки автентифікації.\n\nЦя дія застаріла і може ламатися без попередження. Щоб безпечно входити в систему, використовуйте <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
- "apihelp-login-description-nonauthmanager": "Увійти й отримати куки автентифікації.\n\nУ випадку успішного входження в систему будуть включені в заголовки відповіді HTTP. У випадку невдалого входження подальші спроби можуть бути урізані, щоб обмежити атаки автоматичного вгадування пароля.",
"apihelp-login-param-name": "Ім'я користувача.",
"apihelp-login-param-password": "Пароль.",
"apihelp-login-param-domain": "Домен (необов'язково).",
"apihelp-parse-paramvalue-prop-sections": "Дає розділи в аналізованому вікітексті.",
"apihelp-parse-paramvalue-prop-revid": "Додає ідентифікатор версії аналізованої сторінки.",
"apihelp-parse-paramvalue-prop-displaytitle": "Додає заголовок аналізованого вікітексту.",
- "apihelp-parse-paramvalue-prop-headitems": "Дає елементи для вставки в <code><head></code> сторінки.",
+ "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Застаріло.</span> Дає елементи для вставки в <code><head></code> сторінки.",
"apihelp-parse-paramvalue-prop-headhtml": "Дає проаналізований <code><head></code> сторінки.",
- "apihelp-parse-paramvalue-prop-modules": "Дає модулі ResourceLoader, використані на сторінці. Чи <kbd>jsconfigvars</kbd>, чи <kbd>encodedjsconfigvars</kbd> має бути запитано разом з <kbd>modules</kbd>.",
- "apihelp-parse-paramvalue-prop-jsconfigvars": "Дає змінні конфігурації JavaScript, притаманні для сторінки.",
+ "apihelp-parse-paramvalue-prop-modules": "Ð\94аÑ\94 модÑ\83лÑ\96 ResourceLoader, викоÑ\80иÑ\81Ñ\82анÑ\96 на Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96. Щоб заванÑ\82ажиÑ\82и, викоÑ\80иÑ\81Ñ\82овÑ\83йÑ\82е <code>mw.loader.using()</code>. Чи <kbd>jsconfigvars</kbd>, Ñ\87и <kbd>encodedjsconfigvars</kbd> маÑ\94 бÑ\83Ñ\82и запиÑ\82ано Ñ\80азом з <kbd>modules</kbd>.",
+ "apihelp-parse-paramvalue-prop-jsconfigvars": "Дає змінні конфігурації JavaScript, притаманні для сторінки. Щоб застосувати, використайте <code>mw.config.set()</code>.",
"apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Дає змінні конфігурації JavaScript, притаманні для сторінки, як рядок JSON.",
"apihelp-parse-paramvalue-prop-indicators": "Дає HTML індикаторів стану сторінки, використаних на сторінці.",
"apihelp-parse-paramvalue-prop-iwlinks": "Дає інтервікі-посилання в аналізованому вікітексті.",
"apihelp-protect-description": "Змінити рівень захисту сторінки.",
"apihelp-protect-param-title": "Заголовок сторінки для (зняття) захисту. Не може використовуватися разом із $1pageid.",
"apihelp-protect-param-pageid": "ID сторінки для (зняття) захисту. Не може використовуватися разом з $1title.",
- "apihelp-protect-param-protections": "Список рівнів захисту у форматі <kbd>action=level</kbd> (напр., <kbd>edit=sysop</kbd>).\n\n<strong>Примітка:</strong> Обмеження на дії, яких нема в списку, буде знято.",
+ "apihelp-protect-param-protections": "Список рівнів захисту у форматі <kbd>action=level</kbd> (напр., <kbd>edit=sysop</kbd>). Рівень <kbd>all</kbd> означає, що будь-хто може робити дію, тобто обмежень немає.\n\n<strong>Примітка:</strong> Обмеження на дії, яких нема в списку, буде знято.",
"apihelp-protect-param-expiry": "Часові мітки закінчення. Якщо встановлена лише одна мітка, її буде використано для усіх захистів. Для безстрокового захисту використовуйте <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> або <kbd>never</kbd>.",
"apihelp-protect-param-reason": "Причина для (зняття) захисту.",
"apihelp-protect-param-tags": "Змінити теги, що мають бути застосовані до запису в журналі захисту.",
"apihelp-protect-param-watch": "Якщо вказано, додати сторінку, де додається/знімається захист, до списку спостереження поточного користувача.",
"apihelp-protect-param-watchlist": "Беззастережно додати або вилучити сторінку зі списку спостереження поточного користувача, використати налаштування або не змінювати спостереження.",
"apihelp-protect-example-protect": "Захистити сторінку.",
- "apihelp-protect-example-unprotect": "Зняти захист зі сторінки, встановивши обмеження для <kbd>all</kbd>.",
+ "apihelp-protect-example-unprotect": "Зняти захист зі сторінки, встановивши обмеження для <kbd>all</kbd> (тобто будь-хто зможе робити дії).",
"apihelp-protect-example-unprotect2": "Зняти захист з сторінки, встановивши відсутність обмежень.",
"apihelp-purge-description": "Очистити кеш для вказаних заголовків.\n\nВимагає запиту POST, якщо користувач не ввійшов у систему.",
"apihelp-purge-param-forcelinkupdate": "Оновити таблиці посилань.",
"apihelp-undelete-example-page": "Відновити сторінку <kbd>Main Page</kbd>.",
"apihelp-undelete-example-revisions": "Відновити дві версії сторінки <kbd>Main Page</kbd>.",
"apihelp-unlinkaccount-description": "Вилучити пов'язаний обліковий запис третьої сторони з поточного користувача.",
+ "apihelp-unlinkaccount-example-simple": "Здійснити спробу вилучити посилання поточного користувача для провайдера, асоційованого з <kbd>FooAuthenticationRequest</kbd>.",
"apihelp-upload-description": "Завантажити файл, або отримати статус завантажень у процесі.\n\nДоступні декілька методів:\n* Завантажити вміст файлу напряму, використовуючи параметр <var>$1file</var>.\n* Завантажити файл шматками, використовуючи параметри <var>$1filesize</var>, <var>$1chunk</var>, та <var>$1offset</var>.\n* Змусити сервер Медіавікі отримати файл за URL, використовуючи параметр <var>$1url</var>.\n* Завершити раніше розпочате завантаження, яке не вдалось через попередження, використовуючи параметр <var>$1filekey</var>.\nЗауважте, що HTTP POST повинен бути здійснений як завантаження файлу (наприклад, використовуючи <code>multipart/form-data</code>)",
"apihelp-upload-param-filename": "Цільова назва файлу.",
"apihelp-upload-param-comment": "Коментар завантаження. Також використовується як початковий текст сторінок для нових файлів, якщо <var>$1text</var> не вказано.",
"api-help-permissions-granted-to": "{{PLURAL:$1|Надано|Надані}}: $2",
"api-help-right-apihighlimits": "Використовувати вищі ліміти у запитах API (повільні запити: $1; швидкі запити: $2). Ліміти для повільних запитів також застосовуються до багатозначних параметрів.",
"api-help-open-in-apisandbox": "<small>[відкрити в пісочниці]</small>",
+ "api-help-authmanager-general-usage": "Загальна процедура використання цього модуля така:\n# Отримайте доступні поля зі <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> за допомогою <kbd>amirequestsfor=$4</kbd>, а також токен <kbd>$5</kbd> зі <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Передайте ці поля користувачеві, і отримайте інформацію, якою він їх заповнить.\n# Напишіть до цього модуля, заповнивши <var>$1returnurl</var> та всі релевантні поля.\n# Перевірте <samp>status</samp> у відповіді.\n#* Якщо Ви отримали <samp>PASS</samp> або <samp>FAIL</samp>, роботу завершено. Операція або була успішною, або провалилася.\n#* Якщо Ви отримали <samp>UI</samp>, надішліть нові поля користувачеві й отримайте інформацію, якою він їх заповнить. Далі напишіть до цього модуля із <var>$1continue</var> та заповніть всі реелевантні поля, після чого повторіть крок 4.\n#* Якщо Ви отримали <samp>REDIRECT</samp>, направте користувача до <samp>redirecttarget</samp> і дочекайтеся повернення до <var>$1returnurl</var>. Тоді напишіть до цього модуля із <var>$1continue</var>, та з усіма полями, що були передані до повернутої URL-адреси, після чого повторіть крок 4.\n#* Якщо Ви отримали <samp>RESTART</samp>, це означає, що автентифікація спрацювала, але ми не маємо пов'язаного облікового запису користувача. Ви можете розцінити це як <samp>UI</samp>, або як <samp>FAIL</samp>.",
+ "api-help-authmanagerhelper-requests": "Використовувати ці автентифікаційні запити через <samp>id</samp>, що повертається з <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> за допомогою <kbd>amirequestsfor=$1</kbd>, або з попередньої відповіді з цього модуля.",
+ "api-help-authmanagerhelper-request": "Використовувати цей автентифікаційний запит через <samp>id</samp>, що повертається з <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> за допомогою <kbd>amirequestsfor=$1</kbd>.",
"api-help-authmanagerhelper-messageformat": "Формат до використання для повернення повідомлень.",
"api-help-authmanagerhelper-mergerequestfields": "Об'єднати інформацію всіх автентифікаційних запитів у один масив.",
"api-help-authmanagerhelper-preservestate": "Зберегти статус з попередньої спроби входу, що не вдалась, якщо можливо.",
+ "api-help-authmanagerhelper-returnurl": "URL-адреса повернення для сторонніх автентифікаційних потоків повинна бути абсолютною. Обов'язковим є це, або <var>$1continue</var>. \n\nПри отриманні відповіді <samp>REDIRECT</samp>, найбільш звичною Вашою дією буде відкриття браузерного чи іншого веб-перегляду вказаного URL-посилання для стороннього потоку автентифікації. Коли ця операція буде завершена, стороння програма перенаправить веб-переглядач на цю URL-адресу. Ви повинні видобувати будь-які параметри запитів або POST-параметри із цієї URL-адреси, і передавати їх як запит <var>$1continue</var> до цього модуля API.",
+ "api-help-authmanagerhelper-continue": "Цей запит є продовженням після попередньої відповіді <samp>UI</samp> або <samp>REDIRECT</samp>. Або це, або <var>$1returnurl</var> є обов'язковим.",
+ "api-help-authmanagerhelper-additional-params": "Цей модуль приймає додаткові параметри, залежно від доступних автентифікаційних запитів. Використовуйте <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> за допомогою <kbd>amirequestsfor=$1</kbd> (або попередню відповідь від цього модуля, якщо це застосовно), аби визначити доступні запити та поля, які вони використовують.",
"api-credits-header": "Автор(и)",
"api-credits": "Розробники API:\n* Roan Kattouw (головний розробник вер. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (творець, головний розробник вер. 2006 – вер. 2007)\n* Brad Jorsch (головний розробник 2013 – тепер)\n\nБудь ласка, надсилайте свої коментарі, пропозиції та запитання на mediawiki-api@lists.wikimedia.org\nабо зафайліть звіт про баґ на https://phabricator.wikimedia.org/."
}
"Hzy980512",
"PhiLiP",
"Arthur2e5",
- "損齋"
+ "損齋",
+ "Myy730"
]
},
"apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong>本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong>当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。\n\n<strong>测试中:</strong>测试API请求的易用性,请参见[[Special:ApiSandbox]]。",
"apihelp-createaccount-example-pass": "创建用户<kbd>testuser</kbd>和密码<kbd>test123</kbd>。",
"apihelp-createaccount-example-mail": "创建用户<kbd>testmailuser</kbd>并电邮发送一个随机生成的密码。",
"apihelp-cspreport-description": "由浏览器使用以报告违反内容安全方针的内容。此模块应永不使用,除了在被CSP兼容的浏览器自动使用时。",
+ "apihelp-cspreport-param-reportonly": "标记作为来自监视方针的报告,而不是执行方针的报告",
+ "apihelp-cspreport-param-source": "生成引发此报告的CSP标头的事物",
"apihelp-delete-description": "删除一个页面。",
"apihelp-delete-param-title": "要删除的页面标题。不能与<var>$1pageid</var>一起使用。",
"apihelp-delete-param-pageid": "要删除的页面的页面 ID。不能与<var>$1title</var>一起使用。",
"apihelp-linkaccount-example-link": "开始从<kbd>Example</kbd>链接至账户的过程。",
"apihelp-login-description": "登录并获取身份验证Cookie。\n\n此操作只应与[[Special:BotPasswords]]一起使用;用于主账户登录的方式已弃用,并可能在没有警告的情况下失败。要安全登录主账户,请使用<kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>。",
"apihelp-login-description-nobotpasswords": "登录并获取身份验证Cookie。\n\n此操作已弃用,并可能在没有警告的情况下失败。要安全登录,请使用<kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>。",
- "apihelp-login-description-nonauthmanager": "登录并获取身份验证Cookie。\n\n在成功登录的情况下,所需的Cookie将包含在HTTP响应头中。在登录失败的情况下,进一步的尝试可能会被自动密码猜解攻击的限制所遏制。",
"apihelp-login-param-name": "用户名。",
"apihelp-login-param-password": "密码。",
"apihelp-login-param-domain": "域名(可选)。",
"apihelp-parse-paramvalue-prop-sections": "在被解析的wiki文本中提供段落。",
"apihelp-parse-paramvalue-prop-revid": "添加被解析页面的修订ID。",
"apihelp-parse-paramvalue-prop-displaytitle": "为被解析的wiki文本添加标题。",
- "apihelp-parse-paramvalue-prop-headitems": "提供项目以插入至页面的<code><head></code>。",
+ "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">已弃用。</span>提供项目以插入至页面的<code><head></code>。",
"apihelp-parse-paramvalue-prop-headhtml": "提供页面的被解析<code><head></code>。",
- "apihelp-parse-paramvalue-prop-modules": "提供在页面中使用的ResourceLoader模块。无论<kbd>jsconfigvars</kbd>还是<kbd>encodedjsconfigvars</kbd>都必须与<kbd>modules</kbd>共同被请求。",
- "apihelp-parse-paramvalue-prop-jsconfigvars": "针对页面提供JavaScript配置变量。",
+ "apihelp-parse-paramvalue-prop-modules": "提供在页面中使用的ResourceLoader模块。要加载,请使用<code>mw.loader.using()</code>。无论<kbd>jsconfigvars</kbd>还是<kbd>encodedjsconfigvars</kbd>都必须与<kbd>modules</kbd>共同被请求。",
+ "apihelp-parse-paramvalue-prop-jsconfigvars": "针对页面提供JavaScript配置变量。要应用,请使用<code>mw.config.set()</code>。",
"apihelp-parse-paramvalue-prop-encodedjsconfigvars": "针对页面提供JavaScript配置变量为一个JSON字符串。",
"apihelp-parse-paramvalue-prop-indicators": "提供页面上使用的页面状态指示器的HTML。",
"apihelp-parse-paramvalue-prop-iwlinks": "在被解析的wiki文本中提供跨wiki链接。",
"apihelp-protect-description": "更改页面的保护等级。",
"apihelp-protect-param-title": "要(解除)保护的页面标题。不能与$1pageid一起使用。",
"apihelp-protect-param-pageid": "要(解除)保护的页面ID。不能与$1title一起使用。",
- "apihelp-protect-param-protections": "保护等级列表,格式:<kbd>action=level</kbd>(例如<kbd>edit=sysop</kbd>)。\n\n<strong>注意:</strong>未列出的操作将移除限制。",
+ "apihelp-protect-param-protections": "保护等级列表,格式:<kbd>action=level</kbd>(例如<kbd>edit=sysop</kbd>)。等级<kbd>all</kbd>意味着任何人都可以执行操作,也就是说没有限制。\n\n<strong>注意:</strong>未列出的操作将移除限制。",
"apihelp-protect-param-expiry": "到期时间戳。如果只有一个时间戳被设置,它将被用于所有保护。使用<kbd>infinite</kbd>、<kbd>indefinite</kbd>、<kbd>infinity</kbd>或<kbd>never</kbd>用于永不过期的保护。",
"apihelp-protect-param-reason": "(解除)保护的原因。",
"apihelp-protect-param-tags": "要在保护日志中应用到实体的更改标签。",
"apihelp-protect-param-watch": "如果设置,就加入已开始(解除)保护的页面至当前用户的监视列表。",
"apihelp-protect-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
"apihelp-protect-example-protect": "保护一个页面。",
- "apihelp-protect-example-unprotect": "通过设置限制为<kbd>all</kbd>解除保护一个页面。",
+ "apihelp-protect-example-unprotect": "通过设置限制为<kbd>all</kbd>解除保护一个页面(就是说任何人都可以执行操作)。",
"apihelp-protect-example-unprotect2": "通过设置没有限制解除保护一个页面。",
"apihelp-purge-description": "为指定标题刷新缓存。\n\n如果用户尚未登录的话,就需要POST请求。",
"apihelp-purge-param-forcelinkupdate": "更新链接表。",
"apihelp-query+recentchanges-paramvalue-prop-sizes": "添加新旧页面长度(字节)。",
"apihelp-query+recentchanges-paramvalue-prop-redirect": "如果页面是重定向的话,标记编辑。",
"apihelp-query+recentchanges-paramvalue-prop-patrolled": "Tags patrollable edits as being patrolled or unpatrolled.",
- "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Adds log information (log ID, log type, etc) to log entries.",
+ "apihelp-query+recentchanges-paramvalue-prop-loginfo": "添加日志信息(日志ID、日志类型等)至日志记录。",
"apihelp-query+recentchanges-paramvalue-prop-tags": "列举条目的标签。",
"apihelp-query+recentchanges-paramvalue-prop-sha1": "Adds the content checksum for entries associated with a revision.",
"apihelp-query+recentchanges-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
* @return AuthManager
*/
public static function singleton() {
- global $wgDisableAuthManager;
-
- if ( $wgDisableAuthManager ) {
- throw new \BadMethodCallException( '$wgDisableAuthManager is set' );
- }
-
if ( self::$instance === null ) {
self::$instance = new self(
\RequestContext::getMain()->getRequest(),
}
public function addUser( $user, $password, $email = '', $realname = '' ) {
- global $wgUser;
-
- $data = [
- 'username' => $user->getName(),
- 'password' => $password,
- 'retype' => $password,
- 'email' => $email,
- 'realname' => $realname,
- ];
- if ( $this->domain !== null && $this->domain !== '' ) {
- $data['domain'] = $this->domain;
- }
- $reqs = AuthManager::singleton()->getAuthenticationRequests( AuthManager::ACTION_CREATE );
- $reqs = AuthenticationRequest::loadRequestsFromSubmission( $reqs, $data );
-
- $res = AuthManager::singleton()->beginAccountCreation( $wgUser, $reqs, 'null:' );
- switch ( $res->status ) {
- case AuthenticationResponse::PASS:
- return true;
- case AuthenticationResponse::FAIL:
- // Hope it's not a PreAuthenticationProvider that failed...
- $msg = $res->message instanceof \Message ? $res->message : new \Message( $res->message );
- $this->logger->info( __METHOD__ . ': Authentication failed: ' . $msg->plain() );
- return false;
- default:
- throw new \BadMethodCallException(
- 'AuthManager does not support such simplified account creation'
- );
- }
+ throw new \BadMethodCallException(
+ 'Creation of users via AuthPlugin is not supported with '
+ . 'AuthManager. Generally, user creation should be left to either '
+ . 'Special:CreateAccount, auto-creation when triggered by a '
+ . 'SessionProvider or PrimaryAuthenticationProvider, or '
+ . 'User::newSystemUser().'
+ );
}
public function strict() {
}
$status = $this->checkPasswordValidity( $username, $req->password );
- if ( !$status->isOk() ) {
+ if ( !$status->isOK() ) {
// Fatal, can't log in
return AuthenticationResponse::newFail( $status->getMessage() );
}
$ulang = $context->getLanguage();
// Check that there are no other sources of variation
- if ( $user->getId() || $user->getNewtalk() || $ulang->equals( $wgContLang ) ) {
+ if ( $user->getId() || $user->getNewtalk() || !$ulang->equals( $wgContLang ) ) {
return false;
}
// Allow extensions to disable caching
/**
* Show formatted char difference
+ *
+ * Needs the css module 'mediawiki.special.changeslist' to style output
+ *
* @param int $old Number of bytes
* @param int $new Number of bytes
* @param IContextSource $context
return new IdentityCollation;
case 'uca-default':
return new IcuCollation( 'root' );
+ case 'uca-default-u-kn':
+ return new IcuCollation( 'root-u-kn' );
case 'xx-uca-ckb':
return new CollationCkb;
case 'xx-uca-et':
/** @var Language */
protected $digitTransformLanguage;
+ /** @var boolean */
+ private $useNumericCollation = false;
+
/** @var array */
private $firstLetterData;
'be-tarask' => [ "Ё" ],
'cy' => [ "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ],
'en' => [],
- 'fa' => [ "آ", "ء", "ه" ],
+ // RTL, let's put each letter on a new line
+ 'fa' => [
+ "آ",
+ "ء",
+ "ه",
+ "ا",
+ "و"
+ ],
'fi' => [ "Å", "Ä", "Ö" ],
'fr' => [],
'hu' => [ "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ],
'la' => [],
'lb' => [],
'lt' => [ "Č", "Š", "Ž" ],
- 'mk' => [],
+ 'mk' => [ "Ѓ", "Ќ" ],
'mo' => [ "Ă", "Â", "Î", "Ş", "Ţ" ],
'mt' => [ "Ċ", "Ġ", "Għ", "Ħ", "Ż" ],
'nl' => [],
$this->primaryCollator = Collator::create( $locale );
$this->primaryCollator->setStrength( Collator::PRIMARY );
+
+ // If the special suffix for numeric collation is present, turn on numeric collation.
+ if ( substr( $locale, -5, 5 ) === '-u-kn' ) {
+ $this->useNumericCollation = true;
+ // Strip off the special suffix so it doesn't trip up fetchFirstLetterData().
+ $this->locale = substr( $this->locale, 0, -5 );
+ $this->mainCollator->setAttribute( Collator::NUMERIC_COLLATION, Collator::ON );
+ $this->primaryCollator->setAttribute( Collator::NUMERIC_COLLATION, Collator::ON );
+ }
}
public function getSortKey( $string ) {
return '';
}
- // Check for CJK
$firstChar = mb_substr( $string, 0, 1, 'UTF-8' );
+
+ // If the first character is a CJK character, just return that character.
if ( ord( $firstChar ) > 0x7f && self::isCjk( UtfNormal\Utils::utf8ToCodepoint( $firstChar ) ) ) {
return $firstChar;
}
// Before the first letter
return '';
}
- return $this->getLetterByIndex( $min );
+
+ $sortLetter = $this->getLetterByIndex( $min );
+
+ if ( $this->useNumericCollation ) {
+ // If the sort letter is a number, return '0–9' (or localized equivalent).
+ // ASCII value of 0 is 48. ASCII value of 9 is 57.
+ // Note that this also applies to non-Arabic numerals since they are
+ // mapped to Arabic numeral sort letters. For example, ২ sorts as 2.
+ if ( ord( $sortLetter ) >= 48 && ord( $sortLetter ) <= 57 ) {
+ $sortLetter = wfMessage( 'category-header-numerals' )->numParams( 0, 9 )->text();
+ }
+ }
+ return $sortLetter;
}
/**
}
/**
+ * Test if a code point is a CJK (Chinese, Japanese, Korean) character
* @since 1.16.3
*/
public static function isCjk( $codepoint ) {
$versionPrefix = substr( $icuVersion, 0, 3 );
// Source: http://site.icu-project.org/download
$map = [
+ '57.' => '8.0',
+ '56.' => '8.0',
+ '55.' => '7.0',
+ '54.' => '7.0',
+ '53.' => '6.3',
+ '52.' => '6.3',
+ '51.' => '6.2',
'50.' => '6.2',
'49.' => '6.1',
'4.8' => '6.0',
*/
return [];
}
+
+ /**
+ * Add new field definition to array.
+ * @param SearchIndexField[] $fields
+ * @param SearchEngine $engine
+ * @param string $name
+ * @param int $type
+ * @return SearchIndexField[] new field defs
+ * @since 1.28
+ */
+ protected function addSearchField( &$fields, SearchEngine $engine, $name, $type ) {
+ $fields[$name] = $engine->makeSearchFieldMapping( $name, $type );
+ return $fields;
+ }
+
+ /**
+ * Return fields to be indexed by search engine
+ * as representation of this document.
+ * Overriding class should call parent function or take care of calling
+ * the SearchDataForIndex hook.
+ * @param WikiPage $page Page to index
+ * @param ParserOutput $output
+ * @param SearchEngine $engine Search engine for which we are indexing
+ * @return array Map of name=>value for fields
+ * @since 1.28
+ */
+ public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
+ SearchEngine $engine ) {
+ $fields = [];
+ $content = $page->getContent();
+ if ( $content ) {
+ $text = $content->getTextForSearchIndex();
+ $fields['text'] = $text;
+ $fields['source_text'] = $text;
+ $fields['text_bytes'] = $content->getSize();
+ }
+ Hooks::run( 'SearchDataForIndex', [ &$fields, $this, $page, $output, $engine ] );
+ return $fields;
+ }
+
+ /**
+ * Produce page output suitable for indexing.
+ *
+ * Specific content handlers may override it if they need different content handling.
+ *
+ * @param WikiPage $page
+ * @param ParserCache $cache
+ * @return ParserOutput
+ */
+ public function getParserOutputForIndexing( WikiPage $page, ParserCache $cache = null ) {
+ $parserOptions = $page->makeParserOptions( 'canonical' );
+ $revId = $page->getRevision()->getId();
+ if ( $cache ) {
+ $parserOutput = $cache->get( $page, $parserOptions );
+ }
+ if ( empty( $parserOutput ) ) {
+ $parserOutput =
+ $page->getContent()->getParserOutput( $page->getTitle(), $revId, $parserOptions );
+ if ( $cache ) {
+ $cache->save( $parserOutput, $page, $parserOptions );
+ }
+ }
+ return $parserOutput;
+ }
+
}
$engine->makeSearchFieldMapping( 'language', SearchIndexField::INDEX_TYPE_KEYWORD );
return $fields;
}
+
+ public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
+ SearchEngine $engine ) {
+ $fields = parent::getDataForSearchIndex( $page, $output, $engine );
+ $fields['language'] =
+ $this->getPageLanguage( $page->getTitle(), $page->getContent() )->getCode();
+ return $fields;
+ }
+
}
--- /dev/null
+<?php
+
+use HtmlFormatter\HtmlFormatter;
+use MediaWiki\Logger\LoggerFactory;
+
+/**
+ * Class allowing to explore structure of parsed wikitext.
+ */
+class WikiTextStructure {
+ /**
+ * @var string
+ */
+ private $openingText;
+ /**
+ * @var string
+ */
+ private $allText;
+ /**
+ * @var string[]
+ */
+ private $auxText = [];
+ /**
+ * @var ParserOutput
+ */
+ private $parserOutput;
+
+ /**
+ * @var string[] selectors to elements that are excluded entirely from search
+ */
+ private $excludedElementSelectors = [
+ 'audio', 'video', // "it looks like you don't have javascript enabled..."
+ // do not need to index
+ 'sup.reference', // The [1] for references
+ '.mw-cite-backlink', // The ↑ next to references in the references section
+ 'h1', 'h2', 'h3', // Headings are already indexed in their own field.
+ 'h5', 'h6', 'h4',
+ '.autocollapse', // Collapsed fields are hidden by default so we don't want them
+ // showing up.
+ ];
+
+ /**
+ * @var string[] selectors to elements that are considered auxiliary to article text for search
+ */
+ private $auxiliaryElementSelectors = [
+ '.thumbcaption', // Thumbnail captions aren't really part of the text proper
+ 'table', // Neither are tables
+ '.rellink', // Common style for "See also:".
+ '.dablink', // Common style for calling out helpful links at the top
+ // of the article.
+ '.searchaux', // New class users can use to mark stuff as auxiliary to searches.
+ ];
+
+ /**
+ * WikiTextStructure constructor.
+ * @param ParserOutput $parserOutput
+ */
+ public function __construct( ParserOutput $parserOutput ) {
+ $this->parserOutput = $parserOutput;
+ }
+
+ /**
+ * Get categories in the text.
+ * @return string[]
+ */
+ public function categories() {
+ $categories = [];
+ foreach ( array_keys( $this->parserOutput->getCategories() ) as $key ) {
+ $categories[] = Category::newFromName( $key )->getTitle()->getText();
+ }
+ return $categories;
+ }
+
+ /**
+ * Get outgoing links.
+ * @return string[]
+ */
+ public function outgoingLinks() {
+ $outgoingLinks = [];
+ foreach ( $this->parserOutput->getLinks() as $linkedNamespace => $namespaceLinks ) {
+ foreach ( array_keys( $namespaceLinks ) as $linkedDbKey ) {
+ $outgoingLinks[] =
+ Title::makeTitle( $linkedNamespace, $linkedDbKey )->getPrefixedDBkey();
+ }
+ }
+ return $outgoingLinks;
+ }
+
+ /**
+ * Get templates in the text.
+ * @return string[]
+ */
+ public function templates() {
+ $templates = [];
+ foreach ( $this->parserOutput->getTemplates() as $tNS => $templatesInNS ) {
+ foreach ( array_keys( $templatesInNS ) as $tDbKey ) {
+ $templateTitle = Title::makeTitleSafe( $tNS, $tDbKey );
+ if ( $templateTitle && $templateTitle->exists() ) {
+ $templates[] = $templateTitle->getPrefixedText();
+ }
+ }
+ }
+ return $templates;
+ }
+
+ /**
+ * Get headings on the page.
+ * @return string[]
+ * First strip out things that look like references. We can't use HTML filtering because
+ * the references come back as <sup> tags without a class. To keep from breaking stuff like
+ * ==Applicability of the strict mass–energy equivalence formula, ''E'' = ''mc''<sup>2</sup>==
+ * we don't remove the whole <sup> tag. We also don't want to strip the <sup> tag and remove
+ * everything that looks like [2] because, I dunno, maybe there is a band named Word [2] Foo
+ * or something. Whatever. So we only strip things that look like <sup> tags wrapping a
+ * reference. And since the data looks like:
+ * Reference in heading <sup>[1]</sup><sup>[2]</sup>
+ * we can not really use HtmlFormatter as we have no suitable selector.
+ */
+ public function headings() {
+ $headings = [];
+ $ignoredHeadings = $this->getIgnoredHeadings();
+ foreach ( $this->parserOutput->getSections() as $heading ) {
+ $heading = $heading[ 'line' ];
+
+ // Some wikis wrap the brackets in a span:
+ // http://en.wikipedia.org/wiki/MediaWiki:Cite_reference_link
+ $heading = preg_replace( '/<\/?span>/', '', $heading );
+ // Normalize [] so the following regexp would work.
+ $heading = preg_replace( [ '/[/', '/]/' ], [ '[', ']' ], $heading );
+ $heading = preg_replace( '/<sup>\s*\[\s*\d+\s*\]\s*<\/sup>/is', '', $heading );
+
+ // Strip tags from the heading or else we'll display them (escaped) in search results
+ $heading = trim( Sanitizer::stripAllTags( $heading ) );
+
+ // Note that we don't take the level of the heading into account - all headings are equal.
+ // Except the ones we ignore.
+ if ( !in_array( $heading, $ignoredHeadings ) ) {
+ $headings[] = $heading;
+ }
+ }
+ return $headings;
+ }
+
+ /**
+ * Parse a message content into an array. This function is generally used to
+ * parse settings stored as i18n messages (see search-ignored-headings).
+ *
+ * @param string $message
+ * @return string[]
+ */
+ public static function parseSettingsInMessage( $message ) {
+ $lines = explode( "\n", $message );
+ $lines = preg_replace( '/#.*$/', '', $lines ); // Remove comments
+ $lines = array_map( 'trim', $lines ); // Remove extra spaces
+ $lines = array_filter( $lines ); // Remove empty lines
+ return $lines;
+ }
+
+ /**
+ * Get list of heading to ignore.
+ * @return string[]
+ */
+ private function getIgnoredHeadings() {
+ static $ignoredHeadings = null;
+ if ( $ignoredHeadings === null ) {
+ $ignoredHeadings = [];
+ $source = wfMessage( 'search-ignored-headings' )->inContentLanguage();
+ if ( $source->isBlank() ) {
+ // Try old version too, just in case
+ $source = wfMessage( 'cirrussearch-ignored-headings' )->inContentLanguage();
+ }
+ if ( !$source->isDisabled() ) {
+ $lines = self::parseSettingsInMessage( $source->plain() );
+ $ignoredHeadings = $lines; // Now we just have headings!
+ }
+ }
+ return $ignoredHeadings;
+ }
+
+ /**
+ * Extract parts of the text - opening, main and auxiliary.
+ */
+ private function extractWikitextParts() {
+ if ( !is_null( $this->allText ) ) {
+ return;
+ }
+ $this->parserOutput->setEditSectionTokens( false );
+ $this->parserOutput->setTOCEnabled( false );
+ $text = $this->parserOutput->getText();
+ if ( strlen( $text ) == 0 ) {
+ $this->allText = "";
+ // empty text - nothing to seek here
+ return;
+ }
+ $opening = null;
+
+ $this->openingText = $this->extractHeadingBeforeFirstHeading( $text );
+
+ // Add extra spacing around break tags so text crammed together like<br>this
+ // doesn't make one word.
+ $text = str_replace( '<br', "\n<br", $text );
+
+ $formatter = new HtmlFormatter( $text );
+
+ // Strip elements from the page that we never want in the search text.
+ $formatter->remove( $this->excludedElementSelectors );
+ $formatter->filterContent();
+
+ // Strip elements from the page that are auxiliary text. These will still be
+ // searched but matches will be ranked lower and non-auxiliary matches will be
+ // preferred in highlighting.
+ $formatter->remove( $this->auxiliaryElementSelectors );
+ $auxiliaryElements = $formatter->filterContent();
+ $this->allText = trim( Sanitizer::stripAllTags( $formatter->getText() ) );
+ foreach ( $auxiliaryElements as $auxiliaryElement ) {
+ $this->auxText[] =
+ trim( Sanitizer::stripAllTags( $formatter->getText( $auxiliaryElement ) ) );
+ }
+ }
+
+ /**
+ * Get text before first heading.
+ * @param string $text
+ * @return string|null
+ */
+ private function extractHeadingBeforeFirstHeading( $text ) {
+ $matches = [];
+ if ( !preg_match( '/<h[123456]>/', $text, $matches, PREG_OFFSET_CAPTURE ) ) {
+ // There isn't a first heading so we interpret this as the article
+ // being entirely without heading.
+ return null;
+ }
+ $text = substr( $text, 0, $matches[ 0 ][ 1 ] );
+ if ( !$text ) {
+ // There isn't any text before the first heading so we declare there isn't
+ // a first heading.
+ return null;
+ }
+
+ $formatter = new HtmlFormatter( $text );
+ $formatter->remove( $this->excludedElementSelectors );
+ $formatter->remove( $this->auxiliaryElementSelectors );
+ $formatter->filterContent();
+ $text = trim( Sanitizer::stripAllTags( $formatter->getText() ) );
+
+ if ( !$text ) {
+ // There isn't any text after filtering before the first heading so we declare
+ // that there isn't a first heading.
+ return null;
+ }
+
+ return $text;
+ }
+
+ /**
+ * Get opening text
+ * @return string
+ */
+ public function getOpeningText() {
+ $this->extractWikitextParts();
+ return $this->openingText;
+ }
+
+ /**
+ * Get main text
+ * @return string
+ */
+ public function getMainText() {
+ $this->extractWikitextParts();
+ return $this->allText;
+ }
+
+ /**
+ * Get auxiliary text
+ * @return string[]
+ */
+ public function getAuxiliaryText() {
+ $this->extractWikitextParts();
+ return $this->auxText;
+ }
+}
return $fields;
}
+ /**
+ * Extract text of the file
+ * TODO: probably should go to file handler?
+ * @param Title $title
+ * @return string|null
+ */
+ protected function getFileText( Title $title ) {
+ $file = wfLocalFile( $title );
+ if ( $file && $file->exists() ) {
+ return $file->getHandler()->getEntireText( $file );
+ }
+
+ return null;
+ }
+
+ public function getDataForSearchIndex( WikiPage $page, ParserOutput $parserOutput,
+ SearchEngine $engine ) {
+ $fields = parent::getDataForSearchIndex( $page, $parserOutput, $engine );
+
+ $structure = new WikiTextStructure( $parserOutput );
+ $fields['external_link'] = array_keys( $parserOutput->getExternalLinks() );
+ $fields['category'] = $structure->categories();
+ $fields['heading'] = $structure->headings();
+ $fields['outgoing_link'] = $structure->outgoingLinks();
+ $fields['template'] = $structure->templates();
+ // text fields
+ $fields['opening_text'] = $structure->getOpeningText();
+ $fields['text'] = $structure->getMainText(); // overwrites one from ContentHandler
+ $fields['auxiliary_text'] = $structure->getAuxiliaryText();
+
+ $title = $page->getTitle();
+ if ( NS_FILE == $title->getNamespace() ) {
+ $fileText = $this->getFileText( $title );
+ if ( $fileText ) {
+ $fields['file_text'] = $fileText;
+ }
+ }
+ return $fields;
+ }
+
}
* - READ_EXCLUSIVE : Up-to-date read as of now, that locks (exclusive) the records
* All record locks persist for the duration of the transaction.
*
+ * A special constant READ_LATEST_IMMUTABLE can be used for fetching append-only data. Such
+ * data is either (a) on a slave and up-to-date or (b) not yet there, but on the master/quorum.
+ * Because the data is append-only, it can never be stale on a slave if present.
+ *
* Callers should use READ_NORMAL (or pass in no flags) unless the read determines a write.
* In theory, such cases may require READ_LOCKING, though to avoid contention, READ_LATEST is
* often good enough. If UPDATE race condition checks are required on a row and expensive code
* must run after the row is fetched to determine the UPDATE, it may help to do something like:
- * - a) Read the current row
- * - b) Determine the new row (expensive, so we don't want to hold locks now)
- * - c) Re-read the current row with READ_LOCKING; if it changed then bail out
- * - d) otherwise, do the updates
+ * - a) Start transaction
+ * - b) Read the current row with READ_LATEST
+ * - c) Determine the new row (expensive, so we don't want to hold locks now)
+ * - d) Re-read the current row with READ_LOCKING; if it changed then bail out
+ * - e) otherwise, do the updates
+ * - f) Commit transaction
*
* @since 1.20
*/
interface IDBAccessObject {
- // Constants for object loading bitfield flags (higher => higher QoS)
- const READ_LATEST = 1; // read from the master
+ /** Constants for object loading bitfield flags (higher => higher QoS) */
+ /** @var integer Read from a slave/non-quorum */
+ const READ_NORMAL = 0;
+ /** @var integer Read from the master/quorum */
+ const READ_LATEST = 1;
+ /* @var integer Read from the master/quorum and lock out other writers */
const READ_LOCKING = 3; // READ_LATEST (1) and "LOCK IN SHARE MODE" (2)
+ /** @var integer Read from the master/quorum and lock out other writers and locking readers */
const READ_EXCLUSIVE = 7; // READ_LOCKING (3) and "FOR UPDATE" (4)
- // Convenience constant for callers to explicitly request slave data
- const READ_NORMAL = 0; // read from the slave
+ /** @var integer Read from a slave/non-quorum immutable data, using the master/quorum on miss */
+ const READ_LATEST_IMMUTABLE = 8;
// Convenience constant for tracking how data was loaded (higher => higher QoS)
const READ_NONE = -1; // not loaded yet (or the object was cleared)
return $this->__call( __FUNCTION__, func_get_args() );
}
+ public function serverIsReadOnly() {
+ return $this->__call( __FUNCTION__, func_get_args() );
+ }
+
public function onTransactionResolution( callable $callback ) {
return $this->__call( __FUNCTION__, func_get_args() );
}
protected $mTrxPreCommitCallbacks = [];
/** @var array[] List of (callable, method name) */
protected $mTrxEndCallbacks = [];
+ /** @var bool Whether to suppress triggering of post-commit callbacks */
+ protected $suppressPostCommitCallbacks = false;
protected $mTablePrefix;
protected $mSchema;
}
public function close() {
- if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
- throw new MWException( "Transaction idle callbacks still pending." );
- }
if ( $this->mConn ) {
if ( $this->trxLevel() ) {
if ( !$this->mTrxAutomatic ) {
$closed = $this->closeConnection();
$this->mConn = false;
+ } elseif ( $this->mTrxIdleCallbacks || $this->mTrxEndCallbacks ) { // sanity
+ throw new MWException( "Transaction callbacks still pending." );
} else {
$closed = true;
}
* queries. If a deadlock occurs during the processing, the transaction
* will be rolled back and the callback function will be called again.
*
+ * Avoid using this method outside of Job or Maintenance classes.
+ *
* Usage:
* $dbw->deadlockLoop( callback, ... );
*
* Extra arguments are passed through to the specified callback function.
+ * This method requires that no transactions are already active to avoid
+ * causing premature commits or exceptions.
*
* Returns whatever the callback function returned on its successful,
* iteration, or false on error, for example if the retry limit was
* reached.
+ *
* @return mixed
* @throws DBUnexpectedError
* @throws Exception
return false;
}
+ public function serverIsReadOnly() {
+ return false;
+ }
+
final public function onTransactionResolution( callable $callback ) {
if ( !$this->mTrxLevel ) {
throw new DBUnexpectedError( $this, "No transaction is active." );
final public function onTransactionIdle( callable $callback ) {
$this->mTrxIdleCallbacks[] = [ $callback, wfGetCaller() ];
if ( !$this->mTrxLevel ) {
- $this->runOnTransactionIdleCallbacks();
+ $this->runOnTransactionIdleCallbacks( self::TRIGGER_IDLE );
}
}
if ( $this->mTrxLevel ) {
$this->mTrxPreCommitCallbacks[] = [ $callback, wfGetCaller() ];
} else {
- $this->onTransactionIdle( $callback ); // this will trigger immediately
+ // If no transaction is active, then make one for this callback
+ $this->begin( __METHOD__ );
+ try {
+ call_user_func( $callback );
+ $this->commit( __METHOD__ );
+ } catch ( Exception $e ) {
+ $this->rollback( __METHOD__ );
+ throw $e;
+ }
}
}
/**
- * Actually any "on transaction idle" callbacks.
+ * Whether to disable running of post-commit callbacks
+ *
+ * This method should not be used outside of Database/LoadBalancer
*
+ * @param bool $suppress
+ * @since 1.28
+ */
+ final public function setPostCommitCallbackSupression( $suppress ) {
+ $this->suppressPostCommitCallbacks = $suppress;
+ }
+
+ /**
+ * Actually run and consume any "on transaction idle/resolution" callbacks.
+ *
+ * This method should not be used outside of Database/LoadBalancer
+ *
+ * @param integer $trigger IDatabase::TRIGGER_* constant
* @since 1.20
*/
- protected function runOnTransactionIdleCallbacks() {
+ public function runOnTransactionIdleCallbacks( $trigger ) {
+ if ( $this->suppressPostCommitCallbacks ) {
+ return;
+ }
+
$autoTrx = $this->getFlag( DBO_TRX ); // automatic begin() enabled?
$e = $ePrior = null; // last exception
$this->mTrxIdleCallbacks,
$this->mTrxEndCallbacks // include "transaction resolution" callbacks
);
- $this->mTrxIdleCallbacks = []; // recursion guard
- $this->mTrxEndCallbacks = []; // recursion guard
+ $this->mTrxIdleCallbacks = []; // consumed (and recursion guard)
+ $this->mTrxEndCallbacks = []; // consumed (recursion guard)
foreach ( $callbacks as $callback ) {
try {
list( $phpCallback ) = $callback;
$this->clearFlag( DBO_TRX ); // make each query its own transaction
- call_user_func( $phpCallback );
+ call_user_func_array( $phpCallback, [ $trigger ] );
if ( $autoTrx ) {
$this->setFlag( DBO_TRX ); // restore automatic begin()
} else {
}
/**
- * Actually any "on transaction pre-commit" callbacks.
+ * Actually run and consume any "on transaction pre-commit" callbacks.
+ *
+ * This method should not be used outside of Database/LoadBalancer
*
* @since 1.22
*/
- protected function runOnTransactionPreCommitCallbacks() {
+ public function runOnTransactionPreCommitCallbacks() {
$e = $ePrior = null; // last exception
do { // callbacks may add callbacks :)
$callbacks = $this->mTrxPreCommitCallbacks;
- $this->mTrxPreCommitCallbacks = []; // recursion guard
+ $this->mTrxPreCommitCallbacks = []; // consumed (and recursion guard)
foreach ( $callbacks as $callback ) {
try {
list( $phpCallback ) = $callback;
final public function endAtomic( $fname = __METHOD__ ) {
if ( !$this->mTrxLevel ) {
- throw new DBUnexpectedError( $this, 'No atomic transaction is open.' );
+ throw new DBUnexpectedError( $this, "No atomic transaction is open (got $fname)." );
}
if ( !$this->mTrxAtomicLevels ||
array_pop( $this->mTrxAtomicLevels ) !== $fname
) {
- throw new DBUnexpectedError( $this, 'Invalid atomic section ended.' );
+ throw new DBUnexpectedError( $this, "Invalid atomic section ended (got $fname)." );
}
if ( !$this->mTrxAtomicLevels && $this->mTrxAutomaticAtomic ) {
"$fname: Transaction already in progress (from {$this->mTrxFname}), " .
" performing implicit commit!"
);
- } else {
+ } elseif ( $this->mTrxDoneWrites ) {
// The transaction was automatic and has done write operations
- if ( $this->mTrxDoneWrites ) {
- wfDebug( "$fname: Automatic transaction with writes in progress" .
+ throw new DBUnexpectedError(
+ $this,
+ "$fname: Automatic transaction with writes in progress" .
" (from {$this->mTrxFname}), performing implicit commit!\n"
- );
- }
+ );
}
$this->runOnTransactionPreCommitCallbacks();
$this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime );
}
- $this->runOnTransactionIdleCallbacks();
+ $this->runOnTransactionIdleCallbacks( self::TRIGGER_COMMIT );
}
// Avoid fatals if close() was called
$this->mTrxAutomatic = false;
$this->mTrxAutomaticAtomic = false;
$this->mTrxAtomicLevels = [];
- $this->mTrxIdleCallbacks = [];
- $this->mTrxPreCommitCallbacks = [];
$this->mTrxShortId = wfRandomString( 12 );
$this->mTrxWriteDuration = 0.0;
$this->mTrxWriteCallers = [];
$this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime );
}
- $this->runOnTransactionIdleCallbacks();
+ $this->runOnTransactionIdleCallbacks( self::TRIGGER_COMMIT );
}
/**
$this->mTrxIdleCallbacks = []; // clear
$this->mTrxPreCommitCallbacks = []; // clear
- $this->runOnTransactionIdleCallbacks();
+ $this->runOnTransactionIdleCallbacks( self::TRIGGER_ROLLBACK );
}
/**
* @param mixed $conds Array or string, condition(s) for WHERE
* @param string $fname Calling function name (use __METHOD__) for logs/profiling
* @param array $options Associative array of options (e.g.
- * array('GROUP BY' => 'page_title')), see Database::makeSelectOptions
+ * [ 'GROUP BY' => 'page_title' ]), see Database::makeSelectOptions
* code for list of supported stuff
* @param array $join_conds Associative array of table join conditions
- * (optional) (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
+ * (optional) (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
* @return mixed Database result resource (feed to Database::fetchObject
* or whatever), or false on failure
* @throws DBQueryError
* @param mixed $vars Array or string, field name(s) to be retrieved
* @param mixed $conds Array or string, condition(s) for WHERE
* @param string $fname Calling function name (use __METHOD__) for logs/profiling
- * @param array $options Associative array of options (e.g. array('GROUP BY' => 'page_title')),
+ * @param array $options Associative array of options (e.g. [ 'GROUP BY' => 'page_title' ]),
* see Database::makeSelectOptions code for list of supported stuff
* @param array $join_conds Associative array of table join conditions (optional)
- * (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
+ * (e.g. [ 'page' => [ 'LEFT JOIN','page_latest=rev_id' ] ]
* @return string The SQL text
*/
public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
/**
* INSERT SELECT wrapper
- * $varMap must be an associative array of the form array( 'dest1' => 'source1', ...)
+ * $varMap must be an associative array of the form [ 'dest1' => 'source1', ... ]
* Source items may be literals rather than field names, but strings should
* be quoted with Database::addQuotes().
* @param string $destTable
protected $lagDetectionMethod;
/** @var array Method to detect slave lag */
protected $lagDetectionOptions = [];
+ /** @var bool bool Whether to use GTID methods */
+ protected $useGTIDs = false;
/** @var string|null */
private $serverVersion = null;
/**
* Additional $params include:
* - lagDetectionMethod : set to one of (Seconds_Behind_Master,pt-heartbeat).
- * pt-heartbeat assumes the table is at heartbeat.heartbeat
- * and uses UTC timestamps in the heartbeat.ts column.
- * (https://www.percona.com/doc/percona-toolkit/2.2/pt-heartbeat.html)
+ * pt-heartbeat assumes the table is at heartbeat.heartbeat
+ * and uses UTC timestamps in the heartbeat.ts column.
+ * (https://www.percona.com/doc/percona-toolkit/2.2/pt-heartbeat.html)
* - lagDetectionOptions : if using pt-heartbeat, this can be set to an array map to change
- * the default behavior. Normally, the heartbeat row with the server
- * ID of this server's master will be used. Set the "conds" field to
- * override the query conditions, e.g. ['shard' => 's1'].
+ * the default behavior. Normally, the heartbeat row with the server
+ * ID of this server's master will be used. Set the "conds" field to
+ * override the query conditions, e.g. ['shard' => 's1'].
+ * - useGTIDs : use GTID methods like MASTER_GTID_WAIT() when possible.
* @param array $params
*/
function __construct( array $params ) {
$this->lagDetectionOptions = isset( $params['lagDetectionOptions'] )
? $params['lagDetectionOptions']
: [];
+ $this->useGTIDs = !empty( $params['useGTIDs' ] );
}
/**
return 0; // already reached this point for sure
}
- # Commit any open transactions
+ // Commit any open transactions
$this->commit( __METHOD__, 'flush' );
- # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
- $encFile = $this->addQuotes( $pos->file );
- $encPos = intval( $pos->pos );
- $res = $this->doQuery( "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)" );
+ // Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
+ if ( $this->useGTIDs && $pos->gtids ) {
+ // Wait on the GTID set (MariaDB only)
+ $gtidArg = $this->addQuotes( implode( ',', $pos->gtids ) );
+ $res = $this->doQuery( "SELECT MASTER_GTID_WAIT($gtidArg, $timeout)" );
+ } else {
+ // Wait on the binlog coordinates
+ $encFile = $this->addQuotes( $pos->file );
+ $encPos = intval( $pos->pos );
+ $res = $this->doQuery( "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)" );
+ }
$row = $res ? $this->fetchRow( $res ) : false;
if ( !$row ) {
* @return MySQLMasterPos|bool
*/
function getSlavePos() {
- $res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
+ $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
$row = $this->fetchObject( $res );
if ( $row ) {
$pos = isset( $row->Exec_master_log_pos )
? $row->Exec_master_log_pos
: $row->Exec_Master_Log_Pos;
+ // Also fetch the last-applied GTID set (MariaDB)
+ if ( $this->useGTIDs ) {
+ $res = $this->query( "SHOW GLOBAL VARIABLES LIKE 'gtid_slave_pos'", __METHOD__ );
+ $gtidRow = $this->fetchObject( $res );
+ $gtidSet = $gtidRow ? $gtidRow->Value : '';
+ } else {
+ $gtidSet = '';
+ }
- return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos );
+ return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos, $gtidSet );
} else {
return false;
}
* @return MySQLMasterPos|bool
*/
function getMasterPos() {
- $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
+ $res = $this->query( 'SHOW MASTER STATUS', __METHOD__ );
$row = $this->fetchObject( $res );
if ( $row ) {
- return new MySQLMasterPos( $row->File, $row->Position );
+ // Also fetch the last-written GTID set (MariaDB)
+ if ( $this->useGTIDs ) {
+ $res = $this->query( "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_pos'", __METHOD__ );
+ $gtidRow = $this->fetchObject( $res );
+ $gtidSet = $gtidRow ? $gtidRow->Value : '';
+ } else {
+ $gtidSet = '';
+ }
+
+ return new MySQLMasterPos( $row->File, $row->Position, $gtidSet );
} else {
return false;
}
}
+ public function serverIsReadOnly() {
+ $res = $this->query( "SHOW GLOBAL VARIABLES LIKE 'read_only'", __METHOD__ );
+ $row = $this->fetchObject( $res );
+
+ return $row ? ( strtolower( $row->Value ) === 'on' ) : false;
+ }
+
/**
* @param string $index
* @return string
return $this->lastErrno() == 1205;
}
- /**
- * Determines if the last query error was something that should be dealt
- * with by pinging the connection and reissuing the query
- *
- * @return bool
- */
function wasErrorReissuable() {
return $this->lastErrno() == 2013 || $this->lastErrno() == 2006;
}
}
}
+/**
+ * DBMasterPos class for MySQL/MariaDB
+ *
+ * Note that master positions and sync logic here make some assumptions:
+ * - Binlog-based usage assumes single-source replication and non-hierarchical replication.
+ * - GTID-based usage allows getting/syncing with multi-source replication. It is assumed
+ * that GTID sets are complete (e.g. include all domains on the server).
+ */
class MySQLMasterPos implements DBMasterPos {
- /** @var string */
+ /** @var string Binlog file */
public $file;
- /** @var int Position */
+ /** @var int Binglog file position */
public $pos;
+ /** @var string[] GTID list */
+ public $gtids = [];
/** @var float UNIX timestamp */
public $asOfTime = 0.0;
- function __construct( $file, $pos ) {
+ /**
+ * @param string $file Binlog file name
+ * @param integer $pos Binlog position
+ * @param string $gtid Comma separated GTID set [optional]
+ */
+ function __construct( $file, $pos, $gtid = '' ) {
$this->file = $file;
$this->pos = $pos;
+ $this->gtids = array_map( 'trim', explode( ',', $gtid ) );
$this->asOfTime = microtime( true );
}
+ /**
+ * @return string <binlog file>/<position>, e.g db1034-bin.000976/843431247
+ */
+ function __toString() {
+ return "{$this->file}/{$this->pos}";
+ }
+
function asOfTime() {
return $this->asOfTime;
}
throw new InvalidArgumentException( "Position not an instance of " . __CLASS__ );
}
- $thisPos = $this->getCoordinates();
- $thatPos = $pos->getCoordinates();
+ // Prefer GTID comparisons, which work with multi-tier replication
+ $thisPosByDomain = $this->getGtidCoordinates();
+ $thatPosByDomain = $pos->getGtidCoordinates();
+ if ( $thisPosByDomain && $thatPosByDomain ) {
+ $reached = true;
+ // Check that this has positions GTE all of those in $pos for all domains in $pos
+ foreach ( $thatPosByDomain as $domain => $thatPos ) {
+ $thisPos = isset( $thisPosByDomain[$domain] ) ? $thisPosByDomain[$domain] : -1;
+ $reached = $reached && ( $thatPos <= $thisPos );
+ }
- return ( $thisPos && $thatPos && $thisPos >= $thatPos );
+ return $reached;
+ }
+
+ // Fallback to the binlog file comparisons
+ $thisBinPos = $this->getBinlogCoordinates();
+ $thatBinPos = $pos->getBinlogCoordinates();
+ if ( $thisBinPos && $thatBinPos && $thisBinPos['binlog'] === $thatBinPos['binlog'] ) {
+ return ( $thisBinPos['pos'] >= $thatBinPos['pos'] );
+ }
+
+ // Comparing totally different binlogs does not make sense
+ return false;
}
function channelsMatch( DBMasterPos $pos ) {
throw new InvalidArgumentException( "Position not an instance of " . __CLASS__ );
}
- $thisBinlog = $this->getBinlogName();
- $thatBinlog = $pos->getBinlogName();
+ // Prefer GTID comparisons, which work with multi-tier replication
+ $thisPosDomains = array_keys( $this->getGtidCoordinates() );
+ $thatPosDomains = array_keys( $pos->getGtidCoordinates() );
+ if ( $thisPosDomains && $thatPosDomains ) {
+ // Check that this has GTIDs for all domains in $pos
+ return !array_diff( $thatPosDomains, $thisPosDomains );
+ }
- return ( $thisBinlog !== false && $thisBinlog === $thatBinlog );
- }
+ // Fallback to the binlog file comparisons
+ $thisBinPos = $this->getBinlogCoordinates();
+ $thatBinPos = $pos->getBinlogCoordinates();
- function __toString() {
- // e.g db1034-bin.000976/843431247
- return "{$this->file}/{$this->pos}";
+ return ( $thisBinPos && $thatBinPos && $thisBinPos['binlog'] === $thatBinPos['binlog'] );
}
/**
- * @return string|bool
+ * @note: this returns false for multi-source replication GTID sets
+ * @see https://mariadb.com/kb/en/mariadb/gtid
+ * @see https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html
+ * @return array Map of (domain => integer position) or false
*/
- protected function getBinlogName() {
- $m = [];
- if ( preg_match( '!^(.+)\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
- return $m[1];
+ protected function getGtidCoordinates() {
+ $gtidInfos = [];
+ foreach ( $this->gtids as $gtid ) {
+ $m = [];
+ // MariaDB style: <domain>-<server id>-<sequence number>
+ if ( preg_match( '!^(\d+)-\d+-(\d+)$!', $gtid, $m ) ) {
+ $gtidInfos[(int)$m[1]] = (int)$m[2];
+ // MySQL style: <UUID domain>:<sequence number>
+ } elseif ( preg_match( '!^(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}):(\d+)$!', $gtid, $m ) ) {
+ $gtidInfos[$m[1]] = (int)$m[2];
+ } else {
+ $gtidInfos = [];
+ break; // unrecognized GTID
+ }
+
}
- return false;
+ return $gtidInfos;
}
/**
- * @return array|bool (int, int)
+ * @see http://dev.mysql.com/doc/refman/5.7/en/show-master-status.html
+ * @see http://dev.mysql.com/doc/refman/5.7/en/show-slave-status.html
+ * @return array|bool (binlog, (integer file number, integer position)) or false
*/
- protected function getCoordinates() {
+ protected function getBinlogCoordinates() {
$m = [];
- if ( preg_match( '!\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
- return [ (int)$m[1], (int)$m[2] ];
+ if ( preg_match( '!^(.+)\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
+ return [ 'binlog' => $m[1], 'pos' => [ (int)$m[2], (int)$m[3] ] ];
}
return false;
/**
* INSERT SELECT wrapper
- * $varMap must be an associative array of the form array( 'dest1' => 'source1', ...)
+ * $varMap must be an associative array of the form [ 'dest1' => 'source1', ... ]
* Source items may be literals rather then field names, but strings should
* be quoted with Database::addQuotes()
* $conds may be "*" to copy the whole table
* @ingroup Database
*/
interface IDatabase {
+ /* Constants to onTransactionResolution() callbacks */
+ const TRIGGER_IDLE = 1;
+ const TRIGGER_COMMIT = 2;
+ const TRIGGER_ROLLBACK = 3;
+
/**
* A string describing the current software version, and possibly
* other details in a user-friendly way. Will be listed on Special:Version, etc.
*
* Example:
* $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
- * $dbw->insert( 'page', array( 'page_id' => $id ) );
+ * $dbw->insert( 'page', [ 'page_id' => $id ] );
* $id = $dbw->insertId();
*
* @return int
* May be either an array of table names, or a single string holding a table
* name. If an array is given, table aliases can be specified, for example:
*
- * array( 'a' => 'user' )
+ * [ 'a' => 'user' ]
*
* This includes the user table in the query, with the alias "a" available
* for use in field names (e.g. a.user_name).
* can be complete fragments of SQL, for direct inclusion into the SELECT
* query. If an array is given, field aliases can be specified, for example:
*
- * array( 'maxrev' => 'MAX(rev_id)' )
+ * [ 'maxrev' => 'MAX(rev_id)' ]
*
* This includes an expression with the alias "maxrev" in the query.
*
* including them in the array as a string value with a numeric key, for
* example:
*
- * array( 'FOR UPDATE' )
+ * [ 'FOR UPDATE' ]
*
* The supported options are:
*
* an SQL fragment, or an array where the string keys are equality and the
* numeric keys are SQL fragments all AND'd together. For example:
*
- * array( 'page' => array( 'LEFT JOIN', 'page_latest=rev_id' ) )
+ * [ 'page' => [ 'LEFT JOIN', 'page_latest=rev_id' ] ]
*
* @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
* with no rows in it will be returned. If there was a query error, a
* The keys on each level may be either integers or strings.
*
* @param array $data Organized as 2-d
- * array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
+ * [ baseKeyVal => [ subKeyVal => [ignored], ... ], ... ]
* @param string $baseKey Field name to match the base-level keys to (eg 'pl_namespace')
* @param string $subKey Field name to match the sub-level keys to (eg 'pl_title')
* @return string|bool SQL fragment, or false if no items in array
* Example: $dbr->buildLike( 'My_page_title/', $dbr->anyString() ) returns
* a LIKE clause that searches for subpages of 'My page title'.
* Alternatively:
- * $pattern = array( 'My_page_title/', $dbr->anyString() );
+ * $pattern = [ 'My_page_title/', $dbr->anyString() ];
* $query .= $dbr->buildLike( $pattern );
*
* @since 1.16
* to include in a join.
*
* @param array $varMap Must be an associative array of the form
- * array( 'dest1' => 'source1', ...). Source items may be literals
+ * [ 'dest1' => 'source1', ... ]. Source items may be literals
* rather than field names, but strings should be quoted with
* IDatabase::addQuotes()
*
/**
* Determines how long the server has been up
- * STUB
*
* @return int
*/
/**
* Determines if the last failure was due to a deadlock
- * STUB
*
* @return bool
*/
/**
* Determines if the last failure was due to a lock timeout
- * STUB
*
* @return bool
*/
public function wasLockTimeout();
/**
- * Determines if the last query error was something that should be dealt
- * with by pinging the connection and reissuing the query.
- * STUB
+ * Determines if the last query error was due to a dropped connection and should
+ * be dealt with by pinging the connection and reissuing the query.
*
* @return bool
*/
/**
* Determines if the last failure was due to the database being read-only.
- * STUB
*
* @return bool
*/
public function getMasterPos();
/**
- * Run an anonymous function as soon as the current transaction commits or rolls back.
+ * @return bool Whether the DB is marked as read-only server-side
+ * @since 1.28
+ */
+ public function serverIsReadOnly();
+
+ /**
+ * Run a callback as soon as the current transaction commits or rolls back.
* An error is thrown if no transaction is pending. Queries in the function will run in
* AUTO-COMMIT mode unless there are begin() calls. Callbacks must commit any transactions
* that they begin.
*
* This is useful for combining cooperative locks and DB transactions.
*
+ * The callback takes one argument:
+ * How the transaction ended (IDatabase::TRIGGER_COMMIT or IDatabase::TRIGGER_ROLLBACK)
+ *
* @param callable $callback
* @return mixed
* @since 1.28
public function onTransactionResolution( callable $callback );
/**
- * Run an anonymous function as soon as there is no transaction pending.
+ * Run a callback as soon as there is no transaction pending.
* If there is a transaction and it is rolled back, then the callback is cancelled.
* Queries in the function will run in AUTO-COMMIT mode unless there are begin() calls.
* Callbacks must commit any transactions that they begin.
*
* Updates will execute in the order they were enqueued.
*
+ * The callback takes one argument:
+ * How the transaction ended (IDatabase::TRIGGER_COMMIT or IDatabase::TRIGGER_IDLE)
+ *
* @param callable $callback
* @since 1.20
*/
public function onTransactionIdle( callable $callback );
/**
- * Run an anonymous function before the current transaction commits or now if there is none.
+ * Run a callback before the current transaction commits or now if there is none.
* If there is a transaction and it is rolled back, then the callback is cancelled.
- * Callbacks must not start nor commit any transactions.
+ * Callbacks must not start nor commit any transactions. If no transaction is active,
+ * then a transaction will wrap the callback.
*
* This is useful for updates that easily cause deadlocks if locks are held too long
* but where atomicity is strongly desired for these updates and some related updates.
* @ingroup Database
*/
abstract class LBFactory implements DestructibleService {
-
/** @var ChronologyProtector */
protected $chronProt;
-
/** @var TransactionProfiler */
protected $trxProfiler;
-
/** @var LoggerInterface */
- protected $logger;
+ protected $trxLogger;
+ /** @var BagOStuff */
+ protected $srvCache;
+ /** @var WANObjectCache */
+ protected $wanCache;
/** @var string|bool Reason all LBs are read-only or false if not */
protected $readOnlyReason = false;
/**
* Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
* @param array $conf
+ * @TODO: inject objects via dependency framework
*/
public function __construct( array $conf ) {
if ( isset( $conf['readOnlyReason'] ) && is_string( $conf['readOnlyReason'] ) ) {
$this->readOnlyReason = $conf['readOnlyReason'];
}
-
$this->chronProt = $this->newChronologyProtector();
$this->trxProfiler = Profiler::instance()->getTransactionProfiler();
- $this->logger = LoggerFactory::getInstance( 'DBTransaction' );
+ // Use APC/memcached style caching, but avoids loops with CACHE_DB (T141804)
+ $cache = ObjectCache::getLocalServerInstance();
+ if ( $cache->getQoS( $cache::ATTR_EMULATION ) > $cache::QOS_EMULATION_SQL ) {
+ $this->srvCache = $cache;
+ } else {
+ $this->srvCache = new EmptyBagOStuff();
+ }
+ $wCache = ObjectCache::getMainWANInstance();
+ if ( $wCache->getQoS( $wCache::ATTR_EMULATION ) > $wCache::QOS_EMULATION_SQL ) {
+ $this->wanCache = $wCache;
+ } else {
+ $this->wanCache = WANObjectCache::newEmpty();
+ }
+ $this->trxLogger = LoggerFactory::getInstance( 'DBTransaction' );
}
/**
* 1. To commit changes to the masters.
* 2. To release the snapshot on all connections, master and slave.
* @param string $fname Caller name
+ * @param array $options Options map:
+ * - maxWriteDuration: abort if more than this much time was spent in write queries
*/
- public function commitAll( $fname = __METHOD__ ) {
- $this->logMultiDbTransaction();
-
- $start = microtime( true );
+ public function commitAll( $fname = __METHOD__, array $options = [] ) {
+ $this->commitMasterChanges( $fname, $options );
$this->forEachLBCallMethod( 'commitAll', [ $fname ] );
- $timeMs = 1000 * ( microtime( true ) - $start );
-
- RequestContext::getMain()->getStats()->timing( "db.commit-all", $timeMs );
}
/**
* - maxWriteDuration: abort if more than this much time was spent in write queries
*/
public function commitMasterChanges( $fname = __METHOD__, array $options = [] ) {
- $limit = isset( $options['maxWriteDuration'] ) ? $options['maxWriteDuration'] : 0;
-
- $this->logMultiDbTransaction();
- $this->forEachLB( function ( LoadBalancer $lb ) use ( $limit ) {
- $lb->forEachOpenConnection( function ( IDatabase $db ) use ( $limit ) {
- $time = $db->pendingWriteQueryDuration();
- if ( $limit > 0 && $time > $limit ) {
- throw new DBTransactionError(
- $db,
- wfMessage( 'transaction-duration-limit-exceeded', $time, $limit )->text()
- );
- }
- } );
- } );
-
+ // Perform all pre-commit callbacks, aborting on failure
+ $this->forEachLBCallMethod( 'runMasterPreCommitCallbacks' );
+ // Perform all pre-commit checks, aborting on failure
+ $this->forEachLBCallMethod( 'approveMasterChanges', [ $options ] );
+ // Log the DBs and methods involved in multi-DB transactions
+ $this->logIfMultiDbTransaction();
+ // Actually perform the commit on all master DB connections
+ $this->forEachLBCallMethod( 'commitMasterChanges', [ $fname ] );
+ // Run all post-commit callbacks
+ $this->forEachLBCallMethod( 'runMasterPostCommitCallbacks' );
+ // Commit any dangling DBO_TRX transactions from callbacks on one DB to another DB
$this->forEachLBCallMethod( 'commitMasterChanges', [ $fname ] );
}
/**
* Log query info if multi DB transactions are going to be committed now
*/
- private function logMultiDbTransaction() {
+ private function logIfMultiDbTransaction() {
$callersByDB = [];
$this->forEachLB( function ( LoadBalancer $lb ) use ( &$callersByDB ) {
$masterName = $lb->getServerName( $lb->getWriterIndex() );
foreach ( $callersByDB as $db => $callers ) {
$msg .= "$db: " . implode( '; ', $callers ) . "\n";
}
- $this->logger->info( $msg );
+ $this->trxLogger->info( $msg );
}
}
*
* sectionLoads A 2-d map. For each section, gives a map of server names to
* load ratios. For example:
- * array(
- * 'section1' => array(
+ * [
+ * 'section1' => [
* 'db1' => 100,
* 'db2' => 100
- * )
- * )
+ * ]
+ * ]
*
* serverTemplate A server info associative array as documented for $wgDBservers.
* The host, hostName and load entries will be overridden.
*
* groupLoadsBySection A 3-d map giving server load ratios for each section and group.
* For example:
- * array(
- * 'section1' => array(
- * 'group1' => array(
+ * [
+ * 'section1' => [
+ * 'group1' => [
* 'db1' => 100,
* 'db2' => 100
- * )
- * )
- * )
+ * ]
+ * ]
+ * ]
*
* groupLoadsByDB A 3-d map giving server load ratios by DB name.
*
'servers' => $this->makeServerArray( $template, $loads, $groupLoads ),
'loadMonitor' => $this->loadMonitorClass,
'readOnlyReason' => $readOnlyReason,
- 'trxProfiler' => $this->trxProfiler
+ 'trxProfiler' => $this->trxProfiler,
+ 'srvCache' => $this->srvCache,
+ 'wanCache' => $this->wanCache
] );
}
] ];
}
- return new LoadBalancer( [
- 'servers' => $servers,
- 'loadMonitor' => $this->loadMonitorClass,
- 'readOnlyReason' => $this->readOnlyReason,
- 'trxProfiler' => $this->trxProfiler
- ] );
+ return $this->newLoadBalancer( $servers );
}
/**
throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
}
- return new LoadBalancer( [
- 'servers' => $wgExternalServers[$cluster],
- 'loadMonitor' => $this->loadMonitorClass,
- 'readOnlyReason' => $this->readOnlyReason,
- 'trxProfiler' => $this->trxProfiler
- ] );
+ return $this->newLoadBalancer( $wgExternalServers[$cluster] );
}
/**
return $this->extLBs[$cluster];
}
+ private function newLoadBalancer( array $servers ) {
+ return new LoadBalancer( [
+ 'servers' => $servers,
+ 'loadMonitor' => $this->loadMonitorClass,
+ 'readOnlyReason' => $this->readOnlyReason,
+ 'trxProfiler' => $this->trxProfiler,
+ 'srvCache' => $this->srvCache,
+ 'wanCache' => $this->wanCache
+ ] );
+ }
+
/**
* Execute a function for each tracked load balancer
* The callback is called with the load balancer as the first parameter,
$this->lb = new LoadBalancerSingle( [
'readOnlyReason' => $this->readOnlyReason,
- 'trxProfiler' => $this->trxProfiler
+ 'trxProfiler' => $this->trxProfiler,
+ 'srvCache' => $this->srvCache,
+ 'wanCache' => $this->wanCache
] + $conf );
}
'load' => 1,
]
],
- 'trxProfiler' => $this->trxProfiler
+ 'trxProfiler' => isset( $params['trxProfiler'] ) ? $params['trxProfiler'] : null,
+ 'srvCache' => isset( $params['srvCache'] ) ? $params['srvCache'] : null,
+ 'wanCache' => isset( $params['wanCache'] ) ? $params['wanCache'] : null
] );
if ( isset( $params['readOnlyReason'] ) ) {
private $mLoadMonitor;
/** @var BagOStuff */
private $srvCache;
+ /** @var WANObjectCache */
+ private $wanCache;
/** @var bool|DatabaseBase Database connection that caused a problem */
private $mErrorConnection;
const MAX_LAG = 10;
/** @var integer Max time to wait for a slave to catch up (e.g. ChronologyProtector) */
const POS_WAIT_TIMEOUT = 10;
+ /** @var integer Seconds to cache master server read-only status */
+ const TTL_CACHE_READONLY = 5;
/**
* @var boolean
* - servers : Required. Array of server info structures.
* - loadMonitor : Name of a class used to fetch server lag and load.
* - readOnlyReason : Reason the master DB is read-only if so [optional]
+ * - srvCache : BagOStuff object [optional]
+ * - wanCache : WANObjectCache object [optional]
* @throws MWException
*/
public function __construct( array $params ) {
}
}
- $this->srvCache = ObjectCache::getLocalServerInstance();
-
+ if ( isset( $params['srvCache'] ) ) {
+ $this->srvCache = $params['srvCache'];
+ } else {
+ $this->srvCache = new EmptyBagOStuff();
+ }
+ if ( isset( $params['wanCache'] ) ) {
+ $this->wanCache = $params['wanCache'];
+ } else {
+ $this->wanCache = WANObjectCache::newEmpty();
+ }
if ( isset( $params['trxProfiler'] ) ) {
$this->trxProfiler = $params['trxProfiler'];
} else {
if ( $masterOnly ) {
# Make master-requested DB handles inherit any read-only mode setting
- $conn->setLBInfo( 'readOnlyReason', $this->getReadOnlyReason( $wiki ) );
+ $conn->setLBInfo( 'readOnlyReason', $this->getReadOnlyReason( $wiki, $conn ) );
}
return $conn;
/**
* This can happen in code like:
* foreach ( $dbs as $db ) {
- * $conn = $lb->getConnection( DB_SLAVE, array(), $db );
+ * $conn = $lb->getConnection( DB_SLAVE, [], $db );
* ...
* $lb->reuseConnection( $conn );
* }
* Close all open connections
*/
public function closeAll() {
- foreach ( $this->mConns as $conns2 ) {
- foreach ( $conns2 as $conns3 ) {
- /** @var DatabaseBase $conn */
- foreach ( $conns3 as $conn ) {
- $conn->close();
- }
- }
- }
+ $this->forEachOpenConnection( function ( DatabaseBase $conn ) {
+ $conn->close();
+ } );
+
$this->mConns = [
'local' => [],
'foreignFree' => [],
* @param string $fname Caller name
*/
public function commitAll( $fname = __METHOD__ ) {
- foreach ( $this->mConns as $conns2 ) {
- foreach ( $conns2 as $conns3 ) {
- /** @var DatabaseBase[] $conns3 */
- foreach ( $conns3 as $conn ) {
- if ( $conn->trxLevel() ) {
- $conn->commit( $fname, 'flush' );
- }
- }
+ $this->forEachOpenConnection( function ( DatabaseBase $conn ) use ( $fname ) {
+ $conn->commit( $fname, 'flush' );
+ } );
+ }
+
+ /**
+ * Perform all pre-commit callbacks that remain part of the atomic transactions
+ * and disable any post-commit callbacks until runMasterPostCommitCallbacks()
+ * @since 1.28
+ */
+ public function runMasterPreCommitCallbacks() {
+ $this->forEachOpenMasterConnection( function ( DatabaseBase $conn ) {
+ // Any error will cause all DB transactions to be rolled back together.
+ $conn->runOnTransactionPreCommitCallbacks();
+ // Defer post-commit callbacks until COMMIT finishes for all DBs.
+ $conn->setPostCommitCallbackSupression( true );
+ } );
+ }
+
+ /**
+ * Perform all pre-commit checks for things like replication safety
+ * @param array $options Includes:
+ * - maxWriteDuration : max write query duration time in seconds
+ * @throws DBTransactionError
+ * @since 1.28
+ */
+ public function approveMasterChanges( array $options ) {
+ $limit = isset( $options['maxWriteDuration'] ) ? $options['maxWriteDuration'] : 0;
+ $this->forEachOpenMasterConnection( function ( DatabaseBase $conn ) use ( $limit ) {
+ // Assert that the time to replicate the transaction will be sane.
+ // If this fails, then all DB transactions will be rollback back together.
+ $time = $conn->pendingWriteQueryDuration();
+ if ( $limit > 0 && $time > $limit ) {
+ throw new DBTransactionError(
+ $conn,
+ wfMessage( 'transaction-duration-limit-exceeded', $time, $limit )->text()
+ );
}
- }
+ } );
}
/**
- * Issue COMMIT only on master, only if queries were done on connection
+ * Issue COMMIT on all master connections where writes where done
* @param string $fname Caller name
*/
public function commitMasterChanges( $fname = __METHOD__ ) {
- $masterIndex = $this->getWriterIndex();
- foreach ( $this->mConns as $conns2 ) {
- if ( empty( $conns2[$masterIndex] ) ) {
- continue;
+ $this->forEachOpenMasterConnection( function ( DatabaseBase $conn ) use ( $fname ) {
+ if ( $conn->writesOrCallbacksPending() ) {
+ $conn->commit( $fname, 'flush' );
}
- /** @var DatabaseBase $conn */
- foreach ( $conns2[$masterIndex] as $conn ) {
- if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
- $conn->commit( $fname, 'flush' );
- }
- }
- }
+ } );
+ }
+
+ /**
+ * Issue all pending post-commit callbacks
+ * @since 1.28
+ */
+ public function runMasterPostCommitCallbacks() {
+ $this->forEachOpenMasterConnection( function ( DatabaseBase $db ) {
+ $db->setPostCommitCallbackSupression( false );
+ $db->runOnTransactionIdleCallbacks( IDatabase::TRIGGER_COMMIT );
+ } );
}
/**
/**
* @note This method may trigger a DB connection if not yet done
* @param string|bool $wiki Wiki ID, or false for the current wiki
+ * @param DatabaseBase|null DB master connection; used to avoid loops [optional]
* @return string|bool Reason the master is read-only or false if it is not
* @since 1.27
*/
- public function getReadOnlyReason( $wiki = false ) {
+ public function getReadOnlyReason( $wiki = false, DatabaseBase $conn = null ) {
if ( $this->readOnlyReason !== false ) {
return $this->readOnlyReason;
} elseif ( $this->getLaggedSlaveMode( $wiki ) ) {
return 'The database has been automatically locked ' .
'while the slave database servers catch up to the master.';
}
+ } elseif ( $this->masterRunningReadOnly( $wiki, $conn ) ) {
+ return 'The database master is running in read-only mode.';
}
return false;
}
+ /**
+ * @param string $wiki Wiki ID, or false for the current wiki
+ * @param DatabaseBase|null DB master connectionl used to avoid loops [optional]
+ * @return bool
+ */
+ private function masterRunningReadOnly( $wiki, DatabaseBase $conn = null ) {
+ $cache = $this->wanCache;
+ $masterServer = $this->getServerName( $this->getWriterIndex() );
+
+ return (bool)$cache->getWithSetCallback(
+ $cache->makeGlobalKey( __CLASS__, 'server-read-only', $masterServer ),
+ self::TTL_CACHE_READONLY,
+ function () use ( $wiki, $conn ) {
+ $this->trxProfiler->setSilenced( true );
+ try {
+ $dbw = $conn ?: $this->getConnection( DB_MASTER, [], $wiki );
+ $readOnly = (int)$dbw->serverIsReadOnly();
+ } catch ( DBError $e ) {
+ $readOnly = 0;
+ }
+ $this->trxProfiler->setSilenced( false );
+ return $readOnly;
+ },
+ [ 'pcTTL' => $cache::TTL_PROC_LONG, 'busyValue' => 0 ]
+ );
+ }
+
/**
* Disables/enables lag checks
* @param null|bool $mode
*/
public function pingAll() {
$success = true;
- foreach ( $this->mConns as $conns2 ) {
- foreach ( $conns2 as $conns3 ) {
- /** @var DatabaseBase[] $conns3 */
- foreach ( $conns3 as $conn ) {
- if ( !$conn->ping() ) {
- $success = false;
- }
- }
+ $this->forEachOpenConnection( function ( DatabaseBase $conn ) use ( &$success ) {
+ if ( !$conn->ping() ) {
+ $success = false;
}
- }
+ } );
return $success;
}
* @param array $params
*/
public function forEachOpenConnection( $callback, array $params = [] ) {
- foreach ( $this->mConns as $conns2 ) {
- foreach ( $conns2 as $conns3 ) {
- foreach ( $conns3 as $conn ) {
+ foreach ( $this->mConns as $connsByServer ) {
+ foreach ( $connsByServer as $serverConns ) {
+ foreach ( $serverConns as $conn ) {
+ $mergedParams = array_merge( [ $conn ], $params );
+ call_user_func_array( $callback, $mergedParams );
+ }
+ }
+ }
+ }
+
+ /**
+ * Call a function with each open connection object to a master
+ * @param callable $callback
+ * @param array $params
+ * @since 1.28
+ */
+ public function forEachOpenMasterConnection( $callback, array $params = [] ) {
+ $masterIndex = $this->getWriterIndex();
+ foreach ( $this->mConns as $connsByServer ) {
+ if ( isset( $connsByServer[$masterIndex] ) ) {
+ /** @var DatabaseBase $conn */
+ foreach ( $connsByServer[$masterIndex] as $conn ) {
$mergedParams = array_merge( [ $conn ], $params );
call_user_func_array( $callback, $mergedParams );
}
* Deferrable Update for closure/callback updates via IDatabase::doAtomicSection()
* @since 1.27
*/
-class AtomicSectionUpdate implements DeferrableUpdate {
+class AtomicSectionUpdate implements DeferrableUpdate, DeferrableCallback {
/** @var IDatabase */
private $dbw;
/** @var string */
private $fname;
- /** @var Closure|callable */
+ /** @var callable */
private $callback;
/**
* @param IDatabase $dbw
* @param string $fname Caller name (usually __METHOD__)
* @param callable $callback
- * @throws InvalidArgumentException
* @see IDatabase::doAtomicSection()
*/
- public function __construct( IDatabase $dbw, $fname, $callback ) {
+ public function __construct( IDatabase $dbw, $fname, callable $callback ) {
$this->dbw = $dbw;
$this->fname = $fname;
- if ( !is_callable( $callback ) ) {
- throw new InvalidArgumentException( 'Not a valid callback/closure!' );
- }
$this->callback = $callback;
+
+ if ( $this->dbw->trxLevel() ) {
+ $this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ] );
+ }
}
public function doUpdate() {
- $this->dbw->doAtomicSection( $this->fname, $this->callback );
+ if ( $this->callback ) {
+ $this->dbw->doAtomicSection( $this->fname, $this->callback );
+ }
+ }
+
+ public function cancelOnRollback( $trigger ) {
+ if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
+ $this->callback = null;
+ }
+ }
+
+ public function getOrigin() {
+ return $this->fname;
}
}
--- /dev/null
+<?php
+
+/**
+ * Deferrable Update for closure/callback updates that should use auto-commit mode
+ * @since 1.28
+ */
+class AutoCommitUpdate implements DeferrableUpdate, DeferrableCallback {
+ /** @var IDatabase */
+ private $dbw;
+ /** @var string */
+ private $fname;
+ /** @var callable */
+ private $callback;
+
+ /**
+ * @param IDatabase $dbw
+ * @param string $fname Caller name (usually __METHOD__)
+ * @param callable $callback Callback that takes (IDatabase, method name string)
+ */
+ public function __construct( IDatabase $dbw, $fname, callable $callback ) {
+ $this->dbw = $dbw;
+ $this->fname = $fname;
+ $this->callback = $callback;
+
+ if ( $this->dbw->trxLevel() ) {
+ $this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ] );
+ }
+ }
+
+ public function doUpdate() {
+ if ( !$this->callback ) {
+ return;
+ }
+
+ $autoTrx = $this->dbw->getFlag( DBO_TRX );
+ $this->dbw->clearFlag( DBO_TRX );
+ try {
+ /** @var Exception $e */
+ $e = null;
+ call_user_func_array( $this->callback, [ $this->dbw, $this->fname ] );
+ } catch ( Exception $e ) {
+ }
+ if ( $autoTrx ) {
+ $this->dbw->setFlag( DBO_TRX );
+ }
+ if ( $e ) {
+ throw $e;
+ }
+ }
+
+ public function cancelOnRollback( $trigger ) {
+ if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
+ $this->callback = null;
+ }
+ }
+
+ public function getOrigin() {
+ return $this->fname;
+ }
+}
+++ /dev/null
-<?php
-
-/**
- * Deferrable Update for closure/callback
- */
-class MWCallableUpdate implements DeferrableUpdate {
- /** @var Closure|callable */
- private $callback;
-
- /**
- * @param callable $callback
- * @throws InvalidArgumentException
- */
- public function __construct( $callback ) {
- if ( !is_callable( $callback ) ) {
- throw new InvalidArgumentException( 'Not a valid callback/closure!' );
- }
- $this->callback = $callback;
- }
-
- public function doUpdate() {
- call_user_func( $this->callback );
- }
-}
/**
* @param Title $title
* @return CdnCacheUpdate
- * @deprecated 1.27
+ * @deprecated since 1.27
*/
public static function newSimplePurge( Title $title ) {
return new CdnCacheUpdate( $title->getCdnUrls() );
--- /dev/null
+<?php
+
+/**
+ * Callback wrapper that has an originating method
+ *
+ * @since 1.28
+ */
+interface DeferrableCallback {
+ /**
+ * @return string Originating method name
+ */
+ function getOrigin();
+}
}
/**
- * Add a callable update. In a lot of cases, we just need a callback/closure,
+ * Add a callable update. In a lot of cases, we just need a callback/closure,
* defining a new DeferrableUpdate object is not necessary
*
* @see MWCallableUpdate::__construct()
* @param integer $type DeferredUpdates constant (PRESEND or POSTSEND) (since 1.27)
*/
public static function addCallableUpdate( $callable, $type = self::POSTSEND ) {
- self::addUpdate( new MWCallableUpdate( $callable ), $type );
+ self::addUpdate( new MWCallableUpdate( $callable, wfGetCaller() ), $type );
}
/**
} else {
$otherUpdates[] = $update;
}
- $stats->increment( 'deferred_updates.' . $method . '.' . get_class( $update ) );
+
+ $name = $update instanceof DeferrableCallback
+ ? get_class( $update ) . '-' . $update->getOrigin()
+ : get_class( $update );
+ $stats->increment( 'deferred_updates.' . $method . '.' . $name );
}
// Delegate DataUpdate execution to the DataUpdate class
// This handles the case when updates have to batched into several COMMITs.
$scopedLock = LinksUpdate::acquirePageLock( $this->mDb, $id );
+ $title = $this->page->getTitle();
+
// Delete restrictions for it
$this->mDb->delete( 'page_restrictions', [ 'pr_page' => $id ], __METHOD__ );
}
}
+ // Refresh the category table entry if it seems to have no pages. Check
+ // master for the most up-to-date cat_pages count.
+ if ( $title->getNamespace() === NS_CATEGORY ) {
+ $row = $this->mDb->selectRow(
+ 'category',
+ [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
+ [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 0' ],
+ __METHOD__
+ );
+ if ( $row ) {
+ $cat = Category::newFromRow( $row, $title )->refreshCounts();
+ }
+ }
+
// If using cascading deletes, we can skip some explicit deletes
if ( !$this->mDb->cascadingDeletes() ) {
// Delete outgoing links
// If using cleanup triggers, we can skip some manual deletes
if ( !$this->mDb->cleanupTriggers() ) {
- $title = $this->page->getTitle();
// Find recentchanges entries to clean up...
$rcIdsForTitle = $this->mDb->selectFieldValues(
'recentchanges',
}
}
- $this->mDb->onTransactionIdle( function() use ( &$scopedLock ) {
- // Release the lock *after* the final COMMIT for correctness
- ScopedCallback::consume( $scopedLock );
- } );
+ // Commit and release the lock
+ ScopedCallback::consume( $scopedLock );
}
private function batchDeleteByPK( $table, array $conds, array $pk, $bSize ) {
*
* @param IDatabase $dbw
* @param integer $pageId
- * @return ScopedCallback|null Returns null on failure
+ * @param string $why One of (job, atomicity)
+ * @return ScopedCallback
* @throws RuntimeException
* @since 1.27
*/
- public static function acquirePageLock( IDatabase $dbw, $pageId ) {
- $scopedLock = $dbw->getScopedLockAndFlush(
- "LinksUpdate:pageid:$pageId",
- __METHOD__,
- 15
- );
+ public static function acquirePageLock( IDatabase $dbw, $pageId, $why = 'atomicity' ) {
+ $key = "LinksUpdate:$why:pageid:$pageId";
+ $scopedLock = $dbw->getScopedLockAndFlush( $key, __METHOD__, 15 );
if ( !$scopedLock ) {
- throw new RuntimeException( "Could not acquire lock on page #$pageId." );
+ throw new RuntimeException( "Could not acquire lock '$key'." );
}
return $scopedLock;
--- /dev/null
+<?php
+
+/**
+ * Deferrable Update for closure/callback
+ */
+class MWCallableUpdate implements DeferrableUpdate, DeferrableCallback {
+ /** @var callable */
+ private $callback;
+ /** @var string */
+ private $fname;
+
+ /**
+ * @param callable $callback
+ * @param string $fname Calling method
+ */
+ public function __construct( callable $callback, $fname = 'unknown' ) {
+ $this->callback = $callback;
+ $this->fname = $fname;
+ }
+
+ public function doUpdate() {
+ call_user_func( $this->callback );
+ }
+
+ public function getOrigin() {
+ return $this->fname;
+ }
+}
$this->doUpdatePendingDeltas();
} else {
// Need a separate transaction because this a global lock
- wfGetDB( DB_MASTER )->onTransactionIdle( [ $this, 'tryDBUpdateInternal' ] );
+ DeferredUpdates::addCallableUpdate( [ $this, 'tryDBUpdateInternal' ] );
}
}
* @ingroup DifferenceEngine
*/
-/**
- * Constant to indicate diff cache compatibility.
- * Bump this when changing the diff formatting in a way that
- * fixes important bugs or such to force cached diff views to
- * clear.
- */
+// Deprecated, use class constant instead
define( 'MW_DIFF_VERSION', '1.11a' );
/**
* @ingroup DifferenceEngine
*/
class DifferenceEngine extends ContextSource {
+ /**
+ * Constant to indicate diff cache compatibility.
+ * Bump this when changing the diff formatting in a way that
+ * fixes important bugs or such to force cached diff views to
+ * clear.
+ */
+ const DIFF_VERSION = MW_DIFF_VERSION;
/** @var int */
public $mOldid;
}
public function showDiffPage( $diffOnly = false ) {
-
# Allow frames except in certain special cases
$out = $this->getOutput();
$out->allowClickjacking();
$out->setRobotPolicy( 'noindex,nofollow' );
+ // Allow extensions to add any extra output here
+ Hooks::run( 'DifferenceEngineShowDiffPage', [ $out ] );
+
if ( !$this->loadRevisionData() ) {
$this->showMissingRevision();
$out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) );
$samePage = true;
$oldHeader = '';
+ // Allow extensions to change the $oldHeader variable
+ Hooks::run( 'DifferenceEngineOldHeaderNoOldRev', [ &$oldHeader ] );
} else {
Hooks::run( 'DiffViewHeader', [ $this, $this->mOldRev, $this->mNewRev ] );
'<div id="mw-diff-otitle5">' . $oldChangeTags[0] . '</div>' .
'<div id="mw-diff-otitle4">' . $prevlink . '</div>';
+ // Allow extensions to change the $oldHeader variable
+ Hooks::run( 'DifferenceEngineOldHeader', [ $this, &$oldHeader, $prevlink, $oldminor,
+ $diffOnly, $ldel, $this->unhide ] );
+
if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
$deleted = true; // old revisions text is hidden
if ( $this->mOldRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
'<div id="mw-diff-ntitle5">' . $newChangeTags[0] . '</div>' .
'<div id="mw-diff-ntitle4">' . $nextlink . $this->markPatrolledLink() . '</div>';
+ // Allow extensions to change the $newHeader variable
+ Hooks::run( 'DifferenceEngineNewHeader', [ $this, &$newHeader, $formattedRevisionTools,
+ $nextlink, $rollback, $newminor, $diffOnly, $rdel, $this->unhide ] );
+
if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
$deleted = true; // new revisions text is hidden
if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
'token' => $linkInfo['token'],
]
) . ']</span>';
+ // Allow extensions to change the markpatrolled link
+ Hooks::run( 'DifferenceEngineMarkPatrolledLink', [ $this,
+ &$this->mMarkPatrolledLink, $linkInfo['rcid'], $linkInfo['token'] ] );
}
}
return $this->mMarkPatrolledLink;
// If the user could patrol this it already would be patrolled
$rcid = 0;
}
+
+ // Allow extensions to possibly change the rcid here
+ // For example the rcid might be set to zero due to the user
+ // being the same as the performer of the change but an extension
+ // might still want to show it under certain conditions
+ Hooks::run( 'DifferenceEngineMarkPatrolledRCID', [ &$rcid, $this, $change, $user ] );
+
// Build the link
if ( $rcid ) {
$this->getOutput()->preventClickjacking();
+ $this->getOutput()->addModuleStyles( 'mediawiki.page.patrol' );
if ( $wgEnableAPI && $wgEnableWriteAPI
&& $user->isAllowed( 'writeapi' )
) {
# WikiPage::getParserOutput() should not return false, but just in case
if ( $parserOutput ) {
- $out->addParserOutput( $parserOutput );
+ // Allow extensions to change parser output here
+ if ( Hooks::run( 'DifferenceEngineRenderRevisionAddParserOutput', [ $this, $out, $parserOutput, $wikiPage ] ) ) {
+ $out->addParserOutput( $parserOutput );
+ }
}
}
}
# @codingStandardsIgnoreEnd
- # Add redundant patrol link on bottom...
- $out->addHTML( $this->markPatrolledLink() );
-
+ // Allow extensions to optionally not show the final patrolled link
+ if ( Hooks::run( 'DifferenceEngineRenderRevisionShowFinalPatrolLink' ) ) {
+ # Add redundant patrol link on bottom...
+ $out->addHTML( $this->markPatrolledLink() );
+ }
}
protected function getParserOutput( WikiPage $page, Revision $rev ) {
* @return bool
*/
public function showDiff( $otitle, $ntitle, $notice = '' ) {
+ // Allow extensions to affect the output here
+ Hooks::run( 'DifferenceEngineShowDiff', [ $this ] );
+
$diff = $this->getDiff( $otitle, $ntitle, $notice );
if ( $diff === false ) {
$this->showMissingRevision();
if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev
&& $this->mOldRev->getId() == $this->mNewRev->getId() )
) {
- return '';
+ if ( Hooks::run( 'DifferenceEngineShowEmptyOldContent', [ $this ] ) ) {
+ return '';
+ }
}
// Cacheable?
$key = false;
throw new MWException( 'mOldid and mNewid must be set to get diff cache key.' );
}
- return wfMemcKey( 'diff', 'version', MW_DIFF_VERSION,
+ return wfMemcKey( 'diff', 'version', self::DIFF_VERSION,
'oldid', $this->mOldid, 'newid', $this->mNewid );
}
return $this->generateTextDiffBody( $otext, $ntext );
}
- /**
- * Generate a diff, no caching
- *
- * @param string $otext Old text, must be already segmented
- * @param string $ntext New text, must be already segmented
- *
- * @return bool|string
- * @deprecated since 1.21, use generateContentDiffBody() instead!
- */
- public function generateDiffBody( $otext, $ntext ) {
- ContentHandler::deprecated( __METHOD__, "1.21" );
-
- return $this->generateTextDiffBody( $otext, $ntext );
- }
-
/**
* Generate a diff, no caching
*
*
* @return string
*/
- public function getOutput() {
+ public function __toString() {
return $this->output;
}
}
/**
* Stream the file at a storage path in the backend.
+ *
* If the file does not exists, an HTTP 404 error will be given.
* Appropriate HTTP headers (Status, Content-Type, Content-Length)
* will be sent if streaming began, while none will be sent otherwise.
* Implementations should flush the output buffer before sending data.
*
* @param array $params Parameters include:
- * - src : source storage path
- * - headers : list of additional HTTP headers to send on success
- * - latest : use the latest available data
+ * - src : source storage path
+ * - headers : list of additional HTTP headers to send if the file exists
+ * - options : HTTP request header map with lower case keys (since 1.28). Supports:
+ * range : format is "bytes=(\d*-\d*)"
+ * if-modified-since : format is an HTTP date
+ * - headless : only include the body (and headers from "headers") (since 1.28)
+ * - latest : use the latest available data
+ * - allowOB : preserve any output buffers (since 1.28)
* @return Status
*/
abstract public function streamFile( array $params );
$ps = Profiler::instance()->scopedProfileIn( __METHOD__ . "-{$this->name}" );
$status = Status::newGood();
- $info = $this->getFileStat( $params );
- if ( !$info ) { // let StreamFile handle the 404
- $status->fatal( 'backend-fail-notexists', $params['src'] );
- }
-
- // Set output buffer and HTTP headers for stream
- $extraHeaders = isset( $params['headers'] ) ? $params['headers'] : [];
- $res = StreamFile::prepareForStream( $params['src'], $info, $extraHeaders );
- if ( $res == StreamFile::NOT_MODIFIED ) {
- // do nothing; client cache is up to date
- } elseif ( $res == StreamFile::READY_STREAM ) {
- $status = $this->doStreamFile( $params );
- if ( !$status->isOK() ) {
- // Per bug 41113, nasty things can happen if bad cache entries get
- // stuck in cache. It's also possible that this error can come up
- // with simple race conditions. Clear out the stat cache to be safe.
- $this->clearCache( [ $params['src'] ] );
- $this->deleteFileCache( $params['src'] );
- trigger_error( "Bad stat cache or race condition for file {$params['src']}." );
- }
- } else {
+ // Always set some fields for subclass convenience
+ $params['options'] = isset( $params['options'] ) ? $params['options'] : [];
+ $params['headers'] = isset( $params['headers'] ) ? $params['headers'] : [];
+
+ // Don't stream it out as text/html if there was a PHP error
+ if ( ( empty( $params['headless'] ) || $params['headers'] ) && headers_sent() ) {
+ print "Headers already sent, terminating.\n";
$status->fatal( 'backend-fail-stream', $params['src'] );
+ return $status;
}
+ $status->merge( $this->doStreamFile( $params ) );
+
return $status;
}
protected function doStreamFile( array $params ) {
$status = Status::newGood();
+ $flags = 0;
+ $flags |= !empty( $params['headless'] ) ? StreamFile::STREAM_HEADLESS : 0;
+ $flags |= !empty( $params['allowOB'] ) ? StreamFile::STREAM_ALLOW_OB : 0;
+
$fsFile = $this->getLocalReference( $params );
- if ( !$fsFile ) {
- $status->fatal( 'backend-fail-stream', $params['src'] );
- } elseif ( !readfile( $fsFile->getPath() ) ) {
+
+ if ( $fsFile ) {
+ $res = StreamFile::stream( $fsFile->getPath(),
+ $params['headers'], true, $params['options'], $flags );
+ } else {
+ $res = false;
+ StreamFile::send404Message( $params['src'], $flags );
+ }
+
+ if ( !$res ) {
$status->fatal( 'backend-fail-stream', $params['src'] );
}
return $tmpFiles;
}
- protected function doStreamFile( array $params ) {
- $status = Status::newGood();
-
- $src = $this->resolveHashKey( $params['src'] );
- if ( $src === null || !isset( $this->files[$src] ) ) {
- $status->fatal( 'backend-fail-stream', $params['src'] );
-
- return $status;
- }
-
- print $this->files[$src]['data'];
-
- return $status;
- }
-
protected function doDirectoryExists( $container, $dir, array $params ) {
$prefix = rtrim( "$container/$dir", '/' ) . '/';
foreach ( $this->files as $path => $data ) {
protected function doStreamFile( array $params ) {
$status = Status::newGood();
+ $flags = !empty( $params['headless'] ) ? StreamFile::STREAM_HEADLESS : 0;
+
list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
if ( $srcRel === null ) {
+ StreamFile::send404Message( $params['src'], $flags );
$status->fatal( 'backend-fail-invalidpath', $params['src'] );
+
+ return $status;
}
$auth = $this->getAuthentication();
if ( !$auth || !is_array( $this->getContainerStat( $srcCont ) ) ) {
+ StreamFile::send404Message( $params['src'], $flags );
$status->fatal( 'backend-fail-stream', $params['src'] );
return $status;
}
- $handle = fopen( 'php://output', 'wb' );
+ // If "headers" is set, we only want to send them if the file is there.
+ // Do not bother checking if the file exists if headers are not set though.
+ if ( $params['headers'] && !$this->fileExists( $params ) ) {
+ StreamFile::send404Message( $params['src'], $flags );
+ $status->fatal( 'backend-fail-stream', $params['src'] );
+ return $status;
+ }
+
+ // Send the requested additional headers
+ foreach ( $params['headers'] as $header ) {
+ header( $header ); // aways send
+ }
+
+ if ( empty( $params['allowOB'] ) ) {
+ // Cancel output buffering and gzipping if set
+ wfResetOutputBuffers();
+ }
+
+ $handle = fopen( 'php://output', 'wb' );
list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( [
'method' => 'GET',
'url' => $this->storageUrl( $auth, $srcCont, $srcRel ),
'headers' => $this->authTokenHeaders( $auth )
- + $this->headersFromParams( $params ),
+ + $this->headersFromParams( $params ) + $params['options'],
'stream' => $handle,
+ 'flags' => [ 'relayResponseHeaders' => empty( $params['headless'] ) ]
] );
if ( $rcode >= 200 && $rcode <= 299 ) {
// good
} elseif ( $rcode === 404 ) {
$status->fatal( 'backend-fail-stream', $params['src'] );
+ // Per bug 41113, nasty things can happen if bad cache entries get
+ // stuck in cache. It's also possible that this error can come up
+ // with simple race conditions. Clear out the stat cache to be safe.
+ $this->clearCache( [ $params['src'] ] );
+ $this->deleteFileCache( $params['src'] );
} else {
$this->onError( $status, __METHOD__, $params, $rerr, $rcode, $rdesc );
}
* @since 1.19
*/
abstract class DBLockManager extends QuorumLockManager {
- /** @var array Map of DB names to server config */
+ /** @var array[] Map of DB names to server config */
protected $dbServers; // (DB name => server config array)
/** @var BagOStuff */
protected $statusCache;
protected $safeDelay; // integer number of seconds
protected $session = 0; // random integer
- /** @var array Map Database connections (DB name => Database) */
+ /** @var IDatabase[] Map Database connections (DB name => Database) */
protected $conns = [];
/**
return $status;
}
+ abstract protected function doGetLocksOnServer( $lockSrv, array $paths, $type );
+
protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
return Status::newGood();
}
if ( !isset( $this->conns[$lockDb] ) ) {
$db = null;
if ( $lockDb === 'localDBMaster' ) {
- $lb = wfGetLBFactory()->getMainLB( $this->domain );
- $db = $lb->getConnection( DB_MASTER, [], $this->domain );
+ $db = $this->getLocalLB()->getConnection( DB_MASTER, [], $this->domain );
} elseif ( isset( $this->dbServers[$lockDb] ) ) {
$config = $this->dbServers[$lockDb];
$db = DatabaseBase::factory( $config['type'], $config );
return $this->conns[$lockDb];
}
+ /**
+ * @return LoadBalancer
+ */
+ protected function getLocalLB() {
+ return wfGetLBFactory()->getMainLB( $this->domain );
+ }
+
/**
* Do additional initialization for new lock DB connection
*
self::LOCK_EX => self::LOCK_EX
];
- /**
- * @param string $lockDb
- * @param IDatabase $db
- */
+ protected function getLocalLB() {
+ // Use a separate connection so releaseAllLocks() doesn't rollback the main trx
+ return wfGetLBFactory()->newMainLB( $this->domain );
+ }
+
protected function initConnection( $lockDb, IDatabase $db ) {
# Let this transaction see lock rows from other transactions
$db->query( "SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;" );
*
* @param string $virtualUrl
* @param array $headers Additional HTTP headers to send on success
+ * @param array $optHeaders HTTP request headers (if-modified-since, range, ...)
* @return Status
* @since 1.27
*/
- public function streamFileWithStatus( $virtualUrl, $headers = [] ) {
+ public function streamFileWithStatus( $virtualUrl, $headers = [], $optHeaders = [] ) {
$path = $this->resolveToStoragePath( $virtualUrl );
- $params = [ 'src' => $path, 'headers' => $headers ];
+ $params = [ 'src' => $path, 'headers' => $headers, 'options' => $optHeaders ];
return $this->backend->streamFile( $params );
}
/**
* Generic operation result class for FileRepo-related operations
* @ingroup FileRepo
- * @deprecated 1.25
+ * @deprecated since 1.25
*/
class FileRepoStatus extends Status {
}
* @param array $params An associative array of handler-specific parameters.
* Typical keys are width, height and page.
* @param int $flags A bitfield, may contain self::RENDER_NOW to force rendering
- * @return MediaTransformOutput|bool False on failure
+ * @return ThumbnailImage|MediaTransformOutput|bool False on failure
*/
function transform( $params, $flags = 0 ) {
global $wgThumbnailEpoch;
/**
* Creates a temp FS file with the same extension and the thumbnail
* @param string $thumbPath Thumbnail path
- * @return TempFSFile
+ * @return TempFSFile|null
*/
protected function makeTransformTmpFile( $thumbPath ) {
$thumbExt = FileBackend::extensionFromPath( $thumbPath );
// @note: higher than IDBAccessObject constants
const LOAD_ALL = 16; // integer; load all the lazy fields too (like metadata)
+ const ATOMIC_SECTION_LOCK = 'LocalFile::lockingTransaction';
+
/**
* Create a LocalFile from a title
* Do not call this except from inside a repo class.
# Do some cache purges after final commit so that:
# a) Changes are more likely to be seen post-purge
# b) They won't cause rollback of the log publish/update above
- $that = $this;
- $dbw->onTransactionIdle( function () use (
- $that, $reupload, $wikiPage, $newPageContent, $comment, $user, $logEntry, $logId, $descId, $tags
- ) {
- # Update memcache after the commit
- $that->invalidateCache();
-
- $updateLogPage = false;
- if ( $newPageContent ) {
- # New file page; create the description page.
- # There's already a log entry, so don't make a second RC entry
- # CDN and file cache for the description page are purged by doEditContent.
- $status = $wikiPage->doEditContent(
- $newPageContent,
- $comment,
- EDIT_NEW | EDIT_SUPPRESS_RC,
- false,
- $user
- );
-
- if ( isset( $status->value['revision'] ) ) {
- // Associate new page revision id
- $logEntry->setAssociatedRevId( $status->value['revision']->getId() );
- }
- // This relies on the resetArticleID() call in WikiPage::insertOn(),
- // which is triggered on $descTitle by doEditContent() above.
- if ( isset( $status->value['revision'] ) ) {
- /** @var $rev Revision */
- $rev = $status->value['revision'];
- $updateLogPage = $rev->getPage();
- }
- } else {
- # Existing file page: invalidate description page cache
- $wikiPage->getTitle()->invalidateCache();
- $wikiPage->getTitle()->purgeSquid();
- # Allow the new file version to be patrolled from the page footer
- Article::purgePatrolFooterCache( $descId );
- }
-
- # Update associated rev id. This should be done by $logEntry->insert() earlier,
- # but setAssociatedRevId() wasn't called at that point yet...
- $logParams = $logEntry->getParameters();
- $logParams['associated_rev_id'] = $logEntry->getAssociatedRevId();
- $update = [ 'log_params' => LogEntryBase::makeParamBlob( $logParams ) ];
- if ( $updateLogPage ) {
- # Also log page, in case where we just created it above
- $update['log_page'] = $updateLogPage;
- }
- $that->getRepo()->getMasterDB()->update(
- 'logging',
- $update,
- [ 'log_id' => $logId ],
- __METHOD__
- );
- $that->getRepo()->getMasterDB()->insert(
- 'log_search',
- [
- 'ls_field' => 'associated_rev_id',
- 'ls_value' => $logEntry->getAssociatedRevId(),
- 'ls_log_id' => $logId,
- ],
- __METHOD__
- );
+ DeferredUpdates::addUpdate(
+ new AutoCommitUpdate(
+ $dbw,
+ __METHOD__,
+ function () use (
+ $reupload, $wikiPage, $newPageContent, $comment, $user,
+ $logEntry, $logId, $descId, $tags
+ ) {
+ # Update memcache after the commit
+ $this->invalidateCache();
+
+ $updateLogPage = false;
+ if ( $newPageContent ) {
+ # New file page; create the description page.
+ # There's already a log entry, so don't make a second RC entry
+ # CDN and file cache for the description page are purged by doEditContent.
+ $status = $wikiPage->doEditContent(
+ $newPageContent,
+ $comment,
+ EDIT_NEW | EDIT_SUPPRESS_RC,
+ false,
+ $user
+ );
+
+ if ( isset( $status->value['revision'] ) ) {
+ // Associate new page revision id
+ $logEntry->setAssociatedRevId( $status->value['revision']->getId() );
+ }
+ // This relies on the resetArticleID() call in WikiPage::insertOn(),
+ // which is triggered on $descTitle by doEditContent() above.
+ if ( isset( $status->value['revision'] ) ) {
+ /** @var $rev Revision */
+ $rev = $status->value['revision'];
+ $updateLogPage = $rev->getPage();
+ }
+ } else {
+ # Existing file page: invalidate description page cache
+ $wikiPage->getTitle()->invalidateCache();
+ $wikiPage->getTitle()->purgeSquid();
+ # Allow the new file version to be patrolled from the page footer
+ Article::purgePatrolFooterCache( $descId );
+ }
- # Add change tags, if any
- if ( $tags ) {
- $logEntry->setTags( $tags );
- }
+ # Update associated rev id. This should be done by $logEntry->insert() earlier,
+ # but setAssociatedRevId() wasn't called at that point yet...
+ $logParams = $logEntry->getParameters();
+ $logParams['associated_rev_id'] = $logEntry->getAssociatedRevId();
+ $update = [ 'log_params' => LogEntryBase::makeParamBlob( $logParams ) ];
+ if ( $updateLogPage ) {
+ # Also log page, in case where we just created it above
+ $update['log_page'] = $updateLogPage;
+ }
+ $this->getRepo()->getMasterDB()->update(
+ 'logging',
+ $update,
+ [ 'log_id' => $logId ],
+ __METHOD__
+ );
+ $this->getRepo()->getMasterDB()->insert(
+ 'log_search',
+ [
+ 'ls_field' => 'associated_rev_id',
+ 'ls_value' => $logEntry->getAssociatedRevId(),
+ 'ls_log_id' => $logId,
+ ],
+ __METHOD__
+ );
+
+ # Add change tags, if any
+ if ( $tags ) {
+ $logEntry->setTags( $tags );
+ }
- # Uploads can be patrolled
- $logEntry->setIsPatrollable( true );
+ # Uploads can be patrolled
+ $logEntry->setIsPatrollable( true );
- # Now that the log entry is up-to-date, make an RC entry.
- $logEntry->publish( $logId );
+ # Now that the log entry is up-to-date, make an RC entry.
+ $logEntry->publish( $logId );
- # Run hook for other updates (typically more cache purging)
- Hooks::run( 'FileUpload', [ $that, $reupload, !$newPageContent ] );
+ # Run hook for other updates (typically more cache purging)
+ Hooks::run( 'FileUpload', [ $this, $reupload, !$newPageContent ] );
- if ( $reupload ) {
- # Delete old thumbnails
- $that->purgeThumbnails();
- # Remove the old file from the CDN cache
- DeferredUpdates::addUpdate(
- new CdnCacheUpdate( [ $that->getUrl() ] ),
- DeferredUpdates::PRESEND
- );
- } else {
- # Update backlink pages pointing to this title if created
- LinksUpdate::queueRecursiveJobsForTable( $that->getTitle(), 'imagelinks' );
- }
- } );
+ if ( $reupload ) {
+ # Delete old thumbnails
+ $this->purgeThumbnails();
+ # Remove the old file from the CDN cache
+ DeferredUpdates::addUpdate(
+ new CdnCacheUpdate( [ $this->getUrl() ] ),
+ DeferredUpdates::PRESEND
+ );
+ } else {
+ # Update backlink pages pointing to this title if created
+ LinksUpdate::queueRecursiveJobsForTable( $this->getTitle(), 'imagelinks' );
+ }
+ }
+ ),
+ DeferredUpdates::PRESEND
+ );
if ( !$reupload ) {
# This is a new file, so update the image count
// Purge the source and target files...
$oldTitleFile = wfLocalFile( $this->title );
$newTitleFile = wfLocalFile( $target );
- // Hack: the lock()/unlock() pair is nested in a transaction so the locking is not
- // tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside.
- $this->getRepo()->getMasterDB()->onTransactionIdle(
- function () use ( $oldTitleFile, $newTitleFile, $archiveNames ) {
- $oldTitleFile->purgeEverything();
- foreach ( $archiveNames as $archiveName ) {
- $oldTitleFile->purgeOldThumbnails( $archiveName );
+ // To avoid slow purges in the transaction, move them outside...
+ DeferredUpdates::addUpdate(
+ new AutoCommitUpdate(
+ $this->getRepo()->getMasterDB(),
+ __METHOD__,
+ function () use ( $oldTitleFile, $newTitleFile, $archiveNames ) {
+ $oldTitleFile->purgeEverything();
+ foreach ( $archiveNames as $archiveName ) {
+ $oldTitleFile->purgeOldThumbnails( $archiveName );
+ }
+ $newTitleFile->purgeEverything();
}
- $newTitleFile->purgeEverything();
- }
+ ),
+ DeferredUpdates::PRESEND
);
if ( $status->isOK() ) {
$this->lock(); // begin
$batch->addCurrent();
- # Get old version relative paths
+ // Get old version relative paths
$archiveNames = $batch->addOlds();
$status = $batch->execute();
$this->unlock(); // done
DeferredUpdates::addUpdate( SiteStatsUpdate::factory( [ 'images' => -1 ] ) );
}
- // Hack: the lock()/unlock() pair is nested in a transaction so the locking is not
- // tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside.
- $that = $this;
- $this->getRepo()->getMasterDB()->onTransactionIdle(
- function () use ( $that, $archiveNames ) {
- $that->purgeEverything();
- foreach ( $archiveNames as $archiveName ) {
- $that->purgeOldThumbnails( $archiveName );
+ // To avoid slow purges in the transaction, move them outside...
+ DeferredUpdates::addUpdate(
+ new AutoCommitUpdate(
+ $this->getRepo()->getMasterDB(),
+ __METHOD__,
+ function () use ( $archiveNames ) {
+ $this->purgeEverything();
+ foreach ( $archiveNames as $archiveName ) {
+ $this->purgeOldThumbnails( $archiveName );
+ }
}
- }
+ ),
+ DeferredUpdates::PRESEND
);
// Purge the CDN
}
/**
- * Start a transaction and lock the image for update
- * Increments a reference counter if the lock is already held
+ * @return Status
+ * @since 1.28
+ */
+ public function acquireFileLock() {
+ return $this->getRepo()->getBackend()->lockFiles(
+ [ $this->getPath() ], LockManager::LOCK_EX, 10
+ );
+ }
+
+ /**
+ * @return Status
+ * @since 1.28
+ */
+ public function releaseFileLock() {
+ return $this->getRepo()->getBackend()->unlockFiles(
+ [ $this->getPath() ], LockManager::LOCK_EX
+ );
+ }
+
+ /**
+ * Start an atomic DB section and lock the image for update
+ * or increments a reference counter if the lock is already held
+ *
+ * This method should not be used outside of LocalFile/LocalFile*Batch
+ *
* @throws LocalFileLockError Throws an error if the lock was not acquired
* @return bool Whether the file lock owns/spawned the DB transaction
*/
- function lock() {
+ public function lock() {
if ( !$this->locked ) {
$logger = LoggerFactory::getInstance( 'LocalFile' );
+
$dbw = $this->repo->getMasterDB();
- if ( !$dbw->trxLevel() ) {
- $dbw->begin( __METHOD__ );
- $this->lockedOwnTrx = true;
- }
+ $makesTransaction = !$dbw->trxLevel();
+ $dbw->startAtomic( self::ATOMIC_SECTION_LOCK );
// Bug 54736: use simple lock to handle when the file does not exist.
// SELECT FOR UPDATE prevents changes, not other SELECTs with FOR UPDATE.
// Also, that would cause contention on INSERT of similarly named rows.
- $backend = $this->getRepo()->getBackend();
- $lockPaths = [ $this->getPath() ]; // represents all versions of the file
- $status = $backend->lockFiles( $lockPaths, LockManager::LOCK_EX, 10 );
+ $status = $this->acquireFileLock(); // represents all versions of the file
if ( !$status->isGood() ) {
- if ( $this->lockedOwnTrx ) {
- $dbw->rollback( __METHOD__ );
- }
+ $dbw->endAtomic( self::ATOMIC_SECTION_LOCK );
$logger->warning( "Failed to lock '{file}'", [ 'file' => $this->name ] );
throw new LocalFileLockError( $status );
}
// Release the lock *after* commit to avoid row-level contention.
// Make sure it triggers on rollback() as well as commit() (T132921).
- $dbw->onTransactionResolution( function () use ( $backend, $lockPaths, $logger ) {
- $status = $backend->unlockFiles( $lockPaths, LockManager::LOCK_EX );
+ $dbw->onTransactionResolution( function () use ( $logger ) {
+ $status = $this->releaseFileLock();
if ( !$status->isGood() ) {
$logger->error( "Failed to unlock '{file}'", [ 'file' => $this->name ] );
}
} );
+ // Callers might care if the SELECT snapshot is safely fresh
+ $this->lockedOwnTrx = $makesTransaction;
}
$this->locked++;
}
/**
- * Decrement the lock reference count. If the reference count is reduced to zero, commits
- * the transaction and thereby releases the image lock.
+ * Decrement the lock reference count and end the atomic section if it reaches zero
+ *
+ * This method should not be used outside of LocalFile/LocalFile*Batch
+ *
+ * The commit and loc release will happen when no atomic sections are active, which
+ * may happen immediately or at some point after calling this
*/
- function unlock() {
+ public function unlock() {
if ( $this->locked ) {
--$this->locked;
- if ( !$this->locked && $this->lockedOwnTrx ) {
+ if ( !$this->locked ) {
$dbw = $this->repo->getMasterDB();
- $dbw->commit( __METHOD__ );
+ $dbw->endAtomic( self::ATOMIC_SECTION_LOCK );
$this->lockedOwnTrx = false;
}
}
}
- /**
- * Roll back the DB transaction and mark the image unlocked
- */
- function unlockAndRollback() {
- $this->locked = false;
- $dbw = $this->repo->getMasterDB();
- $dbw->rollback( __METHOD__ );
- $this->lockedOwnTrx = false;
- }
-
/**
* @return Status
*/
}
}
- // Lock the filearchive rows so that the files don't get deleted by a cleanup operation
- // We acquire this lock by running the inserts now, before the file operations.
- // This potentially has poor lock contention characteristics -- an alternative
- // scheme would be to insert stub filearchive entries with no fa_name and commit
- // them in a separate transaction, then run the file ops, then update the fa_name fields.
- $this->doDBInserts();
-
if ( !$repo->hasSha1Storage() ) {
// Removes non-existent file from the batch, so we don't get errors.
// This also handles files in the 'deleted' zone deleted via revision deletion.
// Execute the file deletion batch
$status = $this->file->repo->deleteBatch( $this->deletionBatch );
-
if ( !$status->isGood() ) {
$this->status->merge( $status );
}
}
if ( !$this->status->isOK() ) {
- // Critical file deletion error
- // Roll back inserts, release lock and abort
- // TODO: delete the defunct filearchive rows if we are using a non-transactional DB
- $this->file->unlockAndRollback();
+ // Critical file deletion error; abort
+ $this->file->unlock();
return $this->status;
}
+ // Copy the image/oldimage rows to filearchive
+ $this->doDBInserts();
// Delete image/oldimage rows
$this->doDBDeletes();
public function execute() {
$repo = $this->file->repo;
$status = $repo->newGood();
+ $destFile = wfLocalFile( $this->target );
+
+ $this->file->lock(); // begin
+ $destFile->lock(); // quickly fail if destination is not available
$triplets = $this->getMoveTriplets();
$checkStatus = $this->removeNonexistentFiles( $triplets );
if ( !$checkStatus->isGood() ) {
- $status->merge( $checkStatus );
+ $destFile->unlock();
+ $this->file->unlock();
+ $status->merge( $checkStatus ); // couldn't talk to file backend
return $status;
}
$triplets = $checkStatus->value;
- $destFile = wfLocalFile( $this->target );
- $this->file->lock(); // begin
- $destFile->lock(); // quickly fail if destination is not available
- // Rename the file versions metadata in the DB.
- // This implicitly locks the destination file, which avoids race conditions.
- // If we moved the files from A -> C before DB updates, another process could
- // move files from B -> C at this point, causing storeBatch() to fail and thus
- // cleanupTarget() to trigger. It would delete the C files and cause data loss.
- $statusDb = $this->doDBUpdates();
+ // Verify the file versions metadata in the DB.
+ $statusDb = $this->verifyDBUpdates();
if ( !$statusDb->isGood() ) {
$destFile->unlock();
- $this->file->unlockAndRollback();
+ $this->file->unlock();
$statusDb->ok = false;
return $statusDb;
}
- wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: " .
- "{$statusDb->successCount} successes, {$statusDb->failCount} failures" );
if ( !$repo->hasSha1Storage() ) {
// Copy the files into their new location.
// Delete any files copied over (while the destination is still locked)
$this->cleanupTarget( $triplets );
$destFile->unlock();
- $this->file->unlockAndRollback(); // unlocks the destination
+ $this->file->unlock();
wfDebugLog( 'imagemove', "Error in moving files: "
. $statusMove->getWikiText( false, false, 'en' ) );
$statusMove->ok = false;
$status->merge( $statusMove );
}
+ // Rename the file versions metadata in the DB.
+ $this->doDBUpdates();
+
+ wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: " .
+ "{$statusDb->successCount} successes, {$statusDb->failCount} failures" );
+
$destFile->unlock();
$this->file->unlock(); // done
}
/**
- * Do the database updates and return a new FileRepoStatus indicating how
- * many rows where updated.
+ * Verify the database updates and return a new FileRepoStatus indicating how
+ * many rows would be updated.
*
* @return FileRepoStatus
*/
- protected function doDBUpdates() {
+ protected function verifyDBUpdates() {
$repo = $this->file->repo;
$status = $repo->newGood();
$dbw = $this->db;
- // Update current image
- $dbw->update(
+ $hasCurrent = $dbw->selectField(
'image',
- [ 'img_name' => $this->newName ],
+ '1',
[ 'img_name' => $this->oldName ],
- __METHOD__
+ __METHOD__,
+ [ 'FOR UPDATE' ]
+ );
+ $oldRowCount = $dbw->selectField(
+ 'oldimage',
+ 'COUNT(*)',
+ [ 'oi_name' => $this->oldName ],
+ __METHOD__,
+ [ 'FOR UPDATE' ]
);
- if ( $dbw->affectedRows() ) {
+ if ( $hasCurrent ) {
$status->successCount++;
} else {
$status->failCount++;
- $status->fatal( 'imageinvalidfilename' );
-
- return $status;
}
+ $status->successCount += $oldRowCount;
+ // Bug 34934: oldCount is based on files that actually exist.
+ // There may be more DB rows than such files, in which case $affected
+ // can be greater than $total. We use max() to avoid negatives here.
+ $status->failCount += max( 0, $this->oldCount - $oldRowCount );
+ if ( $status->failCount ) {
+ $status->error( 'imageinvalidfilename' );
+ }
+
+ return $status;
+ }
+
+ /**
+ * Do the database updates and return a new FileRepoStatus indicating how
+ * many rows where updated.
+ */
+ protected function doDBUpdates() {
+ $dbw = $this->db;
+ // Update current image
+ $dbw->update(
+ 'image',
+ [ 'img_name' => $this->newName ],
+ [ 'img_name' => $this->oldName ],
+ __METHOD__
+ );
// Update old images
$dbw->update(
'oldimage',
[ 'oi_name' => $this->oldName ],
__METHOD__
);
-
- $affected = $dbw->affectedRows();
- $total = $this->oldCount;
- $status->successCount += $affected;
- // Bug 34934: $total is based on files that actually exist.
- // There may be more DB rows than such files, in which case $affected
- // can be greater than $total. We use max() to avoid negatives here.
- $status->failCount += max( 0, $total - $affected );
- if ( $status->failCount ) {
- $status->error( 'imageinvalidfilename' );
- }
-
- return $status;
}
/**
// Preloaded into LinkCache above
Linker::linkKnown(
$nt,
- htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) )
- ) . "<br />\n" :
+ htmlspecialchars(
+ $this->mCaptionLength !== true ?
+ $lang->truncate( $nt->getText(), $this->mCaptionLength ) :
+ $nt->getText()
+ ),
+ [
+ 'class' => 'galleryfilename' .
+ ( $this->mCaptionLength === true ? ' galleryfilename-truncate' : '' )
+ ]
+ ) . "\n" :
'';
$galleryText = $textlink . $text . $fileSize;
+++ /dev/null
-<?php
-
-class HTMLApiField extends HTMLFormField {
- public function getTableRow( $value ) {
- return '';
- }
-
- public function getDiv( $value ) {
- return $this->getTableRow( $value );
- }
-
- public function getRaw( $value ) {
- return $this->getTableRow( $value );
- }
-
- public function getInputHTML( $value ) {
- return '';
- }
-
- public function hasVisibleOutput() {
- return false;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * Text field for selecting a value from a large list of possible values, with
- * auto-completion and optionally with a select dropdown for selecting common
- * options.
- *
- * HTMLComboboxField implements most of the same functionality and should be
- * used instead, if possible.
- *
- * If one of 'options-messages', 'options', or 'options-message' is provided
- * and non-empty, the select dropdown will be shown. An 'other' key will be
- * appended using message 'htmlform-selectorother-other' if not already
- * present.
- *
- * Besides the parameters recognized by HTMLTextField, the following are
- * recognized:
- * options-messages - As for HTMLSelectField
- * options - As for HTMLSelectField
- * options-message - As for HTMLSelectField
- * autocomplete - Associative array mapping display text to values.
- * autocomplete-messages - Like autocomplete, but keys are message names.
- * require-match - Boolean, if true the value must be in the options or the
- * autocomplete.
- * other-message - Message to use instead of htmlform-selectorother-other for
- * the 'other' message.
- * other - Raw text to use for the 'other' message
- */
-class HTMLAutoCompleteSelectField extends HTMLTextField {
- protected $autocomplete = [];
-
- function __construct( $params ) {
- $params += [
- 'require-match' => false,
- ];
-
- parent::__construct( $params );
-
- if ( array_key_exists( 'autocomplete-messages', $this->mParams ) ) {
- foreach ( $this->mParams['autocomplete-messages'] as $key => $value ) {
- $key = $this->msg( $key )->plain();
- $this->autocomplete[$key] = strval( $value );
- }
- } elseif ( array_key_exists( 'autocomplete', $this->mParams ) ) {
- foreach ( $this->mParams['autocomplete'] as $key => $value ) {
- $this->autocomplete[$key] = strval( $value );
- }
- }
- if ( !is_array( $this->autocomplete ) || !$this->autocomplete ) {
- throw new MWException( 'HTMLAutoCompleteSelectField called without any autocompletions' );
- }
-
- $this->getOptions();
- if ( $this->mOptions && !in_array( 'other', $this->mOptions, true ) ) {
- if ( isset( $params['other-message'] ) ) {
- $msg = $this->getMessage( $params['other-message'] )->text();
- } elseif ( isset( $params['other'] ) ) {
- $msg = $params['other'];
- } else {
- $msg = wfMessage( 'htmlform-selectorother-other' )->text();
- }
- $this->mOptions[$msg] = 'other';
- }
- }
-
- function loadDataFromRequest( $request ) {
- if ( $request->getCheck( $this->mName ) ) {
- $val = $request->getText( $this->mName . '-select', 'other' );
-
- if ( $val === 'other' ) {
- $val = $request->getText( $this->mName );
- if ( isset( $this->autocomplete[$val] ) ) {
- $val = $this->autocomplete[$val];
- }
- }
-
- return $val;
- } else {
- return $this->getDefault();
- }
- }
-
- function validate( $value, $alldata ) {
- $p = parent::validate( $value, $alldata );
-
- if ( $p !== true ) {
- return $p;
- }
-
- $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
-
- if ( in_array( strval( $value ), $validOptions, true ) ) {
- return true;
- } elseif ( in_array( strval( $value ), $this->autocomplete, true ) ) {
- return true;
- } elseif ( $this->mParams['require-match'] ) {
- return $this->msg( 'htmlform-select-badoption' )->parse();
- }
-
- return true;
- }
-
- // FIXME Ewww, this shouldn't be adding any attributes not requested in $list :(
- public function getAttributes( array $list ) {
- $attribs = [
- 'type' => 'text',
- 'data-autocomplete' => FormatJson::encode( array_keys( $this->autocomplete ) ),
- ] + parent::getAttributes( $list );
-
- if ( $this->getOptions() ) {
- $attribs['data-hide-if'] = FormatJson::encode(
- [ '!==', $this->mName . '-select', 'other' ]
- );
- }
-
- return $attribs;
- }
-
- function getInputHTML( $value ) {
- $oldClass = $this->mClass;
- $this->mClass = (array)$this->mClass;
-
- $valInSelect = false;
- $ret = '';
-
- if ( $this->getOptions() ) {
- if ( $value !== false ) {
- $value = strval( $value );
- $valInSelect = in_array(
- $value, HTMLFormField::flattenOptions( $this->getOptions() ), true
- );
- }
-
- $selected = $valInSelect ? $value : 'other';
- $select = new XmlSelect( $this->mName . '-select', $this->mID . '-select', $selected );
- $select->addOptions( $this->getOptions() );
- $select->setAttribute( 'class', 'mw-htmlform-select-or-other' );
-
- if ( !empty( $this->mParams['disabled'] ) ) {
- $select->setAttribute( 'disabled', 'disabled' );
- }
-
- if ( isset( $this->mParams['tabindex'] ) ) {
- $select->setAttribute( 'tabindex', $this->mParams['tabindex'] );
- }
-
- $ret = $select->getHTML() . "<br />\n";
-
- $this->mClass[] = 'mw-htmlform-hide-if';
- }
-
- if ( $valInSelect ) {
- $value = '';
- } else {
- $key = array_search( strval( $value ), $this->autocomplete, true );
- if ( $key !== false ) {
- $value = $key;
- }
- }
-
- $this->mClass[] = 'mw-htmlform-autocomplete';
- $ret .= parent::getInputHTML( $valInSelect ? '' : $value );
- $this->mClass = $oldClass;
-
- return $ret;
- }
-
- /**
- * Get the OOUI version of this input.
- * @param string $value
- * @return false
- */
- function getInputOOUI( $value ) {
- // To be implemented, for now override the function from HTMLTextField
- return false;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * Adds a generic button inline to the form. Does not do anything, you must add
- * click handling code in JavaScript. Use a HTMLSubmitField if you merely
- * wish to add a submit button to a form.
- *
- * Additional recognized configuration parameters include:
- * - flags: OOUI flags for the button, see OOUI\FlaggedElement
- * - buttonlabel-message: Message to use for the button display text, instead
- * of the value from 'default'. Overrides 'buttonlabel' and 'buttonlabel-raw'.
- * - buttonlabel: Text to display for the button display text, instead
- * of the value from 'default'. Overrides 'buttonlabel-raw'.
- * - buttonlabel-raw: HTMLto display for the button display text, instead
- * of the value from 'default'.
- *
- * Note that the buttonlabel parameters are not supported on IE6 and IE7 due to
- * bugs in those browsers. If detected, they will be served buttons using the
- * value of 'default' as the button label.
- *
- * @since 1.22
- */
-class HTMLButtonField extends HTMLFormField {
- protected $buttonType = 'button';
- protected $buttonLabel = null;
-
- /** @var array $mFlags Flags to add to OOUI Button widget */
- protected $mFlags = [];
-
- public function __construct( $info ) {
- $info['nodata'] = true;
- if ( isset( $info['flags'] ) ) {
- $this->mFlags = $info['flags'];
- }
-
- # Generate the label from a message, if possible
- if ( isset( $info['buttonlabel-message'] ) ) {
- $this->buttonLabel = $this->getMessage( $info['buttonlabel-message'] )->parse();
- } elseif ( isset( $info['buttonlabel'] ) ) {
- if ( $info['buttonlabel'] === ' ' ) {
- // Apparently some things set   directly and in an odd format
- $this->buttonLabel = ' ';
- } else {
- $this->buttonLabel = htmlspecialchars( $info['buttonlabel'] );
- }
- } elseif ( isset( $info['buttonlabel-raw'] ) ) {
- $this->buttonLabel = $info['buttonlabel-raw'];
- }
-
- $this->setShowEmptyLabel( false );
-
- parent::__construct( $info );
- }
-
- public function getInputHTML( $value ) {
- $flags = '';
- $prefix = 'mw-htmlform-';
- if ( $this->mParent instanceof VFormHTMLForm ||
- $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' )
- ) {
- $prefix = 'mw-ui-';
- // add mw-ui-button separately, so the descriptor doesn't need to set it
- $flags .= ' ' . $prefix . 'button';
- }
- foreach ( $this->mFlags as $flag ) {
- $flags .= ' ' . $prefix . $flag;
- }
- $attr = [
- 'class' => 'mw-htmlform-submit ' . $this->mClass . $flags,
- 'id' => $this->mID,
- 'type' => $this->buttonType,
- 'name' => $this->mName,
- 'value' => $this->getDefault(),
- ] + $this->getAttributes( [ 'disabled', 'tabindex' ] );
-
- if ( $this->isBadIE() ) {
- return Html::element( 'input', $attr );
- } else {
- return Html::rawElement( 'button', $attr,
- $this->buttonLabel ?: htmlspecialchars( $this->getDefault() ) );
- }
- }
-
- /**
- * Get the OOUI widget for this field.
- * @param string $value
- * @return OOUI\ButtonInputWidget
- */
- public function getInputOOUI( $value ) {
- return new OOUI\ButtonInputWidget( [
- 'name' => $this->mName,
- 'value' => $this->getDefault(),
- 'label' => !$this->isBadIE() && $this->buttonLabel
- ? new OOUI\HtmlSnippet( $this->buttonLabel )
- : $this->getDefault(),
- 'type' => $this->buttonType,
- 'classes' => [ 'mw-htmlform-submit', $this->mClass ],
- 'id' => $this->mID,
- 'flags' => $this->mFlags,
- 'useInputTag' => $this->isBadIE(),
- ] + OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( [ 'disabled', 'tabindex' ] )
- ) );
- }
-
- protected function needsLabel() {
- return false;
- }
-
- /**
- * Button cannot be invalid
- *
- * @param string $value
- * @param array $alldata
- *
- * @return bool
- */
- public function validate( $value, $alldata ) {
- return true;
- }
-
- /**
- * IE<8 has bugs with <button>, so we'll need to avoid them.
- * @return bool Whether the request is from a bad version of IE
- */
- private function isBadIE() {
- $request = $this->mParent
- ? $this->mParent->getRequest()
- : RequestContext::getMain()->getRequest();
- return preg_match( '/MSIE [1-7]\./i', $request->getHeader( 'User-Agent' ) );
- }
-}
+++ /dev/null
-<?php
-
-/**
- * A checkbox field
- */
-class HTMLCheckField extends HTMLFormField {
- function getInputHTML( $value ) {
- global $wgUseMediaWikiUIEverywhere;
-
- if ( !empty( $this->mParams['invert'] ) ) {
- $value = !$value;
- }
-
- $attr = $this->getTooltipAndAccessKey();
- $attr['id'] = $this->mID;
-
- $attr += $this->getAttributes( [ 'disabled', 'tabindex' ] );
-
- if ( $this->mClass !== '' ) {
- $attr['class'] = $this->mClass;
- }
-
- $attrLabel = [ 'for' => $this->mID ];
- if ( isset( $attr['title'] ) ) {
- // propagate tooltip to label
- $attrLabel['title'] = $attr['title'];
- }
-
- $chkLabel = Xml::check( $this->mName, $value, $attr ) .
- ' ' .
- Html::rawElement( 'label', $attrLabel, $this->mLabel );
-
- if ( $wgUseMediaWikiUIEverywhere || $this->mParent instanceof VFormHTMLForm ) {
- $chkLabel = Html::rawElement(
- 'div',
- [ 'class' => 'mw-ui-checkbox' ],
- $chkLabel
- );
- }
-
- return $chkLabel;
- }
-
- /**
- * Get the OOUI version of this field.
- * @since 1.26
- * @param string $value
- * @return OOUI\CheckboxInputWidget The checkbox widget.
- */
- public function getInputOOUI( $value ) {
- if ( !empty( $this->mParams['invert'] ) ) {
- $value = !$value;
- }
-
- $attr = $this->getTooltipAndAccessKey();
- $attr['id'] = $this->mID;
- $attr['name'] = $this->mName;
-
- $attr += OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( [ 'disabled', 'tabindex' ] )
- );
-
- if ( $this->mClass !== '' ) {
- $attr['classes'] = [ $this->mClass ];
- }
-
- $attr['selected'] = $value;
- $attr['value'] = '1'; // Nasty hack, but needed to make this work
-
- return new OOUI\CheckboxInputWidget( $attr );
- }
-
- /**
- * For a checkbox, the label goes on the right hand side, and is
- * added in getInputHTML(), rather than HTMLFormField::getRow()
- *
- * ...unless OOUI is being used, in which case we actually return
- * the label here.
- *
- * @return string
- */
- function getLabel() {
- if ( $this->mParent instanceof OOUIHTMLForm ) {
- return $this->mLabel;
- } elseif (
- $this->mParent instanceof HTMLForm &&
- $this->mParent->getDisplayFormat() === 'div'
- ) {
- return '';
- } else {
- return ' ';
- }
- }
-
- /**
- * Get label alignment when generating field for OOUI.
- * @return string 'left', 'right', 'top' or 'inline'
- */
- protected function getLabelAlignOOUI() {
- return 'inline';
- }
-
- /**
- * checkboxes don't need a label.
- * @return bool
- */
- protected function needsLabel() {
- return false;
- }
-
- /**
- * @param WebRequest $request
- *
- * @return bool
- */
- function loadDataFromRequest( $request ) {
- $invert = isset( $this->mParams['invert'] ) && $this->mParams['invert'];
-
- // GetCheck won't work like we want for checks.
- // Fetch the value in either one of the two following case:
- // - we have a valid token (form got posted or GET forged by the user)
- // - checkbox name has a value (false or true), ie is not null
- if ( $request->getCheck( 'wpEditToken' ) || $request->getVal( $this->mName ) !== null ) {
- return $invert
- ? !$request->getBool( $this->mName )
- : $request->getBool( $this->mName );
- } else {
- return (bool)$this->getDefault();
- }
- }
-}
+++ /dev/null
-<?php
-
-/**
- * A checkbox matrix
- * Operates similarly to HTMLMultiSelectField, but instead of using an array of
- * options, uses an array of rows and an array of columns to dynamically
- * construct a matrix of options. The tags used to identify a particular cell
- * are of the form "columnName-rowName"
- *
- * Options:
- * - columns
- * - Required list of columns in the matrix.
- * - rows
- * - Required list of rows in the matrix.
- * - force-options-on
- * - Accepts array of column-row tags to be displayed as enabled but unavailable to change
- * - force-options-off
- * - Accepts array of column-row tags to be displayed as disabled but unavailable to change.
- * - tooltips
- * - Optional array mapping row label to tooltip content
- * - tooltip-class
- * - Optional CSS class used on tooltip container span. Defaults to mw-icon-question.
- */
-class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
- static private $requiredParams = [
- // Required by underlying HTMLFormField
- 'fieldname',
- // Required by HTMLCheckMatrix
- 'rows',
- 'columns'
- ];
-
- public function __construct( $params ) {
- $missing = array_diff( self::$requiredParams, array_keys( $params ) );
- if ( $missing ) {
- throw new HTMLFormFieldRequiredOptionsException( $this, $missing );
- }
- parent::__construct( $params );
- }
-
- function validate( $value, $alldata ) {
- $rows = $this->mParams['rows'];
- $columns = $this->mParams['columns'];
-
- // Make sure user-defined validation callback is run
- $p = parent::validate( $value, $alldata );
- if ( $p !== true ) {
- return $p;
- }
-
- // Make sure submitted value is an array
- if ( !is_array( $value ) ) {
- return false;
- }
-
- // If all options are valid, array_intersect of the valid options
- // and the provided options will return the provided options.
- $validOptions = [];
- foreach ( $rows as $rowTag ) {
- foreach ( $columns as $columnTag ) {
- $validOptions[] = $columnTag . '-' . $rowTag;
- }
- }
- $validValues = array_intersect( $value, $validOptions );
- if ( count( $validValues ) == count( $value ) ) {
- return true;
- } else {
- return $this->msg( 'htmlform-select-badoption' )->parse();
- }
- }
-
- /**
- * Build a table containing a matrix of checkbox options.
- * The value of each option is a combination of the row tag and column tag.
- * mParams['rows'] is an array with row labels as keys and row tags as values.
- * mParams['columns'] is an array with column labels as keys and column tags as values.
- *
- * @param array $value Array of the options that should be checked
- *
- * @return string
- */
- function getInputHTML( $value ) {
- $html = '';
- $tableContents = '';
- $rows = $this->mParams['rows'];
- $columns = $this->mParams['columns'];
-
- $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
-
- // Build the column headers
- $headerContents = Html::rawElement( 'td', [], ' ' );
- foreach ( $columns as $columnLabel => $columnTag ) {
- $headerContents .= Html::rawElement( 'td', [], $columnLabel );
- }
- $tableContents .= Html::rawElement( 'tr', [], "\n$headerContents\n" );
-
- $tooltipClass = 'mw-icon-question';
- if ( isset( $this->mParams['tooltip-class'] ) ) {
- $tooltipClass = $this->mParams['tooltip-class'];
- }
-
- // Build the options matrix
- foreach ( $rows as $rowLabel => $rowTag ) {
- // Append tooltip if configured
- if ( isset( $this->mParams['tooltips'][$rowLabel] ) ) {
- $tooltipAttribs = [
- 'class' => "mw-htmlform-tooltip $tooltipClass",
- 'title' => $this->mParams['tooltips'][$rowLabel],
- ];
- $rowLabel .= ' ' . Html::element( 'span', $tooltipAttribs, '' );
- }
- $rowContents = Html::rawElement( 'td', [], $rowLabel );
- foreach ( $columns as $columnTag ) {
- $thisTag = "$columnTag-$rowTag";
- // Construct the checkbox
- $thisAttribs = [
- 'id' => "{$this->mID}-$thisTag",
- 'value' => $thisTag,
- ];
- $checked = in_array( $thisTag, (array)$value, true );
- if ( $this->isTagForcedOff( $thisTag ) ) {
- $checked = false;
- $thisAttribs['disabled'] = 1;
- } elseif ( $this->isTagForcedOn( $thisTag ) ) {
- $checked = true;
- $thisAttribs['disabled'] = 1;
- }
-
- $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs );
-
- $rowContents .= Html::rawElement(
- 'td',
- [],
- $checkbox
- );
- }
- $tableContents .= Html::rawElement( 'tr', [], "\n$rowContents\n" );
- }
-
- // Put it all in a table
- $html .= Html::rawElement( 'table',
- [ 'class' => 'mw-htmlform-matrix' ],
- Html::rawElement( 'tbody', [], "\n$tableContents\n" ) ) . "\n";
-
- return $html;
- }
-
- protected function getOneCheckbox( $checked, $attribs ) {
- if ( $this->mParent instanceof OOUIHTMLForm ) {
- return new OOUI\CheckboxInputWidget( [
- 'name' => "{$this->mName}[]",
- 'selected' => $checked,
- ] + OOUI\Element::configFromHtmlAttributes(
- $attribs
- ) );
- } else {
- $checkbox = Xml::check( "{$this->mName}[]", $checked, $attribs );
- if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
- $checkbox = Html::openElement( 'div', [ 'class' => 'mw-ui-checkbox' ] ) .
- $checkbox .
- Html::element( 'label', [ 'for' => $attribs['id'] ] ) .
- Html::closeElement( 'div' );
- }
- return $checkbox;
- }
- }
-
- protected function isTagForcedOff( $tag ) {
- return isset( $this->mParams['force-options-off'] )
- && in_array( $tag, $this->mParams['force-options-off'] );
- }
-
- protected function isTagForcedOn( $tag ) {
- return isset( $this->mParams['force-options-on'] )
- && in_array( $tag, $this->mParams['force-options-on'] );
- }
-
- /**
- * Get the complete table row for the input, including help text,
- * labels, and whatever.
- * We override this function since the label should always be on a separate
- * line above the options in the case of a checkbox matrix, i.e. it's always
- * a "vertical-label".
- *
- * @param string $value The value to set the input to
- *
- * @return string Complete HTML table row
- */
- function getTableRow( $value ) {
- list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
- $inputHtml = $this->getInputHTML( $value );
- $fieldType = get_class( $this );
- $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
- $cellAttributes = [ 'colspan' => 2 ];
-
- $hideClass = '';
- $hideAttributes = [];
- if ( $this->mHideIf ) {
- $hideAttributes['data-hide-if'] = FormatJson::encode( $this->mHideIf );
- $hideClass = 'mw-htmlform-hide-if';
- }
-
- $label = $this->getLabelHtml( $cellAttributes );
-
- $field = Html::rawElement(
- 'td',
- [ 'class' => 'mw-input' ] + $cellAttributes,
- $inputHtml . "\n$errors"
- );
-
- $html = Html::rawElement( 'tr',
- [ 'class' => "mw-htmlform-vertical-label $hideClass" ] + $hideAttributes,
- $label );
- $html .= Html::rawElement( 'tr',
- [ 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass $hideClass" ] +
- $hideAttributes,
- $field );
-
- return $html . $helptext;
- }
-
- /**
- * @param WebRequest $request
- *
- * @return array
- */
- function loadDataFromRequest( $request ) {
- if ( $this->mParent->getMethod() == 'post' ) {
- if ( $request->wasPosted() ) {
- // Checkboxes are not added to the request arrays if they're not checked,
- // so it's perfectly possible for there not to be an entry at all
- return $request->getArray( $this->mName, [] );
- } else {
- // That's ok, the user has not yet submitted the form, so show the defaults
- return $this->getDefault();
- }
- } else {
- // This is the impossible case: if we look at $_GET and see no data for our
- // field, is it because the user has not yet submitted the form, or that they
- // have submitted it with all the options unchecked. We will have to assume the
- // latter, which basically means that you can't specify 'positive' defaults
- // for GET forms.
- return $request->getArray( $this->mName, [] );
- }
- }
-
- function getDefault() {
- if ( isset( $this->mDefault ) ) {
- return $this->mDefault;
- } else {
- return [];
- }
- }
-
- function filterDataForSubmit( $data ) {
- $columns = HTMLFormField::flattenOptions( $this->mParams['columns'] );
- $rows = HTMLFormField::flattenOptions( $this->mParams['rows'] );
- $res = [];
- foreach ( $columns as $column ) {
- foreach ( $rows as $row ) {
- // Make sure option hasn't been forced
- $thisTag = "$column-$row";
- if ( $this->isTagForcedOff( $thisTag ) ) {
- $res[$thisTag] = false;
- } elseif ( $this->isTagForcedOn( $thisTag ) ) {
- $res[$thisTag] = true;
- } else {
- $res[$thisTag] = in_array( $thisTag, $data );
- }
- }
- }
-
- return $res;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * A combo box field.
- *
- * You can think of it as a dropdown select with the ability to add custom options,
- * or as a text field with input suggestions (autocompletion).
- *
- * When JavaScript is not supported or enabled, it uses HTML5 `<datalist>` element.
- *
- * Besides the parameters recognized by HTMLTextField, the following are
- * recognized:
- * options-messages - As for HTMLSelectField
- * options - As for HTMLSelectField
- * options-message - As for HTMLSelectField
- */
-class HTMLComboboxField extends HTMLTextField {
- // FIXME Ewww, this shouldn't be adding any attributes not requested in $list :(
- public function getAttributes( array $list ) {
- $attribs = [
- 'type' => 'text',
- 'list' => $this->mName . '-datalist',
- ] + parent::getAttributes( $list );
-
- return $attribs;
- }
-
- function getInputHTML( $value ) {
- $datalist = new XmlSelect( false, $this->mName . '-datalist' );
- $datalist->setTagName( 'datalist' );
- $datalist->addOptions( $this->getOptions() );
-
- return parent::getInputHTML( $value ) . $datalist->getHTML();
- }
-
- function getInputOOUI( $value ) {
- $disabled = false;
- $allowedParams = [ 'tabindex' ];
- $attribs = OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( $allowedParams )
- );
-
- if ( $this->mClass !== '' ) {
- $attribs['classes'] = [ $this->mClass ];
- }
-
- if ( !empty( $this->mParams['disabled'] ) ) {
- $disabled = true;
- }
-
- return new OOUI\ComboBoxInputWidget( [
- 'name' => $this->mName,
- 'id' => $this->mID,
- 'options' => $this->getOptionsOOUI(),
- 'value' => strval( $value ),
- 'disabled' => $disabled,
- ] + $attribs );
- }
-}
+++ /dev/null
-<?php
-
-class HTMLEditTools extends HTMLFormField {
- public function getInputHTML( $value ) {
- return '';
- }
-
- public function getTableRow( $value ) {
- $msg = $this->formatMsg();
-
- return
- '<tr><td></td><td class="mw-input">' .
- '<div class="mw-editTools">' .
- $msg->parseAsBlock() .
- "</div></td></tr>\n";
- }
-
- /**
- * @param string $value
- * @return string
- * @since 1.20
- */
- public function getDiv( $value ) {
- $msg = $this->formatMsg();
-
- return '<div class="mw-editTools">' . $msg->parseAsBlock() . '</div>';
- }
-
- /**
- * @param string $value
- * @return string
- * @since 1.20
- */
- public function getRaw( $value ) {
- return $this->getDiv( $value );
- }
-
- protected function formatMsg() {
- if ( empty( $this->mParams['message'] ) ) {
- $msg = $this->msg( 'edittools' );
- } else {
- $msg = $this->getMessage( $this->mParams['message'] );
- if ( $msg->isDisabled() ) {
- $msg = $this->msg( 'edittools' );
- }
- }
- $msg->inContentLanguage();
-
- return $msg;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * A field that will contain a numeric value
- */
-class HTMLFloatField extends HTMLTextField {
- function getSize() {
- return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 20;
- }
-
- function validate( $value, $alldata ) {
- $p = parent::validate( $value, $alldata );
-
- if ( $p !== true ) {
- return $p;
- }
-
- $value = trim( $value );
-
- # http://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers
- # with the addition that a leading '+' sign is ok.
- if ( !preg_match( '/^((\+|\-)?\d+(\.\d+)?(E(\+|\-)?\d+)?)?$/i', $value ) ) {
- return $this->msg( 'htmlform-float-invalid' )->parseAsBlock();
- }
-
- # The "int" part of these message names is rather confusing.
- # They make equal sense for all numbers.
- if ( isset( $this->mParams['min'] ) ) {
- $min = $this->mParams['min'];
-
- if ( $min > $value ) {
- return $this->msg( 'htmlform-int-toolow', $min )->parseAsBlock();
- }
- }
-
- if ( isset( $this->mParams['max'] ) ) {
- $max = $this->mParams['max'];
-
- if ( $max < $value ) {
- return $this->msg( 'htmlform-int-toohigh', $max )->parseAsBlock();
- }
- }
-
- return true;
- }
-}
* 'help-messages' -- array of message keys/objects. As above, each item can
* be an array of msg key and then parameters.
* Overwrites 'help'.
+ * 'notice' -- message text for a message to use as a notice in the field.
+ * Currently used by OOUI form fields only.
+ * 'notice-messages' -- array of message keys/objects to use for notice.
+ * Overrides 'notice'.
+ * 'notice-message' -- message key or object to use as a notice.
* 'required' -- passed through to the object, indicating that it
* is a required field.
* 'size' -- the length of text fields
protected $mSubmitText;
protected $mSubmitTooltip;
+ protected $mFormIdentifier;
protected $mTitle;
protected $mMethod = 'post';
protected $mWasSubmitted = false;
}
# Load data from the request.
- $this->loadData();
+ if (
+ $this->mFormIdentifier === null ||
+ $this->getRequest()->getVal( 'wpFormIdentifier' ) === $this->mFormIdentifier
+ ) {
+ $this->loadData();
+ } else {
+ $this->mFieldData = [];
+ }
return $this;
}
public function tryAuthorizedSubmit() {
$result = false;
- $submit = false;
+ $identOkay = false;
+ if ( $this->mFormIdentifier === null ) {
+ $identOkay = true;
+ } else {
+ $identOkay = $this->getRequest()->getVal( 'wpFormIdentifier' ) === $this->mFormIdentifier;
+ }
+
+ $tokenOkay = false;
if ( $this->getMethod() !== 'post' ) {
- $submit = true; // no session check needed
+ $tokenOkay = true; // no session check needed
} elseif ( $this->getRequest()->wasPosted() ) {
$editToken = $this->getRequest()->getVal( 'wpEditToken' );
if ( $this->getUser()->isLoggedIn() || $editToken !== null ) {
// Session tokens for logged-out users have no security value.
// However, if the user gave one, check it in order to give a nice
// "session expired" error instead of "permission denied" or such.
- $submit = $this->getUser()->matchEditToken( $editToken, $this->mTokenSalt );
+ $tokenOkay = $this->getUser()->matchEditToken( $editToken, $this->mTokenSalt );
} else {
- $submit = true;
+ $tokenOkay = true;
}
}
- if ( $submit ) {
+ if ( $tokenOkay && $identOkay ) {
$this->mWasSubmitted = true;
$result = $this->trySubmit();
}
*/
public function getHiddenFields() {
$html = '';
+ if ( $this->mFormIdentifier !== null ) {
+ $html .= Html::hidden(
+ 'wpFormIdentifier',
+ $this->mFormIdentifier
+ ) . "\n";
+ }
if ( $this->getMethod() === 'post' ) {
$html .= Html::hidden(
'wpEditToken',
return $this;
}
+ /**
+ * Set an internal identifier for this form. It will be submitted as a hidden form field, allowing
+ * HTMLForm to determine whether the form was submitted (or merely viewed). Setting this serves
+ * two purposes:
+ *
+ * - If you use two or more forms on one page, it allows HTMLForm to identify which of the forms
+ * was submitted, and not attempt to validate the other ones.
+ * - If you use checkbox or multiselect fields inside a form using the GET method, it allows
+ * HTMLForm to distinguish between the initial page view and a form submission with all
+ * checkboxes or select options unchecked.
+ *
+ * @since 1.28
+ * @param string $ident
+ * @return $this
+ */
+ public function setFormIdentifier( $ident ) {
+ $this->mFormIdentifier = $ident;
+
+ return $this;
+ }
+
/**
* Stop a default submit button being shown for this form. This implies that an
* alternate submit method must be provided manually.
$this->mShowEmptyLabels = $show;
}
+ /**
+ * Can we assume that the request is an attempt to submit a HTMLForm, as opposed to an attempt to
+ * just view it? This can't normally be distinguished for e.g. checkboxes.
+ *
+ * Returns true if the request has a field for a CSRF token (wpEditToken) or a form identifier
+ * (wpFormIdentifier).
+ *
+ * @param WebRequest $request
+ * @return boolean
+ */
+ protected function isSubmitAttempt( WebRequest $request ) {
+ return $request->getCheck( 'wpEditToken' ) || $request->getCheck( 'wpFormIdentifier' );
+ }
+
/**
* Get the value that this input has been set to from a posted form,
* or the input's default value if it has not been set.
$error = new OOUI\HtmlSnippet( $error );
}
+ $notices = $this->getNotices();
+ foreach ( $notices as &$notice ) {
+ $notice = new OOUI\HtmlSnippet( $notice );
+ }
+
$config = [
'classes' => [ "mw-htmlform-field-$fieldType", $this->mClass ],
'align' => $this->getLabelAlignOOUI(),
'help' => $helpText !== null ? new OOUI\HtmlSnippet( $helpText ) : null,
'errors' => $errors,
+ 'notices' => $notices,
'infusable' => $infusable,
];
return $errors;
}
+ /**
+ * Determine notices to display for the field.
+ *
+ * @since 1.28
+ * @return string[]
+ */
+ function getNotices() {
+ $notices = [];
+
+ if ( isset( $this->mParams['notice-message'] ) ) {
+ $notices[] = $this->getMessage( $this->mParams['notice-message'] )->parse();
+ }
+
+ if ( isset( $this->mParams['notice-messages'] ) ) {
+ foreach ( $this->mParams['notice-messages'] as $msg ) {
+ $notices[] = $this->getMessage( $msg )->parse();
+ }
+ } elseif ( isset( $this->mParams['notice'] ) ) {
+ $notices[] = $this->mParams['notice'];
+ }
+
+ return $notices;
+ }
+
/**
* @return string HTML
*/
+++ /dev/null
-<?php
-
-/**
- * A container for HTMLFormFields that allows for multiple copies of the set of
- * fields to be displayed to and entered by the user.
- *
- * Recognized parameters, besides the general ones, include:
- * fields - HTMLFormField descriptors for the subfields this cloner manages.
- * The format is just like for the HTMLForm. A field with key 'delete' is
- * special: it must have type = submit and will serve to delete the group
- * of fields.
- * required - If specified, at least one group of fields must be submitted.
- * format - HTMLForm display format to use when displaying the subfields:
- * 'table', 'div', or 'raw'.
- * row-legend - If non-empty, each group of subfields will be enclosed in a
- * fieldset. The value is the name of a message key to use as the legend.
- * create-button-message - Message to use as the text of the button to
- * add an additional group of fields.
- * delete-button-message - Message to use as the text of automatically-
- * generated 'delete' button. Ignored if 'delete' is included in 'fields'.
- *
- * In the generated HTML, the subfields will be named along the lines of
- * "clonerName[index][fieldname]", with ids "clonerId--index--fieldid". 'index'
- * may be a number or an arbitrary string, and may likely change when the page
- * is resubmitted. Cloners may be nested, resulting in field names along the
- * lines of "cloner1Name[index1][cloner2Name][index2][fieldname]" and
- * corresponding ids.
- *
- * Use of cloner may result in submissions of the page that are not submissions
- * of the HTMLForm, when non-JavaScript clients use the create or remove buttons.
- *
- * The result is an array, with values being arrays mapping subfield names to
- * their values. On non-HTMLForm-submission page loads, there may also be
- * additional (string) keys present with other types of values.
- *
- * @since 1.23
- */
-class HTMLFormFieldCloner extends HTMLFormField {
- private static $counter = 0;
-
- /**
- * @var string String uniquely identifying this cloner instance and
- * unlikely to exist otherwise in the generated HTML, while still being
- * valid as part of an HTML id.
- */
- protected $uniqueId;
-
- public function __construct( $params ) {
- $this->uniqueId = get_class( $this ) . ++self::$counter . 'x';
- parent::__construct( $params );
-
- if ( empty( $this->mParams['fields'] ) || !is_array( $this->mParams['fields'] ) ) {
- throw new MWException( 'HTMLFormFieldCloner called without any fields' );
- }
-
- // Make sure the delete button, if explicitly specified, is sane
- if ( isset( $this->mParams['fields']['delete'] ) ) {
- $class = 'mw-htmlform-cloner-delete-button';
- $info = $this->mParams['fields']['delete'] + [
- 'cssclass' => $class
- ];
- unset( $info['name'], $info['class'] );
-
- if ( !isset( $info['type'] ) || $info['type'] !== 'submit' ) {
- throw new MWException(
- 'HTMLFormFieldCloner delete field, if specified, must be of type "submit"'
- );
- }
-
- if ( !in_array( $class, explode( ' ', $info['cssclass'] ) ) ) {
- $info['cssclass'] .= " $class";
- }
-
- $this->mParams['fields']['delete'] = $info;
- }
- }
-
- /**
- * Create the HTMLFormFields that go inside this element, using the
- * specified key.
- *
- * @param string $key Array key under which these fields should be named
- * @return HTMLFormField[]
- */
- protected function createFieldsForKey( $key ) {
- $fields = [];
- foreach ( $this->mParams['fields'] as $fieldname => $info ) {
- $name = "{$this->mName}[$key][$fieldname]";
- if ( isset( $info['name'] ) ) {
- $info['name'] = "{$this->mName}[$key][{$info['name']}]";
- } else {
- $info['name'] = $name;
- }
- if ( isset( $info['id'] ) ) {
- $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--{$info['id']}" );
- } else {
- $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--$fieldname" );
- }
- $field = HTMLForm::loadInputFromParameters( $name, $info, $this->mParent );
- $fields[$fieldname] = $field;
- }
- return $fields;
- }
-
- /**
- * Re-key the specified values array to match the names applied by
- * createFieldsForKey().
- *
- * @param string $key Array key under which these fields should be named
- * @param array $values Values array from the request
- * @return array
- */
- protected function rekeyValuesArray( $key, $values ) {
- $data = [];
- foreach ( $values as $fieldname => $value ) {
- $name = "{$this->mName}[$key][$fieldname]";
- $data[$name] = $value;
- }
- return $data;
- }
-
- protected function needsLabel() {
- return false;
- }
-
- public function loadDataFromRequest( $request ) {
- // It's possible that this might be posted with no fields. Detect that
- // by looking for an edit token.
- if ( !$request->getCheck( 'wpEditToken' ) && $request->getArray( $this->mName ) === null ) {
- return $this->getDefault();
- }
-
- $values = $request->getArray( $this->mName );
- if ( $values === null ) {
- $values = [];
- }
-
- $ret = [];
- foreach ( $values as $key => $value ) {
- if ( $key === 'create' || isset( $value['delete'] ) ) {
- $ret['nonjs'] = 1;
- continue;
- }
-
- // Add back in $request->getValues() so things that look for e.g.
- // wpEditToken don't fail.
- $data = $this->rekeyValuesArray( $key, $value ) + $request->getValues();
-
- $fields = $this->createFieldsForKey( $key );
- $subrequest = new DerivativeRequest( $request, $data, $request->wasPosted() );
- $row = [];
- foreach ( $fields as $fieldname => $field ) {
- if ( $field->skipLoadData( $subrequest ) ) {
- continue;
- } elseif ( !empty( $field->mParams['disabled'] ) ) {
- $row[$fieldname] = $field->getDefault();
- } else {
- $row[$fieldname] = $field->loadDataFromRequest( $subrequest );
- }
- }
- $ret[] = $row;
- }
-
- if ( isset( $values['create'] ) ) {
- // Non-JS client clicked the "create" button.
- $fields = $this->createFieldsForKey( $this->uniqueId );
- $row = [];
- foreach ( $fields as $fieldname => $field ) {
- if ( !empty( $field->mParams['nodata'] ) ) {
- continue;
- } else {
- $row[$fieldname] = $field->getDefault();
- }
- }
- $ret[] = $row;
- }
-
- return $ret;
- }
-
- public function getDefault() {
- $ret = parent::getDefault();
-
- // The default default is one entry with all subfields at their
- // defaults.
- if ( $ret === null ) {
- $fields = $this->createFieldsForKey( $this->uniqueId );
- $row = [];
- foreach ( $fields as $fieldname => $field ) {
- if ( !empty( $field->mParams['nodata'] ) ) {
- continue;
- } else {
- $row[$fieldname] = $field->getDefault();
- }
- }
- $ret = [ $row ];
- }
-
- return $ret;
- }
-
- public function cancelSubmit( $values, $alldata ) {
- if ( isset( $values['nonjs'] ) ) {
- return true;
- }
-
- foreach ( $values as $key => $value ) {
- $fields = $this->createFieldsForKey( $key );
- foreach ( $fields as $fieldname => $field ) {
- if ( !array_key_exists( $fieldname, $value ) ) {
- continue;
- }
- if ( $field->cancelSubmit( $value[$fieldname], $alldata ) ) {
- return true;
- }
- }
- }
-
- return parent::cancelSubmit( $values, $alldata );
- }
-
- public function validate( $values, $alldata ) {
- if ( isset( $this->mParams['required'] )
- && $this->mParams['required'] !== false
- && !$values
- ) {
- return $this->msg( 'htmlform-cloner-required' )->parseAsBlock();
- }
-
- if ( isset( $values['nonjs'] ) ) {
- // The submission was a non-JS create/delete click, so fail
- // validation in case cancelSubmit() somehow didn't already handle
- // it.
- return false;
- }
-
- foreach ( $values as $key => $value ) {
- $fields = $this->createFieldsForKey( $key );
- foreach ( $fields as $fieldname => $field ) {
- if ( !array_key_exists( $fieldname, $value ) ) {
- continue;
- }
- $ok = $field->validate( $value[$fieldname], $alldata );
- if ( $ok !== true ) {
- return false;
- }
- }
- }
-
- return parent::validate( $values, $alldata );
- }
-
- /**
- * Get the input HTML for the specified key.
- *
- * @param string $key Array key under which the fields should be named
- * @param array $values
- * @return string
- */
- protected function getInputHTMLForKey( $key, $values ) {
- $displayFormat = isset( $this->mParams['format'] )
- ? $this->mParams['format']
- : $this->mParent->getDisplayFormat();
-
- // Conveniently, PHP method names are case-insensitive.
- $getFieldHtmlMethod = $displayFormat == 'table' ? 'getTableRow' : ( 'get' . $displayFormat );
-
- $html = '';
- $hidden = '';
- $hasLabel = false;
-
- $fields = $this->createFieldsForKey( $key );
- foreach ( $fields as $fieldname => $field ) {
- $v = array_key_exists( $fieldname, $values )
- ? $values[$fieldname]
- : $field->getDefault();
-
- if ( $field instanceof HTMLHiddenField ) {
- // HTMLHiddenField doesn't generate its own HTML
- list( $name, $value, $params ) = $field->getHiddenFieldData( $v );
- $hidden .= Html::hidden( $name, $value, $params ) . "\n";
- } else {
- $html .= $field->$getFieldHtmlMethod( $v );
-
- $labelValue = trim( $field->getLabel() );
- if ( $labelValue != ' ' && $labelValue !== '' ) {
- $hasLabel = true;
- }
- }
- }
-
- if ( !isset( $fields['delete'] ) ) {
- $name = "{$this->mName}[$key][delete]";
- $label = isset( $this->mParams['delete-button-message'] )
- ? $this->mParams['delete-button-message']
- : 'htmlform-cloner-delete';
- $field = HTMLForm::loadInputFromParameters( $name, [
- 'type' => 'submit',
- 'name' => $name,
- 'id' => Sanitizer::escapeId( "{$this->mID}--$key--delete" ),
- 'cssclass' => 'mw-htmlform-cloner-delete-button',
- 'default' => $this->getMessage( $label )->text(),
- ], $this->mParent );
- $v = $field->getDefault();
-
- if ( $displayFormat === 'table' ) {
- $html .= $field->$getFieldHtmlMethod( $v );
- } else {
- $html .= $field->getInputHTML( $v );
- }
- }
-
- if ( $displayFormat !== 'raw' ) {
- $classes = [
- 'mw-htmlform-cloner-row',
- ];
-
- if ( !$hasLabel ) { // Avoid strange spacing when no labels exist
- $classes[] = 'mw-htmlform-nolabel';
- }
-
- $attribs = [
- 'class' => implode( ' ', $classes ),
- ];
-
- if ( $displayFormat === 'table' ) {
- $html = Html::rawElement( 'table',
- $attribs,
- Html::rawElement( 'tbody', [], "\n$html\n" ) ) . "\n";
- } else {
- $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
- }
- }
-
- $html .= $hidden;
-
- if ( !empty( $this->mParams['row-legend'] ) ) {
- $legend = $this->msg( $this->mParams['row-legend'] )->text();
- $html = Xml::fieldset( $legend, $html );
- }
-
- return $html;
- }
-
- public function getInputHTML( $values ) {
- $html = '';
-
- foreach ( (array)$values as $key => $value ) {
- if ( $key === 'nonjs' ) {
- continue;
- }
- $html .= Html::rawElement( 'li', [ 'class' => 'mw-htmlform-cloner-li' ],
- $this->getInputHTMLForKey( $key, $value )
- );
- }
-
- $template = $this->getInputHTMLForKey( $this->uniqueId, null );
- $html = Html::rawElement( 'ul', [
- 'id' => "mw-htmlform-cloner-list-{$this->mID}",
- 'class' => 'mw-htmlform-cloner-ul',
- 'data-template' => $template,
- 'data-unique-id' => $this->uniqueId,
- ], $html );
-
- $name = "{$this->mName}[create]";
- $label = isset( $this->mParams['create-button-message'] )
- ? $this->mParams['create-button-message']
- : 'htmlform-cloner-create';
- $field = HTMLForm::loadInputFromParameters( $name, [
- 'type' => 'submit',
- 'name' => $name,
- 'id' => Sanitizer::escapeId( "{$this->mID}--create" ),
- 'cssclass' => 'mw-htmlform-cloner-create-button',
- 'default' => $this->getMessage( $label )->text(),
- ], $this->mParent );
- $html .= $field->getInputHTML( $field->getDefault() );
-
- return $html;
- }
-}
+++ /dev/null
-<?php
-/**
- * Enables HTMLFormField elements to be build with a button.
- */
-class HTMLFormFieldWithButton extends HTMLFormField {
- /** @var string $mButtonClass CSS class for the button in this field */
- protected $mButtonClass = '';
-
- /** @var string|integer $mButtonId Element ID for the button in this field */
- protected $mButtonId = '';
-
- /** @var string $mButtonName Name the button in this field */
- protected $mButtonName = '';
-
- /** @var string $mButtonType Type of the button in this field (e.g. button or submit) */
- protected $mButtonType = 'submit';
-
- /** @var string $mButtonType Value for the button in this field */
- protected $mButtonValue;
-
- /** @var string $mButtonType Value for the button in this field */
- protected $mButtonFlags = [ 'progressive' ];
-
- public function __construct( $info ) {
- if ( isset( $info['buttonclass'] ) ) {
- $this->mButtonClass = $info['buttonclass'];
- }
- if ( isset( $info['buttonid'] ) ) {
- $this->mButtonId = $info['buttonid'];
- }
- if ( isset( $info['buttonname'] ) ) {
- $this->mButtonName = $info['buttonname'];
- }
- if ( isset( $info['buttondefault'] ) ) {
- $this->mButtonValue = $info['buttondefault'];
- }
- if ( isset( $info['buttontype'] ) ) {
- $this->mButtonType = $info['buttontype'];
- }
- if ( isset( $info['buttonflags'] ) ) {
- $this->mButtonFlags = $info['buttonflags'];
- }
- parent::__construct( $info );
- }
-
- public function getInputHTML( $value ) {
- $attr = [
- 'class' => 'mw-htmlform-submit ' . $this->mButtonClass,
- 'id' => $this->mButtonId,
- ] + $this->getAttributes( [ 'disabled', 'tabindex' ] );
-
- return Html::input( $this->mButtonName, $this->mButtonValue, $this->mButtonType, $attr );
- }
-
- public function getInputOOUI( $value ) {
- return new OOUI\ButtonInputWidget( [
- 'name' => $this->mButtonName,
- 'value' => $this->mButtonValue,
- 'type' => $this->mButtonType,
- 'label' => $this->mButtonValue,
- 'flags' => $this->mButtonFlags,
- ] + OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( [ 'disabled', 'tabindex' ] )
- ) );
- }
-
- /**
- * Combines the passed element with a button.
- * @param String $element Element to combine the button with.
- * @return String
- */
- public function getElement( $element ) {
- return $element . ' ' . $this->getInputHTML( '' );
- }
-}
+++ /dev/null
-<?php
-
-class HTMLHiddenField extends HTMLFormField {
- protected $outputAsDefault = true;
-
- public function __construct( $params ) {
- parent::__construct( $params );
-
- if ( isset( $this->mParams['output-as-default'] ) ) {
- $this->outputAsDefault = (bool)$this->mParams['output-as-default'];
- }
-
- # Per HTML5 spec, hidden fields cannot be 'required'
- # http://www.w3.org/TR/html5/forms.html#hidden-state-%28type=hidden%29
- unset( $this->mParams['required'] );
- }
-
- public function getHiddenFieldData( $value ) {
- $params = [];
- if ( $this->mID ) {
- $params['id'] = $this->mID;
- }
-
- if ( $this->outputAsDefault ) {
- $value = $this->mDefault;
- }
-
- return [ $this->mName, $value, $params ];
- }
-
- public function getTableRow( $value ) {
- list( $name, $value, $params ) = $this->getHiddenFieldData( $value );
- $this->mParent->addHiddenField( $name, $value, $params );
- return '';
- }
-
- /**
- * @param string $value
- * @return string
- * @since 1.20
- */
- public function getDiv( $value ) {
- return $this->getTableRow( $value );
- }
-
- /**
- * @param string $value
- * @return string
- * @since 1.20
- */
- public function getRaw( $value ) {
- return $this->getTableRow( $value );
- }
-
- public function getInputHTML( $value ) {
- return '';
- }
-
- public function canDisplayErrors() {
- return false;
- }
-
- public function hasVisibleOutput() {
- return false;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * An information field (text blob), not a proper input.
- */
-class HTMLInfoField extends HTMLFormField {
- public function __construct( $info ) {
- $info['nodata'] = true;
-
- parent::__construct( $info );
- }
-
- public function getInputHTML( $value ) {
- return !empty( $this->mParams['raw'] ) ? $value : htmlspecialchars( $value );
- }
-
- public function getInputOOUI( $value ) {
- if ( !empty( $this->mParams['raw'] ) ) {
- $value = new OOUI\HtmlSnippet( $value );
- }
-
- return new OOUI\LabelWidget( [
- 'label' => $value,
- ] );
- }
-
- public function getTableRow( $value ) {
- if ( !empty( $this->mParams['rawrow'] ) ) {
- return $value;
- }
-
- return parent::getTableRow( $value );
- }
-
- /**
- * @param string $value
- * @return string
- * @since 1.20
- */
- public function getDiv( $value ) {
- if ( !empty( $this->mParams['rawrow'] ) ) {
- return $value;
- }
-
- return parent::getDiv( $value );
- }
-
- /**
- * @param string $value
- * @return string
- * @since 1.20
- */
- public function getRaw( $value ) {
- if ( !empty( $this->mParams['rawrow'] ) ) {
- return $value;
- }
-
- return parent::getRaw( $value );
- }
-
- protected function needsLabel() {
- return false;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * A field that must contain a number
- */
-class HTMLIntField extends HTMLFloatField {
- function validate( $value, $alldata ) {
- $p = parent::validate( $value, $alldata );
-
- if ( $p !== true ) {
- return $p;
- }
-
- # http://www.w3.org/TR/html5/infrastructure.html#signed-integers
- # with the addition that a leading '+' sign is ok. Note that leading zeros
- # are fine, and will be left in the input, which is useful for things like
- # phone numbers when you know that they are integers (the HTML5 type=tel
- # input does not require its value to be numeric). If you want a tidier
- # value to, eg, save in the DB, clean it up with intval().
- if ( !preg_match( '/^((\+|\-)?\d+)?$/', trim( $value ) ) ) {
- return $this->msg( 'htmlform-int-invalid' )->parseAsBlock();
- }
-
- return true;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * Multi-select field
- */
-class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable {
- function validate( $value, $alldata ) {
- $p = parent::validate( $value, $alldata );
-
- if ( $p !== true ) {
- return $p;
- }
-
- if ( !is_array( $value ) ) {
- return false;
- }
-
- # If all options are valid, array_intersect of the valid options
- # and the provided options will return the provided options.
- $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
-
- $validValues = array_intersect( $value, $validOptions );
- if ( count( $validValues ) == count( $value ) ) {
- return true;
- } else {
- return $this->msg( 'htmlform-select-badoption' )->parse();
- }
- }
-
- function getInputHTML( $value ) {
- $value = HTMLFormField::forceToStringRecursive( $value );
- $html = $this->formatOptions( $this->getOptions(), $value );
-
- return $html;
- }
-
- function formatOptions( $options, $value ) {
- $html = '';
-
- $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
-
- foreach ( $options as $label => $info ) {
- if ( is_array( $info ) ) {
- $html .= Html::rawElement( 'h1', [], $label ) . "\n";
- $html .= $this->formatOptions( $info, $value );
- } else {
- $thisAttribs = [
- 'id' => "{$this->mID}-$info",
- 'value' => $info,
- ];
- $checked = in_array( $info, $value, true );
-
- $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs, $label );
-
- $html .= ' ' . Html::rawElement(
- 'div',
- [ 'class' => 'mw-htmlform-flatlist-item' ],
- $checkbox
- );
- }
- }
-
- return $html;
- }
-
- protected function getOneCheckbox( $checked, $attribs, $label ) {
- if ( $this->mParent instanceof OOUIHTMLForm ) {
- throw new MWException( 'HTMLMultiSelectField#getOneCheckbox() is not supported' );
- } else {
- $elementFunc = [ 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
- $checkbox =
- Xml::check( "{$this->mName}[]", $checked, $attribs ) .
- ' ' .
- call_user_func( $elementFunc,
- 'label',
- [ 'for' => $attribs['id'] ],
- $label
- );
- if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
- $checkbox = Html::openElement( 'div', [ 'class' => 'mw-ui-checkbox' ] ) .
- $checkbox .
- Html::closeElement( 'div' );
- }
- return $checkbox;
- }
- }
-
- /**
- * Get the OOUI version of this field.
- *
- * @since 1.28
- * @param string[] $value
- * @return OOUI\CheckboxMultiselectInputWidget
- */
- public function getInputOOUI( $value ) {
- $attr = $this->getTooltipAndAccessKey();
- $attr['id'] = $this->mID;
- $attr['name'] = "{$this->mName}[]";
-
- $attr['value'] = $value;
- $attr['options'] = $this->getOptionsOOUI();
-
- if ( $this->mOptionsLabelsNotFromMessage ) {
- foreach ( $attr['options'] as &$option ) {
- $option['label'] = new OOUI\HtmlSnippet( $option['label'] );
- }
- }
-
- $attr += OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( [ 'disabled', 'tabindex' ] )
- );
-
- if ( $this->mClass !== '' ) {
- $attr['classes'] = [ $this->mClass ];
- }
-
- return new OOUI\CheckboxMultiselectInputWidget( $attr );
- }
-
- /**
- * @param WebRequest $request
- *
- * @return string
- */
- function loadDataFromRequest( $request ) {
- if ( $this->mParent->getMethod() == 'post' ) {
- if ( $request->wasPosted() ) {
- # Checkboxes are just not added to the request arrays if they're not checked,
- # so it's perfectly possible for there not to be an entry at all
- return $request->getArray( $this->mName, [] );
- } else {
- # That's ok, the user has not yet submitted the form, so show the defaults
- return $this->getDefault();
- }
- } else {
- # This is the impossible case: if we look at $_GET and see no data for our
- # field, is it because the user has not yet submitted the form, or that they
- # have submitted it with all the options unchecked? We will have to assume the
- # latter, which basically means that you can't specify 'positive' defaults
- # for GET forms.
- # @todo FIXME...
- return $request->getArray( $this->mName, [] );
- }
- }
-
- function getDefault() {
- if ( isset( $this->mDefault ) ) {
- return $this->mDefault;
- } else {
- return [];
- }
- }
-
- function filterDataForSubmit( $data ) {
- $data = HTMLFormField::forceToStringRecursive( $data );
- $options = HTMLFormField::flattenOptions( $this->getOptions() );
-
- $res = [];
- foreach ( $options as $opt ) {
- $res["$opt"] = in_array( $opt, $data, true );
- }
-
- return $res;
- }
-
- protected function needsLabel() {
- return false;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * Radio checkbox fields.
- */
-class HTMLRadioField extends HTMLFormField {
- function validate( $value, $alldata ) {
- $p = parent::validate( $value, $alldata );
-
- if ( $p !== true ) {
- return $p;
- }
-
- if ( !is_string( $value ) && !is_int( $value ) ) {
- return false;
- }
-
- $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
-
- if ( in_array( strval( $value ), $validOptions, true ) ) {
- return true;
- } else {
- return $this->msg( 'htmlform-select-badoption' )->parse();
- }
- }
-
- /**
- * This returns a block of all the radio options, in one cell.
- * @see includes/HTMLFormField#getInputHTML()
- *
- * @param string $value
- *
- * @return string
- */
- function getInputHTML( $value ) {
- $html = $this->formatOptions( $this->getOptions(), strval( $value ) );
-
- return $html;
- }
-
- function getInputOOUI( $value ) {
- $options = [];
- foreach ( $this->getOptions() as $label => $data ) {
- $options[] = [
- 'data' => $data,
- 'label' => $this->mOptionsLabelsNotFromMessage ? new OOUI\HtmlSnippet( $label ) : $label,
- ];
- }
-
- return new OOUI\RadioSelectInputWidget( [
- 'name' => $this->mName,
- 'id' => $this->mID,
- 'value' => $value,
- 'options' => $options,
- ] + OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( [ 'disabled', 'tabindex' ] )
- ) );
- }
-
- function formatOptions( $options, $value ) {
- global $wgUseMediaWikiUIEverywhere;
-
- $html = '';
-
- $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
- $elementFunc = [ 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
-
- # @todo Should this produce an unordered list perhaps?
- foreach ( $options as $label => $info ) {
- if ( is_array( $info ) ) {
- $html .= Html::rawElement( 'h1', [], $label ) . "\n";
- $html .= $this->formatOptions( $info, $value );
- } else {
- $id = Sanitizer::escapeId( $this->mID . "-$info" );
- $classes = [ 'mw-htmlform-flatlist-item' ];
- if ( $wgUseMediaWikiUIEverywhere || $this->mParent instanceof VFormHTMLForm ) {
- $classes[] = 'mw-ui-radio';
- }
- $radio = Xml::radio( $this->mName, $info, $info === $value, $attribs + [ 'id' => $id ] );
- $radio .= ' ' . call_user_func( $elementFunc, 'label', [ 'for' => $id ], $label );
-
- $html .= ' ' . Html::rawElement(
- 'div',
- [ 'class' => $classes ],
- $radio
- );
- }
- }
-
- return $html;
- }
-
- protected function needsLabel() {
- return false;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * Double field with a dropdown list constructed from a system message in the format
- * * Optgroup header
- * ** <option value>
- * * New Optgroup header
- * Plus a text field underneath for an additional reason. The 'value' of the field is
- * "<select>: <extra reason>", or "<extra reason>" if nothing has been selected in the
- * select dropdown.
- * @todo FIXME: If made 'required', only the text field should be compulsory.
- */
-class HTMLSelectAndOtherField extends HTMLSelectField {
- function __construct( $params ) {
- if ( array_key_exists( 'other', $params ) ) {
- // Do nothing
- } elseif ( array_key_exists( 'other-message', $params ) ) {
- $params['other'] = $this->getMessage( $params['other-message'] )->plain();
- } else {
- $params['other'] = $this->msg( 'htmlform-selectorother-other' )->plain();
- }
-
- parent::__construct( $params );
-
- if ( $this->getOptions() === null ) {
- // Sulk
- throw new MWException( 'HTMLSelectAndOtherField called without any options' );
- }
- if ( !in_array( 'other', $this->mOptions, true ) ) {
- // Have 'other' always as first element
- $this->mOptions = [ $params['other'] => 'other' ] + $this->mOptions;
- }
- $this->mFlatOptions = self::flattenOptions( $this->getOptions() );
-
- }
-
- function getInputHTML( $value ) {
- $select = parent::getInputHTML( $value[1] );
-
- $textAttribs = [
- 'id' => $this->mID . '-other',
- 'size' => $this->getSize(),
- 'class' => [ 'mw-htmlform-select-and-other-field' ],
- 'data-id-select' => $this->mID,
- ];
-
- if ( $this->mClass !== '' ) {
- $textAttribs['class'][] = $this->mClass;
- }
-
- $allowedParams = [
- 'required',
- 'autofocus',
- 'multiple',
- 'disabled',
- 'tabindex',
- 'maxlength', // gets dynamic with javascript, see mediawiki.htmlform.js
- ];
-
- $textAttribs += $this->getAttributes( $allowedParams );
-
- $textbox = Html::input( $this->mName . '-other', $value[2], 'text', $textAttribs );
-
- return "$select<br />\n$textbox";
- }
-
- function getInputOOUI( $value ) {
- return false;
- }
-
- /**
- * @param WebRequest $request
- *
- * @return array("<overall message>","<select value>","<text field value>")
- */
- function loadDataFromRequest( $request ) {
- if ( $request->getCheck( $this->mName ) ) {
- $list = $request->getText( $this->mName );
- $text = $request->getText( $this->mName . '-other' );
-
- // Should be built the same as in mediawiki.htmlform.js
- if ( $list == 'other' ) {
- $final = $text;
- } elseif ( !in_array( $list, $this->mFlatOptions, true ) ) {
- # User has spoofed the select form to give an option which wasn't
- # in the original offer. Sulk...
- $final = $text;
- } elseif ( $text == '' ) {
- $final = $list;
- } else {
- $final = $list . $this->msg( 'colon-separator' )->inContentLanguage()->text() . $text;
- }
- } else {
- $final = $this->getDefault();
-
- $list = 'other';
- $text = $final;
- foreach ( $this->mFlatOptions as $option ) {
- $match = $option . $this->msg( 'colon-separator' )->inContentLanguage()->text();
- if ( strpos( $text, $match ) === 0 ) {
- $list = $option;
- $text = substr( $text, strlen( $match ) );
- break;
- }
- }
- }
-
- return [ $final, $list, $text ];
- }
-
- function getSize() {
- return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
- }
-
- function validate( $value, $alldata ) {
- # HTMLSelectField forces $value to be one of the options in the select
- # field, which is not useful here. But we do want the validation further up
- # the chain
- $p = parent::validate( $value[1], $alldata );
-
- if ( $p !== true ) {
- return $p;
- }
-
- if ( isset( $this->mParams['required'] )
- && $this->mParams['required'] !== false
- && $value[1] === ''
- ) {
- return $this->msg( 'htmlform-required' )->parse();
- }
-
- return true;
- }
-}
+++ /dev/null
-<?php
-
-/**
- * A select dropdown field. Basically a wrapper for Xmlselect class
- */
-class HTMLSelectField extends HTMLFormField {
- function validate( $value, $alldata ) {
- $p = parent::validate( $value, $alldata );
-
- if ( $p !== true ) {
- return $p;
- }
-
- $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
-
- if ( in_array( strval( $value ), $validOptions, true ) ) {
- return true;
- } else {
- return $this->msg( 'htmlform-select-badoption' )->parse();
- }
- }
-
- function getInputHTML( $value ) {
- $select = new XmlSelect( $this->mName, $this->mID, strval( $value ) );
-
- if ( !empty( $this->mParams['disabled'] ) ) {
- $select->setAttribute( 'disabled', 'disabled' );
- }
-
- $allowedParams = [ 'tabindex', 'size' ];
- $customParams = $this->getAttributes( $allowedParams );
- foreach ( $customParams as $name => $value ) {
- $select->setAttribute( $name, $value );
- }
-
- if ( $this->mClass !== '' ) {
- $select->setAttribute( 'class', $this->mClass );
- }
-
- $select->addOptions( $this->getOptions() );
-
- return $select->getHTML();
- }
-
- function getInputOOUI( $value ) {
- $disabled = false;
- $allowedParams = [ 'tabindex' ];
- $attribs = OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( $allowedParams )
- );
-
- if ( $this->mClass !== '' ) {
- $attribs['classes'] = [ $this->mClass ];
- }
-
- if ( !empty( $this->mParams['disabled'] ) ) {
- $disabled = true;
- }
-
- return new OOUI\DropdownInputWidget( [
- 'name' => $this->mName,
- 'id' => $this->mID,
- 'options' => $this->getOptionsOOUI(),
- 'value' => strval( $value ),
- 'disabled' => $disabled,
- ] + $attribs );
- }
-}
+++ /dev/null
-<?php
-
-/**
- * A limit dropdown, which accepts any valid number
- */
-class HTMLSelectLimitField extends HTMLSelectField {
- /**
- * Basically don't do any validation. If it's a number that's fine. Also,
- * add it to the list if it's not there already
- *
- * @param string $value
- * @param array $alldata
- * @return bool
- */
- function validate( $value, $alldata ) {
- if ( $value == '' ) {
- return true;
- }
-
- // Let folks pick an explicit limit not from our list, as long as it's a real numbr.
- if ( !in_array( $value, $this->mParams['options'] )
- && $value == intval( $value )
- && $value > 0
- ) {
- // This adds the explicitly requested limit value to the drop-down,
- // then makes sure it's sorted correctly so when we output the list
- // later, the custom option doesn't just show up last.
- $this->mParams['options'][$this->mParent->getLanguage()->formatNum( $value )] =
- intval( $value );
- asort( $this->mParams['options'] );
- }
-
- return true;
- }
-}
+++ /dev/null
-<?php
-/**
- * Wrapper for Html::namespaceSelector to use in HTMLForm
- */
-class HTMLSelectNamespace extends HTMLFormField {
- public function __construct( $params ) {
- parent::__construct( $params );
-
- $this->mAllValue = array_key_exists( 'all', $params )
- ? $params['all']
- : 'all';
-
- }
-
- function getInputHTML( $value ) {
- return Html::namespaceSelector(
- [
- 'selected' => $value,
- 'all' => $this->mAllValue
- ], [
- 'name' => $this->mName,
- 'id' => $this->mID,
- 'class' => 'namespaceselector',
- ]
- );
- }
-
- public function getInputOOUI( $value ) {
- return new MediaWiki\Widget\NamespaceInputWidget( [
- 'value' => $value,
- 'name' => $this->mName,
- 'id' => $this->mID,
- 'includeAllValue' => $this->mAllValue,
- ] );
- }
-}
+++ /dev/null
-<?php
-/**
- * Creates a Html::namespaceSelector input field with a button assigned to the input field.
- */
-class HTMLSelectNamespaceWithButton extends HTMLSelectNamespace {
- /** @var HTMLFormFieldWithButton $mClassWithButton */
- protected $mClassWithButton = null;
-
- public function __construct( $info ) {
- $this->mClassWithButton = new HTMLFormFieldWithButton( $info );
- parent::__construct( $info );
- }
-
- public function getInputHTML( $value ) {
- return $this->mClassWithButton->getElement( parent::getInputHTML( $value ) );
- }
-}
+++ /dev/null
-<?php
-
-/**
- * Select dropdown field, with an additional "other" textbox.
- *
- * HTMLComboboxField implements the same functionality using a single form field
- * and should be used instead.
- */
-class HTMLSelectOrOtherField extends HTMLTextField {
- function __construct( $params ) {
- parent::__construct( $params );
- $this->getOptions();
- if ( !in_array( 'other', $this->mOptions, true ) ) {
- $msg =
- isset( $params['other'] )
- ? $params['other']
- : wfMessage( 'htmlform-selectorother-other' )->text();
- // Have 'other' always as first element
- $this->mOptions = [ $msg => 'other' ] + $this->mOptions;
- }
-
- }
-
- function getInputHTML( $value ) {
- $valInSelect = false;
-
- if ( $value !== false ) {
- $value = strval( $value );
- $valInSelect = in_array(
- $value, HTMLFormField::flattenOptions( $this->getOptions() ), true
- );
- }
-
- $selected = $valInSelect ? $value : 'other';
-
- $select = new XmlSelect( $this->mName, $this->mID, $selected );
- $select->addOptions( $this->getOptions() );
-
- $select->setAttribute( 'class', 'mw-htmlform-select-or-other' );
-
- $tbAttribs = [ 'id' => $this->mID . '-other', 'size' => $this->getSize() ];
-
- if ( !empty( $this->mParams['disabled'] ) ) {
- $select->setAttribute( 'disabled', 'disabled' );
- $tbAttribs['disabled'] = 'disabled';
- }
-
- if ( isset( $this->mParams['tabindex'] ) ) {
- $select->setAttribute( 'tabindex', $this->mParams['tabindex'] );
- $tbAttribs['tabindex'] = $this->mParams['tabindex'];
- }
-
- $select = $select->getHTML();
-
- if ( isset( $this->mParams['maxlength'] ) ) {
- $tbAttribs['maxlength'] = $this->mParams['maxlength'];
- }
-
- if ( $this->mClass !== '' ) {
- $tbAttribs['class'] = $this->mClass;
- }
-
- $textbox = Html::input( $this->mName . '-other', $valInSelect ? '' : $value, 'text', $tbAttribs );
-
- return "$select<br />\n$textbox";
- }
-
- function getInputOOUI( $value ) {
- return false;
- }
-
- /**
- * @param WebRequest $request
- *
- * @return string
- */
- function loadDataFromRequest( $request ) {
- if ( $request->getCheck( $this->mName ) ) {
- $val = $request->getText( $this->mName );
-
- if ( $val === 'other' ) {
- $val = $request->getText( $this->mName . '-other' );
- }
-
- return $val;
- } else {
- return $this->getDefault();
- }
- }
-}
+++ /dev/null
-<?php
-
-/**
- * Add a submit button inline in the form (as opposed to
- * HTMLForm::addButton(), which will add it at the end).
- */
-class HTMLSubmitField extends HTMLButtonField {
- protected $buttonType = 'submit';
-
- protected $mFlags = [ 'primary', 'constructive' ];
-
- public function skipLoadData( $request ) {
- return !$request->getCheck( $this->mName );
- }
-
- public function loadDataFromRequest( $request ) {
- return $request->getCheck( $this->mName );
- }
-}
+++ /dev/null
-<?php
-/**
- * Wrapper for ChangeTags::buildTagFilterSelector to use in HTMLForm
- */
-class HTMLTagFilter extends HTMLFormField {
- protected $tagFilter;
-
- function getTableRow( $value ) {
- $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
- if ( $this->tagFilter ) {
- return parent::getTableRow( $value );
- }
- return '';
- }
-
- function getDiv( $value ) {
- $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
- if ( $this->tagFilter ) {
- return parent::getDiv( $value );
- }
- return '';
- }
-
- function getInputHTML( $value ) {
- if ( $this->tagFilter ) {
- // we only need the select field, HTMLForm should handle the label
- return $this->tagFilter[1];
- }
- return '';
- }
-}
+++ /dev/null
-<?php
-
-class HTMLTextAreaField extends HTMLFormField {
- const DEFAULT_COLS = 80;
- const DEFAULT_ROWS = 25;
-
- protected $mPlaceholder = '';
-
- /**
- * @param array $params
- * - cols, rows: textarea size
- * - placeholder/placeholder-message: set HTML placeholder attribute
- * - spellcheck: set HTML spellcheck attribute
- */
- public function __construct( $params ) {
- parent::__construct( $params );
-
- if ( isset( $params['placeholder-message'] ) ) {
- $this->mPlaceholder = $this->getMessage( $params['placeholder-message'] )->parse();
- } elseif ( isset( $params['placeholder'] ) ) {
- $this->mPlaceholder = $params['placeholder'];
- }
- }
-
- function getCols() {
- return isset( $this->mParams['cols'] ) ? $this->mParams['cols'] : static::DEFAULT_COLS;
- }
-
- function getRows() {
- return isset( $this->mParams['rows'] ) ? $this->mParams['rows'] : static::DEFAULT_ROWS;
- }
-
- function getSpellCheck() {
- $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
- if ( is_bool( $val ) ) {
- // "spellcheck" attribute literally requires "true" or "false" to work.
- return $val === true ? 'true' : 'false';
- }
- return null;
- }
-
- function getInputHTML( $value ) {
- $attribs = [
- 'id' => $this->mID,
- 'cols' => $this->getCols(),
- 'rows' => $this->getRows(),
- 'spellcheck' => $this->getSpellCheck(),
- ] + $this->getTooltipAndAccessKey();
-
- if ( $this->mClass !== '' ) {
- $attribs['class'] = $this->mClass;
- }
- if ( $this->mPlaceholder !== '' ) {
- $attribs['placeholder'] = $this->mPlaceholder;
- }
-
- $allowedParams = [
- 'tabindex',
- 'disabled',
- 'readonly',
- 'required',
- 'autofocus'
- ];
-
- $attribs += $this->getAttributes( $allowedParams );
- return Html::textarea( $this->mName, $value, $attribs );
- }
-
- function getInputOOUI( $value ) {
- if ( isset( $this->mParams['cols'] ) ) {
- throw new Exception( "OOUIHTMLForm does not support the 'cols' parameter for textareas" );
- }
-
- $attribs = $this->getTooltipAndAccessKey();
-
- if ( $this->mClass !== '' ) {
- $attribs['classes'] = [ $this->mClass ];
- }
- if ( $this->mPlaceholder !== '' ) {
- $attribs['placeholder'] = $this->mPlaceholder;
- }
-
- $allowedParams = [
- 'tabindex',
- 'disabled',
- 'readonly',
- 'required',
- 'autofocus',
- ];
-
- $attribs += OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( $allowedParams )
- );
-
- return new OOUI\TextInputWidget( [
- 'id' => $this->mID,
- 'name' => $this->mName,
- 'multiline' => true,
- 'value' => $value,
- 'rows' => $this->getRows(),
- ] + $attribs );
- }
-}
+++ /dev/null
-<?php
-
-class HTMLTextField extends HTMLFormField {
- protected $mPlaceholder = '';
-
- /**
- * @param array $params
- * - type: HTML textfield type
- * - size: field size in characters (defaults to 45)
- * - placeholder/placeholder-message: set HTML placeholder attribute
- * - spellcheck: set HTML spellcheck attribute
- * - persistent: upon unsuccessful requests, retain the value (defaults to true, except
- * for password fields)
- */
- public function __construct( $params ) {
- parent::__construct( $params );
-
- if ( isset( $params['placeholder-message'] ) ) {
- $this->mPlaceholder = $this->getMessage( $params['placeholder-message'] )->parse();
- } elseif ( isset( $params['placeholder'] ) ) {
- $this->mPlaceholder = $params['placeholder'];
- }
- }
-
- function getSize() {
- return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
- }
-
- function getSpellCheck() {
- $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
- if ( is_bool( $val ) ) {
- // "spellcheck" attribute literally requires "true" or "false" to work.
- return $val === true ? 'true' : 'false';
- }
- return null;
- }
-
- public function isPersistent() {
- if ( isset( $this->mParams['persistent'] ) ) {
- return $this->mParams['persistent'];
- }
- // don't put passwords into the HTML body, they could get cached or otherwise leaked
- return !( isset( $this->mParams['type'] ) && $this->mParams['type'] === 'password' );
- }
-
- function getInputHTML( $value ) {
- if ( !$this->isPersistent() ) {
- $value = '';
- }
-
- $attribs = [
- 'id' => $this->mID,
- 'name' => $this->mName,
- 'size' => $this->getSize(),
- 'value' => $value,
- 'dir' => $this->mDir,
- 'spellcheck' => $this->getSpellCheck(),
- ] + $this->getTooltipAndAccessKey() + $this->getDataAttribs();
-
- if ( $this->mClass !== '' ) {
- $attribs['class'] = $this->mClass;
- }
- if ( $this->mPlaceholder !== '' ) {
- $attribs['placeholder'] = $this->mPlaceholder;
- }
-
- # @todo Enforce pattern, step, required, readonly on the server side as
- # well
- $allowedParams = [
- 'type',
- 'min',
- 'max',
- 'pattern',
- 'title',
- 'step',
- 'list',
- 'maxlength',
- 'tabindex',
- 'disabled',
- 'required',
- 'autofocus',
- 'multiple',
- 'readonly'
- ];
-
- $attribs += $this->getAttributes( $allowedParams );
-
- # Extract 'type'
- $type = $this->getType( $attribs );
- return Html::input( $this->mName, $value, $type, $attribs );
- }
-
- protected function getType( &$attribs ) {
- $type = isset( $attribs['type'] ) ? $attribs['type'] : 'text';
- unset( $attribs['type'] );
-
- # Implement tiny differences between some field variants
- # here, rather than creating a new class for each one which
- # is essentially just a clone of this one.
- if ( isset( $this->mParams['type'] ) ) {
- switch ( $this->mParams['type'] ) {
- case 'int':
- $type = 'number';
- break;
- case 'float':
- $type = 'number';
- $attribs['step'] = 'any';
- break;
- # Pass through
- case 'email':
- case 'password':
- case 'file':
- case 'url':
- $type = $this->mParams['type'];
- break;
- }
- }
-
- return $type;
- }
-
- function getInputOOUI( $value ) {
- if ( !$this->isPersistent() ) {
- $value = '';
- }
-
- $attribs = $this->getTooltipAndAccessKey();
-
- if ( $this->mClass !== '' ) {
- $attribs['classes'] = [ $this->mClass ];
- }
- if ( $this->mPlaceholder !== '' ) {
- $attribs['placeholder'] = $this->mPlaceholder;
- }
-
- # @todo Enforce pattern, step, required, readonly on the server side as
- # well
- $allowedParams = [
- 'autofocus',
- 'autosize',
- 'disabled',
- 'flags',
- 'indicator',
- 'maxlength',
- 'readonly',
- 'required',
- 'tabindex',
- 'type',
- ];
-
- $attribs += OOUI\Element::configFromHtmlAttributes(
- $this->getAttributes( $allowedParams )
- );
-
- $type = $this->getType( $attribs );
-
- return $this->getInputWidget( [
- 'id' => $this->mID,
- 'name' => $this->mName,
- 'value' => $value,
- 'type' => $type,
- ] + $attribs );
- }
-
- protected function getInputWidget( $params ) {
- return new OOUI\TextInputWidget( $params );
- }
-
- /**
- * Returns an array of data-* attributes to add to the field.
- *
- * @return array
- */
- protected function getDataAttribs() {
- return [];
- }
-}
+++ /dev/null
-<?php
-/**
- * Creates a text input field with a button assigned to the input field.
- */
-class HTMLTextFieldWithButton extends HTMLTextField {
- /** @var HTMLFormFieldWithButton $mClassWithButton */
- protected $mClassWithButton = null;
-
- public function __construct( $info ) {
- $this->mClassWithButton = new HTMLFormFieldWithButton( $info );
- parent::__construct( $info );
- }
-
- public function getInputHTML( $value ) {
- return $this->mClassWithButton->getElement( parent::getInputHTML( $value ) );
- }
-}
+++ /dev/null
-<?php
-
-use MediaWiki\Widget\TitleInputWidget;
-
-/**
- * Implements a text input field for page titles.
- * Automatically does validation that the title is valid,
- * as well as autocompletion if using the OOUI display format.
- *
- * Note: Forms using GET requests will need to make sure the title value is not
- * an empty string.
- *
- * Optional parameters:
- * 'namespace' - Namespace the page must be in
- * 'relative' - If true and 'namespace' given, strip/add the namespace from/to the title as needed
- * 'creatable' - Whether to validate the title is creatable (not a special page)
- * 'exists' - Whether to validate that the title already exists
- *
- * @since 1.26
- */
-class HTMLTitleTextField extends HTMLTextField {
- public function __construct( $params ) {
- $params += [
- 'namespace' => false,
- 'relative' => false,
- 'creatable' => false,
- 'exists' => false,
- ];
-
- parent::__construct( $params );
- }
-
- public function validate( $value, $alldata ) {
- if ( $this->mParent->getMethod() === 'get' && $value === '' ) {
- // If the form is a GET form and has no value, assume it hasn't been
- // submitted yet, and skip validation
- return parent::validate( $value, $alldata );
- }
- try {
- if ( !$this->mParams['relative'] ) {
- $title = Title::newFromTextThrow( $value );
- } else {
- // Can't use Title::makeTitleSafe(), because it doesn't throw useful exceptions
- global $wgContLang;
- $namespaceName = $wgContLang->getNsText( $this->mParams['namespace'] );
- $title = Title::newFromTextThrow( $namespaceName . ':' . $value );
- }
- } catch ( MalformedTitleException $e ) {
- $msg = $this->msg( $e->getErrorMessage() );
- $params = $e->getErrorMessageParameters();
- if ( $params ) {
- $msg->params( $params );
- }
- return $msg->parse();
- }
-
- $text = $title->getPrefixedText();
- if ( $this->mParams['namespace'] !== false &&
- !$title->inNamespace( $this->mParams['namespace'] )
- ) {
- return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text )->parse();
- }
-
- if ( $this->mParams['creatable'] && !$title->canExist() ) {
- return $this->msg( 'htmlform-title-not-creatable', $text )->escaped();
- }
-
- if ( $this->mParams['exists'] && !$title->exists() ) {
- return $this->msg( 'htmlform-title-not-exists', $text )->parse();
- }
-
- return parent::validate( $value, $alldata );
- }
-
- protected function getInputWidget( $params ) {
- $this->mParent->getOutput()->addModules( 'mediawiki.widgets' );
- if ( $this->mParams['namespace'] !== false ) {
- $params['namespace'] = $this->mParams['namespace'];
- }
- $params['relative'] = $this->mParams['relative'];
- return new TitleInputWidget( $params );
- }
-
- public function getInputHtml( $value ) {
- // add mw-searchInput class to enable search suggestions for non-OOUI, too
- $this->mClass .= 'mw-searchInput';
-
- // return the HTMLTextField html
- return parent::getInputHTML( $value );
- }
-
- protected function getDataAttribs() {
- return [
- 'data-mw-searchsuggest' => FormatJson::encode( [
- 'wrapAsLink' => false,
- ] ),
- ];
- }
-}
+++ /dev/null
-<?php
-
-use MediaWiki\Widget\UserInputWidget;
-
-/**
- * Implements a text input field for user names.
- * Automatically auto-completes if using the OOUI display format.
- *
- * FIXME: Does not work for forms that support GET requests.
- *
- * Optional parameters:
- * 'exists' - Whether to validate that the user already exists
- *
- * @since 1.26
- */
-class HTMLUserTextField extends HTMLTextField {
- public function __construct( $params ) {
- $params += [
- 'exists' => false,
- 'ipallowed' => false,
- ];
-
- parent::__construct( $params );
- }
-
- public function validate( $value, $alldata ) {
- // check, if a user exists with the given username
- $user = User::newFromName( $value, false );
-
- if ( !$user ) {
- return $this->msg( 'htmlform-user-not-valid', $value )->parse();
- } elseif (
- ( $this->mParams['exists'] && $user->getId() === 0 ) &&
- !( $this->mParams['ipallowed'] && User::isIP( $value ) )
- ) {
- return $this->msg( 'htmlform-user-not-exists', $user->getName() )->parse();
- }
-
- return parent::validate( $value, $alldata );
- }
-
- protected function getInputWidget( $params ) {
- $this->mParent->getOutput()->addModules( 'mediawiki.widgets.UserInputWidget' );
-
- return new UserInputWidget( $params );
- }
-
- public function getInputHtml( $value ) {
- // add the required module and css class for user suggestions in non-OOUI mode
- $this->mParent->getOutput()->addModules( 'mediawiki.userSuggest' );
- $this->mClass .= ' mw-autocomplete-user';
-
- // return parent html
- return parent::getInputHTML( $value );
- }
-}
--- /dev/null
+<?php
+
+class HTMLApiField extends HTMLFormField {
+ public function getTableRow( $value ) {
+ return '';
+ }
+
+ public function getDiv( $value ) {
+ return $this->getTableRow( $value );
+ }
+
+ public function getRaw( $value ) {
+ return $this->getTableRow( $value );
+ }
+
+ public function getInputHTML( $value ) {
+ return '';
+ }
+
+ public function hasVisibleOutput() {
+ return false;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * Text field for selecting a value from a large list of possible values, with
+ * auto-completion and optionally with a select dropdown for selecting common
+ * options.
+ *
+ * HTMLComboboxField implements most of the same functionality and should be
+ * used instead, if possible.
+ *
+ * If one of 'options-messages', 'options', or 'options-message' is provided
+ * and non-empty, the select dropdown will be shown. An 'other' key will be
+ * appended using message 'htmlform-selectorother-other' if not already
+ * present.
+ *
+ * Besides the parameters recognized by HTMLTextField, the following are
+ * recognized:
+ * options-messages - As for HTMLSelectField
+ * options - As for HTMLSelectField
+ * options-message - As for HTMLSelectField
+ * autocomplete - Associative array mapping display text to values.
+ * autocomplete-messages - Like autocomplete, but keys are message names.
+ * require-match - Boolean, if true the value must be in the options or the
+ * autocomplete.
+ * other-message - Message to use instead of htmlform-selectorother-other for
+ * the 'other' message.
+ * other - Raw text to use for the 'other' message
+ */
+class HTMLAutoCompleteSelectField extends HTMLTextField {
+ protected $autocomplete = [];
+
+ function __construct( $params ) {
+ $params += [
+ 'require-match' => false,
+ ];
+
+ parent::__construct( $params );
+
+ if ( array_key_exists( 'autocomplete-messages', $this->mParams ) ) {
+ foreach ( $this->mParams['autocomplete-messages'] as $key => $value ) {
+ $key = $this->msg( $key )->plain();
+ $this->autocomplete[$key] = strval( $value );
+ }
+ } elseif ( array_key_exists( 'autocomplete', $this->mParams ) ) {
+ foreach ( $this->mParams['autocomplete'] as $key => $value ) {
+ $this->autocomplete[$key] = strval( $value );
+ }
+ }
+ if ( !is_array( $this->autocomplete ) || !$this->autocomplete ) {
+ throw new MWException( 'HTMLAutoCompleteSelectField called without any autocompletions' );
+ }
+
+ $this->getOptions();
+ if ( $this->mOptions && !in_array( 'other', $this->mOptions, true ) ) {
+ if ( isset( $params['other-message'] ) ) {
+ $msg = $this->getMessage( $params['other-message'] )->text();
+ } elseif ( isset( $params['other'] ) ) {
+ $msg = $params['other'];
+ } else {
+ $msg = wfMessage( 'htmlform-selectorother-other' )->text();
+ }
+ $this->mOptions[$msg] = 'other';
+ }
+ }
+
+ function loadDataFromRequest( $request ) {
+ if ( $request->getCheck( $this->mName ) ) {
+ $val = $request->getText( $this->mName . '-select', 'other' );
+
+ if ( $val === 'other' ) {
+ $val = $request->getText( $this->mName );
+ if ( isset( $this->autocomplete[$val] ) ) {
+ $val = $this->autocomplete[$val];
+ }
+ }
+
+ return $val;
+ } else {
+ return $this->getDefault();
+ }
+ }
+
+ function validate( $value, $alldata ) {
+ $p = parent::validate( $value, $alldata );
+
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
+
+ if ( in_array( strval( $value ), $validOptions, true ) ) {
+ return true;
+ } elseif ( in_array( strval( $value ), $this->autocomplete, true ) ) {
+ return true;
+ } elseif ( $this->mParams['require-match'] ) {
+ return $this->msg( 'htmlform-select-badoption' )->parse();
+ }
+
+ return true;
+ }
+
+ // FIXME Ewww, this shouldn't be adding any attributes not requested in $list :(
+ public function getAttributes( array $list ) {
+ $attribs = [
+ 'type' => 'text',
+ 'data-autocomplete' => FormatJson::encode( array_keys( $this->autocomplete ) ),
+ ] + parent::getAttributes( $list );
+
+ if ( $this->getOptions() ) {
+ $attribs['data-hide-if'] = FormatJson::encode(
+ [ '!==', $this->mName . '-select', 'other' ]
+ );
+ }
+
+ return $attribs;
+ }
+
+ function getInputHTML( $value ) {
+ $oldClass = $this->mClass;
+ $this->mClass = (array)$this->mClass;
+
+ $valInSelect = false;
+ $ret = '';
+
+ if ( $this->getOptions() ) {
+ if ( $value !== false ) {
+ $value = strval( $value );
+ $valInSelect = in_array(
+ $value, HTMLFormField::flattenOptions( $this->getOptions() ), true
+ );
+ }
+
+ $selected = $valInSelect ? $value : 'other';
+ $select = new XmlSelect( $this->mName . '-select', $this->mID . '-select', $selected );
+ $select->addOptions( $this->getOptions() );
+ $select->setAttribute( 'class', 'mw-htmlform-select-or-other' );
+
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $select->setAttribute( 'disabled', 'disabled' );
+ }
+
+ if ( isset( $this->mParams['tabindex'] ) ) {
+ $select->setAttribute( 'tabindex', $this->mParams['tabindex'] );
+ }
+
+ $ret = $select->getHTML() . "<br />\n";
+
+ $this->mClass[] = 'mw-htmlform-hide-if';
+ }
+
+ if ( $valInSelect ) {
+ $value = '';
+ } else {
+ $key = array_search( strval( $value ), $this->autocomplete, true );
+ if ( $key !== false ) {
+ $value = $key;
+ }
+ }
+
+ $this->mClass[] = 'mw-htmlform-autocomplete';
+ $ret .= parent::getInputHTML( $valInSelect ? '' : $value );
+ $this->mClass = $oldClass;
+
+ return $ret;
+ }
+
+ /**
+ * Get the OOUI version of this input.
+ * @param string $value
+ * @return false
+ */
+ function getInputOOUI( $value ) {
+ // To be implemented, for now override the function from HTMLTextField
+ return false;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * Adds a generic button inline to the form. Does not do anything, you must add
+ * click handling code in JavaScript. Use a HTMLSubmitField if you merely
+ * wish to add a submit button to a form.
+ *
+ * Additional recognized configuration parameters include:
+ * - flags: OOUI flags for the button, see OOUI\FlaggedElement
+ * - buttonlabel-message: Message to use for the button display text, instead
+ * of the value from 'default'. Overrides 'buttonlabel' and 'buttonlabel-raw'.
+ * - buttonlabel: Text to display for the button display text, instead
+ * of the value from 'default'. Overrides 'buttonlabel-raw'.
+ * - buttonlabel-raw: HTMLto display for the button display text, instead
+ * of the value from 'default'.
+ *
+ * Note that the buttonlabel parameters are not supported on IE6 and IE7 due to
+ * bugs in those browsers. If detected, they will be served buttons using the
+ * value of 'default' as the button label.
+ *
+ * @since 1.22
+ */
+class HTMLButtonField extends HTMLFormField {
+ protected $buttonType = 'button';
+ protected $buttonLabel = null;
+
+ /** @var array $mFlags Flags to add to OOUI Button widget */
+ protected $mFlags = [];
+
+ public function __construct( $info ) {
+ $info['nodata'] = true;
+ if ( isset( $info['flags'] ) ) {
+ $this->mFlags = $info['flags'];
+ }
+
+ # Generate the label from a message, if possible
+ if ( isset( $info['buttonlabel-message'] ) ) {
+ $this->buttonLabel = $this->getMessage( $info['buttonlabel-message'] )->parse();
+ } elseif ( isset( $info['buttonlabel'] ) ) {
+ if ( $info['buttonlabel'] === ' ' ) {
+ // Apparently some things set   directly and in an odd format
+ $this->buttonLabel = ' ';
+ } else {
+ $this->buttonLabel = htmlspecialchars( $info['buttonlabel'] );
+ }
+ } elseif ( isset( $info['buttonlabel-raw'] ) ) {
+ $this->buttonLabel = $info['buttonlabel-raw'];
+ }
+
+ $this->setShowEmptyLabel( false );
+
+ parent::__construct( $info );
+ }
+
+ public function getInputHTML( $value ) {
+ $flags = '';
+ $prefix = 'mw-htmlform-';
+ if ( $this->mParent instanceof VFormHTMLForm ||
+ $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' )
+ ) {
+ $prefix = 'mw-ui-';
+ // add mw-ui-button separately, so the descriptor doesn't need to set it
+ $flags .= ' ' . $prefix . 'button';
+ }
+ foreach ( $this->mFlags as $flag ) {
+ $flags .= ' ' . $prefix . $flag;
+ }
+ $attr = [
+ 'class' => 'mw-htmlform-submit ' . $this->mClass . $flags,
+ 'id' => $this->mID,
+ 'type' => $this->buttonType,
+ 'name' => $this->mName,
+ 'value' => $this->getDefault(),
+ ] + $this->getAttributes( [ 'disabled', 'tabindex' ] );
+
+ if ( $this->isBadIE() ) {
+ return Html::element( 'input', $attr );
+ } else {
+ return Html::rawElement( 'button', $attr,
+ $this->buttonLabel ?: htmlspecialchars( $this->getDefault() ) );
+ }
+ }
+
+ /**
+ * Get the OOUI widget for this field.
+ * @param string $value
+ * @return OOUI\ButtonInputWidget
+ */
+ public function getInputOOUI( $value ) {
+ return new OOUI\ButtonInputWidget( [
+ 'name' => $this->mName,
+ 'value' => $this->getDefault(),
+ 'label' => !$this->isBadIE() && $this->buttonLabel
+ ? new OOUI\HtmlSnippet( $this->buttonLabel )
+ : $this->getDefault(),
+ 'type' => $this->buttonType,
+ 'classes' => [ 'mw-htmlform-submit', $this->mClass ],
+ 'id' => $this->mID,
+ 'flags' => $this->mFlags,
+ 'useInputTag' => $this->isBadIE(),
+ ] + OOUI\Element::configFromHtmlAttributes(
+ $this->getAttributes( [ 'disabled', 'tabindex' ] )
+ ) );
+ }
+
+ protected function needsLabel() {
+ return false;
+ }
+
+ /**
+ * Button cannot be invalid
+ *
+ * @param string $value
+ * @param array $alldata
+ *
+ * @return bool
+ */
+ public function validate( $value, $alldata ) {
+ return true;
+ }
+
+ /**
+ * IE<8 has bugs with <button>, so we'll need to avoid them.
+ * @return bool Whether the request is from a bad version of IE
+ */
+ private function isBadIE() {
+ $request = $this->mParent
+ ? $this->mParent->getRequest()
+ : RequestContext::getMain()->getRequest();
+ return preg_match( '/MSIE [1-7]\./i', $request->getHeader( 'User-Agent' ) );
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * A checkbox field
+ */
+class HTMLCheckField extends HTMLFormField {
+ function getInputHTML( $value ) {
+ global $wgUseMediaWikiUIEverywhere;
+
+ if ( !empty( $this->mParams['invert'] ) ) {
+ $value = !$value;
+ }
+
+ $attr = $this->getTooltipAndAccessKey();
+ $attr['id'] = $this->mID;
+
+ $attr += $this->getAttributes( [ 'disabled', 'tabindex' ] );
+
+ if ( $this->mClass !== '' ) {
+ $attr['class'] = $this->mClass;
+ }
+
+ $attrLabel = [ 'for' => $this->mID ];
+ if ( isset( $attr['title'] ) ) {
+ // propagate tooltip to label
+ $attrLabel['title'] = $attr['title'];
+ }
+
+ $chkLabel = Xml::check( $this->mName, $value, $attr ) .
+ ' ' .
+ Html::rawElement( 'label', $attrLabel, $this->mLabel );
+
+ if ( $wgUseMediaWikiUIEverywhere || $this->mParent instanceof VFormHTMLForm ) {
+ $chkLabel = Html::rawElement(
+ 'div',
+ [ 'class' => 'mw-ui-checkbox' ],
+ $chkLabel
+ );
+ }
+
+ return $chkLabel;
+ }
+
+ /**
+ * Get the OOUI version of this field.
+ * @since 1.26
+ * @param string $value
+ * @return OOUI\CheckboxInputWidget The checkbox widget.
+ */
+ public function getInputOOUI( $value ) {
+ if ( !empty( $this->mParams['invert'] ) ) {
+ $value = !$value;
+ }
+
+ $attr = $this->getTooltipAndAccessKey();
+ $attr['id'] = $this->mID;
+ $attr['name'] = $this->mName;
+
+ $attr += OOUI\Element::configFromHtmlAttributes(
+ $this->getAttributes( [ 'disabled', 'tabindex' ] )
+ );
+
+ if ( $this->mClass !== '' ) {
+ $attr['classes'] = [ $this->mClass ];
+ }
+
+ $attr['selected'] = $value;
+ $attr['value'] = '1'; // Nasty hack, but needed to make this work
+
+ return new OOUI\CheckboxInputWidget( $attr );
+ }
+
+ /**
+ * For a checkbox, the label goes on the right hand side, and is
+ * added in getInputHTML(), rather than HTMLFormField::getRow()
+ *
+ * ...unless OOUI is being used, in which case we actually return
+ * the label here.
+ *
+ * @return string
+ */
+ function getLabel() {
+ if ( $this->mParent instanceof OOUIHTMLForm ) {
+ return $this->mLabel;
+ } elseif (
+ $this->mParent instanceof HTMLForm &&
+ $this->mParent->getDisplayFormat() === 'div'
+ ) {
+ return '';
+ } else {
+ return ' ';
+ }
+ }
+
+ /**
+ * Get label alignment when generating field for OOUI.
+ * @return string 'left', 'right', 'top' or 'inline'
+ */
+ protected function getLabelAlignOOUI() {
+ return 'inline';
+ }
+
+ /**
+ * checkboxes don't need a label.
+ * @return bool
+ */
+ protected function needsLabel() {
+ return false;
+ }
+
+ /**
+ * @param WebRequest $request
+ *
+ * @return bool
+ */
+ function loadDataFromRequest( $request ) {
+ $invert = isset( $this->mParams['invert'] ) && $this->mParams['invert'];
+
+ // GetCheck won't work like we want for checks.
+ // Fetch the value in either one of the two following case:
+ // - we have a valid submit attempt (form was just submitted, or a GET URL forged by the user)
+ // - checkbox name has a value (false or true), ie is not null
+ if ( $this->isSubmitAttempt( $request ) || $request->getVal( $this->mName ) !== null ) {
+ return $invert
+ ? !$request->getBool( $this->mName )
+ : $request->getBool( $this->mName );
+ } else {
+ return (bool)$this->getDefault();
+ }
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * A checkbox matrix
+ * Operates similarly to HTMLMultiSelectField, but instead of using an array of
+ * options, uses an array of rows and an array of columns to dynamically
+ * construct a matrix of options. The tags used to identify a particular cell
+ * are of the form "columnName-rowName"
+ *
+ * Options:
+ * - columns
+ * - Required list of columns in the matrix.
+ * - rows
+ * - Required list of rows in the matrix.
+ * - force-options-on
+ * - Accepts array of column-row tags to be displayed as enabled but unavailable to change
+ * - force-options-off
+ * - Accepts array of column-row tags to be displayed as disabled but unavailable to change.
+ * - tooltips
+ * - Optional array mapping row label to tooltip content
+ * - tooltip-class
+ * - Optional CSS class used on tooltip container span. Defaults to mw-icon-question.
+ */
+class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
+ static private $requiredParams = [
+ // Required by underlying HTMLFormField
+ 'fieldname',
+ // Required by HTMLCheckMatrix
+ 'rows',
+ 'columns'
+ ];
+
+ public function __construct( $params ) {
+ $missing = array_diff( self::$requiredParams, array_keys( $params ) );
+ if ( $missing ) {
+ throw new HTMLFormFieldRequiredOptionsException( $this, $missing );
+ }
+ parent::__construct( $params );
+ }
+
+ function validate( $value, $alldata ) {
+ $rows = $this->mParams['rows'];
+ $columns = $this->mParams['columns'];
+
+ // Make sure user-defined validation callback is run
+ $p = parent::validate( $value, $alldata );
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ // Make sure submitted value is an array
+ if ( !is_array( $value ) ) {
+ return false;
+ }
+
+ // If all options are valid, array_intersect of the valid options
+ // and the provided options will return the provided options.
+ $validOptions = [];
+ foreach ( $rows as $rowTag ) {
+ foreach ( $columns as $columnTag ) {
+ $validOptions[] = $columnTag . '-' . $rowTag;
+ }
+ }
+ $validValues = array_intersect( $value, $validOptions );
+ if ( count( $validValues ) == count( $value ) ) {
+ return true;
+ } else {
+ return $this->msg( 'htmlform-select-badoption' )->parse();
+ }
+ }
+
+ /**
+ * Build a table containing a matrix of checkbox options.
+ * The value of each option is a combination of the row tag and column tag.
+ * mParams['rows'] is an array with row labels as keys and row tags as values.
+ * mParams['columns'] is an array with column labels as keys and column tags as values.
+ *
+ * @param array $value Array of the options that should be checked
+ *
+ * @return string
+ */
+ function getInputHTML( $value ) {
+ $html = '';
+ $tableContents = '';
+ $rows = $this->mParams['rows'];
+ $columns = $this->mParams['columns'];
+
+ $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
+
+ // Build the column headers
+ $headerContents = Html::rawElement( 'td', [], ' ' );
+ foreach ( $columns as $columnLabel => $columnTag ) {
+ $headerContents .= Html::rawElement( 'td', [], $columnLabel );
+ }
+ $tableContents .= Html::rawElement( 'tr', [], "\n$headerContents\n" );
+
+ $tooltipClass = 'mw-icon-question';
+ if ( isset( $this->mParams['tooltip-class'] ) ) {
+ $tooltipClass = $this->mParams['tooltip-class'];
+ }
+
+ // Build the options matrix
+ foreach ( $rows as $rowLabel => $rowTag ) {
+ // Append tooltip if configured
+ if ( isset( $this->mParams['tooltips'][$rowLabel] ) ) {
+ $tooltipAttribs = [
+ 'class' => "mw-htmlform-tooltip $tooltipClass",
+ 'title' => $this->mParams['tooltips'][$rowLabel],
+ ];
+ $rowLabel .= ' ' . Html::element( 'span', $tooltipAttribs, '' );
+ }
+ $rowContents = Html::rawElement( 'td', [], $rowLabel );
+ foreach ( $columns as $columnTag ) {
+ $thisTag = "$columnTag-$rowTag";
+ // Construct the checkbox
+ $thisAttribs = [
+ 'id' => "{$this->mID}-$thisTag",
+ 'value' => $thisTag,
+ ];
+ $checked = in_array( $thisTag, (array)$value, true );
+ if ( $this->isTagForcedOff( $thisTag ) ) {
+ $checked = false;
+ $thisAttribs['disabled'] = 1;
+ } elseif ( $this->isTagForcedOn( $thisTag ) ) {
+ $checked = true;
+ $thisAttribs['disabled'] = 1;
+ }
+
+ $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs );
+
+ $rowContents .= Html::rawElement(
+ 'td',
+ [],
+ $checkbox
+ );
+ }
+ $tableContents .= Html::rawElement( 'tr', [], "\n$rowContents\n" );
+ }
+
+ // Put it all in a table
+ $html .= Html::rawElement( 'table',
+ [ 'class' => 'mw-htmlform-matrix' ],
+ Html::rawElement( 'tbody', [], "\n$tableContents\n" ) ) . "\n";
+
+ return $html;
+ }
+
+ protected function getOneCheckbox( $checked, $attribs ) {
+ if ( $this->mParent instanceof OOUIHTMLForm ) {
+ return new OOUI\CheckboxInputWidget( [
+ 'name' => "{$this->mName}[]",
+ 'selected' => $checked,
+ ] + OOUI\Element::configFromHtmlAttributes(
+ $attribs
+ ) );
+ } else {
+ $checkbox = Xml::check( "{$this->mName}[]", $checked, $attribs );
+ if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
+ $checkbox = Html::openElement( 'div', [ 'class' => 'mw-ui-checkbox' ] ) .
+ $checkbox .
+ Html::element( 'label', [ 'for' => $attribs['id'] ] ) .
+ Html::closeElement( 'div' );
+ }
+ return $checkbox;
+ }
+ }
+
+ protected function isTagForcedOff( $tag ) {
+ return isset( $this->mParams['force-options-off'] )
+ && in_array( $tag, $this->mParams['force-options-off'] );
+ }
+
+ protected function isTagForcedOn( $tag ) {
+ return isset( $this->mParams['force-options-on'] )
+ && in_array( $tag, $this->mParams['force-options-on'] );
+ }
+
+ /**
+ * Get the complete table row for the input, including help text,
+ * labels, and whatever.
+ * We override this function since the label should always be on a separate
+ * line above the options in the case of a checkbox matrix, i.e. it's always
+ * a "vertical-label".
+ *
+ * @param string $value The value to set the input to
+ *
+ * @return string Complete HTML table row
+ */
+ function getTableRow( $value ) {
+ list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
+ $inputHtml = $this->getInputHTML( $value );
+ $fieldType = get_class( $this );
+ $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
+ $cellAttributes = [ 'colspan' => 2 ];
+
+ $hideClass = '';
+ $hideAttributes = [];
+ if ( $this->mHideIf ) {
+ $hideAttributes['data-hide-if'] = FormatJson::encode( $this->mHideIf );
+ $hideClass = 'mw-htmlform-hide-if';
+ }
+
+ $label = $this->getLabelHtml( $cellAttributes );
+
+ $field = Html::rawElement(
+ 'td',
+ [ 'class' => 'mw-input' ] + $cellAttributes,
+ $inputHtml . "\n$errors"
+ );
+
+ $html = Html::rawElement( 'tr',
+ [ 'class' => "mw-htmlform-vertical-label $hideClass" ] + $hideAttributes,
+ $label );
+ $html .= Html::rawElement( 'tr',
+ [ 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass $hideClass" ] +
+ $hideAttributes,
+ $field );
+
+ return $html . $helptext;
+ }
+
+ /**
+ * @param WebRequest $request
+ *
+ * @return array
+ */
+ function loadDataFromRequest( $request ) {
+ if ( $this->isSubmitAttempt( $request ) ) {
+ // Checkboxes are just not added to the request arrays if they're not checked,
+ // so it's perfectly possible for there not to be an entry at all
+ return $request->getArray( $this->mName, [] );
+ } else {
+ // That's ok, the user has not yet submitted the form, so show the defaults
+ return $this->getDefault();
+ }
+ }
+
+ function getDefault() {
+ if ( isset( $this->mDefault ) ) {
+ return $this->mDefault;
+ } else {
+ return [];
+ }
+ }
+
+ function filterDataForSubmit( $data ) {
+ $columns = HTMLFormField::flattenOptions( $this->mParams['columns'] );
+ $rows = HTMLFormField::flattenOptions( $this->mParams['rows'] );
+ $res = [];
+ foreach ( $columns as $column ) {
+ foreach ( $rows as $row ) {
+ // Make sure option hasn't been forced
+ $thisTag = "$column-$row";
+ if ( $this->isTagForcedOff( $thisTag ) ) {
+ $res[$thisTag] = false;
+ } elseif ( $this->isTagForcedOn( $thisTag ) ) {
+ $res[$thisTag] = true;
+ } else {
+ $res[$thisTag] = in_array( $thisTag, $data );
+ }
+ }
+ }
+
+ return $res;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * A combo box field.
+ *
+ * You can think of it as a dropdown select with the ability to add custom options,
+ * or as a text field with input suggestions (autocompletion).
+ *
+ * When JavaScript is not supported or enabled, it uses HTML5 `<datalist>` element.
+ *
+ * Besides the parameters recognized by HTMLTextField, the following are
+ * recognized:
+ * options-messages - As for HTMLSelectField
+ * options - As for HTMLSelectField
+ * options-message - As for HTMLSelectField
+ */
+class HTMLComboboxField extends HTMLTextField {
+ // FIXME Ewww, this shouldn't be adding any attributes not requested in $list :(
+ public function getAttributes( array $list ) {
+ $attribs = [
+ 'type' => 'text',
+ 'list' => $this->mName . '-datalist',
+ ] + parent::getAttributes( $list );
+
+ return $attribs;
+ }
+
+ function getInputHTML( $value ) {
+ $datalist = new XmlSelect( false, $this->mName . '-datalist' );
+ $datalist->setTagName( 'datalist' );
+ $datalist->addOptions( $this->getOptions() );
+
+ return parent::getInputHTML( $value ) . $datalist->getHTML();
+ }
+
+ function getInputOOUI( $value ) {
+ $disabled = false;
+ $allowedParams = [ 'tabindex' ];
+ $attribs = OOUI\Element::configFromHtmlAttributes(
+ $this->getAttributes( $allowedParams )
+ );
+
+ if ( $this->mClass !== '' ) {
+ $attribs['classes'] = [ $this->mClass ];
+ }
+
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $disabled = true;
+ }
+
+ return new OOUI\ComboBoxInputWidget( [
+ 'name' => $this->mName,
+ 'id' => $this->mID,
+ 'options' => $this->getOptionsOOUI(),
+ 'value' => strval( $value ),
+ 'disabled' => $disabled,
+ ] + $attribs );
+ }
+}
--- /dev/null
+<?php
+
+class HTMLEditTools extends HTMLFormField {
+ public function getInputHTML( $value ) {
+ return '';
+ }
+
+ public function getTableRow( $value ) {
+ $msg = $this->formatMsg();
+
+ return
+ '<tr><td></td><td class="mw-input">' .
+ '<div class="mw-editTools">' .
+ $msg->parseAsBlock() .
+ "</div></td></tr>\n";
+ }
+
+ /**
+ * @param string $value
+ * @return string
+ * @since 1.20
+ */
+ public function getDiv( $value ) {
+ $msg = $this->formatMsg();
+
+ return '<div class="mw-editTools">' . $msg->parseAsBlock() . '</div>';
+ }
+
+ /**
+ * @param string $value
+ * @return string
+ * @since 1.20
+ */
+ public function getRaw( $value ) {
+ return $this->getDiv( $value );
+ }
+
+ protected function formatMsg() {
+ if ( empty( $this->mParams['message'] ) ) {
+ $msg = $this->msg( 'edittools' );
+ } else {
+ $msg = $this->getMessage( $this->mParams['message'] );
+ if ( $msg->isDisabled() ) {
+ $msg = $this->msg( 'edittools' );
+ }
+ }
+ $msg->inContentLanguage();
+
+ return $msg;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * A field that will contain a numeric value
+ */
+class HTMLFloatField extends HTMLTextField {
+ function getSize() {
+ return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 20;
+ }
+
+ function validate( $value, $alldata ) {
+ $p = parent::validate( $value, $alldata );
+
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ $value = trim( $value );
+
+ # http://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers
+ # with the addition that a leading '+' sign is ok.
+ if ( !preg_match( '/^((\+|\-)?\d+(\.\d+)?(E(\+|\-)?\d+)?)?$/i', $value ) ) {
+ return $this->msg( 'htmlform-float-invalid' )->parseAsBlock();
+ }
+
+ # The "int" part of these message names is rather confusing.
+ # They make equal sense for all numbers.
+ if ( isset( $this->mParams['min'] ) ) {
+ $min = $this->mParams['min'];
+
+ if ( $min > $value ) {
+ return $this->msg( 'htmlform-int-toolow', $min )->parseAsBlock();
+ }
+ }
+
+ if ( isset( $this->mParams['max'] ) ) {
+ $max = $this->mParams['max'];
+
+ if ( $max < $value ) {
+ return $this->msg( 'htmlform-int-toohigh', $max )->parseAsBlock();
+ }
+ }
+
+ return true;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * A container for HTMLFormFields that allows for multiple copies of the set of
+ * fields to be displayed to and entered by the user.
+ *
+ * Recognized parameters, besides the general ones, include:
+ * fields - HTMLFormField descriptors for the subfields this cloner manages.
+ * The format is just like for the HTMLForm. A field with key 'delete' is
+ * special: it must have type = submit and will serve to delete the group
+ * of fields.
+ * required - If specified, at least one group of fields must be submitted.
+ * format - HTMLForm display format to use when displaying the subfields:
+ * 'table', 'div', or 'raw'.
+ * row-legend - If non-empty, each group of subfields will be enclosed in a
+ * fieldset. The value is the name of a message key to use as the legend.
+ * create-button-message - Message to use as the text of the button to
+ * add an additional group of fields.
+ * delete-button-message - Message to use as the text of automatically-
+ * generated 'delete' button. Ignored if 'delete' is included in 'fields'.
+ *
+ * In the generated HTML, the subfields will be named along the lines of
+ * "clonerName[index][fieldname]", with ids "clonerId--index--fieldid". 'index'
+ * may be a number or an arbitrary string, and may likely change when the page
+ * is resubmitted. Cloners may be nested, resulting in field names along the
+ * lines of "cloner1Name[index1][cloner2Name][index2][fieldname]" and
+ * corresponding ids.
+ *
+ * Use of cloner may result in submissions of the page that are not submissions
+ * of the HTMLForm, when non-JavaScript clients use the create or remove buttons.
+ *
+ * The result is an array, with values being arrays mapping subfield names to
+ * their values. On non-HTMLForm-submission page loads, there may also be
+ * additional (string) keys present with other types of values.
+ *
+ * @since 1.23
+ */
+class HTMLFormFieldCloner extends HTMLFormField {
+ private static $counter = 0;
+
+ /**
+ * @var string String uniquely identifying this cloner instance and
+ * unlikely to exist otherwise in the generated HTML, while still being
+ * valid as part of an HTML id.
+ */
+ protected $uniqueId;
+
+ public function __construct( $params ) {
+ $this->uniqueId = get_class( $this ) . ++self::$counter . 'x';
+ parent::__construct( $params );
+
+ if ( empty( $this->mParams['fields'] ) || !is_array( $this->mParams['fields'] ) ) {
+ throw new MWException( 'HTMLFormFieldCloner called without any fields' );
+ }
+
+ // Make sure the delete button, if explicitly specified, is sane
+ if ( isset( $this->mParams['fields']['delete'] ) ) {
+ $class = 'mw-htmlform-cloner-delete-button';
+ $info = $this->mParams['fields']['delete'] + [
+ 'cssclass' => $class
+ ];
+ unset( $info['name'], $info['class'] );
+
+ if ( !isset( $info['type'] ) || $info['type'] !== 'submit' ) {
+ throw new MWException(
+ 'HTMLFormFieldCloner delete field, if specified, must be of type "submit"'
+ );
+ }
+
+ if ( !in_array( $class, explode( ' ', $info['cssclass'] ) ) ) {
+ $info['cssclass'] .= " $class";
+ }
+
+ $this->mParams['fields']['delete'] = $info;
+ }
+ }
+
+ /**
+ * Create the HTMLFormFields that go inside this element, using the
+ * specified key.
+ *
+ * @param string $key Array key under which these fields should be named
+ * @return HTMLFormField[]
+ */
+ protected function createFieldsForKey( $key ) {
+ $fields = [];
+ foreach ( $this->mParams['fields'] as $fieldname => $info ) {
+ $name = "{$this->mName}[$key][$fieldname]";
+ if ( isset( $info['name'] ) ) {
+ $info['name'] = "{$this->mName}[$key][{$info['name']}]";
+ } else {
+ $info['name'] = $name;
+ }
+ if ( isset( $info['id'] ) ) {
+ $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--{$info['id']}" );
+ } else {
+ $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--$fieldname" );
+ }
+ $field = HTMLForm::loadInputFromParameters( $name, $info, $this->mParent );
+ $fields[$fieldname] = $field;
+ }
+ return $fields;
+ }
+
+ /**
+ * Re-key the specified values array to match the names applied by
+ * createFieldsForKey().
+ *
+ * @param string $key Array key under which these fields should be named
+ * @param array $values Values array from the request
+ * @return array
+ */
+ protected function rekeyValuesArray( $key, $values ) {
+ $data = [];
+ foreach ( $values as $fieldname => $value ) {
+ $name = "{$this->mName}[$key][$fieldname]";
+ $data[$name] = $value;
+ }
+ return $data;
+ }
+
+ protected function needsLabel() {
+ return false;
+ }
+
+ public function loadDataFromRequest( $request ) {
+ // It's possible that this might be posted with no fields. Detect that
+ // by looking for an edit token.
+ if ( !$request->getCheck( 'wpEditToken' ) && $request->getArray( $this->mName ) === null ) {
+ return $this->getDefault();
+ }
+
+ $values = $request->getArray( $this->mName );
+ if ( $values === null ) {
+ $values = [];
+ }
+
+ $ret = [];
+ foreach ( $values as $key => $value ) {
+ if ( $key === 'create' || isset( $value['delete'] ) ) {
+ $ret['nonjs'] = 1;
+ continue;
+ }
+
+ // Add back in $request->getValues() so things that look for e.g.
+ // wpEditToken don't fail.
+ $data = $this->rekeyValuesArray( $key, $value ) + $request->getValues();
+
+ $fields = $this->createFieldsForKey( $key );
+ $subrequest = new DerivativeRequest( $request, $data, $request->wasPosted() );
+ $row = [];
+ foreach ( $fields as $fieldname => $field ) {
+ if ( $field->skipLoadData( $subrequest ) ) {
+ continue;
+ } elseif ( !empty( $field->mParams['disabled'] ) ) {
+ $row[$fieldname] = $field->getDefault();
+ } else {
+ $row[$fieldname] = $field->loadDataFromRequest( $subrequest );
+ }
+ }
+ $ret[] = $row;
+ }
+
+ if ( isset( $values['create'] ) ) {
+ // Non-JS client clicked the "create" button.
+ $fields = $this->createFieldsForKey( $this->uniqueId );
+ $row = [];
+ foreach ( $fields as $fieldname => $field ) {
+ if ( !empty( $field->mParams['nodata'] ) ) {
+ continue;
+ } else {
+ $row[$fieldname] = $field->getDefault();
+ }
+ }
+ $ret[] = $row;
+ }
+
+ return $ret;
+ }
+
+ public function getDefault() {
+ $ret = parent::getDefault();
+
+ // The default default is one entry with all subfields at their
+ // defaults.
+ if ( $ret === null ) {
+ $fields = $this->createFieldsForKey( $this->uniqueId );
+ $row = [];
+ foreach ( $fields as $fieldname => $field ) {
+ if ( !empty( $field->mParams['nodata'] ) ) {
+ continue;
+ } else {
+ $row[$fieldname] = $field->getDefault();
+ }
+ }
+ $ret = [ $row ];
+ }
+
+ return $ret;
+ }
+
+ public function cancelSubmit( $values, $alldata ) {
+ if ( isset( $values['nonjs'] ) ) {
+ return true;
+ }
+
+ foreach ( $values as $key => $value ) {
+ $fields = $this->createFieldsForKey( $key );
+ foreach ( $fields as $fieldname => $field ) {
+ if ( !array_key_exists( $fieldname, $value ) ) {
+ continue;
+ }
+ if ( $field->cancelSubmit( $value[$fieldname], $alldata ) ) {
+ return true;
+ }
+ }
+ }
+
+ return parent::cancelSubmit( $values, $alldata );
+ }
+
+ public function validate( $values, $alldata ) {
+ if ( isset( $this->mParams['required'] )
+ && $this->mParams['required'] !== false
+ && !$values
+ ) {
+ return $this->msg( 'htmlform-cloner-required' )->parseAsBlock();
+ }
+
+ if ( isset( $values['nonjs'] ) ) {
+ // The submission was a non-JS create/delete click, so fail
+ // validation in case cancelSubmit() somehow didn't already handle
+ // it.
+ return false;
+ }
+
+ foreach ( $values as $key => $value ) {
+ $fields = $this->createFieldsForKey( $key );
+ foreach ( $fields as $fieldname => $field ) {
+ if ( !array_key_exists( $fieldname, $value ) ) {
+ continue;
+ }
+ $ok = $field->validate( $value[$fieldname], $alldata );
+ if ( $ok !== true ) {
+ return false;
+ }
+ }
+ }
+
+ return parent::validate( $values, $alldata );
+ }
+
+ /**
+ * Get the input HTML for the specified key.
+ *
+ * @param string $key Array key under which the fields should be named
+ * @param array $values
+ * @return string
+ */
+ protected function getInputHTMLForKey( $key, $values ) {
+ $displayFormat = isset( $this->mParams['format'] )
+ ? $this->mParams['format']
+ : $this->mParent->getDisplayFormat();
+
+ // Conveniently, PHP method names are case-insensitive.
+ $getFieldHtmlMethod = $displayFormat == 'table' ? 'getTableRow' : ( 'get' . $displayFormat );
+
+ $html = '';
+ $hidden = '';
+ $hasLabel = false;
+
+ $fields = $this->createFieldsForKey( $key );
+ foreach ( $fields as $fieldname => $field ) {
+ $v = array_key_exists( $fieldname, $values )
+ ? $values[$fieldname]
+ : $field->getDefault();
+
+ if ( $field instanceof HTMLHiddenField ) {
+ // HTMLHiddenField doesn't generate its own HTML
+ list( $name, $value, $params ) = $field->getHiddenFieldData( $v );
+ $hidden .= Html::hidden( $name, $value, $params ) . "\n";
+ } else {
+ $html .= $field->$getFieldHtmlMethod( $v );
+
+ $labelValue = trim( $field->getLabel() );
+ if ( $labelValue != ' ' && $labelValue !== '' ) {
+ $hasLabel = true;
+ }
+ }
+ }
+
+ if ( !isset( $fields['delete'] ) ) {
+ $name = "{$this->mName}[$key][delete]";
+ $label = isset( $this->mParams['delete-button-message'] )
+ ? $this->mParams['delete-button-message']
+ : 'htmlform-cloner-delete';
+ $field = HTMLForm::loadInputFromParameters( $name, [
+ 'type' => 'submit',
+ 'name' => $name,
+ 'id' => Sanitizer::escapeId( "{$this->mID}--$key--delete" ),
+ 'cssclass' => 'mw-htmlform-cloner-delete-button',
+ 'default' => $this->getMessage( $label )->text(),
+ ], $this->mParent );
+ $v = $field->getDefault();
+
+ if ( $displayFormat === 'table' ) {
+ $html .= $field->$getFieldHtmlMethod( $v );
+ } else {
+ $html .= $field->getInputHTML( $v );
+ }
+ }
+
+ if ( $displayFormat !== 'raw' ) {
+ $classes = [
+ 'mw-htmlform-cloner-row',
+ ];
+
+ if ( !$hasLabel ) { // Avoid strange spacing when no labels exist
+ $classes[] = 'mw-htmlform-nolabel';
+ }
+
+ $attribs = [
+ 'class' => implode( ' ', $classes ),
+ ];
+
+ if ( $displayFormat === 'table' ) {
+ $html = Html::rawElement( 'table',
+ $attribs,
+ Html::rawElement( 'tbody', [], "\n$html\n" ) ) . "\n";
+ } else {
+ $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
+ }
+ }
+
+ $html .= $hidden;
+
+ if ( !empty( $this->mParams['row-legend'] ) ) {
+ $legend = $this->msg( $this->mParams['row-legend'] )->text();
+ $html = Xml::fieldset( $legend, $html );
+ }
+
+ return $html;
+ }
+
+ public function getInputHTML( $values ) {
+ $html = '';
+
+ foreach ( (array)$values as $key => $value ) {
+ if ( $key === 'nonjs' ) {
+ continue;
+ }
+ $html .= Html::rawElement( 'li', [ 'class' => 'mw-htmlform-cloner-li' ],
+ $this->getInputHTMLForKey( $key, $value )
+ );
+ }
+
+ $template = $this->getInputHTMLForKey( $this->uniqueId, null );
+ $html = Html::rawElement( 'ul', [
+ 'id' => "mw-htmlform-cloner-list-{$this->mID}",
+ 'class' => 'mw-htmlform-cloner-ul',
+ 'data-template' => $template,
+ 'data-unique-id' => $this->uniqueId,
+ ], $html );
+
+ $name = "{$this->mName}[create]";
+ $label = isset( $this->mParams['create-button-message'] )
+ ? $this->mParams['create-button-message']
+ : 'htmlform-cloner-create';
+ $field = HTMLForm::loadInputFromParameters( $name, [
+ 'type' => 'submit',
+ 'name' => $name,
+ 'id' => Sanitizer::escapeId( "{$this->mID}--create" ),
+ 'cssclass' => 'mw-htmlform-cloner-create-button',
+ 'default' => $this->getMessage( $label )->text(),
+ ], $this->mParent );
+ $html .= $field->getInputHTML( $field->getDefault() );
+
+ return $html;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Enables HTMLFormField elements to be build with a button.
+ */
+class HTMLFormFieldWithButton extends HTMLFormField {
+ /** @var string $mButtonClass CSS class for the button in this field */
+ protected $mButtonClass = '';
+
+ /** @var string|integer $mButtonId Element ID for the button in this field */
+ protected $mButtonId = '';
+
+ /** @var string $mButtonName Name the button in this field */
+ protected $mButtonName = '';
+
+ /** @var string $mButtonType Type of the button in this field (e.g. button or submit) */
+ protected $mButtonType = 'submit';
+
+ /** @var string $mButtonType Value for the button in this field */
+ protected $mButtonValue;
+
+ /** @var string $mButtonType Value for the button in this field */
+ protected $mButtonFlags = [ 'progressive' ];
+
+ public function __construct( $info ) {
+ if ( isset( $info['buttonclass'] ) ) {
+ $this->mButtonClass = $info['buttonclass'];
+ }
+ if ( isset( $info['buttonid'] ) ) {
+ $this->mButtonId = $info['buttonid'];
+ }
+ if ( isset( $info['buttonname'] ) ) {
+ $this->mButtonName = $info['buttonname'];
+ }
+ if ( isset( $info['buttondefault'] ) ) {
+ $this->mButtonValue = $info['buttondefault'];
+ }
+ if ( isset( $info['buttontype'] ) ) {
+ $this->mButtonType = $info['buttontype'];
+ }
+ if ( isset( $info['buttonflags'] ) ) {
+ $this->mButtonFlags = $info['buttonflags'];
+ }
+ parent::__construct( $info );
+ }
+
+ public function getInputHTML( $value ) {
+ $attr = [
+ 'class' => 'mw-htmlform-submit ' . $this->mButtonClass,
+ 'id' => $this->mButtonId,
+ ] + $this->getAttributes( [ 'disabled', 'tabindex' ] );
+
+ return Html::input( $this->mButtonName, $this->mButtonValue, $this->mButtonType, $attr );
+ }
+
+ public function getInputOOUI( $value ) {
+ return new OOUI\ButtonInputWidget( [
+ 'name' => $this->mButtonName,
+ 'value' => $this->mButtonValue,
+ 'type' => $this->mButtonType,
+ 'label' => $this->mButtonValue,
+ 'flags' => $this->mButtonFlags,
+ ] + OOUI\Element::configFromHtmlAttributes(
+ $this->getAttributes( [ 'disabled', 'tabindex' ] )
+ ) );
+ }
+
+ /**
+ * Combines the passed element with a button.
+ * @param String $element Element to combine the button with.
+ * @return String
+ */
+ public function getElement( $element ) {
+ return $element . ' ' . $this->getInputHTML( '' );
+ }
+}
--- /dev/null
+<?php
+
+class HTMLHiddenField extends HTMLFormField {
+ protected $outputAsDefault = true;
+
+ public function __construct( $params ) {
+ parent::__construct( $params );
+
+ if ( isset( $this->mParams['output-as-default'] ) ) {
+ $this->outputAsDefault = (bool)$this->mParams['output-as-default'];
+ }
+
+ # Per HTML5 spec, hidden fields cannot be 'required'
+ # http://www.w3.org/TR/html5/forms.html#hidden-state-%28type=hidden%29
+ unset( $this->mParams['required'] );
+ }
+
+ public function getHiddenFieldData( $value ) {
+ $params = [];
+ if ( $this->mID ) {
+ $params['id'] = $this->mID;
+ }
+
+ if ( $this->outputAsDefault ) {
+ $value = $this->mDefault;
+ }
+
+ return [ $this->mName, $value, $params ];
+ }
+
+ public function getTableRow( $value ) {
+ list( $name, $value, $params ) = $this->getHiddenFieldData( $value );
+ $this->mParent->addHiddenField( $name, $value, $params );
+ return '';
+ }
+
+ /**
+ * @param string $value
+ * @return string
+ * @since 1.20
+ */
+ public function getDiv( $value ) {
+ return $this->getTableRow( $value );
+ }
+
+ /**
+ * @param string $value
+ * @return string
+ * @since 1.20
+ */
+ public function getRaw( $value ) {
+ return $this->getTableRow( $value );
+ }
+
+ public function getInputHTML( $value ) {
+ return '';
+ }
+
+ public function canDisplayErrors() {
+ return false;
+ }
+
+ public function hasVisibleOutput() {
+ return false;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * An information field (text blob), not a proper input.
+ */
+class HTMLInfoField extends HTMLFormField {
+ /**
+ * @param array $info
+ * In adition to the usual HTMLFormField parameters, this can take the following fields:
+ * - default: the value (text) of the field. Unlike other form field types, HTMLInfoField can
+ * take a closure as a default value, which will be evaluated with $info as its only parameter.
+ * - raw: if true, the value won't be escaped.
+ * - rawrow: if true, the usual wrapping of form fields (e.g. into a table row + cell when
+ * display mode is table) will not happen and the value must contain it already.
+ */
+ public function __construct( $info ) {
+ $info['nodata'] = true;
+
+ parent::__construct( $info );
+ }
+
+ function getDefault() {
+ $default = parent::getDefault();
+ if ( $default instanceof Closure ) {
+ $default = call_user_func( $default, $this->mParams );
+ }
+ return $default;
+ }
+
+ public function getInputHTML( $value ) {
+ return !empty( $this->mParams['raw'] ) ? $value : htmlspecialchars( $value );
+ }
+
+ public function getInputOOUI( $value ) {
+ if ( !empty( $this->mParams['raw'] ) ) {
+ $value = new OOUI\HtmlSnippet( $value );
+ }
+
+ return new OOUI\LabelWidget( [
+ 'label' => $value,
+ ] );
+ }
+
+ public function getTableRow( $value ) {
+ if ( !empty( $this->mParams['rawrow'] ) ) {
+ return $value;
+ }
+
+ return parent::getTableRow( $value );
+ }
+
+ /**
+ * @param string $value
+ * @return string
+ * @since 1.20
+ */
+ public function getDiv( $value ) {
+ if ( !empty( $this->mParams['rawrow'] ) ) {
+ return $value;
+ }
+
+ return parent::getDiv( $value );
+ }
+
+ /**
+ * @param string $value
+ * @return string
+ * @since 1.20
+ */
+ public function getRaw( $value ) {
+ if ( !empty( $this->mParams['rawrow'] ) ) {
+ return $value;
+ }
+
+ return parent::getRaw( $value );
+ }
+
+ protected function needsLabel() {
+ return false;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * A field that must contain a number
+ */
+class HTMLIntField extends HTMLFloatField {
+ function validate( $value, $alldata ) {
+ $p = parent::validate( $value, $alldata );
+
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ # http://www.w3.org/TR/html5/infrastructure.html#signed-integers
+ # with the addition that a leading '+' sign is ok. Note that leading zeros
+ # are fine, and will be left in the input, which is useful for things like
+ # phone numbers when you know that they are integers (the HTML5 type=tel
+ # input does not require its value to be numeric). If you want a tidier
+ # value to, eg, save in the DB, clean it up with intval().
+ if ( !preg_match( '/^((\+|\-)?\d+)?$/', trim( $value ) ) ) {
+ return $this->msg( 'htmlform-int-invalid' )->parseAsBlock();
+ }
+
+ return true;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * Multi-select field
+ */
+class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable {
+ function validate( $value, $alldata ) {
+ $p = parent::validate( $value, $alldata );
+
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ if ( !is_array( $value ) ) {
+ return false;
+ }
+
+ # If all options are valid, array_intersect of the valid options
+ # and the provided options will return the provided options.
+ $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
+
+ $validValues = array_intersect( $value, $validOptions );
+ if ( count( $validValues ) == count( $value ) ) {
+ return true;
+ } else {
+ return $this->msg( 'htmlform-select-badoption' )->parse();
+ }
+ }
+
+ function getInputHTML( $value ) {
+ $value = HTMLFormField::forceToStringRecursive( $value );
+ $html = $this->formatOptions( $this->getOptions(), $value );
+
+ return $html;
+ }
+
+ function formatOptions( $options, $value ) {
+ $html = '';
+
+ $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
+
+ foreach ( $options as $label => $info ) {
+ if ( is_array( $info ) ) {
+ $html .= Html::rawElement( 'h1', [], $label ) . "\n";
+ $html .= $this->formatOptions( $info, $value );
+ } else {
+ $thisAttribs = [
+ 'id' => "{$this->mID}-$info",
+ 'value' => $info,
+ ];
+ $checked = in_array( $info, $value, true );
+
+ $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs, $label );
+
+ $html .= ' ' . Html::rawElement(
+ 'div',
+ [ 'class' => 'mw-htmlform-flatlist-item' ],
+ $checkbox
+ );
+ }
+ }
+
+ return $html;
+ }
+
+ protected function getOneCheckbox( $checked, $attribs, $label ) {
+ if ( $this->mParent instanceof OOUIHTMLForm ) {
+ throw new MWException( 'HTMLMultiSelectField#getOneCheckbox() is not supported' );
+ } else {
+ $elementFunc = [ 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
+ $checkbox =
+ Xml::check( "{$this->mName}[]", $checked, $attribs ) .
+ ' ' .
+ call_user_func( $elementFunc,
+ 'label',
+ [ 'for' => $attribs['id'] ],
+ $label
+ );
+ if ( $this->mParent->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
+ $checkbox = Html::openElement( 'div', [ 'class' => 'mw-ui-checkbox' ] ) .
+ $checkbox .
+ Html::closeElement( 'div' );
+ }
+ return $checkbox;
+ }
+ }
+
+ /**
+ * Get the OOUI version of this field.
+ *
+ * @since 1.28
+ * @param string[] $value
+ * @return OOUI\CheckboxMultiselectInputWidget
+ */
+ public function getInputOOUI( $value ) {
+ $attr = $this->getTooltipAndAccessKey();
+ $attr['id'] = $this->mID;
+ $attr['name'] = "{$this->mName}[]";
+
+ $attr['value'] = $value;
+ $attr['options'] = $this->getOptionsOOUI();
+
+ if ( $this->mOptionsLabelsNotFromMessage ) {
+ foreach ( $attr['options'] as &$option ) {
+ $option['label'] = new OOUI\HtmlSnippet( $option['label'] );
+ }
+ }
+
+ $attr += OOUI\Element::configFromHtmlAttributes(
+ $this->getAttributes( [ 'disabled', 'tabindex' ] )
+ );
+
+ if ( $this->mClass !== '' ) {
+ $attr['classes'] = [ $this->mClass ];
+ }
+
+ return new OOUI\CheckboxMultiselectInputWidget( $attr );
+ }
+
+ /**
+ * @param WebRequest $request
+ *
+ * @return string
+ */
+ function loadDataFromRequest( $request ) {
+ if ( $this->isSubmitAttempt( $request ) ) {
+ // Checkboxes are just not added to the request arrays if they're not checked,
+ // so it's perfectly possible for there not to be an entry at all
+ return $request->getArray( $this->mName, [] );
+ } else {
+ // That's ok, the user has not yet submitted the form, so show the defaults
+ return $this->getDefault();
+ }
+ }
+
+ function getDefault() {
+ if ( isset( $this->mDefault ) ) {
+ return $this->mDefault;
+ } else {
+ return [];
+ }
+ }
+
+ function filterDataForSubmit( $data ) {
+ $data = HTMLFormField::forceToStringRecursive( $data );
+ $options = HTMLFormField::flattenOptions( $this->getOptions() );
+
+ $res = [];
+ foreach ( $options as $opt ) {
+ $res["$opt"] = in_array( $opt, $data, true );
+ }
+
+ return $res;
+ }
+
+ protected function needsLabel() {
+ return false;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * Radio checkbox fields.
+ */
+class HTMLRadioField extends HTMLFormField {
+ function validate( $value, $alldata ) {
+ $p = parent::validate( $value, $alldata );
+
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ if ( !is_string( $value ) && !is_int( $value ) ) {
+ return false;
+ }
+
+ $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
+
+ if ( in_array( strval( $value ), $validOptions, true ) ) {
+ return true;
+ } else {
+ return $this->msg( 'htmlform-select-badoption' )->parse();
+ }
+ }
+
+ /**
+ * This returns a block of all the radio options, in one cell.
+ * @see includes/HTMLFormField#getInputHTML()
+ *
+ * @param string $value
+ *
+ * @return string
+ */
+ function getInputHTML( $value ) {
+ $html = $this->formatOptions( $this->getOptions(), strval( $value ) );
+
+ return $html;
+ }
+
+ function getInputOOUI( $value ) {
+ $options = [];
+ foreach ( $this->getOptions() as $label => $data ) {
+ $options[] = [
+ 'data' => $data,
+ 'label' => $this->mOptionsLabelsNotFromMessage ? new OOUI\HtmlSnippet( $label ) : $label,
+ ];
+ }
+
+ return new OOUI\RadioSelectInputWidget( [
+ 'name' => $this->mName,
+ 'id' => $this->mID,
+ 'value' => $value,
+ 'options' => $options,
+ ] + OOUI\Element::configFromHtmlAttributes(
+ $this->getAttributes( [ 'disabled', 'tabindex' ] )
+ ) );
+ }
+
+ function formatOptions( $options, $value ) {
+ global $wgUseMediaWikiUIEverywhere;
+
+ $html = '';
+
+ $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
+ $elementFunc = [ 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
+
+ # @todo Should this produce an unordered list perhaps?
+ foreach ( $options as $label => $info ) {
+ if ( is_array( $info ) ) {
+ $html .= Html::rawElement( 'h1', [], $label ) . "\n";
+ $html .= $this->formatOptions( $info, $value );
+ } else {
+ $id = Sanitizer::escapeId( $this->mID . "-$info" );
+ $classes = [ 'mw-htmlform-flatlist-item' ];
+ if ( $wgUseMediaWikiUIEverywhere || $this->mParent instanceof VFormHTMLForm ) {
+ $classes[] = 'mw-ui-radio';
+ }
+ $radio = Xml::radio( $this->mName, $info, $info === $value, $attribs + [ 'id' => $id ] );
+ $radio .= ' ' . call_user_func( $elementFunc, 'label', [ 'for' => $id ], $label );
+
+ $html .= ' ' . Html::rawElement(
+ 'div',
+ [ 'class' => $classes ],
+ $radio
+ );
+ }
+ }
+
+ return $html;
+ }
+
+ protected function needsLabel() {
+ return false;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * Double field with a dropdown list constructed from a system message in the format
+ * * Optgroup header
+ * ** <option value>
+ * * New Optgroup header
+ * Plus a text field underneath for an additional reason. The 'value' of the field is
+ * "<select>: <extra reason>", or "<extra reason>" if nothing has been selected in the
+ * select dropdown.
+ * @todo FIXME: If made 'required', only the text field should be compulsory.
+ */
+class HTMLSelectAndOtherField extends HTMLSelectField {
+ function __construct( $params ) {
+ if ( array_key_exists( 'other', $params ) ) {
+ // Do nothing
+ } elseif ( array_key_exists( 'other-message', $params ) ) {
+ $params['other'] = $this->getMessage( $params['other-message'] )->plain();
+ } else {
+ $params['other'] = $this->msg( 'htmlform-selectorother-other' )->plain();
+ }
+
+ parent::__construct( $params );
+
+ if ( $this->getOptions() === null ) {
+ // Sulk
+ throw new MWException( 'HTMLSelectAndOtherField called without any options' );
+ }
+ if ( !in_array( 'other', $this->mOptions, true ) ) {
+ // Have 'other' always as first element
+ $this->mOptions = [ $params['other'] => 'other' ] + $this->mOptions;
+ }
+ $this->mFlatOptions = self::flattenOptions( $this->getOptions() );
+
+ }
+
+ function getInputHTML( $value ) {
+ $select = parent::getInputHTML( $value[1] );
+
+ $textAttribs = [
+ 'id' => $this->mID . '-other',
+ 'size' => $this->getSize(),
+ 'class' => [ 'mw-htmlform-select-and-other-field' ],
+ 'data-id-select' => $this->mID,
+ ];
+
+ if ( $this->mClass !== '' ) {
+ $textAttribs['class'][] = $this->mClass;
+ }
+
+ $allowedParams = [
+ 'required',
+ 'autofocus',
+ 'multiple',
+ 'disabled',
+ 'tabindex',
+ 'maxlength', // gets dynamic with javascript, see mediawiki.htmlform.js
+ ];
+
+ $textAttribs += $this->getAttributes( $allowedParams );
+
+ $textbox = Html::input( $this->mName . '-other', $value[2], 'text', $textAttribs );
+
+ return "$select<br />\n$textbox";
+ }
+
+ function getInputOOUI( $value ) {
+ return false;
+ }
+
+ /**
+ * @param WebRequest $request
+ *
+ * @return array("<overall message>","<select value>","<text field value>")
+ */
+ function loadDataFromRequest( $request ) {
+ if ( $request->getCheck( $this->mName ) ) {
+ $list = $request->getText( $this->mName );
+ $text = $request->getText( $this->mName . '-other' );
+
+ // Should be built the same as in mediawiki.htmlform.js
+ if ( $list == 'other' ) {
+ $final = $text;
+ } elseif ( !in_array( $list, $this->mFlatOptions, true ) ) {
+ # User has spoofed the select form to give an option which wasn't
+ # in the original offer. Sulk...
+ $final = $text;
+ } elseif ( $text == '' ) {
+ $final = $list;
+ } else {
+ $final = $list . $this->msg( 'colon-separator' )->inContentLanguage()->text() . $text;
+ }
+ } else {
+ $final = $this->getDefault();
+
+ $list = 'other';
+ $text = $final;
+ foreach ( $this->mFlatOptions as $option ) {
+ $match = $option . $this->msg( 'colon-separator' )->inContentLanguage()->text();
+ if ( strpos( $text, $match ) === 0 ) {
+ $list = $option;
+ $text = substr( $text, strlen( $match ) );
+ break;
+ }
+ }
+ }
+
+ return [ $final, $list, $text ];
+ }
+
+ function getSize() {
+ return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
+ }
+
+ function validate( $value, $alldata ) {
+ # HTMLSelectField forces $value to be one of the options in the select
+ # field, which is not useful here. But we do want the validation further up
+ # the chain
+ $p = parent::validate( $value[1], $alldata );
+
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ if ( isset( $this->mParams['required'] )
+ && $this->mParams['required'] !== false
+ && $value[1] === ''
+ ) {
+ return $this->msg( 'htmlform-required' )->parse();
+ }
+
+ return true;
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * A select dropdown field. Basically a wrapper for Xmlselect class
+ */
+class HTMLSelectField extends HTMLFormField {
+ function validate( $value, $alldata ) {
+ $p = parent::validate( $value, $alldata );
+
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
+
+ if ( in_array( strval( $value ), $validOptions, true ) ) {
+ return true;
+ } else {
+ return $this->msg( 'htmlform-select-badoption' )->parse();
+ }
+ }
+
+ function getInputHTML( $value ) {
+ $select = new XmlSelect( $this->mName, $this->mID, strval( $value ) );
+
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $select->setAttribute( 'disabled', 'disabled' );
+ }
+
+ $allowedParams = [ 'tabindex', 'size' ];
+ $customParams = $this->getAttributes( $allowedParams );
+ foreach ( $customParams as $name => $value ) {
+ $select->setAttribute( $name, $value );
+ }
+
+ if ( $this->mClass !== '' ) {
+ $select->setAttribute( 'class', $this->mClass );
+ }
+
+ $select->addOptions( $this->getOptions() );
+
+ return $select->getHTML();
+ }
+
+ function getInputOOUI( $value ) {
+ $disabled = false;
+ $allowedParams = [ 'tabindex' ];
+ $attribs = OOUI\Element::configFromHtmlAttributes(
+ $this->getAttributes( $allowedParams )
+ );
+
+ if ( $this->mClass !== '' ) {
+ $attribs['classes'] = [ $this->mClass ];
+ }
+
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $disabled = true;
+ }
+
+ return new OOUI\DropdownInputWidget( [
+ 'name' => $this->mName,
+ 'id' => $this->mID,
+ 'options' => $this->getOptionsOOUI(),
+ 'value' => strval( $value ),
+ 'disabled' => $disabled,
+ ] + $attribs );
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * A limit dropdown, which accepts any valid number
+ */
+class HTMLSelectLimitField extends HTMLSelectField {
+ /**
+ * Basically don't do any validation. If it's a number that's fine. Also,
+ * add it to the list if it's not there already
+ *
+ * @param string $value
+ * @param array $alldata
+ * @return bool
+ */
+ function validate( $value, $alldata ) {
+ if ( $value == '' ) {
+ return true;
+ }
+
+ // Let folks pick an explicit limit not from our list, as long as it's a real numbr.
+ if ( !in_array( $value, $this->mParams['options'] )
+ && $value == intval( $value )
+ && $value > 0
+ ) {
+ // This adds the explicitly requested limit value to the drop-down,
+ // then makes sure it's sorted correctly so when we output the list
+ // later, the custom option doesn't just show up last.
+ $this->mParams['options'][$this->mParent->getLanguage()->formatNum( $value )] =
+ intval( $value );
+ asort( $this->mParams['options'] );
+ }
+
+ return true;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Wrapper for Html::namespaceSelector to use in HTMLForm
+ */
+class HTMLSelectNamespace extends HTMLFormField {
+ public function __construct( $params ) {
+ parent::__construct( $params );
+
+ $this->mAllValue = array_key_exists( 'all', $params )
+ ? $params['all']
+ : 'all';
+
+ }
+
+ function getInputHTML( $value ) {
+ return Html::namespaceSelector(
+ [
+ 'selected' => $value,
+ 'all' => $this->mAllValue
+ ], [
+ 'name' => $this->mName,
+ 'id' => $this->mID,
+ 'class' => 'namespaceselector',
+ ]
+ );
+ }
+
+ public function getInputOOUI( $value ) {
+ return new MediaWiki\Widget\NamespaceInputWidget( [
+ 'value' => $value,
+ 'name' => $this->mName,
+ 'id' => $this->mID,
+ 'includeAllValue' => $this->mAllValue,
+ ] );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Creates a Html::namespaceSelector input field with a button assigned to the input field.
+ */
+class HTMLSelectNamespaceWithButton extends HTMLSelectNamespace {
+ /** @var HTMLFormFieldWithButton $mClassWithButton */
+ protected $mClassWithButton = null;
+
+ public function __construct( $info ) {
+ $this->mClassWithButton = new HTMLFormFieldWithButton( $info );
+ parent::__construct( $info );
+ }
+
+ public function getInputHTML( $value ) {
+ return $this->mClassWithButton->getElement( parent::getInputHTML( $value ) );
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * Select dropdown field, with an additional "other" textbox.
+ *
+ * HTMLComboboxField implements the same functionality using a single form field
+ * and should be used instead.
+ */
+class HTMLSelectOrOtherField extends HTMLTextField {
+ function __construct( $params ) {
+ parent::__construct( $params );
+ $this->getOptions();
+ if ( !in_array( 'other', $this->mOptions, true ) ) {
+ $msg =
+ isset( $params['other'] )
+ ? $params['other']
+ : wfMessage( 'htmlform-selectorother-other' )->text();
+ // Have 'other' always as first element
+ $this->mOptions = [ $msg => 'other' ] + $this->mOptions;
+ }
+
+ }
+
+ function getInputHTML( $value ) {
+ $valInSelect = false;
+
+ if ( $value !== false ) {
+ $value = strval( $value );
+ $valInSelect = in_array(
+ $value, HTMLFormField::flattenOptions( $this->getOptions() ), true
+ );
+ }
+
+ $selected = $valInSelect ? $value : 'other';
+
+ $select = new XmlSelect( $this->mName, $this->mID, $selected );
+ $select->addOptions( $this->getOptions() );
+
+ $select->setAttribute( 'class', 'mw-htmlform-select-or-other' );
+
+ $tbAttribs = [ 'id' => $this->mID . '-other', 'size' => $this->getSize() ];
+
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $select->setAttribute( 'disabled', 'disabled' );
+ $tbAttribs['disabled'] = 'disabled';
+ }
+
+ if ( isset( $this->mParams['tabindex'] ) ) {
+ $select->setAttribute( 'tabindex', $this->mParams['tabindex'] );
+ $tbAttribs['tabindex'] = $this->mParams['tabindex'];
+ }
+
+ $select = $select->getHTML();
+
+ if ( isset( $this->mParams['maxlength'] ) ) {
+ $tbAttribs['maxlength'] = $this->mParams['maxlength'];
+ }
+
+ if ( $this->mClass !== '' ) {
+ $tbAttribs['class'] = $this->mClass;
+ }
+
+ $textbox = Html::input( $this->mName . '-other', $valInSelect ? '' : $value, 'text', $tbAttribs );
+
+ return "$select<br />\n$textbox";
+ }
+
+ function getInputOOUI( $value ) {
+ return false;
+ }
+
+ /**
+ * @param WebRequest $request
+ *
+ * @return string
+ */
+ function loadDataFromRequest( $request ) {
+ if ( $request->getCheck( $this->mName ) ) {
+ $val = $request->getText( $this->mName );
+
+ if ( $val === 'other' ) {
+ $val = $request->getText( $this->mName . '-other' );
+ }
+
+ return $val;
+ } else {
+ return $this->getDefault();
+ }
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * Add a submit button inline in the form (as opposed to
+ * HTMLForm::addButton(), which will add it at the end).
+ */
+class HTMLSubmitField extends HTMLButtonField {
+ protected $buttonType = 'submit';
+
+ protected $mFlags = [ 'primary', 'constructive' ];
+
+ public function skipLoadData( $request ) {
+ return !$request->getCheck( $this->mName );
+ }
+
+ public function loadDataFromRequest( $request ) {
+ return $request->getCheck( $this->mName );
+ }
+}
--- /dev/null
+<?php
+/**
+ * Wrapper for ChangeTags::buildTagFilterSelector to use in HTMLForm
+ */
+class HTMLTagFilter extends HTMLFormField {
+ protected $tagFilter;
+
+ function getTableRow( $value ) {
+ $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
+ if ( $this->tagFilter ) {
+ return parent::getTableRow( $value );
+ }
+ return '';
+ }
+
+ function getDiv( $value ) {
+ $this->tagFilter = ChangeTags::buildTagFilterSelector( $value );
+ if ( $this->tagFilter ) {
+ return parent::getDiv( $value );
+ }
+ return '';
+ }
+
+ function getInputHTML( $value ) {
+ if ( $this->tagFilter ) {
+ // we only need the select field, HTMLForm should handle the label
+ return $this->tagFilter[1];
+ }
+ return '';
+ }
+}
--- /dev/null
+<?php
+
+class HTMLTextAreaField extends HTMLFormField {
+ const DEFAULT_COLS = 80;
+ const DEFAULT_ROWS = 25;
+
+ protected $mPlaceholder = '';
+
+ /**
+ * @param array $params
+ * - cols, rows: textarea size
+ * - placeholder/placeholder-message: set HTML placeholder attribute
+ * - spellcheck: set HTML spellcheck attribute
+ */
+ public function __construct( $params ) {
+ parent::__construct( $params );
+
+ if ( isset( $params['placeholder-message'] ) ) {
+ $this->mPlaceholder = $this->getMessage( $params['placeholder-message'] )->parse();
+ } elseif ( isset( $params['placeholder'] ) ) {
+ $this->mPlaceholder = $params['placeholder'];
+ }
+ }
+
+ function getCols() {
+ return isset( $this->mParams['cols'] ) ? $this->mParams['cols'] : static::DEFAULT_COLS;
+ }
+
+ function getRows() {
+ return isset( $this->mParams['rows'] ) ? $this->mParams['rows'] : static::DEFAULT_ROWS;
+ }
+
+ function getSpellCheck() {
+ $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
+ if ( is_bool( $val ) ) {
+ // "spellcheck" attribute literally requires "true" or "false" to work.
+ return $val === true ? 'true' : 'false';
+ }
+ return null;
+ }
+
+ function getInputHTML( $value ) {
+ $attribs = [
+ 'id' => $this->mID,
+ 'cols' => $this->getCols(),
+ 'rows' => $this->getRows(),
+ 'spellcheck' => $this->getSpellCheck(),
+ ] + $this->getTooltipAndAccessKey();
+
+ if ( $this->mClass !== '' ) {
+ $attribs['class'] = $this->mClass;
+ }
+ if ( $this->mPlaceholder !== '' ) {
+ $attribs['placeholder'] = $this->mPlaceholder;
+ }
+
+ $allowedParams = [
+ 'tabindex',
+ 'disabled',
+ 'readonly',
+ 'required',
+ 'autofocus'
+ ];
+
+ $attribs += $this->getAttributes( $allowedParams );
+ return Html::textarea( $this->mName, $value, $attribs );
+ }
+
+ function getInputOOUI( $value ) {
+ if ( isset( $this->mParams['cols'] ) ) {
+ throw new Exception( "OOUIHTMLForm does not support the 'cols' parameter for textareas" );
+ }
+
+ $attribs = $this->getTooltipAndAccessKey();
+
+ if ( $this->mClass !== '' ) {
+ $attribs['classes'] = [ $this->mClass ];
+ }
+ if ( $this->mPlaceholder !== '' ) {
+ $attribs['placeholder'] = $this->mPlaceholder;
+ }
+
+ $allowedParams = [
+ 'tabindex',
+ 'disabled',
+ 'readonly',
+ 'required',
+ 'autofocus',
+ ];
+
+ $attribs += OOUI\Element::configFromHtmlAttributes(
+ $this->getAttributes( $allowedParams )
+ );
+
+ return new OOUI\TextInputWidget( [
+ 'id' => $this->mID,
+ 'name' => $this->mName,
+ 'multiline' => true,
+ 'value' => $value,
+ 'rows' => $this->getRows(),
+ ] + $attribs );
+ }
+}
--- /dev/null
+<?php
+
+class HTMLTextField extends HTMLFormField {
+ protected $mPlaceholder = '';
+
+ /**
+ * @param array $params
+ * - type: HTML textfield type
+ * - size: field size in characters (defaults to 45)
+ * - placeholder/placeholder-message: set HTML placeholder attribute
+ * - spellcheck: set HTML spellcheck attribute
+ * - persistent: upon unsuccessful requests, retain the value (defaults to true, except
+ * for password fields)
+ */
+ public function __construct( $params ) {
+ parent::__construct( $params );
+
+ if ( isset( $params['placeholder-message'] ) ) {
+ $this->mPlaceholder = $this->getMessage( $params['placeholder-message'] )->parse();
+ } elseif ( isset( $params['placeholder'] ) ) {
+ $this->mPlaceholder = $params['placeholder'];
+ }
+ }
+
+ function getSize() {
+ return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
+ }
+
+ function getSpellCheck() {
+ $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
+ if ( is_bool( $val ) ) {
+ // "spellcheck" attribute literally requires "true" or "false" to work.
+ return $val === true ? 'true' : 'false';
+ }
+ return null;
+ }
+
+ public function isPersistent() {
+ if ( isset( $this->mParams['persistent'] ) ) {
+ return $this->mParams['persistent'];
+ }
+ // don't put passwords into the HTML body, they could get cached or otherwise leaked
+ return !( isset( $this->mParams['type'] ) && $this->mParams['type'] === 'password' );
+ }
+
+ function getInputHTML( $value ) {
+ if ( !$this->isPersistent() ) {
+ $value = '';
+ }
+
+ $attribs = [
+ 'id' => $this->mID,
+ 'name' => $this->mName,
+ 'size' => $this->getSize(),
+ 'value' => $value,
+ 'dir' => $this->mDir,
+ 'spellcheck' => $this->getSpellCheck(),
+ ] + $this->getTooltipAndAccessKey() + $this->getDataAttribs();
+
+ if ( $this->mClass !== '' ) {
+ $attribs['class'] = $this->mClass;
+ }
+ if ( $this->mPlaceholder !== '' ) {
+ $attribs['placeholder'] = $this->mPlaceholder;
+ }
+
+ # @todo Enforce pattern, step, required, readonly on the server side as
+ # well
+ $allowedParams = [
+ 'type',
+ 'min',
+ 'max',
+ 'pattern',
+ 'title',
+ 'step',
+ 'list',
+ 'maxlength',
+ 'tabindex',
+ 'disabled',
+ 'required',
+ 'autofocus',
+ 'multiple',
+ 'readonly'
+ ];
+
+ $attribs += $this->getAttributes( $allowedParams );
+
+ # Extract 'type'
+ $type = $this->getType( $attribs );
+ return Html::input( $this->mName, $value, $type, $attribs );
+ }
+
+ protected function getType( &$attribs ) {
+ $type = isset( $attribs['type'] ) ? $attribs['type'] : 'text';
+ unset( $attribs['type'] );
+
+ # Implement tiny differences between some field variants
+ # here, rather than creating a new class for each one which
+ # is essentially just a clone of this one.
+ if ( isset( $this->mParams['type'] ) ) {
+ switch ( $this->mParams['type'] ) {
+ case 'int':
+ $type = 'number';
+ break;
+ case 'float':
+ $type = 'number';
+ $attribs['step'] = 'any';
+ break;
+ # Pass through
+ case 'email':
+ case 'password':
+ case 'file':
+ case 'url':
+ $type = $this->mParams['type'];
+ break;
+ }
+ }
+
+ return $type;
+ }
+
+ function getInputOOUI( $value ) {
+ if ( !$this->isPersistent() ) {
+ $value = '';
+ }
+
+ $attribs = $this->getTooltipAndAccessKey();
+
+ if ( $this->mClass !== '' ) {
+ $attribs['classes'] = [ $this->mClass ];
+ }
+ if ( $this->mPlaceholder !== '' ) {
+ $attribs['placeholder'] = $this->mPlaceholder;
+ }
+
+ # @todo Enforce pattern, step, required, readonly on the server side as
+ # well
+ $allowedParams = [
+ 'autofocus',
+ 'autosize',
+ 'disabled',
+ 'flags',
+ 'indicator',
+ 'maxlength',
+ 'readonly',
+ 'required',
+ 'tabindex',
+ 'type',
+ ];
+
+ $attribs += OOUI\Element::configFromHtmlAttributes(
+ $this->getAttributes( $allowedParams )
+ );
+
+ $type = $this->getType( $attribs );
+
+ return $this->getInputWidget( [
+ 'id' => $this->mID,
+ 'name' => $this->mName,
+ 'value' => $value,
+ 'type' => $type,
+ ] + $attribs );
+ }
+
+ protected function getInputWidget( $params ) {
+ return new OOUI\TextInputWidget( $params );
+ }
+
+ /**
+ * Returns an array of data-* attributes to add to the field.
+ *
+ * @return array
+ */
+ protected function getDataAttribs() {
+ return [];
+ }
+}
--- /dev/null
+<?php
+/**
+ * Creates a text input field with a button assigned to the input field.
+ */
+class HTMLTextFieldWithButton extends HTMLTextField {
+ /** @var HTMLFormFieldWithButton $mClassWithButton */
+ protected $mClassWithButton = null;
+
+ public function __construct( $info ) {
+ $this->mClassWithButton = new HTMLFormFieldWithButton( $info );
+ parent::__construct( $info );
+ }
+
+ public function getInputHTML( $value ) {
+ return $this->mClassWithButton->getElement( parent::getInputHTML( $value ) );
+ }
+}
--- /dev/null
+<?php
+
+use MediaWiki\Widget\TitleInputWidget;
+
+/**
+ * Implements a text input field for page titles.
+ * Automatically does validation that the title is valid,
+ * as well as autocompletion if using the OOUI display format.
+ *
+ * Note: Forms using GET requests will need to make sure the title value is not
+ * an empty string.
+ *
+ * Optional parameters:
+ * 'namespace' - Namespace the page must be in
+ * 'relative' - If true and 'namespace' given, strip/add the namespace from/to the title as needed
+ * 'creatable' - Whether to validate the title is creatable (not a special page)
+ * 'exists' - Whether to validate that the title already exists
+ *
+ * @since 1.26
+ */
+class HTMLTitleTextField extends HTMLTextField {
+ public function __construct( $params ) {
+ $params += [
+ 'namespace' => false,
+ 'relative' => false,
+ 'creatable' => false,
+ 'exists' => false,
+ ];
+
+ parent::__construct( $params );
+ }
+
+ public function validate( $value, $alldata ) {
+ if ( $this->mParent->getMethod() === 'get' && $value === '' ) {
+ // If the form is a GET form and has no value, assume it hasn't been
+ // submitted yet, and skip validation
+ return parent::validate( $value, $alldata );
+ }
+ try {
+ if ( !$this->mParams['relative'] ) {
+ $title = Title::newFromTextThrow( $value );
+ } else {
+ // Can't use Title::makeTitleSafe(), because it doesn't throw useful exceptions
+ global $wgContLang;
+ $namespaceName = $wgContLang->getNsText( $this->mParams['namespace'] );
+ $title = Title::newFromTextThrow( $namespaceName . ':' . $value );
+ }
+ } catch ( MalformedTitleException $e ) {
+ $msg = $this->msg( $e->getErrorMessage() );
+ $params = $e->getErrorMessageParameters();
+ if ( $params ) {
+ $msg->params( $params );
+ }
+ return $msg->parse();
+ }
+
+ $text = $title->getPrefixedText();
+ if ( $this->mParams['namespace'] !== false &&
+ !$title->inNamespace( $this->mParams['namespace'] )
+ ) {
+ return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text )->parse();
+ }
+
+ if ( $this->mParams['creatable'] && !$title->canExist() ) {
+ return $this->msg( 'htmlform-title-not-creatable', $text )->escaped();
+ }
+
+ if ( $this->mParams['exists'] && !$title->exists() ) {
+ return $this->msg( 'htmlform-title-not-exists', $text )->parse();
+ }
+
+ return parent::validate( $value, $alldata );
+ }
+
+ protected function getInputWidget( $params ) {
+ $this->mParent->getOutput()->addModules( 'mediawiki.widgets' );
+ if ( $this->mParams['namespace'] !== false ) {
+ $params['namespace'] = $this->mParams['namespace'];
+ }
+ $params['relative'] = $this->mParams['relative'];
+ return new TitleInputWidget( $params );
+ }
+
+ public function getInputHtml( $value ) {
+ // add mw-searchInput class to enable search suggestions for non-OOUI, too
+ $this->mClass .= 'mw-searchInput';
+
+ // return the HTMLTextField html
+ return parent::getInputHTML( $value );
+ }
+
+ protected function getDataAttribs() {
+ return [
+ 'data-mw-searchsuggest' => FormatJson::encode( [
+ 'wrapAsLink' => false,
+ ] ),
+ ];
+ }
+}
--- /dev/null
+<?php
+
+use MediaWiki\Widget\UserInputWidget;
+
+/**
+ * Implements a text input field for user names.
+ * Automatically auto-completes if using the OOUI display format.
+ *
+ * FIXME: Does not work for forms that support GET requests.
+ *
+ * Optional parameters:
+ * 'exists' - Whether to validate that the user already exists
+ *
+ * @since 1.26
+ */
+class HTMLUserTextField extends HTMLTextField {
+ public function __construct( $params ) {
+ $params += [
+ 'exists' => false,
+ 'ipallowed' => false,
+ ];
+
+ parent::__construct( $params );
+ }
+
+ public function validate( $value, $alldata ) {
+ // check, if a user exists with the given username
+ $user = User::newFromName( $value, false );
+
+ if ( !$user ) {
+ return $this->msg( 'htmlform-user-not-valid', $value )->parse();
+ } elseif (
+ ( $this->mParams['exists'] && $user->getId() === 0 ) &&
+ !( $this->mParams['ipallowed'] && User::isIP( $value ) )
+ ) {
+ return $this->msg( 'htmlform-user-not-exists', $user->getName() )->parse();
+ }
+
+ return parent::validate( $value, $alldata );
+ }
+
+ protected function getInputWidget( $params ) {
+ $this->mParent->getOutput()->addModules( 'mediawiki.widgets.UserInputWidget' );
+
+ return new UserInputWidget( $params );
+ }
+
+ public function getInputHtml( $value ) {
+ // add the required module and css class for user suggestions in non-OOUI mode
+ $this->mParent->getOutput()->addModules( 'mediawiki.userSuggest' );
+ $this->mClass .= ' mw-autocomplete-user';
+
+ // return parent html
+ return parent::getInputHTML( $value );
+ }
+}
}
try {
- $dbw = wfGetDB( DB_MASTER );
- return $dbw->deadlockLoop( [ $revision, 'importOldRevision' ] );
+ return $revision->importOldRevision();
} catch ( MWContentSerializationException $ex ) {
$this->notice( 'import-error-unserialize',
$revision->getTitle()->getPrefixedText(),
* @return bool
*/
public function importLogItem( $revision ) {
- $dbw = wfGetDB( DB_MASTER );
- return $dbw->deadlockLoop( [ $revision, 'importLogItem' ] );
+ return $revision->importLogItem();
}
/**
* @return bool
*/
public function importUpload( $revision ) {
- $dbw = wfGetDB( DB_MASTER );
- return $dbw->deadlockLoop( [ $revision, 'importUpload' ] );
+ return $revision->importUpload();
}
/**
'text',
''
] ) ) &&
- (int)( strlen( $revisionInfo['text'] ) / 1024 ) > $wgMaxArticleSize
+ strlen( $revisionInfo['text'] ) > $wgMaxArticleSize * 1024
) {
throw new MWException( 'The text of ' .
( isset( $revisionInfo['id'] ) ?
if ( !$this->getTitle() ) {
wfDebug( __METHOD__ . ": skipping invalid {$this->type}/{$this->action} log time, timestamp " .
$this->timestamp . "\n" );
- return;
+ return false;
}
# Check if it exists already
// @todo FIXME: Use original log ID (better for backups)
wfDebug( __METHOD__
. ": skipping existing item for Log:{$this->type}/{$this->action}, timestamp "
. $this->timestamp . "\n" );
- return;
+ return false;
}
$log_id = $dbw->nextSequenceValue( 'logging_log_id_seq' );
$data = [
'log_params' => $this->params
];
$dbw->insert( 'logging', $data, __METHOD__ );
+
+ return true;
}
/**
PopulateFilearchiveSha1::class,
PopulateBacklinkNamespace::class,
FixDefaultJsonContentPages::class,
+ CleanupEmptyCategories::class,
];
/**
public function doUpdates( $what = [ 'core', 'extensions', 'stats' ] ) {
global $wgVersion;
- $this->db->begin( __METHOD__ );
$what = array_flip( $what );
$this->skipSchema = isset( $what['noschema'] ) || $this->fileHandle !== null;
if ( isset( $what['core'] ) ) {
$this->writeSchemaUpdateFile();
$this->setAppliedUpdates( "$wgVersion-schema", $this->updatesSkipped );
}
-
- $this->db->commit( __METHOD__ );
}
/**
'wgUseInstantCommons',
'wgUpgradeKey',
'wgDefaultSkin',
+ 'wgPingback',
];
/**
'wgRightsText', '_MainCacheType', 'wgEnableUploads',
'_MemCachedServers', 'wgDBserver', 'wgDBuser',
'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
- 'wgMetaNamespace', 'wgLogo', 'wgAuthenticationTokenVersion',
+ 'wgMetaNamespace', 'wgLogo', 'wgAuthenticationTokenVersion', 'wgPingback',
],
$db->getGlobalNames()
);
$unescaped = [ 'wgRightsIcon', 'wgLogo' ];
$boolItems = [
'wgEnableEmail', 'wgEnableUserEmail', 'wgEnotifUserTalk',
- 'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons'
+ 'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons',
+ 'wgPingback',
];
foreach ( $confItems as $c ) {
# InstantCommons allows wiki to use images from https://commons.wikimedia.org
\$wgUseInstantCommons = {$this->values['wgUseInstantCommons']};
+# Periodically send a pingback to https://www.mediawiki.org/ with basic data
+# about this MediaWiki instance. The Wikimedia Foundation shares this data
+# with MediaWiki developers to help guide future development efforts.
+\$wgPingback = {$this->values['wgPingback']};
+
## If you use ImageMagick (or any other shell command) on a
## Linux server, this will need to be set to the name of an
## available UTF-8 locale
wfMessage( 'config-ns-other-default' )->inContentLanguage()->text()
);
+ $pingbackInfo = ( new Pingback() )->getSystemInfo();
+ // Database isn't available in config yet, so take it
+ // from the installer
+ $pingbackInfo['database'] = $this->getVar( 'wgDBtype' );
+
$this->addHTML(
$this->parent->getTextBox( [
'var' => 'wgSitename',
'label' => 'config-subscribe',
'help' => $this->parent->getHelpBox( 'config-subscribe-help' )
] ) .
+ $this->parent->getCheckBox( [
+ 'var' => 'wgPingback',
+ 'label' => 'config-pingback',
+ 'help' => $this->parent->getHelpBox(
+ 'config-pingback-help',
+ FormatJson::encode( $pingbackInfo, true )
+ ),
+ 'value' => true,
+ ] ) .
$this->getFieldsetEnd() .
$this->parent->getInfoBox( wfMessage( 'config-almost-done' )->text() ) .
// getRadioSet() builds a set of labeled radio buttons.
$retVal = true;
$this->parent->setVarsFromRequest( [ 'wgSitename', '_NamespaceType',
'_AdminName', '_AdminPassword', '_AdminPasswordConfirm', '_AdminEmail',
- '_Subscribe', '_SkipOptional', 'wgMetaNamespace' ] );
+ '_Subscribe', '_SkipOptional', 'wgMetaNamespace', 'wgPingback' ] );
// Validate site name
if ( strval( $this->getVar( 'wgSitename' ) ) === '' ) {
}
?>
<?php echo Html::htmlHeader( $this->getHeadAttribs() ); ?>
+
<head>
<meta name="robots" content="noindex, nofollow" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
"config-page-restart": "Урынлаштырыуҙы яңынан башларға",
"config-page-readme": "Мине уҡы",
"config-page-releasenotes": "Өлгө тураһында мәғлүмәт",
- "config-page-copying": "Рөхсәтнәмә",
+ "config-page-copying": "Рөхсәтнамә",
"config-page-upgradedoc": "Яңыртыу",
"config-page-existingwiki": "Ғәмәлдәге вики",
"config-help-restart": "Һеҙ үҙегеҙ индергән һәм һаҡланған әлеге мәғлүмәттәрҙе юйып, урынлаштырыуҙың яңы процессын ебәрергә теләйһегеҙме?",
"config-subscribe": "Падпісацца на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce сьпіс распаўсюджаньня навінаў пра зьяўленьне новых вэрсіяў].",
"config-subscribe-help": "Гэта ня вельмі актыўны сьпіс распаўсюджаньня навінаў пра зьяўленьне новых вэрсіяў, які ўключаючы важныя навіны пра бясьпеку.\nВам неабходна падпісацца на яго і абнавіць Вашае ўсталяваньне MediaWiki, калі зьявяцца новыя вэрсіі.",
"config-subscribe-noemail": "Вы спрабавалі падпісацца на рассылку паведамленьняў пра выхад новых вэрсіяў, не пазначыўшы адрас электроннай пошты.\nКалі ласка, падайце слушны адрас, калі Вы жадаеце падпісацца на рассылку.",
+ "config-pingback": "Дзяліцца зьвесткамі пра гэтую ўсталёўку з распрацоўнікамі MediaWiki.",
+ "config-pingback-help": "Калі вы абярэце гэтую наладу, MediaWiki будзе час ад часу дасылаць базавыя зьвесткі пра гэтую ўсталёўку на https://www.mediawiki.org. Гэтыя зьвесткі ўключаюць, напрыклад, тып сыстэмы, вэрсію PHP і абраную базу зьвестак. Фундацыя «Вікімэдыя» дзеліцца гэтымі зьвесткамі з распрацоўнікамі MediaWiki, каб скіраваць далейшыя шляхі распрацоўкі. Наступныя зьвесткі будуць дасланыя для вашай сыстэмы:\n<pre>$1</pre>",
"config-almost-done": "Вы амаль што скончылі!\nАстатнія налады можна прапусьціць і пачаць усталяваньне вікі.",
"config-optional-continue": "Задаць болей пытаньняў.",
"config-optional-skip": "Хопіць, проста ўсталяваць вікі.",
"config-install-extension-tables": "Стварэньне табліцаў для ўключаных пашырэньняў",
"config-install-mainpage-failed": "Немагчыма ўставіць галоўную старонку: $1",
"config-install-done": "<strong>Віншуем!</strong>\nВы ўсталявалі MediaWiki.\n\nПраграма ўсталяваньня стварыла файл <code>LocalSettings.php</code>.\nЁн утрымлівае ўсе Вашыя налады.\n\nВам неабходна загрузіць яго і захаваць у карэнную дырэкторыю Вашай вікі (у тую ж самую дырэкторыю, дзе знаходзіцца index.php). Загрузка павінна пачацца аўтаматычна.\n\nКалі загрузка не пачалася, ці Вы яе адмянілі, Вы можаце перазапусьціць яе націснуўшы на спасылку ніжэй:\n\n$3\n\n<strong>Заўвага</strong>: калі Вы гэтага ня зробіце зараз, то створаны файл ня будзе даступны Вам потым, калі Вы выйдзеце з праграмы ўсталяваньня безь яго загрузкі.\n\nКалі Вы гэта зробіце, Вы можаце <strong>[$2 ўвайсьці ў Вашую вікі]</strong>.",
+ "config-install-done-path": "<strong>Віншуем!</strong>\nВы ўсталявалі MediaWiki.\n\nПраграма ўсталёўкі стварыла файл <code>LocalSettings.php</code>. Ён утрымлівае ўсе вашыя налады.\n\nВам трэба спампаваць яго і пакласьці ў <code>$4</code>. Спампоўка павінна пачацца аўтаматычна.\n\nКалі спампоўка не пачалася або вы адмянілі яе, вы можаце пачаць яе наноў, калі націсьніце на наступную спасылку:\n\n$3\n\n<strong>Заўвага:</strong> Калі вы ня зробіце гэта зараз, то створаны файл ня будзе даступны вам па выхадзе з праграмы безь яго спампоўкі.\n\nКалі вы зробіце гэта, вы можаце <strong>[$2 ўвайсьці ў вашую вікі]</strong>.",
"config-download-localsettings": "Загрузіць <code>LocalSettings.php</code>",
"config-help": "дапамога",
"config-help-tooltip": "націсьніце, каб разгарнуць",
"config-ns-site-name": "Същото като името на уикито: $1",
"config-ns-other": "Друго (уточняване)",
"config-ns-other-default": "МоетоУики",
- "config-project-namespace-help": "Следвайки примера на Уикипедия, много уикита съхраняват страниците си с правила в \"'''именно пространство на проекта'''\", отделно от основното съдържание.\nВсички заглавия на страниците в това именно пространство започват с определена представка, която може да бъде зададена тук.\nОбикновено представката произлиза от името на уикито, но не може да съдържа символи като \"#\" или \":\".",
+ "config-project-namespace-help": "Следвайки примера на Уикипедия, много уикита съхраняват страниците си с правила в '''именно пространство на проекта''', отделно от основното съдържание.\nВсички заглавия на страниците в това именно пространство започват с определена представка, която може да бъде зададена тук.\nОбикновено представката произлиза от името на уикито, но не може да съдържа символи като \"#\" или \":\".",
"config-ns-invalid": "Посоченото именно пространство \"<nowiki>$1</nowiki>\" е невалидно.\nНеобходимо е да бъде посочено друго.",
"config-ns-conflict": "Посоченото именно пространство \"<nowiki>$1</nowiki>\" е в конфликт с използваното по подразбиране именно пространство MediaWiki.\nНеобходимо е да се посочи друго именно пространство.",
"config-admin-box": "Администраторска сметка",
"config-install-mainpage": "Създаване на Началната страница със съдържание по подразбиране",
"config-install-extension-tables": "Създаване на таблици за включените разширения",
"config-install-mainpage-failed": "Вмъкването на Началната страница беше невъзможно: $1",
- "config-install-done": "'''Поздравления!'''\nИнсталирането на МедияУики приключи успешно.\n\nИнсталаторът създаде файл <code>LocalSettings.php</code>.\nТой съдържа всичката необходима основна конфигурация на уикито.\n\nНеобходимо е той да бъде изтеглен и поставен в основната директория на уикито (директорията, в която е и index.php). Изтеглянето би трябвало да започне автоматично.\n\nАко изтеглянето не започне автоматично или е било прекратено, файлът може да бъде изтеглен чрез щракване на препратката по-долу:\n\n$3\n\n'''Забележка''': Ако това не бъде извършено сега, генерираният конфигурационен файл няма да е достъпен на по-късен етап ако не бъде изтеглен сега или инсталацията приключи без изтеглянето му.\n\nКогато файлът вече е в основната директория, '''[$2 уикито ще е достъпно на този адрес]'''.",
+ "config-install-done": "<strong>Поздравления!</strong>\nИнсталирането на МедияУики приключи успешно.\n\nИнсталаторът създаде файл <code>LocalSettings.php</code>.\nТой съдържа всичката необходима основна конфигурация на уикито.\n\nНеобходимо е той да бъде изтеглен и поставен в основната директория на уикито (директорията, в която е и index.php). Изтеглянето би трябвало да започне автоматично.\n\nАко изтеглянето не започне автоматично или е било прекратено, файлът може да бъде изтеглен чрез щракване на препратката по-долу:\n\n$3\n\n<strong>Забележка:</strong> Ако това не бъде извършено сега, генерираният конфигурационен файл няма да е достъпен на по-късен етап ако не бъде изтеглен сега или инсталацията приключи без изтеглянето му.\n\nКогато файлът вече е в основната директория, <strong>[$2 уикито ще е достъпно на този адрес]</strong>.",
"config-download-localsettings": "Изтегляне на <code>LocalSettings.php</code>",
"config-help": "помощ",
"config-nofile": "Файлът „$1“ не може да бъде открит. Да не е бил изтрит?",
"config-extension-link": "Знаете ли, че това уики поддържа [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions разширения]?\n\nМожете да разгледате [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category разширенията по категория] или [https://www.mediawiki.org/wiki/Extension_Matrix Матрицата на разширенията] за пълен списък на разширенията.",
- "mainpagetext": "'''Уикито беше успешно инсталирано.'''",
+ "mainpagetext": "<strong>Уикито беше успешно инсталирано.</strong>",
"mainpagedocfooter": "Разгледайте [https://meta.wikimedia.org/wiki/Help:Contents ръководството] за подробна информация относно използването на уики софтуера.\n\n== Първи стъпки ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Настройки за конфигуриране]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализиране на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научете как да се справяте със спама във вашето уики]"
}
"config-information": "তথ্য",
"config-localsettings-upgrade": "<code>LocalSettings.php</code> ফাইলটি মুছে ফেলা হয়েছে। এই ইন্সটলেশনটি আরো উন্নত করতে দয়া করে <code>$wgUpgradeKey</code> কোডটি বক্সে দিন। আপনি এটি <code>LocalSettings.php</code> -এ পাবেন।",
"config-localsettings-key": "হালনাগাদ কি",
- "config-localsettings-badkey": "আপনি যেই চাবিটি দিয়েছেন তা সঠিক নয়।",
+ "config-localsettings-badkey": "আপনি হালনাগাদের যেই চাবিটি দিয়েছেন তা সঠিক নয়।",
+ "config-upgrade-key-missing": "মিডিয়াউইকির একটি বিদ্যমান ইনস্টলেশন সনাক্ত করা হয়েছে। \nএই ইনস্টলেশন হালনাগাদ করার জন্য, দয়া করে নিম্নলিখিত লাইন আপনার <code>LocalSettings.php</code> -এর নিচে স্থাপন করুন:\n\n$1",
"config-session-error": "সেশন শুরুতে ত্রুটি: $1",
"config-your-language": "আপনার ভাষা:",
"config-your-language-help": "ইন্সটল করা সময় ব্যবহারের জন্য ভাষা নির্বাচন করুন।",
"config-admin-password-blank": "প্রশাসক অ্যাকাউন্টের জন্য পাসওয়ার্ড প্রবেশ করান।",
"config-admin-password-mismatch": "আপনি যে দুটি পাসওয়ার্ড দিয়েছেন তারা পরস্পর মেলেনি।",
"config-admin-email": "ইমেইল ঠিকানা:",
+ "config-admin-error-bademail": "আপনি একটি অবৈধ ইমেল ঠিকানা দিয়েছেন।",
"config-optional-continue": "আরও প্রশ্ন জিজ্ঞেস করুন।",
"config-optional-skip": "আমি ইতিমধ্যেই বিরক্ত হয়ে গেছি, উইকিটি ইন্সটল করো।",
"config-profile": "ব্যবহারকারী অধিকার প্রোফাইল:",
"config-subscribe": "Přihlásit se k odběru [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-mailové konference pro oznamování nových verzí].",
"config-subscribe-help": "Tohle je e-mailová konference s nízkým provozem, na které se oznamují nové verze, včetně důležitých bezpečnostních oznámení.\nMěli byste se do ní přihlásit a při vydání nových verzí aktualizovat svou instalaci MediaWiki.",
"config-subscribe-noemail": "Pokusili jste se přihlásit k odběru e-mailové konference pro oznamování nových verzí, aniž byste poskytli e-mailovou adresu.\nPokud se chcete přihlásit k odběru, zadejte e-mailovou adresu.",
+ "config-pingback": "Sdílet údaje o této instalaci s vývojáři MediaWiki.",
+ "config-pingback-help": "Pokud zaškrtnete tuto volbu, bude MediaWiki pravidelně zasílat základní údaje této instance MediaWiki na https://www.mediawiki.org. Tyto údaje zahrnují například typ systému, verzi PHP a zvolené databázové úložiště. Nadace Wikimedia sdílí tato data s vývojáři MediaWiki, aby pomohla směrovat budoucí rozvoj. Pro váš systém budou zaslány tyto údaje:\n<pre>$1</pre>",
"config-almost-done": "Už jsme skoro hotovi!\nZbývající konfiguraci už můžete přeskočit a nainstalovat wiki hned teď.",
"config-optional-continue": "Ptejte se mě dál.",
"config-optional-skip": "Už mě to nudí, prostě nainstalujte wiki.",
"config-db-web-account-same": "Dasselbe Datenbankkonto wie während des Installationsvorgangs verwenden",
"config-db-web-create": "Sofern nicht bereits vorhanden, muss nun das Konto erstellt werden",
"config-db-web-no-create-privs": "Das angegebene und für den Installationsvorgang vorgesehene Datenbankkonto verfügt nicht über ausreichend Berechtigungen, um ein weiteres Datenbankkonto zu erstellen.\nDas hier angegebene Datenbankkonto muss daher bereits vorhanden sein.",
- "config-mysql-engine": "Speicher-Engine:",
+ "config-mysql-engine": "Datenbanksystem:",
"config-mysql-innodb": "InnoDB",
"config-mysql-myisam": "MyISAM",
- "config-mysql-myisam-dep": "'''Warnung:''' Es wurde MyISAM als Speicher-Engine für MySQL ausgewählt, die aus folgenden Gründen nicht für den Einsatz mit MediaWiki empfohlen ist:\n* Sie unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen.\n* Sie ist anfälliger für Datenprobleme.\n* Sie wird von MediaWiki nicht immer adäquat unterstützt.\n\nSofern die vorhandene MySQL-Installation die Speicher-Engine InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.\nSofern sie sie nicht unterstützt, sollte eine entsprechende Aktualisierung nunmehr Erwägung gezogen werden.",
- "config-mysql-only-myisam-dep": "'''Warnung:''' MyISAM ist die einzige verfügbare Speicher-Engine für MySQL auf diesem Rechner, und dies wird nicht für die Verwendung mit MediaWiki empfohlen, da sie\n* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,\n* anfälliger für Datenprobleme ist und\n* von MediaWiki nicht immer adäquat unterstützt wird.\n\nDeine MySQL-Installation unterstützt nicht InnoDB. Eventuell muss eine Aktualisierung durchgeführt werden.",
+ "config-mysql-myisam-dep": "<strong>Warnung:</strong> Es wurde MyISAM als Speichersubsystem für das Datenbanksystem MySQL ausgewählt. Aus folgenden Gründen wird es nicht für den Einsatz mit MediaWiki empfohlen:\n* Es unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen.\n* Es ist anfälliger für Datenprobleme.\n* Es wird von MediaWiki nicht immer adäquat unterstützt.\n\nSofern die vorhandene MySQL-Installation das Speichersubsystem InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.\nSofern sie es nicht unterstützt, sollte nunmehr eine entsprechende Aktualisierung in Erwägung gezogen werden.",
+ "config-mysql-only-myisam-dep": "<strong>Warnung:</strong> MyISAM ist das einzige verfügbare Speichersubsystem für das Datenbanksystem MySQL auf diesem Server. Es wird nicht für die Verwendung mit MediaWiki empfohlen, da es\n* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,\n* anfälliger für Datenprobleme ist und\n* von MediaWiki nicht immer adäquat unterstützt wird.\n\nDeine MySQL-Installation unterstützt nicht das Speichersubsystem InnoDB. Eine Aktualisierung wird nunmehr empfohlen.",
"config-mysql-engine-help": "'''InnoDB''' ist fast immer die bessere Wahl, da es gleichzeitige Zugriffe gut unterstützt.\n\n'''MyISAM''' ist in Einzelnutzerumgebungen sowie bei schreibgeschützten Wikis schneller.\nBei MyISAM-Datenbanken treten tendenziell häufiger Fehler auf als bei InnoDB-Datenbanken.",
"config-mysql-charset": "Datenbankzeichensatz:",
"config-mysql-binary": "binär",
"config-subscribe": "Bitte die Mailingliste [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mitteilungen zu Versionsveröffentlichungen] abonnieren.",
"config-subscribe-help": "Es handelt sich hierbei um eine Mailingliste mit wenigen Aussendungen, die für Mitteilungen zu Versionsveröffentlichungen, einschließlich wichtiger Sicherheitsveröffentlichungen, genutzt wird.\nDiese Mailingliste sollte abonniert werden. Zudem sollte die MediaWiki-Installation stets aktualisiert werden, sobald eine neue Programmversion veröffentlicht wurde.",
"config-subscribe-noemail": "Beim Abonnieren der Mailingliste mit Mitteilungen zu Versionsveröffentlichungen wurde keine E-Mail-Adresse angegeben.\nBitte eine E-Mail-Adresse angeben, sofern die Mailingliste abonniert werden soll.",
+ "config-pingback": "Daten über diese Installation mit den MediaWiki-Entwicklern teilen.",
+ "config-pingback-help": "Sofern diese Option ausgewählt wird, meldet MediaWiki regelmäßig die Basisdaten dieser MediaWiki-Installation an https://www.mediawiki.org. Diese Daten enthalten beispielsweise den Betriebssystemtyp, die PHP-Version sowie das genutzte Datenbanksystem. Die Wikimedia Foundation teilt diese Daten mit den MediaWiki-Entwicklern, um Entscheidungen zur künftigen Softwareentwicklung zu verbessern. Die folgenden Daten werden für diese Installation gesendet:\n<pre>$1</pre>",
"config-almost-done": "Der Vorgang ist fast abgeschlossen!\nDie verbleibenden Konfigurationseinstellungen können übersprungen und das Wiki umgehend installiert werden.",
"config-optional-continue": "Ja, es sollen weitere Konfigurationseinstellungen vorgenommen werden.",
"config-optional-skip": "Nein, das Wiki soll nun installiert werden.",
"config-env-php": "PHP $1 i biyo saz.",
"config-db-type": "Database tipe:",
"config-db-host": "Database host:",
+ "config-db-host-oracle": "Database TNS:",
"config-db-name": "Database name:",
+ "config-db-username": "Database nameykarberi:",
+ "config-db-password": "Database parola :",
"config-db-port": "Portê database:",
"config-type-mssql": "Microsoft SQL Server",
"config-header-mysql": "Eyarê MySQL",
--- /dev/null
+{
+ "@metadata": {
+ "authors": [
+ "राम प्रसाद जोशी"
+ ]
+ },
+ "config-desc": "मेडियाविकिको लागि स्थापक",
+ "config-title": "मेडिया विकि $1 स्थापना",
+ "config-information": "जानकारी",
+ "config-localsettings-upgrade": "<code>LocalSettings.php</code> फाइल पाइयो ।\nयै स्थापनालाई अपग्रेड गर्न, तलीखाइ दिया बक्समी <code>$wgUpgradeKey</code> को मान दर्ज गर ।\nतम <code>LocalSettings.php</code> मा भेट्टे हौ ।",
+ "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> फाइल पाइयो ।\nयै स्थापनालाई अपग्रेड गद्द, बदलामी कृपया यैलाई चलाओ <code>update.php</code>",
+ "config-localsettings-key": "नवीनीकरण साँचो",
+ "config-localsettings-badkey": "तमले प्रोभाइट गर्याको नवनिकरण साँचो मान्य छैन",
+ "config-upgrade-key-missing": "An existing installation of MediaWiki has been detected.\nTo upgrade this installation, please put the following line at the bottom of your <code>LocalSettings.php</code>:\n\n$1",
+ "config-localsettings-incomplete": "The existing <code>LocalSettings.php</code> appears to be incomplete.\nThe $1 variable is not set.\nPlease change <code>LocalSettings.php</code> so that this variable is set, and click \"{{int:Config-continue}}\".",
+ "config-localsettings-connection-error": "An error was encountered when connecting to the database using the settings specified in <code>LocalSettings.php</code>. Please fix these settings and try again.\n\n$1",
+ "config-session-error": "Error starting session: $1",
+ "config-session-expired": "Your session data seems to have expired.\nSessions are configured for a lifetime of $1.\nYou can increase this by setting <code>session.gc_maxlifetime</code> in php.ini.\nRestart the installation process.",
+ "config-no-session": "तमरो सेसन डाटा मेटिया छ!\nतमरो php चेक गर। ini र make sure <code>session.save_path</code> is set to an appropriate directory.",
+ "config-your-language": "तमरो भाषा:",
+ "config-your-language-help": "इन्स्टाल गर्दा उपयोग गद्दे भाषा छान ।",
+ "config-wiki-language": "विकि भाषाहरू",
+ "config-wiki-language-help": "Select the language that the wiki will predominantly be written in.",
+ "config-back": "← पछाडी",
+ "config-continue": "जारी राख्या",
+ "config-page-language": "भाषा",
+ "config-page-welcome": "मिडीयाविकिमी तमलाई स्वागत छ!",
+ "config-page-dbconnect": "डेटाबेससँग सम्बन्ध बनाउन्या",
+ "config-page-upgrade": "मौजूदा स्थापनाको नवीनीकरण",
+ "config-page-dbsettings": "डेटावेस सेटिङ",
+ "config-page-name": "नाऊ",
+ "config-page-options": "विकल्पहरू",
+ "config-page-install": "स्थापना गद्दे",
+ "config-page-complete": "पूरा भयो !",
+ "config-page-restart": "स्थापना फेरि सुरु गद्दे",
+ "config-page-readme": "थप पड्डे",
+ "config-page-releasenotes": "प्रकाशन टिप्पणी",
+ "config-page-copying": "कपि हून लाग्याको छ",
+ "config-page-upgradedoc": "अद्यावधिक गरिदै",
+ "config-page-existingwiki": "विकि बन्द हुँदै",
+ "config-help-restart": "Do you want to clear all saved data that you have entered and restart the installation process?",
+ "config-restart": "हुन्छ, पुनः सुचारू गद्दे",
+ "config-welcome": "=== Environmental checks ===\nBasic checks will now be performed to see if this environment is suitable for MediaWiki installation.\nRemember to include this information if you seek support on how to complete the installation.",
+ "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but <strong>without any warranty</strong>; without even the implied warranty of <strong>merchantability</strong> or <strong>fitness for a particular purpose</strong>.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [http://www.gnu.org/copyleft/gpl.html read it online].",
+ "config-sidebar": "* [https://www.mediawiki.org MediaWiki home]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrator's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
+ "config-env-good": "The environment has been checked.\nYou can install MediaWiki.",
+ "config-env-bad": "The environment has been checked.\nYou cannot install MediaWiki.",
+ "config-env-php": "PHP $1 is installed.",
+ "config-env-hhvm": "HHVM $1 स्थापना गरिएको छ ।",
+ "config-unicode-using-intl": "Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalization.",
+ "config-unicode-pure-php-warning": "<strong>Warning:</strong> The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.\nIf you run a high-traffic site, you should read a little on [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization]."
+}
"config-subscribe": "Subscribe to the [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].",
"config-subscribe-help": "This is a low-volume mailing list used for release announcements, including important security announcements.\nYou should subscribe to it and update your MediaWiki installation when new versions come out.",
"config-subscribe-noemail": "You tried to subscribe to the release announcements mailing list without providing an email address.\nPlease provide an email address if you wish to subscribe to the mailing list.",
+ "config-pingback": "Share data about this installation with MediaWiki developers.",
+ "config-pingback-help": "If you select this option, MediaWiki will periodically ping https://www.mediawiki.org with basic data about this MediaWiki instance. This data includes, for example, the type of system, PHP version, and chosen database backend. The Wikimedia Foundation shares this data with MediaWiki developers to help guide future development efforts. The following data will be sent for your system:\n<pre>$1</pre>",
"config-almost-done": "You are almost done!\nYou can now skip the remaining configuration and install the wiki right now.",
"config-optional-continue": "Ask me more questions.",
"config-optional-skip": "I'm bored already, just install the wiki.",
"config-install-user-alreadyexists": "Kasutaja \"$1\" on juba olemas",
"config-install-tables": "Tabelite loomine",
"config-help": "abi",
- "mainpagetext": "'''MediaWiki tarkvara on edukalt paigaldatud.'''",
+ "mainpagetext": "<strong>MediaWiki tarkvara on paigaldatud.</strong>",
"mainpagedocfooter": "Vikitarkvara kasutamise kohta leiad lisateavet [https://meta.wikimedia.org/wiki/Help:Contents juhendist].\n\n== Alustamine ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Häälestussätete loend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki KKK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki lokaliseerimine]"
}
"config-header-oracle": "Oracle hobespenak",
"config-header-mssql": "Microsoft SQL Server-en ezarpenak",
"config-invalid-db-type": "Datu-base mota baliogabea.",
+ "config-db-sys-user-exists-oracle": "$1 erabiltzaile kontua dagoeneko existitzen da. SYSDBA kontu berri bat sortzeko erabili daiteke soilik!",
"config-mysql-innodb": "InnoDB",
"config-mysql-myisam": "MyISAM",
"config-mysql-binary": "Bitarra",
"config-subscribe": "عضویت در [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].",
"config-subscribe-help": "این یک میلینگ لیست کم حجم است که برای اطلاعرسانی کاربرد دارد و شامل اطلاعیههای امنیتی میشود.\nشما باید در آن ثبت نام کنید و زمانی که نسخهٔ جدید مدیاویکی ارائه شد آن را بهروز نمائید.",
"config-subscribe-noemail": "شما بدون ثبت نشانی پست الکترونیکی قصد داشتید در فهرست اطلاعرسانی پخش نرمافزار ثبتنام کنید.\nاگر قصد ثبتنام دارید لطفاً یک نشانی پست الکترونیکی مشخص کنید.",
+ "config-pingback": "اشتراک گذاری دادههای نصب با توسعهدهندگان مدیاویکی",
+ "config-pingback-help": "اگر این گزینه را انتخاب کنید، ویکیمدیا به صورت مداوم به وبگاه https://www.mediawiki.org برای ارسال اطلاعات ابتدایی نصب این مدیاویکی ارتباط برقرار میکند. اطلاعات شامل نوع سامانه، نسخهٔ پیاچپی، دیتابیس انتخاب شده میباشد. بنیاد مدیاویکی برای توسعههای آینده نرمافزار اطلاعات را با توسعه دهندگان مدیاویکی به اشتراک میگذارد. اطلاعاتی که از سامانه شما ارسال خواهد شد موارد زیر هستند:\n<pre>$1</pre>",
"config-almost-done": "شما تقریباً عملیات را کامل کردهاید.\nاکنون میتوانید پیکربندی باقیمانده را نخوانده رها کنید و درحالحاضر ویکی را نصب کنید.",
"config-optional-continue": "سوالهای بیشتری از من بپرسید.",
"config-optional-skip": "درحالحاضر خستهام،سریعاً ویکی را نصب کنید.",
"config-subscribe": "Abonnez-vous à la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce liste d'annonce des nouvelles versions]",
"config-subscribe-help": "Il s'agit d'une liste de diffusion à faible volume utilisée servant à annoncer les nouvelles versions, y compris les versions améliorant la sécurité du logiciel.\nVous devriez y souscrire et mettre à jour votre version de MediaWiki lorsque de nouvelles versions sont publiées.",
"config-subscribe-noemail": "Vous avez essayé de vous abonner à la liste de diffusion des communiqués, sans fournir une adresse courriel ! S'il vous plaît, fournir une adresse électronique si vous souhaitez vous abonner à la liste de diffusion.",
+ "config-pingback": "Partager des données au sujet de cette installation avec les développeurs de MediaWiki.",
+ "config-pingback-help": "Si vous sélectionnez cette option, MediaWiki fera périodiquement un ping de https://www.mediawiki.org avec les données de base sur cette instance de MediaWiki. Ces données incluent, par exemple, le type de système, la version de PHP, ainsi que la base de données arrière choisie. La Fondation Wikimedia partage ces données avec les développeurs de MediaWiki pour aider à orienter les futurs efforts de développement. Les données suivantes concernant votre système seront envoyées : <pre>$1</pre>",
"config-almost-done": "Vous avez presque fini !\nVous pouvez passer la configuration restante et installer immédiatement le wiki.",
"config-optional-continue": "Me poser davantage de questions.",
"config-optional-skip": "J’en ai assez, installer simplement le wiki.",
"Toliño",
"아라",
"Vivaelcelta",
- "Macofe"
+ "Macofe",
+ "Banjo"
]
},
"config-desc": "O programa de instalación de MediaWiki",
"config-subscribe": "Subscríbase á [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de correo de anuncios sobre lanzamentos].",
"config-subscribe-help": "Esta é unha lista de correos de baixo volume usada para anuncios sobre lanzamentos de novas versións, incluíndo avisos de seguridade importantes.\nDebería subscribirse a ela e actualizar a súa instalación MediaWiki cando saian as novas versións.",
"config-subscribe-noemail": "Intentou subscribirse á lista de correo dos anuncios de novos lanzamentos sen proporcionar o enderezo de correo electrónico.\nDea un enderezo de correo electrónico se quere efectuar a subscrición á lista de correo.",
+ "config-pingback": "Compartir datos de esta instalación cos desenvolvedores de MediaWiki",
+ "config-pingback-help": "Se seleccionas esta opción, MediaWiki enviará periodicamente unha mensaxe a https://www.mediawiki.org con datos básicos sobre esta instancia Mediawiki. Estos datos inclúen, por exemplo, o tipo de sistema, versión de PHP e a base de datos escollida. A Fundación Wikimedia comparte estos datos cos desenvolvedores de MediaWiki para axudar a guiar o traballo futuro de desenvolvemento. Serán enviados os seguintes datos do seu sistemaː\n<pre>$1</pre>",
"config-almost-done": "Xa case rematou!\nNeste paso pode saltar o resto da configuración e instalar o wiki agora mesmo.",
"config-optional-continue": "Facédeme máis preguntas.",
"config-optional-skip": "Xa estou canso. Instalade o wiki.",
"config-subscribe": "להירשם ל[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה עם הודעות על גרסאות חדשות].",
"config-subscribe-help": "זוהי רשימת תפוצה עם הודעות מעטות שמשמשת להודעות על הוצאת גרסאות, כולל עדכוני אבטחה חשובים.\nמומלץ להירשם אליה ולעדכן את מדיה־ויקי כאשר יוצאות גרסאות חדשות.",
"config-subscribe-noemail": "ניסית להירשם לרשימת תפוצה של הודעות בלי לתת כתובת דוא\"ל.\nנא לתת כתובת דוא\"ל אם ברצונך להירשם לרשימת התפוצה.",
+ "config-pingback": "לשתף נתונים אודות ההתקנה הזו עם מפתחי מדיה־ויקי.",
+ "config-pingback-help": "אם האפשרות הזאת תיבחר, מדיה־ויקי תודיע לאתר https://www.mediawiki.org נתונים בסיסיים על מופע המדיה־ויקי הזה. הנתונים האלה כוללים, למשל, את סוג המערכת, גרסת ה־PHP, ושרת מסד הנתונים שבחרת. קרן ויקימדיה משתפת את הנתונים האלה עם מפתחי מדיה־ויקי כדי לעזור למאמצי הפיתוח העתידיים. הנתונים הבאים יישלחו מהמערכת שלך:\n<pre>$1</pre>",
"config-almost-done": "כמעט סיימת!\nאפשר לדלג על שאר ההגדרות ולהתקין את הוויקי כבר עכשיו.",
"config-optional-continue": "הצגת שאלות נוספות.",
"config-optional-skip": "משעמם לי, תתקינו לי כבר את הוויקי הזה.",
"config-subscribe": "Sottoscrivi la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list degli annunci di rilasci].",
"config-subscribe-help": "Si tratta di una mailing list a basso traffico dedicata agli annunci di nuove versioni, compresi importanti segnalazioni riguardanti la sicurezza.\nÈ consigliato iscriversi e aggiornare la propria installazione di MediaWiki quando una nuova versione viene resa pubblica.",
"config-subscribe-noemail": "Hai provato ad iscriverti alla mailing list dedicata agli annunci delle nuove versioni senza fornire un indirizzo email.\nInserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing list.",
+ "config-pingback": "Condividi i dati su questa installazione con gli sviluppatori di MediaWiki.",
"config-almost-done": "Hai quasi finito!\nAdesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.",
"config-optional-continue": "Fammi altre domande.",
"config-optional-skip": "Sono già stanco, installa solo il wiki.",
"config-install-extension-tables": "有効にした拡張機能のためのテーブルを作成しています",
"config-install-mainpage-failed": "メインページを挿入できませんでした: $1",
"config-install-done": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
+ "config-install-done-path": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、<code>$4</code> に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
"config-download-localsettings": "<code>LocalSettings.php</code> をダウンロード",
"config-help": "ヘルプ",
"config-help-tooltip": "クリックで展開",
"config-unicode-pure-php-warning": "<strong>경고:</strong> 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 유니코드 정규화]를 읽어보셔야 합니다.",
"config-unicode-update-warning": "<strong>경고:</strong> 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 업그레이드]해야합니다.",
"config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 {{PLURAL:$2|유형을 지원합니다}}: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 <code>./configure --with-mysql</code>을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 <code>php5-mysql</code> 모듈도 설치해야 합니다.",
- "config-outdated-sqlite": "<strong>경고:</strong> 최소인 $2 버전보다 낮은 SQLite $1(이)가 있습니다. SQLite를 사용할 수 없습니다.",
+ "config-outdated-sqlite": "<strong>경고:</strong> 최소 요구 버전 $2 보다 낮은 SQLite $1이(가) 있습니다. SQLite를 사용할 수 없습니다.",
"config-no-fts3": "<strong>경고:</strong> SQLite를 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일하며, 검색 기능은 백엔드에 사용할 수 없습니다.",
"config-pcre-old": "<strong>치명:</strong> PCRE $1 또는 그 이상이 필요합니다.\nPHP 바이너리는 PCRE $2에 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 자세한 정보].",
"config-pcre-no-utf8": "<strong>치명:</strong> PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.\n미디어위키가 올바르게 작동하려면 UTF-8을 지원해야 합니다.",
"config-no-scaling": "GD 라이브러리나 ImageMagick를 찾을 수 없습니다.\n그림 섬네일이 비활성화됩니다.",
"config-no-uri": "<strong>오류:</strong> 현재 URI를 확인할 수 없습니다.\n설치가 중단되었습니다.",
"config-no-cli-uri": "<strong>경고:</strong> 기본값을 사용하여 <code>--scriptpath</code>를 지정하지 않았습니다: <code>$1</code>.",
- "config-using-server": "\"<nowiki>$1</nowiki>\"(을)를 서버 이름으로 사용합니다.",
- "config-using-uri": "\"<nowiki>$1$2</nowiki>\"(을)를 서버 URL로 사용합니다.",
+ "config-using-server": "\"<nowiki>$1</nowiki>\" 서버 이름을 사용 중입니다.",
+ "config-using-uri": "\"<nowiki>$1$2</nowiki>\" 서버 URL을 사용 중입니다.",
"config-uploads-not-safe": "<strong>경고:</strong> 올리기에 대한 기본 디렉터리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.\n미디어위키는 보안 위협 때문에 모든 올려진 파일을 검사하지만, 올리기를 활성화하기 전에 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.",
"config-no-cli-uploads-check": "<strong>경고:</strong> 올리기를 위한 기본 디렉터리(<code>$1</code>)는 CLI를 설치하는 동안 임의의 스크립트 실행에 대한 취약점에 대해 검사되지 않습니다.",
"config-brokenlibxml": "시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 미디어위키나 다른 웹 애플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.\nlibxml2 2.7.3 이후 버전으로 업그레이드하세요. ([https://bugs.php.net/bug.php?id=45996 PHP에 제기한 버그])\n설치가 중단되었습니다.",
"config-db-wiki-help": "정상적인 위키 작업 동안 데이터베이스에 연결하는 데 사용할 사용자 이름과 비밀번호를 입력하세요.\n계정이 존재하지 않고 설치 계정에 충분한 권한이 있는 경우 이 사용자 계정은 위키를 작동하는 데 필요한 최소 권한으로 만들어집니다.",
"config-db-prefix": "데이터베이스 테이블 접두어:",
"config-db-prefix-help": "여러 위키 사이 또는 미디어위키와 다른 웹 애플리케이션 사이에 하나의 데이터베이스를 공유해야 하는 경우, 충돌을 피하기 위해 모든 테이블 이름에 접두어를 추가하도록 선택할 수 있습니다.\n공백을 사용하지 마세요.\n\n이 필드는 일반적으로 비어 있습니다.",
- "config-mysql-old": "MySQL $1 ì\9d´ì\83\81ì\9d´ í\95\84ì\9a\94í\95\98ë\82\98 $2(ì\9d´)ê°\80 있습니다.",
+ "config-mysql-old": "MySQL $1 ì\9d´ì\83\81ì\9d´ í\95\84ì\9a\94í\95©ë\8b\88ë\8b¤. $2ì\9d´(ê°\80) 있습니다.",
"config-db-port": "데이터베이스 포트:",
"config-db-schema": "미디어위키에 대한 스키마:",
"config-db-schema-help": "보통 이 스키마는 문제가 없습니다.\n필요한 경우에만 바꾸세요.",
"config-invalid-schema": "미디어위키 \"$1\"에 대한 스키마가 잘못됐습니다.\nASCII 글자 (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 ì\9d´ì\83\81ì\9d´ í\95\84ì\9a\94í\95\98ë\82\98 $2(ì\9d´)ê°\80 있습니다.",
+ "config-postgres-old": "PostgreSQL $1 ì\9d´ì\83\81ì\9d´ í\95\84ì\9a\94í\95©ë\8b\88ë\8b¤. $2ì\9d´(ê°\80) 있습니다.",
"config-mssql-old": "Microsoft SQL 서버 $1 이상의 버전이 필요합니다. 현재 버전은 $2입니다.",
"config-sqlite-name-help": "위키를 식별하기 위한 이름을 선택하세요.\n공백이나 하이픈을 사용하지 마십시오.\nSQLite 데이터 파일 이름에 사용됩니다.",
"config-sqlite-parent-unwritable-group": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버는 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 관리자는 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
"config-subscribe": "[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 릴리스 발표 메일링 리스트]를 구독합니다.",
"config-subscribe-help": "중요한 보안 발표를 포함한 배포판 발표에 사용되는 저용량 메일링 리스트입니다.\n이 리스트를 구독하고 새 버전이 나올 때 미디어위키 설치를 업데이트해야 합니다.",
"config-subscribe-noemail": "이메일 주소를 입력하지 않고 릴리스 발표 메일링 리스트에 가입하려 합니다.\n메일링 리스트에 가입하고자 할 경우 이메일 주소를 입력하세요.",
+ "config-pingback": "본 설치에 관한 데이터를 미디어위키 개발자와 공유합니다.",
+ "config-pingback-help": "이 옵션을 선택하면 미디어위키는 주기적으로 이 미디어위키 인스턴스에 대한 기본 데이터를 가지고 https://www.mediawiki.org에 핑을 합니다. 이 데이터에는 이를테면 시스템의 종류, PHP 버전, 선택한 데이터베이스 백엔드를 포함합니다. 위키미디어 재단은 이 데이터를 미디어위키 개발자들과 공유하여 향후 개발 활동의 길잡이에 도움을 줍니다. 시스템에 대해 다음의 데이터가 전송될 것입니다:\n<pre>$1</pre>",
"config-almost-done": "거의 다 완료했습니다!\n이제 남은 설정을 생략하고 지금 바로 위키를 설치할 수 있습니다.",
"config-optional-continue": "더 많은 질문을 물어보세요.",
"config-optional-skip": "지겨워요, 그냥 위키를 설치할래요.",
"config-memcache-needservers": "캐시 종류로 Memcached를 선택했지만 어떠한 서버도 지정하지 않았습니다.",
"config-memcache-badip": "Memcached에 대해 잘못된 IP 주소를 입력했습니다: $1.",
"config-memcache-noport": "Memcached 서버에 사용할 포트를 지정하지 않았습니다: $1.\n포트를 모를 경우 기본 값은 11211입니다.",
- "config-memcache-badport": "Memcached 포트 번호는 $1(와)과 $2 사이여야 합니다.",
+ "config-memcache-badport": "Memcached 포트 번호는 $1와(과) $2 사이여야 합니다.",
"config-extensions": "확장 기능",
"config-extensions-help": "위에 나열된 확장 기능이 <code>./extensions</code>에서 발견되었습니다.\n\n추가적인 설정이 필요할 수 있습니다만 지금 활성화시킬 수 있습니다.",
"config-skins": "스킨",
"config-subscribe": "Donn de [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Leß met de Aanköndijonge vum MehdijaWikki] abonnehre.",
"config-subscribe-help": "Do kumme bloß winnish Meddeilunge un di jonn övver neu Versiohne vom MediaWiki un weeshtejje Saache vun däm sing Sesherheit.\nDo sullts se abbonneere, un Ding MediWiki_Projramme op der neue Shtand bränge, wann neu Version eruß kumme.",
"config-subscribe-noemail": "Do has versöhk, der ohne en Addräß för Ding <i lang=\"en\">e-mail<i> aanzejävve, de Aanköndijonge för Aanköndijunge för neue Versione ze abboneere. Jivv en Addräß aan, wann De di Aanköndijonge hann wells.",
+ "config-pingback": "Jivv Dahte övver heh di Enschtallazjuhn vum Mehdijawikki aan de Äntwerkere.",
"config-almost-done": "Do bes beinah dorsch!\nDo künnts jez der Räß vun de einzel Enschtällonge övverjonn, un et Wiki tiräktemang fähdesch opsäze.",
"config-optional-continue": "De wells noch mih Frohre jeschtallt krijje un noch mih Enschtällonge maache?",
"config-optional-skip": "Nä, lohß dä Ömshtand, donn eifarr_et Wiki opsäze.",
"config-admin-error-password": "Interne Feeler beim Setze vum Passwuert fir den Admin \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
"config-admin-error-bademail": "Dir hutt eng E-Mail-Adress aginn déi net valabel ass",
"config-subscribe": "Sech op d'[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ukënnegunge vun neie Versiounen] abonnéieren.",
+ "config-pingback-help": "Wann Dir dës Optioun auswielt schéckt MediaWiki regelméisseg https://www.mediawiki.org Basisdaten iwwer dës MediaWiki-Instanz. An dësen Daten sinn zum Beispill de Systemtyp, d'PHP-Versioun an déi erausgesicht Datebank-Backend. D'Wikimedia Foundation gëtt dës Daten un d'MediaWiki-Entwéckler, fir ze hëllefen d'Entwécklung an der Zukunft efficace z'organiséieren. Dës Date gi fir Äre System geschéckt:\n<pre>$1</pre>",
"config-almost-done": "Dir sidd bal fäerdeg!\nDir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki elo direkt installéieren.",
"config-optional-continue": "Stellt mir méi Froen.",
"config-optional-skip": "Ech hunn es genuch, installéier just d'Wiki.",
"config-subscribe": "Претплатете се на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release поштенскиот список за известувања].",
"config-subscribe-help": "Ова е нископрометен поштенски список кој се користи за соопштувања во врска со изданија, вклучувајќи важни безбедносни соопштенија.\nТреба да се претплатите и да ја надградувате вашата воспоставка на МедијаВики кога излегуваат нови верзии.",
"config-subscribe-noemail": "Се обидовте да се претплатите на поштенскиот список со известувања за нови изданија без да наведете е-пошта.\nНаведете е-поштенска адреса ако сакате да се претплатите на списокот.",
+ "config-pingback": "Споделувај податоци за воспоставката со разработувачите на МедијаВики.",
+ "config-pingback-help": "Ако ја изберете оваа можност, МедијаВики повремено ќе му испраќа на https://www.mediawiki.org основни податоци за овој примерок на МедијаВики. Тука спаѓаат видот на системот, PHP-верзијата и избраната базна заднина. Фондацијата Викимедија ги споделува овие податоци со разработувачите на МедијаВики со цел да им даде насоки за разработка во идните верзии. За вашиот систем ќе се испратат следниве податоци:\n<pre>$1</pre>",
"config-almost-done": "Уште малку сте готови!\nСега можете да ги прескокнете преостанатите поставувања и веднаш да го воспоставите викито.",
"config-optional-continue": "Постави ми повеќе прашања.",
"config-optional-skip": "Веќе ми здосади, дај само воспостави го викито.",
{
"@metadata": {
"authors": [
- "Lionslayer"
+ "Lionslayer",
+ "Ninjastrikers"
]
},
- "mainpagetext": "'''မီဒီယာဝီကီကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။'''"
+ "mainpagetext": "<strong>မီဒီယာဝီကီကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။</strong>"
}
"config-subscribe": "Zapisz się na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce listę pocztową z ogłoszeniami o nowych wersjach].",
"config-subscribe-help": "Jest to lista o małej liczbie wiadomości, wykorzystywana do przesyłania informacji o udostępnieniu nowej wersji oraz istotnych sprawach dotyczących bezpieczeństwa.\nPowinieneś zapisać się na tę listę i aktualizować zainstalowane oprogramowanie MediaWiki gdy pojawia się nowa wersja.",
"config-subscribe-noemail": "Próbowano subskrybować listę mailingową ogłoszeń wersji bez podania adresu e-mail.\nProszę podać adres e-mail, jeśli chcesz subskrybować listę wysyłkową.",
+ "config-pingback": "Udostępnij dane o instalacji twórcom MediaWiki.",
+ "config-pingback-help": "Jeżeli wybierzesz tę opcję, MediaWiki będzie okresowo wysyłać na https://www.mediawiki.org podstawowe dane na temat tej instancji MediaWiki. Te dane zawierają np. typ systemu, wersję PHP i wybrany silnik bazy danych. Fundacja Wikimedia dzieli się tymi danymi z twórcami MediaWiki, aby pomóc w podejmowaniu dalszych wysiłków co do rozwoju. Poniższe dane o Twoim systemie zostaną wysłane:\n<pre>$1</pre>",
"config-almost-done": "To już prawie koniec!\nMożesz pominąć pozostałe czynności konfiguracyjne i zainstalować wiki.",
"config-optional-continue": "Zadaj mi więcej pytań.",
"config-optional-skip": "Jestem już znudzony, po prostu zainstaluj wiki.",
"config-install-extension-tables": "Tworzenie tabel dla aktywnych rozszerzeń",
"config-install-mainpage-failed": "Nie udało się wstawić strony głównej: $1",
"config-install-done": "<strong>'''Gratulacje!</strong>\nUdało Ci się zainstalować MediaWiki.\n\nInstalator wygenerował plik konfiguracyjny <code>LocalSettings.php</code>.\n\nMusisz go pobrać i umieścić w katalogu głównym Twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.\n\nJeżeli pobieranie nie zostało zaproponowane lub jeśli użytkownik je anulował, można ponownie uruchomić pobranie klikając poniższe łącze:\n\n$3\n\n<strong>Uwaga</strong>: Jeśli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.\n\nPo załadowaniu pliku konfiguracyjnego możesz <strong>[$2 wejść na wiki]</strong>.",
+ "config-install-done-path": "<strong>Gratulacje!</strong>\nZainstalowałeś właśnie MediaWiki.\n\nInstalator wygenerował plik <code>LocalSettings.php</code>.\nZawiera całą Twoją konfigurację.\n\nMusisz go pobrać i umieścić w <code>$4</code>. Pobieranie powinno rozpocząć się automatycznie.\n\nJeżeli nie pojawiła się informacja o pobieraniu lub jeżeli ja anulowałeś, kliknij poniższy link:\n\n$3\n\n<strong>Uwaga:</strong> Jeżeli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie potem dostępny, jeżeli wyjdziesz z instalacji bez jego pobrania.\n\nGdy to będzie zrobione, możesz <strong>[$2 wejść na swoją wiki]</strong>.",
"config-download-localsettings": "Pobierz <code>LocalSettings.php</code>",
"config-help": "pomoc",
"config-help-tooltip": "kliknij, aby rozwinąć",
"config-subscribe": "Used as label for the installer checkbox",
"config-subscribe-help": "\"Low-volume\" in this context means that there will be few e-mails to that mailing list per time period.",
"config-subscribe-noemail": "Error text in MediaWiki installer.",
+ "config-pingback": "Option in the MediaWiki installer to submit data about this installation to MediaWiki.org.",
+ "config-pingback-help": "Explains what data will be shared if the user chooses to submit data to MediaWiki.org. $1 is the JSON data that will be sent",
"config-almost-done": "Status message in the MediaWiki installer.",
"config-optional-continue": "Option in the MediaWiki installer to make a more fine-tuned installation.",
"config-optional-skip": "Option in the MediaWiki installer to start executing the actual installation and stop asking questions.",
"config-subscribe": "Подписаться на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce рассылку новостей о появлении новых версий MediaWiki].",
"config-subscribe-help": "Это список рассылки с малым числом сообщений, используется для анонса новых выпусков и сообщений о проблемах с безопасностью.\nВам следует подписаться на него и обновлять движок MediaWiki, по мере выхода новых версий.",
"config-subscribe-noemail": "Вы попытались подписаться на список рассылки уведомлений о новых выпусках без указания адреса электронной почты.\nУкажите адрес электронной почты, если вы хотите подписаться на список рассылки.",
+ "config-pingback": "Поделиться сведениями об этой установке с разработчикам MediaWiki.",
+ "config-pingback-help": "Если вы выберите этот вариант, MediaWiki будет периодически отправлять на https://www.mediawiki.org основные сведения об этом экземпляре MediaWiki. К этим данным относятся, в частности, тип операционной системы, версия PHP и выбранная СУБД. Фонда Викимедиа делится этими данными с разработчиками MediaWiki, чтобы помочь им в проведении будущих разработок. Следующие данные будут отправлены для вашей системы:\n<pre>$1</pre>",
"config-almost-done": "Вы почти у цели!\nОстальные настройки можно пропустить и приступить к установке вики.",
"config-optional-continue": "Произвести тонкую настройку",
"config-optional-skip": "Хватит, установить вики",
"config-subscribe": "Prenumerera på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlistan för kungörelser av nya versioner].",
"config-subscribe-help": "Detta är en e-postlista med låg volym vilken används för meddelanden om nya versionssläpp, inklusive viktiga säkerhetsmeddelanden.\nDu bör prenumerera på den och uppdatera din MediaWiki-installation när nya versioner kommer ut.",
"config-subscribe-noemail": "Du försökte att prenumerera på e-postlistan för versionssläppsmeddelanden utan att tillhandahålla en e-postadress.\nAnge en e-postadress om du vill prenumerera på e-postlistan.",
+ "config-pingback": "Dela data om denna installation med MediaWikis utvecklare.",
"config-almost-done": "Du är nästan färdig!\nDu kan nu hoppa över återstående konfigurationer och installera wikin direkt.",
"config-optional-continue": "Ställ fler frågor till mig.",
"config-optional-skip": "Jag är redan uttråkad, bara installera wiki.",
{
"@metadata": {
"authors": [
- "VASANTH S.N."
+ "VASANTH S.N.",
+ "Vishwanatha Badikana"
]
},
- "config-title": "ಮೀಡಿಯಾವಿಕಿ ಆವೃತ್ತಿ $1 ರ ಅನುಸ್ಥಾಪನೆ",
+ "config-desc": "ಮೀಡಿಯ ವಿಕಿದ ಪ್ರತಿಸ್ಟಾಪನೆ",
+ "config-title": "ಮೀಡಿಯಾವಿಕಿ ಆವೃತ್ತಿ $1 ರ ಪ್ರತಿಸ್ಟಾಪನೆ",
"config-information": "ಮಾಹಿತಿ",
- "config-localsettings-key": "ಉನ್ನತೀಕರಣ ಕೀಲಿ",
- "config-session-error": "ಅವಧಿ ಪ್ರಾರಂಭದ ದೋಷ: $1",
+ "config-localsettings-upgrade": "ಒಂಜಿ<code>LocalSettings.php</code>ದ ಕಡತೊ ಪತ್ತೆ ಆತ್ಂಡ್. ಈ ಪ್ರತಿಸ್ಟಾಪನೆನ್ ಪೊಸತ್ ಮಲ್ಪೆರೆ, ದಯದೀಡ್ದ್ ತಿರ್ತ್ದ ಪಟ್ಟಿಗೆದ <code>$wgUpgradeKey</code>ದ ಬಿಲೆನ್ ನಮೂದಿಸಲೆ.\nಈರ್ <code>LocalSettings.php</code>ನ್ ನಾಡೊಲಿ",
+ "config-localsettings-cli-upgrade": "ಒಂಜಿ<code>LocalSettings.php</code>ದ ಕಡತೊ ಪತ್ತೆ ಆತ್ಂಡ್. ಈ ಪ್ರತಿಸ್ಟಾಪನೆನ್ ಪೊಸತ್ ಮಲ್ಪೆರೆ, ದಯದೀಡ್ದ್ ತಿರ್ತ್ದ ಪಟ್ಟಿಗೆದ <code>$wgUpgradeKey</code>ದ ಬಿಲೆನ್ ನಮೂದಿಸಲೆ.\nದಯಮಲ್ತ್ <code>LocalSettings.php</code>ಗ್ ಬದಲಾದ್ ಬಲಿಪಾಲೆ",
+ "config-localsettings-key": "ಏಲಿಗೆದ ಕೀ",
+ "config-session-error": "ಸಬೆ ಸುರುಮಲ್ಪುನ ದೋಸೊ: $1",
"config-your-language": "ಇರೆನಾ ಬಾಸೆ",
- "config-wiki-language": "ವಿà²\95ಿ à²à²¾à²·ೆ:",
+ "config-wiki-language": "ವಿà²\95ಿ ಬಾಸೆ:",
"config-back": "← ಪಿರ",
"config-continue": "ಮುಂದುವರೆಸಾಲೆ →",
- "config-page-language": "à²ಾಸೆ",
+ "config-page-language": "ಬಾಸೆ",
"config-page-welcome": "ಮಾಧ್ಯಮವಿಕಿಗ್ ಸ್ವಾಗತ",
"config-page-dbconnect": "ದತ್ತಾಂಶಸಂಚಯಗ್ ಸಂಪರ್ಕಕೊರ್ಲೆ",
"config-page-name": "ಪುದರ್",
"config-subscribe": "Підписатися на [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce розсилку анонсів нових версій MediaWiki].",
"config-subscribe-help": "Це список розсилки з малим обсягом повідомлень, що використовується для анонсування релізів, а також важливих повідомлень про безпеку.\nВам варто підписати і оновлювати інсталяцію MediaWiki, коли з'являтимуться нові версії.",
"config-subscribe-noemail": "Ви намагались підписатись на розсилку анонсів релізів, не вказавши адреси електронної пошти.\nБудь ласка, вкажіть адресу електронної пошти, якщо хочете підписатись на розсилку.",
+ "config-pingback": "Поділитися даними про цю інсталяцію з розробниками MediaWiki.",
+ "config-pingback-help": "Якщо Ви обираєте цю опцію, MediaWiki періодично пінгуватиме https://www.mediawiki.org базовими даними про цю інсталяцію MediaWiki. Дані включають, наприклад, тип системи, версію PHP, обраний бекенд бази даних. Фонд Вікімедіа ділиться цими даними з розробниками MediaWiki, щоб допомогти спрямувати подальні розробки. Від Вашої системи надсилатимуться такі дані:\n<pre>$1</pre>",
"config-almost-done": "Майже готово!\nВи можете зараз пропустити налаштування, що залишилось, і встановити вікі прямо зараз.",
"config-optional-continue": "Запитуйте ще.",
"config-optional-skip": "Це вже втомлює, просто встановити вікі.",
]
},
"config-information": "信息",
+ "config-back": "← 转去",
"config-page-language": "闲话",
"mainpagetext": "<strong>MediaWiki安装好哉。</strong>",
"mainpagedocfooter": "请访问[https://meta.wikimedia.org/wiki/Help:Contents 用户手册]以获得使用此维基软件个信息!\n\n== 入门 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 配置设置列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常见问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]"
"config-subscribe": "订阅[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 发行公告邮件列表]。",
"config-subscribe-help": "此低流量的邮件列表仅用于发行公告,其中包括重要安全公告。请订阅该列表以便在新的版本推出时升级您的MediaWiki。",
"config-subscribe-noemail": "您选择了订阅发行公告邮件列表,但没有提供电子邮件地址。请提供一个电子邮件地址以订阅邮件列表。",
+ "config-pingback": "与MediaWiki开发人员分享有关此安装程序的数据。",
+ "config-pingback-help": "如果您选择此选项,MediaWiki将定期与https://www.mediawiki.org通信,传输与此MediaWiki实例相关的基础数据。此数据包括例如系统类型、PHP版本和选择的数据库后端。维基媒体基金会与MediaWiki开发人员分享此数据,以帮助引导将来的开发计划。以下数据将为您的系统发送:\n<pre>$1</pre>",
"config-almost-done": "您几乎已经完成了!现在您可以跳过剩下的配置流程并立即安装wiki。",
"config-optional-continue": "多问我一些问题吧。",
"config-optional-skip": "我已经不耐烦了,赶紧安装我的wiki。",
"LNDDYL",
"NigelSoft",
"Macofe",
- "Reke"
+ "Reke",
+ "Suchichi02"
]
},
"config-desc": "MediaWiki 安裝程式",
"config-ns-site-name": "同 Wiki 名稱:$1",
"config-ns-other": "其他 (請註明)",
"config-ns-other-default": "我的 wiki",
- "config-project-namespace-help": "許多 Wiki 以維基百科(Wikipedia)做為範例將政策頁面從內容頁面抽離,放置在 \"'''專案命名空間'''\" 中。\n所有在此命名空間裡的頁面都會有特定的字首,您可以在此處設定。\n通常這些字首是由該 Wiki 的名稱所衍伸出來,但無法使用標點符號,如 \"#\" 或 \":\"。",
+ "config-project-namespace-help": "許多 Wiki 以維基百科 (Wikipedia) 做為範例將政策頁面從內容頁面抽離,放置在 \"'''專案命名空間'''\" 中。\n所有在此命名空間裡的頁面都會有特定的字首,您可以在此處設定。\n通常這些字首是由該 Wiki 的名稱所衍伸出來,但無法使用標點符號,如 \"#\" 或 \":\"。",
"config-ns-invalid": "您指定的命名空間 \"<nowiki>$1</nowiki>\" 無效,\n請指定另一個專案命名空間。",
"config-ns-conflict": "您指定的命名空間 \"<nowiki>$1</nowiki>\" 與 MediaWiki 預設的命名空間衝突。\n請指定另一個專案命名空間。",
"config-admin-box": "管理員帳號",
"config-help-tooltip": "點選以展開",
"config-nofile": "查無檔案 \"$1\",是否已被刪除?",
"config-extension-link": "您是否了解您的 Wiki 支援 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 擴充套件]?\n\n\n您可以瀏覽 [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 擴充套件分類] 或 [https://www.mediawiki.org/wiki/Extension_Matrix 擴充套件資料表] 以取得相關的資訊。",
- "mainpagetext": "<strong>已成功安裝 MediaWiki。</strong>",
+ "mainpagetext": "<strong>已安裝 MediaWiki。</strong>",
"mainpagedocfooter": "請參閱 [https://meta.wikimedia.org/wiki/Help:Contents 使用者手冊] 以取得使用 Wiki 的相關訊息!\n\n== 新手入門 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 系統設定]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常見問答集]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵寄清單]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki 介面在地化]"
}
$stats->timing( "jobqueue.run.$jType", $timeMs );
// Track RSS increases for jobs (in case of memory leaks)
if ( $rssStart && $rssEnd ) {
- $stats->increment( "jobqueue.rss_delta.$jType", $rssEnd - $rssStart );
+ $stats->updateCount( "jobqueue.rss_delta.$jType", $rssEnd - $rssStart );
}
if ( $status === false ) {
}
$pageId = $this->params['pageId'];
+
+ // Serialize links updates by page ID so they see each others' changes
+ $scopedLock = LinksUpdate::acquirePageLock( wfGetDB( DB_MASTER ), $pageId, 'job' );
+
if ( WikiPage::newFromID( $pageId, WikiPage::READ_LATEST ) ) {
// The page was restored somehow or something went wrong
$this->setLastError( "deleteLinks: Page #$pageId exists" );
* @return bool
*/
protected function runForTitle( Title $title ) {
+ $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+
$page = WikiPage::factory( $title );
$page->loadPageData( WikiPage::READ_LATEST );
+
+ // Serialize links updates by page ID so they see each others' changes
+ $scopedLock = LinksUpdate::acquirePageLock( wfGetDB( DB_MASTER ), $page->getId(), 'job' );
+ // Get the latest ID *after* acquirePageLock() flushed the transaction.
+ // This is used to detect edits/moves after loadPageData() but before the scope lock.
+ // The works around the chicken/egg problem of determining the scope lock key.
+ $latest = $title->getLatestRevID( Title::GAID_FOR_UPDATE );
+
if ( !empty( $this->params['triggeringRevisionId'] ) ) {
// Fetch the specified revision; lockAndGetLatest() below detects if the page
// was edited since and aborts in order to avoid corrupting the link tables
$revision = Revision::newFromTitle( $title, false, Revision::READ_LATEST );
}
- $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
-
if ( !$revision ) {
$stats->increment( 'refreshlinks.rev_not_found' );
$this->setLastError( "Revision not found for {$title->getPrefixedDBkey()}" );
return false; // just deleted?
- } elseif ( !$revision->isCurrent() || $revision->getPage() != $page->getId() ) {
- // If the revision isn't current, there's no point in doing a bunch
- // of work just to fail at the lockAndGetLatest() check later.
+ } elseif ( $revision->getId() != $latest || $revision->getPage() !== $page->getId() ) {
+ // Do not clobber over newer updates with older ones. If all jobs where FIFO and
+ // serialized, it would be OK to update links based on older revisions since it
+ // would eventually get to the latest. Since that is not the case (by design),
+ // only update the link tables to a state matching the current revision's output.
$stats->increment( 'refreshlinks.rev_not_current' );
$this->setLastError( "Revision {$revision->getId()} is not current" );
return false;
}
}
- $latestNow = $page->lockAndGetLatest();
- if ( !$latestNow || $revision->getId() != $latestNow ) {
- // Do not clobber over newer updates with older ones. If all jobs where FIFO and
- // serialized, it would be OK to update links based on older revisions since it
- // would eventually get to the latest. Since that is not the case (by design),
- // only update the link tables to a state matching the current revision's output.
- $stats->increment( 'refreshlinks.rev_cas_failure' );
- $this->setLastError( "page_latest changed from {$revision->getId()} to $latestNow" );
- return false;
- }
-
DataUpdate::runUpdates( $updates );
InfoAction::invalidateCache( $title );
if ( $input instanceof HtmlArmor ) {
return $input->value;
} else {
- return htmlspecialchars( $input );
+ return htmlspecialchars( $input, ENT_QUOTES );
}
}
}
* use application/x-www-form-urlencoded (headers sent automatically)
* - stream : resource to stream the HTTP response body to
* - proxy : HTTP proxy to use
+ * - flags : map of boolean flags which supports:
+ * - relayResponseHeaders : write out header via header()
* Request maps can use integer index 0 instead of 'method' and 1 instead of 'url'.
*
* @author Aaron Schulz
$req['body'] = '';
$req['headers']['content-length'] = 0;
}
+ $req['flags'] = isset( $req['flags'] ) ? $req['flags'] : [];
$handles[$index] = $this->getCurlHandle( $req, $opts );
if ( count( $reqs ) > 1 ) {
// https://github.com/guzzle/guzzle/issues/349
curl_setopt( $ch, CURLOPT_HEADERFUNCTION,
function ( $ch, $header ) use ( &$req ) {
+ if ( !empty( $req['flags']['relayResponseHeaders'] ) ) {
+ header( $header );
+ }
$length = strlen( $header );
$matches = [];
if ( preg_match( "/^(HTTP\/1\.[01]) (\d{3}) (.*)/", $header, $matches ) ) {
/** @var array[] Lock tracking */
protected $locks = [];
- /** @var integer */
+ /** @var integer ERR_* class constant */
protected $lastError = self::ERR_NONE;
/** @var string */
/** @var bool */
private $dupeTrackScheduled = false;
+ /** @var integer[] Map of (ATTR_* class constant => QOS_* class constant) */
+ protected $attrMap = [];
+
/** Possible values for getLastError() */
const ERR_NONE = 0; // no error
const ERR_NO_RESPONSE = 1; // no response
public function makeKey() {
return $this->makeKeyInternal( $this->keyspace, func_get_args() );
}
+
+ /**
+ * @param integer $flag ATTR_* class constant
+ * @return integer QOS_* class constant
+ * @since 1.28
+ */
+ public function getQoS( $flag ) {
+ return isset( $this->attrMap[$flag] ) ? $this->attrMap[$flag] : self::QOS_UNKNOWN;
+ }
+
+ /**
+ * Merge the flag maps of one or more BagOStuff objects into a "lowest common denominator" map
+ *
+ * @param BagOStuff[] $bags
+ * @return integer[] Resulting flag map (class ATTR_* constant => class QOS_* constant)
+ */
+ protected function mergeFlagMaps( array $bags ) {
+ $map = [];
+ foreach ( $bags as $bag ) {
+ foreach ( $bag->attrMap as $attr => $rank ) {
+ if ( isset( $map[$attr] ) ) {
+ $map[$attr] = min( $map[$attr], $rank );
+ } else {
+ $map[$attr] = $rank;
+ }
+ }
+ }
+
+ return $map;
+ }
}
* @param array $params Parameters for HashBagOStuff
*/
function __construct( BagOStuff $backend, $params = [] ) {
- $this->backend = $backend;
parent::__construct( $params );
+
+ $this->backend = $backend;
+ $this->attrMap = $backend->attrMap;
}
protected function doGet( $key, $flags = 0 ) {
const TTL_PROC_LONG = 30; // loose cache time that can survive slow web requests
const TTL_INDEFINITE = 0;
+
+ // Attribute and QoS constants; higher QOS values with the same prefix rank higher...
+ // Medium attributes constants related to emulation or media type
+ const ATTR_EMULATION = 1;
+ const QOS_EMULATION_SQL = 1;
+ // Generic "unknown" value that is useful for comparisons (e.g. always good enough)
+ const QOS_UNKNOWN = INF;
}
$this->caches[] = ObjectFactory::getObjectFromSpec( $cacheInfo );
}
}
+ $this->mergeFlagMaps( $this->caches );
$this->asyncWrites = (
isset( $params['replication'] ) &&
<?php
/**
- * Interface to key-value storage on HTTP RESTful server, such as RESTBase.
- * Uses URL of the form URL/{KEY} to store/fetch/delete.
- * E.g., when base URL is /v1/sessions/ then the store would do:
- * PUT /v1/sessions/12345758
+ * Interface to key-value storage behind an HTTP server.
+ *
+ * Uses URL of the form "baseURL/{KEY}" to store, fetch, and delete values.
+ *
+ * E.g., when base URL is `/v1/sessions/`, then the store would do:
+ *
+ * `PUT /v1/sessions/12345758`
+ *
* and fetch would do:
- * GET /v1/sessions/12345758
+ *
+ * `GET /v1/sessions/12345758`
+ *
* delete would do:
- * DELETE /v1/sessions/12345758
+ *
+ * `DELETE /v1/sessions/12345758`
*
* Configure with:
+ *
* @code
* $wgObjectCaches['sessions'] = array(
* 'class' => 'RESTBagOStuff',
$this->readStore = ( $params['readFactory'] instanceof BagOStuff )
? $params['readFactory']
: ObjectFactory::getObjectFromSpec( $params['readFactory'] );
+ $this->attrMap = $this->mergeFlagMaps( [ $this->readStore, $this->writeStore ] );
}
public function setDebug( $debug ) {
* @param array $opts Options map:
* - checkKeys: List of "check" keys. The key at $key will be seen as invalid when either
* touchCheckKey() or resetCheckKey() is called on any of these keys.
- * - lowTTL: Consider pre-emptive updates when the current TTL (sec) of the key is less than
- * this. It becomes more likely over time, becoming a certainty once the key is expired.
- * Default: WANObjectCache::LOW_TTL seconds.
+ * Default: [].
+ * - lowTTL: Consider pre-emptive updates when the current TTL (seconds) of the key is less
+ * than this. It becomes more likely over time, becoming certain once the key is expired.
+ * Default: WANObjectCache::LOW_TTL.
* - lockTSE: If the key is tombstoned or expired (by checkKeys) less than this many seconds
* ago, then try to have a single thread handle cache regeneration at any given time.
* Other threads will try to use stale values if possible. If, on miss, the time since
* higher this is set, the higher the worst-case staleness can be.
* Use WANObjectCache::TSE_NONE to disable this logic.
* Default: WANObjectCache::TSE_NONE.
- * - pcTTL: Process cache the value in this PHP instance with this TTL. This avoids
- * network I/O when a key is read several times. This will not cache if the callback
- * returns false however. Note that any purges will not be seen while process cached;
+ * - busyValue: If no value exists and another thread is currently regenerating it, use this
+ * as a fallback value (or a callback to generate such a value). This assures that cache
+ * stampedes cannot happen if the value falls out of cache. This can be used as insurance
+ * against cache regeneration becoming very slow for some reason (greater than the TTL).
+ * Default: null.
+ * - pcTTL: Process cache the value in this PHP instance for this many seconds. This avoids
+ * network I/O when a key is read several times. This will not cache when the callback
+ * returns false, however. Note that any purges will not be seen while process cached;
* since the callback should use slave DBs and they may be lagged or have snapshot
* isolation anyway, this should not typically matter.
* Default: WANObjectCache::TTL_UNCACHEABLE.
* however, as this reduces compatibility (due to serialization).
* Default: null.
* @return mixed Value found or written to the key
+ * @note Callable type hints are not used to avoid class-autoloading
*/
final public function getWithSetCallback( $key, $ttl, $callback, array $opts = [] ) {
$pcTTL = isset( $opts['pcTTL'] ) ? $opts['pcTTL'] : self::TTL_UNCACHEABLE;
* - minTime: Treat values older than this UNIX timestamp as not existing. Default: null.
* @param float &$asOf Cache generation timestamp of returned value [returned]
* @return mixed
+ * @note Callable type hints are not used to avoid class-autoloading
*/
protected function doGetWithSetCallback( $key, $ttl, $callback, array $opts, &$asOf = null ) {
$lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
$lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
$checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
+ $busyValue = isset( $opts['busyValue'] ) ? $opts['busyValue'] : null;
$minTime = isset( $opts['minTime'] ) ? $opts['minTime'] : 0.0;
$versioned = isset( $opts['version'] );
$isTombstone = ( $curTTL !== null && $value === false );
// Assume a key is hot if requested soon after invalidation
$isHot = ( $curTTL !== null && $curTTL <= 0 && abs( $curTTL ) <= $lockTSE );
+ // Use the mutex if there is no value and a busy fallback is given
+ $checkBusy = ( $busyValue !== null && $value === false );
// Decide whether a single thread should handle regenerations.
// This avoids stampedes when $checkKeys are bumped and when preemptive
// renegerations take too long. It also reduces regenerations while $key
// is tombstoned. This balances cache freshness with avoiding DB load.
- $useMutex = ( $isHot || ( $isTombstone && $lockTSE > 0 ) );
+ $useMutex = ( $isHot || ( $isTombstone && $lockTSE > 0 ) || $checkBusy );
$lockAcquired = false;
if ( $useMutex ) {
return $value;
}
+ // Use the busy fallback value if nothing else
+ if ( $busyValue !== null ) {
+ return is_callable( $busyValue ) ? $busyValue() : $busyValue;
+ }
}
}
$asOf = microtime( true );
// When delete() is called, writes are write-holed by the tombstone,
// so use a special INTERIM key to pass the new value around threads.
- if ( $useMutex && $value !== false && $ttl >= 0 ) {
+ if ( ( $isTombstone && $lockTSE > 0 ) && $value !== false && $ttl >= 0 ) {
$tempTTL = max( 1, (int)$lockTSE ); // set() expects seconds
$wrapped = $this->wrap( $value, $tempTTL, $asOf );
$this->cache->set( self::INTERIM_KEY_PREFIX . $key, $wrapped, $tempTTL );
/**
* Get the "last error" registered; clearLastError() should be called manually
- * @return int ERR_* constant for the "last error" registry
+ * @return int ERR_* class constant for the "last error" registry
*/
final public function getLastError() {
if ( $this->lastRelayError ) {
$this->procCache->clear();
}
+ /**
+ * @param integer $flag ATTR_* class constant
+ * @return integer QOS_* class constant
+ * @since 1.28
+ */
+ public function getQoS( $flag ) {
+ return $this->cache->getQoS( $flag );
+ }
+
/**
* Do the actual async bus purge of a key
*
use Hooks;
use Html;
use HtmlArmor;
+use LinkCache;
use Linker;
use MediaWiki\MediaWikiServices;
+use MWNamespace;
use Sanitizer;
use Title;
use TitleFormatter;
/**
* Class that generates HTML <a> links for pages.
*
+ * @see https://www.mediawiki.org/wiki/Manual:LinkRenderer
* @since 1.28
*/
class LinkRenderer {
*/
private $titleFormatter;
+ /**
+ * @var LinkCache
+ */
+ private $linkCache;
+
/**
* Whether to run the legacy Linker hooks
*
/**
* @param TitleFormatter $titleFormatter
+ * @param LinkCache $linkCache
*/
- public function __construct( TitleFormatter $titleFormatter ) {
+ public function __construct( TitleFormatter $titleFormatter, LinkCache $linkCache ) {
$this->titleFormatter = $titleFormatter;
+ $this->linkCache = $linkCache;
}
/**
}
/**
- * If you have already looked up the proper CSS classes using Linker::getLinkColour()
+ * If you have already looked up the proper CSS classes using LinkRenderer::getLinkClasses()
* or some other method, use this to avoid looking it up again.
*
* @param LinkTarget $target
if ( $target->isExternal() ) {
$classes[] = 'extiw';
}
- $colour = Linker::getLinkColour( $target, $this->stubThreshold );
+ $colour = $this->getLinkClasses( $target );
if ( $colour !== '' ) {
$classes[] = $colour;
}
private function getLinkURL( LinkTarget $target, array $query = [] ) {
// TODO: Use a LinkTargetResolver service instead of Title
$title = Title::newFromLinkTarget( $target );
- $proto = $this->expandUrls !== false
- ? $this->expandUrls
- : PROTO_RELATIVE;
if ( $this->forceArticlePath ) {
$realQuery = $query;
$query = [];
} else {
$realQuery = [];
}
- $url = $title->getLinkURL( $query, false, $proto );
+ $url = $title->getLinkURL( $query, false, $this->expandUrls );
if ( $this->forceArticlePath && $realQuery ) {
$url = wfAppendQuery( $url, $realQuery );
return $ret;
}
+ /**
+ * Return the CSS classes of a known link
+ *
+ * @param LinkTarget $target
+ * @return string CSS class
+ */
+ public function getLinkClasses( LinkTarget $target ) {
+ // Make sure the target is in the cache
+ $id = $this->linkCache->addLinkObj( $target );
+ if ( $id == 0 ) {
+ // Doesn't exist
+ return '';
+ }
+
+ if ( $this->linkCache->getGoodLinkFieldObj( $target, 'redirect' ) ) {
+ # Page is a redirect
+ return 'mw-redirect';
+ } elseif ( $this->stubThreshold > 0 && MWNamespace::isContent( $target->getNamespace() )
+ && $this->linkCache->getGoodLinkFieldObj( $target, 'length' ) < $this->stubThreshold
+ ) {
+ # Page is a stub
+ return 'stub';
+ }
+
+ return '';
+ }
}
*/
namespace MediaWiki\Linker;
+use LinkCache;
use TitleFormatter;
use User;
*/
private $titleFormatter;
+ /**
+ * @var LinkCache
+ */
+ private $linkCache;
+
/**
* @param TitleFormatter $titleFormatter
+ * @param LinkCache $linkCache
*/
- public function __construct( TitleFormatter $titleFormatter ) {
+ public function __construct( TitleFormatter $titleFormatter, LinkCache $linkCache ) {
$this->titleFormatter = $titleFormatter;
+ $this->linkCache = $linkCache;
}
/**
* @return LinkRenderer
*/
public function create() {
- return new LinkRenderer( $this->titleFormatter );
+ return new LinkRenderer( $this->titleFormatter, $this->linkCache );
}
/**
* @file
* @ingroup Media
*/
+use MediaWiki\MediaWikiServices;
/**
* Base media handler class
*/
const MAX_ERR_LOG_SIZE = 65535;
- /** @var MediaHandler[] Instance cache with array of MediaHandler */
- protected static $handlers = [];
-
/**
* Get a MediaHandler for a given MIME type from the instance cache
*
* @param string $type
- * @return MediaHandler
+ * @return MediaHandler|bool
*/
static function getHandler( $type ) {
- global $wgMediaHandlers;
- if ( !isset( $wgMediaHandlers[$type] ) ) {
- wfDebug( __METHOD__ . ": no handler found for $type.\n" );
-
- return false;
- }
- $class = $wgMediaHandlers[$type];
- if ( !isset( self::$handlers[$class] ) ) {
- self::$handlers[$class] = new $class;
- if ( !self::$handlers[$class]->isEnabled() ) {
- wfDebug( __METHOD__ . ": $class is not enabled\n" );
- self::$handlers[$class] = false;
- }
- }
-
- return self::$handlers[$class];
- }
-
- /**
- * Resets all static caches
- */
- public static function resetCache() {
- self::$handlers = [];
+ return MediaWikiServices::getInstance()
+ ->getMediaHandlerFactory()->getHandler( $type );
}
/**
--- /dev/null
+<?php
+/**
+ * Media-handling base classes and generic functionality.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Class to construct MediaHandler objects
+ *
+ * @since 1.28
+ */
+class MediaHandlerFactory {
+
+ /**
+ * Default, MediaWiki core media handlers
+ *
+ * @var array
+ */
+ private static $coreHandlers = [
+ 'image/jpeg' => JpegHandler::class,
+ 'image/png' => PNGHandler::class,
+ 'image/gif' => GIFHandler::class,
+ 'image/tiff' => TiffHandler::class,
+ 'image/webp' => WebPHandler::class,
+ 'image/x-ms-bmp' => BmpHandler::class,
+ 'image/x-bmp' => BmpHandler::class,
+ 'image/x-xcf' => XCFHandler::class,
+ 'image/svg+xml' => SvgHandler::class, // official
+ 'image/svg' => SvgHandler::class, // compat
+ 'image/vnd.djvu' => DjVuHandler::class, // official
+ 'image/x.djvu' => DjVuHandler::class, // compat
+ 'image/x-djvu' => DjVuHandler::class, // compat
+ ];
+
+ /**
+ * @var array
+ */
+ private $registry;
+
+ /**
+ * Instance cache of MediaHandler objects by mimetype
+ *
+ * @var MediaHandler[]
+ */
+ private $handlers;
+
+ public function __construct( array $registry ) {
+ $this->registry = $registry + self::$coreHandlers;
+ }
+
+ protected function getHandlerClass( $type ) {
+ if ( isset( $this->registry[$type] ) ) {
+ return $this->registry[$type];
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @param string $type mimetype
+ * @return bool|MediaHandler
+ */
+ public function getHandler( $type ) {
+ if ( isset( $this->handlers[$type] ) ) {
+ return $this->handlers[$type];
+ }
+
+ $class = $this->getHandlerClass( $type );
+ if ( $class !== false ) {
+ /** @var MediaHandler $handler */
+ $handler = new $class;
+ if ( !$handler->isEnabled() ) {
+ wfDebug( __METHOD__ . ": $class is not enabled\n" );
+ $handler = false;
+ }
+ } else {
+ wfDebug( __METHOD__ . ": no handler found for $type.\n" );
+ $handler = false;
+ }
+
+ $this->handlers[$type] = $handler;
+ return $handler;
+ }
+}
}
// Additional densities for responsive images, if specified.
- if ( !empty( $this->responsiveUrls ) ) {
- $attribs['srcset'] = Html::srcSet( $this->responsiveUrls );
+ // If any of these urls is the same as src url, it'll be excluded.
+ $responsiveUrls = array_diff( $this->responsiveUrls, [ $this->url ] );
+ if ( !empty( $responsiveUrls ) ) {
+ $attribs['srcset'] = Html::srcSet( $responsiveUrls );
}
Hooks::run( 'ThumbnailBeforeProduceHTML', [ $this, &$attribs, &$linkAttribs ] );
}
}
- try {
- // Make sure we actually have a DB backend before falling back to CACHE_DB
- MediaWikiServices::getInstance()->getDBLoadBalancer();
- $candidate = CACHE_DB;
- } catch ( ServiceDisabledException $e ) {
+ if ( MediaWikiServices::getInstance()->isServiceDisabled( 'DBLoadBalancer' ) ) {
// The LoadBalancer is disabled, probably because
// MediaWikiServices::disableStorageBackend was called.
$candidate = CACHE_NONE;
+ } else {
+ $candidate = CACHE_DB;
}
return self::getInstance( $candidate );
* @param array $params [optional] Array key 'fallback' for $fallback.
* @param int|string $fallback Fallback cache, e.g. (CACHE_NONE, "hash") (since 1.24)
* @return BagOStuff
- * @deprecated 1.27
+ * @deprecated since 1.27
*/
public static function newAccelerator( $params = [], $fallback = null ) {
if ( $fallback === null ) {
*/
public function __construct( $params ) {
parent::__construct( $params );
+
+ $this->attrMap[self::ATTR_EMULATION] = self::QOS_EMULATION_SQL;
+
if ( isset( $params['servers'] ) ) {
$this->serverInfos = [];
$this->serverTags = [];
$token = $user->getEditToken( $rcid );
$outputPage->preventClickjacking();
+ $outputPage->addModuleStyles( 'mediawiki.page.patrol' );
if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
$outputPage->addModules( 'mediawiki.page.patrol.ajax' );
}
: 'revision-info';
$outputPage = $context->getOutput();
- $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" .
+ $revisionInfo = "<div id=\"mw-{$infomsg}\">" .
$context->msg( $infomsg, $td )
->rawParams( $userlinks )
->params( $revision->getId(), $tddate, $tdtime, $revision->getUserText() )
->rawParams( Linker::revComment( $revision, true, true ) )
->parse() .
- "</div>"
- );
+ "</div>";
$lnk = $current
? $context->msg( 'currentrevisionlink' )->escaped()
$cdel .= ' ';
}
- $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
+ // the outer div is need for styling the revision info and nav in MobileFrontend
+ $outputPage->addSubtitle( "<div class=\"mw-revision\">" . $revisionInfo .
+ "<div id=\"mw-revision-nav\">" . $cdel .
$context->msg( 'revision-nav' )->rawParams(
$prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
- )->escaped() . "</div>" );
+ )->escaped() . "</div></div>" );
}
/**
*
* @since 1.19
* @param ParserOptions $parserOptions ParserOptions to use for the parse operation
- * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
- * get the current revision (default value)
- *
- * @return ParserOutput|bool ParserOutput or false if the revision was not found
+ * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
+ * get the current revision (default value)
+ * @param bool $forceParse Force reindexing, regardless of cache settings
+ * @return bool|ParserOutput ParserOutput or false if the revision was not found
*/
- public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
+ public function getParserOutput( ParserOptions $parserOptions, $oldid = null,
+ $forceParse = false ) {
- $useParserCache = $this->shouldCheckParserCache( $parserOptions, $oldid );
+ $useParserCache =
+ ( !$forceParse ) && $this->shouldCheckParserCache( $parserOptions, $oldid );
wfDebug( __METHOD__ .
': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
if ( $parserOptions->getStubThreshold() ) {
return false;
}
- $title = $this->mTitle;
- wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $title ) {
- // Invalidate the cache in auto-commit mode
- $title->invalidateCache();
- } );
-
+ $this->mTitle->invalidateCache();
// Send purge after above page_touched update was committed
DeferredUpdates::addUpdate(
- new CdnCacheUpdate( $title->getCdnUrls() ),
+ new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
DeferredUpdates::PRESEND
);
}
// Do secondary updates once the main changes have been committed...
- $that = $this;
- $dbw->onTransactionIdle(
- function () use (
- $dbw, &$that, $revision, &$user, $content, $summary, &$flags,
- $changed, $meta, &$status
- ) {
- // Do per-page updates in a transaction
- $dbw->setFlag( DBO_TRX );
- // Update links tables, site stats, etc.
- $that->doEditUpdates(
- $revision,
- $user,
- [
- 'changed' => $changed,
- 'oldcountable' => $meta['oldCountable'],
- 'oldrevision' => $meta['oldRevision']
- ]
- );
- // Trigger post-save hook
- $params = [ &$that, &$user, $content, $summary, $flags & EDIT_MINOR,
- null, null, &$flags, $revision, &$status, $meta['baseRevId'] ];
- ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
- Hooks::run( 'PageContentSaveComplete', $params );
- }
+ DeferredUpdates::addUpdate(
+ new AtomicSectionUpdate(
+ $dbw,
+ __METHOD__,
+ function () use (
+ $revision, &$user, $content, $summary, &$flags,
+ $changed, $meta, &$status
+ ) {
+ // Update links tables, site stats, etc.
+ $this->doEditUpdates(
+ $revision,
+ $user,
+ [
+ 'changed' => $changed,
+ 'oldcountable' => $meta['oldCountable'],
+ 'oldrevision' => $meta['oldRevision']
+ ]
+ );
+ // Trigger post-save hook
+ $params = [ &$this, &$user, $content, $summary, $flags & EDIT_MINOR,
+ null, null, &$flags, $revision, &$status, $meta['baseRevId'] ];
+ ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
+ Hooks::run( 'PageContentSaveComplete', $params );
+ }
+ ),
+ DeferredUpdates::PRESEND
);
return $status;
$status->value['revision'] = $revision;
// Do secondary updates once the main changes have been committed...
- $that = $this;
- $dbw->onTransactionIdle(
- function () use (
- &$that, $dbw, $revision, &$user, $content, $summary, &$flags, $meta, &$status
- ) {
- // Do per-page updates in a transaction
- $dbw->setFlag( DBO_TRX );
- // Update links, etc.
- $that->doEditUpdates( $revision, $user, [ 'created' => true ] );
- // Trigger post-create hook
- $params = [ &$that, &$user, $content, $summary,
- $flags & EDIT_MINOR, null, null, &$flags, $revision ];
- ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $params );
- Hooks::run( 'PageContentInsertComplete', $params );
- // Trigger post-save hook
- $params = array_merge( $params, [ &$status, $meta['baseRevId'] ] );
- ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
- Hooks::run( 'PageContentSaveComplete', $params );
+ DeferredUpdates::addUpdate(
+ new AtomicSectionUpdate(
+ $dbw,
+ __METHOD__,
+ function () use (
+ $revision, &$user, $content, $summary, &$flags, $meta, &$status
+ ) {
+ // Update links, etc.
+ $this->doEditUpdates( $revision, $user, [ 'created' => true ] );
+ // Trigger post-create hook
+ $params = [ &$this, &$user, $content, $summary,
+ $flags & EDIT_MINOR, null, null, &$flags, $revision ];
+ ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $params );
+ Hooks::run( 'PageContentInsertComplete', $params );
+ // Trigger post-save hook
+ $params = array_merge( $params, [ &$status, $meta['baseRevId'] ] );
+ ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
+ Hooks::run( 'PageContentSaveComplete', $params );
- }
+ }
+ ),
+ DeferredUpdates::PRESEND
);
return $status;
}
if ( $this->mPreparedEdit
- && $this->mPreparedEdit->newContent
+ && isset( $this->mPreparedEdit->newContent )
&& $this->mPreparedEdit->newContent->equals( $content )
&& $this->mPreparedEdit->revid == $revid
&& $this->mPreparedEdit->format == $serialFormat
],
__METHOD__
);
+ // Save this so we can pass it to the ArticleDeleteComplete hook.
+ $archivedRevisionCount = $dbw->affectedRows();
// Now that it's safely backed up, delete it
$dbw->delete( 'page', [ 'page_id' => $id ], __METHOD__ );
$this->doDeleteUpdates( $id, $content );
Hooks::run( 'ArticleDeleteComplete',
- [ &$this, &$user, $reason, $id, $content, $logEntry ] );
+ [ &$this, &$user, $reason, $id, $content, $logEntry, $archivedRevisionCount ] );
$status->value = $logid;
// Show log excerpt on 404 pages rather than just a link
$title->touchLinks();
$title->purgeSquid();
$title->deleteTitleProtection();
+
+ if ( $title->getNamespace() == NS_CATEGORY ) {
+ // Load the Category object, which will schedule a job to create
+ // the category table row if necessary. Checking a slave is ok
+ // here, in the worst case it'll run an unnecessary recount job on
+ // a category that probably doesn't have many members.
+ Category::newFromTitle( $title )->getID();
+ }
}
/**
$cat = Category::newFromName( $catName );
Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] );
}
+
+ // Refresh counts on categories that should be empty now, to
+ // trigger possible deletion. Check master for the most
+ // up-to-date cat_pages.
+ if ( count( $deleted ) ) {
+ $rows = $dbw->select(
+ 'category',
+ [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
+ [ 'cat_title' => $deleted, 'cat_pages <= 0' ],
+ $method
+ );
+ foreach ( $rows as $row ) {
+ $cat = Category::newFromRow( $row );
+ $cat->refreshCounts();
+ }
+ }
}
);
}
$linkCache = LinkCache::singleton();
$output = $this->parent->getOutput();
$linkRenderer = $this->parent->getLinkRenderer();
- $threshold = $linkRenderer->getStubThreshold();
$dbr = wfGetDB( DB_SLAVE );
} else {
$id = $linkCache->getGoodLinkID( $pdbk );
if ( $id != 0 ) {
- $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+ $colours[$pdbk] = $linkRenderer->getLinkClasses( $title );
$output->addLink( $title, $id );
$linkcolour_ids[$id] = $pdbk;
} elseif ( $linkCache->isBadLink( $pdbk ) ) {
$pdbk = $title->getPrefixedDBkey();
$linkCache->addGoodLinkObjFromRow( $title, $s );
$output->addLink( $title, $s->page_id );
- $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+ $colours[$pdbk] = $linkRenderer->getLinkClasses( $title );
// add id to the extension todolist
$linkcolour_ids[$s->page_id] = $pdbk;
}
$variantMap = []; // maps $pdbkey_Variant => $keys (of link holders)
$output = $this->parent->getOutput();
$linkCache = LinkCache::singleton();
- $threshold = $this->parent->getOptions()->getStubThreshold();
$titlesToBeConverted = '';
$titlesAttrs = [];
);
$linkcolour_ids = [];
+ $linkRenderer = $this->parent->getLinkRenderer();
// for each found variants, figure out link holders and replace
foreach ( $varRes as $s ) {
$entry['pdbk'] = $varPdbk;
// set pdbk and colour
- $colours[$varPdbk] = Linker::getLinkColour( $variantTitle, $threshold );
+ $colours[$varPdbk] = $linkRenderer->getLinkClasses( $variantTitle );
$linkcolour_ids[$s->page_id] = $pdbk;
}
}
* @param string $text HTML input fragment. This should not contain a
* <body> or <html> tag.
* @return string Corrected HTML output
+ * @throws MWException
*/
public static function tidy( $text ) {
$driver = self::singleton();
return $driver->tidy( $text );
}
- /**
- * Get CSS modules needed if HTML from the current driver is to be displayed.
- *
- * This is just a migration tool to allow some changes expected as part of
- * Tidy replacement (T89331) to be exposed on the client side via user
- * scripts, without actually replacing tidy. See T49673.
- *
- * @return array
- */
- public static function getModuleStyles() {
- $driver = self::singleton();
- if ( $driver && $driver instanceof MediaWiki\Tidy\RaggettBase ) {
- return [ 'mediawiki.raggett' ];
- } else {
- return [];
- }
- }
-
/**
* Check HTML for errors, used if $wgValidateAllHtml = true.
*
* @param string $text
* @param string &$errorStr Return the error string
* @return bool Whether the HTML is valid
+ * @throws MWException
*/
public static function checkErrors( $text, &$errorStr = null ) {
$driver = self::singleton();
}
}
+ /**
+ * @return bool
+ */
public static function isEnabled() {
return self::singleton() !== false;
}
+ /**
+ * @return bool|\MediaWiki\Tidy\TidyDriverBase
+ */
protected static function singleton() {
global $wgUseTidy, $wgTidyInternal, $wgTidyConf, $wgDebugTidy, $wgTidyConfig,
$wgTidyBin, $wgTidyOpts;
} else {
return false;
}
- switch ( $config['driver'] ) {
- case 'RaggettInternalHHVM':
- self::$instance = new MediaWiki\Tidy\RaggettInternalHHVM( $config );
- break;
- case 'RaggettInternalPHP':
- self::$instance = new MediaWiki\Tidy\RaggettInternalPHP( $config );
- break;
- case 'RaggettExternal':
- self::$instance = new MediaWiki\Tidy\RaggettExternal( $config );
- break;
- case 'Html5Depurate':
- self::$instance = new MediaWiki\Tidy\Html5Depurate( $config );
- break;
- case 'Html5Internal':
- self::$instance = new MediaWiki\Tidy\Html5Internal( $config );
- break;
- case 'disabled':
- return false;
- default:
- throw new MWException( "Invalid tidy driver: \"{$config['driver']}\"" );
- }
+ self::$instance = self::factory( $config );
}
return self::$instance;
}
+ /**
+ * Create a new Tidy driver object from configuration.
+ * @see $wgTidyConfig
+ * @param array $config
+ * @return bool|\MediaWiki\Tidy\TidyDriverBase
+ * @throws MWException
+ */
+ public static function factory( array $config ) {
+ switch ( $config['driver'] ) {
+ case 'RaggettInternalHHVM':
+ $instance = new MediaWiki\Tidy\RaggettInternalHHVM( $config );
+ break;
+ case 'RaggettInternalPHP':
+ $instance = new MediaWiki\Tidy\RaggettInternalPHP( $config );
+ break;
+ case 'RaggettExternal':
+ $instance = new MediaWiki\Tidy\RaggettExternal( $config );
+ break;
+ case 'Html5Depurate':
+ $instance = new MediaWiki\Tidy\Html5Depurate( $config );
+ break;
+ case 'Html5Internal':
+ $instance = new MediaWiki\Tidy\Html5Internal( $config );
+ break;
+ case 'disabled':
+ return false;
+ default:
+ throw new MWException( "Invalid tidy driver: \"{$config['driver']}\"" );
+ }
+ return $instance;
+ }
+
/**
* Set the driver to be used. This is for testing.
- * @param TidyDriverBase|false|null $instance
+ * @param MediaWiki\Tidy\TidyDriverBase|false|null $instance
*/
public static function setInstance( $instance ) {
self::$instance = $instance;
protected $mProfiler;
/**
- * @var LinkRenderer
+ * @var \MediaWiki\Linker\LinkRenderer
*/
protected $mLinkRenderer;
[ $this->mHighestExpansionDepth, $this->mOptions->getMaxPPExpandDepth() ]
);
$this->mOutput->setLimitReportData( 'limitreport-expensivefunctioncount',
- [ $this->mExpensiveFunctionCount, $this->mOptions->getExpensiveParserFunctionLimit() ]
+ [ $this->mExpensiveFunctionCount,
+ $this->mOptions->getExpensiveParserFunctionLimit() ]
);
Hooks::run( 'ParserLimitReportPrepare', [ $this, $this->mOutput ] );
- $limitReport = "NewPP limit report\n";
- if ( $wgShowHostnames ) {
- $limitReport .= 'Parsed by ' . wfHostname() . "\n";
- }
- $limitReport .= 'Cached time: ' . $this->mOutput->getCacheTime() . "\n";
- $limitReport .= 'Cache expiry: ' . $this->mOutput->getCacheExpiry() . "\n";
- $limitReport .= 'Dynamic content: ' .
- ( $this->mOutput->hasDynamicContent() ? 'true' : 'false' ) .
- "\n";
-
- foreach ( $this->mOutput->getLimitReportData() as $key => $value ) {
- if ( Hooks::run( 'ParserLimitReportFormat',
- [ $key, &$value, &$limitReport, false, false ]
- ) ) {
- $keyMsg = wfMessage( $key )->inLanguage( 'en' )->useDatabase( false );
- $valueMsg = wfMessage( [ "$key-value-text", "$key-value" ] )
- ->inLanguage( 'en' )->useDatabase( false );
- if ( !$valueMsg->exists() ) {
- $valueMsg = new RawMessage( '$1' );
- }
- if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
- $valueMsg->params( $value );
- $limitReport .= "{$keyMsg->text()}: {$valueMsg->text()}\n";
- }
- }
- }
- // Since we're not really outputting HTML, decode the entities and
- // then re-encode the things that need hiding inside HTML comments.
- $limitReport = htmlspecialchars_decode( $limitReport );
+ $limitReport = '';
Hooks::run( 'ParserLimitReport', [ $this, &$limitReport ] );
+ if ( $limitReport != '' ) {
+ // Sanitize for comment. Note '‐' in the replacement is U+2010,
+ // which looks much like the problematic '-'.
+ $limitReport = str_replace( [ '-', '&' ], [ '‐', '&' ], $limitReport );
+ $text .= "\n<!-- \nNewPP limit report\n$limitReport-->\n";
+ }
- // Sanitize for comment. Note '‐' in the replacement is U+2010,
- // which looks much like the problematic '-'.
- $limitReport = str_replace( [ '-', '&' ], [ '‐', '&' ], $limitReport );
- $text .= "\n<!-- \n$limitReport-->\n";
-
- // Add on template profiling data
+ // Add on template profiling data in human/machine readable way
$dataByFunc = $this->mProfiler->getFunctionStats();
uasort( $dataByFunc, function ( $a, $b ) {
return $a['real'] < $b['real']; // descending order
} );
- $profileReport = "Transclusion expansion time report (%,ms,calls,template)\n";
+ $profileReport = [];
foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
- $profileReport .= sprintf( "%6.2f%% %8.3f %6d - %s\n",
- $item['%real'], $item['real'], $item['calls'],
- htmlspecialchars( $item['name'] ) );
+ $profileReport[] = sprintf( "%6.2f%% %8.3f %6d %s",
+ $item['%real'], $item['real'], $item['calls'], $item['name'] );
}
- $text .= "\n<!-- \n$profileReport-->\n";
+ $this->mOutput->setLimitReportData( 'limitreport-timingprofile', $profileReport );
- if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
+ // Add other cache related metadata
+ if ( $wgShowHostnames ) {
+ $this->mOutput->setLimitReportData( 'cachereport-origin', wfHostname() );
+ }
+ $this->mOutput->setLimitReportData( 'cachereport-timestamp',
+ $this->mOutput->getCacheTime() );
+ $this->mOutput->setLimitReportData( 'cachereport-ttl',
+ $this->mOutput->getCacheExpiry() );
+ $this->mOutput->setLimitReportData( 'cachereport-transientcontent',
+ $this->mOutput->hasDynamicContent() );
+
+ if ( $this->mGeneratedPPNodeCount
+ > $this->mOptions->getMaxGeneratedPPNodeCount() / 10
+ ) {
wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
$this->mTitle->getPrefixedDBkey() );
}
}
/**
- * Get a LinkRenderer instance to make links with
+ * Get a \MediaWiki\Linker\LinkRenderer instance to make links with
*
* @since 1.28
- * @return LinkRenderer
+ * @return \MediaWiki\Linker\LinkRenderer
*/
public function getLinkRenderer() {
if ( !$this->mLinkRenderer ) {
$text = Sanitizer::normalizeCharReferences( $text );
- if ( MWTidy::isEnabled() && $this->mOptions->getTidy() ) {
- $text = MWTidy::tidy( $text );
- $this->mOutput->addModuleStyles( MWTidy::getModuleStyles() );
+ if ( MWTidy::isEnabled() ) {
+ if ( $this->mOptions->getTidy() ) {
+ $text = MWTidy::tidy( $text );
+ }
} else {
# attempt to sanitize at least some nesting problems
# (bug #2702 and quite a few others)
*/
private $mExtensionData = [];
- /**
- * @var array $mLimitReportData Parser limit report data.
- */
+ /** @var array $mLimitReportData Parser limit report data. */
private $mLimitReportData = [];
/**
return $this->mModuleStyles;
}
- /**
- * @deprecated since 1.26 Obsolete
- * @return array
- */
- public function getModuleMessages() {
- wfDeprecated( __METHOD__, '1.26' );
- return [];
- }
-
/** @since 1.23 */
public function getJsConfigVars() {
return $this->mJsConfigVars;
$this->mModuleStyles = array_merge( $this->mModuleStyles, (array)$modules );
}
- /**
- * @deprecated since 1.26 Use addModules() instead
- * @param string|array $modules
- */
- public function addModuleMessages( $modules ) {
- wfDeprecated( __METHOD__, '1.26' );
- }
-
/**
* Add one or more variables to be set in mw.config in JavaScript.
*
/**
* Sets parser limit report data for a key
*
- * The key is used as the prefix for various messages used for formatting:
- * - $key: The label for the field in the limit report
- * - $key-value-text: Message used to format the value in the "NewPP limit
- * report" HTML comment. If missing, uses $key-format.
- * - $key-value-html: Message used to format the value in the preview
- * limit report table. If missing, uses $key-format.
- * - $key-value: Message used to format the value. If missing, uses "$1".
- *
- * Note that all values are interpreted as wikitext, and so should be
- * encoded with htmlspecialchars() as necessary, but should avoid complex
- * HTML for sanity of display in the "NewPP limit report" comment.
+ * If $value consist of a list of two floats, it will be interpreted as
+ * (actual value, maximum allowed value). The presence of a "-" in $key will cause
+ * the first part of the key to be interpreted as a namespace.
*
* @since 1.22
- * @param string $key Message key
- * @param mixed $value Appropriate for Message::params()
+ * @param string $key Data key
+ * @param mixed $value Data value One of (float, string, bool, JSON serializable array)
*/
public function setLimitReportData( $key, $value ) {
- $this->mLimitReportData[$key] = $value;
+ if ( is_array( $value ) ) {
+ if ( array_keys( $value ) === [ 0, 1 ]
+ && is_numeric( $value[0] )
+ && is_numeric( $value[1] )
+ ) {
+ $data = [ 'value' => $value[0], 'limit' => $value[1] ];
+ } else {
+ $data = $value;
+ }
+ } else {
+ $data = $value;
+ }
+
+ if ( strpos( $key, '-' ) ) {
+ list( $ns, $name ) = explode( '-', $key, 2 );
+ $this->mLimitReportData[$ns][$name] = $data;
+ } else {
+ $this->mLimitReportData[$key] = $data;
+ }
}
/**
* Differences from DOM schema:
* * attribute nodes are children
* * "<h>" nodes that aren't at the top are replaced with <possible-h>
+ *
+ * Nodes are stored in a recursive array data structure. A node store is an
+ * array where each element may be either a scalar (representing a text node)
+ * or a "descriptor", which is a two-element array where the first element is
+ * the node name and the second element is the node store for the children.
+ *
+ * Attributes are represented as children that have a node name starting with
+ * "@", and a single text node child.
+ *
+ * @todo: Consider replacing descriptor arrays with objects of a new class.
+ * Benchmark and measure resulting memory impact.
+ *
* @ingroup Parser
*/
// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
public $parser;
const CACHE_PREFIX = 'preprocess-hash';
+ const CACHE_VERSION = 2;
public function __construct( $parser ) {
$this->parser = $parser;
$list = [];
foreach ( $values as $k => $val ) {
- $partNode = new PPNode_Hash_Tree( 'part' );
- $nameNode = new PPNode_Hash_Tree( 'name' );
-
if ( is_int( $k ) ) {
- $nameNode->addChild( new PPNode_Hash_Attr( 'index', $k ) );
- $partNode->addChild( $nameNode );
+ $store = [ [ 'part', [
+ [ 'name', [ [ '@index', [ $k ] ] ] ],
+ [ 'value', [ strval( $val ) ] ],
+ ] ] ];
} else {
- $nameNode->addChild( new PPNode_Hash_Text( $k ) );
- $partNode->addChild( $nameNode );
- $partNode->addChild( new PPNode_Hash_Text( '=' ) );
+ $store = [ [ 'part', [
+ [ 'name', [ strval( $k ) ] ],
+ '=',
+ [ 'value', [ strval( $val ) ] ],
+ ] ] ];
}
- $valueNode = new PPNode_Hash_Tree( 'value' );
- $valueNode->addChild( new PPNode_Hash_Text( $val ) );
- $partNode->addChild( $valueNode );
-
- $list[] = $partNode;
+ $list[] = new PPNode_Hash_Tree( $store, 0 );
}
$node = new PPNode_Hash_Array( $list );
/**
* Preprocess some wikitext and return the document tree.
- * This is the ghost of Parser::replace_variables().
*
* @param string $text The text to parse
* @param int $flags Bitwise combination of:
* change in the DOM tree for a given text, must be passed through the section identifier
* in the section edit link and thus back to extractSections().
*
- * The output of this function is currently only cached in process memory, but a persistent
- * cache may be implemented at a later date which takes further advantage of these strict
- * dependency requirements.
- *
* @throws MWException
* @return PPNode_Hash_Tree
*/
public function preprocessToObj( $text, $flags = 0 ) {
$tree = $this->cacheGetTree( $text, $flags );
if ( $tree !== false ) {
- return unserialize( $tree );
+ $store = json_decode( $tree );
+ if ( is_array( $store ) ) {
+ return new PPNode_Hash_Tree( $store, 0 );
+ }
}
$forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
// Input pointer, starts out pointing to a pseudo-newline before the start
$i = 0;
- // Current accumulator
+ // Current accumulator. See the doc comment for Preprocessor_Hash for the format.
$accum =& $stack->getAccum();
// True to find equals signs in arguments
$findEquals = false;
$startPos = strpos( $text, '<onlyinclude>', $i );
if ( $startPos === false ) {
// Ignored section runs to the end
- $accum->addNodeWithText( 'ignore', substr( $text, $i ) );
+ $accum[] = [ 'ignore', [ substr( $text, $i ) ] ];
break;
}
$tagEndPos = $startPos + strlen( '<onlyinclude>' ); // past-the-end
- $accum->addNodeWithText( 'ignore', substr( $text, $i, $tagEndPos - $i ) );
+ $accum[] = [ 'ignore', [ substr( $text, $i, $tagEndPos - $i ) ] ];
$i = $tagEndPos;
$findOnlyinclude = false;
}
# Output literal section, advance input counter
$literalLength = strcspn( $text, $search, $i );
if ( $literalLength > 0 ) {
- $accum->addLiteral( substr( $text, $i, $literalLength ) );
+ self::addLiteral( $accum, substr( $text, $i, $literalLength ) );
$i += $literalLength;
}
if ( $i >= $lengthText ) {
// Determine element name
if ( !preg_match( $elementsRegex, $text, $matches, 0, $i + 1 ) ) {
// Element name missing or not listed
- $accum->addLiteral( '<' );
+ self::addLiteral( $accum, '<' );
++$i;
continue;
}
if ( $endPos === false ) {
// Unclosed comment in input, runs to end
$inner = substr( $text, $i );
- $accum->addNodeWithText( 'comment', $inner );
+ $accum[] = [ 'comment', [ $inner ] ];
$i = $lengthText;
} else {
// Search backwards for leading whitespace
&& substr( $text, $wsEnd + 1, 1 ) == "\n"
) {
// Remove leading whitespace from the end of the accumulator
- // Sanity check first though
$wsLength = $i - $wsStart;
+ $endIndex = count( $accum ) - 1;
+
+ // Sanity check
if ( $wsLength > 0
- && $accum->lastNode instanceof PPNode_Hash_Text
- && strspn( $accum->lastNode->value, " \t", -$wsLength ) === $wsLength
+ && $endIndex >= 0
+ && is_string( $accum[$endIndex] )
+ && strspn( $accum[$endIndex], " \t", -$wsLength ) === $wsLength
) {
- $accum->lastNode->value = substr( $accum->lastNode->value, 0, -$wsLength );
+ $accum[$endIndex] = substr( $accum[$endIndex], 0, -$wsLength );
}
// Dump all but the last comment to the accumulator
break;
}
$inner = substr( $text, $startPos, $endPos - $startPos );
- $accum->addNodeWithText( 'comment', $inner );
+ $accum[] = [ 'comment', [ $inner ] ];
}
// Do a line-start run next time to look for headings after the comment
}
$i = $endPos + 1;
$inner = substr( $text, $startPos, $endPos - $startPos + 1 );
- $accum->addNodeWithText( 'comment', $inner );
+ $accum[] = [ 'comment', [ $inner ] ];
}
continue;
}
// Infinite backtrack
// Disable tag search to prevent worst-case O(N^2) performance
$noMoreGT = true;
- $accum->addLiteral( '<' );
+ self::addLiteral( $accum, '<' );
++$i;
continue;
}
// Handle ignored tags
if ( in_array( $lowerName, $ignoredTags ) ) {
- $accum->addNodeWithText( 'ignore', substr( $text, $i, $tagEndPos - $i + 1 ) );
+ $accum[] = [ 'ignore', [ substr( $text, $i, $tagEndPos - $i + 1 ) ] ];
$i = $tagEndPos + 1;
continue;
}
} else {
// Don't match the tag, treat opening tag as literal and resume parsing.
$i = $tagEndPos + 1;
- $accum->addLiteral( substr( $text, $tagStartPos, $tagEndPos + 1 - $tagStartPos ) );
+ self::addLiteral( $accum,
+ substr( $text, $tagStartPos, $tagEndPos + 1 - $tagStartPos ) );
// Cache results, otherwise we have O(N^2) performance for input like <foo><foo><foo>...
$noMoreClosingTag[$name] = true;
continue;
}
// <includeonly> and <noinclude> just become <ignore> tags
if ( in_array( $lowerName, $ignoredElements ) ) {
- $accum->addNodeWithText( 'ignore', substr( $text, $tagStartPos, $i - $tagStartPos ) );
+ $accum[] = [ 'ignore', [ substr( $text, $tagStartPos, $i - $tagStartPos ) ] ];
continue;
}
$attr = substr( $text, $attrStart, $attrEnd - $attrStart );
}
- $extNode = new PPNode_Hash_Tree( 'ext' );
- $extNode->addChild( PPNode_Hash_Tree::newWithText( 'name', $name ) );
- $extNode->addChild( PPNode_Hash_Tree::newWithText( 'attr', $attr ) );
+ $children = [
+ [ 'name', [ $name ] ],
+ [ 'attr', [ $attr ] ] ];
if ( $inner !== null ) {
- $extNode->addChild( PPNode_Hash_Tree::newWithText( 'inner', $inner ) );
+ $children[] = [ 'inner', [ $inner ] ];
}
if ( $close !== null ) {
- $extNode->addChild( PPNode_Hash_Tree::newWithText( 'close', $close ) );
+ $children[] = [ 'close', [ $close ] ];
}
- $accum->addNode( $extNode );
+ $accum[] = [ 'ext', $children ];
} elseif ( $found == 'line-start' ) {
// Is this the start of a heading?
// Line break belongs before the heading element in any case
if ( $fakeLineStart ) {
$fakeLineStart = false;
} else {
- $accum->addLiteral( $curChar );
+ self::addLiteral( $accum, $curChar );
$i++;
}
}
if ( $count > 0 ) {
// Normal match, output <h>
- $element = new PPNode_Hash_Tree( 'possible-h' );
- $element->addChild( new PPNode_Hash_Attr( 'level', $count ) );
- $element->addChild( new PPNode_Hash_Attr( 'i', $headingIndex++ ) );
- $element->lastChild->nextSibling = $accum->firstNode;
- $element->lastChild = $accum->lastNode;
+ $element = [ [ 'possible-h',
+ array_merge(
+ [
+ [ '@level', [ $count ] ],
+ [ '@i', [ $headingIndex++ ] ]
+ ],
+ $accum
+ )
+ ] ];
} else {
// Single equals sign on its own line, count=0
$element = $accum;
extract( $stack->getFlags() );
// Append the result to the enclosing accumulator
- if ( $element instanceof PPNode ) {
- $accum->addNode( $element );
- } else {
- $accum->addAccum( $element );
- }
+ array_splice( $accum, count( $accum ), 0, $element );
+
// Note that we do NOT increment the input pointer.
// This is because the closing linebreak could be the opening linebreak of
// another heading. Infinite loops are avoided because the next iteration MUST
extract( $stack->getFlags() );
} else {
# Add literal brace(s)
- $accum->addLiteral( str_repeat( $curChar, $count ) );
+ self::addLiteral( $accum, str_repeat( $curChar, $count ) );
}
$i += $count;
} elseif ( $found == 'close' ) {
if ( $matchingCount <= 0 ) {
# No matching element found in callback array
# Output a literal closing brace and continue
- $accum->addLiteral( str_repeat( $curChar, $count ) );
+ self::addLiteral( $accum, str_repeat( $curChar, $count ) );
$i += $count;
continue;
}
if ( $name === null ) {
// No element, just literal text
$element = $piece->breakSyntax( $matchingCount );
- $element->addLiteral( str_repeat( $rule['end'], $matchingCount ) );
+ self::addLiteral( $element, str_repeat( $rule['end'], $matchingCount ) );
} else {
# Create XML element
- # Note: $parts is already XML, does not need to be encoded further
$parts = $piece->parts;
$titleAccum = $parts[0]->out;
unset( $parts[0] );
- $element = new PPNode_Hash_Tree( $name );
+ $children = [];
# The invocation is at the start of the line if lineStart is set in
# the stack, and all opening brackets are used up.
if ( $maxCount == $matchingCount && !empty( $piece->lineStart ) ) {
- $element->addChild( new PPNode_Hash_Attr( 'lineStart', 1 ) );
+ $children[] = [ '@lineStart', [ 1 ] ];
}
- $titleNode = new PPNode_Hash_Tree( 'title' );
- $titleNode->firstChild = $titleAccum->firstNode;
- $titleNode->lastChild = $titleAccum->lastNode;
- $element->addChild( $titleNode );
+ $titleNode = [ 'title', $titleAccum ];
+ $children[] = $titleNode;
$argIndex = 1;
foreach ( $parts as $part ) {
if ( isset( $part->eqpos ) ) {
- // Find equals
- $lastNode = false;
- for ( $node = $part->out->firstNode; $node; $node = $node->nextSibling ) {
- if ( $node === $part->eqpos ) {
- break;
- }
- $lastNode = $node;
- }
- if ( !$node ) {
- // if ( $cacheable ) { ... }
- throw new MWException( __METHOD__ . ': eqpos not found' );
- }
- if ( $node->name !== 'equals' ) {
- // if ( $cacheable ) { ... }
- throw new MWException( __METHOD__ . ': eqpos is not equals' );
- }
- $equalsNode = $node;
-
- // Construct name node
- $nameNode = new PPNode_Hash_Tree( 'name' );
- if ( $lastNode !== false ) {
- $lastNode->nextSibling = false;
- $nameNode->firstChild = $part->out->firstNode;
- $nameNode->lastChild = $lastNode;
- }
-
- // Construct value node
- $valueNode = new PPNode_Hash_Tree( 'value' );
- if ( $equalsNode->nextSibling !== false ) {
- $valueNode->firstChild = $equalsNode->nextSibling;
- $valueNode->lastChild = $part->out->lastNode;
- }
- $partNode = new PPNode_Hash_Tree( 'part' );
- $partNode->addChild( $nameNode );
- $partNode->addChild( $equalsNode->firstChild );
- $partNode->addChild( $valueNode );
- $element->addChild( $partNode );
+ $equalsNode = $part->out[$part->eqpos];
+ $nameNode = [ 'name', array_slice( $part->out, 0, $part->eqpos ) ];
+ $valueNode = [ 'value', array_slice( $part->out, $part->eqpos + 1 ) ];
+ $partNode = [ 'part', [ $nameNode, $equalsNode, $valueNode ] ];
+ $children[] = $partNode;
} else {
- $partNode = new PPNode_Hash_Tree( 'part' );
- $nameNode = new PPNode_Hash_Tree( 'name' );
- $nameNode->addChild( new PPNode_Hash_Attr( 'index', $argIndex++ ) );
- $valueNode = new PPNode_Hash_Tree( 'value' );
- $valueNode->firstChild = $part->out->firstNode;
- $valueNode->lastChild = $part->out->lastNode;
- $partNode->addChild( $nameNode );
- $partNode->addChild( $valueNode );
- $element->addChild( $partNode );
+ $nameNode = [ 'name', [ [ '@index', [ $argIndex++ ] ] ] ];
+ $valueNode = [ 'value', $part->out ];
+ $partNode = [ 'part', [ $nameNode, $valueNode ] ];
+ $children[] = $partNode;
}
}
+ $element = [ [ $name, $children ] ];
}
# Advance input pointer
$stack->push( $piece );
$accum =& $stack->getAccum();
} else {
- $accum->addLiteral( str_repeat( $piece->open, $piece->count ) );
+ self::addLiteral( $accum, str_repeat( $piece->open, $piece->count ) );
}
}
extract( $stack->getFlags() );
# Add XML element to the enclosing accumulator
- if ( $element instanceof PPNode ) {
- $accum->addNode( $element );
- } else {
- $accum->addAccum( $element );
- }
+ array_splice( $accum, count( $accum ), 0, $element );
} elseif ( $found == 'pipe' ) {
$findEquals = true; // shortcut for getFlags()
$stack->addPart();
++$i;
} elseif ( $found == 'equals' ) {
$findEquals = false; // shortcut for getFlags()
- $accum->addNodeWithText( 'equals', '=' );
- $stack->getCurrentPart()->eqpos = $accum->lastNode;
+ $accum[] = [ 'equals', [ '=' ] ];
+ $stack->getCurrentPart()->eqpos = count( $accum ) - 1;
++$i;
}
}
# Output any remaining unclosed brackets
foreach ( $stack->stack as $piece ) {
- $stack->rootAccum->addAccum( $piece->breakSyntax() );
+ array_splice( $stack->rootAccum, count( $stack->rootAccum ), 0, $piece->breakSyntax() );
}
# Enable top-level headings
- for ( $node = $stack->rootAccum->firstNode; $node; $node = $node->nextSibling ) {
- if ( isset( $node->name ) && $node->name === 'possible-h' ) {
- $node->name = 'h';
+ foreach ( $stack->rootAccum as &$node ) {
+ if ( is_array( $node ) && $node[PPNode_Hash_Tree::NAME] === 'possible-h' ) {
+ $node[PPNode_Hash_Tree::NAME] = 'h';
}
}
- $rootNode = new PPNode_Hash_Tree( 'root' );
- $rootNode->firstChild = $stack->rootAccum->firstNode;
- $rootNode->lastChild = $stack->rootAccum->lastNode;
+ $rootStore = [ [ 'root', $stack->rootAccum ] ];
+ $rootNode = new PPNode_Hash_Tree( $rootStore, 0 );
// Cache
- $this->cacheSetTree( $text, $flags, serialize( $rootNode ) );
+ $tree = json_encode( $rootStore, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE );
+ if ( $tree !== false ) {
+ $this->cacheSetTree( $text, $flags, $tree );
+ }
return $rootNode;
}
+
+ private static function addLiteral( array &$accum, $text ) {
+ $n = count( $accum );
+ if ( $n && is_string( $accum[$n - 1] ) ) {
+ $accum[$n - 1] .= $text;
+ } else {
+ $accum[] = $text;
+ }
+ }
}
/**
public function __construct() {
$this->elementClass = 'PPDStackElement_Hash';
parent::__construct();
- $this->rootAccum = new PPDAccum_Hash;
+ $this->rootAccum = [];
}
}
* Get the accumulator that would result if the close is not found.
*
* @param int|bool $openingCount
- * @return PPDAccum_Hash
+ * @return array
*/
public function breakSyntax( $openingCount = false ) {
if ( $this->open == "\n" ) {
if ( $openingCount === false ) {
$openingCount = $this->count;
}
- $accum = new PPDAccum_Hash;
- $accum->addLiteral( str_repeat( $this->open, $openingCount ) );
+ $accum = [ str_repeat( $this->open, $openingCount ) ];
+ $lastIndex = 0;
$first = true;
foreach ( $this->parts as $part ) {
if ( $first ) {
$first = false;
+ } elseif ( is_string( $accum[$lastIndex] ) ) {
+ $accum[$lastIndex] .= '|';
} else {
- $accum->addLiteral( '|' );
+ $accum[++$lastIndex] = '|';
+ }
+ foreach ( $part->out as $node ) {
+ if ( is_string( $node ) && is_string( $accum[$lastIndex] ) ) {
+ $accum[$lastIndex] .= $node;
+ } else {
+ $accum[++$lastIndex] = $node;
+ }
}
- $accum->addAccum( $part->out );
}
}
return $accum;
// @codingStandardsIgnoreEnd
public function __construct( $out = '' ) {
- $accum = new PPDAccum_Hash;
if ( $out !== '' ) {
- $accum->addLiteral( $out );
- }
- parent::__construct( $accum );
- }
-}
-
-/**
- * @ingroup Parser
- */
-// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
-class PPDAccum_Hash {
- // @codingStandardsIgnoreEnd
-
- public $firstNode, $lastNode;
-
- public function __construct() {
- $this->firstNode = $this->lastNode = false;
- }
-
- /**
- * Append a string literal
- * @param string $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 ) {
- $this->lastNode->value .= $s;
- } else {
- $this->lastNode->nextSibling = new PPNode_Hash_Text( $s );
- $this->lastNode = $this->lastNode->nextSibling;
- }
- }
-
- /**
- * Append a PPNode
- * @param PPNode $node
- */
- public function addNode( PPNode $node ) {
- if ( $this->lastNode === false ) {
- $this->firstNode = $this->lastNode = $node;
- } else {
- $this->lastNode->nextSibling = $node;
- $this->lastNode = $node;
- }
- }
-
- /**
- * Append a tree node with text contents
- * @param string $name
- * @param string $value
- */
- public function addNodeWithText( $name, $value ) {
- $node = PPNode_Hash_Tree::newWithText( $name, $value );
- $this->addNode( $node );
- }
-
- /**
- * Append a PPDAccum_Hash
- * Takes over ownership of the nodes in the source argument. These nodes may
- * subsequently be modified, especially nextSibling.
- * @param PPDAccum_Hash $accum
- */
- public function addAccum( $accum ) {
- if ( $accum->lastNode === false ) {
- // nothing to add
- } elseif ( $this->lastNode === false ) {
- $this->firstNode = $accum->firstNode;
- $this->lastNode = $accum->lastNode;
+ $accum = [ $out ];
} else {
- $this->lastNode->nextSibling = $accum->firstNode;
- $this->lastNode = $accum->lastNode;
+ $accum = [];
}
+ parent::__construct( $accum );
}
}
}
$newIterator = false;
+ $contextName = false;
+ $contextChildren = false;
if ( $contextNode === false ) {
// nothing to do
} elseif ( is_string( $contextNode ) ) {
$out .= $contextNode;
- } elseif ( is_array( $contextNode ) || $contextNode instanceof PPNode_Hash_Array ) {
+ } elseif ( $contextNode instanceof PPNode_Hash_Array ) {
$newIterator = $contextNode;
} elseif ( $contextNode instanceof PPNode_Hash_Attr ) {
// No output
} elseif ( $contextNode instanceof PPNode_Hash_Text ) {
$out .= $contextNode->value;
} elseif ( $contextNode instanceof PPNode_Hash_Tree ) {
- if ( $contextNode->name == 'template' ) {
- # Double-brace expansion
- $bits = $contextNode->splitTemplate();
- if ( $flags & PPFrame::NO_TEMPLATES ) {
- $newIterator = $this->virtualBracketedImplode(
- '{{', '|', '}}',
- $bits['title'],
- $bits['parts']
- );
- } else {
- $ret = $this->parser->braceSubstitution( $bits, $this );
- if ( isset( $ret['object'] ) ) {
- $newIterator = $ret['object'];
- } else {
- $out .= $ret['text'];
- }
- }
- } elseif ( $contextNode->name == 'tplarg' ) {
- # Triple-brace expansion
- $bits = $contextNode->splitTemplate();
- if ( $flags & PPFrame::NO_ARGS ) {
- $newIterator = $this->virtualBracketedImplode(
- '{{{', '|', '}}}',
- $bits['title'],
- $bits['parts']
- );
- } else {
- $ret = $this->parser->argSubstitution( $bits, $this );
- if ( isset( $ret['object'] ) ) {
- $newIterator = $ret['object'];
- } else {
- $out .= $ret['text'];
- }
- }
- } elseif ( $contextNode->name == 'comment' ) {
- # HTML-style comment
- # Remove it in HTML, pre+remove and STRIP_COMMENTS modes
- # Not in RECOVER_COMMENTS mode (msgnw) though.
- if ( ( $this->parser->ot['html']
- || ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
- || ( $flags & PPFrame::STRIP_COMMENTS )
- ) && !( $flags & PPFrame::RECOVER_COMMENTS )
- ) {
- $out .= '';
- } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
- # Add a strip marker in PST mode so that pstPass2() can
- # run some old-fashioned regexes on the result.
- # Not in RECOVER_COMMENTS mode (extractSections) though.
- $out .= $this->parser->insertStripItem( $contextNode->firstChild->value );
+ $contextName = $contextNode->name;
+ $contextChildren = $contextNode->getRawChildren();
+ } elseif ( is_array( $contextNode ) ) {
+ // Node descriptor array
+ if ( count( $contextNode ) !== 2 ) {
+ throw new MWException( __METHOD__.
+ ': found an array where a node descriptor should be' );
+ }
+ list( $contextName, $contextChildren ) = $contextNode;
+ } else {
+ throw new MWException( __METHOD__ . ': Invalid parameter type' );
+ }
+
+ // Handle node descriptor array or tree object
+ if ( $contextName === false ) {
+ // Not a node, already handled above
+ } elseif ( $contextName[0] === '@' ) {
+ // Attribute: no output
+ } elseif ( $contextName === 'template' ) {
+ # Double-brace expansion
+ $bits = PPNode_Hash_Tree::splitRawTemplate( $contextChildren );
+ if ( $flags & PPFrame::NO_TEMPLATES ) {
+ $newIterator = $this->virtualBracketedImplode(
+ '{{', '|', '}}',
+ $bits['title'],
+ $bits['parts']
+ );
+ } else {
+ $ret = $this->parser->braceSubstitution( $bits, $this );
+ if ( isset( $ret['object'] ) ) {
+ $newIterator = $ret['object'];
} else {
- # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
- $out .= $contextNode->firstChild->value;
+ $out .= $ret['text'];
}
- } elseif ( $contextNode->name == 'ignore' ) {
- # Output suppression used by <includeonly> etc.
- # OT_WIKI will only respect <ignore> in substed templates.
- # The other output types respect it unless NO_IGNORE is set.
- # extractSections() sets NO_IGNORE and so never respects it.
- if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
- || ( $flags & PPFrame::NO_IGNORE )
- ) {
- $out .= $contextNode->firstChild->value;
+ }
+ } elseif ( $contextName === 'tplarg' ) {
+ # Triple-brace expansion
+ $bits = PPNode_Hash_Tree::splitRawTemplate( $contextChildren );
+ if ( $flags & PPFrame::NO_ARGS ) {
+ $newIterator = $this->virtualBracketedImplode(
+ '{{{', '|', '}}}',
+ $bits['title'],
+ $bits['parts']
+ );
+ } else {
+ $ret = $this->parser->argSubstitution( $bits, $this );
+ if ( isset( $ret['object'] ) ) {
+ $newIterator = $ret['object'];
} else {
- // $out .= '';
+ $out .= $ret['text'];
}
- } elseif ( $contextNode->name == 'ext' ) {
- # Extension tag
- $bits = $contextNode->splitExt() + [ 'attr' => null, 'inner' => null, 'close' => null ];
- if ( $flags & PPFrame::NO_TAGS ) {
- $s = '<' . $bits['name']->firstChild->value;
- if ( $bits['attr'] ) {
- $s .= $bits['attr']->firstChild->value;
- }
- if ( $bits['inner'] ) {
- $s .= '>' . $bits['inner']->firstChild->value;
- if ( $bits['close'] ) {
- $s .= $bits['close']->firstChild->value;
- }
- } else {
- $s .= '/>';
- }
- $out .= $s;
- } else {
- $out .= $this->parser->extensionSubstitution( $bits, $this );
+ }
+ } elseif ( $contextName === 'comment' ) {
+ # HTML-style comment
+ # Remove it in HTML, pre+remove and STRIP_COMMENTS modes
+ # Not in RECOVER_COMMENTS mode (msgnw) though.
+ if ( ( $this->parser->ot['html']
+ || ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
+ || ( $flags & PPFrame::STRIP_COMMENTS )
+ ) && !( $flags & PPFrame::RECOVER_COMMENTS )
+ ) {
+ $out .= '';
+ } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
+ # Add a strip marker in PST mode so that pstPass2() can
+ # run some old-fashioned regexes on the result.
+ # Not in RECOVER_COMMENTS mode (extractSections) though.
+ $out .= $this->parser->insertStripItem( $contextChildren[0] );
+ } else {
+ # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
+ $out .= $contextChildren[0];
+ }
+ } elseif ( $contextName === 'ignore' ) {
+ # Output suppression used by <includeonly> etc.
+ # OT_WIKI will only respect <ignore> in substed templates.
+ # The other output types respect it unless NO_IGNORE is set.
+ # extractSections() sets NO_IGNORE and so never respects it.
+ if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
+ || ( $flags & PPFrame::NO_IGNORE )
+ ) {
+ $out .= $contextChildren[0];
+ } else {
+ // $out .= '';
+ }
+ } elseif ( $contextName === 'ext' ) {
+ # Extension tag
+ $bits = PPNode_Hash_Tree::splitRawExt( $contextChildren ) +
+ [ 'attr' => null, 'inner' => null, 'close' => null ];
+ if ( $flags & PPFrame::NO_TAGS ) {
+ $s = '<' . $bits['name']->getFirstChild()->value;
+ if ( $bits['attr'] ) {
+ $s .= $bits['attr']->getFirstChild()->value;
}
- } elseif ( $contextNode->name == 'h' ) {
- # Heading
- if ( $this->parser->ot['html'] ) {
- # Expand immediately and insert heading index marker
- $s = '';
- for ( $node = $contextNode->firstChild; $node; $node = $node->nextSibling ) {
- $s .= $this->expand( $node, $flags );
+ if ( $bits['inner'] ) {
+ $s .= '>' . $bits['inner']->getFirstChild()->value;
+ if ( $bits['close'] ) {
+ $s .= $bits['close']->getFirstChild()->value;
}
-
- $bits = $contextNode->splitHeading();
- $titleText = $this->title->getPrefixedDBkey();
- $this->parser->mHeadings[] = [ $titleText, $bits['i'] ];
- $serial = count( $this->parser->mHeadings ) - 1;
- $marker = Parser::MARKER_PREFIX . "-h-$serial-" . Parser::MARKER_SUFFIX;
- $s = substr( $s, 0, $bits['level'] ) . $marker . substr( $s, $bits['level'] );
- $this->parser->mStripState->addGeneral( $marker, '' );
- $out .= $s;
} else {
- # Expand in virtual stack
- $newIterator = $contextNode->getChildren();
+ $s .= '/>';
}
+ $out .= $s;
+ } else {
+ $out .= $this->parser->extensionSubstitution( $bits, $this );
+ }
+ } elseif ( $contextName === 'h' ) {
+ # Heading
+ if ( $this->parser->ot['html'] ) {
+ # Expand immediately and insert heading index marker
+ $s = $this->expand( $contextChildren, $flags );
+ $bits = PPNode_Hash_Tree::splitRawHeading( $contextChildren );
+ $titleText = $this->title->getPrefixedDBkey();
+ $this->parser->mHeadings[] = [ $titleText, $bits['i'] ];
+ $serial = count( $this->parser->mHeadings ) - 1;
+ $marker = Parser::MARKER_PREFIX . "-h-$serial-" . Parser::MARKER_SUFFIX;
+ $s = substr( $s, 0, $bits['level'] ) . $marker . substr( $s, $bits['level'] );
+ $this->parser->mStripState->addGeneral( $marker, '' );
+ $out .= $s;
} else {
- # Generic recursive expansion
- $newIterator = $contextNode->getChildren();
+ # Expand in virtual stack
+ $newIterator = $contextChildren;
}
} else {
- throw new MWException( __METHOD__ . ': Invalid parameter type' );
+ # Generic recursive expansion
+ $newIterator = $contextChildren;
}
if ( $newIterator !== false ) {
class PPNode_Hash_Tree implements PPNode {
// @codingStandardsIgnoreEnd
- public $name, $firstChild, $lastChild, $nextSibling;
+ public $name;
+
+ /**
+ * The store array for children of this node. It is "raw" in the sense that
+ * nodes are two-element arrays ("descriptors") rather than PPNode_Hash_*
+ * objects.
+ */
+ private $rawChildren;
+
+ /**
+ * The store array for the siblings of this node, including this node itself.
+ */
+ private $store;
+
+ /**
+ * The index into $this->store which contains the descriptor of this node.
+ */
+ private $index;
+
+ /**
+ * The offset of the name within descriptors, used in some places for
+ * readability.
+ */
+ const NAME = 0;
+
+ /**
+ * The offset of the child list within descriptors, used in some places for
+ * readability.
+ */
+ const CHILDREN = 1;
+
+ /**
+ * Construct an object using the data from $store[$index]. The rest of the
+ * store array can be accessed via getNextSibling().
+ *
+ * @param array $store
+ * @param integer $index
+ */
+ public function __construct( array $store, $index ) {
+ $this->store = $store;
+ $this->index = $index;
+ list( $this->name, $this->rawChildren ) = $this->store[$index];
+ }
+
+ /**
+ * Construct an appropriate PPNode_Hash_* object with a class that depends
+ * on what is at the relevant store index.
+ *
+ * @param array $store
+ * @param integer $index
+ * @return PPNode_Hash_Tree|PPNode_Hash_Attr|PPNode_Hash_Text
+ */
+ public static function factory( array $store, $index ) {
+ if ( !isset( $store[$index] ) ) {
+ return false;
+ }
- public function __construct( $name ) {
- $this->name = $name;
- $this->firstChild = $this->lastChild = $this->nextSibling = false;
+ $descriptor = $store[$index];
+ if ( is_string( $descriptor ) ) {
+ $class = 'PPNode_Hash_Text';
+ } elseif ( is_array( $descriptor ) ) {
+ if ( $descriptor[self::NAME][0] === '@' ) {
+ $class = 'PPNode_Hash_Attr';
+ } else {
+ $class = 'PPNode_Hash_Tree';
+ }
+ } else {
+ throw new MWException( __METHOD__.': invalid node descriptor' );
+ }
+ return new $class( $store, $index );
}
+ /**
+ * Convert a node to XML, for debugging
+ */
public function __toString() {
$inner = '';
$attribs = '';
- for ( $node = $this->firstChild; $node; $node = $node->nextSibling ) {
+ for ( $node = $this->getFirstChild(); $node; $node = $node->getNextSibling() ) {
if ( $node instanceof PPNode_Hash_Attr ) {
$attribs .= ' ' . $node->name . '="' . htmlspecialchars( $node->value ) . '"';
} else {
}
}
- /**
- * @param string $name
- * @param string $text
- * @return PPNode_Hash_Tree
- */
- public static function newWithText( $name, $text ) {
- $obj = new self( $name );
- $obj->addChild( new PPNode_Hash_Text( $text ) );
- return $obj;
- }
-
- public function addChild( $node ) {
- if ( $this->lastChild === false ) {
- $this->firstChild = $this->lastChild = $node;
- } else {
- $this->lastChild->nextSibling = $node;
- $this->lastChild = $node;
- }
- }
-
/**
* @return PPNode_Hash_Array
*/
public function getChildren() {
$children = [];
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- $children[] = $child;
+ foreach ( $this->rawChildren as $i => $child ) {
+ $children[] = self::factory( $this->rawChildren, $i );
}
return new PPNode_Hash_Array( $children );
}
+ /**
+ * Get the first child, or false if there is none. Note that this will
+ * return a temporary proxy object: different instances will be returned
+ * if this is called more than once on the same node.
+ *
+ * @return PPNode_Hash_Tree|PPNode_Hash_Attr|PPNode_Hash_Text|boolean
+ */
public function getFirstChild() {
- return $this->firstChild;
+ if ( !isset( $this->rawChildren[0] ) ) {
+ return false;
+ } else {
+ return self::factory( $this->rawChildren, 0 );
+ }
}
+ /**
+ * Get the next sibling, or false if there is none. Note that this will
+ * return a temporary proxy object: different instances will be returned
+ * if this is called more than once on the same node.
+ *
+ * @return PPNode_Hash_Tree|PPNode_Hash_Attr|PPNode_Hash_Text|boolean
+ */
public function getNextSibling() {
- return $this->nextSibling;
+ return self::factory( $this->store, $this->index + 1 );
}
+ /**
+ * Get an array of the children with a given node name
+ *
+ * @param string $name
+ * @return PPNode_Hash_Array
+ */
public function getChildrenOfType( $name ) {
$children = [];
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( isset( $child->name ) && $child->name === $name ) {
- $children[] = $child;
+ foreach ( $this->rawChildren as $i => $child ) {
+ if ( is_array( $child ) && $child[self::NAME] === $name ) {
+ $children[] = self::factory( $this->rawChildren, $i );
}
}
return new PPNode_Hash_Array( $children );
}
+ /**
+ * Get the raw child array. For internal use.
+ * @return array
+ */
+ public function getRawChildren() {
+ return $this->rawChildren;
+ }
+
/**
* @return bool
*/
* @return array
*/
public function splitArg() {
+ return self::splitRawArg( $this->rawChildren );
+ }
+
+ /**
+ * Like splitArg() but for a raw child array. For internal use only.
+ */
+ public static function splitRawArg( array $children ) {
$bits = [];
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( !isset( $child->name ) ) {
+ foreach ( $children as $i => $child ) {
+ if ( !is_array( $child ) ) {
continue;
}
- if ( $child->name === 'name' ) {
- $bits['name'] = $child;
- if ( $child->firstChild instanceof PPNode_Hash_Attr
- && $child->firstChild->name === 'index'
+ if ( $child[self::NAME] === 'name' ) {
+ $bits['name'] = new self( $children, $i );
+ if ( isset( $child[self::CHILDREN][0][self::NAME] )
+ && $child[self::CHILDREN][0][self::NAME] === '@index'
) {
- $bits['index'] = $child->firstChild->value;
+ $bits['index'] = $child[self::CHILDREN][0][self::CHILDREN][0];
}
- } elseif ( $child->name === 'value' ) {
- $bits['value'] = $child;
+ } elseif ( $child[self::NAME] === 'value' ) {
+ $bits['value'] = new self( $children, $i );
}
}
* @return array
*/
public function splitExt() {
+ return self::splitRawExt( $this->rawChildren );
+ }
+
+ /**
+ * Like splitExt() but for a raw child array. For internal use only.
+ */
+ public static function splitRawExt( array $children ) {
$bits = [];
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( !isset( $child->name ) ) {
+ foreach ( $children as $i => $child ) {
+ if ( !is_array( $child ) ) {
continue;
}
- if ( $child->name == 'name' ) {
- $bits['name'] = $child;
- } elseif ( $child->name == 'attr' ) {
- $bits['attr'] = $child;
- } elseif ( $child->name == 'inner' ) {
- $bits['inner'] = $child;
- } elseif ( $child->name == 'close' ) {
- $bits['close'] = $child;
+ switch ( $child[self::NAME] ) {
+ case 'name':
+ $bits['name'] = new self( $children, $i );
+ break;
+ case 'attr':
+ $bits['attr'] = new self( $children, $i );
+ break;
+ case 'inner':
+ $bits['inner'] = new self( $children, $i );
+ break;
+ case 'close':
+ $bits['close'] = new self( $children, $i );
+ break;
}
}
if ( !isset( $bits['name'] ) ) {
if ( $this->name !== 'h' ) {
throw new MWException( 'Invalid h node passed to ' . __METHOD__ );
}
+ return self::splitRawHeading( $this->rawChildren );
+ }
+
+ /**
+ * Like splitHeading() but for a raw child array. For internal use only.
+ */
+ public static function splitRawHeading( array $children ) {
$bits = [];
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( !isset( $child->name ) ) {
+ foreach ( $children as $i => $child ) {
+ if ( !is_array( $child ) ) {
continue;
}
- if ( $child->name == 'i' ) {
- $bits['i'] = $child->value;
- } elseif ( $child->name == 'level' ) {
- $bits['level'] = $child->value;
+ if ( $child[self::NAME] === '@i' ) {
+ $bits['i'] = $child[self::CHILDREN][0];
+ } elseif ( $child[self::NAME] === '@level' ) {
+ $bits['level'] = $child[self::CHILDREN][0];
}
}
if ( !isset( $bits['i'] ) ) {
* @return array
*/
public function splitTemplate() {
+ return self::splitRawTemplate( $this->rawChildren );
+ }
+
+ /**
+ * Like splitTemplate() but for a raw child array. For internal use only.
+ */
+ public static function splitRawTemplate( array $children ) {
$parts = [];
$bits = [ 'lineStart' => '' ];
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( !isset( $child->name ) ) {
+ foreach ( $children as $i => $child ) {
+ if ( !is_array( $child ) ) {
continue;
}
- if ( $child->name == 'title' ) {
- $bits['title'] = $child;
- }
- if ( $child->name == 'part' ) {
- $parts[] = $child;
- }
- if ( $child->name == 'lineStart' ) {
+ switch ( $child[self::NAME] ) {
+ case 'title':
+ $bits['title'] = new self( $children, $i );
+ break;
+ case 'part':
+ $parts[] = new self( $children, $i );
+ break;
+ case '@lineStart':
$bits['lineStart'] = '1';
+ break;
}
}
if ( !isset( $bits['title'] ) ) {
class PPNode_Hash_Text implements PPNode {
// @codingStandardsIgnoreEnd
- public $value, $nextSibling;
+ public $value;
+ private $store, $index;
- public function __construct( $value ) {
- if ( is_object( $value ) ) {
+ /**
+ * Construct an object using the data from $store[$index]. The rest of the
+ * store array can be accessed via getNextSibling().
+ *
+ * @param array $store
+ * @param integer $index
+ */
+ public function __construct( array $store, $index ) {
+ $this->value = $store[$index];
+ if ( !is_scalar( $this->value ) ) {
throw new MWException( __CLASS__ . ' given object instead of string' );
}
- $this->value = $value;
+ $this->store = $store;
+ $this->index = $index;
}
public function __toString() {
}
public function getNextSibling() {
- return $this->nextSibling;
+ return PPNode_Hash_Tree::factory( $this->store, $this->index + 1 );
}
public function getChildren() {
class PPNode_Hash_Array implements PPNode {
// @codingStandardsIgnoreEnd
- public $value, $nextSibling;
+ public $value;
public function __construct( $value ) {
$this->value = $value;
}
public function getNextSibling() {
- return $this->nextSibling;
+ return false;
}
public function getChildren() {
class PPNode_Hash_Attr implements PPNode {
// @codingStandardsIgnoreEnd
- public $name, $value, $nextSibling;
+ public $name, $value;
+ private $store, $index;
- public function __construct( $name, $value ) {
- $this->name = $name;
- $this->value = $value;
+ /**
+ * Construct an object using the data from $store[$index]. The rest of the
+ * store array can be accessed via getNextSibling().
+ *
+ * @param array $store
+ * @param integer $index
+ */
+ public function __construct( array $store, $index ) {
+ $descriptor = $store[$index];
+ if ( $descriptor[PPNode_Hash_Tree::NAME][0] !== '@' ) {
+ throw new MWException( __METHOD__.': invalid name in attribute descriptor' );
+ }
+ $this->name = substr( $descriptor[PPNode_Hash_Tree::NAME], 1 );
+ $this->value = $descriptor[PPNode_Hash_Tree::CHILDREN][0];
+ $this->store = $store;
+ $this->index = $index;
}
public function __toString() {
}
public function getNextSibling() {
- return $this->nextSibling;
+ return PPNode_Hash_Tree::factory( $this->store, $this->index + 1 );
}
public function getChildren() {
* Class for handling function-scope profiling
*
* @since 1.22
- * @deprecated 1.25 No-op now
+ * @deprecated since 1.25 No-op now
*/
class ProfileSection {
/**
/**
* Begin profiling of a function
* @param string $functionname Name of the function we will profile
- * @deprecated 1.25
+ * @deprecated since 1.25
*/
function wfProfileIn( $functionname ) {
}
/**
* Stop profiling of a function
* @param string $functionname Name of the function we have profiled
- * @deprecated 1.25
+ * @deprecated since 1.25
*/
function wfProfileOut( $functionname = 'missing' ) {
}
public function close() {
}
- public function getCurrentSection() {
- return '';
- }
-
public function logData() {
}
protected $collateOnly = true;
/** @var array Cache of a standard broken collation entry */
protected $errorEntry;
- /** @var callable Cache of a profile out callback */
- protected $profileOutCallback;
/**
* @param array $params
public function __construct( array $params = [] ) {
$this->errorEntry = $this->getErrorEntry();
$this->collateOnly = empty( $params['trace'] );
- $this->profileOutCallback = function ( $profiler, $section ) {
- $profiler->profileOutInternal( $section );
- };
}
/**
protected $dbLockThreshold = 3.0;
/** @var float Seconds */
protected $eventThreshold = .25;
+ /** @var bool */
+ protected $silenced = false;
/** @var array transaction ID => (write start time, list of DBs involved) */
protected $dbTrxHoldingLocks = [];
$this->logger = $logger;
}
+ /**
+ * @param bool $value
+ * @since 1.28
+ */
+ public function setSilenced( $value ) {
+ $this->silenced = $value;
+ }
+
/**
* Set performance expectations
*
* @param string|float|int $actual [optional]
*/
protected function reportExpectationViolated( $expect, $query, $actual = null ) {
+ if ( $this->silenced ) {
+ return;
+ }
+
$n = $this->expect[$expect];
$by = $this->expectBy[$expect];
$actual = ( $actual !== null ) ? " (actual: $actual)" : "";
'MessagesDirs',
'type',
'config',
+ 'config_prefix',
'ParserTestFiles',
'AutoloadClasses',
'manifest_version',
* @return array
*/
public function extractInfo( $path, array $info, $version ) {
- $this->extractConfig( $info );
- $this->extractHooks( $info );
$dir = dirname( $path );
+ if ( $version === 2 ) {
+ $this->extractConfig2( $info, $dir );
+ } else {
+ // $version === 1
+ $this->extractConfig1( $info );
+ }
+ $this->extractHooks( $info );
$this->extractExtensionMessagesFiles( $dir, $info );
$this->extractMessagesDirs( $dir, $info );
$this->extractNamespaces( $info );
foreach ( $info['namespaces'] as $ns ) {
$id = $ns['id'];
$this->defines[$ns['constant']] = $id;
- $this->attributes['ExtensionNamespaces'][$id] = $ns['name'];
+ if ( !( isset( $ns['conditional'] ) && $ns['conditional'] ) ) {
+ // If it is not conditional, register it
+ $this->attributes['ExtensionNamespaces'][$id] = $ns['name'];
+ }
if ( isset( $ns['gender'] ) ) {
$this->globals['wgExtraGenderNamespaces'][$id] = $ns['gender'];
}
}
/**
- * Set configuration settings
+ * Set configuration settings for manifest_version == 1
* @todo In the future, this should be done via Config interfaces
*
* @param array $info
*/
- protected function extractConfig( array $info ) {
+ protected function extractConfig1( array $info ) {
if ( isset( $info['config'] ) ) {
if ( isset( $info['config']['_prefix'] ) ) {
$prefix = $info['config']['_prefix'];
}
}
+ /**
+ * Set configuration settings for manifest_version == 2
+ * @todo In the future, this should be done via Config interfaces
+ *
+ * @param array $info
+ * @param string $dir
+ */
+ protected function extractConfig2( array $info, $dir ) {
+ if ( isset( $info['config_prefix'] ) ) {
+ $prefix = $info['config_prefix'];
+ } else {
+ $prefix = 'wg';
+ }
+ if ( isset( $info['config'] ) ) {
+ foreach ( $info['config'] as $key => $data ) {
+ $value = $data['value'];
+ if ( isset( $value['merge_strategy'] ) ) {
+ $value[ExtensionRegistry::MERGE_STRATEGY] = $data['merge_strategy'];
+ }
+ if ( isset( $data['path'] ) && $data['path'] ) {
+ $value = "$dir/$value";
+ }
+ $this->globals["$prefix$key"] = $value;
+ }
+ }
+ }
+
protected function extractParserTestFiles( $dir, array $info ) {
if ( isset( $info['ParserTestFiles'] ) ) {
foreach ( $info['ParserTestFiles'] as $path ) {
/**
* Version of the highest supported manifest version
*/
- const MANIFEST_VERSION = 1;
+ const MANIFEST_VERSION = 2;
/**
* Version of the oldest supported manifest version
* the given value.
*
* @param array $configuration List of configuration values keyed by variable name
+ * @param bool $pretty Pretty-print with extra whitespace
* @return string
*/
- public static function makeConfigSetScript( array $configuration ) {
+ public static function makeConfigSetScript( array $configuration, $pretty = null ) {
return Xml::encodeJsCall(
'mw.config.set',
[ $configuration ],
- ResourceLoader::inDebugMode()
+ ( $pretty === null ) ? ResourceLoader::inDebugMode() : $pretty
);
}
return wfAppendQuery( $script, $query );
}
- /**
- * Build a load.php URL
- * @deprecated since 1.24 Use createLoaderURL() instead
- * @param array $modules Array of module names (strings)
- * @param string $lang Language code
- * @param string $skin Skin name
- * @param string|null $user User name. If null, the &user= parameter is omitted
- * @param string|null $version Versioning timestamp
- * @param bool $debug Whether the request should be in debug mode
- * @param string|null $only &only= parameter
- * @param bool $printable Printable mode
- * @param bool $handheld Handheld mode
- * @param array $extraQuery Extra query parameters to add
- * @return string URL to load.php. May be protocol-relative if $wgLoadScript is, too.
- */
- public static function makeLoaderURL( $modules, $lang, $skin, $user = null,
- $version = null, $debug = false, $only = null, $printable = false,
- $handheld = false, $extraQuery = []
- ) {
- global $wgLoadScript;
-
- $query = self::makeLoaderQuery( $modules, $lang, $skin, $user, $version, $debug,
- $only, $printable, $handheld, $extraQuery
- );
-
- return wfAppendQuery( $wgLoadScript, $query );
- }
-
/**
* Helper for createLoaderURL()
*
* @param array $extraQuery
* @return array
*/
- public static function createLoaderQuery( ResourceLoaderContext $context, $extraQuery = [] ) {
+ protected static function createLoaderQuery( ResourceLoaderContext $context, $extraQuery = [] ) {
return self::makeLoaderQuery(
$context->getModules(),
$context->getLanguage(),
/**
* Build a query array (array representation of query string) for load.php. Helper
- * function for makeLoaderURL().
+ * function for createLoaderURL().
*
* @param array $modules
* @param string $lang
array_fill_keys( $this->config->get( 'ResourceLoaderLESSImportPaths' ), '' )
);
$parser->SetOption( 'relativeUrls', false );
- $parser->SetCacheDir( $this->config->get( 'CacheDirectory' ) ?: wfTempDir() );
return $parser;
}
$this->{$member}[$key] = (array)$value;
}
break;
+ case 'deprecated':
+ $this->deprecated = $option;
+ break;
// Lists of strings
case 'dependencies':
case 'messages':
*/
public function getScript( ResourceLoaderContext $context ) {
$files = $this->getScriptFiles( $context );
- return $this->readScriptFiles( $files );
+ return $this->getDeprecationInformation() . $this->readScriptFiles( $files );
}
/**
return $this->targets;
}
+ /**
+ * Get the module's load type.
+ *
+ * @since 1.28
+ * @return string
+ */
+ public function getType() {
+ $canBeStylesOnly = !(
+ // All options except 'styles', 'skinStyles' and 'debugRaw'
+ $this->scripts
+ || $this->debugScripts
+ || $this->templates
+ || $this->languageScripts
+ || $this->skinScripts
+ || $this->dependencies
+ || $this->messages
+ || $this->skipFunction
+ || $this->raw
+ );
+ return $canBeStylesOnly ? self::LOAD_STYLES : self::LOAD_GENERAL;
+ }
+
/**
* Compile a LESS file into CSS.
*
const TYPE_STYLES = 'styles';
const TYPE_COMBINED = 'combined';
+ # Desired load type
+ // Module only has styles (loaded via <style> or <link rel=stylesheet>)
+ const LOAD_STYLES = 'styles';
+ // Module may have other resources (loaded via mw.loader from a script)
+ const LOAD_GENERAL = 'general';
+
# sitewide core module like a skin file or jQuery component
const ORIGIN_CORE_SITEWIDE = 1;
*/
protected $config;
+ /**
+ * @var array|bool
+ */
+ protected $deprecated = false;
+
/**
* @var LoggerInterface
*/
return $wgContLang->getDir() !== $context->getDirection();
}
+ /**
+ * Get JS representing deprecation information for the current module if available
+ *
+ * @return string JavaScript code
+ */
+ protected function getDeprecationInformation() {
+ $deprecationInfo = $this->deprecated;
+ if ( $deprecationInfo ) {
+ $name = $this->getName();
+ $warning = 'This page is using the deprecated ResourceLoader module "' . $name . '".';
+ if ( !is_bool( $deprecationInfo ) && isset( $deprecationInfo['message'] ) ) {
+ $warning .= "\n" . $deprecationInfo['message'];
+ }
+ return Xml::encodeJsCall(
+ 'mw.log.warn',
+ [ $warning ]
+ );
+ } else {
+ return '';
+ }
+ }
+
/**
* Get all JS for this module for a given language and skin.
* Includes all relevant JS except loader scripts.
return $this->targets;
}
+ /**
+ * Get the module's load type.
+ *
+ * @since 1.28
+ * @return string ResourceLoaderModule LOAD_* constant
+ */
+ public function getType() {
+ return self::LOAD_GENERAL;
+ }
+
/**
* Get the skip function.
*
]
);
- $dbw->onTransactionIdle( function () use ( &$scopeLock ) {
+ $dbw->onTransactionResolution( function () use ( &$scopeLock ) {
ScopedCallback::consume( $scopeLock ); // release after commit
} );
}
$pages['MediaWiki:Common.js'] = [ 'type' => 'script' ];
$pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.js'] = [ 'type' => 'script' ];
}
- if ( $this->getConfig()->get( 'UseSiteCss' ) ) {
- $pages['MediaWiki:Common.css'] = [ 'type' => 'style' ];
- $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.css'] = [ 'type' => 'style' ];
- $pages['MediaWiki:Print.css'] = [ 'type' => 'style', 'media' => 'print' ];
-
- }
return $pages;
}
+
+ /*
+ * @return array
+ */
+ public function getDependencies( ResourceLoaderContext $context = null ) {
+ return [ 'site.styles' ];
+ }
}
}
return $pages;
}
+
+ /**
+ * @return string
+ */
+ public function getType() {
+ return self::LOAD_STYLES;
+ }
}
}
}
+ $illegalFileChars = $conf->get( 'IllegalFileChars' );
+
// Build list of variables
$vars = [
'wgLoadScript' => wfScript( 'load' ),
'wgResourceLoaderMaxQueryLength' => $conf->get( 'ResourceLoaderMaxQueryLength' ),
'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces,
'wgLegalTitleChars' => Title::convertByteClassToUnicodeClass( Title::legalChars() ),
+ 'wgIllegalFileChars' => Title::convertByteClassToUnicodeClass( $illegalFileChars ),
'wgResourceLoaderStorageVersion' => $conf->get( 'ResourceLoaderStorageVersion' ),
'wgResourceLoaderStorageEnabled' => $conf->get( 'ResourceLoaderStorageEnabled' ),
'wgResourceLoaderLegacyModules' => self::getLegacyModules(),
}
$versionHash = $module->getVersionHash( $context );
- if ( strlen( $versionHash ) !== 8 ) {
+ if ( strlen( $versionHash ) !== 7 ) {
$context->getLogger()->warning(
"Module '{module}' produced an invalid version hash: '{version}'.",
[
public function getGroup() {
return 'private';
}
+
+ /**
+ * @return string
+ */
+ public function getType() {
+ return self::LOAD_STYLES;
+ }
}
<?php
/**
- * ResourceLoader module for user customizations.
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
*/
/**
- * Module for user customizations
+ * Module for user customizations scripts
*/
class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
protected $targets = [ 'desktop', 'mobile' ];
/**
- * Get list of pages used by this module
- *
* @param ResourceLoaderContext $context
* @return array List of pages
*/
$pages["$userPage/" . $context->getSkin() . '.js'] = [ 'type' => 'script' ];
}
- if ( $config->get( 'AllowUserCss' ) ) {
- $pages["$userPage/common.css"] = [ 'type' => 'style' ];
- $pages["$userPage/" . $context->getSkin() . '.css'] = [ 'type' => 'style' ];
- }
-
- $useSiteJs = $config->get( 'UseSiteJs' );
- $useSiteCss = $config->get( 'UseSiteCss' );
// User group pages are maintained site-wide and enabled with site JS/CSS.
- if ( $useSiteJs || $useSiteCss ) {
+ if ( $config->get( 'UseSiteJs' ) ) {
foreach ( $user->getEffectiveGroups() as $group ) {
if ( $group == '*' ) {
continue;
}
- if ( $useSiteJs ) {
- $pages["MediaWiki:Group-$group.js"] = [ 'type' => 'script' ];
- }
- if ( $useSiteCss ) {
- $pages["MediaWiki:Group-$group.css"] = [ 'type' => 'style' ];
- }
+ $pages["MediaWiki:Group-$group.js"] = [ 'type' => 'script' ];
}
}
- // Hack for bug 26283: if we're on a preview page for a CSS/JS page,
- // we need to exclude that page from this module. In that case, the excludepage
- // parameter will be set to the name of the page we need to exclude.
+ // Hack for T28283: Allow excluding pages for preview on a CSS/JS page.
+ // The excludepage parameter is set by OutputPage.
$excludepage = $context->getRequest()->getVal( 'excludepage' );
if ( isset( $pages[$excludepage] ) ) {
- // This works because $excludepage is generated with getPrefixedDBkey(),
- // just like the keys in $pages[] above
unset( $pages[$excludepage] );
}
public function getGroup() {
return 'user';
}
+
+ /**
+ * @return array
+ */
+ public function getDependencies( ResourceLoaderContext $context = null ) {
+ return [ 'user.styles' ];
+ }
}
--- /dev/null
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+/**
+ * Module for user customizations styles
+ */
+class ResourceLoaderUserStylesModule extends ResourceLoaderWikiModule {
+
+ protected $origin = self::ORIGIN_USER_INDIVIDUAL;
+ protected $targets = [ 'desktop', 'mobile' ];
+
+ /**
+ * @param ResourceLoaderContext $context
+ * @return array List of pages
+ */
+ protected function getPages( ResourceLoaderContext $context ) {
+ $config = $this->getConfig();
+ $user = $context->getUserObj();
+ if ( $user->isAnon() ) {
+ return [];
+ }
+
+ // Use localised/normalised variant to ensure $excludepage matches
+ $userPage = $user->getUserPage()->getPrefixedDBkey();
+ $pages = [];
+
+ if ( $config->get( 'AllowUserCss' ) ) {
+ $pages["$userPage/common.css"] = [ 'type' => 'style' ];
+ $pages["$userPage/" . $context->getSkin() . '.css'] = [ 'type' => 'style' ];
+ }
+
+ // User group pages are maintained site-wide and enabled with site JS/CSS.
+ if ( $config->get( 'UseSiteCss' ) ) {
+ foreach ( $user->getEffectiveGroups() as $group ) {
+ if ( $group == '*' ) {
+ continue;
+ }
+ $pages["MediaWiki:Group-$group.css"] = [ 'type' => 'style' ];
+ }
+ }
+
+ // Hack for T28283: Allow excluding pages for preview on a CSS/JS page.
+ // The excludepage parameter is set by OutputPage.
+ $excludepage = $context->getRequest()->getVal( 'excludepage' );
+ if ( isset( $pages[$excludepage] ) ) {
+ unset( $pages[$excludepage] );
+ }
+
+ return $pages;
+ }
+
+ /**
+ * @return string
+ */
+ public function getType() {
+ return self::LOAD_STYLES;
+ }
+
+ /**
+ * Get group name
+ *
+ * @return string
+ */
+ public function getGroup() {
+ return 'user';
+ }
+}
return $this->titleInfo[$key];
}
+ /**
+ * @return string
+ */
public function getPosition() {
return $this->position;
}
+
+ /**
+ * @since 1.28
+ * @return string
+ */
+ public function getType() {
+ // Check both because subclasses don't always pass pages via the constructor,
+ // they may also override getPages() instead, in which case we should keep
+ // defaulting to LOAD_GENERAL and allow them to override getType() separately.
+ return ( $this->styles && !$this->scripts ) ? self::LOAD_STYLES : self::LOAD_GENERAL;
+ }
}
* Item class for a filearchive table row
*/
class RevDelArchivedFileItem extends RevDelFileItem {
+ /** @var $list RevDelArchivedFileList */
+ /** @var $file ArchivedFile */
+ /** @var LocalFile */
+ protected $lockFile;
+
public function __construct( $list, $row ) {
RevDelItem::__construct( $list, $row );
$this->file = ArchivedFile::newFromRow( $row );
+ $this->lockFile = RepoGroup::singleton()->getLocalRepo()->newFile( $row->fa_name );
}
public function getIdField() {
'target' => $this->list->title->getPrefixedText(),
'file' => $file->getKey(),
'token' => $user->getEditToken( $file->getKey() )
- ],
- false, PROTO_RELATIVE
+ ]
),
];
}
return $ret;
}
+
+ public function lock() {
+ return $this->lockFile->acquireFileLock();
+ }
+
+ public function unlock() {
+ return $this->lockFile->releaseFileLock();
+ }
}
* Item class for an oldimage table row
*/
class RevDelFileItem extends RevDelItem {
- /** @var File */
- public $file;
+ /** @var RevDelFileList */
+ protected $list;
+ /** @var OldLocalFile */
+ protected $file;
public function __construct( $list, $row ) {
parent::__construct( $list, $row );
'target' => $this->list->title->getPrefixedText(),
'file' => $file->getArchiveName(),
'token' => $user->getEditToken( $file->getArchiveName() )
- ],
- false, PROTO_RELATIVE
+ ]
),
];
}
return $ret;
}
+
+ public function lock() {
+ return $this->file->acquireFileLock();
+ }
+
+ public function unlock() {
+ return $this->file->releaseFileLock();
+ }
}
* @return array Data for the API result
*/
abstract public function getApiData( ApiResult $result );
+
+ /**
+ * Lock the item against changes outside of the DB
+ * @return Status
+ * @since 1.28
+ */
+ public function lock() {
+ return Status::newGood();
+ }
+
+ /**
+ * Unlock the item against changes outside of the DB
+ * @return Status
+ * @since 1.28
+ */
+ public function unlock() {
+ return Status::newGood();
+ }
}
public function areAnySuppressed() {
$bit = $this->getSuppressBit();
- // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
- for ( $this->reset(); $this->current(); $this->next() ) {
- // @codingStandardsIgnoreEnd
- $item = $this->current();
+ /** @var $item RevDelItem */
+ foreach ( $this as $item ) {
if ( $item->getBits() & $bit ) {
return true;
}
}
+
return false;
}
* @since 1.23 Added 'perItemStatus' param
*/
public function setVisibility( array $params ) {
+ $status = Status::newGood();
+
$bitPars = $params['value'];
$comment = $params['comment'];
$perItemStatus = isset( $params['perItemStatus'] ) ? $params['perItemStatus'] : false;
$dbw = wfGetDB( DB_MASTER );
$this->res = $this->doQuery( $dbw );
+ $status->merge( $this->acquireItemLocks() );
+ if ( !$status->isGood() ) {
+ return $status;
+ }
+
$dbw->startAtomic( __METHOD__ );
+ $dbw->onTransactionResolution( function () {
+ // Release locks on commit or error
+ $this->releaseItemLocks();
+ } );
- $status = Status::newGood();
$missing = array_flip( $this->ids );
$this->clearFileOps();
$idsForLog = [];
// passed to doPostCommitUpdates().
$visibilityChangeMap = [];
- // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
- for ( $this->reset(); $this->current(); $this->next() ) {
- // @codingStandardsIgnoreEnd
- /** @var $item RevDelItem */
- $item = $this->current();
+ /** @var $item RevDelItem */
+ foreach ( $this as $item ) {
unset( $missing[$item->getId()] );
if ( $perItemStatus ) {
}
if ( $status->successCount == 0 ) {
- $dbw->rollback( __METHOD__ );
+ $dbw->endAtomic( __METHOD__ );
return $status;
}
// Move files, if there are any
$status->merge( $this->doPreCommitUpdates() );
if ( !$status->isOK() ) {
- // Fatal error, such as no configured archive directory
- $dbw->rollback( __METHOD__ );
+ // Fatal error, such as no configured archive directory or I/O failures
+ wfGetLBFactory()->rollbackMasterChanges( __METHOD__ );
return $status;
}
]
);
- // Clear caches
- $that = $this;
- $dbw->onTransactionIdle( function() use ( $that, $visibilityChangeMap ) {
- $that->doPostCommitUpdates( $visibilityChangeMap );
- } );
+ // Clear caches after commit
+ DeferredUpdates::addCallableUpdate(
+ function () use ( $visibilityChangeMap ) {
+ $this->doPostCommitUpdates( $visibilityChangeMap );
+ },
+ DeferredUpdates::PRESEND
+ );
$dbw->endAtomic( __METHOD__ );
return $status;
}
+ final protected function acquireItemLocks() {
+ $status = Status::newGood();
+ /** @var $item RevDelItem */
+ foreach ( $this as $item ) {
+ $status->merge( $item->lock() );
+ }
+
+ return $status;
+ }
+
+ final protected function releaseItemLocks() {
+ $status = Status::newGood();
+ /** @var $item RevDelItem */
+ foreach ( $this as $item ) {
+ $status->merge( $item->unlock() );
+ }
+
+ return $status;
+ }
+
/**
* Reload the list data from the master DB. This can be done after setVisibility()
* to allow $item->getHTML() to show the new data.
* Create a search field definition.
* Specific search engines should override this method to create search fields.
* @param string $name
- * @param int $type
+ * @param int $type One of the types in SearchIndexField::INDEX_TYPE_*
* @return SearchIndexField
* @since 1.28
*/
* @since 1.27
*/
final class Session implements \Countable, \Iterator, \ArrayAccess {
+ /** @var null|string[] Encryption algorithm to use */
+ private static $encryptionAlgorithm = null;
+
/** @var SessionBackend Session backend */
private $backend;
* Decide what type of encryption to use, based on system capabilities.
* @return array
*/
- private function getEncryptionAlgorithm() {
+ private static function getEncryptionAlgorithm() {
global $wgSessionInsecureSecrets;
- if (
- function_exists( 'openssl_encrypt' )
- && in_array( 'aes-256-ctr', openssl_get_cipher_methods(), true )
- ) {
- return [ 'openssl', 'aes-256-ctr' ];
- } elseif (
- function_exists( 'mcrypt_encrypt' )
- && in_array( 'rijndael-128', mcrypt_list_algorithms(), true )
- && in_array( 'ctr', mcrypt_list_modes(), true )
- ) {
- return [ 'mcrypt', 'rijndael-128', 'ctr' ];
- } elseif ( $wgSessionInsecureSecrets ) {
- // @todo: import a pure-PHP library for AES instead of this
- return [ 'insecure' ];
- } else {
+ if ( self::$encryptionAlgorithm === null ) {
+ if ( function_exists( 'openssl_encrypt' ) ) {
+ $methods = openssl_get_cipher_methods();
+ if ( in_array( 'aes-256-ctr', $methods, true ) ) {
+ self::$encryptionAlgorithm = [ 'openssl', 'aes-256-ctr' ];
+ return self::$encryptionAlgorithm;
+ }
+ if ( in_array( 'aes-256-cbc', $methods, true ) ) {
+ self::$encryptionAlgorithm = [ 'openssl', 'aes-256-cbc' ];
+ return self::$encryptionAlgorithm;
+ }
+ }
+
+ if ( function_exists( 'mcrypt_encrypt' )
+ && in_array( 'rijndael-128', mcrypt_list_algorithms(), true )
+ ) {
+ $modes = mcrypt_list_modes();
+ if ( in_array( 'ctr', $modes, true ) ) {
+ self::$encryptionAlgorithm = [ 'mcrypt', 'rijndael-128', 'ctr' ];
+ return self::$encryptionAlgorithm;
+ }
+ if ( in_array( 'cbc', $modes, true ) ) {
+ self::$encryptionAlgorithm = [ 'mcrypt', 'rijndael-128', 'cbc' ];
+ return self::$encryptionAlgorithm;
+ }
+ }
+
+ if ( $wgSessionInsecureSecrets ) {
+ // @todo: import a pure-PHP library for AES instead of this
+ self::$encryptionAlgorithm = [ 'insecure' ];
+ return self::$encryptionAlgorithm;
+ }
+
throw new \BadMethodCallException(
'Encryption is not available. You really should install the PHP OpenSSL extension, ' .
'or failing that the mcrypt extension. But if you really can\'t and you\'re willing ' .
);
}
+ return self::$encryptionAlgorithm;
}
/**
// Encrypt
// @todo: import a pure-PHP library for AES instead of doing $wgSessionInsecureSecrets
$iv = \MWCryptRand::generate( 16, true );
- $algorithm = $this->getEncryptionAlgorithm();
+ $algorithm = self::getEncryptionAlgorithm();
switch ( $algorithm[0] ) {
case 'openssl':
$ciphertext = openssl_encrypt( $serialized, $algorithm[1], $encKey, OPENSSL_RAW_DATA, $iv );
}
break;
case 'mcrypt':
+ // PKCS7 padding
+ $blocksize = mcrypt_get_block_size( $algorithm[1], $algorithm[2] );
+ $pad = $blocksize - ( strlen( $serialized ) % $blocksize );
+ $serialized .= str_repeat( chr( $pad ), $pad );
+
$ciphertext = mcrypt_encrypt( $algorithm[1], $encKey, $serialized, $algorithm[2], $iv );
if ( $ciphertext === false ) {
throw new \UnexpectedValueException( 'Encryption failed' );
}
// Decrypt
- $algorithm = $this->getEncryptionAlgorithm();
+ $algorithm = self::getEncryptionAlgorithm();
switch ( $algorithm[0] ) {
case 'openssl':
$serialized = openssl_decrypt( base64_decode( $ciphertext ), $algorithm[1], $encKey,
$this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
return $default;
}
+
+ // Remove PKCS7 padding
+ $pad = ord( substr( $serialized, -1 ) );
+ $serialized = substr( $serialized, 0, -$pad );
break;
case 'insecure':
$ex = new \Exception(
* @deprecated since 1.27, use MediaWiki\Auth\AuthManager::autoCreateUser instead
* @param User $user User to auto-create
* @return bool Success
+ * @codeCoverageIgnore
*/
public static function autoCreateUser( User $user ) {
- global $wgAuth, $wgDisableAuthManager;
-
- // @codeCoverageIgnoreStart
- if ( !$wgDisableAuthManager ) {
- wfDeprecated( __METHOD__, '1.27' );
- return \MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
- $user,
- \MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
- false
- )->isGood();
- }
- // @codeCoverageIgnoreEnd
-
- $logger = self::singleton()->logger;
-
- // Much of this code is based on that in CentralAuth
-
- // Try the local user from the slave DB
- $localId = User::idFromName( $user->getName() );
- $flags = 0;
-
- // Fetch the user ID from the master, so that we don't try to create the user
- // when they already exist, due to replication lag
- // @codeCoverageIgnoreStart
- if ( !$localId && wfGetLB()->getReaderIndex() != 0 ) {
- $localId = User::idFromName( $user->getName(), User::READ_LATEST );
- $flags = User::READ_LATEST;
- }
- // @codeCoverageIgnoreEnd
-
- if ( $localId ) {
- // User exists after all.
- $user->setId( $localId );
- $user->loadFromId( $flags );
- return false;
- }
-
- // Denied by AuthPlugin? But ignore AuthPlugin itself.
- if ( get_class( $wgAuth ) !== 'AuthPlugin' && !$wgAuth->autoCreate() ) {
- $logger->debug( __METHOD__ . ': denied by AuthPlugin' );
- $user->setId( 0 );
- $user->loadFromId();
- return false;
- }
-
- // Wiki is read-only?
- if ( wfReadOnly() ) {
- $logger->debug( __METHOD__ . ': denied by wfReadOnly()' );
- $user->setId( 0 );
- $user->loadFromId();
- return false;
- }
-
- $userName = $user->getName();
-
- // Check the session, if we tried to create this user already there's
- // no point in retrying.
- $session = self::getGlobalSession();
- $reason = $session->get( 'MWSession::AutoCreateBlacklist' );
- if ( $reason ) {
- $logger->debug( __METHOD__ . ": blacklisted in session ($reason)" );
- $user->setId( 0 );
- $user->loadFromId();
- return false;
- }
-
- // Is the IP user able to create accounts?
- $anon = new User;
- if ( !$anon->isAllowedAny( 'createaccount', 'autocreateaccount' )
- || $anon->isBlockedFromCreateAccount()
- ) {
- // Blacklist the user to avoid repeated DB queries subsequently
- $logger->debug( __METHOD__ . ': user is blocked from this wiki, blacklisting' );
- $session->set( 'MWSession::AutoCreateBlacklist', 'blocked', 600 );
- $session->persist();
- $user->setId( 0 );
- $user->loadFromId();
- return false;
- }
-
- // Check for validity of username
- if ( !User::isCreatableName( $userName ) ) {
- $logger->debug( __METHOD__ . ': Invalid username, blacklisting' );
- $session->set( 'MWSession::AutoCreateBlacklist', 'invalid username', 600 );
- $session->persist();
- $user->setId( 0 );
- $user->loadFromId();
- return false;
- }
-
- // Give other extensions a chance to stop auto creation.
- $user->loadDefaults( $userName );
- $abortMessage = '';
- if ( !\Hooks::run( 'AbortAutoAccount', [ $user, &$abortMessage ] ) ) {
- // In this case we have no way to return the message to the user,
- // but we can log it.
- $logger->debug( __METHOD__ . ": denied by hook: $abortMessage" );
- $session->set( 'MWSession::AutoCreateBlacklist', "hook aborted: $abortMessage", 600 );
- $session->persist();
- $user->setId( 0 );
- $user->loadFromId();
- return false;
- }
-
- // Make sure the name has not been changed
- if ( $user->getName() !== $userName ) {
- $user->setId( 0 );
- $user->loadFromId();
- throw new \UnexpectedValueException(
- 'AbortAutoAccount hook tried to change the user name'
- );
- }
-
- // Ignore warnings about master connections/writes...hard to avoid here
- \Profiler::instance()->getTransactionProfiler()->resetExpectations();
-
- $cache = \ObjectCache::getLocalClusterInstance();
- $backoffKey = wfMemcKey( 'MWSession', 'autocreate-failed', md5( $userName ) );
- if ( $cache->get( $backoffKey ) ) {
- $logger->debug( __METHOD__ . ': denied by prior creation attempt failures' );
- $user->setId( 0 );
- $user->loadFromId();
- return false;
- }
-
- // Checks passed, create the user...
- $from = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : 'CLI';
- $logger->info( __METHOD__ . ': creating new user ({username}) - from: {url}',
- [
- 'username' => $userName,
- 'url' => $from,
- ] );
-
- try {
- // Insert the user into the local DB master
- $status = $user->addToDatabase();
- if ( !$status->isOK() ) {
- // @codeCoverageIgnoreStart
- // double-check for a race condition (T70012)
- $id = User::idFromName( $user->getName(), User::READ_LATEST );
- if ( $id ) {
- $logger->info( __METHOD__ . ': tried to autocreate existing user',
- [
- 'username' => $userName,
- ] );
- } else {
- $logger->error(
- __METHOD__ . ': failed with message ' . $status->getWikiText( false, false, 'en' ),
- [
- 'username' => $userName,
- ]
- );
- }
- $user->setId( $id );
- $user->loadFromId( User::READ_LATEST );
- return false;
- // @codeCoverageIgnoreEnd
- }
- } catch ( \Exception $ex ) {
- // @codeCoverageIgnoreStart
- $logger->error( __METHOD__ . ': failed with exception {exception}', [
- 'exception' => $ex,
- 'username' => $userName,
- ] );
- // Do not keep throwing errors for a while
- $cache->set( $backoffKey, 1, 600 );
- // Bubble up error; which should normally trigger DB rollbacks
- throw $ex;
- // @codeCoverageIgnoreEnd
- }
-
- # Notify AuthPlugin
- // @codeCoverageIgnoreStart
- $tmpUser = $user;
- $wgAuth->initUser( $tmpUser, true );
- if ( $tmpUser !== $user ) {
- $logger->warning( __METHOD__ . ': ' .
- get_class( $wgAuth ) . '::initUser() replaced the user object' );
- }
- // @codeCoverageIgnoreEnd
-
- # Notify hooks (e.g. Newuserlog)
- \Hooks::run( 'AuthPluginAutoCreate', [ $user ] );
- \Hooks::run( 'LocalUserCreated', [ $user, true ] );
-
- $user->saveSettings();
-
- # Update user count
- \DeferredUpdates::addUpdate( new \SiteStatsUpdate( 0, 0, 0, 0, 1 ) );
-
- # Watch user's userpage and talk page
- $user->addWatch( $user->getUserPage(), User::IGNORE_USER_RIGHTS );
-
- return true;
+ wfDeprecated( __METHOD__, '1.27' );
+ return \MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
+ $user,
+ \MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
+ false
+ )->isGood();
}
/**
* @note This does not return an instance of SiteSQLStore!
*
* @since 1.21
- * @deprecated 1.27 use MediaWikiServices::getSiteStore() or MediaWikiServices::getSiteLookup()
- * instead.
+ * @deprecated since 1.27 use MediaWikiServices::getSiteStore()
+ * or MediaWikiServices::getSiteLookup() instead.
*
* @param null $sitesTable IGNORED
* @param null $cache IGNORED
if ( isset( $plink['active'] ) ) {
$ptool['active'] = $plink['active'];
}
- foreach ( [ 'href', 'class', 'text', 'dir' ] as $k ) {
+ foreach ( [ 'href', 'class', 'text', 'dir', 'data' ] as $k ) {
if ( isset( $plink[$k] ) ) {
$ptool['links'][0][$k] = $plink[$k];
}
*
* If you don't want an accesskey, set $item['tooltiponly'] = true;
*
+ * If a "data" key is present, it must be an array, where the keys represent
+ * the data-xxx properties with their provided values. For example,
+ * $item['data'] = array(
+ * 'foo' => 1,
+ * 'bar' => 'baz',
+ * );
+ * will render as element properties:
+ * data-foo='1' data-bar='baz'
+ *
* @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
unset( $attrs[$k] );
}
+ if ( isset( $attrs['data'] ) ) {
+ foreach ( $attrs['data'] as $key => $value ) {
+ $attrs[ 'data-' . $key ] = $value;
+ }
+ unset( $attrs[ 'data' ] );
+ }
+
if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
$item['single-id'] = $item['id'];
}
* 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
+ * array with just one link item inside of it. You can also set "link-class" in
+ * $item to set a class on the link itself. 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
*
// generating tooltips and accesskeys.
$link['single-id'] = $item['id'];
}
+ if ( isset( $link['link-class'] ) ) {
+ // link-class should be set on the <a> itself,
+ // so pass it in as 'class'
+ $link['class'] = $link['link-class'];
+ unset( $link['link-class'] );
+ }
$html = $this->makeLink( $key, $link, $options );
}
return $result;
}
- /** @deprecated in 1.21 */
- public function commentBlock( $comment, $title = null, $local = false, $wikiId = null ) {
- wfDeprecated( __METHOD__, '1.21' );
- return Linker::commentBlock( $comment, $title, $local, $wikiId );
- }
-
- /** @deprecated in 1.21 */
- public function generateRollback(
- $rev,
- IContextSource $context = null,
- $options = [ 'verify' ]
- ) {
- wfDeprecated( __METHOD__, '1.21' );
- return Linker::generateRollback( $rev, $context, $options );
- }
-
- /** @deprecated in 1.21 */
- public function link( $target, $html = null, $customAttribs = [], $query = [], $options = [] ) {
- wfDeprecated( __METHOD__, '1.21' );
- return Linker::link( $target, $html, $customAttribs, $query, $options );
- }
-
- /** @deprecated in 1.21 */
- public function linkKnown(
- $target,
- $html = null,
- $customAttribs = [],
- $query = [],
- $options = [ 'known', 'noclasses' ]
- ) {
- wfDeprecated( __METHOD__, '1.21' );
- return Linker::linkKnown( $target, $html, $customAttribs, $query, $options );
- }
-
- /** @deprecated in 1.21 */
- public function userLink( $userId, $userName, $altUserName = false ) {
- wfDeprecated( __METHOD__, '1.21' );
- return Linker::userLink( $userId, $userName, $altUserName );
- }
-
- /** @deprecated in 1.21 */
- public function userToolLinks(
- $userId,
- $userText,
- $redContribsWhenNoEdits = false,
- $flags = 0,
- $edits = null
- ) {
- wfDeprecated( __METHOD__, '1.21' );
- return Linker::userToolLinks( $userId, $userText, $redContribsWhenNoEdits, $flags, $edits );
- }
-
}
*
* @file
*/
+use MediaWiki\MediaWikiServices;
/**
* Base class for template-based skins.
? 'nav-login-createaccount'
: 'pt-login';
- // TODO remove this after AuthManager is stable
- global $wgDisableAuthManager;
- if ( $wgDisableAuthManager ) {
- $is_signup = $request->getText( 'type' ) == 'signup';
- $login_url = [
- 'text' => $this->msg( $loginlink )->text(),
- 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
- 'active' => $title->isSpecial( 'Userlogin' )
- && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
- ];
- $createaccount_url = [
- 'text' => $this->msg( 'pt-createaccount' )->text(),
- 'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ),
- 'active' => $title->isSpecial( 'Userlogin' ) && $is_signup,
- ];
- } else {
- $login_url = [
- 'text' => $this->msg( $loginlink )->text(),
- 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
- 'active' => $title->isSpecial( 'Userlogin' ) ||
- $title->isSpecial( 'CreateAccount' ) && $useCombinedLoginLink,
- ];
- $createaccount_url = [
- 'text' => $this->msg( 'pt-createaccount' )->text(),
- 'href' => self::makeSpecialUrl( 'CreateAccount', $returnto ),
- 'active' => $title->isSpecial( 'CreateAccount' ),
- ];
- }
+ $login_url = [
+ 'text' => $this->msg( $loginlink )->text(),
+ 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
+ 'active' => $title->isSpecial( 'Userlogin' )
+ || $title->isSpecial( 'CreateAccount' ) && $useCombinedLoginLink,
+ ];
+ $createaccount_url = [
+ 'text' => $this->msg( 'pt-createaccount' )->text(),
+ 'href' => self::makeSpecialUrl( 'CreateAccount', $returnto ),
+ 'active' => $title->isSpecial( 'CreateAccount' ),
+ ];
// No need to show Talk and Contributions to anons if they can't contribute!
if ( User::groupHasPermission( '*', 'edit' ) ) {
}
}
+ $linkClass = MediaWikiServices::getInstance()->getLinkRenderer()->getLinkClasses( $title );
+
// wfMessageFallback will nicely accept $message as an array of fallbacks
// or just a single key
$msg = wfMessageFallback( $message )->setContext( $this->getContext() );
return $result;
}
- return [
+ $result = [
'class' => implode( ' ', $classes ),
'text' => $text,
'href' => $title->getLocalURL( $query ),
'primary' => true ];
+ if ( $linkClass !== '' ) {
+ $result['link-class'] = $linkClass;
+ }
+
+ return $result;
}
function makeTalkUrlDetails( $name, $urlaction = '' ) {
}
}
-/**
- * A horrible hack to handle AuthManager's feature flag. For other special pages this is done in
- * SpecialPageFactory, but LoginForm is used directly by some extensions. Will be killed as soon
- * as AuthManager is stable.
- */
-class LoginForm extends SpecialPage {
- private $realLoginForm;
-
- public function __construct( $request = null ) {
- global $wgDisableAuthManager;
- if ( $wgDisableAuthManager ) {
- $this->realLoginForm = new LoginFormPreAuthManager( $request );
- } else {
- $this->realLoginForm = new LoginFormAuthManager( $request );
- }
- }
-
- // proxy everything
-
- public function __get( $name ) {
- return $this->realLoginForm->$name;
- }
-
- public function __set( $name, $value ) {
- $this->realLoginForm->$name = $value;
- }
-
- public function __call( $name, $args ) {
- return call_user_func_array( [ $this->realLoginForm, $name ], $args );
- }
-
- public static function __callStatic( $name, $args ) {
- global $wgDisableAuthManager;
- return call_user_func_array( [ $wgDisableAuthManager ? LoginFormPreAuthManager::class
- : LoginFormAuthManager::class, $name ], $args );
- }
-
- // all public SpecialPage methods need to be proxied explicitly
-
- public function getName() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getRestriction() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function isListed() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function setListed( $listed ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function listed( $x = null ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function isIncludable() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function including( $x = null ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getLocalName() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function isExpensive() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function isCached() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function isRestricted() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function userCanExecute( User $user ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function displayRestrictionError() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function checkPermissions() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function checkReadOnly() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function requireLogin(
- $reasonMsg = 'exception-nologin-text', $titleMsg = 'exception-nologin'
- ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function prefixSearchSubpages( $search, $limit, $offset ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function execute( $subPage ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getDescription() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- function getTitle( $subpage = false ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- function getPageTitle( $subpage = false ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function setContext( $context ) {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getContext() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getRequest() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getOutput() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getUser() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getSkin() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getLanguage() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getConfig() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getFullTitle() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function getFinalGroupName() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
- public function doesWrites() {
- return call_user_func_array( [ $this->realLoginForm, __FUNCTION__ ], func_get_args() );
- }
-
- // no way to proxy constants and static properties
-
- const SUCCESS = 0;
- const NO_NAME = 1;
- const ILLEGAL = 2;
- const WRONG_PLUGIN_PASS = 3;
- const NOT_EXISTS = 4;
- const WRONG_PASS = 5;
- const EMPTY_PASS = 6;
- const RESET_PASS = 7;
- const ABORTED = 8;
- const CREATE_BLOCKED = 9;
- const THROTTLED = 10;
- const USER_BLOCKED = 11;
- const NEED_TOKEN = 12;
- const WRONG_TOKEN = 13;
- const USER_MIGRATED = 14;
-
- public static $statusCodes = [
- self::SUCCESS => 'success',
- self::NO_NAME => 'no_name',
- self::ILLEGAL => 'illegal',
- self::WRONG_PLUGIN_PASS => 'wrong_plugin_pass',
- self::NOT_EXISTS => 'not_exists',
- self::WRONG_PASS => 'wrong_pass',
- self::EMPTY_PASS => 'empty_pass',
- self::RESET_PASS => 'reset_pass',
- self::ABORTED => 'aborted',
- self::CREATE_BLOCKED => 'create_blocked',
- self::THROTTLED => 'throttled',
- self::USER_BLOCKED => 'user_blocked',
- self::NEED_TOKEN => 'need_token',
- self::WRONG_TOKEN => 'wrong_token',
- self::USER_MIGRATED => 'user_migrated',
- ];
-
- public static $validErrorMessages = [
- 'exception-nologin-text',
- 'watchlistanontext',
- 'changeemail-no-info',
- 'resetpass-no-info',
- 'confirmemail_needlogin',
- 'prefsnologintext2',
- ];
-}
-
/**
* LoginForm as a special page has been replaced by SpecialUserLogin and SpecialCreateAccount,
* but some extensions called its public methods directly, so the class is retained as a
* B/C wrapper. Anything that used it before should use AuthManager instead.
*/
-class LoginFormAuthManager extends SpecialPage {
+class LoginForm extends SpecialPage {
const SUCCESS = 0;
const NO_NAME = 1;
const ILLEGAL = 2;
protected $mContext;
/**
- * @var LinkRenderer|null
+ * @var \MediaWiki\Linker\LinkRenderer|null
*/
private $linkRenderer;
/**
* @since 1.28
- * @return LinkRenderer
+ * @return \MediaWiki\Linker\LinkRenderer
*/
protected function getLinkRenderer() {
if ( $this->linkRenderer ) {
/**
* @since 1.28
- * @param LinkRenderer $linkRenderer
+ * @param \MediaWiki\Linker\LinkRenderer $linkRenderer
*/
public function setLinkRenderer( LinkRenderer $linkRenderer ) {
$this->linkRenderer = $linkRenderer;
// Authentication
'Userlogin' => 'SpecialUserLogin',
- 'Userlogout' => 'SpecialUserlogoutPreAuthManager',
- 'CreateAccount' => 'SpecialCreateAccountPreAuthManager',
+ 'Userlogout' => 'SpecialUserLogout',
+ 'CreateAccount' => 'SpecialCreateAccount',
'LinkAccounts' => 'SpecialLinkAccounts',
'UnlinkAccounts' => 'SpecialUnlinkAccounts',
'ChangeCredentials' => 'SpecialChangeCredentials',
'Block' => 'SpecialBlock',
'Unblock' => 'SpecialUnblock',
'BlockList' => 'SpecialBlockList',
- 'ChangePassword' => 'SpecialChangePasswordPreAuthManager',
+ 'ChangePassword' => 'SpecialChangePassword',
'BotPasswords' => 'SpecialBotPasswords',
- 'PasswordReset' => 'SpecialPasswordResetPreAuthManager',
+ 'PasswordReset' => 'SpecialPasswordReset',
'DeletedContributions' => 'DeletedContributionsPage',
'Preferences' => 'SpecialPreferences',
'ResetTokens' => 'SpecialResetTokens',
global $wgDisableInternalSearch, $wgEmailAuthentication;
global $wgEnableEmail, $wgEnableJavaScriptTest;
global $wgPageLanguageUseDB, $wgContentHandlerUseDB;
- global $wgDisableAuthManager;
if ( !is_array( self::$list ) ) {
}
if ( $wgEnableEmail ) {
- self::$list['ChangeEmail'] = 'SpecialChangeEmailPreAuthManager';
+ self::$list['ChangeEmail'] = 'SpecialChangeEmail';
}
if ( $wgEnableJavaScriptTest ) {
self::$list['ChangeContentModel'] = 'SpecialChangeContentModel';
}
- // horrible hack to allow selection between old and new classes via a feature flag - T110756
- // will be removed once AuthManager is stable
- if ( !$wgDisableAuthManager ) {
- self::$list = array_map( function ( $class ) {
- return preg_replace( '/PreAuthManager$/', '', $class );
- }, self::$list );
- self::$list['Userlogout'] = 'SpecialUserLogout'; // case matters
- } else {
- self::$list['Userlogin'] = 'LoginForm';
- self::$list = array_diff_key( self::$list, array_fill_keys( [
- 'LinkAccounts', 'UnlinkAccounts', 'ChangeCredentials', 'RemoveCredentials',
- ], true ) );
- }
-
// Add extension special pages
self::$list = array_merge( self::$list, $wgSpecialPages );
$groupedRequests[(string)$info['provider']][] = $req;
}
+ $linkRenderer = $this->getLinkRenderer();
$out->addHTML( Html::openElement( 'dl' ) );
foreach ( $groupedRequests as $group => $members ) {
$out->addHTML( Html::element( 'dt', [], $group ) );
/** @var AuthenticationRequest $req */
$info = $req->describeCredentials();
$out->addHTML( Html::rawElement( 'dd', [],
- Linker::link( $this->getPageTitle( $req->getUniqueId() ),
- htmlspecialchars( $info['account'], ENT_QUOTES ) )
+ $linkRenderer->makeLink(
+ $this->getPageTitle( $req->getUniqueId() ),
+ $info['account']
+ )
) );
}
}
}
$user = htmlspecialchars( $userObj->getName() );
} else {
- $user = Linker::link( $userObj->getUserPage(), htmlspecialchars( $userObj->getName() ) );
+ $user = $this->getLinkRenderer()->makeLink( $userObj->getUserPage(), $userObj->getName() );
}
$nt = $userObj->getUserPage();
$talk = $userObj->getTalkPage();
$links = '';
if ( $talk ) {
- $tools = $this->getUserLinks( $nt, $talk, $userObj );
+ $tools = self::getUserLinks( $this, $userObj );
$links = $this->getLanguage()->pipeList( $tools );
// Show a note if the user is blocked and display the last block log entry.
/**
* Links to different places.
- * @param Title $userpage Target user page
- * @param Title $talkpage Talk page
+ *
+ * @note This function is also called in DeletedContributionsPage
+ * @param SpecialPage $sp SpecialPage instance, for context
* @param User $target Target user object
* @return array
*/
- public function getUserLinks( Title $userpage, Title $talkpage, User $target ) {
+ public static function getUserLinks( SpecialPage $sp, User $target ) {
$id = $target->getId();
$username = $target->getName();
+ $userpage = $target->getUserPage();
+ $talkpage = $target->getTalkPage();
- $tools[] = Linker::link( $talkpage, $this->msg( 'sp-contributions-talk' )->escaped() );
+ $linkRenderer = $sp->getLinkRenderer();
+ $tools['user-talk'] = $linkRenderer->makeLink(
+ $talkpage,
+ $sp->msg( 'sp-contributions-talk' )->text()
+ );
if ( ( $id !== null ) || ( $id === null && IP::isIPAddress( $username ) ) ) {
- if ( $this->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
+ if ( $sp->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
if ( $target->isBlocked() && $target->getBlock()->getType() != Block::TYPE_AUTO ) {
- $tools[] = Linker::linkKnown( # Change block link
+ $tools['block'] = $linkRenderer->makeKnownLink( # Change block link
SpecialPage::getTitleFor( 'Block', $username ),
- $this->msg( 'change-blocklink' )->escaped()
+ $sp->msg( 'change-blocklink' )->text()
);
- $tools[] = Linker::linkKnown( # Unblock link
+ $tools['unblock'] = $linkRenderer->makeKnownLink( # Unblock link
SpecialPage::getTitleFor( 'Unblock', $username ),
- $this->msg( 'unblocklink' )->escaped()
+ $sp->msg( 'unblocklink' )->text()
);
} else { # User is not blocked
- $tools[] = Linker::linkKnown( # Block link
+ $tools['block'] = $linkRenderer->makeKnownLink( # Block link
SpecialPage::getTitleFor( 'Block', $username ),
- $this->msg( 'blocklink' )->escaped()
+ $sp->msg( 'blocklink' )->text()
);
}
}
# Block log link
- $tools[] = Linker::linkKnown(
+ $tools['log-block'] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'Log', 'block' ),
- $this->msg( 'sp-contributions-blocklog' )->escaped(),
+ $sp->msg( 'sp-contributions-blocklog' )->text(),
[],
[ 'page' => $userpage->getPrefixedText() ]
);
# Suppression log link (bug 59120)
- if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
- $tools[] = Linker::linkKnown(
+ if ( $sp->getUser()->isAllowed( 'suppressionlog' ) ) {
+ $tools['log-suppression'] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'Log', 'suppress' ),
- $this->msg( 'sp-contributions-suppresslog' )->escaped(),
+ $sp->msg( 'sp-contributions-suppresslog' )->text(),
[],
[ 'offender' => $username ]
);
}
}
# Uploads
- $tools[] = Linker::linkKnown(
+ $tools['uploads'] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'Listfiles', $username ),
- $this->msg( 'sp-contributions-uploads' )->escaped()
+ $sp->msg( 'sp-contributions-uploads' )->text()
);
# Other logs link
- $tools[] = Linker::linkKnown(
+ $tools['logs'] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'Log', $username ),
- $this->msg( 'sp-contributions-logs' )->escaped()
+ $sp->msg( 'sp-contributions-logs' )->text()
);
# Add link to deleted user contributions for priviledged users
- if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
- $tools[] = Linker::linkKnown(
+ if ( $sp->getUser()->isAllowed( 'deletedhistory' ) ) {
+ $tools['deletedcontribs'] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'DeletedContributions', $username ),
- $this->msg( 'sp-contributions-deleted' )->escaped()
+ $sp->msg( 'sp-contributions-deleted' )->text()
);
}
# Add a link to change user rights for privileged users
$userrightsPage = new UserrightsPage();
- $userrightsPage->setContext( $this->getContext() );
+ $userrightsPage->setContext( $sp->getContext() );
if ( $userrightsPage->userCanChangeRights( $target ) ) {
- $tools[] = Linker::linkKnown(
+ $tools['userrights'] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'Userrights', $username ),
- $this->msg( 'sp-contributions-userrights' )->escaped()
+ $sp->msg( 'sp-contributions-userrights' )->text()
);
}
- Hooks::run( 'ContributionsToolLinks', [ $id, $userpage, &$tools ] );
+ Hooks::run( 'ContributionsToolLinks', [ $id, $userpage, &$tools, $sp ] );
return $tools;
}
# Run any hooks; display injected HTML
$injected_html = '';
$welcome_creation_msg = 'welcomecreation-msg';
- Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html ] );
+ Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html, $direct ] );
/**
* Let any extensions change what message is shown.
* Generates the subheading with links
* @param User $userObj User object for the target
* @return string Appropriately-escaped HTML to be output literally
- * @todo FIXME: Almost the same as contributionsSub in SpecialContributions.php. Could be combined.
*/
function getSubTitle( $userObj ) {
+ $linkRenderer = $this->getLinkRenderer();
if ( $userObj->isAnon() ) {
$user = htmlspecialchars( $userObj->getName() );
} else {
- $user = Linker::link( $userObj->getUserPage(), htmlspecialchars( $userObj->getName() ) );
+ $user = $linkRenderer->makeKnownLink( $userObj->getUserPage(), $userObj->getName() );
}
$links = '';
$nt = $userObj->getUserPage();
- $id = $userObj->getId();
$talk = $nt->getTalkPage();
if ( $talk ) {
- # Talk page link
- $tools[] = Linker::link( $talk, $this->msg( 'sp-contributions-talk' )->escaped() );
- if ( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
- # Block / Change block / Unblock links
- if ( $this->getUser()->isAllowed( 'block' ) ) {
- if ( $userObj->isBlocked() && $userObj->getBlock()->getType() !== Block::TYPE_AUTO ) {
- $tools[] = Linker::linkKnown( # Change block link
- SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
- $this->msg( 'change-blocklink' )->escaped()
- );
- $tools[] = Linker::linkKnown( # Unblock link
- SpecialPage::getTitleFor( 'BlockList' ),
- $this->msg( 'unblocklink' )->escaped(),
- [],
- [
- 'action' => 'unblock',
- 'ip' => $nt->getDBkey()
- ]
- );
- } else {
- # User is not blocked
- $tools[] = Linker::linkKnown( # Block link
- SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
- $this->msg( 'blocklink' )->escaped()
- );
- }
- }
- # Block log link
- $tools[] = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Log' ),
- $this->msg( 'sp-contributions-blocklog' )->escaped(),
- [],
- [
- 'type' => 'block',
- 'page' => $nt->getPrefixedText()
- ]
- );
- # Suppression log link (bug 59120)
- if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
- $tools[] = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Log', 'suppress' ),
- $this->msg( 'sp-contributions-suppresslog' )->escaped(),
- [],
- [ 'offender' => $userObj->getName() ]
- );
- }
- }
+ $tools = SpecialContributions::getUserLinks( $this, $userObj );
- # Uploads
- $tools[] = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Listfiles', $userObj->getName() ),
- $this->msg( 'sp-contributions-uploads' )->escaped()
- );
-
- # Other logs link
- $tools[] = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Log' ),
- $this->msg( 'sp-contributions-logs' )->escaped(),
- [],
- [ 'user' => $nt->getText() ]
- );
# Link to contributions
- $tools[] = Linker::linkKnown(
+ $insert['contribs'] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'Contributions', $nt->getDBkey() ),
- $this->msg( 'sp-deletedcontributions-contribs' )->escaped()
+ $this->msg( 'sp-deletedcontributions-contribs' )->text()
);
- # Add a link to change user rights for privileged users
- $userrightsPage = new UserrightsPage();
- $userrightsPage->setContext( $this->getContext() );
- if ( $userrightsPage->userCanChangeRights( $userObj ) ) {
- $tools[] = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Userrights', $nt->getDBkey() ),
- $this->msg( 'sp-contributions-userrights' )->escaped()
- );
- }
-
- Hooks::run( 'ContributionsToolLinks', [ $id, $nt, &$tools ] );
+ // Swap out the deletedcontribs link for our contribs one
+ $tools = wfArrayInsertAfter( $tools, $insert, 'deletedcontribs' );
+ unset( $tools['deletedcontribs'] );
$links = $this->getLanguage()->pipeList( $tools );
/**
* @defgroup Watchlist Users watchlist handling
*/
-use MediaWiki\Linker\LinkTarget;
/**
* Implements Special:EditWatchlist
* @ingroup Watchlist
*/
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
/**
protected function outputSubtitle() {
$out = $this->getOutput();
$out->addSubtitle( $this->msg( 'watchlistfor2', $this->getUser()->getName() )
- ->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
+ ->rawParams(
+ self::buildTools(
+ $this->getLanguage(),
+ $this->getLinkRenderer()
+ )
+ )
+ );
}
/**
* @param string $output
*/
private function showTitles( $titles, &$output ) {
- $talk = $this->msg( 'talkpagelinktext' )->escaped();
+ $talk = $this->msg( 'talkpagelinktext' )->text();
// Do a batch existence check
$batch = new LinkBatch();
if ( count( $titles ) >= 100 ) {
// Print out the list
$output .= "<ul>\n";
+ $linkRenderer = $this->getLinkRenderer();
foreach ( $titles as $title ) {
if ( !$title instanceof Title ) {
$title = Title::newFromText( $title );
if ( $title instanceof Title ) {
$output .= '<li>' .
- Linker::link( $title ) . ' ' .
+ $linkRenderer->makeLink( $title ) . ' ' .
$this->msg( 'parentheses' )->rawParams(
- Linker::link( $title->getTalkPage(), $talk )
+ $linkRenderer->makeLink( $title->getTalkPage(), $talk )
)->escaped() .
"</li>\n";
}
* @return string
*/
private function buildRemoveLine( $title ) {
- $link = Linker::link( $title );
+ $linkRenderer = $this->getLinkRenderer();
+ $link = $linkRenderer->makeLink( $title );
- $tools['talk'] = Linker::link(
+ $tools['talk'] = $linkRenderer->makeLink(
$title->getTalkPage(),
- $this->msg( 'talkpagelinktext' )->escaped()
+ $this->msg( 'talkpagelinktext' )->text()
);
if ( $title->exists() ) {
- $tools['history'] = Linker::linkKnown(
+ $tools['history'] = $linkRenderer->makeKnownLink(
$title,
- $this->msg( 'history_short' )->escaped(),
+ $this->msg( 'history_short' )->text(),
[],
[ 'action' => 'history' ]
);
}
if ( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
- $tools['contributions'] = Linker::linkKnown(
+ $tools['contributions'] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'Contributions', $title->getText() ),
- $this->msg( 'contributions' )->escaped()
+ $this->msg( 'contributions' )->text()
);
}
* Build a set of links for convenient navigation
* between watchlist viewing and editing modes
*
- * @param null $unused
+ * @param Language $lang
+ * @param LinkRenderer|null $linkRenderer
* @return string
*/
- public static function buildTools( $unused ) {
- global $wgLang;
+ public static function buildTools( $lang, LinkRenderer $linkRenderer = null ) {
+ if ( !$lang instanceof Language ) {
+ // back-compat where the first parameter was $unused
+ global $wgLang;
+ $lang = $wgLang;
+ }
+ if ( !$linkRenderer ) {
+ $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+ }
$tools = [];
$modes = [
foreach ( $modes as $mode => $arr ) {
// can use messages 'watchlisttools-view', 'watchlisttools-edit', 'watchlisttools-raw'
- $tools[] = Linker::linkKnown(
+ $tools[] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( $arr[0], $arr[1] ),
- wfMessage( "watchlisttools-{$mode}" )->escaped()
+ wfMessage( "watchlisttools-{$mode}" )->text()
);
}
return Html::rawElement(
'span',
[ 'class' => 'mw-watchlist-toollinks' ],
- wfMessage( 'parentheses' )->rawParams( $wgLang->pipeList( $tools ) )->escaped()
+ wfMessage( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped()
);
}
}
$this->setHeaders();
$this->outputHeader();
$this->getOutput()->addModules( 'mediawiki.userSuggest' );
+ $this->addHelpLink( 'Help:Log' );
$opts = new FormOptions;
$opts->add( 'type', '' );
}
$text = $wgContLang->convert( $nt->getText() );
- $plink = Linker::link( $nt, htmlspecialchars( $text ) );
+ $plink = $this->getLinkRenderer()->makeLink( $nt, $text );
$nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
return $this->getLanguage()->specialList( $plink, $nlinks );
* parameters, like the second argument to OutputPage::wrapWikiMsg().
*/
function showForm( $err ) {
- global $wgContLang;
-
$this->getSkin()->setRelevantTitle( $this->oldTitle );
$out = $this->getOutput();
'title' => [
'id' => 'wpNewTitleMain',
'name' => 'wpNewTitleMain',
- 'value' => $wgContLang->recodeForEdit( $newTitle->getText() ),
+ 'value' => $newTitle->getText(),
// Inappropriate, since we're expecting the user to input a non-existent page's title
'suggestions' => false,
],
*/
class SpecialNewFiles extends IncludableSpecialPage {
+ /** @var FormOptions */
+ protected $opts;
+
public function __construct() {
parent::__construct( 'Newimages' );
}
$out = $this->getOutput();
$this->addHelpLink( 'Help:New images' );
- $pager = new NewFilesPager( $this->getContext(), $par );
+ $opts = new FormOptions();
+
+ $opts->add( 'like', '' );
+ $opts->add( 'showbots', false );
+ $opts->add( 'hidepatrolled', false );
+ $opts->add( 'limit', 50 );
+ $opts->add( 'offset', '' );
+
+ $opts->fetchValuesFromRequest( $this->getRequest() );
+
+ if ( $par !== null ) {
+ $opts->setValue( is_numeric( $par ) ? 'limit' : 'like', $par );
+ }
+
+ $opts->validateIntBounds( 'limit', 0, 500 );
+
+ $this->opts = $opts;
if ( !$this->including() ) {
$this->setTopText();
- $form = $pager->getForm();
- $form->prepareForm();
- $form->displayForm( '' );
+ $this->buildForm();
}
+ $pager = new NewFilesPager( $this->getContext(), $opts );
+
$out->addHTML( $pager->getBody() );
if ( !$this->including() ) {
$out->addHTML( $pager->getNavigationBar() );
}
}
+ protected function buildForm() {
+ $formDescriptor = [
+ 'like' => [
+ 'type' => 'text',
+ 'label-message' => 'newimages-label',
+ 'name' => 'like',
+ ],
+
+ 'showbots' => [
+ 'type' => 'check',
+ 'label-message' => 'newimages-showbots',
+ 'name' => 'showbots',
+ ],
+
+ 'hidepatrolled' => [
+ 'type' => 'check',
+ 'label-message' => 'newimages-hidepatrolled',
+ 'name' => 'hidepatrolled',
+ ],
+
+ 'limit' => [
+ 'type' => 'hidden',
+ 'default' => $this->opts->getValue( 'limit' ),
+ 'name' => 'limit',
+ ],
+
+ 'offset' => [
+ 'type' => 'hidden',
+ 'default' => $this->opts->getValue( 'offset' ),
+ 'name' => 'offset',
+ ],
+ ];
+
+ if ( $this->getConfig()->get( 'MiserMode' ) ) {
+ unset( $formDescriptor['like'] );
+ }
+
+ if ( !$this->getUser()->useFilePatrol() ) {
+ unset( $formDescriptor['hidepatrolled'] );
+ }
+
+ $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+ ->setWrapperLegendMsg( 'newimages-legend' )
+ ->setSubmitTextMsg( 'ilsubmit' )
+ ->setMethod( 'get' )
+ ->prepareForm()
+ ->displayForm( false );
+ }
+
protected function getGroupName() {
return 'changes';
}
if ( $this->patrollable( $result ) ) {
$classes[] = 'not-patrolled';
+ $this->getOutput()->addModuleStyles( 'mediawiki.page.patrol' );
}
# Add a class for zero byte pages
if ( $request->getSessionData( 'specialPreferencesSaveSuccess' ) ) {
// Remove session data for the success message
$request->setSessionData( 'specialPreferencesSaveSuccess', null );
+ $out->addModuleStyles( 'mediawiki.notification.convertmessagebox.styles' );
- $out->wrapWikiMsg(
+ $out->addHtml(
Html::rawElement(
'div',
[
- 'class' => 'mw-preferences-messagebox successbox',
- 'id' => 'mw-preferences-success'
+ 'class' => 'mw-preferences-messagebox mw-notify-success successbox',
+ 'id' => 'mw-preferences-success',
+ 'data-mw-autohide' => 'false',
],
- Html::element( 'p', [], '$1' )
- ),
- 'savedprefs'
+ Html::element( 'p', [], $this->msg( 'savedprefs' )->text() )
+ )
);
}
* @ingroup SpecialPage
*/
+use MediaWiki\Linker\LinkRenderer;
+
/**
* A special page that lists protected pages
*
$size,
$indefOnly,
$cascadeOnly,
- $noRedirect
+ $noRedirect,
+ $this->getLinkRenderer()
);
$this->getOutput()->addHTML( $this->showOptions(
public $mForm, $mConds;
private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
+ /**
+ * @var LinkRenderer
+ */
+ private $linkRenderer;
+
+ /**
+ * @param SpecialProtectedpages $form
+ * @param array $conds
+ * @param $type
+ * @param $level
+ * @param $namespace
+ * @param string $sizetype
+ * @param int $size
+ * @param bool $indefonly
+ * @param bool $cascadeonly
+ * @param bool $noredirect
+ * @param LinkRenderer $linkRenderer
+ */
function __construct( $form, $conds = [], $type, $level, $namespace,
- $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false
+ $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false,
+ LinkRenderer $linkRenderer
) {
$this->mForm = $form;
$this->mConds = $conds;
$this->indefonly = (bool)$indefonly;
$this->cascadeonly = (bool)$cascadeonly;
$this->noredirect = (bool)$noredirect;
+ $this->linkRenderer = $linkRenderer;
parent::__construct( $form->getContext() );
}
/** @var $row object */
$row = $this->mCurrentRow;
- $formatted = '';
-
switch ( $field ) {
case 'log_timestamp':
// when timestamp is null, this is a old protection row
)
);
} else {
- $formatted = Linker::link( $title );
+ $formatted = $this->linkRenderer->makeLink( $title );
}
if ( !is_null( $row->page_len ) ) {
$formatted .= $this->getLanguage()->getDirMark() .
$value, /* User preference timezone */true ) );
$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
- $changeProtection = Linker::linkKnown(
+ $changeProtection = $this->linkRenderer->makeKnownLink(
$title,
- $this->msg( 'protect_change' )->escaped(),
+ $this->msg( 'protect_change' )->text(),
[],
[ 'action' => 'unprotect' ]
);
* Let users reset tokens like the watchlist token.
*
* @ingroup SpecialPage
- * @deprecated 1.26
+ * @deprecated since 1.26
*/
class SpecialResetTokens extends FormSpecialPage {
private $tokensList;
if ( $textMatches && !$textStatus ) {
// output appropriate heading
if ( $numTextMatches > 0 && $numTitleMatches > 0 ) {
- $out->addHTML( '<div class="visualClear"></div>' );
+ $out->addHTML( '<div class="mw-search-visualclear"></div>' );
// if no title matches the heading is redundant
$out->wrapWikiMsg( "==$1==\n", 'textmatches' );
}
$textMatches->free();
}
- $out->addHTML( '<div class="visualClear"></div>' );
+ $out->addHTML( '<div class="mw-search-visualclear"></div>' );
if ( $prevnext ) {
$out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
protected function interwikiHeader( $interwiki, $interwikiResult ) {
// TODO: we need to figure out how to name wikis correctly
$wikiMsg = $this->msg( 'search-interwiki-results-' . $interwiki )->parse();
- return "<p class=\"mw-search-interwiki-header\">\n$wikiMsg</p>";
+ return "<p class=\"mw-search-interwiki-header mw-search-visualclear\">\n$wikiMsg</p>";
}
/**
* @return string
*/
protected function searchProfileTabs( $term ) {
- $out = Html::element( 'div', [ 'class' => 'visualClear' ] ) .
+ $out = Html::element( 'div', [ 'class' => 'mw-search-visualclear' ] ) .
Xml::openElement( 'div', [ 'class' => 'mw-search-profile-tabs' ] );
$bareterm = $term;
'autofocus' => trim( $term ) === '',
'value' => $term,
'dataLocation' => 'content',
+ 'infusable' => true,
] );
$layout = new OOUI\ActionFieldLayout( $searchWidget, new OOUI\ButtonInputWidget( [
Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
}
- $hlink = Linker::linkKnown(
+ $linkRenderer = $this->getLinkRenderer();
+ $hlink = $linkRenderer->makeKnownLink(
$title,
- $this->msg( 'hist' )->escaped(),
+ $this->msg( 'hist' )->text(),
[],
[ 'action' => 'history' ]
);
$hlinkInParentheses = $this->msg( 'parentheses' )->rawParams( $hlink )->escaped();
if ( $this->isCached() ) {
- $plink = Linker::link( $title );
+ $plink = $linkRenderer->makeLink( $title );
$exists = $title->exists();
} else {
- $plink = Linker::linkKnown( $title );
+ $plink = $linkRenderer->makeKnownLink( $title );
$exists = true;
}
ChangeTags::listExtensionDefinedTags(), true );
// List all defined tags, even if they were never applied
- $definedTags = array_keys( array_merge(
- $this->explicitlyDefinedTags, $this->extensionDefinedTags ) );
+ $definedTags = array_keys( $this->explicitlyDefinedTags + $this->extensionDefinedTags );
// Show header only if there exists atleast one tag
if ( !$tagStats && !$definedTags ) {
$newRow = '';
$newRow .= Xml::tags( 'td', null, Xml::element( 'code', null, $tag ) );
+ $linkRenderer = $this->getLinkRenderer();
$disp = ChangeTags::tagDescription( $tag );
if ( $showEditLinks ) {
$disp .= ' ';
- $editLink = Linker::link(
+ $editLink = $linkRenderer->makeLink(
$this->msg( "tag-$tag" )->inContentLanguage()->getTitle(),
- $this->msg( 'tags-edit' )->escaped()
+ $this->msg( 'tags-edit' )->text()
);
$disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
}
$desc = !$msg->exists() ? '' : $msg->parse();
if ( $showEditLinks ) {
$desc .= ' ';
- $editDescLink = Linker::link(
+ $editDescLink = $linkRenderer->makeLink(
$this->msg( "tag-$tag-description" )->inContentLanguage()->getTitle(),
- $this->msg( 'tags-edit' )->escaped()
+ $this->msg( 'tags-edit' )->text()
);
$desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
}
$activeMsg = ( $isActive ? 'tags-active-yes' : 'tags-active-no' );
$newRow .= Xml::tags( 'td', null, $this->msg( $activeMsg )->escaped() );
- $hitcountLabel = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
+ $hitcountLabelMsg = $this->msg( 'tags-hitcount' )->numParams( $hitcount );
if ( $this->getConfig()->get( 'UseTagFilter' ) ) {
- $hitcountLabel = Linker::link(
+ $hitcountLabel = $linkRenderer->makeLink(
SpecialPage::getTitleFor( 'Recentchanges' ),
- $hitcountLabel,
+ $hitcountLabelMsg->text(),
[],
[ 'tagfilter' => $tag ]
);
+ } else {
+ $hitcountLabel = $hitcountLabelMsg->escaped();
}
// add raw $hitcount for sorting, because tags-hitcount contains numbers and letters
// delete
if ( $showDeleteActions && ChangeTags::canDeleteTag( $tag )->isOK() ) {
- $actionLinks[] = Linker::linkKnown( $this->getPageTitle( 'delete' ),
- $this->msg( 'tags-delete' )->escaped(),
+ $actionLinks[] = $linkRenderer->makeKnownLink(
+ $this->getPageTitle( 'delete' ),
+ $this->msg( 'tags-delete' )->text(),
[],
[ 'tag' => $tag ] );
}
// activate
if ( ChangeTags::canActivateTag( $tag )->isOK() ) {
- $actionLinks[] = Linker::linkKnown( $this->getPageTitle( 'activate' ),
- $this->msg( 'tags-activate' )->escaped(),
+ $actionLinks[] = $linkRenderer->makeKnownLink(
+ $this->getPageTitle( 'activate' ),
+ $this->msg( 'tags-activate' )->text(),
[],
[ 'tag' => $tag ] );
}
// deactivate
if ( ChangeTags::canDeactivateTag( $tag )->isOK() ) {
- $actionLinks[] = Linker::linkKnown( $this->getPageTitle( 'deactivate' ),
- $this->msg( 'tags-deactivate' )->escaped(),
+ $actionLinks[] = $linkRenderer->makeKnownLink(
+ $this->getPageTitle( 'deactivate' ),
+ $this->msg( 'tags-deactivate' )->text(),
[],
[ 'tag' => $tag ] );
}
* @ingroup Upload
*/
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
+
/**
* Form for handling uploads and special page.
*
'texttop' => $this->uploadFormTextTop,
'textaftersummary' => $this->uploadFormTextAfterSummary,
'destfile' => $this->mDesiredDestName,
- ], $context );
+ ], $context, $this->getLinkRenderer() );
# Check the token, but only if necessary
if (
if ( $title instanceof Title ) {
$count = $title->isDeleted();
if ( $count > 0 && $user->isAllowed( 'deletedhistory' ) ) {
- $restorelink = Linker::linkKnown(
+ $restorelink = $this->getLinkRenderer()->makeKnownLink(
SpecialPage::getTitleFor( 'Undelete', $title->getPrefixedText() ),
- $this->msg( 'restorelink' )->numParams( $count )->escaped()
+ $this->msg( 'restorelink' )->numParams( $count )->text()
);
$link = $this->msg( $user->isAllowed( 'delete' ) ? 'thisisdeleted' : 'viewdeleted' )
->rawParams( $restorelink )->parseAsBlock();
* @param string $message HTML message to be passed to mainUploadForm
*/
protected function showRecoverableUploadError( $message ) {
- $sessionKey = $this->mUpload->stashSession();
+ $sessionKey = $this->mUpload->stashFile()->getFileKey();
$message = '<h2>' . $this->msg( 'uploaderror' )->escaped() . "</h2>\n" .
'<div class="error">' . $message . "</div>\n";
return false;
}
- $sessionKey = $this->mUpload->stashSession();
+ $sessionKey = $this->mUpload->stashFile()->getFileKey();
// Add styles for the warning, reused from the live preview
$this->getOutput()->addModuleStyles( 'mediawiki.special.upload.styles' );
+ $linkRenderer = $this->getLinkRenderer();
$warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
. '<div class="mw-destfile-warning"><ul>';
foreach ( $warnings as $warning => $args ) {
} elseif ( $warning == 'was-deleted' ) {
# If the file existed before and was deleted, warn the user of this
$ltitle = SpecialPage::getTitleFor( 'Log' );
- $llink = Linker::linkKnown(
+ $llink = $linkRenderer->makeKnownLink(
$ltitle,
- wfMessage( 'deletionlog' )->escaped(),
+ wfMessage( 'deletionlog' )->text(),
[],
[
'type' => 'delete',
protected $mMaxUploadSize = [];
- public function __construct( array $options = [], IContextSource $context = null ) {
+ public function __construct( array $options = [], IContextSource $context = null,
+ LinkRenderer $linkRenderer = null
+ ) {
if ( $context instanceof IContextSource ) {
$this->setContext( $context );
}
+ if ( !$linkRenderer ) {
+ $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+ }
+
$this->mWatch = !empty( $options['watch'] );
$this->mForReUpload = !empty( $options['forreupload'] );
$this->mSessionKey = isset( $options['sessionkey'] ) ? $options['sessionkey'] : '';
Hooks::run( 'UploadFormInitDescriptor', [ &$descriptor ] );
parent::__construct( $descriptor, $context, 'upload' );
- # Add a link to edit MediaWik:Licenses
+ # Add a link to edit MediaWiki:Licenses
if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
- $this->getOutput()->addModuleStyles( 'mediawiki.special' );
- $licensesLink = Linker::linkKnown(
+ $this->getOutput()->addModuleStyles( 'mediawiki.special.upload.styles' );
+ $licensesLink = $linkRenderer->makeKnownLink(
$this->msg( 'licenses' )->inContentLanguage()->getTitle(),
- $this->msg( 'licenses-edit' )->escaped(),
+ $this->msg( 'licenses-edit' )->text(),
[],
[ 'action' => 'edit' ]
);
if ( $files && count( $files ) ) {
sort( $files );
$fileListItemsHtml = '';
+ $linkRenderer = $this->getLinkRenderer();
foreach ( $files as $file ) {
- $itemHtml = Linker::linkKnown( $this->getPageTitle( "file/$file" ), htmlspecialchars( $file ) );
+ $itemHtml = $linkRenderer->makeKnownLink(
+ $this->getPageTitle( "file/$file" ),
+ $file
+ );
try {
$fileObj = $this->stash->getFile( $file );
$thumb = $fileObj->generateThumbName( $file, [ 'width' => 220 ] );
$itemHtml .=
$this->msg( 'word-separator' )->escaped() .
$this->msg( 'parentheses' )->rawParams(
- Linker::linkKnown(
+ $linkRenderer->makeKnownLink(
$this->getPageTitle( "thumb/$file/$thumb" ),
- $this->msg( 'uploadstash-thumbnail' )->escaped()
+ $this->msg( 'uploadstash-thumbnail' )->text()
)
)->escaped();
} catch ( Exception $e ) {
# Run any hooks; display injected HTML if any, else redirect
$injected_html = '';
- Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html ] );
+ Hooks::run( 'UserLoginComplete', [ &$user, &$injected_html, $direct ] );
if ( $injected_html !== '' || $extraMessages ) {
$this->showSuccessPage( 'success', $this->msg( 'loginsuccesstitle' ),
// show a successbox, if the user rights was saved successfully
if ( $request->getCheck( 'success' ) && $this->mFetchedUser !== null ) {
- $out->wrapWikiMsg(
- "<div class=\"successbox\">\n$1\n</div>",
- [ 'savedrights', $this->mFetchedUser->getName() ]
+ $out->addModules( [ 'mediawiki.special.userrights' ] );
+ $out->addModuleStyles( 'mediawiki.notification.convertmessagebox.styles' );
+ $out->addHtml(
+ Html::rawElement(
+ 'div',
+ [
+ 'class' => 'mw-notify-success successbox',
+ 'id' => 'mw-preferences-success',
+ 'data-mw-autohide' => 'false',
+ ],
+ Html::element(
+ 'p',
+ [],
+ $this->msg( 'savedrights', $this->mFetchedUser->getName() )->text()
+ )
+ )
);
}
$out->addSubtitle(
$this->msg( 'watchlistfor2', $user->getName() )
- ->rawParams( SpecialEditWatchlist::buildTools( null ) )
+ ->rawParams( SpecialEditWatchlist::buildTools(
+ $this->getLanguage(),
+ $this->getLinkRenderer()
+ ) )
);
$this->setTopText( $opts );
]
];
}
+ // (T140537) Disallow looking too far in the past for 'newbies' queries. If the user requested
+ // a timestamp offset far in the past such that there are no edits by users with user_ids in
+ // the range, we would end up scanning all revisions from that offset until start of time.
+ $condition[] = 'rev_timestamp > ' .
+ $this->mDb->addQuotes( $this->mDb->timestamp( wfTimestamp() - 30 * 24 * 60 * 60 ) );
} else {
$uid = User::idFromName( $this->target );
if ( $uid ) {
// If statement for paranoia
if ( $file ) {
$thumb = $file->transform( [ 'width' => 180, 'height' => 360 ] );
-
- return $thumb->toHtml( [ 'desc-link' => true ] );
+ if ( $thumb ) {
+ return $thumb->toHtml( [ 'desc-link' => true ] );
+ } else {
+ return wfMessage( 'thumbnail_error', '' )->escaped();
+ }
} else {
return htmlspecialchars( $value );
}
protected $gallery;
/**
- * @var bool
+ * @var FormOptions
*/
- protected $showBots;
+ protected $opts;
/**
- * @var bool
+ * @param IContextSource $context
+ * @param FormOptions $opts
*/
- protected $hidePatrolled;
-
- function __construct( IContextSource $context, $par = null ) {
- $this->like = $context->getRequest()->getText( 'like' );
- $this->showBots = $context->getRequest()->getBool( 'showbots', 0 );
- $this->hidePatrolled = $context->getRequest()->getBool( 'hidepatrolled', 0 );
- if ( is_numeric( $par ) ) {
- $this->setLimit( $par );
- }
+ function __construct( IContextSource $context, FormOptions $opts ) {
+ $this->opts = $opts;
+
+ $this->setLimit( $opts->getValue( 'limit' ) );
parent::__construct( $context );
}
function getQueryInfo() {
+ $opts = $this->opts;
$conds = $jconds = [];
$tables = [ 'image' ];
$fields = [ 'img_name', 'img_user', 'img_timestamp' ];
$options = [];
- if ( !$this->showBots ) {
+ if ( !$opts->getValue( 'showbots' ) ) {
$groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
if ( count( $groupsWithBotPermission ) ) {
}
}
- if ( $this->hidePatrolled ) {
+ if ( $opts->getValue( 'hidepatrolled' ) ) {
$tables[] = 'recentchanges';
$conds['rc_type'] = RC_LOG;
$conds['rc_log_type'] = 'upload';
$options[] = 'STRAIGHT_JOIN';
}
- if ( !$this->getConfig()->get( 'MiserMode' ) && $this->like !== null ) {
+ $likeVal = $opts->getValue( 'like' );
+ if ( !$this->getConfig()->get( 'MiserMode' ) && $likeVal !== '' ) {
$dbr = wfGetDB( DB_SLAVE );
- $likeObj = Title::newFromText( $this->like );
+ $likeObj = Title::newFromText( $likeVal );
if ( $likeObj instanceof Title ) {
$like = $dbr->buildLike(
$dbr->anyString(),
. "</i><br />\n"
);
}
-
- function getForm() {
- $fields = [
- 'like' => [
- 'type' => 'text',
- 'label-message' => 'newimages-label',
- 'name' => 'like',
- ],
- 'showbots' => [
- 'type' => 'check',
- 'label-message' => 'newimages-showbots',
- 'name' => 'showbots',
- ],
- 'hidepatrolled' => [
- 'type' => 'check',
- 'label-message' => 'newimages-hidepatrolled',
- 'name' => 'hidepatrolled',
- ],
- 'limit' => [
- 'type' => 'hidden',
- 'default' => $this->mLimit,
- 'name' => 'limit',
- ],
- 'offset' => [
- 'type' => 'hidden',
- 'default' => $this->getRequest()->getText( 'offset' ),
- 'name' => 'offset',
- ],
- ];
-
- if ( $this->getConfig()->get( 'MiserMode' ) ) {
- unset( $fields['like'] );
- }
-
- if ( !$this->getUser()->useFilePatrol() ) {
- unset( $fields['hidepatrolled'] );
- }
-
- $context = new DerivativeContext( $this->getContext() );
- $context->setTitle( $this->getTitle() ); // Remove subpage
- $form = new HTMLForm( $fields, $context );
-
- $form->setSubmitTextMsg( 'ilsubmit' );
- $form->setSubmitProgressive();
-
- $form->setMethod( 'get' );
- $form->setWrapperLegendMsg( 'newimages-legend' );
-
- return $form;
- }
}
+++ /dev/null
-This directory temporarily hosts pre-AuthManager code as a way of feature-flagging.
-Class names are postfixed with 'PreAuthManager' and SpecialPageFactory adds/removes
-that postfix based on the feature flag.
-
-This is a horrible hack that will only be in place for a few weeks, to allow instant
-rollback while AuthManager is tested in WMF production and major problems are ironed
-out. In the past such issues have been handled via deployment branches, but that
-meant blocking the work of all WMF developers from being deployed. This is hoped
-to be a less disruptive method.
-
+++ /dev/null
-<?php
-/**
- * Implements Special:ChangeEmail
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Let users change their email address.
- *
- * @ingroup SpecialPage
- */
-class SpecialChangeEmailPreAuthManager extends FormSpecialPage {
- /**
- * @var Status
- */
- private $status;
-
- public function __construct() {
- parent::__construct( 'ChangeEmail', 'editmyprivateinfo' );
- }
-
- public function doesWrites() {
- return true;
- }
-
- /**
- * @return bool
- */
- public function isListed() {
- global $wgAuth;
-
- return $wgAuth->allowPropChange( 'emailaddress' );
- }
-
- /**
- * Main execution point
- * @param string $par
- */
- function execute( $par ) {
- $out = $this->getOutput();
- $out->disallowUserJs();
-
- parent::execute( $par );
- }
-
- protected function checkExecutePermissions( User $user ) {
- global $wgAuth;
-
- if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) {
- throw new ErrorPageError( 'changeemail', 'cannotchangeemail' );
- }
-
- $this->requireLogin( 'changeemail-no-info' );
-
- // This could also let someone check the current email address, so
- // require both permissions.
- if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
- throw new PermissionsError( 'viewmyprivateinfo' );
- }
-
- parent::checkExecutePermissions( $user );
- }
-
- protected function getFormFields() {
- $user = $this->getUser();
-
- $fields = [
- 'Name' => [
- 'type' => 'info',
- 'label-message' => 'username',
- 'default' => $user->getName(),
- ],
- 'OldEmail' => [
- 'type' => 'info',
- 'label-message' => 'changeemail-oldemail',
- 'default' => $user->getEmail() ?: $this->msg( 'changeemail-none' )->text(),
- ],
- 'NewEmail' => [
- 'type' => 'email',
- 'label-message' => 'changeemail-newemail',
- 'autofocus' => true,
- 'help-message' => 'changeemail-newemail-help',
- ],
- ];
-
- if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) ) {
- $fields['Password'] = [
- 'type' => 'password',
- 'label-message' => 'changeemail-password'
- ];
- }
-
- return $fields;
- }
-
- protected function getDisplayFormat() {
- return 'ooui';
- }
-
- protected function alterForm( HTMLForm $form ) {
- $form->setId( 'mw-changeemail-form' );
- $form->setTableId( 'mw-changeemail-table' );
- $form->setSubmitTextMsg( 'changeemail-submit' );
- $form->addHiddenFields( $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
-
- $form->addHeaderText( $this->msg( 'changeemail-header' )->parseAsBlock() );
- if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) ) {
- $form->addHeaderText( $this->msg( 'changeemail-passwordrequired' )->parseAsBlock() );
- }
- }
-
- public function onSubmit( array $data ) {
- $password = isset( $data['Password'] ) ? $data['Password'] : null;
- $status = $this->attemptChange( $this->getUser(), $password, $data['NewEmail'] );
-
- $this->status = $status;
-
- return $status;
- }
-
- public function onSuccess() {
- $request = $this->getRequest();
-
- $returnto = $request->getVal( 'returnto' );
- $titleObj = $returnto !== null ? Title::newFromText( $returnto ) : null;
- if ( !$titleObj instanceof Title ) {
- $titleObj = Title::newMainPage();
- }
- $query = $request->getVal( 'returntoquery' );
-
- if ( $this->status->value === true ) {
- $this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
- } elseif ( $this->status->value === 'eauth' ) {
- # Notify user that a confirmation email has been sent...
- $this->getOutput()->wrapWikiMsg( "<div class='error' style='clear: both;'>\n$1\n</div>",
- 'eauthentsent', $this->getUser()->getName() );
- // just show the link to go back
- $this->getOutput()->addReturnTo( $titleObj, wfCgiToArray( $query ) );
- }
- }
-
- /**
- * @param User $user
- * @param string $pass
- * @param string $newaddr
- * @return Status
- */
- private function attemptChange( User $user, $pass, $newaddr ) {
- global $wgAuth;
-
- if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) {
- return Status::newFatal( 'invalidemailaddress' );
- }
-
- if ( $newaddr === $user->getEmail() ) {
- return Status::newFatal( 'changeemail-nochange' );
- }
-
- $throttleInfo = LoginForm::incrementLoginThrottle( $user->getName() );
- if ( $throttleInfo ) {
- $lang = $this->getLanguage();
- return Status::newFatal(
- 'changeemail-throttled',
- $lang->formatDuration( $throttleInfo['wait'] )
- );
- }
-
- if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' )
- && !$user->checkTemporaryPassword( $pass )
- && !$user->checkPassword( $pass )
- ) {
- return Status::newFatal( 'wrongpassword' );
- }
-
- LoginForm::clearLoginThrottle( $user->getName() );
-
- $oldaddr = $user->getEmail();
- $status = $user->setEmailWithConfirmation( $newaddr );
- if ( !$status->isGood() ) {
- return $status;
- }
-
- Hooks::run( 'PrefsEmailAudit', [ $user, $oldaddr, $newaddr ] );
-
- $user->saveSettings();
-
- $wgAuth->updateExternalDB( $user );
-
- return $status;
- }
-
- public function requiresUnblock() {
- return false;
- }
-
- protected function getGroupName() {
- return 'users';
- }
-}
+++ /dev/null
-<?php
-/**
- * Implements Special:ChangePassword
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Let users recover their password.
- *
- * @ingroup SpecialPage
- */
-class SpecialChangePasswordPreAuthManager extends FormSpecialPage {
- protected $mUserName;
- protected $mDomain;
-
- // Optional Wikitext Message to show above the password change form
- protected $mPreTextMessage = null;
-
- // label for old password input
- protected $mOldPassMsg = null;
-
- public function __construct() {
- parent::__construct( 'ChangePassword', 'editmyprivateinfo' );
- $this->listed( false );
- }
-
- public function doesWrites() {
- return true;
- }
-
- /**
- * Main execution point
- * @param string|null $par
- */
- function execute( $par ) {
- $this->getOutput()->disallowUserJs();
-
- parent::execute( $par );
- }
-
- protected function checkExecutePermissions( User $user ) {
- parent::checkExecutePermissions( $user );
-
- if ( !$this->getRequest()->wasPosted() ) {
- $this->requireLogin( 'resetpass-no-info' );
- }
- }
-
- /**
- * Set a message at the top of the Change Password form
- * @since 1.23
- * @param Message $msg Message to parse and add to the form header
- */
- public function setChangeMessage( Message $msg ) {
- $this->mPreTextMessage = $msg;
- }
-
- /**
- * Set a message at the top of the Change Password form
- * @since 1.23
- * @param string $msg Message label for old/temp password field
- */
- public function setOldPasswordMessage( $msg ) {
- $this->mOldPassMsg = $msg;
- }
-
- protected function getFormFields() {
- $user = $this->getUser();
- $request = $this->getRequest();
-
- $oldpassMsg = $this->mOldPassMsg;
- if ( $oldpassMsg === null ) {
- $oldpassMsg = $user->isLoggedIn() ? 'oldpassword' : 'resetpass-temp-password';
- }
-
- $fields = [
- 'Name' => [
- 'type' => 'info',
- 'label-message' => 'username',
- 'default' => $request->getVal( 'wpName', $user->getName() ),
- ],
- 'Password' => [
- 'type' => 'password',
- 'label-message' => $oldpassMsg,
- ],
- 'NewPassword' => [
- 'type' => 'password',
- 'label-message' => 'newpassword',
- ],
- 'Retype' => [
- 'type' => 'password',
- 'label-message' => 'retypenew',
- ],
- ];
-
- if ( !$this->getUser()->isLoggedIn() ) {
- $fields['LoginOnChangeToken'] = [
- 'type' => 'hidden',
- 'label' => 'Change Password Token',
- 'default' => LoginForm::getLoginToken()->toString(),
- ];
- }
-
- $extraFields = [];
- Hooks::run( 'ChangePasswordForm', [ &$extraFields ] );
- foreach ( $extraFields as $extra ) {
- list( $name, $label, $type, $default ) = $extra;
- $fields[$name] = [
- 'type' => $type,
- 'name' => $name,
- 'label-message' => $label,
- 'default' => $default,
- ];
- }
-
- if ( !$user->isLoggedIn() ) {
- $fields['Remember'] = [
- 'type' => 'check',
- 'label' => $this->msg( 'remembermypassword' )
- ->numParams(
- ceil( $this->getConfig()->get( 'CookieExpiration' ) / ( 3600 * 24 ) )
- )->text(),
- 'default' => $request->getVal( 'wpRemember' ),
- ];
- }
-
- return $fields;
- }
-
- protected function alterForm( HTMLForm $form ) {
- $form->setId( 'mw-resetpass-form' );
- $form->setTableId( 'mw-resetpass-table' );
- $form->setWrapperLegendMsg( 'resetpass_header' );
- $form->setSubmitTextMsg(
- $this->getUser()->isLoggedIn()
- ? 'resetpass-submit-loggedin'
- : 'resetpass_submit'
- );
- $form->addButton( [
- 'name' => 'wpCancel',
- 'value' => $this->msg( 'resetpass-submit-cancel' )->text()
- ] );
- $form->setHeaderText( $this->msg( 'resetpass_text' )->parseAsBlock() );
- if ( $this->mPreTextMessage instanceof Message ) {
- $form->addPreText( $this->mPreTextMessage->parseAsBlock() );
- }
- $form->addHiddenFields(
- $this->getRequest()->getValues( 'wpName', 'wpDomain', 'returnto', 'returntoquery' ) );
- }
-
- public function onSubmit( array $data ) {
- global $wgAuth;
-
- $request = $this->getRequest();
-
- if ( $request->getCheck( 'wpLoginToken' ) ) {
- // This comes from Special:Userlogin when logging in with a temporary password
- return false;
- }
-
- if ( !$this->getUser()->isLoggedIn()
- && !LoginForm::getLoginToken()->match( $request->getVal( 'wpLoginOnChangeToken' ) )
- ) {
- // Potential CSRF (bug 62497)
- return false;
- }
-
- if ( $request->getCheck( 'wpCancel' ) ) {
- $returnto = $request->getVal( 'returnto' );
- $titleObj = $returnto !== null ? Title::newFromText( $returnto ) : null;
- if ( !$titleObj instanceof Title ) {
- $titleObj = Title::newMainPage();
- }
- $query = $request->getVal( 'returntoquery' );
- $this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
-
- return true;
- }
-
- $this->mUserName = $request->getVal( 'wpName', $this->getUser()->getName() );
- $this->mDomain = $wgAuth->getDomain();
-
- if ( !$wgAuth->allowPasswordChange() ) {
- throw new ErrorPageError( 'changepassword', 'resetpass_forbidden' );
- }
-
- $status = $this->attemptReset( $data['Password'], $data['NewPassword'], $data['Retype'] );
-
- return $status;
- }
-
- public function onSuccess() {
- if ( $this->getUser()->isLoggedIn() ) {
- $this->getOutput()->wrapWikiMsg(
- "<div class=\"successbox\">\n$1\n</div>",
- 'changepassword-success'
- );
- $this->getOutput()->returnToMain();
- } else {
- $request = $this->getRequest();
- LoginForm::clearLoginToken();
- $token = LoginForm::getLoginToken()->toString();
- $data = [
- 'action' => 'submitlogin',
- 'wpName' => $this->mUserName,
- 'wpDomain' => $this->mDomain,
- 'wpLoginToken' => $token,
- 'wpPassword' => $request->getVal( 'wpNewPassword' ),
- ] + $request->getValues( 'wpRemember', 'returnto', 'returntoquery' );
- $login = new LoginForm( new DerivativeRequest( $request, $data, true ) );
- $login->setContext( $this->getContext() );
- $login->execute( null );
- }
- }
-
- /**
- * Checks the new password if it meets the requirements for passwords and set
- * it as a current password, otherwise set the passed Status object to fatal
- * and doesn't change anything
- *
- * @param string $oldpass The current (temporary) password.
- * @param string $newpass The password to set.
- * @param string $retype The string of the retype password field to check with newpass
- * @return Status
- */
- protected function attemptReset( $oldpass, $newpass, $retype ) {
- $isSelf = ( $this->mUserName === $this->getUser()->getName() );
- if ( $isSelf ) {
- $user = $this->getUser();
- } else {
- $user = User::newFromName( $this->mUserName );
- }
-
- if ( !$user || $user->isAnon() ) {
- return Status::newFatal( $this->msg( 'nosuchusershort', $this->mUserName ) );
- }
-
- if ( $newpass !== $retype ) {
- Hooks::run( 'PrefsPasswordAudit', [ $user, $newpass, 'badretype' ] );
- return Status::newFatal( $this->msg( 'badretype' ) );
- }
-
- $throttleInfo = LoginForm::incrementLoginThrottle( $this->mUserName );
- if ( $throttleInfo ) {
- return Status::newFatal( $this->msg( 'changepassword-throttled' )
- ->durationParams( $throttleInfo['wait'] )
- );
- }
-
- // @todo Make these separate messages, since the message is written for both cases
- if ( !$user->checkTemporaryPassword( $oldpass ) && !$user->checkPassword( $oldpass ) ) {
- Hooks::run( 'PrefsPasswordAudit', [ $user, $newpass, 'wrongpassword' ] );
- return Status::newFatal( $this->msg( 'resetpass-wrong-oldpass' ) );
- }
-
- // User is resetting their password to their old password
- if ( $oldpass === $newpass ) {
- return Status::newFatal( $this->msg( 'resetpass-recycled' ) );
- }
-
- // Do AbortChangePassword after checking mOldpass, so we don't leak information
- // by possibly aborting a new password before verifying the old password.
- $abortMsg = 'resetpass-abort-generic';
- if ( !Hooks::run( 'AbortChangePassword', [ $user, $oldpass, $newpass, &$abortMsg ] ) ) {
- Hooks::run( 'PrefsPasswordAudit', [ $user, $newpass, 'abortreset' ] );
- return Status::newFatal( $this->msg( $abortMsg ) );
- }
-
- // Please reset throttle for successful logins, thanks!
- LoginForm::clearLoginThrottle( $this->mUserName );
-
- try {
- $user->setPassword( $newpass );
- Hooks::run( 'PrefsPasswordAudit', [ $user, $newpass, 'success' ] );
- } catch ( PasswordError $e ) {
- Hooks::run( 'PrefsPasswordAudit', [ $user, $newpass, 'error' ] );
- return Status::newFatal( new RawMessage( $e->getMessage() ) );
- }
-
- if ( $isSelf ) {
- // This is needed to keep the user connected since
- // changing the password also modifies the user's token.
- $remember = $this->getRequest()->getCookie( 'Token' ) !== null;
- $user->setCookies( null, null, $remember );
- }
- $user->saveSettings();
- $this->resetPasswordExpiration( $user );
- return Status::newGood();
- }
-
- public function requiresUnblock() {
- return false;
- }
-
- protected function getGroupName() {
- return 'users';
- }
-
- /**
- * For resetting user password expiration, until AuthManager comes along
- * @param User $user
- */
- private function resetPasswordExpiration( User $user ) {
- global $wgPasswordExpirationDays;
- $newExpire = null;
- if ( $wgPasswordExpirationDays ) {
- $newExpire = wfTimestamp(
- TS_MW,
- time() + ( $wgPasswordExpirationDays * 24 * 3600 )
- );
- }
- // Give extensions a chance to force an expiration
- Hooks::run( 'ResetPasswordExpiration', [ $this, &$newExpire ] );
- $dbw = wfGetDB( DB_MASTER );
- $dbw->update(
- 'user',
- [ 'user_password_expires' => $dbw->timestampOrNull( $newExpire ) ],
- [ 'user_id' => $user->getId() ],
- __METHOD__
- );
- }
-
- protected function getDisplayFormat() {
- return 'ooui';
- }
-}
+++ /dev/null
-<?php
-/**
- * Redirect page: Special:CreateAccount --> Special:UserLogin/signup.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Redirect page: Special:CreateAccount --> Special:UserLogin/signup.
- * @todo FIXME: This (and the rest of the login frontend) needs to die a horrible painful death
- *
- * @ingroup SpecialPage
- */
-class SpecialCreateAccountPreAuthManager extends SpecialRedirectToSpecial {
- function __construct() {
- parent::__construct(
- 'CreateAccount',
- 'Userlogin',
- 'signup',
- [ 'returnto', 'returntoquery', 'uselang' ]
- );
- }
-
- public function doesWrites() {
- return true;
- }
-
- // No reason to hide this link on Special:Specialpages
- public function isListed() {
- return true;
- }
-
- public function isRestricted() {
- return !User::groupHasPermission( '*', 'createaccount' );
- }
-
- public function userCanExecute( User $user ) {
- return $user->isAllowed( 'createaccount' );
- }
-
- protected function getGroupName() {
- return 'login';
- }
-}
+++ /dev/null
-<?php
-/**
- * Implements Special:PasswordReset
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Special page for requesting a password reset email
- *
- * @ingroup SpecialPage
- */
-class SpecialPasswordResetPreAuthManager extends FormSpecialPage {
- /**
- * @var Message
- */
- private $email;
-
- /**
- * @var User
- */
- private $firstUser;
-
- /**
- * @var Status
- */
- private $result;
-
- /**
- * @var string $method Identifies which password reset field was specified by the user.
- */
- private $method;
-
- public function __construct() {
- parent::__construct( 'PasswordReset', 'editmyprivateinfo' );
- }
-
- public function doesWrites() {
- return true;
- }
-
- public function userCanExecute( User $user ) {
- return $this->canChangePassword( $user ) === true && parent::userCanExecute( $user );
- }
-
- public function checkExecutePermissions( User $user ) {
- $error = $this->canChangePassword( $user );
- if ( is_string( $error ) ) {
- throw new ErrorPageError( 'internalerror', $error );
- } elseif ( !$error ) {
- throw new ErrorPageError( 'internalerror', 'resetpass_forbidden' );
- }
-
- parent::checkExecutePermissions( $user );
- }
-
- protected function getFormFields() {
- global $wgAuth;
- $resetRoutes = $this->getConfig()->get( 'PasswordResetRoutes' );
- $a = [];
- if ( isset( $resetRoutes['username'] ) && $resetRoutes['username'] ) {
- $a['Username'] = [
- 'type' => 'text',
- 'label-message' => 'passwordreset-username',
- ];
-
- if ( $this->getUser()->isLoggedIn() ) {
- $a['Username']['default'] = $this->getUser()->getName();
- }
- }
-
- if ( isset( $resetRoutes['email'] ) && $resetRoutes['email'] ) {
- $a['Email'] = [
- 'type' => 'email',
- 'label-message' => 'passwordreset-email',
- ];
- }
-
- if ( isset( $resetRoutes['domain'] ) && $resetRoutes['domain'] ) {
- $domains = $wgAuth->domainList();
- $a['Domain'] = [
- 'type' => 'select',
- 'options' => $domains,
- 'label-message' => 'passwordreset-domain',
- ];
- }
-
- if ( $this->getUser()->isAllowed( 'passwordreset' ) ) {
- $a['Capture'] = [
- 'type' => 'check',
- 'label-message' => 'passwordreset-capture',
- 'help-message' => 'passwordreset-capture-help',
- ];
- }
-
- return $a;
- }
-
- protected function getDisplayFormat() {
- return 'ooui';
- }
-
- public function alterForm( HTMLForm $form ) {
- $resetRoutes = $this->getConfig()->get( 'PasswordResetRoutes' );
-
- $form->addHiddenFields( $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
-
- $i = 0;
- if ( isset( $resetRoutes['username'] ) && $resetRoutes['username'] ) {
- $i++;
- }
- if ( isset( $resetRoutes['email'] ) && $resetRoutes['email'] ) {
- $i++;
- }
- if ( isset( $resetRoutes['domain'] ) && $resetRoutes['domain'] ) {
- $i++;
- }
-
- $message = ( $i > 1 ) ? 'passwordreset-text-many' : 'passwordreset-text-one';
-
- $form->setHeaderText( $this->msg( $message, $i )->parseAsBlock() );
- $form->setSubmitTextMsg( 'mailmypassword' );
- }
-
- /**
- * Process the form. At this point we know that the user passes all the criteria in
- * userCanExecute(), and if the data array contains 'Username', etc, then Username
- * resets are allowed.
- * @param array $data
- * @throws MWException
- * @throws ThrottledError|PermissionsError
- * @return bool|array
- */
- public function onSubmit( array $data ) {
- global $wgAuth, $wgMinimalPasswordLength;
-
- if ( isset( $data['Domain'] ) ) {
- if ( $wgAuth->validDomain( $data['Domain'] ) ) {
- $wgAuth->setDomain( $data['Domain'] );
- } else {
- $wgAuth->setDomain( 'invaliddomain' );
- }
- }
-
- if ( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
- // The user knows they don't have the passwordreset permission,
- // but they tried to spoof the form. That's naughty
- throw new PermissionsError( 'passwordreset' );
- }
-
- /**
- * @var $firstUser User
- * @var $users User[]
- */
-
- if ( isset( $data['Username'] ) && $data['Username'] !== '' ) {
- $method = 'username';
- $users = [ User::newFromName( $data['Username'] ) ];
- } elseif ( isset( $data['Email'] )
- && $data['Email'] !== ''
- && Sanitizer::validateEmail( $data['Email'] )
- ) {
- $method = 'email';
- $res = wfGetDB( DB_SLAVE )->select(
- 'user',
- User::selectFields(),
- [ 'user_email' => $data['Email'] ],
- __METHOD__
- );
-
- if ( $res ) {
- $users = [];
-
- foreach ( $res as $row ) {
- $users[] = User::newFromRow( $row );
- }
- } else {
- // Some sort of database error, probably unreachable
- throw new MWException( 'Unknown database error in ' . __METHOD__ );
- }
- } else {
- // The user didn't supply any data
- return false;
- }
-
- // Check for hooks (captcha etc), and allow them to modify the users list
- $error = [];
- if ( !Hooks::run( 'SpecialPasswordResetOnSubmit', [ &$users, $data, &$error ] ) ) {
- return [ $error ];
- }
-
- $this->method = $method;
-
- if ( count( $users ) == 0 ) {
- if ( $method == 'email' ) {
- // Don't reveal whether or not an email address is in use
- return true;
- } else {
- return [ 'noname' ];
- }
- }
-
- $firstUser = $users[0];
-
- if ( !$firstUser instanceof User || !$firstUser->getId() ) {
- // Don't parse username as wikitext (bug 65501)
- return [ [ 'nosuchuser', wfEscapeWikiText( $data['Username'] ) ] ];
- }
-
- // Check against the rate limiter
- if ( $this->getUser()->pingLimiter( 'mailpassword' ) ) {
- throw new ThrottledError;
- }
-
- // Check against password throttle
- foreach ( $users as $user ) {
- if ( $user->isPasswordReminderThrottled() ) {
-
- # Round the time in hours to 3 d.p., in case someone is specifying
- # minutes or seconds.
- return [ [
- 'throttled-mailpassword',
- round( $this->getConfig()->get( 'PasswordReminderResendTime' ), 3 )
- ] ];
- }
- }
-
- // All the users will have the same email address
- if ( $firstUser->getEmail() == '' ) {
- // This won't be reachable from the email route, so safe to expose the username
- return [ [ 'noemail', wfEscapeWikiText( $firstUser->getName() ) ] ];
- }
-
- // We need to have a valid IP address for the hook, but per bug 18347, we should
- // send the user's name if they're logged in.
- $ip = $this->getRequest()->getIP();
- if ( !$ip ) {
- return [ 'badipaddress' ];
- }
- $caller = $this->getUser();
- Hooks::run( 'User::mailPasswordInternal', [ &$caller, &$ip, &$firstUser ] );
- $username = $caller->getName();
- $msg = IP::isValid( $username )
- ? 'passwordreset-emailtext-ip'
- : 'passwordreset-emailtext-user';
-
- // Send in the user's language; which should hopefully be the same
- $userLanguage = $firstUser->getOption( 'language' );
-
- $passwords = [];
- foreach ( $users as $user ) {
- $password = PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
- $user->setNewpassword( $password );
- $user->saveSettings();
- $passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password )
- ->inLanguage( $userLanguage )->text(); // We'll escape the whole thing later
- }
- $passwordBlock = implode( "\n\n", $passwords );
-
- $this->email = $this->msg( $msg )->inLanguage( $userLanguage );
- $this->email->params(
- $username,
- $passwordBlock,
- count( $passwords ),
- '<' . Title::newMainPage()->getCanonicalURL() . '>',
- round( $this->getConfig()->get( 'NewPasswordExpiry' ) / 86400 )
- );
-
- $title = $this->msg( 'passwordreset-emailtitle' )->inLanguage( $userLanguage );
-
- $this->result = $firstUser->sendMail( $title->text(), $this->email->text() );
-
- if ( isset( $data['Capture'] ) && $data['Capture'] ) {
- // Save the user, will be used if an error occurs when sending the email
- $this->firstUser = $firstUser;
- } else {
- // Blank the email if the user is not supposed to see it
- $this->email = null;
- }
-
- if ( $this->result->isGood() ) {
- return true;
- } elseif ( isset( $data['Capture'] ) && $data['Capture'] ) {
- // The email didn't send, but maybe they knew that and that's why they captured it
- return true;
- } else {
- // @todo FIXME: The email wasn't sent, but we have already set
- // the password throttle timestamp, so they won't be able to try
- // again until it expires... :(
- return [ [ 'mailerror', $this->result->getMessage() ] ];
- }
- }
-
- public function onSuccess() {
- if ( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ) {
- // @todo Logging
-
- if ( $this->result->isGood() ) {
- $this->getOutput()->addWikiMsg( 'passwordreset-emailsent-capture' );
- } else {
- $this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture',
- $this->result->getMessage(), $this->firstUser->getName() );
- }
-
- $this->getOutput()->addHTML( Html::rawElement( 'pre', [], $this->email->escaped() ) );
- }
-
- if ( $this->method === 'email' ) {
- $this->getOutput()->addWikiMsg( 'passwordreset-emailsentemail' );
- } else {
- $this->getOutput()->addWikiMsg( 'passwordreset-emailsentusername' );
- }
-
- $this->getOutput()->returnToMain();
- }
-
- protected function canChangePassword( User $user ) {
- global $wgAuth;
- $resetRoutes = $this->getConfig()->get( 'PasswordResetRoutes' );
-
- // Maybe password resets are disabled, or there are no allowable routes
- if ( !is_array( $resetRoutes ) ||
- !in_array( true, array_values( $resetRoutes ) )
- ) {
- return 'passwordreset-disabled';
- }
-
- // Maybe the external auth plugin won't allow local password changes
- if ( !$wgAuth->allowPasswordChange() ) {
- return 'resetpass_forbidden';
- }
-
- // Maybe email features have been disabled
- if ( !$this->getConfig()->get( 'EnableEmail' ) ) {
- return 'passwordreset-emaildisabled';
- }
-
- // Maybe the user is blocked (check this here rather than relying on the parent
- // method as we have a more specific error message to use here
- if ( $user->isBlocked() ) {
- return 'blocked-mailpassword';
- }
-
- return true;
- }
-
- /**
- * Hide the password reset page if resets are disabled.
- * @return bool
- */
- function isListed() {
- if ( $this->canChangePassword( $this->getUser() ) === true ) {
- return parent::isListed();
- }
-
- return false;
- }
-
- protected function getGroupName() {
- return 'users';
- }
-}
+++ /dev/null
-<?php
-/**
- * Implements Special:UserLogin
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-use MediaWiki\Logger\LoggerFactory;
-use Psr\Log\LogLevel;
-use MediaWiki\Session\SessionManager;
-
-/**
- * Implements Special:UserLogin
- *
- * @ingroup SpecialPage
- */
-class LoginFormPreAuthManager extends SpecialPage {
- const SUCCESS = 0;
- const NO_NAME = 1;
- const ILLEGAL = 2;
- const WRONG_PLUGIN_PASS = 3;
- const NOT_EXISTS = 4;
- const WRONG_PASS = 5;
- const EMPTY_PASS = 6;
- const RESET_PASS = 7;
- const ABORTED = 8;
- const CREATE_BLOCKED = 9;
- const THROTTLED = 10;
- const USER_BLOCKED = 11;
- const NEED_TOKEN = 12;
- const WRONG_TOKEN = 13;
- const USER_MIGRATED = 14;
-
- public static $statusCodes = [
- self::SUCCESS => 'success',
- self::NO_NAME => 'no_name',
- self::ILLEGAL => 'illegal',
- self::WRONG_PLUGIN_PASS => 'wrong_plugin_pass',
- self::NOT_EXISTS => 'not_exists',
- self::WRONG_PASS => 'wrong_pass',
- self::EMPTY_PASS => 'empty_pass',
- self::RESET_PASS => 'reset_pass',
- self::ABORTED => 'aborted',
- self::CREATE_BLOCKED => 'create_blocked',
- self::THROTTLED => 'throttled',
- self::USER_BLOCKED => 'user_blocked',
- self::NEED_TOKEN => 'need_token',
- self::WRONG_TOKEN => 'wrong_token',
- self::USER_MIGRATED => 'user_migrated',
- ];
-
- /**
- * 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 = [
- 'exception-nologin-text',
- 'watchlistanontext',
- 'changeemail-no-info',
- 'resetpass-no-info',
- 'confirmemail_needlogin',
- 'prefsnologintext2',
- ];
-
- public $mAbortLoginErrorMsg = null;
- /**
- * @var int How many seconds user is throttled for
- * @since 1.27
- */
- public $mThrottleWait = '?';
-
- protected $mUsername;
- protected $mPassword;
- protected $mRetype;
- protected $mReturnTo;
- protected $mCookieCheck;
- protected $mPosted;
- protected $mAction;
- protected $mCreateaccount;
- protected $mCreateaccountMail;
- protected $mLoginattempt;
- protected $mRemember;
- protected $mEmail;
- protected $mDomain;
- protected $mLanguage;
- protected $mSkipCookieCheck;
- protected $mReturnToQuery;
- protected $mToken;
- protected $mStickHTTPS;
- protected $mType;
- protected $mReason;
- protected $mRealName;
- protected $mEntryError = '';
- protected $mEntryErrorType = 'error';
-
- private $mTempPasswordUsed;
- private $mLoaded = false;
- private $mSecureLoginUrl;
-
- /** @var WebRequest */
- private $mOverrideRequest = null;
-
- /** @var WebRequest Effective request; set at the beginning of load */
- private $mRequest = null;
-
- /**
- * @param WebRequest $request
- */
- public function __construct( $request = null ) {
- global $wgUseMediaWikiUIEverywhere;
- parent::__construct( 'Userlogin' );
-
- $this->mOverrideRequest = $request;
- // Override UseMediaWikiEverywhere to true, to force login and create form to use mw ui
- $wgUseMediaWikiUIEverywhere = true;
- }
-
- public function doesWrites() {
- return true;
- }
-
- /**
- * Returns an array of all valid error messages.
- *
- * @return array
- */
- public static function getValidErrorMessages() {
- static $messages = null;
- if ( !$messages ) {
- $messages = self::$validErrorMessages;
- Hooks::run( 'LoginFormValidErrorMessages', [ &$messages ] );
- }
-
- return $messages;
- }
-
- /**
- * Loader
- */
- function load() {
- global $wgAuth, $wgHiddenPrefs, $wgEnableEmail;
-
- if ( $this->mLoaded ) {
- return;
- }
- $this->mLoaded = true;
-
- if ( $this->mOverrideRequest === null ) {
- $request = $this->getRequest();
- } else {
- $request = $this->mOverrideRequest;
- }
- $this->mRequest = $request;
-
- $this->mType = $request->getText( 'type' );
- $this->mUsername = $request->getText( 'wpName' );
- $this->mPassword = $request->getText( 'wpPassword' );
- $this->mRetype = $request->getText( 'wpRetype' );
- $this->mDomain = $request->getText( 'wpDomain' );
- $this->mReason = $request->getText( 'wpReason' );
- $this->mCookieCheck = $request->getVal( 'wpCookieCheck' );
- $this->mPosted = $request->wasPosted();
- $this->mCreateaccountMail = $request->getCheck( 'wpCreateaccountMail' )
- && $wgEnableEmail;
- $this->mCreateaccount = $request->getCheck( 'wpCreateaccount' ) && !$this->mCreateaccountMail;
- $this->mLoginattempt = $request->getCheck( 'wpLoginattempt' );
- $this->mAction = $request->getVal( 'action' );
- $this->mRemember = $request->getCheck( 'wpRemember' );
- $this->mFromHTTP = $request->getBool( 'fromhttp', false )
- || $request->getBool( 'wpFromhttp', false );
- $this->mStickHTTPS = ( !$this->mFromHTTP && $request->getProtocol() === 'https' )
- || $request->getBool( 'wpForceHttps', false );
- $this->mLanguage = $request->getText( 'uselang' );
- $this->mSkipCookieCheck = $request->getCheck( 'wpSkipCookieCheck' );
- $this->mToken = $this->mType == 'signup'
- ? $request->getVal( 'wpCreateaccountToken' )
- : $request->getVal( 'wpLoginToken' );
- $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(),
- [],
- [
- '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::getValidErrorMessages() )
- ) {
- $this->mEntryErrorType = 'error';
- $this->mEntryError = $entryError->rawParams( $loginreqlink )->parse();
-
- } elseif ( $entryWarning->exists()
- && in_array( $entryWarning->getKey(), self::getValidErrorMessages() )
- ) {
- $this->mEntryErrorType = 'warning';
- $this->mEntryError = $entryWarning->rawParams( $loginreqlink )->parse();
- }
-
- if ( $wgEnableEmail ) {
- $this->mEmail = $request->getText( 'wpEmail' );
- } else {
- $this->mEmail = '';
- }
- if ( !in_array( 'realname', $wgHiddenPrefs ) ) {
- $this->mRealName = $request->getText( 'wpRealName' );
- } else {
- $this->mRealName = '';
- }
-
- if ( !$wgAuth->validDomain( $this->mDomain ) ) {
- $this->mDomain = $wgAuth->getDomain();
- }
- $wgAuth->setDomain( $this->mDomain );
-
- # 1. When switching accounts, it sucks to get automatically logged out
- # 2. Do not return to PasswordReset after a successful password change
- # but goto Wiki start page (Main_Page) instead ( bug 33997 )
- $returnToTitle = Title::newFromText( $this->mReturnTo );
- if ( is_object( $returnToTitle )
- && ( $returnToTitle->isSpecial( 'Userlogout' )
- || $returnToTitle->isSpecial( 'PasswordReset' ) )
- ) {
- $this->mReturnTo = '';
- $this->mReturnToQuery = '';
- }
- }
-
- function getDescription() {
- if ( $this->mType === 'signup' ) {
- return $this->msg( 'createaccount' )->text();
- } else {
- return $this->msg( 'login' )->text();
- }
- }
-
- /**
- * @param string|null $subPage
- */
- public function execute( $subPage ) {
- // Make sure session is persisted
- $session = SessionManager::getGlobalSession();
- $session->persist();
-
- $this->load();
-
- // Check for [[Special:Userlogin/signup]]. This affects form display and
- // page title.
- if ( $subPage == 'signup' ) {
- $this->mType = 'signup';
- }
- $this->setHeaders();
-
- // Make sure it's possible to log in
- if ( $this->mType !== 'signup' && !$session->canSetUser() ) {
- throw new ErrorPageError(
- 'cannotloginnow-title',
- 'cannotloginnow-text',
- [
- $session->getProvider()->describe( RequestContext::getMain()->getLanguage() )
- ]
- );
- }
-
- /**
- * In the case where the user is already logged in, and was redirected to
- * the login form from a page that requires login, 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.
- *
- * However, do show the form if it was visited intentionally (no 'returnto'
- * is present). People who often switch between several accounts have grown
- * accustomed to this behavior.
- */
- if (
- $this->mType !== 'signup' &&
- !$this->mPosted &&
- $this->getUser()->isLoggedIn() &&
- ( $this->mReturnTo !== '' || $this->mReturnToQuery !== '' )
- ) {
- $this->successfulLogin();
- }
-
- // If logging in and not on HTTPS, either redirect to it or offer a link.
- global $wgSecureLogin;
- if ( $this->mRequest->getProtocol() !== 'https' ) {
- $title = $this->getFullTitle();
- $query = [
- 'returnto' => $this->mReturnTo !== '' ? $this->mReturnTo : null,
- '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
- && wfCanIPUseHTTPS( $this->getRequest()->getIP() )
- && !$this->mFromHTTP ) // Avoid infinite redirect
- {
- $url = wfAppendQuery( $url, 'fromhttp=1' );
- $this->getOutput()->redirect( $url );
- // Since we only do this redir to change proto, always vary
- $this->getOutput()->addVaryHeader( 'X-Forwarded-Proto' );
-
- return;
- } else {
- // A wiki without HTTPS login support should set $wgServer to
- // http://somehost, in which case the secure URL generated
- // above won't actually start with https://
- if ( substr( $url, 0, 8 ) === 'https://' ) {
- $this->mSecureLoginUrl = $url;
- }
- }
- }
-
- if ( !is_null( $this->mCookieCheck ) ) {
- $this->onCookieRedirectCheck( $this->mCookieCheck );
-
- return;
- } elseif ( $this->mPosted ) {
- if ( $this->mCreateaccount ) {
- $this->addNewAccount();
-
- return;
- } elseif ( $this->mCreateaccountMail ) {
- $this->addNewAccountMailPassword();
-
- return;
- } elseif ( ( 'submitlogin' == $this->mAction ) || $this->mLoginattempt ) {
- $this->processLogin();
-
- return;
- }
- }
- $this->mainLoginForm( $this->mEntryError, $this->mEntryErrorType );
- }
-
- /**
- * @private
- */
- function addNewAccountMailPassword() {
- if ( $this->mEmail == '' ) {
- $this->mainLoginForm( $this->msg( 'noemailcreate' )->escaped() );
-
- return;
- }
-
- $status = $this->addNewAccountInternal();
- LoggerFactory::getInstance( 'authmanager' )->info(
- 'Account creation attempt with mailed password',
- [ 'event' => 'accountcreation', 'status' => $status ]
- );
- if ( !$status->isGood() ) {
- $error = $status->getMessage();
- $this->mainLoginForm( $error->toString() );
-
- return;
- }
-
- /** @var User $u */
- $u = $status->getValue();
-
- // Wipe the initial password and mail a temporary one
- $u->setPassword( null );
- $u->saveSettings();
- $result = $this->mailPasswordInternal( $u, false, 'createaccount-title', 'createaccount-text' );
-
- Hooks::run( 'AddNewAccount', [ $u, true ] );
- $u->addNewUserLogEntry( 'byemail', $this->mReason );
-
- $out = $this->getOutput();
- $out->setPageTitle( $this->msg( 'accmailtitle' ) );
-
- if ( !$result->isGood() ) {
- $this->mainLoginForm( $this->msg( 'mailerror', $result->getWikiText() )->text() );
- } else {
- $out->addWikiMsg( 'accmailtext', $u->getName(), $u->getEmail() );
- $this->executeReturnTo( 'success' );
- }
- }
-
- /**
- * @private
- * @return bool
- */
- function addNewAccount() {
- global $wgContLang, $wgUser, $wgEmailAuthentication, $wgLoginLanguageSelector;
-
- # Create the account and abort if there's a problem doing so
- $status = $this->addNewAccountInternal();
- LoggerFactory::getInstance( 'authmanager' )->info( 'Account creation attempt', [
- 'event' => 'accountcreation',
- 'status' => $status,
- ] );
-
- if ( !$status->isGood() ) {
- $error = $status->getMessage();
- $this->mainLoginForm( $error->toString() );
-
- return false;
- }
-
- $u = $status->getValue();
-
- # Only save preferences if the user is not creating an account for someone else.
- if ( $this->getUser()->isAnon() ) {
- # If we showed up language selection links, and one was in use, be
- # smart (and sensible) and save that language as the user's preference
- if ( $wgLoginLanguageSelector && $this->mLanguage ) {
- $u->setOption( 'language', $this->mLanguage );
- } else {
-
- # Otherwise the user's language preference defaults to $wgContLang,
- # but it may be better to set it to their preferred $wgContLang variant,
- # based on browser preferences or URL parameters.
- $u->setOption( 'language', $wgContLang->getPreferredVariant() );
- }
- if ( $wgContLang->hasVariants() ) {
- $u->setOption( 'variant', $wgContLang->getPreferredVariant() );
- }
- }
-
- $out = $this->getOutput();
-
- # Send out an email authentication message if needed
- if ( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
- $status = $u->sendConfirmationMail();
- if ( $status->isGood() ) {
- $out->addWikiMsg( 'confirmemail_oncreate' );
- } else {
- $out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
- }
- }
-
- # Save settings (including confirmation token)
- $u->saveSettings();
-
- # If not logged in, assume the new account as the current one and set
- # session cookies then show a "welcome" message or a "need cookies"
- # message as needed
- if ( $this->getUser()->isAnon() ) {
- $u->setCookies();
- $wgUser = $u;
- // This should set it for OutputPage and the Skin
- // which is needed or the personal links will be
- // wrong.
- $this->getContext()->setUser( $u );
- Hooks::run( 'AddNewAccount', [ $u, false ] );
- $u->addNewUserLogEntry( 'create' );
- if ( $this->hasSessionCookie() ) {
- $this->successfulCreation();
- } else {
- $this->cookieRedirectCheck( 'new' );
- }
- } else {
- # Confirm that the account was created
- $out->setPageTitle( $this->msg( 'accountcreated' ) );
- $out->addWikiMsg( 'accountcreatedtext', $u->getName() );
- $out->addReturnTo( $this->getPageTitle() );
- Hooks::run( 'AddNewAccount', [ $u, false ] );
- $u->addNewUserLogEntry( 'create2', $this->mReason );
- }
-
- return true;
- }
-
- /**
- * Make a new user account using the loaded data.
- * @private
- * @throws PermissionsError|ReadOnlyError
- * @return Status
- */
- public function addNewAccountInternal() {
- global $wgAuth, $wgAccountCreationThrottle, $wgEmailConfirmToEdit;
-
- // If the user passes an invalid domain, something is fishy
- if ( !$wgAuth->validDomain( $this->mDomain ) ) {
- return Status::newFatal( 'wrongpassword' );
- }
-
- // If we are not allowing users to login locally, we should be checking
- // to see if the user is actually able to authenticate to the authenti-
- // cation server before they create an account (otherwise, they can
- // create a local account and login as any domain user). We only need
- // to check this for domains that aren't local.
- if ( 'local' != $this->mDomain && $this->mDomain != '' ) {
- if (
- !$wgAuth->canCreateAccounts() &&
- (
- !$wgAuth->userExists( $this->mUsername ) ||
- !$wgAuth->authenticate( $this->mUsername, $this->mPassword )
- )
- ) {
- return Status::newFatal( 'wrongpassword' );
- }
- }
-
- if ( wfReadOnly() ) {
- throw new ReadOnlyError;
- }
-
- # Request forgery checks.
- $token = self::getCreateaccountToken();
- if ( $token->wasNew() ) {
- return Status::newFatal( 'nocookiesfornew' );
- }
-
- # The user didn't pass a createaccount token
- if ( !$this->mToken ) {
- return Status::newFatal( 'sessionfailure' );
- }
-
- # Validate the createaccount token
- if ( !$token->match( $this->mToken ) ) {
- return Status::newFatal( 'sessionfailure' );
- }
-
- # Check permissions
- $currentUser = $this->getUser();
- $creationBlock = $currentUser->isBlockedFromCreateAccount();
- if ( !$currentUser->isAllowed( 'createaccount' ) ) {
- throw new PermissionsError( 'createaccount' );
- } elseif ( $creationBlock instanceof Block ) {
- // Throws an ErrorPageError.
- $this->userBlockedMessage( $creationBlock );
-
- // This should never be reached.
- return false;
- }
-
- # Include checks that will include GlobalBlocking (Bug 38333)
- $permErrors = $this->getPageTitle()->getUserPermissionsErrors(
- 'createaccount',
- $currentUser,
- true
- );
-
- if ( count( $permErrors ) ) {
- throw new PermissionsError( 'createaccount', $permErrors );
- }
-
- $ip = $this->getRequest()->getIP();
- if ( $currentUser->isDnsBlacklisted( $ip, true /* check $wgProxyWhitelist */ ) ) {
- return Status::newFatal( 'sorbs_create_account_reason' );
- }
-
- # Now create a dummy user ($u) and check if it is valid
- $u = User::newFromName( $this->mUsername, 'creatable' );
- if ( !$u ) {
- return Status::newFatal( 'noname' );
- }
-
- $cache = ObjectCache::getLocalClusterInstance();
- # Make sure the user does not exist already
- $lock = $cache->getScopedLock( $cache->makeGlobalKey( 'account', md5( $this->mUsername ) ) );
- if ( !$lock ) {
- return Status::newFatal( 'usernameinprogress' );
- } elseif ( $u->idForName( User::READ_LOCKING ) ) {
- return Status::newFatal( 'userexists' );
- }
-
- if ( $this->mCreateaccountMail ) {
- # do not force a password for account creation by email
- # set invalid password, it will be replaced later by a random generated password
- $this->mPassword = null;
- } else {
- if ( $this->mPassword !== $this->mRetype ) {
- return Status::newFatal( 'badretype' );
- }
-
- # check for password validity, return a fatal Status if invalid
- $validity = $u->checkPasswordValidity( $this->mPassword, 'create' );
- if ( !$validity->isGood() ) {
- $validity->ok = false; // make sure this Status is fatal
- return $validity;
- }
- }
-
- # if you need a confirmed email address to edit, then obviously you
- # need an email address.
- if ( $wgEmailConfirmToEdit && strval( $this->mEmail ) === '' ) {
- return Status::newFatal( 'noemailtitle' );
- }
-
- if ( strval( $this->mEmail ) !== '' && !Sanitizer::validateEmail( $this->mEmail ) ) {
- return Status::newFatal( 'invalidemailaddress' );
- }
-
- # Set some additional data so the AbortNewAccount hook can be used for
- # more than just username validation
- $u->setEmail( $this->mEmail );
- $u->setRealName( $this->mRealName );
-
- $abortError = '';
- $abortStatus = null;
- if ( !Hooks::run( 'AbortNewAccount', [ $u, &$abortError, &$abortStatus ] ) ) {
- // Hook point to add extra creation throttles and blocks
- wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
- if ( $abortStatus === null ) {
- // Report back the old string as a raw message status.
- // This will report the error back as 'createaccount-hook-aborted'
- // with the given string as the message.
- // To return a different error code, return a Status object.
- $abortError = new Message( 'createaccount-hook-aborted', [ $abortError ] );
- $abortError->text();
-
- return Status::newFatal( $abortError );
- } else {
- // For MediaWiki 1.23+ and updated hooks, return the Status object
- // returned from the hook.
- return $abortStatus;
- }
- }
-
- // Hook point to check for exempt from account creation throttle
- if ( !Hooks::run( 'ExemptFromAccountCreationThrottle', [ $ip ] ) ) {
- wfDebug( "LoginForm::exemptFromAccountCreationThrottle: a hook " .
- "allowed account creation w/o throttle\n" );
- } else {
- if ( ( $wgAccountCreationThrottle && $currentUser->isPingLimitable() ) ) {
- $key = wfGlobalCacheKey( 'acctcreate', 'ip', $ip );
- $value = $cache->get( $key );
- if ( !$value ) {
- $cache->set( $key, 0, $cache::TTL_DAY );
- }
- if ( $value >= $wgAccountCreationThrottle ) {
- return Status::newFatal( 'acct_creation_throttle_hit', $wgAccountCreationThrottle );
- }
- $cache->incr( $key );
- }
- }
-
- if ( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
- return Status::newFatal( 'externaldberror' );
- }
-
- self::clearCreateaccountToken();
-
- return $this->initUser( $u, false );
- }
-
- /**
- * Actually add a user to the database.
- * Give it a User object that has been initialised with a name.
- *
- * @param User $u
- * @param bool $autocreate True if this is an autocreation via auth plugin
- * @return Status Status object, with the User object in the value member on success
- * @private
- */
- function initUser( $u, $autocreate ) {
- global $wgAuth;
-
- $status = $u->addToDatabase();
- if ( !$status->isOK() ) {
- return $status;
- }
-
- if ( $wgAuth->allowPasswordChange() ) {
- $u->setPassword( $this->mPassword );
- }
-
- $u->setEmail( $this->mEmail );
- $u->setRealName( $this->mRealName );
- $u->setToken();
-
- Hooks::run( 'LocalUserCreated', [ $u, $autocreate ] );
- $oldUser = $u;
- $wgAuth->initUser( $u, $autocreate );
- if ( $oldUser !== $u ) {
- wfWarn( get_class( $wgAuth ) . '::initUser() replaced the user object' );
- }
-
- $u->saveSettings();
-
- // Update user count
- DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 0, 0, 0, 1 ) );
-
- // Watch user's userpage and talk page
- $u->addWatch( $u->getUserPage(), User::IGNORE_USER_RIGHTS );
-
- return Status::newGood( $u );
- }
-
- /**
- * Internally authenticate the login request.
- *
- * This may create a local account as a side effect if the
- * authentication plugin allows transparent local account
- * creation.
- * @return int
- */
- public function authenticateUserData() {
- global $wgUser, $wgAuth;
-
- $this->load();
-
- if ( $this->mUsername == '' ) {
- return self::NO_NAME;
- }
-
- // We require a login token to prevent login CSRF
- // Handle part of this before incrementing the throttle so
- // token-less login attempts don't count towards the throttle
- // but wrong-token attempts do.
-
- // If the user doesn't have a login token yet, set one.
- $token = self::getLoginToken();
- if ( $token->wasNew() ) {
- return self::NEED_TOKEN;
- }
- // If the user didn't pass a login token, tell them we need one
- if ( !$this->mToken ) {
- return self::NEED_TOKEN;
- }
-
- $throttleCount = self::incrementLoginThrottle( $this->mUsername );
- if ( $throttleCount ) {
- $this->mThrottleWait = $throttleCount['wait'];
- return self::THROTTLED;
- }
-
- // Validate the login token
- if ( !$token->match( $this->mToken ) ) {
- return self::WRONG_TOKEN;
- }
-
- // Load the current user now, and check to see if we're logging in as
- // the same name. This is necessary because loading the current user
- // (say by calling getName()) calls the UserLoadFromSession hook, which
- // potentially creates the user in the database. Until we load $wgUser,
- // checking for user existence using User::newFromName($name)->getId() below
- // will effectively be using stale data.
- if ( $this->getUser()->getName() === $this->mUsername ) {
- wfDebug( __METHOD__ . ": already logged in as {$this->mUsername}\n" );
-
- return self::SUCCESS;
- }
-
- $u = User::newFromName( $this->mUsername );
- if ( $u === false ) {
- return self::ILLEGAL;
- }
-
- $msg = null;
- // Give extensions a way to indicate the username has been updated,
- // rather than telling the user the account doesn't exist.
- if ( !Hooks::run( 'LoginUserMigrated', [ $u, &$msg ] ) ) {
- $this->mAbortLoginErrorMsg = $msg;
- return self::USER_MIGRATED;
- }
-
- if ( !User::isUsableName( $u->getName() ) ) {
- return self::ILLEGAL;
- }
-
- $isAutoCreated = false;
- if ( $u->getId() == 0 ) {
- $status = $this->attemptAutoCreate( $u );
- if ( $status !== self::SUCCESS ) {
- return $status;
- } else {
- $isAutoCreated = true;
- }
- } else {
- $u->load();
- }
-
- // Give general extensions, such as a captcha, a chance to abort logins
- $abort = self::ABORTED;
- if ( !Hooks::run( 'AbortLogin', [ $u, $this->mPassword, &$abort, &$msg ] ) ) {
- if ( !in_array( $abort, array_keys( self::$statusCodes ), true ) ) {
- throw new Exception( 'Invalid status code returned from AbortLogin hook: ' . $abort );
- }
- $this->mAbortLoginErrorMsg = $msg;
- return $abort;
- }
-
- global $wgBlockDisablesLogin;
- if ( !$u->checkPassword( $this->mPassword ) ) {
- if ( $u->checkTemporaryPassword( $this->mPassword ) ) {
- /**
- * The e-mailed temporary password should not be used for actu-
- * al logins; that's a very sloppy habit, and insecure if an
- * attacker has a few seconds to click "search" on someone's
- * open mail reader.
- *
- * Allow it to be used only to reset the password a single time
- * to a new value, which won't be in the user's e-mail ar-
- * chives.
- *
- * For backwards compatibility, we'll still recognize it at the
- * login form to minimize surprises for people who have been
- * logging in with a temporary password for some time.
- *
- * As a side-effect, we can authenticate the user's e-mail ad-
- * dress if it's not already done, since the temporary password
- * was sent via e-mail.
- */
- if ( !$u->isEmailConfirmed() && !wfReadOnly() ) {
- $u->confirmEmail();
- $u->saveSettings();
- }
-
- // At this point we just return an appropriate code/ indicating
- // that the UI should show a password reset form; bot inter-
- // faces etc will probably just fail cleanly here.
- $this->mAbortLoginErrorMsg = 'resetpass-temp-emailed';
- $this->mTempPasswordUsed = true;
- $retval = self::RESET_PASS;
- } else {
- $retval = ( $this->mPassword == '' ) ? self::EMPTY_PASS : self::WRONG_PASS;
- }
- } elseif ( $wgBlockDisablesLogin && $u->isBlocked() ) {
- // If we've enabled it, make it so that a blocked user cannot login
- $retval = self::USER_BLOCKED;
- } elseif ( $this->checkUserPasswordExpired( $u ) == 'hard' ) {
- // Force reset now, without logging in
- $retval = self::RESET_PASS;
- $this->mAbortLoginErrorMsg = 'resetpass-expired';
- } else {
- Hooks::run( 'UserLoggedIn', [ $u ] );
- $oldUser = $u;
- $wgAuth->updateUser( $u );
- if ( $oldUser !== $u ) {
- wfWarn( get_class( $wgAuth ) . '::updateUser() replaced the user object' );
- }
- $wgUser = $u;
- // This should set it for OutputPage and the Skin
- // which is needed or the personal links will be
- // wrong.
- $this->getContext()->setUser( $u );
-
- // Please reset throttle for successful logins, thanks!
- self::clearLoginThrottle( $this->mUsername );
-
- if ( $isAutoCreated ) {
- // Must be run after $wgUser is set, for correct new user log
- Hooks::run( 'AuthPluginAutoCreate', [ $u ] );
- }
-
- $retval = self::SUCCESS;
- }
- Hooks::run( 'LoginAuthenticateAudit', [ $u, $this->mPassword, $retval ] );
-
- return $retval;
- }
-
- /**
- * Increment the login attempt throttle hit count for the (username,current IP)
- * tuple unless the throttle was already reached.
- *
- * @since 1.27 Return value changed.
- * @param string $username The user name
- * @return bool|array false if below limit or an array if above limit
- * Array contains keys wait, count, and throttleIndex
- */
- public static function incrementLoginThrottle( $username ) {
- global $wgPasswordAttemptThrottle, $wgRequest;
- $canUsername = User::getCanonicalName( $username, 'usable' );
- $username = $canUsername !== false ? $canUsername : $username;
-
- $throttleCount = 0;
- if ( is_array( $wgPasswordAttemptThrottle ) ) {
- $throttleConfig = $wgPasswordAttemptThrottle;
- if ( isset( $wgPasswordAttemptThrottle['count'] ) ) {
- // old style. Convert for backwards compat.
- $throttleConfig = [ $wgPasswordAttemptThrottle ];
- }
- foreach ( $throttleConfig as $index => $specificThrottle ) {
- if ( isset( $specificThrottle['allIPs'] ) ) {
- $ip = 'All';
- } else {
- $ip = $wgRequest->getIP();
- }
- $throttleKey = wfGlobalCacheKey( 'password-throttle',
- $index, $ip, md5( $username )
- );
- $count = $specificThrottle['count'];
- $period = $specificThrottle['seconds'];
-
- $cache = ObjectCache::getLocalClusterInstance();
- $throttleCount = $cache->get( $throttleKey );
- if ( !$throttleCount ) {
- $cache->add( $throttleKey, 1, $period ); // start counter
- } elseif ( $throttleCount < $count ) {
- $cache->incr( $throttleKey );
- } elseif ( $throttleCount >= $count ) {
- $logMsg = 'Login attempt rejected because logins to '
- . '{acct} from IP {ip} have been throttled for '
- . '{period} seconds due to {count} failed attempts';
- // If we are hitting a throttle for >= 50 attempts,
- // it is much more likely to be an attack than someone
- // simply forgetting their password, so log it at a
- // higher level.
- $level = $count >= 50 ? LogLevel::WARNING : LogLevel::INFO;
- // It should be noted that once the throttle is hit,
- // every attempt to login will generate the log message
- // until the throttle expires, not just the attempt that
- // puts the throttle over the top.
- LoggerFactory::getInstance( 'password-throttle' )->log(
- $level,
- $logMsg,
- [
- 'ip' => $ip,
- 'period' => $period,
- 'acct' => $username,
- 'count' => $count,
- 'throttleIdentifier' => $index,
- 'method' => __METHOD__
- ]
- );
-
- return [
- 'throttleIndex' => $index,
- 'wait' => $period,
- 'count' => $count
- ];
- }
- }
- }
- return false;
- }
-
- /**
- * Increment the login attempt throttle hit count for the (username,current IP)
- * tuple unless the throttle was already reached.
- *
- * @deprecated Use LoginForm::incrementLoginThrottle instead
- * @param string $username The user name
- * @return bool|int true if above throttle, or 0 (prior to 1.27, returned current count)
- */
- public static function incLoginThrottle( $username ) {
- wfDeprecated( __METHOD__, "1.27" );
- $res = self::incrementLoginThrottle( $username );
- return is_array( $res ) ? true : 0;
- }
-
- /**
- * Clear the login attempt throttle hit count for the (username,current IP) tuple.
- * @param string $username The user name
- * @return void
- */
- public static function clearLoginThrottle( $username ) {
- global $wgRequest, $wgPasswordAttemptThrottle;
- $canUsername = User::getCanonicalName( $username, 'usable' );
- $username = $canUsername !== false ? $canUsername : $username;
-
- if ( is_array( $wgPasswordAttemptThrottle ) ) {
- $throttleConfig = $wgPasswordAttemptThrottle;
- if ( isset( $wgPasswordAttemptThrottle['count'] ) ) {
- // old style. Convert for backwards compat.
- $throttleConfig = [ $wgPasswordAttemptThrottle ];
- }
- foreach ( $throttleConfig as $index => $specificThrottle ) {
- if ( isset( $specificThrottle['allIPs'] ) ) {
- $ip = 'All';
- } else {
- $ip = $wgRequest->getIP();
- }
- $throttleKey = wfGlobalCacheKey( 'password-throttle', $index,
- $ip, md5( $username )
- );
- ObjectCache::getLocalClusterInstance()->delete( $throttleKey );
- }
- }
- }
-
- /**
- * Attempt to automatically create a user on login. Only succeeds if there
- * is an external authentication method which allows it.
- *
- * @param User $user
- *
- * @return int Status code
- */
- function attemptAutoCreate( $user ) {
- global $wgAuth;
-
- if ( $this->getUser()->isBlockedFromCreateAccount() ) {
- wfDebug( __METHOD__ . ": user is blocked from account creation\n" );
-
- return self::CREATE_BLOCKED;
- }
-
- if ( !$wgAuth->autoCreate() ) {
- return self::NOT_EXISTS;
- }
-
- if ( !$wgAuth->userExists( $user->getName() ) ) {
- wfDebug( __METHOD__ . ": user does not exist\n" );
-
- return self::NOT_EXISTS;
- }
-
- if ( !$wgAuth->authenticate( $user->getName(), $this->mPassword ) ) {
- wfDebug( __METHOD__ . ": \$wgAuth->authenticate() returned false, aborting\n" );
-
- return self::WRONG_PLUGIN_PASS;
- }
-
- $abortError = '';
- if ( !Hooks::run( 'AbortAutoAccount', [ $user, &$abortError ] ) ) {
- // Hook point to add extra creation throttles and blocks
- wfDebug( "LoginForm::attemptAutoCreate: a hook blocked creation: $abortError\n" );
- $this->mAbortLoginErrorMsg = $abortError;
-
- return self::ABORTED;
- }
-
- wfDebug( __METHOD__ . ": creating account\n" );
- $status = $this->initUser( $user, true );
-
- if ( !$status->isOK() ) {
- $errors = $status->getErrorsByType( 'error' );
- $this->mAbortLoginErrorMsg = $errors[0]['message'];
-
- return self::ABORTED;
- }
-
- return self::SUCCESS;
- }
-
- function processLogin() {
- global $wgLang, $wgSecureLogin, $wgInvalidPasswordReset;
-
- $authRes = $this->authenticateUserData();
- switch ( $authRes ) {
- case self::SUCCESS:
- # We've verified now, update the real record
- $user = $this->getUser();
- $user->touch();
-
- if ( $user->requiresHTTPS() ) {
- $this->mStickHTTPS = true;
- }
-
- if ( $wgSecureLogin && !$this->mStickHTTPS ) {
- $user->setCookies( $this->mRequest, false, $this->mRemember );
- } else {
- $user->setCookies( $this->mRequest, null, $this->mRemember );
- }
- self::clearLoginToken();
-
- // Reset the throttle
- self::clearLoginThrottle( $this->mUsername );
-
- $request = $this->getRequest();
- if ( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
- /* Replace the language object to provide user interface in
- * correct language immediately on this first page load.
- */
- $code = $request->getVal( 'uselang', $user->getOption( 'language' ) );
- $userLang = Language::factory( $code );
- $wgLang = $userLang;
- RequestContext::getMain()->setLanguage( $userLang );
- $this->getContext()->setLanguage( $userLang );
- // Reset SessionID on Successful login (bug 40995)
- $this->renewSessionId();
- if ( $this->checkUserPasswordExpired( $this->getUser() ) == 'soft' ) {
- $this->resetLoginForm( $this->msg( 'resetpass-expired-soft' ) );
- } elseif ( $wgInvalidPasswordReset
- && !$user->isValidPassword( $this->mPassword )
- ) {
- $status = $user->checkPasswordValidity(
- $this->mPassword,
- 'login'
- );
- $this->resetLoginForm(
- $status->getMessage( 'resetpass-validity-soft' )
- );
- } else {
- $this->successfulLogin();
- }
- } else {
- $this->cookieRedirectCheck( 'login' );
- }
- break;
-
- case self::NEED_TOKEN:
- $error = $this->mAbortLoginErrorMsg ?: 'nocookiesforlogin';
- $this->mainLoginForm( $this->msg( $error )->parse() );
- break;
- case self::WRONG_TOKEN:
- $error = $this->mAbortLoginErrorMsg ?: 'sessionfailure';
- $this->mainLoginForm( $this->msg( $error )->text() );
- break;
- case self::NO_NAME:
- case self::ILLEGAL:
- $error = $this->mAbortLoginErrorMsg ?: 'noname';
- $this->mainLoginForm( $this->msg( $error )->text() );
- break;
- case self::WRONG_PLUGIN_PASS:
- $error = $this->mAbortLoginErrorMsg ?: 'wrongpassword';
- $this->mainLoginForm( $this->msg( $error )->text() );
- break;
- case self::NOT_EXISTS:
- if ( $this->getUser()->isAllowed( 'createaccount' ) ) {
- $error = $this->mAbortLoginErrorMsg ?: 'nosuchuser';
- $this->mainLoginForm( $this->msg( $error,
- wfEscapeWikiText( $this->mUsername ) )->parse() );
- } else {
- $error = $this->mAbortLoginErrorMsg ?: 'nosuchusershort';
- $this->mainLoginForm( $this->msg( $error,
- wfEscapeWikiText( $this->mUsername ) )->text() );
- }
- break;
- case self::WRONG_PASS:
- $error = $this->mAbortLoginErrorMsg ?: 'wrongpassword';
- $this->mainLoginForm( $this->msg( $error )->text() );
- break;
- case self::EMPTY_PASS:
- $error = $this->mAbortLoginErrorMsg ?: 'wrongpasswordempty';
- $this->mainLoginForm( $this->msg( $error )->text() );
- break;
- case self::RESET_PASS:
- $error = $this->mAbortLoginErrorMsg ?: 'resetpass_announce';
- $this->resetLoginForm( $this->msg( $error ) );
- break;
- case self::CREATE_BLOCKED:
- $this->userBlockedMessage( $this->getUser()->isBlockedFromCreateAccount() );
- break;
- case self::THROTTLED:
- $error = $this->mAbortLoginErrorMsg ?: 'login-throttled';
- $this->mainLoginForm( $this->msg( $error )
- ->durationParams( $this->mThrottleWait )->text()
- );
- break;
- case self::USER_BLOCKED:
- $error = $this->mAbortLoginErrorMsg ?: 'login-userblocked';
- $this->mainLoginForm( $this->msg( $error, $this->mUsername )->escaped() );
- break;
- case self::ABORTED:
- $error = $this->mAbortLoginErrorMsg ?: 'login-abort-generic';
- $this->mainLoginForm( $this->msg( $error,
- wfEscapeWikiText( $this->mUsername ) )->text() );
- break;
- case self::USER_MIGRATED:
- $error = $this->mAbortLoginErrorMsg ?: 'login-migrated-generic';
- $params = [];
- if ( is_array( $error ) ) {
- $error = array_shift( $this->mAbortLoginErrorMsg );
- $params = $this->mAbortLoginErrorMsg;
- }
- $this->mainLoginForm( $this->msg( $error, $params )->text() );
- break;
- default:
- throw new MWException( 'Unhandled case value' );
- }
-
- LoggerFactory::getInstance( 'authmanager' )->info( 'Login attempt', [
- 'event' => 'login',
- 'successful' => $authRes === self::SUCCESS,
- 'status' => LoginForm::$statusCodes[$authRes],
- ] );
- }
-
- /**
- * Show the Special:ChangePassword form, with custom message
- * @param Message $msg
- */
- protected function resetLoginForm( Message $msg ) {
- // Allow hooks to explain this password reset in more detail
- Hooks::run( 'LoginPasswordResetMessage', [ &$msg, $this->mUsername ] );
- $reset = new SpecialChangePasswordPreAuthManager();
- $derivative = new DerivativeContext( $this->getContext() );
- $derivative->setTitle( $reset->getPageTitle() );
- $reset->setContext( $derivative );
- if ( !$this->mTempPasswordUsed ) {
- $reset->setOldPasswordMessage( 'oldpassword' );
- }
- $reset->setChangeMessage( $msg );
- $reset->execute( null );
- }
-
- /**
- * @param User $u
- * @param bool $throttle
- * @param string $emailTitle Message name of email title
- * @param string $emailText Message name of email text
- * @return Status
- */
- function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle',
- $emailText = 'passwordremindertext'
- ) {
- global $wgNewPasswordExpiry, $wgMinimalPasswordLength;
-
- if ( $u->getEmail() == '' ) {
- return Status::newFatal( 'noemail', $u->getName() );
- }
- $ip = $this->getRequest()->getIP();
- if ( !$ip ) {
- return Status::newFatal( 'badipaddress' );
- }
-
- $currentUser = $this->getUser();
- Hooks::run( 'User::mailPasswordInternal', [ &$currentUser, &$ip, &$u ] );
-
- $np = PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
- $u->setNewpassword( $np, $throttle );
- $u->saveSettings();
- $userLanguage = $u->getOption( 'language' );
-
- $mainPage = Title::newMainPage();
- $mainPageUrl = $mainPage->getCanonicalURL();
-
- $m = $this->msg( $emailText, $ip, $u->getName(), $np, '<' . $mainPageUrl . '>',
- round( $wgNewPasswordExpiry / 86400 ) )->inLanguage( $userLanguage )->text();
- $result = $u->sendMail( $this->msg( $emailTitle )->inLanguage( $userLanguage )->text(), $m );
-
- return $result;
- }
-
- /**
- * Run any hooks registered for logins, then HTTP redirect to
- * $this->mReturnTo (or Main Page if that's undefined). Formerly we had a
- * nice message here, but that's really not as useful as just being sent to
- * wherever you logged in from. It should be clear that the action was
- * successful, given the lack of error messages plus the appearance of your
- * name in the upper right.
- *
- * @private
- */
- function successfulLogin() {
- # Run any hooks; display injected HTML if any, else redirect
- $currentUser = $this->getUser();
- $injected_html = '';
- Hooks::run( 'UserLoginComplete', [ &$currentUser, &$injected_html ] );
-
- if ( $injected_html !== '' ) {
- $this->displaySuccessfulAction( 'success', $this->msg( 'loginsuccesstitle' ),
- 'loginsuccess', $injected_html );
- } else {
- $this->executeReturnTo( 'successredirect' );
- }
- }
-
- /**
- * Run any hooks registered for logins, then display a message welcoming
- * the user.
- *
- * @private
- */
- function successfulCreation() {
- # Run any hooks; display injected HTML
- $currentUser = $this->getUser();
- $injected_html = '';
- $welcome_creation_msg = 'welcomecreation-msg';
-
- Hooks::run( 'UserLoginComplete', [ &$currentUser, &$injected_html ] );
-
- /**
- * Let any extensions change what message is shown.
- * @see https://www.mediawiki.org/wiki/Manual:Hooks/BeforeWelcomeCreation
- * @since 1.18
- */
- Hooks::run( 'BeforeWelcomeCreation', [ &$welcome_creation_msg, &$injected_html ] );
-
- $this->displaySuccessfulAction(
- 'signup',
- $this->msg( 'welcomeuser', $this->getUser()->getName() ),
- $welcome_creation_msg, $injected_html
- );
- }
-
- /**
- * Display a "successful action" page.
- *
- * @param string $type Condition of return to; see `executeReturnTo`
- * @param string|Message $title Page's title
- * @param string $msgname
- * @param string $injected_html
- */
- private function displaySuccessfulAction( $type, $title, $msgname, $injected_html ) {
- $out = $this->getOutput();
- $out->setPageTitle( $title );
- if ( $msgname ) {
- $out->addWikiMsg( $msgname, wfEscapeWikiText( $this->getUser()->getName() ) );
- }
-
- $out->addHTML( $injected_html );
-
- $this->executeReturnTo( $type );
- }
-
- /**
- * Output a message that informs the user that they cannot create an account because
- * there is a block on them or their IP which prevents account creation. Note that
- * User::isBlockedFromCreateAccount(), which gets this block, ignores the 'hardblock'
- * setting on blocks (bug 13611).
- * @param Block $block The block causing this error
- * @throws ErrorPageError
- */
- function userBlockedMessage( Block $block ) {
- # Let's be nice about this, it's likely that this feature will be used
- # for blocking large numbers of innocent people, e.g. range blocks on
- # schools. Don't blame it on the user. There's a small chance that it
- # really is the user's fault, i.e. the username is blocked and they
- # haven't bothered to log out before trying to create an account to
- # evade it, but we'll leave that to their guilty conscience to figure
- # out.
- $errorParams = [
- $block->getTarget(),
- $block->mReason ? $block->mReason : $this->msg( 'blockednoreason' )->text(),
- $block->getByName()
- ];
-
- if ( $block->getType() === Block::TYPE_RANGE ) {
- $errorMessage = 'cantcreateaccount-range-text';
- $errorParams[] = $this->getRequest()->getIP();
- } else {
- $errorMessage = 'cantcreateaccount-text';
- }
-
- throw new ErrorPageError(
- 'cantcreateaccounttitle',
- $errorMessage,
- $errorParams
- );
- }
-
- /**
- * Add a "return to" link or redirect to it.
- * Extensions can use this to reuse the "return to" logic after
- * inject steps (such as redirection) into the login process.
- *
- * @param string $type One of the following:
- * - error: display a return to link ignoring $wgRedirectOnLogin
- * - signup: display a return to link using $wgRedirectOnLogin if needed
- * - success: display a return to link using $wgRedirectOnLogin if needed
- * - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
- * @param string $returnTo
- * @param array|string $returnToQuery
- * @param bool $stickHTTPs Keep redirect link on HTTPs
- * @since 1.22
- */
- public function showReturnToPage(
- $type, $returnTo = '', $returnToQuery = '', $stickHTTPs = false
- ) {
- $this->mReturnTo = $returnTo;
- $this->mReturnToQuery = $returnToQuery;
- $this->mStickHTTPS = $stickHTTPs;
- $this->executeReturnTo( $type );
- }
-
- /**
- * Add a "return to" link or redirect to it.
- *
- * @param string $type One of the following:
- * - error: display a return to link ignoring $wgRedirectOnLogin
- * - signup: display a return to link using $wgRedirectOnLogin if needed
- * - success: display a return to link using $wgRedirectOnLogin if needed
- * - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
- */
- private function executeReturnTo( $type ) {
- global $wgRedirectOnLogin, $wgSecureLogin;
-
- if ( $type != 'error' && $wgRedirectOnLogin !== null ) {
- $returnTo = $wgRedirectOnLogin;
- $returnToQuery = [];
- } else {
- $returnTo = $this->mReturnTo;
- $returnToQuery = wfCgiToArray( $this->mReturnToQuery );
- }
-
- // Allow modification of redirect behavior
- Hooks::run( 'PostLoginRedirect', [ &$returnTo, &$returnToQuery, &$type ] );
-
- $returnToTitle = Title::newFromText( $returnTo );
- if ( !$returnToTitle ) {
- $returnToTitle = Title::newMainPage();
- }
-
- if ( $wgSecureLogin && !$this->mStickHTTPS ) {
- $options = [ 'http' ];
- $proto = PROTO_HTTP;
- } elseif ( $wgSecureLogin ) {
- $options = [ 'https' ];
- $proto = PROTO_HTTPS;
- } else {
- $options = [];
- $proto = PROTO_RELATIVE;
- }
-
- if ( $type == 'successredirect' ) {
- $redirectUrl = $returnToTitle->getFullURL( $returnToQuery, false, $proto );
- $this->getOutput()->redirect( $redirectUrl );
- } else {
- $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery, null, $options );
- }
- }
-
- /**
- * @param string $msg
- * @param string $msgtype
- * @throws ErrorPageError
- * @throws Exception
- * @throws FatalError
- * @throws MWException
- * @throws PermissionsError
- * @throws ReadOnlyError
- * @private
- */
- function mainLoginForm( $msg, $msgtype = 'error' ) {
- global $wgEnableEmail, $wgEnableUserEmail;
- global $wgHiddenPrefs, $wgLoginLanguageSelector;
- global $wgAuth, $wgEmailConfirmToEdit;
- global $wgSecureLogin, $wgPasswordResetRoutes;
- global $wgExtendedLoginCookieExpiration, $wgCookieExpiration;
-
- $titleObj = $this->getPageTitle();
- $user = $this->getUser();
- $out = $this->getOutput();
-
- if ( $this->mType == 'signup' ) {
- // Block signup here if in readonly. Keeps user from
- // going through the process (filling out data, etc)
- // and being informed later.
- $permErrors = $titleObj->getUserPermissionsErrors( 'createaccount', $user, true );
- if ( count( $permErrors ) ) {
- throw new PermissionsError( 'createaccount', $permErrors );
- } elseif ( $user->isBlockedFromCreateAccount() ) {
- $this->userBlockedMessage( $user->isBlockedFromCreateAccount() );
-
- return;
- } elseif ( wfReadOnly() ) {
- throw new ReadOnlyError;
- }
- }
-
- // Pre-fill username (if not creating an account, bug 44775).
- if ( $this->mUsername == '' && $this->mType != 'signup' ) {
- if ( $user->isLoggedIn() ) {
- $this->mUsername = $user->getName();
- } else {
- $this->mUsername = $this->getRequest()->getSession()->suggestLoginUsername();
- }
- }
-
- // Generic styles and scripts for both login and signup form
- $out->addModuleStyles( [
- 'mediawiki.ui',
- 'mediawiki.ui.button',
- 'mediawiki.ui.checkbox',
- 'mediawiki.ui.input',
- 'mediawiki.special.userlogin.common.styles'
- ] );
-
- if ( $this->mType == 'signup' ) {
- // Additional styles and scripts for signup form
- $out->addModules( [
- 'mediawiki.special.userlogin.signup.js'
- ] );
- $out->addModuleStyles( [
- 'mediawiki.special.userlogin.signup.styles'
- ] );
-
- $template = new UsercreateTemplate( $this->getConfig() );
-
- // Must match number of benefits defined in messages
- $template->set( 'benefitCount', 3 );
-
- $q = 'action=submitlogin&type=signup';
- $linkq = 'type=login';
- } else {
- // Additional styles for login form
- $out->addModuleStyles( [
- 'mediawiki.special.userlogin.login.styles'
- ] );
-
- $template = new UserloginTemplate( $this->getConfig() );
-
- $q = 'action=submitlogin&type=login';
- $linkq = 'type=signup';
- }
-
- if ( $this->mReturnTo !== '' ) {
- $returnto = '&returnto=' . wfUrlencode( $this->mReturnTo );
- if ( $this->mReturnToQuery !== '' ) {
- $returnto .= '&returntoquery=' .
- wfUrlencode( $this->mReturnToQuery );
- }
- $q .= $returnto;
- $linkq .= $returnto;
- }
-
- # Don't show a "create account" link if the user can't.
- if ( $this->showCreateOrLoginLink( $user ) ) {
- # Pass any language selection on to the mode switch link
- if ( $wgLoginLanguageSelector && $this->mLanguage ) {
- $linkq .= '&uselang=' . $this->mLanguage;
- }
- // Supply URL, login template creates the button.
- $template->set( 'createOrLoginHref', $titleObj->getLocalURL( $linkq ) );
- } else {
- $template->set( 'link', '' );
- }
-
- $resetLink = $this->mType == 'signup'
- ? null
- : is_array( $wgPasswordResetRoutes ) && in_array( true, array_values( $wgPasswordResetRoutes ) );
-
- $template->set( 'header', '' );
- $template->set( 'formheader', '' );
- $template->set( 'skin', $this->getSkin() );
- $template->set( 'name', $this->mUsername );
- $template->set( 'password', $this->mPassword );
- $template->set( 'retype', $this->mRetype );
- $template->set( 'createemailset', $this->mCreateaccountMail );
- $template->set( 'email', $this->mEmail );
- $template->set( 'realname', $this->mRealName );
- $template->set( 'domain', $this->mDomain );
- $template->set( 'reason', $this->mReason );
-
- $template->set( 'action', $titleObj->getLocalURL( $q ) );
- $template->set( 'message', $msg );
- $template->set( 'messagetype', $msgtype );
- $template->set( 'createemail', $wgEnableEmail && $user->isLoggedIn() );
- $template->set( 'userealname', !in_array( 'realname', $wgHiddenPrefs ) );
- $template->set( 'useemail', $wgEnableEmail );
- $template->set( 'emailrequired', $wgEmailConfirmToEdit );
- $template->set( 'emailothers', $wgEnableUserEmail );
- $template->set( 'canreset', $wgAuth->allowPasswordChange() );
- $template->set( 'resetlink', $resetLink );
- $template->set( 'canremember', $wgExtendedLoginCookieExpiration === null ?
- ( $wgCookieExpiration > 0 ) :
- ( $wgExtendedLoginCookieExpiration > 0 ) );
- $template->set( 'usereason', $user->isLoggedIn() );
- $template->set( 'remember', $this->mRemember );
- $template->set( 'cansecurelogin', ( $wgSecureLogin === true ) );
- $template->set( 'stickhttps', (int)$this->mStickHTTPS );
- $template->set( 'loggedin', $user->isLoggedIn() );
- $template->set( 'loggedinuser', $user->getName() );
-
- if ( $this->mType == 'signup' ) {
- $template->set( 'token', self::getCreateaccountToken()->toString() );
- } else {
- $template->set( 'token', self::getLoginToken()->toString() );
- }
-
- # Prepare language selection links as needed
- if ( $wgLoginLanguageSelector ) {
- $template->set( 'languages', $this->makeLanguageSelector() );
- if ( $this->mLanguage ) {
- $template->set( 'uselang', $this->mLanguage );
- }
- }
-
- $template->set( 'secureLoginUrl', $this->mSecureLoginUrl );
- // Use signupend-https for HTTPS requests if it's not blank, signupend otherwise
- $usingHTTPS = $this->mRequest->getProtocol() == 'https';
- $signupendHTTPS = $this->msg( 'signupend-https' );
- if ( $usingHTTPS && !$signupendHTTPS->isBlank() ) {
- $template->set( 'signupend', $signupendHTTPS->parse() );
- } else {
- $template->set( 'signupend', $this->msg( 'signupend' )->parse() );
- }
-
- // If using HTTPS coming from HTTP, then the 'fromhttp' parameter must be preserved
- if ( $usingHTTPS ) {
- $template->set( 'fromhttp', $this->mFromHTTP );
- }
-
- // Give authentication and captcha plugins a chance to modify the form
- $wgAuth->modifyUITemplate( $template, $this->mType );
- if ( $this->mType == 'signup' ) {
- Hooks::run( 'UserCreateForm', [ &$template ] );
- } else {
- Hooks::run( 'UserLoginForm', [ &$template ] );
- }
-
- $out->disallowUserJs(); // just in case...
- $out->addTemplate( $template );
- }
-
- /**
- * Whether the login/create account form should display a link to the
- * other form (in addition to whatever the skin provides).
- *
- * @param User $user
- * @return bool
- */
- private function showCreateOrLoginLink( &$user ) {
- if ( $this->mType == 'signup' ) {
- return true;
- } elseif ( $user->isAllowed( 'createaccount' ) ) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Check if a session cookie is present.
- *
- * This will not pick up a cookie set during _this_ request, but is meant
- * to ensure that the client is returning the cookie which was set on a
- * previous pass through the system.
- *
- * @private
- * @return bool
- */
- function hasSessionCookie() {
- global $wgDisableCookieCheck, $wgInitialSessionId;
-
- return $wgDisableCookieCheck || (
- $wgInitialSessionId &&
- $this->getRequest()->getSession()->getId() === (string)$wgInitialSessionId
- );
- }
-
- /**
- * Get the login token from the current session
- * @since 1.27 returns a MediaWiki\Session\Token instead of a string
- * @return MediaWiki\Session\Token
- */
- public static function getLoginToken() {
- global $wgRequest;
- return $wgRequest->getSession()->getToken( '', 'login' );
- }
-
- /**
- * Formerly randomly generated a login token that would be returned by
- * $this->getLoginToken().
- *
- * Since 1.27, this is a no-op. The token is generated as necessary by
- * $this->getLoginToken().
- *
- * @deprecated since 1.27
- */
- public static function setLoginToken() {
- wfDeprecated( __METHOD__, '1.27' );
- }
-
- /**
- * Remove any login token attached to the current session
- */
- public static function clearLoginToken() {
- global $wgRequest;
- $wgRequest->getSession()->resetToken( 'login' );
- }
-
- /**
- * Get the createaccount token from the current session
- * @since 1.27 returns a MediaWiki\Session\Token instead of a string
- * @return MediaWiki\Session\Token
- */
- public static function getCreateaccountToken() {
- global $wgRequest;
- return $wgRequest->getSession()->getToken( '', 'createaccount' );
- }
-
- /**
- * Formerly randomly generated a createaccount token that would be returned
- * by $this->getCreateaccountToken().
- *
- * Since 1.27, this is a no-op. The token is generated as necessary by
- * $this->getCreateaccountToken().
- *
- * @deprecated since 1.27
- */
- public static function setCreateaccountToken() {
- wfDeprecated( __METHOD__, '1.27' );
- }
-
- /**
- * Remove any createaccount token attached to the current session
- */
- public static function clearCreateaccountToken() {
- global $wgRequest;
- $wgRequest->getSession()->resetToken( 'createaccount' );
- }
-
- /**
- * Renew the user's session id, using strong entropy
- */
- private function renewSessionId() {
- global $wgSecureLogin, $wgCookieSecure;
- if ( $wgSecureLogin && !$this->mStickHTTPS ) {
- $wgCookieSecure = false;
- }
-
- SessionManager::getGlobalSession()->resetId();
- SessionManager::getGlobalSession()->resetAllTokens();
- }
-
- /**
- * @param string $type
- * @private
- */
- function cookieRedirectCheck( $type ) {
- $titleObj = SpecialPage::getTitleFor( 'Userlogin' );
- $query = [ 'wpCookieCheck' => $type ];
- if ( $this->mReturnTo !== '' ) {
- $query['returnto'] = $this->mReturnTo;
- $query['returntoquery'] = $this->mReturnToQuery;
- }
- $check = $titleObj->getFullURL( $query );
-
- $this->getOutput()->redirect( $check );
- }
-
- /**
- * @param string $type
- * @private
- */
- function onCookieRedirectCheck( $type ) {
- if ( !$this->hasSessionCookie() ) {
- if ( $type == 'new' ) {
- $this->mainLoginForm( $this->msg( 'nocookiesnew' )->parse() );
- } elseif ( $type == 'login' ) {
- $this->mainLoginForm( $this->msg( 'nocookieslogin' )->parse() );
- } else {
- # shouldn't happen
- $this->mainLoginForm( $this->msg( 'error' )->text() );
- }
- } else {
- $this->successfulLogin();
- }
- }
-
- /**
- * Produce a bar of links which allow the user to select another language
- * during login/registration but retain "returnto"
- *
- * @return string
- */
- function makeLanguageSelector() {
- $msg = $this->msg( 'loginlanguagelinks' )->inContentLanguage();
- if ( $msg->isBlank() ) {
- return '';
- }
- $langs = explode( "\n", $msg->text() );
- $links = [];
- foreach ( $langs as $lang ) {
- $lang = trim( $lang, '* ' );
- $parts = explode( '|', $lang );
- if ( count( $parts ) >= 2 ) {
- $links[] = $this->makeLanguageSelectorLink( $parts[0], trim( $parts[1] ) );
- }
- }
-
- return count( $links ) > 0 ? $this->msg( 'loginlanguagelabel' )->rawParams(
- $this->getLanguage()->pipeList( $links ) )->escaped() : '';
- }
-
- /**
- * Create a language selector link for a particular language
- * Links back to this page preserving type and returnto
- *
- * @param string $text Link text
- * @param string $lang Language code
- * @return string
- */
- function makeLanguageSelectorLink( $text, $lang ) {
- if ( $this->getLanguage()->getCode() == $lang ) {
- // no link for currently used language
- return htmlspecialchars( $text );
- }
- $query = [ 'uselang' => $lang ];
- if ( $this->mType == 'signup' ) {
- $query['type'] = 'signup';
- }
- if ( $this->mReturnTo !== '' ) {
- $query['returnto'] = $this->mReturnTo;
- $query['returntoquery'] = $this->mReturnToQuery;
- }
-
- $attr = [];
- $targetLanguage = Language::factory( $lang );
- $attr['lang'] = $attr['hreflang'] = $targetLanguage->getHtmlCode();
-
- return Linker::linkKnown(
- $this->getPageTitle(),
- htmlspecialchars( $text ),
- $attr,
- $query
- );
- }
-
- protected function getGroupName() {
- return 'login';
- }
-
- /**
- * Private function to check password expiration, until AuthManager comes
- * along to handle that.
- * @param User $user
- * @return string|bool
- */
- private function checkUserPasswordExpired( User $user ) {
- global $wgPasswordExpireGrace;
- $dbr = wfGetDB( DB_SLAVE );
- $ts = $dbr->selectField( 'user', 'user_password_expires', [ 'user_id' => $user->getId() ] );
-
- $expired = false;
- $now = wfTimestamp();
- $expUnix = wfTimestamp( TS_UNIX, $ts );
- if ( $ts !== null && $expUnix < $now ) {
- $expired = ( $expUnix + $wgPasswordExpireGrace < $now ) ? 'hard' : 'soft';
- }
- return $expired;
- }
-
- protected function getSubpagesForPrefixSearch() {
- return [ 'signup' ];
- }
-}
+++ /dev/null
-<?php
-/**
- * Implements Special:Userlogout
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Implements Special:Userlogout
- *
- * @ingroup SpecialPage
- */
-class SpecialUserlogoutPreAuthManager extends UnlistedSpecialPage {
- function __construct() {
- parent::__construct( 'Userlogout' );
- }
-
- public function doesWrites() {
- return true;
- }
-
- function execute( $par ) {
- /**
- * Some satellite ISPs use broken precaching schemes that log people out straight after
- * they're logged in (bug 17790). Luckily, there's a way to detect such requests.
- */
- if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&' ) !== false ) {
- wfDebug( "Special:Userlogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
- throw new HttpError( 400, $this->msg( 'suspicious-userlogout' ), $this->msg( 'loginerror' ) );
- }
-
- $this->setHeaders();
- $this->outputHeader();
-
- // Make sure it's possible to log out
- $session = MediaWiki\Session\SessionManager::getGlobalSession();
- if ( !$session->canSetUser() ) {
- throw new ErrorPageError(
- 'cannotlogoutnow-title',
- 'cannotlogoutnow-text',
- [
- $session->getProvider()->describe( RequestContext::getMain()->getLanguage() )
- ]
- );
- }
-
- $user = $this->getUser();
- $oldName = $user->getName();
- $user->logout();
-
- $loginURL = SpecialPage::getTitleFor( 'Userlogin' )->getFullURL(
- $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
-
- $out = $this->getOutput();
- $out->addWikiMsg( 'logouttext', $loginURL );
-
- // Hook.
- $injected_html = '';
- Hooks::run( 'UserLogoutComplete', [ &$user, &$injected_html, $oldName ] );
- $out->addHTML( $injected_html );
-
- $out->returnToMain();
- }
-
- protected function getGroupName() {
- return 'login';
- }
-}
+++ /dev/null
-<?php
-// @codingStandardsIgnoreFile
-/**
- * Html form for account creation (since 1.22 with VForm appearance).
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Templates
- * @deprecated Will be removed when AuthManager lands.
- * The signup form will be generated via HTMLForm.
- */
-
-class UsercreateTemplate extends BaseTemplate {
- /**
- * Extensions (AntiSpoof and TitleBlacklist) call this in response to
- * UserCreateForm hook to add checkboxes to the create account form.
- */
- function addInputItem( $name, $value, $type, $msg, $helptext = false ) {
- $this->data['extraInput'][] = [
- 'name' => $name,
- 'value' => $value,
- 'type' => $type,
- 'msg' => $msg,
- 'helptext' => $helptext,
- ];
- }
-
- function execute() {
-?>
-<div class="mw-ui-container">
- <?php if ( $this->haveData( 'languages' ) ) { ?>
- <div id="languagelinks">
- <p><?php $this->html( 'languages' ); ?></p>
- </div>
- <?php }
- if ( !wfMessage( 'signupstart' )->isDisabled() ) { ?>
- <div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
- <?php } ?>
- <div id="userloginForm">
- <form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
- <section class="mw-form-header">
- <?php $this->html( 'header' ); ?>
- </section>
- <!-- This element is used by the mediawiki.special.userlogin.signup.js module. -->
- <div
- id="mw-createacct-status-area"
- <?php if ( $this->data['message'] ) { ?>
- class="<?php echo $this->data['messagetype']; ?>box"
- <?php } else { ?>
- style="display: none;"
- <?php } ?>
- >
- <?php if ( $this->data['message'] ) { ?>
- <?php if ( $this->data['messagetype'] == 'error' ) { ?>
- <strong><?php $this->msg( 'createacct-error' ); ?></strong>
- <br />
- <?php } ?>
- <?php $this->html( 'message' ); ?>
- <?php } ?>
- </div>
-
- <?php if ( $this->data['formheader'] ) { ?>
- <div class="mw-form-formheader">
- <?php $this->html( 'formheader' ); /* extensions such as MobileFrontend add html here */ ?>
- </div>
- <?php } ?>
-
- <div class="mw-ui-vform-field">
- <label for='wpName2'>
- <?php $this->msg( 'userlogin-yourname' ); ?>
-
- <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername' )->parse(); ?></span>
- </label>
- <?php
- echo Html::input( 'wpName', $this->data['name'], 'text', [
- 'class' => 'mw-ui-input loginText',
- 'id' => 'wpName2',
- 'tabindex' => '1',
- 'size' => '20',
- 'required',
- 'placeholder' => $this->getMsg( $this->data['loggedin'] ?
- 'createacct-another-username-ph' : 'userlogin-yourname-ph' )->text(),
- ] );
- ?>
- </div>
-
- <div class="mw-ui-vform-field">
- <?php if ( $this->data['createemail'] ) { ?>
- <div class="mw-ui-checkbox">
- <input name="wpCreateaccountMail" type="checkbox" value="1" id="wpCreateaccountMail" tabindex="2"
- <?php if ( $this->data['createemailset'] ) {
- echo 'checked="checked"';
- } ?>
- ><label for="wpCreateaccountMail">
- <?php $this->msg( 'createaccountmail' ); ?>
- </label>
- </div>
- <?php } ?>
- </div>
-
- <div class="mw-ui-vform-field mw-row-password">
- <label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
- <?php
- echo Html::input( 'wpPassword', null, 'password', [
- 'class' => 'mw-ui-input loginPassword',
- 'id' => 'wpPassword2',
- 'tabindex' => '3',
- 'size' => '20',
- 'required',
- 'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
- ] + User::passwordChangeInputAttribs() );
- ?>
- </div>
-
- <?php
- if ( $this->data['usedomain'] ) {
- $select = new XmlSelect( 'wpDomain', false, $this->data['domain'] );
- $select->setAttribute( 'tabindex', 4 );
- foreach ( $this->data['domainnames'] as $dom ) {
- $select->addOption( $dom );
- }
- ?>
- <div class="mw-ui-vform-field" id="mw-user-domain-section">
- <label for="wpDomain"><?php $this->msg( 'yourdomainname' ); ?></label>
- <div>
- <?php echo $select->getHTML(); ?>
- </div>
- </div>
- <?php } ?>
-
- <div class="mw-ui-vform-field mw-row-password">
- <label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
- <?php
- echo Html::input( 'wpRetype', null, 'password', [
- 'class' => 'mw-ui-input loginPassword',
- 'id' => 'wpRetype',
- 'tabindex' => '5',
- 'size' => '20',
- 'required',
- 'placeholder' => $this->getMsg( 'createacct-yourpasswordagain-ph' )->text()
- ] + User::passwordChangeInputAttribs() );
- ?>
- </div>
-
- <div class="mw-ui-vform-field">
- <?php if ( $this->data['useemail'] ) { ?>
- <label for='wpEmail'>
- <?php
- $this->msg( $this->data['emailrequired'] ?
- 'createacct-emailrequired' :
- 'createacct-emailoptional'
- );
- ?>
- </label>
- <?php
- echo Html::input( 'wpEmail', $this->data['email'], 'email', [
- 'class' => 'mw-ui-input loginText',
- 'id' => 'wpEmail',
- 'tabindex' => '6',
- 'size' => '20',
- 'required' => $this->data['emailrequired'],
- 'placeholder' => $this->getMsg( $this->data['loggedin'] ?
- 'createacct-another-email-ph' : 'createacct-email-ph' )->text()
- ] );
- ?>
- <?php } ?>
- </div>
-
- <?php if ( $this->data['userealname'] ) { ?>
- <div class="mw-ui-vform-field">
- <label for='wpRealName'><?php $this->msg( 'createacct-realname' ); ?></label>
- <input type='text' class='mw-ui-input loginText' name="wpRealName" id="wpRealName"
- tabindex="7"
- value="<?php $this->text( 'realname' ); ?>" size='20' />
- <div class="prefsectiontip">
- <?php $this->msgWiki( $this->data['loggedin'] ? 'createacct-another-realname-tip' : 'prefs-help-realname' ); ?>
- </div>
- </div>
- <?php } ?>
-
- <?php if ( $this->data['usereason'] ) { ?>
- <div class="mw-ui-vform-field">
- <label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
- <?php echo Html::input( 'wpReason', $this->data['reason'], 'text', [
- 'class' => 'mw-ui-input loginText',
- 'id' => 'wpReason',
- 'tabindex' => '8',
- 'size' => '20',
- 'placeholder' => $this->getMsg( 'createacct-reason-ph' )->text()
- ] ); ?>
- </div>
- <?php } ?>
-
- <?php
- $tabIndex = 9;
- if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
- foreach ( $this->data['extraInput'] as $inputItem ) { ?>
- <div class="mw-ui-vform-field">
- <?php
- // If it's a checkbox, output the whole thing (assume it has a msg).
- if ( $inputItem['type'] == 'checkbox' ) {
- ?>
- <div class="mw-ui-checkbox">
- <input
- name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
- id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
- type="checkbox" value="1"
- tabindex="<?php echo $tabIndex++; ?>"
- <?php if ( !empty( $inputItem['value'] ) ) {
- echo 'checked="checked"';
- } ?>
- ><label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
- <?php $this->msg( $inputItem['msg'] ); ?>
- </label>
- </div>
- <?php
- } else {
- // Not a checkbox.
- // TODO (bug 31909) support other input types, e.g. select boxes.
- ?>
- <?php if ( !empty( $inputItem['msg'] ) ) { ?>
- <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
- <?php $this->msgWiki( $inputItem['msg'] ); ?>
- </label>
- <?php } ?>
- <input
- type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>"
- class="mw-ui-input"
- name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
- tabindex="<?php echo $tabIndex++; ?>"
- value="<?php echo htmlspecialchars( $inputItem['value'] ); ?>"
- id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
- />
- <?php } ?>
- <?php if ( $inputItem['helptext'] !== false ) { ?>
- <div class="prefsectiontip">
- <?php $this->msgWiki( $inputItem['helptext'] ); ?>
- </div>
- <?php } ?>
- </div>
- <?php
- }
- }
-
- // A separate placeholder for any inserting any extrafields, e.g used by ConfirmEdit extension
- if ( $this->haveData( 'extrafields' ) ) {
- echo $this->data['extrafields'];
- }
- // skip one index.
- $tabIndex++;
- ?>
- <div class="mw-ui-vform-field mw-submit">
- <?php
- echo Html::submitButton(
- $this->getMsg( $this->data['loggedin'] ? 'createacct-another-submit' : 'createacct-submit' ),
- [
- 'id' => 'wpCreateaccount',
- 'name' => 'wpCreateaccount',
- 'tabindex' => $tabIndex++
- ],
- [
- 'mw-ui-block',
- 'mw-ui-constructive',
- ]
- );
- ?>
- </div>
- <?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
- <?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
- </form>
- <?php if ( !wfMessage( 'signupend' )->isDisabled() ) { ?>
- <div id="signupend"><?php $this->html( 'signupend' ); ?></div>
- <?php } ?>
- </div>
- <div class="mw-createacct-benefits-container">
- <h2><?php $this->msg( 'createacct-benefit-heading' ); ?></h2>
- <div class="mw-createacct-benefits-list">
- <?php
- for ( $benefitIdx = 1; $benefitIdx <= $this->data['benefitCount']; $benefitIdx++ ) {
- // Pass each benefit's head text (by default a number) as a parameter to the body's message for PLURAL handling.
- $headUnescaped = $this->getMsg( "createacct-benefit-head$benefitIdx" )->text();
- ?>
- <div class="mw-number-text <?php $this->msg( "createacct-benefit-icon$benefitIdx" ); ?>">
- <h3><?php $this->msg( "createacct-benefit-head$benefitIdx" ); ?></h3>
- <p><?php echo $this->getMsg( "createacct-benefit-body$benefitIdx" )->params( $headUnescaped )->escaped(); ?></p>
- </div>
- <?php } ?>
- </div>
- </div>
-</div>
-<?php
-
- }
-}
+++ /dev/null
-<?php
-// @codingStandardsIgnoreFile
-/**
- * HTML form for user login (since 1.22 with VForm appearance).
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Templates
- * @deprecated Will be removed when AuthManager lands.
- * The login form will be generated via HTMLForm.
- */
-
-class UserloginTemplate extends BaseTemplate {
-
- function execute() {
- global $wgCookieExpiration;
- $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
-?>
-<div class="mw-ui-container">
- <div id="userloginprompt"><?php $this->msgWiki('loginprompt') ?></div>
- <?php if ( $this->haveData( 'languages' ) ) { ?>
- <div id="languagelinks">
- <p><?php $this->html( 'languages' ); ?></p>
- </div>
- <?php } ?>
- <div id="userloginForm">
- <form name="userlogin" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
- <?php if ( $this->data['loggedin'] ) { ?>
- <div class="warningbox">
- <?php echo $this->getMsg( 'userlogin-loggedin' )->params( $this->data['loggedinuser'] )->parse(); ?>
- </div>
- <?php } ?>
- <section class="mw-form-header">
- <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
- </section>
-
- <?php if ( $this->data['message'] ) { ?>
- <div class="<?php $this->text( 'messagetype' ); ?>box">
- <?php if ( $this->data['messagetype'] == 'error' ) { ?>
- <strong><?php $this->msg( 'loginerror' ); ?></strong>
- <br />
- <?php } ?>
- <?php $this->html( 'message' ); ?>
- </div>
- <?php } ?>
-
- <?php if ( $this->data['formheader'] ) { ?>
- <div class="mw-form-formheader">
- <?php $this->html( 'formheader' ); /* extensions such as MobileFrontend add HTML here */ ?>
- </div>
- <?php } ?>
- <div class="mw-ui-vform-field">
- <label for="wpName1">
- <?php
- $this->msg( 'userlogin-yourname' );
-
- if ( $this->data['secureLoginUrl'] ) {
- echo Html::element( 'a', [
- 'href' => $this->data['secureLoginUrl'],
- 'class' => 'mw-ui-flush-right mw-secure',
- ], $this->getMsg( 'userlogin-signwithsecure' )->text() );
- }
- ?>
- </label>
- <?php
- echo Html::input( 'wpName', $this->data['name'], 'text', [
- 'class' => 'loginText mw-ui-input',
- 'id' => 'wpName1',
- 'tabindex' => '1',
- // 'required' is blacklisted for now in Html.php due to browser issues.
- // Keeping here in case that changes.
- 'required' => true,
- // Set focus to this field if it's blank.
- 'autofocus' => !$this->data['name'],
- 'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text()
- ] );
- ?>
- </div>
-
- <div class="mw-ui-vform-field">
- <label for="wpPassword1">
- <?php
- $this->msg( 'userlogin-yourpassword' );
- ?>
- </label>
- <?php
- echo Html::input( 'wpPassword', null, 'password', [
- 'class' => 'loginPassword mw-ui-input',
- 'id' => 'wpPassword1',
- 'tabindex' => '2',
- // Set focus to this field if username is filled in.
- 'autofocus' => (bool)$this->data['name'],
- 'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
- ] );
- ?>
- </div>
-
- <?php
- if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
- $select = new XmlSelect( 'wpDomain', false, $this->data['domain'] );
- $select->setAttribute( 'tabindex', 3 );
- foreach ( $this->data['domainnames'] as $dom ) {
- $select->addOption( $dom );
- }
- ?>
- <div class="mw-ui-vform-field" id="mw-user-domain-section">
- <label for="wpDomain"><?php $this->msg( 'yourdomainname' ); ?></label>
- <?php echo $select->getHTML(); ?>
- </div>
- <?php } ?>
-
- <?php
- if ( $this->haveData( 'extrafields' ) ) {
- echo $this->data['extrafields'];
- }
- ?>
-
- <div class="mw-ui-vform-field">
- <?php if ( $this->data['canremember'] ) { ?>
- <div class="mw-ui-checkbox">
- <input name="wpRemember" type="checkbox" value="1" id="wpRemember" tabindex="4"
- <?php if ( $this->data['remember'] ) {
- echo 'checked="checked"';
- } ?>
- ><label for="wpRemember">
- <?php echo $this->getMsg( 'userlogin-remembermypassword' )->numParams( $expirationDays )->escaped(); ?></label>
- </div>
- <?php } ?>
- </div>
-
- <div class="mw-ui-vform-field">
- <?php
- $attrs = [
- 'id' => 'wpLoginAttempt',
- 'name' => 'wpLoginAttempt',
- 'tabindex' => '6',
- ];
- $modifiers = [
- 'mw-ui-progressive',
- ];
- echo Html::submitButton( $this->getMsg( 'pt-login-button' )->text(), $attrs, $modifiers );
- ?>
- </div>
-
- <div class="mw-ui-vform-field mw-form-related-link-container" id="mw-userlogin-help">
- <?php
- echo Html::element(
- 'a',
- [
- 'href' => Skin::makeInternalOrExternalUrl(
- wfMessage( 'helplogin-url' )->inContentLanguage()->text()
- ),
- ],
- $this->getMsg( 'userlogin-helplink2' )->text()
- );
- ?>
- </div>
- <?php
-
- if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
- echo Html::rawElement(
- 'div',
- [
- 'class' => 'mw-ui-vform-field mw-form-related-link-container',
- ],
- Linker::link(
- SpecialPage::getTitleFor( 'PasswordReset' ),
- $this->getMsg( 'userlogin-resetpassword-link' )->escaped()
- )
- );
- }
-
- if ( $this->haveData( 'createOrLoginHref' ) ) {
- if ( $this->data['loggedin'] ) { ?>
- <div class="mw-form-related-link-container mw-ui-vform-field">
- <a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"><?php $this->msg( 'userlogin-createanother' ); ?></a>
- </div>
- <?php } else { ?>
- <div id="mw-createaccount-cta" class="mw-ui-vform-field">
- <?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7" class="mw-ui-button"><?php $this->msg( 'userlogin-joinproject' ); ?></a>
- </div>
- <?php
- }
- }
-
- // Hidden fields
- $fields = '';
- if ( $this->haveData( 'uselang' ) ) {
- $fields .= Html::hidden( 'uselang', $this->data['uselang'] );
- }
- if ( $this->haveData( 'token' ) ) {
- $fields .= Html::hidden( 'wpLoginToken', $this->data['token'] );
- }
- if ( $this->data['cansecurelogin'] ) {
- $fields .= Html::hidden( 'wpForceHttps', $this->data['stickhttps'] );
- }
- if ( $this->data['cansecurelogin'] && $this->haveData( 'fromhttp' ) ) {
- $fields .= Html::hidden( 'wpFromhttp', $this->data['fromhttp'] );
- }
- echo $fields;
-
- ?>
- </form>
- </div>
-</div>
-<?php
-
- }
-}
use \ReverseArrayIterator;
use \Sanitizer;
-# A note for future librarization[1] -- this file is a good candidate
-# for splitting into an independent library, except that it is currently
-# highly optimized for MediaWiki use. It only implements the portions
-# of the HTML5 tree builder used by tags supported by MediaWiki, and
-# does not contain a true tokenizer pass, instead relying on
-# comment stripping, attribute normalization, and escaping done by
-# the MediaWiki Sanitizer. It also deliberately avoids building
-# a true DOM in memory, instead serializing elements to an output string
-# as soon as possible (usually as soon as the tag is closed) to reduce
-# its memory footprint.
-
-# On the other hand, I've been pretty careful to note with comments in the
-# code the places where this implementation omits features of the spec or
-# depends on the MediaWiki Sanitizer. Perhaps in the future we'll want to
-# implement the missing pieces and make this a standalone PHP HTML5 parser.
-# In order to do so, some sort of MediaWiki-specific API will need
-# to be added to (a) allow the Balancer to bypass the tokenizer,
-# and (b) support on-the-fly flattening instead of DOM node creation.
-
-# [1]: https://www.mediawiki.org/wiki/Library_infrastructure_for_MediaWiki
+// A note for future librarization[1] -- this file is a good candidate
+// for splitting into an independent library, except that it is currently
+// highly optimized for MediaWiki use. It only implements the portions
+// of the HTML5 tree builder used by tags supported by MediaWiki, and
+// does not contain a true tokenizer pass, instead relying on
+// comment stripping, attribute normalization, and escaping done by
+// the MediaWiki Sanitizer. It also deliberately avoids building
+// a true DOM in memory, instead serializing elements to an output string
+// as soon as possible (usually as soon as the tag is closed) to reduce
+// its memory footprint.
+
+// We've been gradually lifting some of these restrictions to handle
+// non-sanitized output generated by extensions, but we shortcut the tokenizer
+// for speed (primarily by splitting on `<`) and so rely on syntactic
+// well-formedness.
+
+// On the other hand, I've been pretty careful to note with comments in the
+// code the places where this implementation omits features of the spec or
+// depends on the MediaWiki Sanitizer. Perhaps in the future we'll want to
+// implement the missing pieces and make this a standalone PHP HTML5 parser.
+// In order to do so, some sort of MediaWiki-specific API will need
+// to be added to (a) allow the Balancer to bypass the tokenizer,
+// and (b) support on-the-fly flattening instead of DOM node creation.
+
+// [1]: https://www.mediawiki.org/wiki/Library_infrastructure_for_MediaWiki
/**
* Utility constants and sets for the HTML5 tree building algorithm.
public static $unsupportedSet = [
self::HTML_NAMESPACE => [
'html' => true, 'head' => true, 'body' => true, 'frameset' => true,
- 'form' => true, 'frame' => true,
- 'plaintext' => true, 'isindex' => true, 'textarea' => true,
+ 'frame' => true,
+ 'plaintext' => true, 'isindex' => true,
'xmp' => true, 'iframe' => true, 'noembed' => true,
- 'noscript' => true, 'select' => true, 'script' => true,
+ 'noscript' => true, 'script' => true,
'title' => true
]
];
]
];
+ public static $extraLinefeedSet = [
+ self::HTML_NAMESPACE => [
+ 'pre' => true, 'textarea' => true, 'listing' => true,
+ ]
+ ];
+
public static $headingSet = [
self::HTML_NAMESPACE => [
'h1' => true, 'h2' => true, 'h3' => true,
]
];
- # OMITTED: formAssociatedSet, since we don't allow <form>
+ // See https://html.spec.whatwg.org/multipage/forms.html#form-associated-element
+ public static $formAssociatedSet = [
+ self::HTML_NAMESPACE => [
+ 'button' => true, 'fieldset' => true, 'input' => true,
+ 'keygen' => true, 'object' => true, 'output' => true,
+ 'select' => true, 'textarea' => true, 'img' => true
+ ]
+ ];
public static $inScopeSet = [
self::HTML_NAMESPACE => [
]
];
+ public static $inInvertedSelectScopeSet = [
+ self::HTML_NAMESPACE => [
+ 'option' => true, 'optgroup' => true
+ ]
+ ];
+
public static $mathmlTextIntegrationPointSet = [
self::MATHML_NAMESPACE => [
'mi' => true, 'mo' => true, 'mn' => true, 'ms' => true,
* by the HTML serialization specification, and replace this node
* in its parent by that string.
*
+ * @param array $config Balancer configuration; see Balancer::__construct().
+ *
* @see __toString()
*/
- public function flatten( $tidyCompat = false ) {
+ public function flatten( array $config ) {
Assert::parameter( $this->parent !== null, '$this', 'must be a child' );
Assert::parameter( $this->parent !== 'flat', '$this', 'already flat' );
$idx = array_search( $this, $this->parent->children, true );
Assert::parameter(
$idx !== false, '$this', 'must be a child of its parent'
);
+ $tidyCompat = $config['tidyCompat'];
if ( $tidyCompat ) {
$blank = true;
foreach ( $this->children as $elt ) {
if ( !is_string( $elt ) ) {
- $elt = $elt->flatten( $tidyCompat );
+ $elt = $elt->flatten( $config );
}
if ( $blank && preg_match( '/[^\t\n\f\r ]/', $elt ) ) {
$blank = false;
$flat = "{$this}";
}
$this->parent->children[$idx] = $flat;
- $this->parent = 'flat'; # for assertion checking
+ $this->parent = 'flat'; // for assertion checking
return $flat;
}
}
if ( !$this->isA( BalanceSets::$emptyElementSet ) ) {
$out = "<{$this->localName}{$encAttribs}>";
+ $len = strlen( $out );
// flatten children
foreach ( $this->children as $elt ) {
$out .= "{$elt}";
}
$out .= "</{$this->localName}>";
+ if (
+ $this->isA( BalanceSets::$extraLinefeedSet ) &&
+ $out[$len] === "\n"
+ ) {
+ // Double the linefeed after pre/listing/textarea
+ // according to the HTML5 fragment serialization algorithm.
+ $out = substr( $out, 0, $len + 1 ) .
+ substr( $out, $len );
+ }
} else {
$out = "<{$this->localName}{$encAttribs} />";
Assert::invariant(
return $out;
}
- # Utility functions on BalanceElements.
+ // Utility functions on BalanceElements.
/**
* Determine if $this represents a specific HTML tag, is a member of
return isset( $set[$this->namespaceURI] ) &&
isset( $set[$this->namespaceURI][$this->localName] );
} else {
- # assume this is an HTML element name.
+ // assume this is an HTML element name.
return $this->isHtml() && $this->localName === $set;
}
}
*/
public $fosterParentMode = false;
/**
- * Tidy compatibility mode, determines behavior of body/blockquote
+ * Configuration options governing flattening.
+ * @var array $config
+ * @see Balancer::__construct()
*/
- public $tidyCompat = false;
+ private $config;
/**
* Reference to the current element
*/
/**
* Create a new BalanceStack with a single BalanceElement on it,
* representing the root <html> node.
+ * @param array $config Balancer configuration; see Balancer::_construct().
*/
- public function __construct() {
- # always a root <html> element on the stack
+ public function __construct( array $config ) {
+ // always a root <html> element on the stack
array_push(
$this->elements,
new BalanceElement( BalanceSets::HTML_NAMESPACE, 'html', [] )
);
$this->currentNode = $this->elements[0];
+ $this->config = $config;
}
/**
$out = '';
foreach ( $this->elements[0]->children as $elt ) {
$out .= is_string( $elt ) ? $elt :
- $elt->flatten( $this->tidyCompat );
+ $elt->flatten( $this->config );
}
return $out;
}
+ /**
+ * Insert a comment at the appropriate place for inserting a node.
+ * @param string $value Content of the comment.
+ * @see https://html.spec.whatwg.org/multipage/syntax.html#insert-a-comment
+ */
+ public function insertComment( $value ) {
+ // Just another type of text node, except for tidy p-wrapping.
+ return $this->insertText( '<!--' . $value . '-->', true );
+ }
+
/**
* Insert text at the appropriate place for inserting a node.
* @param string $value
* @see https://html.spec.whatwg.org/multipage/syntax.html#appropriate-place-for-inserting-a-node
*/
- public function insertText( $value ) {
+ public function insertText( $value, $isComment = false ) {
if (
$this->fosterParentMode &&
$this->currentNode->isA( BalanceSets::$tableSectionRowSet )
) {
$this->fosterParent( $value );
} elseif (
- $this->tidyCompat &&
+ $this->config['tidyCompat'] && !$isComment &&
$this->currentNode->isA( BalanceSets::$tidyPWrapSet )
) {
$this->insertHTMLELement( 'mw:p-wrap', [] );
return $this->inSpecificScope( $tag, BalanceSets::$inTableScopeSet );
}
+ /**
+ * Determine if the stack has $tag in select scope.
+ * @param BalanceElement|array|string $tag
+ * @return bool
+ * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-select-scope
+ */
+ public function inSelectScope( $tag ) {
+ // Can't use inSpecificScope to implement this, since it involves
+ // *inverting* a set of tags. Implement manually.
+ foreach ( $this as $elt ) {
+ if ( $elt->isA( $tag ) ) {
+ return true;
+ }
+ if ( !$elt->isA( BalanceSets::$inInvertedSelectScopeSet ) ) {
+ return false;
+ }
+ }
+ return false;
+ }
+
/**
* Determine if the stack has $tag in a specific scope, $set.
* @param BalanceElement|array|string $tag
$this->currentNode = null;
}
if ( !$elt->isHtmlNamed( 'mw:p-wrap' ) ) {
- $elt->flatten( $this->tidyCompat );
+ $elt->flatten( $this->config );
}
}
* @param int $idx
*/
public function popTo( $idx ) {
- $length = count( $this->elements );
for ( $length = count( $this->elements ); $length > $idx; $length-- ) {
$this->pop();
}
// otherwise, it will eventually serialize when the parent
// is serialized, we just hold onto the memory for its
// tree of objects a little longer.
- $elt->flatten( $this->tidyCompat );
+ $elt->flatten( $this->config );
}
Assert::postcondition(
array_search( $elt, $this->elements, true ) === false,
}
}
- # Fostering and adoption.
+ // Fostering and adoption.
/**
* Foster parent the given $elt in the stack of open elements.
$parent = $this->elements[$lastTemplate];
} elseif ( $lastTable >= 0 ) {
$parent = $this->elements[$lastTable]->parent;
- # Assume all tables have parents, since we're not running scripts!
+ // Assume all tables have parents, since we're not running scripts!
Assert::invariant(
$parent !== null, "All tables should have parents"
);
$parent = $this->elements[0]; // the `html` element.
}
- if ( $this->tidyCompat ) {
+ if ( $this->config['tidyCompat'] ) {
if ( is_string( $elt ) ) {
// We're fostering text: do we need a p-wrapper?
if ( $parent->isA( BalanceSets::$tidyPWrapSet ) ) {
return true; // no more handling required
}
- // Let outer loop counter be zero.
- $outer = 0;
-
// Outer loop: If outer loop counter is greater than or
// equal to eight, then abort these steps.
- while ( $outer < 8 ) {
- // Increment outer loop counter by one.
- $outer++;
-
+ for ( $outer = 0; $outer < 8; $outer++ ) {
// Let the formatting element be the last element in the list
// of active formatting elements that: is between the end of
// the list and the last scope marker in the list, if any, or
// the start of the list otherwise, and has the same tag name
// as the token.
- $fmtelt = $afe->findElementByTag( $tag );
+ $fmtElt = $afe->findElementByTag( $tag );
// If there is no such node, then abort these steps and instead
// act as described in the "any other end tag" entry below.
- if ( !$fmtelt ) {
+ if ( !$fmtElt ) {
return false; // false means handle by the default case
}
// Otherwise, if there is such a node, but that node is not in
// the stack of open elements, then this is a parse error;
// remove the element from the list, and abort these steps.
- $index = $this->indexOf( $fmtelt );
+ $index = $this->indexOf( $fmtElt );
if ( $index < 0 ) {
- $afe->remove( $fmtelt );
+ $afe->remove( $fmtElt );
return true; // true means no more handling required
}
// the stack of open elements, but the element is not in scope,
// then this is a parse error; ignore the token, and abort
// these steps.
- if ( !$this->inScope( $fmtelt ) ) {
+ if ( !$this->inScope( $fmtElt ) ) {
return true;
}
// open elements that is lower in the stack than the formatting
// element, and is an element in the special category. There
// might not be one.
- $furthestblock = null;
- $furthestblockindex = -1;
- $stacklen = $this->length();
- for ( $i = $index+1; $i < $stacklen; $i++ ) {
+ $furthestBlock = null;
+ $furthestBlockIndex = -1;
+ $stackLength = $this->length();
+ for ( $i = $index+1; $i < $stackLength; $i++ ) {
if ( $this->node( $i )->isA( BalanceSets::$specialSet ) ) {
- $furthestblock = $this->node( $i );
- $furthestblockindex = $i;
+ $furthestBlock = $this->node( $i );
+ $furthestBlockIndex = $i;
break;
}
}
// up to and including the formatting element, and remove the
// formatting element from the list of active formatting
// elements.
- if ( !$furthestblock ) {
- $this->popTag( $fmtelt );
- $afe->remove( $fmtelt );
+ if ( !$furthestBlock ) {
+ $this->popTag( $fmtElt );
+ $afe->remove( $fmtElt );
return true;
- } else {
- // Let the common ancestor be the element immediately above
- // the formatting element in the stack of open elements.
- $ancestor = $this->node( $index-1 );
-
- // Let a bookmark note the position of the formatting
- // element in the list of active formatting elements
- // relative to the elements on either side of it in the
- // list.
- $BOOKMARK = new BalanceElement( '[bookmark]', '[bookmark]', [] );
- $afe->insertAfter( $fmtelt, $BOOKMARK );
-
- // Let node and last node be the furthest block.
- $node = $furthestblock;
- $lastnode = $furthestblock;
- $nodeindex = $furthestblockindex;
- $isAFE = false;
-
- // Let inner loop counter be zero.
- $inner = 0;
-
- while ( true ) {
+ }
- // Increment inner loop counter by one.
- $inner++;
-
- // Let node be the element immediately above node in
- // the stack of open elements, or if node is no longer
- // in the stack of open elements (e.g. because it got
- // removed by this algorithm), the element that was
- // immediately above node in the stack of open elements
- // before node was removed.
- $node = $this->node( --$nodeindex );
-
- // If node is the formatting element, then go
- // to the next step in the overall algorithm.
- if ( $node === $fmtelt ) break;
-
- // If the inner loop counter is greater than three and node
- // is in the list of active formatting elements, then remove
- // node from the list of active formatting elements.
- $isAFE = $afe->isInList( $node );
- if ( $inner > 3 && $isAFE ) {
- $afe->remove( $node );
- $isAFE = false;
- }
+ // Let the common ancestor be the element immediately above
+ // the formatting element in the stack of open elements.
+ $ancestor = $this->node( $index-1 );
+
+ // Let a bookmark note the position of the formatting
+ // element in the list of active formatting elements
+ // relative to the elements on either side of it in the
+ // list.
+ $BOOKMARK = new BalanceElement( '[bookmark]', '[bookmark]', [] );
+ $afe->insertAfter( $fmtElt, $BOOKMARK );
+
+ // Let node and last node be the furthest block.
+ $node = $furthestBlock;
+ $lastNode = $furthestBlock;
+ $nodeIndex = $furthestBlockIndex;
+ $isAFE = false;
+
+ // Inner loop
+ for ( $inner = 1; true; $inner++ ) {
+ // Let node be the element immediately above node in
+ // the stack of open elements, or if node is no longer
+ // in the stack of open elements (e.g. because it got
+ // removed by this algorithm), the element that was
+ // immediately above node in the stack of open elements
+ // before node was removed.
+ $node = $this->node( --$nodeIndex );
+
+ // If node is the formatting element, then go
+ // to the next step in the overall algorithm.
+ if ( $node === $fmtElt ) break;
+
+ // If the inner loop counter is greater than three and node
+ // is in the list of active formatting elements, then remove
+ // node from the list of active formatting elements.
+ $isAFE = $afe->isInList( $node );
+ if ( $inner > 3 && $isAFE ) {
+ $afe->remove( $node );
+ $isAFE = false;
+ }
- // If node is not in the list of active formatting
- // elements, then remove node from the stack of open
- // elements and then go back to the step labeled inner
- // loop.
- if ( !$isAFE ) {
- // Don't flatten here, since we're about to relocate
- // parts of this $node.
- $this->removeElement( $node, false );
- continue;
- }
+ // If node is not in the list of active formatting
+ // elements, then remove node from the stack of open
+ // elements and then go back to the step labeled inner
+ // loop.
+ if ( !$isAFE ) {
+ // Don't flatten here, since we're about to relocate
+ // parts of this $node.
+ $this->removeElement( $node, false );
+ continue;
+ }
- // Create an element for the token for which the
- // element node was created with common ancestor as
- // the intended parent, replace the entry for node
- // in the list of active formatting elements with an
- // entry for the new element, replace the entry for
- // node in the stack of open elements with an entry for
- // the new element, and let node be the new element.
- $newelt = new BalanceElement(
- $node->namespaceURI, $node->localName, $node->attribs );
- $afe->replace( $node, $newelt );
- $this->replaceAt( $nodeindex, $newelt );
- $node = $newelt;
-
- // If last node is the furthest block, then move the
- // aforementioned bookmark to be immediately after the
- // new node in the list of active formatting elements.
- if ( $lastnode === $furthestblock ) {
- $afe->remove( $BOOKMARK );
- $afe->insertAfter( $newelt, $BOOKMARK );
- }
+ // Create an element for the token for which the
+ // element node was created with common ancestor as
+ // the intended parent, replace the entry for node
+ // in the list of active formatting elements with an
+ // entry for the new element, replace the entry for
+ // node in the stack of open elements with an entry for
+ // the new element, and let node be the new element.
+ $newElt = new BalanceElement(
+ $node->namespaceURI, $node->localName, $node->attribs );
+ $afe->replace( $node, $newElt );
+ $this->replaceAt( $nodeIndex, $newElt );
+ $node = $newElt;
+
+ // If last node is the furthest block, then move the
+ // aforementioned bookmark to be immediately after the
+ // new node in the list of active formatting elements.
+ if ( $lastNode === $furthestBlock ) {
+ $afe->remove( $BOOKMARK );
+ $afe->insertAfter( $newElt, $BOOKMARK );
+ }
- // Insert last node into node, first removing it from
- // its previous parent node if any.
- $node->appendChild( $lastnode );
+ // Insert last node into node, first removing it from
+ // its previous parent node if any.
+ $node->appendChild( $lastNode );
- // Let last node be node.
- $lastnode = $node;
- }
+ // Let last node be node.
+ $lastNode = $node;
+ }
- // If the common ancestor node is a table, tbody, tfoot,
- // thead, or tr element, then, foster parent whatever last
- // node ended up being in the previous step, first removing
- // it from its previous parent node if any.
- if (
- $this->fosterParentMode &&
- $ancestor->isA( BalanceSets::$tableSectionRowSet )
- ) {
- $this->fosterParent( $lastnode );
- } else {
- // Otherwise, append whatever last node ended up being in
- // the previous step to the common ancestor node, first
- // removing it from its previous parent node if any.
- $ancestor->appendChild( $lastnode );
- }
+ // If the common ancestor node is a table, tbody, tfoot,
+ // thead, or tr element, then, foster parent whatever last
+ // node ended up being in the previous step, first removing
+ // it from its previous parent node if any.
+ if (
+ $this->fosterParentMode &&
+ $ancestor->isA( BalanceSets::$tableSectionRowSet )
+ ) {
+ $this->fosterParent( $lastNode );
+ } else {
+ // Otherwise, append whatever last node ended up being in
+ // the previous step to the common ancestor node, first
+ // removing it from its previous parent node if any.
+ $ancestor->appendChild( $lastNode );
+ }
- // Create an element for the token for which the
- // formatting element was created, with furthest block
- // as the intended parent.
- $newelt2 = new BalanceElement(
- $fmtelt->namespaceURI, $fmtelt->localName, $fmtelt->attribs );
+ // Create an element for the token for which the
+ // formatting element was created, with furthest block
+ // as the intended parent.
+ $newElt2 = new BalanceElement(
+ $fmtElt->namespaceURI, $fmtElt->localName, $fmtElt->attribs );
- // Take all of the child nodes of the furthest block and
- // append them to the element created in the last step.
- $newelt2->adoptChildren( $furthestblock );
+ // Take all of the child nodes of the furthest block and
+ // append them to the element created in the last step.
+ $newElt2->adoptChildren( $furthestBlock );
- // Append that new element to the furthest block.
- $furthestblock->appendChild( $newelt2 );
+ // Append that new element to the furthest block.
+ $furthestBlock->appendChild( $newElt2 );
- // Remove the formatting element from the list of active
- // formatting elements, and insert the new element into the
- // list of active formatting elements at the position of
- // the aforementioned bookmark.
- $afe->remove( $fmtelt );
- $afe->replace( $BOOKMARK, $newelt2 );
+ // Remove the formatting element from the list of active
+ // formatting elements, and insert the new element into the
+ // list of active formatting elements at the position of
+ // the aforementioned bookmark.
+ $afe->remove( $fmtElt );
+ $afe->replace( $BOOKMARK, $newElt2 );
- // Remove the formatting element from the stack of open
- // elements, and insert the new element into the stack of
- // open elements immediately below the position of the
- // furthest block in that stack.
- $this->removeElement( $fmtelt );
- $this->insertAfter( $furthestblock, $newelt2 );
- }
+ // Remove the formatting element from the stack of open
+ // elements, and insert the new element into the stack of
+ // open elements immediately below the position of the
+ // furthest block in that stack.
+ $this->removeElement( $fmtElt );
+ $this->insertAfter( $furthestBlock, $newElt2 );
}
return true;
// Loop backward through the list until we find a marker or an
// open element
+ $foundIt = false;
while ( $entry->prevAFE ) {
$entry = $entry->prevAFE;
if ( $entry instanceof BalanceMarker || $stack->indexOf( $entry ) >= 0 ) {
+ $foundIt = true;
break;
}
}
// the first element if we didn't find a marker or open element),
// recreating formatting elements and pushing them back onto the list
// of open elements.
- if ( $entry->prevAFE ) {
+ if ( $foundIt ) {
$entry = $entry->nextAFE;
}
do {
* - The document is never in "quirks mode".
* - All occurrences of < and > have been entity escaped, so we
* can parse tags by simply splitting on those two characters.
+ * (This also simplifies the handling of < inside <textarea>.)
+ * The character < must not appear inside comments.
* Similarly, all attributes have been "cleaned" and are double-quoted
* and escaped.
- * - All comments and null characters are assumed to have been removed.
- * - We don't alter linefeeds after <pre>/<listing>.
+ * - All null characters are assumed to have been removed.
* - The following elements are disallowed: <html>, <head>, <body>, <frameset>,
- * <form>, <frame>, <plaintext>, <isindex>, <textarea>, <xmp>, <iframe>,
- * <noembed>, <noscript>, <select>, <script>, <title>. As a result,
+ * <frame>, <plaintext>, <isindex>, <xmp>, <iframe>,
+ * <noembed>, <noscript>, <script>, <title>. As a result,
* further simplifications can be made:
* - `frameset-ok` is not tracked.
- * - `form element pointer` is not tracked.
* - `head element pointer` is not tracked (but presumed non-null)
- * - Tokenizer has only a single mode.
+ * - Tokenizer has only a single mode. (<textarea> wants RCDATA and
+ * <style>/<noframes> want RAWTEXT modes which we only loosely emulate.)
*
* We generally mark places where we omit cases from the spec due to
- * disallowed elements with a comment: `# OMITTED: <element-name>`.
+ * disallowed elements with a comment: `// OMITTED: <element-name>`.
*
* The HTML spec keeps a flag during the parsing process to track
* whether or not a "parse error" has been encountered. We don't
private $afe;
private $stack;
private $strict;
- private $tidyCompat;
+ private $allowComments;
+ private $config;
- private $textIntegrationMode = false;
+ private $textIntegrationMode;
private $pendingTableText;
private $originalInsertionMode;
private $fragmentContext;
+ private $formElementPointer;
+ private $ignoreLinefeed;
+ private $inRCDATA;
+ private $inRAWTEXT;
+
+ /**
+ * Valid HTML5 comments.
+ * Regex borrowed from Tim Starling's "remex-html" project.
+ */
+ const VALID_COMMENT_REGEX = "~ !--
+ ( # 1. Comment match detector
+ > | -> | # Invalid short close
+ ( # 2. Comment contents
+ (?:
+ (?! --> )
+ (?! --!> )
+ (?! --! \z )
+ (?! -- \z )
+ (?! - \z )
+ .
+ )*+
+ )
+ ( # 3. Comment close
+ --> | # Normal close
+ --!> | # Comment end bang
+ ( # 4. Indicate matches requiring EOF
+ --! | # EOF in comment end bang state
+ -- | # EOF in comment end state
+ - | # EOF in comment end dash state
+ # EOF in comment state
+ )
+ )
+ )
+ ([^<]*) \z # 5. Non-tag text after the comment
+ ~xs";
/**
* Create a new Balancer.
* program: <p>-wrapping is done to the children of
* <body> and <blockquote> elements, and empty elements
* are removed.
+ * 'allowComments': boolean, defaults to true.
+ * When true, allows HTML comments in the input.
+ * The Sanitizer generally strips all comments, so if you
+ * are running on sanitized output you can set this to
+ * false to get a bit more performance.
*/
public function __construct( array $config = [] ) {
- $config = $config + [
+ $this->config = $config = $config + [
'strict' => false,
'allowedHtmlElements' => null,
'tidyCompat' => false,
+ 'allowComments' => true,
];
$this->allowedHtmlElements = $config['allowedHtmlElements'];
$this->strict = $config['strict'];
- $this->tidyCompat = $config['tidyCompat'];
+ $this->allowComments = $config['allowComments'];
if ( $this->allowedHtmlElements !== null ) {
- # Sanity check!
+ // Sanity check!
$bad = array_uintersect_assoc(
$this->allowedHtmlElements,
BalanceSets::$unsupportedSet[BalanceSets::HTML_NAMESPACE],
$this->parseMode = 'inBodyMode';
$this->bitsIterator = new ExplodeIterator( '<', $text );
$this->afe = new BalanceActiveFormattingElements();
- $this->stack = new BalanceStack();
- $this->stack->tidyCompat = $this->tidyCompat;
+ $this->stack = new BalanceStack( $this->config );
$this->processingCallback = $processingCallback;
$this->processingArgs = $processingArgs;
- # The stack is constructed with an <html> element already on it.
- # Set this up as a fragment parsed with <body> as the context.
+ $this->textIntegrationMode =
+ $this->ignoreLinefeed =
+ $this->inRCDATA =
+ $this->inRAWTEXT = false;
+
+ // The stack is constructed with an <html> element already on it.
+ // Set this up as a fragment parsed with <body> as the context.
$this->fragmentContext =
new BalanceElement( BalanceSets::HTML_NAMESPACE, 'body', [] );
$this->resetInsertionMode();
+ $this->formElementPointer = null;
+ for ( $e = $this->fragmentContext; $e != null; $e = $e->parent ) {
+ if ( $e->isHtmlNamed( 'form' ) ) {
+ $this->formElementPointer = $e;
+ break;
+ }
+ }
// First element is text not tag
$x = $this->bitsIterator->current();
$this->afe = null;
$this->stack = null;
$this->fragmentContext = null;
+ $this->formElementPointer = null;
return $result;
}
* Pass a token to the tree builder. The $token will be one of the
* strings "tag", "endtag", or "text".
*/
- private function insertToken( $token, $value, $attribs = null, $selfclose = false ) {
+ private function insertToken( $token, $value, $attribs = null, $selfClose = false ) {
// validate tags against $unsupportedSet
if ( $token === 'tag' || $token === 'endtag' ) {
if ( isset( BalanceSets::$unsupportedSet[BalanceSets::HTML_NAMESPACE][$value] ) ) {
- # As described in "simplifications" above, these tags are
- # not supported in the balancer.
+ // As described in "simplifications" above, these tags are
+ // not supported in the balancer.
Assert::invariant(
!$this->strict,
"Unsupported $token <$value> found."
return false;
}
} elseif ( $token === 'text' && $value === '' ) {
- # Don't actually inject the empty string as a text token.
+ // Don't actually inject the empty string as a text token.
return true;
}
+ // Support pre/listing/textarea by suppressing initial linefeed
+ if ( $this->ignoreLinefeed ) {
+ $this->ignoreLinefeed = false;
+ if ( $token === 'text' ) {
+ if ( $value[0] === "\n" ) {
+ if ( $value === "\n" ) {
+ // Nothing would be left, don't inject the empty string.
+ return true;
+ }
+ $value = substr( $value, 1 );
+ }
+ }
+ }
// Some hoops we have to jump through
$adjusted = $this->stack->adjustedCurrentNode( $this->fragmentContext );
$isForeign = false;
}
if ( $isForeign ) {
- return $this->insertForeignToken( $token, $value, $attribs, $selfclose );
+ return $this->insertForeignToken( $token, $value, $attribs, $selfClose );
} else {
$func = $this->parseMode;
- return $this->$func( $token, $value, $attribs, $selfclose );
+ return $this->$func( $token, $value, $attribs, $selfClose );
}
}
- private function insertForeignToken( $token, $value, $attribs = null, $selfclose = false ) {
+ private function insertForeignToken( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'text' ) {
$this->stack->insertText( $value );
return true;
) {
break;
}
- /* otherwise, fall through */
+ // otherwise, fall through
case 'b':
case 'big':
case 'blockquote':
break;
}
}
- return $this->insertToken( $token, $value, $attribs, $selfclose );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
}
// "Any other start tag"
$adjusted = ( $this->fragmentContext && $this->stack->length()===1 ) ?
$this->stack->insertForeignElement(
$adjusted->namespaceURI, $value, $attribs
);
- if ( $selfclose ) {
+ if ( $selfClose ) {
$this->stack->pop();
}
return true;
if ( $node->isHtml() && !$first ) {
// process the end tag as HTML
$func = $this->parseMode;
- return $this->$func( $token, $value, $attribs, $selfclose );
+ return $this->$func( $token, $value, $attribs, $selfClose );
} elseif ( $i === 0 ) {
return true;
} elseif ( $node->localName === $value ) {
/**
* Grab the next "token" from $bitsIterator. This is either a open/close
- * tag or text, depending on whether the Sanitizer approves.
+ * tag or text or a comment, depending on whether the Sanitizer approves.
*/
private function advance() {
$x = $this->bitsIterator->current();
$this->bitsIterator->next();
$regs = [];
- # $slash: Does the current element start with a '/'?
- # $t: Current element name
- # $attribStr: String between element name and >
- # $brace: Ending '>' or '/>'
- # $rest: Everything until the next element from the $bitsIterator
+ // Handle comments. These won't be generated by mediawiki (they
+ // are stripped in the Sanitizer) but may be generated by extensions.
+ if (
+ $this->allowComments &&
+ !( $this->inRCDATA || $this->inRAWTEXT ) &&
+ preg_match( Balancer::VALID_COMMENT_REGEX, $x, $regs, PREG_OFFSET_CAPTURE ) &&
+ // verify EOF condition where necessary
+ ( $regs[4][1] < 0 || !$this->bitsIterator->valid() )
+ ) {
+ $contents = $regs[2][0];
+ $rest = $regs[5][0];
+ $this->insertToken( 'comment', $contents );
+ $this->insertToken( 'text', str_replace( '>', '>', $rest ) );
+ return;
+ }
+ // $slash: Does the current element start with a '/'?
+ // $t: Current element name
+ // $attribStr: String between element name and >
+ // $brace: Ending '>' or '/>'
+ // $rest: Everything until the next element from the $bitsIterator
if ( preg_match( Sanitizer::ELEMENT_BITS_REGEX, $x, $regs ) ) {
list( /* $qbar */, $slash, $t, $attribStr, $brace, $rest ) = $regs;
$t = strtolower( $t );
if ( $this->strict ) {
- /* Verify that attributes are all properly double-quoted */
+ // Verify that attributes are all properly double-quoted
Assert::invariant(
preg_match(
'/^( [:_A-Z0-9][-.:_A-Z0-9]*="[^"]*")*[ ]*$/i', $attribStr
);
$slash = $t = $attribStr = $brace = $rest = null;
}
- $goodtag = $t;
+ $goodTag = $t;
+ if ( $this->inRCDATA ) {
+ if ( $slash && $t === $this->inRCDATA ) {
+ $this->inRCDATA = false;
+ } else {
+ // No tags allowed; this emulates the "rcdata" tokenizer mode.
+ $goodTag = false;
+ }
+ }
+ if ( $this->inRAWTEXT ) {
+ if ( $slash && $t === $this->inRAWTEXT ) {
+ $this->inRAWTEXT = false;
+ } else {
+ // No tags allowed, no entity-escaping done.
+ $goodTag = false;
+ }
+ }
$sanitize = $this->allowedHtmlElements !== null;
if ( $sanitize ) {
- $goodtag = $t && isset( $this->allowedHtmlElements[$t] );
+ $goodTag = $t && isset( $this->allowedHtmlElements[$t] );
}
- if ( $goodtag ) {
+ if ( $goodTag ) {
if ( is_callable( $this->processingCallback ) ) {
call_user_func_array( $this->processingCallback, [ &$attribStr, $this->processingArgs ] );
}
if ( $sanitize ) {
- $goodtag = Sanitizer::validateTag( $attribStr, $t );
+ $goodTag = Sanitizer::validateTag( $attribStr, $t );
}
}
- if ( $goodtag ) {
+ if ( $goodTag ) {
if ( $sanitize ) {
$attribs = Sanitizer::decodeTagAttributes( $attribStr );
$attribs = Sanitizer::validateTagAttributes( $attribs, $t );
} else {
$attribs = Sanitizer::decodeTagAttributes( $attribStr );
}
- $goodtag = $this->insertToken(
+ $goodTag = $this->insertToken(
$slash ? 'endtag' : 'tag', $t, $attribs, $brace === '/>'
);
}
- if ( $goodtag ) {
+ if ( $goodTag ) {
$rest = str_replace( '>', '>', $rest );
$this->insertToken( 'text', str_replace( '>', '>', $rest ) );
+ } elseif ( $this->inRAWTEXT ) {
+ $this->insertToken( 'text', "<$x" );
} else {
- # bad tag; serialize entire thing as text.
+ // bad tag; serialize entire thing as text.
$this->insertToken( 'text', '<' . str_replace( '>', '>', $x ) );
}
}
return $oldMode;
}
- private function switchModeAndReprocess( $mode, $token, $value, $attribs, $selfclose ) {
+ private function switchModeAndReprocess( $mode, $token, $value, $attribs, $selfClose ) {
$this->switchMode( $mode );
- return $this->insertToken( $token, $value, $attribs, $selfclose );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
}
private function resetInsertionMode() {
}
if ( $node->isHtml() ) {
switch ( $node->localName ) {
- # OMITTED: <select>
- /*
case 'select':
- $stacklen = $this->stack->length();
- for ( $j = $i + 1; $j < $stacklen-1; $j++ ) {
- $ancestor = $this->stack->node( $stacklen-$j-1 );
+ $stackLength = $this->stack->length();
+ for ( $j = $i + 1; $j < $stackLength-1; $j++ ) {
+ $ancestor = $this->stack->node( $stackLength-$j-1 );
if ( $ancestor->isHtmlNamed( 'template' ) ) {
break;
}
}
$this->switchMode( 'inSelectMode' );
return;
- */
case 'tr':
$this->switchMode( 'inRowMode' );
return;
case 'body':
$this->switchMode( 'inBodyMode' );
return;
- # OMITTED: <frameset>
- # OMITTED: <html>
- # OMITTED: <head>
+ // OMITTED: <frameset>
+ // OMITTED: <html>
+ // OMITTED: <head>
default:
if ( !$last ) {
- # OMITTED: <head>
+ // OMITTED: <head>
if ( $node->isA( BalanceSets::$tableCellSet ) ) {
$this->switchMode( 'inCellMode' );
return;
}
private function stopParsing() {
- # Most of the spec methods are inapplicable, other than step 2:
- # "pop all the nodes off the stack of open elements".
- # We're going to keep the top-most <html> element on the stack, though.
-
- # Clear the AFE list first, otherwise the element objects will stay live
- # during serialization, potentially using O(N^2) memory. Note that
- # popping the stack will never result in reconstructing the active
- # formatting elements.
+ // Most of the spec methods are inapplicable, other than step 2:
+ // "pop all the nodes off the stack of open elements".
+ // We're going to keep the top-most <html> element on the stack, though.
+
+ // Clear the AFE list first, otherwise the element objects will stay live
+ // during serialization, potentially using O(N^2) memory. Note that
+ // popping the stack will never result in reconstructing the active
+ // formatting elements.
$this->afe = null;
$this->stack->popTo( 1 );
}
private function parseRawText( $value, $attribs = null ) {
$this->stack->insertHTMLElement( $value, $attribs );
- // XXX switch tokenizer to rawtext state?
+ $this->inRAWTEXT = $value;
$this->originalInsertionMode = $this->switchMode( 'inTextMode' );
return true;
}
- private function inTextMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inTextMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'text' ) {
$this->stack->insertText( $value );
return true;
} elseif ( $token === 'eof' ) {
$this->stack->pop();
return $this->switchModeAndReprocess(
- $this->originalInsertionMode, $token, $value, $attribs, $selfclose
+ $this->originalInsertionMode, $token, $value, $attribs, $selfClose
);
} elseif ( $token === 'endtag' ) {
$this->stack->pop();
return true;
}
- private function inHeadMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inHeadMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'text' ) {
if ( preg_match( '/^[\x09\x0A\x0C\x0D\x20]+/', $value, $matches ) ) {
$this->stack->insertText( $matches[0] );
} elseif ( $token === 'tag' ) {
switch ( $value ) {
case 'meta':
- # OMITTED: in a full HTML parser, this might change the encoding.
- /* falls through */
- # OMITTED: <html>
+ // OMITTED: in a full HTML parser, this might change the encoding.
+ // falls through
+ // OMITTED: <html>
case 'base':
case 'basefont':
case 'bgsound':
$this->stack->insertHTMLElement( $value, $attribs );
$this->stack->pop();
return true;
- # OMITTED: <title>
- # OMITTED: <noscript>
+ // OMITTED: <title>
+ // OMITTED: <noscript>
case 'noframes':
case 'style':
return $this->parseRawText( $value, $attribs );
- # OMITTED: <script>
+ // OMITTED: <script>
case 'template':
$this->stack->insertHTMLElement( $value, $attribs );
$this->afe->insertMarker();
- # OMITTED: frameset_ok
+ // OMITTED: frameset_ok
$this->switchMode( 'inTemplateMode' );
$this->templateInsertionModes[] = $this->parseMode;
return true;
- # OMITTED: <head>
+ // OMITTED: <head>
}
} elseif ( $token === 'endtag' ) {
switch ( $value ) {
- # OMITTED: <head>
- # OMITTED: <body>
- # OMITTED: <html>
+ // OMITTED: <head>
+ // OMITTED: <body>
+ // OMITTED: <html>
case 'br':
break; // handle at the bottom of the function
case 'template':
// ignore any other end tag
return true;
}
+ } elseif ( $token === 'comment' ) {
+ $this->stack->insertComment( $value );
+ return true;
}
// If not handled above
$this->inHeadMode( 'endtag', 'head' ); // synthetic </head>
// Then redo this one
- return $this->insertToken( $token, $value, $attribs, $selfclose );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
}
- private function inBodyMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inBodyMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'text' ) {
$this->afe->reconstruct( $this->stack );
$this->stack->insertText( $value );
return true;
} elseif ( $token === 'eof' ) {
if ( !empty( $this->templateInsertionModes ) ) {
- return $this->inTemplateMode( $token, $value, $attribs, $selfclose );
+ return $this->inTemplateMode( $token, $value, $attribs, $selfClose );
}
$this->stopParsing();
return true;
} elseif ( $token === 'tag' ) {
switch ( $value ) {
- # OMITTED: <html>
+ // OMITTED: <html>
case 'base':
case 'basefont':
case 'bgsound':
case 'link':
case 'meta':
case 'noframes':
- # OMITTED: <script>
+ // OMITTED: <script>
case 'style':
case 'template':
- # OMITTED: <title>
- return $this->inHeadMode( $token, $value, $attribs, $selfclose );
- # OMITTED: <body>
- # OMITTED: <frameset>
+ // OMITTED: <title>
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+ // OMITTED: <body>
+ // OMITTED: <frameset>
case 'address':
case 'article':
$this->inBodyMode( 'endtag', 'p' );
}
$this->stack->insertHTMLElement( $value, $attribs );
- # As described in "simplifications" above:
- # 1. We don't touch the next token, even if it's a linefeed.
- # 2. OMITTED: frameset_ok
+ $this->ignoreLinefeed = true;
+ // OMITTED: frameset_ok
return true;
- # OMITTED: <form>
+ case 'form':
+ if (
+ $this->formElementPointer &&
+ $this->stack->indexOf( 'template' ) < 0
+ ) {
+ return true; // in a form, not in a template.
+ }
+ if ( $this->stack->inButtonScope( "p" ) ) {
+ $this->inBodyMode( 'endtag', 'p' );
+ }
+ $elt = $this->stack->insertHTMLElement( $value, $attribs );
+ if ( $this->stack->indexOf( 'template' ) < 0 ) {
+ $this->formElementPointer = $elt;
+ }
+ return true;
case 'li':
- # OMITTED: frameset_ok
+ // OMITTED: frameset_ok
foreach ( $this->stack as $node ) {
if ( $node->isHtmlNamed( 'li' ) ) {
$this->inBodyMode( 'endtag', 'li' );
case 'dd':
case 'dt':
- # OMITTED: frameset_ok
+ // OMITTED: frameset_ok
foreach ( $this->stack as $node ) {
if ( $node->isHtmlNamed( 'dd' ) ) {
$this->inBodyMode( 'endtag', 'dd' );
$this->stack->insertHTMLElement( $value, $attribs );
return true;
- # OMITTED: <plaintext>
+ // OMITTED: <plaintext>
case 'button':
if ( $this->stack->inScope( 'button' ) ) {
$this->inBodyMode( 'endtag', 'button' );
- return $this->insertToken( $token, $value, $attribs, $selfclose );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
}
$this->afe->reconstruct( $this->stack );
$this->stack->insertHTMLElement( $value, $attribs );
$this->stack->removeElement( $activeElement, false );
}
}
- /* Falls through */
+ // Falls through
case 'b':
case 'big':
case 'code':
$this->afe->reconstruct( $this->stack );
$this->stack->insertHTMLElement( $value, $attribs );
$this->afe->insertMarker();
- # OMITTED: frameset_ok
+ // OMITTED: frameset_ok
return true;
case 'table':
- # The document is never in "quirks mode"; see simplifications
- # above.
+ // The document is never in "quirks mode"; see simplifications
+ // above.
if ( $this->stack->inButtonScope( 'p' ) ) {
$this->inBodyMode( 'endtag', 'p' );
}
$this->stack->insertHTMLElement( $value, $attribs );
- # OMITTED: frameset_ok
+ // OMITTED: frameset_ok
$this->switchMode( 'inTableMode' );
return true;
$this->afe->reconstruct( $this->stack );
$this->stack->insertHTMLElement( $value, $attribs );
$this->stack->pop();
- # OMITTED: frameset_ok
+ // OMITTED: frameset_ok
return true;
case 'input':
$this->afe->reconstruct( $this->stack );
$this->stack->insertHTMLElement( $value, $attribs );
$this->stack->pop();
- # OMITTED: frameset_ok
- # (hence we don't need to examine the tag's "type" attribute)
+ // OMITTED: frameset_ok
+ // (hence we don't need to examine the tag's "type" attribute)
return true;
case 'menuitem':
return true;
case 'image':
- # warts!
- return $this->inBodyMode( $token, 'img', $attribs, $selfclose );
-
- # OMITTED: <isindex>
- # OMITTED: <textarea>
- # OMITTED: <xmp>
- # OMITTED: <iframe>
- # OMITTED: <noembed>
- # OMITTED: <noscript>
-
- # OMITTED: <select>
- /*
+ // warts!
+ return $this->inBodyMode( $token, 'img', $attribs, $selfClose );
+
+ // OMITTED: <isindex>
+
+ case 'textarea':
+ $this->stack->insertHTMLElement( $value, $attribs );
+ $this->ignoreLinefeed = true;
+ $this->inRCDATA = $value; // emulate rcdata tokenizer mode
+ // OMITTED: frameset_ok
+ return true;
+
+ // OMITTED: <xmp>
+ // OMITTED: <iframe>
+ // OMITTED: <noembed>
+ // OMITTED: <noscript>
+
case 'select':
$this->afe->reconstruct( $this->stack );
$this->stack->insertHTMLElement( $value, $attribs );
$this->switchMode( 'inSelectMode' );
return true;
}
- */
case 'optgroup':
case 'option':
case 'math':
$this->afe->reconstruct( $this->stack );
- # We skip the spec's "adjust MathML attributes" and
- # "adjust foreign attributes" steps, since the browser will
- # do this later when it parses the output and it doesn't affect
- # balancing.
+ // We skip the spec's "adjust MathML attributes" and
+ // "adjust foreign attributes" steps, since the browser will
+ // do this later when it parses the output and it doesn't affect
+ // balancing.
$this->stack->insertForeignElement(
BalanceSets::MATHML_NAMESPACE, $value, $attribs
);
- if ( $selfclose ) {
- # emit explicit </math> tag.
+ if ( $selfClose ) {
+ // emit explicit </math> tag.
$this->stack->pop();
}
return true;
case 'svg':
$this->afe->reconstruct( $this->stack );
- # We skip the spec's "adjust SVG attributes" and
- # "adjust foreign attributes" steps, since the browser will
- # do this later when it parses the output and it doesn't affect
- # balancing.
+ // We skip the spec's "adjust SVG attributes" and
+ // "adjust foreign attributes" steps, since the browser will
+ // do this later when it parses the output and it doesn't affect
+ // balancing.
$this->stack->insertForeignElement(
BalanceSets::SVG_NAMESPACE, $value, $attribs
);
- if ( $selfclose ) {
- # emit explicit </svg> tag.
+ if ( $selfClose ) {
+ // emit explicit </svg> tag.
$this->stack->pop();
}
return true;
case 'caption':
case 'col':
case 'colgroup':
- # OMITTED: <frame>
+ // OMITTED: <frame>
case 'head':
case 'tbody':
case 'td':
return true;
} elseif ( $token === 'endtag' ) {
switch ( $value ) {
- # </body>,</html> are unsupported.
+ // </body>,</html> are unsupported.
case 'template':
- return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
case 'address':
case 'article':
$this->stack->popTag( $value );
return true;
- # OMITTED: <form>
+ case 'form':
+ if ( $this->stack->indexOf( 'template' ) < 0 ) {
+ $openform = $this->formElementPointer;
+ $this->formElementPointer = null;
+ if ( !$openform || !$this->stack->inScope( $openform ) ) {
+ return true;
+ }
+ $this->stack->generateImpliedEndTags();
+ // Don't flatten yet if we're removing a <form> element
+ // out-of-order. (eg. `<form><div></form>`)
+ $flatten = ( $this->stack->currentNode === $openform );
+ $this->stack->removeElement( $openform, $flatten );
+ } else {
+ if ( !$this->stack->inScope( 'form' ) ) {
+ return true;
+ }
+ $this->stack->generateImpliedEndTags();
+ $this->stack->popTag( 'form' );
+ }
+ return true;
case 'p':
if ( !$this->stack->inButtonScope( 'p' ) ) {
$this->inBodyMode( 'tag', 'p', [] );
- return $this->insertToken( $token, $value, $attribs, $selfclose );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
}
$this->stack->generateImpliedEndTags( $value );
$this->stack->popTag( $value );
case 'li':
if ( !$this->stack->inListItemScope( $value ) ) {
- return true; # ignore
+ return true; // ignore
}
$this->stack->generateImpliedEndTags( $value );
$this->stack->popTag( $value );
case 'dd':
case 'dt':
if ( !$this->stack->inScope( $value ) ) {
- return true; # ignore
+ return true; // ignore
}
$this->stack->generateImpliedEndTags( $value );
$this->stack->popTag( $value );
case 'h5':
case 'h6':
if ( !$this->stack->inScope( BalanceSets::$headingSet ) ) {
- return;
+ return true; // ignore
}
$this->stack->generateImpliedEndTags();
$this->stack->popTag( BalanceSets::$headingSet );
return true;
case 'sarcasm':
- # Take a deep breath, then:
+ // Take a deep breath, then:
break;
case 'a':
case 'tt':
case 'u':
if ( $this->stack->adoptionAgency( $value, $this->afe ) ) {
- return true; # If we did something, we're done.
+ return true; // If we did something, we're done.
}
- break; # Go to the "any other end tag" case.
+ break; // Go to the "any other end tag" case.
case 'applet':
case 'marquee':
case 'object':
if ( !$this->stack->inScope( $value ) ) {
- return true; # ignore
+ return true; // ignore
}
$this->stack->generateImpliedEndTags();
$this->stack->popTag( $value );
return true;
case 'br':
- # Turn </br> into <br>
+ // Turn </br> into <br>
return $this->inBodyMode( 'tag', $value, [] );
}
foreach ( $this->stack as $i => $node ) {
if ( $node->isHtmlNamed( $value ) ) {
$this->stack->generateImpliedEndTags( $value );
- $this->stack->popTo( $i ); # including $i
+ $this->stack->popTo( $i ); // including $i
break;
} elseif ( $node->isA( BalanceSets::$specialSet ) ) {
return true; // ignore this close token.
}
}
return true;
+ } elseif ( $token === 'comment' ) {
+ $this->stack->insertComment( $value );
+ return true;
} else {
Assert::invariant( false, "Bad token type: $token" );
}
}
- private function inTableMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inTableMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'text' ) {
if ( $this->textIntegrationMode ) {
- return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+ return $this->inBodyMode( $token, $value, $attribs, $selfClose );
} elseif ( $this->stack->currentNode->isA( BalanceSets::$tableSectionRowSet ) ) {
$this->pendingTableText = '';
$this->originalInsertionMode = $this->parseMode;
- return $this->switchModeAndReprocess( 'inTableTextMode', $token, $value, $attribs, $selfclose );
+ return $this->switchModeAndReprocess( 'inTableTextMode',
+ $token, $value, $attribs, $selfClose );
}
// fall through to default case.
} elseif ( $token === 'eof' ) {
return true;
case 'col':
$this->inTableMode( 'tag', 'colgroup', [] );
- return $this->insertToken( $token, $value, $attribs, $selfclose );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
case 'tbody':
case 'tfoot':
case 'thead':
case 'th':
case 'tr':
$this->inTableMode( 'tag', 'tbody', [] );
- return $this->insertToken( $token, $value, $attribs, $selfclose );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
case 'table':
if ( !$this->stack->inTableScope( $value ) ) {
return true; // Ignore this tag.
}
$this->inTableMode( 'endtag', $value );
- return $this->insertToken( $token, $value, $attribs, $selfclose );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
case 'style':
- # OMITTED: <script>
+ // OMITTED: <script>
case 'template':
- return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
case 'input':
if ( !isset( $attribs['type'] ) || strcasecmp( $attribs['type'], 'hidden' ) !== 0 ) {
$this->stack->pop();
return true;
- # OMITTED: <form>
+ case 'form':
+ if (
+ $this->formElementPointer ||
+ $this->stack->indexOf( 'template' ) >= 0
+ ) {
+ return true; // ignore this token
+ }
+ $this->formElementPointer =
+ $this->stack->insertHTMLElement( $value, $attribs );
+ $this->stack->popTag( $this->formElementPointer );
+ return true;
}
// Fall through for "anything else" clause.
} elseif ( $token === 'endtag' ) {
$this->stack->popTag( $value );
$this->resetInsertionMode();
return true;
- # OMITTED: <body>
+ // OMITTED: <body>
case 'caption':
case 'col':
case 'colgroup':
- # OMITTED: <html>
+ // OMITTED: <html>
case 'tbody':
case 'td':
case 'tfoot':
case 'tr':
return true; // Ignore the token.
case 'template':
- return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
}
// Fall through for "anything else" clause.
+ } elseif ( $token === 'comment' ) {
+ $this->stack->insertComment( $value );
+ return true;
}
// This is the "anything else" case:
$this->stack->fosterParentMode = true;
- $this->inBodyMode( $token, $value, $attribs, $selfclose );
+ $this->inBodyMode( $token, $value, $attribs, $selfClose );
$this->stack->fosterParentMode = false;
return true;
}
- private function inTableTextMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inTableTextMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'text' ) {
$this->pendingTableText .= $value;
return true;
$this->stack->insertText( $text );
}
return $this->switchModeAndReprocess(
- $this->originalInsertionMode, $token, $value, $attribs, $selfclose
+ $this->originalInsertionMode, $token, $value, $attribs, $selfClose
);
}
return true;
}
- private function inCaptionMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inCaptionMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'tag' ) {
switch ( $value ) {
case 'caption':
case 'thead':
case 'tr':
if ( $this->endCaption() ) {
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
}
return true;
case 'table':
if ( $this->endCaption() ) {
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
case 'body':
case 'col':
case 'colgroup':
- # OMITTED: <html>
+ // OMITTED: <html>
case 'tbody':
case 'td':
case 'tfoot':
// Fall through to "anything else" case.
}
// The Anything Else case
- return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+ return $this->inBodyMode( $token, $value, $attribs, $selfClose );
}
- private function inColumnGroupMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inColumnGroupMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'text' ) {
if ( preg_match( '/^[\x09\x0A\x0C\x0D\x20]+/', $value, $matches ) ) {
$this->stack->insertText( $matches[0] );
// Fall through to handle non-whitespace below.
} elseif ( $token === 'tag' ) {
switch ( $value ) {
- # OMITTED: <html>
+ // OMITTED: <html>
case 'col':
$this->stack->insertHTMLElement( $value, $attribs );
$this->stack->pop();
return true;
case 'template':
- return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
}
// Fall through for "anything else".
} elseif ( $token === 'endtag' ) {
case 'col':
return true; // Ignore the token.
case 'template':
- return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
}
// Fall through for "anything else".
} elseif ( $token === 'eof' ) {
- return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+ return $this->inBodyMode( $token, $value, $attribs, $selfClose );
+ } elseif ( $token === 'comment' ) {
+ $this->stack->insertComment( $value );
+ return true;
}
// Anything else
return true; // Ignore the token.
}
$this->inColumnGroupMode( 'endtag', 'colgroup' );
- return $this->insertToken( $token, $value, $attribs, $selfclose );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
}
// Helper function for inTableBodyMode
$this->switchMode( 'inTableMode' );
return true;
}
- private function inTableBodyMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inTableBodyMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'tag' ) {
switch ( $value ) {
case 'tr':
case 'th':
case 'td':
$this->inTableBodyMode( 'tag', 'tr', [] );
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
return true;
case 'caption':
case 'col':
case 'tfoot':
case 'thead':
if ( $this->endSection() ) {
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
}
switch ( $value ) {
case 'table':
if ( $this->endSection() ) {
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
case 'tbody':
$this->endSection();
}
return true;
- # OMITTED: <body>
+ // OMITTED: <body>
case 'caption':
case 'col':
case 'colgroup':
- # OMITTED: <html>
+ // OMITTED: <html>
case 'td':
case 'th':
case 'tr':
}
}
// Anything else:
- return $this->inTableMode( $token, $value, $attribs, $selfclose );
+ return $this->inTableMode( $token, $value, $attribs, $selfClose );
}
// Helper function for inRowMode
$this->switchMode( 'inTableBodyMode' );
return true;
}
- private function inRowMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inRowMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'tag' ) {
switch ( $value ) {
case 'th':
case 'thead':
case 'tr':
if ( $this->endRow() ) {
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
}
return true;
case 'table':
if ( $this->endRow() ) {
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
case 'tbody':
$this->stack->inTableScope( $value ) &&
$this->endRow()
) {
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
- # OMITTED: <body>
+ // OMITTED: <body>
case 'caption':
case 'col':
case 'colgroup':
- # OMITTED: <html>
+ // OMITTED: <html>
case 'td':
case 'th':
return true; // Ignore the token.
}
}
// Anything else:
- return $this->inTableMode( $token, $value, $attribs, $selfclose );
+ return $this->inTableMode( $token, $value, $attribs, $selfClose );
}
// Helper for inCellMode
return false;
}
}
- private function inCellMode( $token, $value, $attribs = null, $selfclose = false ) {
+ private function inCellMode( $token, $value, $attribs = null, $selfClose = false ) {
if ( $token === 'tag' ) {
switch ( $value ) {
case 'caption':
case 'thead':
case 'tr':
if ( $this->endCell() ) {
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
}
$this->switchMode( 'inRowMode' );
}
return true;
- # OMITTED: <body>
+ // OMITTED: <body>
case 'caption':
case 'col':
case 'colgroup':
- # OMITTED: <html>
+ // OMITTED: <html>
return true;
case 'table':
$this->stack->popTag( BalanceSets::$tableCellSet );
$this->afe->clearToMarker();
$this->switchMode( 'inRowMode' );
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
}
}
// Anything else:
- return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+ return $this->inBodyMode( $token, $value, $attribs, $selfClose );
}
- # OMITTED: <select>
- /*
- private function inSelectMode( $token, $value, $attribs = null, $selfclose = false ) {
- Assert::invariant( false, 'Unimplemented' );
+ private function inSelectMode( $token, $value, $attribs = null, $selfClose = false ) {
+ if ( $token === 'text' ) {
+ $this->stack->insertText( $value );
+ return true;
+ } elseif ( $token === 'eof' ) {
+ return $this->inBodyMode( $token, $value, $attribs, $selfClose );
+ } elseif ( $token === 'tag' ) {
+ switch ( $value ) {
+ // OMITTED: <html>
+ case 'option':
+ if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+ $this->stack->pop();
+ }
+ $this->stack->insertHTMLElement( $value, $attribs );
+ return true;
+ case 'optgroup':
+ if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+ $this->stack->pop();
+ }
+ if ( $this->stack->currentNode->isHtmlNamed( 'optgroup' ) ) {
+ $this->stack->pop();
+ }
+ $this->stack->insertHTMLElement( $value, $attribs );
+ return true;
+ case 'select':
+ $this->inSelectMode( 'endtag', $value ); // treat it like endtag
+ return true;
+ case 'input':
+ case 'keygen':
+ case 'textarea':
+ if ( !$this->stack->inSelectScope( 'select' ) ) {
+ return true; // ignore token (fragment case)
+ }
+ $this->inSelectMode( 'endtag', 'select' );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
+ case 'script':
+ case 'template':
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+ }
+ } elseif ( $token === 'endtag' ) {
+ switch ( $value ) {
+ case 'optgroup':
+ if (
+ $this->stack->currentNode->isHtmlNamed( 'option' ) &&
+ $this->stack->length() >= 2 &&
+ $this->stack->node( $this->stack->length() - 2 )->isHtmlNamed( 'optgroup' )
+ ) {
+ $this->stack->pop();
+ }
+ if ( $this->stack->currentNode->isHtmlNamed( 'optgroup' ) ) {
+ $this->stack->pop();
+ }
+ return true;
+ case 'option':
+ if ( $this->stack->currentNode->isHtmlNamed( 'option' ) ) {
+ $this->stack->pop();
+ }
+ return true;
+ case 'select':
+ if ( !$this->stack->inSelectScope( $value ) ) {
+ return true; // fragment case
+ }
+ $this->stack->popTag( $value );
+ $this->resetInsertionMode();
+ return true;
+ case 'template':
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
+ }
+ } elseif ( $token === 'comment' ) {
+ $this->stack->insertComment( $value );
+ return true;
+ }
+ // anything else: just ignore the token
+ return true;
}
- private function inSelectInTableMode( $token, $value, $attribs = null, $selfclose = false ) {
- Assert::invariant( false, 'Unimplemented' );
+ private function inSelectInTableMode( $token, $value, $attribs = null, $selfClose = false ) {
+ switch ( $value ) {
+ case 'caption':
+ case 'table':
+ case 'tbody':
+ case 'tfoot':
+ case 'thead':
+ case 'tr':
+ case 'td':
+ case 'th':
+ if ( $token === 'tag' ) {
+ $this->inSelectInTableMode( 'endtag', 'select' );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
+ } elseif ( $token === 'endtag' ) {
+ if ( $this->stack->inTableScope( $value ) ) {
+ $this->inSelectInTableMode( 'endtag', 'select' );
+ return $this->insertToken( $token, $value, $attribs, $selfClose );
+ }
+ return true;
+ }
+ }
+ // anything else
+ return $this->inSelectMode( $token, $value, $attribs, $selfClose );
}
- */
- private function inTemplateMode( $token, $value, $attribs = null, $selfclose = false ) {
- if ( $token === 'text' ) {
- return $this->inBodyMode( $token, $value, $attribs, $selfclose );
+ private function inTemplateMode( $token, $value, $attribs = null, $selfClose = false ) {
+ if ( $token === 'text' || $token === 'comment' ) {
+ return $this->inBodyMode( $token, $value, $attribs, $selfClose );
} elseif ( $token === 'eof' ) {
if ( $this->stack->indexOf( 'template' ) < 0 ) {
$this->stopParsing();
$this->afe->clearToMarker();
array_pop( $this->templateInsertionModes );
$this->resetInsertionMode();
- $this->insertToken( $token, $value, $attribs, $selfclose );
+ $this->insertToken( $token, $value, $attribs, $selfClose );
}
return true;
} elseif ( $token === 'tag' ) {
case 'link':
case 'meta':
case 'noframes':
- # OMITTED: <script>
+ // OMITTED: <script>
case 'style':
case 'template':
- # OMITTED: <title>
- return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+ // OMITTED: <title>
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
case 'caption':
case 'colgroup':
case 'tfoot':
case 'thead':
return $this->switchModeAndReprocess(
- 'inTableMode', $token, $value, $attribs, $selfclose
+ 'inTableMode', $token, $value, $attribs, $selfClose
);
case 'col':
return $this->switchModeAndReprocess(
- 'inColumnGroupMode', $token, $value, $attribs, $selfclose
+ 'inColumnGroupMode', $token, $value, $attribs, $selfClose
);
case 'tr':
return $this->switchModeAndReprocess(
- 'inTableBodyMode', $token, $value, $attribs, $selfclose
+ 'inTableBodyMode', $token, $value, $attribs, $selfClose
);
case 'td':
case 'th':
return $this->switchModeAndReprocess(
- 'inRowMode', $token, $value, $attribs, $selfclose
+ 'inRowMode', $token, $value, $attribs, $selfClose
);
}
return $this->switchModeAndReprocess(
- 'inBodyMode', $token, $value, $attribs, $selfclose
+ 'inBodyMode', $token, $value, $attribs, $selfClose
);
} elseif ( $token === 'endtag' ) {
switch ( $value ) {
case 'template':
- return $this->inHeadMode( $token, $value, $attribs, $selfclose );
+ return $this->inHeadMode( $token, $value, $attribs, $selfClose );
}
return true;
} else {
// Preserve empty li elements (T49673) by abusing Tidy's datafld hack
// The whitespace class is as in TY_(InitMap)
$wrappedtext = preg_replace( "!<li>([ \r\n\t\f]*)</li>!",
- '<li datafld="" class="mw-empty-li">\1</li>', $wrappedtext );
+ '<li datafld="" class="mw-empty-elt">\1</li>', $wrappedtext );
// Wrap the whole thing in a doctype and body for Tidy.
$wrappedtext = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' .
'ISO-8859-1',
'ISO-8859-2',
'UTF-16',
- 'UTF-32'
+ 'UTF-32',
+ 'WINDOWS-1250',
+ 'WINDOWS-1251',
+ 'WINDOWS-1252',
+ 'WINDOWS-1253',
+ 'WINDOWS-1254',
+ 'WINDOWS-1255',
+ 'WINDOWS-1256',
+ 'WINDOWS-1257',
+ 'WINDOWS-1258',
];
const SUCCESS = 0;
*
* @param User $user
* @return UploadStashFile Stashed file
+ * @throws UploadStashBadPathException
+ * @throws UploadStashFileException
+ * @throws UploadStashNotLoggedInException
*/
public function stashFile( User $user = null ) {
- // was stashSessionFile
-
$stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $user );
$file = $stash->stashFile( $this->mTempPath, $this->getSourceType() );
$this->mLocalFile = $file;
* Stash a file in a temporary directory, returning a key which can be used
* to find the file again. See stashFile().
*
+ * @deprecated since 1.28
* @return string File key
*/
public function stashFileGetKey() {
+ wfDeprecated( __METHOD__, '1.28' );
return $this->stashFile()->getFileKey();
}
/**
* alias for stashFileGetKey, for backwards compatibility
*
+ * @deprecated since 1.28
* @return string File key
*/
public function stashSession() {
- return $this->stashFileGetKey();
+ wfDeprecated( __METHOD__, '1.28' );
+ return $this->stashFile()->getFileKey();
}
/**
return $this->mLocalFile;
}
- /**
- * This should return the key instead of the UploadStashFile instance, for backward compatibility.
- * @return string
- */
- public function stashSession() {
- return $this->stashFile()->getFileKey();
- }
-
/**
* Remove a temporarily kept file stashed by saveTempUploadedFile().
* @return bool Success
* @since 1.27
*/
public static function newSystemUser( $name, $options = [] ) {
- global $wgDisableAuthManager;
-
$options += [
'validate' => 'valid',
'create' => true,
}
$fields = self::selectFields();
- if ( $wgDisableAuthManager ) {
- $fields = array_merge( $fields, [ 'user_password', 'user_newpassword' ] );
- }
$dbw = wfGetDB( DB_MASTER );
$row = $dbw->selectRow(
// A user is considered to exist as a non-system user if it can
// authenticate, or has an email set, or has a non-invalid token.
- if ( !$user->mEmail && $user->mToken === self::INVALID_TOKEN ) {
- if ( $wgDisableAuthManager ) {
- $passwordFactory = new PasswordFactory();
- $passwordFactory->init( RequestContext::getMain()->getConfig() );
- try {
- $password = $passwordFactory->newFromCiphertext( $row->user_password );
- } catch ( PasswordError $e ) {
- wfDebug( 'Invalid password hash found in database.' );
- $password = PasswordFactory::newInvalidPassword();
- }
- try {
- $newpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
- } catch ( PasswordError $e ) {
- wfDebug( 'Invalid password hash found in database.' );
- $newpassword = PasswordFactory::newInvalidPassword();
- }
- $canAuthenticate = !$password instanceof InvalidPassword ||
- !$newpassword instanceof InvalidPassword;
- } else {
- $canAuthenticate = AuthManager::singleton()->userCanAuthenticate( $name );
- }
- }
- if ( $user->mEmail || $user->mToken !== self::INVALID_TOKEN || $canAuthenticate ) {
+ if ( $user->mEmail || $user->mToken !== self::INVALID_TOKEN ||
+ AuthManager::singleton()->userCanAuthenticate( $name )
+ ) {
// User exists. Steal it?
if ( !$options['steal'] ) {
return null;
}
- if ( $wgDisableAuthManager ) {
- $nopass = PasswordFactory::newInvalidPassword()->toString();
- $dbw->update(
- 'user',
- [
- 'user_password' => $nopass,
- 'user_newpassword' => $nopass,
- 'user_newpass_time' => null,
- ],
- [ 'user_id' => $user->getId() ],
- __METHOD__
- );
- } else {
- AuthManager::singleton()->revokeAccessForUser( $name );
- }
+ AuthManager::singleton()->revokeAccessForUser( $name );
$user->invalidateEmail();
$user->mToken = self::INVALID_TOKEN;
return self::$idCacheByName[$name];
}
- $db = ( $flags & self::READ_LATEST )
- ? wfGetDB( DB_MASTER )
- : wfGetDB( DB_SLAVE );
+ list( $index, $options ) = DBAccessObjectUtils::getDBOptions( $flags );
+ $db = wfGetDB( $index );
$s = $db->selectRow(
'user',
[ 'user_id' ],
[ 'user_name' => $nt->getText() ],
- __METHOD__
+ __METHOD__,
+ $options
);
if ( $s === false ) {
return true;
}
+ /**
+ * Return the users who are members of the given group(s). In case of multiple groups,
+ * users who are members of at least one of them are returned.
+ *
+ * @param string|array $groups A single group name or an array of group names
+ * @param int $limit Max number of users to return. The actual limit will never exceed 5000
+ * records; larger values are ignored.
+ * @param int $after ID the user to start after
+ * @return UserArrayFromResult
+ */
+ public static function findUsersByGroup( $groups, $limit = 5000, $after = null ) {
+ if ( $groups === [] ) {
+ return UserArrayFromResult::newFromIDs( [] );
+ }
+
+ $groups = array_unique( (array)$groups );
+ $limit = min( 5000, $limit );
+
+ $conds = [ 'ug_group' => $groups ];
+ if ( $after !== null ) {
+ $conds[] = 'ug_user > ' . (int)$after;
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $ids = $dbr->selectFieldValues(
+ 'user_groups',
+ 'ug_user',
+ $conds,
+ __METHOD__,
+ [
+ 'DISTINCT' => true,
+ 'ORDER BY' => 'ug_user',
+ 'LIMIT' => $limit,
+ ]
+ ) ?: [];
+ return UserArray::newFromIDs( $ids );
+ }
+
/**
* Usernames which fail to pass this function will be blocked
* from new account registrations, but may be used internally
*/
protected function loadFromUserObject( $user ) {
$user->load();
- $user->loadGroups();
- $user->loadOptions();
foreach ( self::$mCacheVars as $var ) {
$this->$var = $user->$var;
}
* @return bool
*/
public function setPassword( $str ) {
- global $wgAuth, $wgDisableAuthManager;
-
- if ( !$wgDisableAuthManager ) {
- return $this->setPasswordInternal( $str );
- }
-
- if ( $str !== null ) {
- if ( !$wgAuth->allowPasswordChange() ) {
- throw new PasswordError( wfMessage( 'password-change-forbidden' )->text() );
- }
-
- $status = $this->checkPasswordValidity( $str );
- if ( !$status->isGood() ) {
- throw new PasswordError( $status->getMessage()->text() );
- }
- }
-
- if ( !$wgAuth->setPassword( $this, $str ) ) {
- throw new PasswordError( wfMessage( 'externaldberror' )->text() );
- }
-
- $this->setOption( 'watchlisttoken', false );
- $this->setPasswordInternal( $str );
-
- return true;
+ return $this->setPasswordInternal( $str );
}
/**
* through the web interface.
*/
public function setInternalPassword( $str ) {
- global $wgAuth, $wgDisableAuthManager;
-
- if ( !$wgDisableAuthManager ) {
- $this->setPasswordInternal( $str );
- }
-
- if ( $wgAuth->allowSetLocalPassword() ) {
- $this->setOption( 'watchlisttoken', false );
- $this->setPasswordInternal( $str );
- }
+ $this->setPasswordInternal( $str );
}
/**
* @return bool Success
*/
private function setPasswordInternal( $str ) {
- global $wgDisableAuthManager;
-
- if ( $wgDisableAuthManager ) {
- $id = self::idFromName( $this->getName(), self::READ_LATEST );
- if ( $id == 0 ) {
- throw new LogicException( 'Cannot set a password for a user that is not in the database.' );
- }
-
- $passwordFactory = new PasswordFactory();
- $passwordFactory->init( RequestContext::getMain()->getConfig() );
- $dbw = wfGetDB( DB_MASTER );
- $dbw->update(
- 'user',
- [
- 'user_password' => $passwordFactory->newFromPlaintext( $str )->toString(),
- 'user_newpassword' => PasswordFactory::newInvalidPassword()->toString(),
- 'user_newpass_time' => $dbw->timestampOrNull( null ),
- ],
- [
- 'user_id' => $id,
- ],
- __METHOD__
- );
-
- // When the main password is changed, invalidate all bot passwords too
- BotPassword::invalidateAllPasswordsForUser( $this->getName() );
- } else {
- $manager = AuthManager::singleton();
-
- // If the user doesn't exist yet, fail
- if ( !$manager->userExists( $this->getName() ) ) {
- throw new LogicException( 'Cannot set a password for a user that is not in the database.' );
- }
+ $manager = AuthManager::singleton();
- $status = $this->changeAuthenticationData( [
- 'username' => $this->getName(),
- 'password' => $str,
- 'retype' => $str,
- ] );
- if ( !$status->isGood() ) {
- \MediaWiki\Logger\LoggerFactory::getInstance( 'authentication' )
- ->info( __METHOD__ . ': Password change rejected: '
- . $status->getWikiText( null, null, 'en' ) );
- return false;
- }
+ // If the user doesn't exist yet, fail
+ if ( !$manager->userExists( $this->getName() ) ) {
+ throw new LogicException( 'Cannot set a password for a user that is not in the database.' );
+ }
- $this->setOption( 'watchlisttoken', false );
+ $status = $this->changeAuthenticationData( [
+ 'username' => $this->getName(),
+ 'password' => $str,
+ 'retype' => $str,
+ ] );
+ if ( !$status->isGood() ) {
+ \MediaWiki\Logger\LoggerFactory::getInstance( 'authentication' )
+ ->info( __METHOD__ . ': Password change rejected: '
+ . $status->getWikiText( null, null, 'en' ) );
+ return false;
}
+ $this->setOption( 'watchlisttoken', false );
SessionManager::singleton()->invalidateSessionsForUser( $this );
return true;
* @since 1.27
*/
public function changeAuthenticationData( array $data ) {
- global $wgDisableAuthManager;
- if ( $wgDisableAuthManager ) {
- throw new LogicException( __METHOD__ . ' cannot be called when $wgDisableAuthManager '
- . 'is true' );
- }
-
$manager = AuthManager::singleton();
$reqs = $manager->getAuthenticationRequests( AuthManager::ACTION_CHANGE, $this );
$reqs = AuthenticationRequest::loadRequestsFromSubmission( $reqs, $data );
* @param bool $throttle If true, reset the throttle timestamp to the present
*/
public function setNewpassword( $str, $throttle = true ) {
- global $wgDisableAuthManager;
-
- if ( $wgDisableAuthManager ) {
- $id = $this->getId();
- if ( $id == 0 ) {
- throw new LogicException( 'Cannot set new password for a user that is not in the database.' );
- }
-
- $dbw = wfGetDB( DB_MASTER );
-
- $passwordFactory = new PasswordFactory();
- $passwordFactory->init( RequestContext::getMain()->getConfig() );
- $update = [
- 'user_newpassword' => $passwordFactory->newFromPlaintext( $str )->toString(),
- ];
-
- if ( $str === null ) {
- $update['user_newpass_time'] = null;
- } elseif ( $throttle ) {
- $update['user_newpass_time'] = $dbw->timestamp();
- }
-
- $dbw->update( 'user', $update, [ 'user_id' => $id ], __METHOD__ );
- } else {
- throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
- }
+ throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
}
/**
* @return bool
*/
public function isPasswordReminderThrottled() {
- global $wgPasswordReminderResendTime, $wgDisableAuthManager;
-
- if ( $wgDisableAuthManager ) {
- if ( !$wgPasswordReminderResendTime ) {
- return false;
- }
-
- $this->load();
-
- $db = ( $this->queryFlagsUsed & self::READ_LATEST )
- ? wfGetDB( DB_MASTER )
- : wfGetDB( DB_SLAVE );
- $newpassTime = $db->selectField(
- 'user',
- 'user_newpass_time',
- [ 'user_id' => $this->getId() ],
- __METHOD__
- );
-
- if ( $newpassTime === null ) {
- return false;
- }
- $expiry = wfTimestamp( TS_UNIX, $newpassTime ) + $wgPasswordReminderResendTime * 3600;
- return time() < $expiry;
- } else {
- throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
- }
+ throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
}
/**
* @return string|bool User's current value for the option, or false if this option is disabled.
* @see resetTokenFromOption()
* @see getOption()
- * @deprecated 1.26 Applications should use the OAuth extension
+ * @deprecated since 1.26 Applications should use the OAuth extension
*/
public function getTokenFromOption( $oname ) {
global $wgHiddenPrefs;
* @return bool True if the given password is correct, otherwise False
*/
public function checkPassword( $password ) {
- global $wgAuth, $wgLegacyEncoding, $wgDisableAuthManager;
-
- if ( $wgDisableAuthManager ) {
- $this->load();
-
- // Some passwords will give a fatal Status, which means there is
- // some sort of technical or security reason for this password to
- // be completely invalid and should never be checked (e.g., T64685)
- if ( !$this->checkPasswordValidity( $password )->isOK() ) {
- return false;
- }
-
- // Certain authentication plugins do NOT want to save
- // domain passwords in a mysql database, so we should
- // check this (in case $wgAuth->strict() is false).
- if ( $wgAuth->authenticate( $this->getName(), $password ) ) {
+ $manager = AuthManager::singleton();
+ $reqs = AuthenticationRequest::loadRequestsFromSubmission(
+ $manager->getAuthenticationRequests( AuthManager::ACTION_LOGIN ),
+ [
+ 'username' => $this->getName(),
+ 'password' => $password,
+ ]
+ );
+ $res = AuthManager::singleton()->beginAuthentication( $reqs, 'null:' );
+ switch ( $res->status ) {
+ case AuthenticationResponse::PASS:
return true;
- } elseif ( $wgAuth->strict() ) {
- // Auth plugin doesn't allow local authentication
- return false;
- } elseif ( $wgAuth->strictUserAuth( $this->getName() ) ) {
- // Auth plugin doesn't allow local authentication for this user name
+ case AuthenticationResponse::FAIL:
+ // Hope it's not a PreAuthenticationProvider that failed...
+ \MediaWiki\Logger\LoggerFactory::getInstance( 'authentication' )
+ ->info( __METHOD__ . ': Authentication failed: ' . $res->message->plain() );
return false;
- }
-
- $passwordFactory = new PasswordFactory();
- $passwordFactory->init( RequestContext::getMain()->getConfig() );
- $db = ( $this->queryFlagsUsed & self::READ_LATEST )
- ? wfGetDB( DB_MASTER )
- : wfGetDB( DB_SLAVE );
-
- try {
- $mPassword = $passwordFactory->newFromCiphertext( $db->selectField(
- 'user', 'user_password', [ 'user_id' => $this->getId() ], __METHOD__
- ) );
- } catch ( PasswordError $e ) {
- wfDebug( 'Invalid password hash found in database.' );
- $mPassword = PasswordFactory::newInvalidPassword();
- }
-
- if ( !$mPassword->equals( $password ) ) {
- if ( $wgLegacyEncoding ) {
- // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
- // Check for this with iconv
- $cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
- if ( $cp1252Password === $password || !$mPassword->equals( $cp1252Password ) ) {
- return false;
- }
- } else {
- return false;
- }
- }
-
- if ( $passwordFactory->needsUpdate( $mPassword ) && !wfReadOnly() ) {
- $this->setPasswordInternal( $password );
- }
-
- return true;
- } else {
- $manager = AuthManager::singleton();
- $reqs = AuthenticationRequest::loadRequestsFromSubmission(
- $manager->getAuthenticationRequests( AuthManager::ACTION_LOGIN ),
- [
- 'username' => $this->getName(),
- 'password' => $password,
- ]
- );
- $res = AuthManager::singleton()->beginAuthentication( $reqs, 'null:' );
- switch ( $res->status ) {
- case AuthenticationResponse::PASS:
- return true;
- case AuthenticationResponse::FAIL:
- // Hope it's not a PreAuthenticationProvider that failed...
- \MediaWiki\Logger\LoggerFactory::getInstance( 'authentication' )
- ->info( __METHOD__ . ': Authentication failed: ' . $res->message->plain() );
- return false;
- default:
- throw new BadMethodCallException(
- 'AuthManager returned a response unsupported by ' . __METHOD__
- );
- }
+ default:
+ throw new BadMethodCallException(
+ 'AuthManager returned a response unsupported by ' . __METHOD__
+ );
}
}
* @return bool True if matches, false otherwise
*/
public function checkTemporaryPassword( $plaintext ) {
- global $wgNewPasswordExpiry, $wgDisableAuthManager;
-
- if ( $wgDisableAuthManager ) {
- $this->load();
-
- $passwordFactory = new PasswordFactory();
- $passwordFactory->init( RequestContext::getMain()->getConfig() );
- $db = ( $this->queryFlagsUsed & self::READ_LATEST )
- ? wfGetDB( DB_MASTER )
- : wfGetDB( DB_SLAVE );
-
- $row = $db->selectRow(
- 'user',
- [ 'user_newpassword', 'user_newpass_time' ],
- [ 'user_id' => $this->getId() ],
- __METHOD__
- );
- try {
- $newPassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
- } catch ( PasswordError $e ) {
- wfDebug( 'Invalid password hash found in database.' );
- $newPassword = PasswordFactory::newInvalidPassword();
- }
-
- if ( $newPassword->equals( $plaintext ) ) {
- if ( is_null( $row->user_newpass_time ) ) {
- return true;
- }
- $expiry = wfTimestamp( TS_UNIX, $row->user_newpass_time ) + $wgNewPasswordExpiry;
- return ( time() < $expiry );
- } else {
- return false;
- }
- } else {
- // Can't check the temporary password individually.
- return $this->checkPassword( $plaintext );
- }
+ // Can't check the temporary password individually.
+ return $this->checkPassword( $plaintext );
}
/**
// If we actually have a slave server, the count is
// at least one behind because the current transaction
// has not been committed and replicated.
- $this->initEditCount( 1 );
+ $this->mEditCount = $this->initEditCount( 1 );
} else {
// But if DB_SLAVE is selecting the master, then the
// count we just read includes the revision that was
// just added in the working transaction.
- $this->initEditCount();
+ $this->mEditCount = $this->initEditCount();
+ }
+ } else {
+ if ( $this->mEditCount === null ) {
+ $this->getEditCount();
+ $dbr = wfGetDB( DB_SLAVE );
+ $this->mEditCount += ( $dbr !== $dbw ) ? 1 : 0;
+ } else {
+ $this->mEditCount++;
}
}
// Edit count in user cache too
* - false will be converted to 'create' if this object is the same as
* $wgUser and to 'create2' otherwise
* @param string $reason User supplied reason
- * @return int|bool True if not $wgNewUserLog or not $wgDisableAuthManager;
- * otherwise ID of log item or 0 on failure
+ * @return bool true
*/
public function addNewUserLogEntry( $action = false, $reason = '' ) {
- global $wgUser, $wgNewUserLog, $wgDisableAuthManager;
- if ( !$wgDisableAuthManager || empty( $wgNewUserLog ) ) {
- return true; // disabled
- }
-
- if ( $action === true ) {
- $action = 'byemail';
- } elseif ( $action === false ) {
- if ( $this->equals( $wgUser ) ) {
- $action = 'create';
- } else {
- $action = 'create2';
- }
- }
-
- if ( $action === 'create' || $action === 'autocreate' ) {
- $performer = $this;
- } else {
- $performer = $wgUser;
- }
-
- $logEntry = new ManualLogEntry( 'newusers', $action );
- $logEntry->setPerformer( $performer );
- $logEntry->setTarget( $this->getUserPage() );
- $logEntry->setComment( $reason );
- $logEntry->setParameters( [
- '4::userid' => $this->getId(),
- ] );
- $logid = $logEntry->insert();
-
- if ( $action !== 'autocreate' ) {
- $logEntry->publish( $logid );
- }
-
- return (int)$logid;
+ return true; // disabled
}
/**
* $gen->generateAutoload();
*/
class AutoloadGenerator {
+ const FILETYPE_JSON = 'json';
+ const FILETYPE_PHP = 'php';
+
/**
* @var string Root path of the project being scanned for classes
*/
* Updates the AutoloadClasses field at the given
* filename.
*
- * @param {string} $filename Filename of JSON
+ * @param string $filename Filename of JSON
* extension/skin registration file
+ * @return string Updated Json of the file given as the $filename parameter
*/
protected function generateJsonAutoload( $filename ) {
- require_once __DIR__ . '/../../includes/json/FormatJson.php';
$key = 'AutoloadClasses';
$json = FormatJson::decode( file_get_contents( $filename ), true );
unset( $json[$key] );
// Sorting the list of autoload classes.
ksort( $json[$key] );
- // Update file, using constants for the required
- // formatting.
- file_put_contents( $filename,
- FormatJson::encode( $json, true ) . "\n" );
+ // Return the whole JSON file
+ return FormatJson::encode( $json, true ) . "\n";
}
/**
}
$output = implode( "\n\t", $content );
- file_put_contents(
- $filename,
+ return
<<<EOD
<?php
// This file is generated by $commandName, do not adjust manually
{$output}
];
-EOD
- );
+EOD;
}
/**
- * Write out all known classes to autoload.php, extension.json, or skin.json in
- * the provided basedir
+ * Returns all known classes as a string, which can be used to put into a target
+ * file (e.g. extension.json, skin.json or autoload.php)
*
* @param string $commandName Value used in file comment to direct
* developers towards the appropriate way to update the autoload.
+ * @return string
*/
- public function generateAutoload( $commandName = 'AutoloadGenerator' ) {
+ public function getAutoload( $commandName = 'AutoloadGenerator' ) {
// We need to check whether an extenson.json or skin.json exists or not, and
// incase it doesn't, update the autoload.php file.
- $jsonFilename = null;
- if ( file_exists( $this->basepath . "/extension.json" ) ) {
- $jsonFilename = $this->basepath . "/extension.json";
- } elseif ( file_exists( $this->basepath . "/skin.json" ) ) {
- $jsonFilename = $this->basepath . "/skin.json";
- }
+ $fileinfo = $this->getTargetFileinfo();
- if ( $jsonFilename !== null ) {
- $this->generateJsonAutoload( $jsonFilename );
+ if ( $fileinfo['type'] === self::FILETYPE_JSON ) {
+ return $this->generateJsonAutoload( $fileinfo['filename'] );
} else {
- $this->generatePHPAutoload( $commandName, $this->basepath . '/autoload.php' );
+ return $this->generatePHPAutoload( $commandName, $fileinfo['filename'] );
+ }
+ }
+
+ /**
+ * Returns the filename of the extension.json of skin.json, if there's any, or
+ * otherwise the path to the autoload.php file in an array as the "filename"
+ * key and with the type (AutoloadGenerator::FILETYPE_JSON or AutoloadGenerator::FILETYPE_PHP)
+ * of the file as the "type" key.
+ *
+ * @return array
+ */
+ public function getTargetFileinfo() {
+ $fileinfo = [
+ 'filename' => $this->basepath . '/autoload.php',
+ 'type' => self::FILETYPE_PHP
+ ];
+ if ( file_exists( $this->basepath . '/extension.json' ) ) {
+ $fileinfo = [
+ 'filename' => $this->basepath . '/extension.json',
+ 'type' => self::FILETYPE_JSON
+ ];
+ } elseif ( file_exists( $this->basepath . '/skin.json' ) ) {
+ $fileinfo = [
+ 'filename' => $this->basepath . '/skin.json',
+ 'type' => self::FILETYPE_JSON
+ ];
}
+
+ return $fileinfo;
}
+
/**
* Ensure that Unix-style path separators ("/") are used in the path.
*
protected static function normalizePathSeparator( $path ) {
return str_replace( '\\', '/', $path );
}
+
+ /**
+ * Initialize the source files and directories which are used for the MediaWiki default
+ * autoloader in {mw-base-dir}/autoload.php including:
+ * * includes/
+ * * languages/
+ * * maintenance/
+ * * mw-config/
+ * * /*.php
+ */
+ public function initMediaWikiDefault() {
+ foreach ( [ 'includes', 'languages', 'maintenance', 'mw-config' ] as $dir ) {
+ $this->readDir( $this->basepath . '/' . $dir );
+ }
+ foreach ( glob( $this->basepath . '/*.php' ) as $file ) {
+ $this->readFile( $file );
+ }
+ }
}
/**
protected $db;
/**
- * @var string $table The name of the table to read from
+ * @var string|array $table The name or names of the table to read from
*/
protected $table;
/**
* @param IDatabase $db The database to read from
- * @param string $table The name of the table to read from
+ * @param string|array $table The name or names of the table to read from
* @param string|array $primaryKey The name or names of the primary key columns
* @param integer $batchSize The number of rows to fetch per iteration
* @throws MWException
* `=` conditions while the final key uses a `>` condition
*
* Example output:
- * array( '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' )
+ * [ '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' ]
*
* @return array The SQL conditions necessary to select the next set
* of rows in the batched query
": Falling back to using a pseudo random state to generate randomness.\n" );
}
while ( strlen( $buffer ) < $bytes ) {
- $buffer .= MWCryptHash::hmac( $this->randomState(), mt_rand() );
+ $buffer .= MWCryptHash::hmac( $this->randomState(), strval( mt_rand() ) );
// This code is never really cryptographically strong, if we use it
// at all, then set strong to false.
$this->strong = false;
$this->title = new TitleInputWidget( array_merge(
$config['title'],
[
- // The inner TitleInputWidget shouldn't be infusable,
- // only the ComplexTitleInputWidget itself can be.
- 'infusable' => false,
'relative' => true,
'namespace' => isset( $config['namespace']['value'] ) ?
$config['namespace']['value'] :
*/
public function __construct( array $config = [] ) {
$config = array_merge( [
- 'infusable' => true,
'maxLength' => null,
'type' => 'search',
'icon' => 'search',
public function __construct( array $config = [] ) {
// Parent constructor
parent::__construct(
- array_merge( [ 'infusable' => true, 'maxLength' => 255 ], $config )
+ array_merge( [ 'maxLength' => 255 ], $config )
);
// Properties, which are ignored in PHP and just shipped back to JS
*/
public function __construct( array $config = [] ) {
// Parent constructor
- parent::__construct( array_merge( [ 'infusable' => true ], $config ) );
+ parent::__construct( $config );
// Initialization
$this->addClasses( [ 'mw-widget-userInputWidget' ] );
* @return string
*/
public function iconv( $in, $out, $string ) {
- # This is a wrapper for iconv in all languages except esperanto,
- # which does some nasty x-conversions beforehand
-
# Even with //IGNORE iconv can whine about illegal characters in
# *input* string. We just ignore those too.
# REF: http://bugs.php.net/bug.php?id=37166
}
}
+ /**
+ * @deprecated No-op since 1.28
+ */
function initEncoding() {
- # Some languages may have an alternate char encoding option
- # (Esperanto X-coding, Japanese furigana conversion, etc)
- # If this language is used as the primary content language,
- # an override to the defaults can be set here on startup.
+ // No-op.
}
/**
* @param string $s
* @return string
+ * @deprecated No-op since 1.28
*/
function recodeForEdit( $s ) {
- # For some languages we'll want to explicitly specify
- # which characters make it into the edit box raw
- # or are converted in some way or another.
- global $wgEditEncoding;
- if ( $wgEditEncoding == '' || $wgEditEncoding == 'UTF-8' ) {
- return $s;
- } else {
- return $this->iconv( 'UTF-8', $wgEditEncoding, $s );
- }
+ return $s;
}
/**
* @param string $s
* @return string
+ * @deprecated No-op since 1.28
*/
function recodeInput( $s ) {
- # Take the previous into account.
- global $wgEditEncoding;
- if ( $wgEditEncoding != '' ) {
- $enc = $wgEditEncoding;
- } else {
- $enc = 'UTF-8';
- }
- if ( $enc == 'UTF-8' ) {
- return $s;
- } else {
- return $this->iconv( $enc, 'UTF-8', $s );
- }
+ return $s;
}
/**
+++ /dev/null
-<?php
-/**
- * Esperanto (Esperanto) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Brion Vibber <brion@pobox.com>
- * @ingroup Language
- */
-
-/**
- * Esperanto (Esperanto)
- *
- * @ingroup Language
- */
-class LanguageEo extends Language {
- /**
- * Wrapper for charset conversions.
- *
- * In most languages, this calls through to standard system iconv(), but
- * for Esperanto we're also adding a special pseudo-charset to convert
- * accented characters to/from the ASCII-friendly "X" surrogate coding:
- *
- * cx = ĉ cxx = cx
- * gx = ĝ gxx = gx
- * hx = ĥ hxx = hx
- * jx = ĵ jxx = jx
- * sx = ŝ sxx = sx
- * ux = ŭ uxx = ux
- * xx = x
- *
- * http://en.wikipedia.org/wiki/Esperanto_orthography#X-system
- * http://eo.wikipedia.org/wiki/X-sistemo
- *
- * X-conversion is applied, in either direction, between "utf-8" and "x" charsets;
- * this comes into effect when input is run through $wgRequest->getText() and the
- * $wgEditEncoding is set to 'x'.
- *
- * In the long run, this should be moved out of here and into the client-side
- * editor behavior; the original server-side translation system dates to 2002-2003
- * when many browsers with really bad Unicode support were still in use.
- *
- * @param string $in Input character set
- * @param string $out Output character set
- * @param string $string Text to be converted
- * @return string
- */
- public function iconv( $in, $out, $string ) {
- if ( strcasecmp( $in, 'x' ) == 0 && strcasecmp( $out, 'utf-8' ) == 0 ) {
- return preg_replace_callback(
- '/([cghjsu]x?)((?:xx)*)(?!x)/i',
- [ $this, 'strrtxuCallback' ], $string );
- } elseif ( strcasecmp( $in, 'UTF-8' ) == 0 && strcasecmp( $out, 'x' ) == 0 ) {
- # Double Xs only if they follow cxapelutaj literoj.
- return preg_replace_callback(
- '/((?:[cghjsu]|\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]|\xc5[\x9c\x9d\xac\xad])x*)/i',
- [ $this, 'strrtuxCallback' ], $string );
- }
- return parent::iconv( $in, $out, $string );
- }
-
- /**
- * @param array $matches
- * @return string
- */
- function strrtuxCallback( $matches ) {
- static $ux = [
- 'x' => 'xx', 'X' => 'Xx',
- "\xc4\x88" => "Cx", "\xc4\x89" => "cx",
- "\xc4\x9c" => "Gx", "\xc4\x9d" => "gx",
- "\xc4\xa4" => "Hx", "\xc4\xa5" => "hx",
- "\xc4\xb4" => "Jx", "\xc4\xb5" => "jx",
- "\xc5\x9c" => "Sx", "\xc5\x9d" => "sx",
- "\xc5\xac" => "Ux", "\xc5\xad" => "ux",
- ];
- return strtr( $matches[1], $ux );
- }
-
- /**
- * @param array $matches
- * @return string
- */
- function strrtxuCallback( $matches ) {
- static $xu = [
- 'xx' => 'x', 'xX' => 'x',
- 'Xx' => 'X', 'XX' => 'X',
- "Cx" => "\xc4\x88", "CX" => "\xc4\x88",
- "cx" => "\xc4\x89", "cX" => "\xc4\x89",
- "Gx" => "\xc4\x9c", "GX" => "\xc4\x9c",
- "gx" => "\xc4\x9d", "gX" => "\xc4\x9d",
- "Hx" => "\xc4\xa4", "HX" => "\xc4\xa4",
- "hx" => "\xc4\xa5", "hX" => "\xc4\xa5",
- "Jx" => "\xc4\xb4", "JX" => "\xc4\xb4",
- "jx" => "\xc4\xb5", "jX" => "\xc4\xb5",
- "Sx" => "\xc5\x9c", "SX" => "\xc5\x9c",
- "sx" => "\xc5\x9d", "sX" => "\xc5\x9d",
- "Ux" => "\xc5\xac", "UX" => "\xc5\xac",
- "ux" => "\xc5\xad", "uX" => "\xc5\xad",
- ];
- return strtr( $matches[1], $xu ) . strtr( $matches[2], $xu );
- }
-
- function initEncoding() {
- global $wgEditEncoding;
- $wgEditEncoding = 'x';
- }
-}
'shi' => 'Tašlḥiyt/ⵜⴰⵛⵍⵃⵉⵜ', # Tachelhit (multiple scripts - defaults to Latin)
'shi-tfng' => 'ⵜⴰⵛⵍⵃⵉⵜ', # Tachelhit (Tifinagh script)
'shi-latn' => 'Tašlḥiyt', # Tachelhit (Latin script)
+ 'shn' => 'ၽႃႇသႃႇတႆး ', # Shan
'si' => 'සිංහල', # Sinhalese
'simple' => 'Simple English', # Simple English
'sk' => 'slovenčina', # Slovak
'埘' => '塒',
'埙' => '塤',
'埚' => '堝',
-'埯' => '垵',
'堑' => '塹',
'堕' => '墮',
'墙' => '牆',
'不好干预' => '不好干預',
'不嫌母丑' => '不嫌母醜',
'不寒而栗' => '不寒而慄',
-'不吊' => '不弔',
+'不吊,' => '不弔,',
'不卷' => '不捲',
'不采' => '不採',
'不斗胆' => '不斗膽',
'并入' => '併入',
'并兼' => '併兼',
'并到' => '併到',
+'并力' => '併力',
'并合' => '併合',
'并名' => '併名',
'并吞' => '併吞',
'其次辟地' => '其次辟地',
'其余' => '其餘',
'典范' => '典範',
-'兼并' => '兼并',
+'兼并' => '兼併',
'冉有仆' => '冉有僕',
'冗余' => '冗餘',
'冤仇' => '冤讎',
'吟游' => '吟遊',
'吧台' => '吧檯',
'含齿戴发' => '含齒戴髮',
+'吸干' => '吸乾',
'吹干' => '吹乾',
'吹发' => '吹髮',
'吹胡' => '吹鬍',
'嶒棱' => '嶒稜',
'岳岳' => '嶽嶽',
'岳麓' => '嶽麓',
-'川谷' => '川穀',
'巡回医疗' => '巡回醫療',
'巡回' => '巡迴',
'巡游' => '巡遊',
'年谷' => '年穀',
'年里' => '年裡',
'年鉴' => '年鑑',
-'并力' => '并力',
'并州' => '并州',
'并日而食' => '并日而食',
'并迭' => '并迭',
'吊孝' => '弔孝',
'吊客' => '弔客',
'吊宴' => '弔宴',
-'吊带' => '弔帶',
'吊影' => '弔影',
'吊恤' => '弔恤',
'吊慰' => '弔慰',
'吊撒' => '弔撒',
'吊文' => '弔文',
'吊旗' => '弔旗',
-'吊死' => '弔死',
'吊民' => '弔民',
'吊祭' => '弔祭',
'吊纸' => '弔紙',
'抱素怀朴' => '抱素懷樸',
'抵御' => '抵禦',
'抹干' => '抹乾',
+'抽干' => '抽乾',
'抽公签' => '抽公籤',
'抽签' => '抽籤',
'抿发' => '抿髮',
'扫荡' => '掃蕩',
'授勋' => '授勳',
'掌柜' => '掌柜',
+'排干' => '排乾',
+'排干部' => '排幹部',
'排骨面' => '排骨麵',
'挂名' => '掛名',
'挂历' => '掛曆',
'药面儿' => '藥麵兒',
'苏崑' => '蘇崑',
'苏昆' => '蘇崑',
+'苹婆' => '蘋婆',
'苹果' => '蘋果',
'苹果干' => '蘋果乾',
'兰溪市' => '蘭谿市',
'炼金术' => '鍊金術',
'锲而不舍' => '鍥而不捨',
'镰仓' => '鎌倉',
+'镇里' => '鎮裡',
'镜图里' => '鏡圖裡',
'锈病' => '鏽病',
'锈菌' => '鏽菌',
'龜山庄' => '龜山庄',
'龟鉴' => '龜鑑',
',并力' => ',並力',
-',并力攻' => ',并力攻',
',并力討' => ',并力討',
',并力讨' => ',并力討',
',个中' => ',箇中',
'圞' => '𪢮',
'坿' => '附',
'垜' => '垛',
-'垵' => '埯',
'埡' => '垭',
-'埰' => '采',
'執' => '执',
'堅' => '坚',
'堊' => '垩',
'甦醒' => '苏醒',
'苧烯' => '苧烯',
'薴烯' => '苧烯',
+'蘋婆' => '苹婆',
'蘋果' => '苹果',
'荠苧' => '荠苧',
'榮陞' => '荣升',
'威士顿康星' => '威斯康辛',
'威尔士' => '威爾斯',
'威爾士' => '威爾斯',
-'字库' => '字型檔',
'存盘' => '存檔',
'孟德爾遜' => '孟德爾頌',
'门德尔松' => '孟德爾頌',
'見著述' => '見著述',
'見著錄' => '見著錄',
'視著' => '視着',
+'視著作' => '視著作',
'視著名' => '視著名',
+'視著稱' => '視著稱',
+'視著者' => '視著者',
'角落里' => '角落裏',
'分辨率' => '解像度',
'解析度' => '解像度',
'鋪著者' => '鋪著者',
'鋪著述' => '鋪著述',
'鋪著錄' => '鋪著錄',
+'镇里' => '鎮裏',
'镜图里' => '鏡圖裏',
'钟在寺里' => '鐘在寺裏',
'狄托' => '鐵托',
'威爾斯' => '威尔士',
'威斯伐倫' => '威斯特法伦',
'字型大小' => '字号',
-'字型檔' => '字库',
'欄位' => '字段',
'位元組' => '字节',
'存在著' => '存在着',
'見著述' => '见著述',
'規畫' => '规划',
'視著' => '视着',
+'視著作' => '视著作',
'視著名' => '视著名',
+'視著稱' => '视著称',
+'視著者' => '视著者',
'占士邦' => '詹姆斯·邦德',
'警戒著' => '警戒着',
'計畫' => '计划',
"GeekEmad",
"Nemo bis",
"Shbib Al-Subaie",
- "Macofe"
+ "Macofe",
+ "علاء"
]
},
"tog-usenewrc": ")جمّع التعديلات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت",
"rc-enhanced-hide": "أخفِ التفاصيل",
"recentchangeslinked": "تغييرات ذات علاقة",
"recentchangeslinked-title": "التغييرات المرتبطة ب \"$1\"",
- "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
+ "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثاً للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
"recentchangeslinked-page": "اسم الصفحة:",
- "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
+ "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضاً عن ذلك",
"uploadlogpage": "سجل الرفع",
"filedesc": "ملخص:",
"license": "ترخيص:",
"Maroen1990",
"Sonic N800",
"Jdforrester",
- "Alaa"
+ "Alaa",
+ "Izoozo",
+ "علاء",
+ "Hhaboh162002"
]
},
"tog-underline": "سطر تحت الوصلات:",
"tog-enotifrevealaddr": "أظهر عنوان بريدي الإلكتروني في إشعارات البريد الإلكتروني",
"tog-shownumberswatching": "اعرض عدد المستخدمين المراقبين",
"tog-oldsig": "التوقيع الحالي:",
- "tog-fancysig": "وضع الوصلة يدويا واستعمال نص الويكي",
+ "tog-fancysig": "وضع الوصلة يدوياً واستعمال نص الويكي",
"tog-uselivepreview": "استعمال المعاينة المباشرة",
"tog-forceeditsummary": "نبهني عند عدم إدخال ملخص تعديل",
"tog-watchlisthideown": "أخف تعديلاتي من قائمة المراقبة",
"category_header": "صفحات تصنيف «$1»",
"subcategories": "تصنيفات فرعية",
"category-media-header": "ملفات تصنيف \"$1\"",
- "category-empty": "هذا التصنيف لا يحتوي حاليا على صفحات أو ملفات.",
+ "category-empty": "هذا التصنيف لا يحتوي حالياً على أي صفحات أو ملفات.",
"hidden-categories": "{{PLURAL:$1|لا تصنيفات مخفية|تصنيف مخفي|تصنيفان مخفيان|تصنيفات مخفية}}",
"hidden-category-category": "تصنيفات مخفية",
"category-subcat-count": "{{PLURAL:$2|هذا التصنيف يحوي التصنيف الفرعي التالي|هذا التصنيف يحوي {{PLURAL:$1||التصنيف الفرعي|تصنيفين فرعيين|$1 تصنيفات فرعية}}، من إجمالي $2.}}",
"tagline": "من {{SITENAME}}",
"help": "مساعدة",
"search": "بحث",
+ "search-ignored-headings": "# <!-- أترك هذا السطر كما هو --> <pre>\n# سيتم تجاهل الترويسات خلال عملية البحث\n#ا لتغييرات ستأخذ مجراها ما أن يتم فهرسة الصفحة التي تحتوي على ترويسات\n# يمكنك فرض عملية فهرسة الصفحة من خلال تعديل فارغ\n# الصيغة هي كالأتي:\n# * كل ما يكتب بعد \"#\" إلى آخر السطر يعتبر تعليق\n# * كل سطر غير فارغ سيكون العنوان الذي سيتم تجاهله (سيأخذ العنوان كما هو بالضبط بالتشكيل وخلافه)\nالمراجع\nالوصلات الخارجية\nأنظر أيضا\n#</pre><!--أترك هذا السطر كما هو -->",
"searchbutton": "ابحث",
"go": "اذهب",
"searcharticle": "اذهب",
"createacct-email-ph": "أدخل عنوان بريدك الإلكتروني",
"createacct-another-email-ph": "أدخل عنوان البريد الإلكتروني",
"createaccountmail": "استخدم كلمة سر عشوائية مؤقتة وارسلها إلى عنوان البريد الإلكتروني المحدد أدناه",
+ "createaccountmail-help": "يمكن استخدامه لإنشاء حساب لشخص آخر من دون معرفة كلمة المرور.",
"createacct-realname": "الاسم الحقيقي (اختياري)",
"createaccountreason": "السبب:",
"createacct-reason": "السبب",
"createacct-reason-ph": "لماذا تقوم بإنشاء حساب آخر",
+ "createacct-reason-help": "رسالة تظهر في سجل إنشاء الحسابات",
"createacct-submit": "افتح الحساب",
"createacct-another-submit": "أنشئ حسابا",
"createacct-continue-submit": "مواصلة إنشاء الحساب",
"passwordreset-emailelement": "اسم {{GENDER:$1\n|المستخدم|المستخدمة}}: \n$1\n\nكلمة السر المؤقتة: \n$2",
"passwordreset-emailsentemail": "إذا كان هذا العنوان البريد مرتبط بحسابك، من ثم سيتم إرسال بريد إلكتروني لإعادة تعيين كلمة السر.",
"passwordreset-emailsentusername": "إذا كان هناك عنوان بريد إلكتروني مرتبط بهذا المستخدم، ثم سيتم إرسال بريد إلكتروني لإعادة تعيين كلمة السر.",
- "passwordreset-emailsent-capture": "أُرسل بريد إلكتروني لإعادة ضبط كلمة السر، وهو معروض بالأسفل.",
- "passwordreset-emailerror-capture": "تم توليد رسالة بريد إلكتروني لتصفير كلمة السر نصّه التالي، إلا أنه تعذّر إرسال الرّسالة إلى {{GENDER:$2|المستخدم|المستخدمة}}: $1",
"passwordreset-invalideamil": "عنوان بريد إلكتروني غير صالح",
"changeemail": "تغيير أو إزالة عنوان البريد الإلكتروني",
"changeemail-header": "إكمال هذا النموذج لتغيير عنوان البريد الإلكتروني الخاص بك. إذا كنت ترغب في إزالة جمعية أي عنوان البريد الإلكتروني من حسابك، وترك الفراغ عنوان البريد الإلكتروني الجديد عند تقديم النموذج",
- "changeemail-passwordrequired": "تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.",
"changeemail-no-info": "يجب تسجيل الدخول للوصول إلى هذه الصفحة مباشرة.",
"changeemail-oldemail": "عنوان البريد الإلكتروني الحالي:",
"changeemail-newemail": "عنوان البريد الإلكتروني الجديد:",
"savearticle": "احفظ الصفحة",
"savechanges": "احفظ التغييرات",
"publishpage": "نشر الصفحة",
- "publishchanges": "انشر التغييرات",
+ "publishchanges": "نشر التغييرات",
"preview": "عرض مسبق",
"showpreview": "أظهر معاينة",
"showdiff": "عرض التغييرات",
"blankarticle": "<strong>تنبيه:</strong> الصفحة التي تريد إنشاءها فارغة. إذا نقرت \"{{int:savearticle}}\" ثانية فستنشأ الصفحة بدون محتوى.",
- "anoneditwarning": "'''تحذير:''' لم تقم بالدخول.\nسيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
+ "anoneditwarning": "<strong>تحذير:</strong> أنت غير مسجل الدخول. عنوان الأيبي الخاص بك سيكون معروضا بشكل علني لو قمت بأي تعديلات. لو أنك <strong>[$1 سجلت الدخول]</strong> أو <strong>[$2 أنشأت حسابا]</strong>، فتعديلاتك ستنسب لاسم المستخدم الخاص بك، بالإضافة إلى فوائد أخرى.",
"anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
"missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
"selfredirect": "<strong>تحذير:</strong> أنت تقوم بتحويل الصفحة إلى نفسها.\nربما حددت الهدف الخطأ للتحويلة أو أنك تقوم بتحرير الصفحة الخطأ.\n\nإذا نقرت على «{{int:savearticle}}» مرة أخرى، سيتم إنشاء التحويلة رغم الخطأ.",
"content-model-css": "CSS",
"content-json-empty-object": "غرض فارغ",
"content-json-empty-array": "مصفوفة فارغة",
+ "deprecated-self-close-category": "صفحات تستخدم وسوم أتش تي أم أل غير صالحة",
"duplicate-args-warning": "<strong>تنبيه:</strong> المدخل \"$3\" ل[[:$1]] المستعمل في [[:$2]] مكرر. آخر قيمة مكرر منه هي المعتمدة.",
"duplicate-args-category": "صفحات تستعمل قالبا ببيانات مكررة",
"duplicate-args-category-desc": "تحوي هذه الصفحة استدعاءات قالب تستخدم متغيرات مزدوجة مثل <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> أو <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "التعديل يبدو أنه قد تم الترجع عنه بالفعل.",
"undo-summary": "الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
"undo-summary-username-hidden": "الرجوع عن المراجعة $1 التي أجراها مستخدمي مخفي",
- "cantcreateaccounttitle": "لا يمكن إنشاء حساب",
"cantcreateaccount-text": "إنشاء الحسابات من عنوان الأيبي هذا ('''$1''') تم منعه بواسطة [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو ''$2''",
"cantcreateaccount-range-text": "إنشاء الحسابات من عناوين الآيبي في النطاق <strong>$1</strong>، التي تحتوي على الآيبي الخاص بك (<strong>$4</strong>)، قد منعها [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو <em>$2</em>",
"viewpagelogs": "اعرض سجلات هذه الصفحة",
"preferences": "تفضيلات",
"mypreferences": "تفضيلات",
"prefs-edits": "عدد التعديلات:",
- "prefsnologintext2": "الرجاء $1 لضبط تفضيلات المستخدم.",
+ "prefsnologintext2": "الرجاء تسجيل الدخول لضبط تفضيلات المستخدم.",
"prefs-skin": "واجهة",
"skin-preview": "عرض مسبق",
"datedefault": "لا تفضيل",
"recentchangesdays-max": "الحد الأقصى {{PLURAL:$1|أقل من يوم|يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}}",
"recentchangescount": "عدد التعديلات الظاهرة مبدئيا:",
"prefs-help-recentchangescount": "بما في ذلك أحدث التغييرات وتاريخ الصفحات والسجلات.",
- "prefs-help-watchlist-token2": "Ù\87ذا Ù\87Ù\88 اÙ\84Ù\85Ù\81ØªØ§Ø Ø§Ù\84سرÙ\8a Ù\84تغذÙ\8aØ© اÙ\84Ù\88Ù\90ب لقائمة مراقبتك.\nيمكن لأي شخص يعرفه أن يقرأ قائمة مراقبتك، ولذا لا تتشاركه مع أحد. [[Special:ResetTokens|انقر هنا إذا أردت إعادة ضبطه]].",
+ "prefs-help-watchlist-token2": "Ù\87ذا Ù\87Ù\88 اÙ\84Ù\85Ù\81ØªØ§Ø Ø§Ù\84سرÙ\8a Ù\84تغذÙ\8aØ© اÙ\84Ù\88Ù\8aب لقائمة مراقبتك.\nيمكن لأي شخص يعرفه أن يقرأ قائمة مراقبتك، ولذا لا تتشاركه مع أحد. [[Special:ResetTokens|انقر هنا إذا أردت إعادة ضبطه]].",
"savedprefs": "تم حفظ تفضيلاتك.",
"savedrights": "حُفظت الصلاحيات الجديدة {{GENDER:$1|للمستخدم|للمستخدمة}} $1.",
"timezonelegend": "المنطقة الزمنية:",
"badsig": "توقيع خام غير صحيح؛ تحقق من وسوم HTML.",
"badsiglength": "توقيعك طويل جدا.\nيجب أن يكون أقل من $1 {{PLURAL:$1|حرف|حروف}}.",
"yourgender": "كيف تفضل أن توصف؟",
- "gender-unknown": "عند ذكرك، البرنامج سيستخدم كلمات محايدة النوع متى ما كان ذلك ممكنا",
+ "gender-unknown": "عند ذكرك، البرنامج سيستخدم كلمات محايدة النوع متى ما كان ذلك ممكناً",
"gender-male": "هو يعدل صفحات الويكي",
"gender-female": "هي تعدل صفحات الويكي",
- "prefs-help-gender": "ضبط هذا التفضيل اختياري.\nيستخدم البرنامج هذه القيمة لمخاطبتك ومخاطبة الآخرين عنك وفقا للصيغة النحوية الملائمة للجنس.\nستكون هذه المعلومة علنية.",
+ "prefs-help-gender": "ضبط هذا التفضيل اختياري.\nيستخدم البرنامج هذه القيمة لمخاطبتك ومخاطبة الآخرين عنك وفقاً للصيغة النحوية الملائمة للجنس.\nهذه المعلومة ستكون علنية.",
"email": "البريد الإلكتروني",
"prefs-help-realname": "الاسم الحقيقي اختياري.\nلو اخترت أن توفره، فسيستخدم في الإشارة إلى عملك.",
"prefs-help-email": "تحديد عنوان البريد الإلكتروني اختياري، ولكنه يلزم لإعادة تعيين كلمة المرور في حال نسيت كلمة المرور الخاصة بك.",
"userrights-removed-self": "أزلت بنجاح صلاحياتك، ولن تتمكن من الوصول لهذه الصفحة مجددا.",
"group": "المجموعة:",
"group-user": "مستخدمون",
- "group-autoconfirmed": "مستخدمون مؤكدون تلقائيا",
+ "group-autoconfirmed": "مستخدمون مؤكدون تلقائياً",
"group-bot": "بوتات",
"group-sysop": "مديرو نظام",
"group-bureaucrat": "بيروقراطيون",
- "group-suppress": "Ù\86ظار",
+ "group-suppress": "Ù\85زÙ\8aÙ\84Ù\88Ù\86",
"group-all": "(الكل)",
"group-user-member": "{{GENDER:$1|مستخدم|مستخدمة}}",
"group-autoconfirmed-member": "{{GENDER:$1|مستخدم مؤكد تلقائيًا|مستخدمة مؤكدة تلقائيًا}}",
"group-bot-member": "{{GENDER:$1|بوت}}",
"group-sysop-member": "{{GENDER:$1|إداري|إدارية}}",
"group-bureaucrat-member": "{{GENDER:$1|بيروقراط}}",
- "group-suppress-member": "{{GENDER:$1|Ù\86اظر|Ù\86اظرة}}",
+ "group-suppress-member": "{{GENDER:$1|Ù\85زÙ\8aÙ\84|Ù\85زÙ\8aÙ\84ة}}",
"grouppage-user": "{{ns:project}}:مستخدمون",
- "grouppage-autoconfirmed": "{{ns:project}}:مستخدمون مؤكدون تلقائيا",
+ "grouppage-autoconfirmed": "{{ns:project}}:مستخدمون مؤكدون تلقائياً",
"grouppage-bot": "{{ns:project}}:بوتات",
"grouppage-sysop": "{{ns:project}}:إداريون",
"grouppage-bureaucrat": "{{ns:project}}:بيروقراطيون",
- "grouppage-suppress": "{{ns:project}}:نظار",
+ "grouppage-suppress": "{{ns:project}}:خاصية الإزالة",
"right-read": "قراءة الصفحات",
"right-edit": "تعديل الصفحات",
"right-createpage": "إنشاء الصفحات (التي ليست صفحات نقاش)",
"recentchanges-legend-heading": "<strong>شرح:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])",
"recentchanges-submit": "أظهر",
- "rcnotefrom": "بالأسفل التغييرات منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
+ "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
"rclistfrom": "أظهر التغييرات بدء من $3 $2",
"rcshowhideminor": "$1 التعديلات الطفيفة",
"rcshowhideminor-show": "أظهر",
"recentchangeslinked-feed": "تغييرات ذات علاقة",
"recentchangeslinked-toolbox": "تغييرات ذات علاقة",
"recentchangeslinked-title": "التغييرات المرتبطة بصفحة «$1»",
- "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''مغلظة'''",
+ "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثاً للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
"recentchangeslinked-page": "اسم الصفحة:",
- "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
+ "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضاً عن ذلك",
"recentchanges-page-added-to-category": "[[:$1]] أضيفت إلى التصنيف",
"recentchanges-page-added-to-category-bundled": "أضيفت [[:$1]] و{{PLURAL:$2|صفحة واحدة|صفحتان|$2 صفحات}} إلى التصنيف",
"recentchanges-page-removed-from-category": "أزيلت [[:$1]] من التصنيف",
"ignorewarnings": "تجاهل أية تحذيرات",
"minlength1": "أسماء الملفات يجب أن تتكون من حرف واحد على الأقل.",
"illegalfilename": "اسم الملف \"$1\" يحتوي على حروف غير مسموح بها في عناوين الصفحات.\nمن فضلك أعد تسمية الملف وحاول رفعه مرة أخرى.",
- "filename-toolong": "Ø·Ù\88Ù\84 أسÙ\85اء اÙ\84Ù\85Ù\84Ù\81ات Ù\8aجب Ø£Ù\86 Ù\84ا Ù\8aتجاÙ\88ز 240 ØرÙ\81 (باÙ\8aت)",
+ "filename-toolong": "Ø·Ù\88Ù\84 أسÙ\85اء اÙ\84Ù\85Ù\84Ù\81ات Ù\8aجب Ø£Ù\86 Ù\84ا Ù\8aتجاÙ\88ز 240 باÙ\8aت",
"badfilename": "تم تغيير اسم الملف إلى \"$1\".",
"filetype-mime-mismatch": "امتداد الملف \".$1\" لا يطابق نوع MIME للملف ($2).",
"filetype-badmime": "من غير المسموح به رفع ملفات من النوع \"$1\".",
"img-auth-nopathinfo": "PATH_INFO مفقود.\nخادومك ليس مضبوطاً لتمرير هذه المعلومة.\nقد يكون مبنياً على نظام CGI ولا يمكنه دعم img_auth.\nراجع https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
"img-auth-notindir": "المسار المطلوب غير موجود في مجلد الرفع المضبوط.",
"img-auth-badtitle": "تعذر تشكيل عنوان صالح من \"$1\".",
- "img-auth-nologinnWL": "لست والجاً و\"$1\" ليست في القائمة البيضاء.",
+ "img-auth-nologinnWL": "لست والجا و\"$1\" ليست في القائمة البيضاء.",
"img-auth-nofile": "الملف \"$1\" غير موجود.",
"img-auth-isdir": "أنت تحاول الوصول إلى الدليل \"$1\".\nيسمح بوصول الملفات فقط.",
"img-auth-streaming": "عرض \"$1\".",
"listusers-noresult": "لم يتم إيجاد مستخدم.",
"listusers-blocked": "(ممنوع)",
"activeusers": "قائمة المستخدمين النشطين",
- "activeusers-intro": "هذه قائمة بالمستخدمين الذين مارسوا نوعاً من النشاط خلال {{PLURAL:$1||اليوم الماضي|اليومين الماضيين|ال$1 أيام الماضية|ال$1 يوماً ماضياً|ال$1 يوم ماضي}}.",
- "activeusers-count": "{{PLURAL:$1|لا أفعال|فعل واحد|فعلان اثنان|$1 أفعال|$1 فعلاً|$1 فعل}} منذ {{PLURAL:$3||يوم|يومين|$3 أيام|$3 يوماً|$1 يوم}}",
+ "activeusers-intro": "هذه قائمة بالمستخدمين الذين مارسوا نوعا من النشاط خلال {{PLURAL:$1||اليوم الماضي|اليومين الماضيين|ال$1 أيام الماضية|ال$1 يوما ماضيا|ال$1 يوم ماضي}}.",
+ "activeusers-count": "{{PLURAL:$1|لا أفعال|فعل واحد|فعلان اثنان|$1 أفعال|$1 فعلا|$1 فعل}} منذ {{PLURAL:$3||يوم|يومين|$3 أيام|$3 يوما|$1 يوم}}",
"activeusers-from": "اعرض المستخدمين ابتداء من:",
"activeusers-hidebots": "أخف البوتات",
"activeusers-hidesysops": "أخف الإداريين",
"mywatchlist": "قائمة مراقبتي",
"watchlistfor2": "ل$1 $2",
"nowatchlist": "لا توجد مدخلات في قائمة مراقبتك.",
- "watchlistanontext": "الرجاء $1 لعرض أو تعديل الصفحات في قائمة مراقبتك.",
+ "watchlistanontext": "الرجاء تسجيل الدخول لعرض أو تعديل الصفحات في قائمة مراقبتك.",
"watchnologin": "غير مسجل الدخول",
"addwatch": "إضافة إلى قائمة المراقبة",
"addedwatchtext": "\"[[:$1]]\" وصفحة نقاشها أضيفتا إلى [[Special:Watchlist|قائمة مراقبتك]].",
"watching": "يراقب...",
"unwatching": "إزالة المراقبة...",
"watcherrortext": "حدث خطأ أثناء تغيير إعدادات الرصد الخاصة بك \"$1\".",
- "enotif_reset": "علم على كل الصفحات كمَزُورة",
+ "enotif_reset": "علم على كل الصفحات كمرئية",
"enotif_impersonal_salutation": "مستخدم {{SITENAME}}",
"enotif_subject_deleted": "الصفحة {{SITENAME}} $1 حذفها {{الجنس: $2 | $2 }}",
"enotif_subject_created": "الصفحة {{SITENAME}} $1 أنشأها {{الجنس: $2 | $2 }}",
"alreadyrolled": "لم يمكن استرجاع آخر تعديل ل[[$1]] بواسطة [[User:$2|$2]] ([[User talk:$2|نقاش]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])؛\nشخص آخر عدل أو استرجع الصفحة بالفعل.\n\nآخر تعديل كان بواسطة [[User:$3|$3]] ([[User talk:$3|نقاش]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
"editcomment": "ملخص التعديل كان:<em>$1</em>.",
"revertpage": "استرجع تعديلات [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]]) حتى آخر مراجعة ل[[User:$1|$1]]",
- "revertpage-nouser": "استرجع تعديلات مستخدم مخفيّ حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}",
+ "revertpage-nouser": "استرجع تعديلات مستخدم مخفي حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "استرجع تعديلات $1؛\nاسترجع حتى آخر نسخة بواسطة $2.",
"sessionfailure-title": "فشل في الجلسة",
"sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
"whatlinkshere-prev": "{{PLURAL:$1|السابق|ال$1 السابقة}}",
"whatlinkshere-next": "{{PLURAL:$1|التالية|ال$1 التالية}}",
"whatlinkshere-links": "وصلات",
- "whatlinkshere-hideredirs": "$1 اÙ\84تØÙ\88Ù\8aÙ\84ات",
- "whatlinkshere-hidetrans": "$1 اÙ\84تضÙ\85Ù\8aÙ\86ات",
- "whatlinkshere-hidelinks": "$1 الوصلات",
+ "whatlinkshere-hideredirs": "$1 تحويلات",
+ "whatlinkshere-hidetrans": "$1 تضمينات",
+ "whatlinkshere-hidelinks": "$1 وصلات",
"whatlinkshere-hideimages": "$1 وصلات الملفات",
"whatlinkshere-filters": "مرشحات",
"whatlinkshere-submit": "اذهب",
"autoblockid": "منع تلقائي #$1",
"block": "امنع المستخدم",
"unblock": "إلغاء منع مستخدم",
- "blockip": "منع المستخدم",
+ "blockip": "منع {{GENDER:$1|المستخدم|المستخدمة}}",
"blockip-legend": "منع المستخدم",
"blockiptext": "استخدم النموذج التالي لمنع مستخدم، أو عنوان آيبي، معين من التعديل أو إنشاء حسابات جديدة. تُستخدم هذه العملية لمنع التخريب فقط، ويجب أن تتماشى مع [[{{MediaWiki:Policy-url}}|سياسة المنع]]. أدخل تعليلاً واضحًا لسبب المنع في الخانة المخصصة لذلك (مثلاً: ذكر صفحات محددة تمّ تخريبها من قبل المستخدم).",
"ipaddressorusername": "عنوان الأيبي أو اسم المستخدم:",
"ipb-unblock": "رفع المنع عن مستخدم أو عنوان أيبي",
"ipb-blocklist": "عرض حالات المنع الحالية",
"ipb-blocklist-contribs": "مساهمات $1",
+ "ipb-blocklist-duration-left": "يتبقى $1",
"unblockip": "رفع المنع عن المستخدم",
"unblockiptext": "استخدم الاستمارة أدناه لاسترجاع صلاحية الكتابة الخاصة بعنوان أيبي أو مستخدم تم سحبها منه مسبقا.",
"ipusubmit": "ارفع هذا المنع",
"lockdbsuccesstext": "لقد أغلقت قاعدة البيانات.<br />\nتذكر أن [[Special:UnlockDB|تزيل الغلق]] بعد اكتمال أعمال الصيانة.",
"unlockdbsuccesstext": "تم إعادة فتح قاعدة البيانات",
"lockfilenotwritable": "ملف غلق قاعدة البيانات لا يمكن الكتابة عليه.\nلغلق قاعدة البيانات أو إزالة الغلق يجب أن يكون هذا الملف قابلاً للكتابة من قبل خادوم الويب.",
+ "databaselocked": "قاعدة البيانات مقفلة بالفعل.",
"databasenotlocked": "قاعدة البيانات ليست مغلقة.",
"lockedbyandtime": "(من $1 على $2 في $3 )",
"move-page": "نقل $1",
"confirm-watch-top": "إضافة هذه الصفحة إلى قائمة مراقبتك؟",
"confirm-unwatch-button": "موافق",
"confirm-unwatch-top": "إزالة هذه الصفحة من قائمة مراقبتك؟",
+ "confirm-rollback-button": "موافق",
"semicolon-separator": "؛ ",
"comma-separator": "، ",
"quotation-marks": "«$1»",
"tags-edit-success": "طبقت التغييرات.",
"tags-edit-failure": "التغييرات لم تطبق: $1",
"tags-edit-nooldid-title": "مراجعة هدف غير صالحة",
- "tags-edit-nooldid-text": "لم تحدد النسخة التي تريد تطبيق العملية عليها أو لا توجد تلك النسخة",
+ "tags-edit-nooldid-text": "لم تحدد النسخة التي تريد تطبيق العملية عليها أو لا يوجد نسخة من الأصل.",
"tags-edit-none-selected": "من فضلك اختر على الأقل وسما واحدا للإضافة أو الإزالة.",
"comparepages": "قارن صفحات",
"compare-page1": "صفحة 1",
"api-error-missingparam": "خطأ داخلي : متغيرات مفقودة ضمن الطلب.",
"api-error-missingresult": "خطأ داخلي : لا يمكن التحديد ما إذا كان النسخ ناجحاً.",
"api-error-mustbeloggedin": "يجب أن تكون مسجلا في لتحميل الملفات.",
- "api-error-mustbeposted": "خطأ داخلي: يتطلب طلب HTTP POST.",
+ "api-error-mustbeposted": "خطأ داخلي: الطلب يتطلب HTTP POST.",
"api-error-noimageinfo": "نجح التحميل، ولكن الخادم لم يقدم لنا أي معلومات حول الملف.",
"api-error-nomodule": "خطأ داخلي: لم يتم تعيين تحميل الوحدة النمطية.",
"api-error-ok-but-empty": "خطأ داخلي : لم يكن هناك استجابة من الملقم.",
"log-action-filter-block-reblock": "منع التعديل",
"log-action-filter-block-unblock": "رفع المنع",
"log-action-filter-delete-delete": "حذف الصفحات",
+ "log-action-filter-delete-restore": "استرجاع الصفحات",
"log-action-filter-delete-event": "حذف السجلات",
"log-action-filter-delete-revision": "حذف المراجعات",
"log-action-filter-import-interwiki": "استيراد عابر للويكي",
"log-action-filter-upload-overwrite": "إعادة الرفع",
"authmanager-create-disabled": "إنشاء الحسابات معطل.",
"authmanager-create-from-login": "لإنشاء حساب، برجاء ملء الحقول أدناه.",
+ "authmanager-retype-help": "كلمة المرور مرة أخرى للتأكيد.",
"authmanager-email-label": "البريد الإلكتروني",
"authmanager-email-help": "عنوان البريد الإلكتروني",
"authmanager-realname-label": "الاسم الحقيقي",
"authprovider-resetpass-skip-label": "تخطى",
"authprovider-resetpass-skip-help": "تخطي إعادة تعيين كلمة المرور",
"cannotauth-not-allowed-title": "الإذن مرفوض",
+ "changecredentials": "تغيير الاعتماد",
+ "changecredentials-submit": "تغيير الاعتماد",
+ "removecredentials": "إزالة الاعتماد",
+ "removecredentials-submit": "إزالة الاعتماد",
"credentialsform-account": "اسم الحساب:",
"cannotlink-no-provider-title": "لا توجد حسابات قابلة للربط",
"cannotlink-no-provider": "لا توجد حسابات قابلة للربط",
"undo-failure": "الرجوع فى التعديل ما نفعش علشان فى تعديلات متعاكسة حصلت فى الصفحة.",
"undo-norev": "الرجوع فى التعديل ما نفعش علشان هو يا إما مش موجود أو انه إتمسح.",
"undo-summary": "الرجوع فى التعديل $1 بتاع [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
- "cantcreateaccounttitle": "مش ممكن فتح حساب",
"cantcreateaccount-text": "فتح الحسابات من عنوان الأيبى دا ('''$1''') منعه [[User:$3|$3]].\n\nالسبب إللى إداه $3 هو ''$2''",
"viewpagelogs": "عرض السجلات للصفحه دى",
"nohistory": "الصفحة دى ما لهاش تاريخ تعديل.",
"recentchanges-label-unpatrolled": "التعديل ده مإتراجعش لسه",
"recentchanges-legend-heading": "<strong>شرح</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (بص كمان على [[Special:NewPages|قايمه الصفحات الجديده]])",
- "rcnotefrom": "دى التعديلات من '''$2''' (ل '''$1''' معروضه).",
+ "rcnotefrom": "{{PLURAL:$5|ده التعديل|دى التعديلات}} من اول <strong>$3, $4</strong> (لغايه<strong>$1</strong> معروضه).",
"rclistfrom": "اظهر التعديلات بدايه من $3 $2",
"rcshowhideminor": "$1 تعديلات صغيره",
"rcshowhideminor-show": "اعرض",
"upload_directory_read_only": "مجلد التحميل ($1) مش ممكن الكتابة عليه بواسطة سيرڨر الويب.",
"uploaderror": "غلطه فى التحميل",
"uploadtext": "استخدم الاستمارة علشان تحميل الملفات.\nلعرض أو البحث ف الملفات المتحملة سابقا، راجع عمليات المسح [[Special:Log/delete|deletion log]] [[Special:FileList|لستة الملفات المتحملة]]، عمليات التحميل موجودة فى [[Special:Log/upload|سجل التحميل]].\n\nعلشان تحط صورة فى صفحة، استخدم الوصلات فى الصيغ التالية:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' علشان استخدام النسخة الكاملة لملف\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|نص بديل]]</nowiki></code>''' لاستخدام صورة عرضها 200 بكسل فى صندوق فى الجانب الأيسر مع 'نص بديل' كوصف\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' للوصل للملف مباشرة بدون عرض الملف.",
- "upload-permitted": "أنواع الملفات المسموحة: $1.",
- "upload-preferred": "أنواع الملفات المفضلة: $1.",
- "upload-prohibited": "أنواع الملفات الممنوعة: $1.",
+ "upload-permitted": "{{PLURAL:$2|نوع|انواع}} الملفات اللى مسموح بيها: $1.",
+ "upload-preferred": "{{PLURAL:$2|نوع|انواع}} الملفات المفضله: $1.",
+ "upload-prohibited": "{{PLURAL:$2|نوع|انواع}} الملفات الممنوعه: $1.",
"uploadlogpage": "سجل التحميل",
"uploadlogpagetext": "تحت فية لستة بأحدث عمليات تحميل الملفات.\nانظر [[Special:NewFiles|معرض الملفات الجديدة]] لعرض بصرى أكتر",
"filename": "اسم الملف",
"mywatchlist": "لستة الصفح اللى باراقبها",
"watchlistfor2": "لليوزر $1 ($2)",
"nowatchlist": "مافيش حاجة فى لستة مراقبتك.",
- "watchlistanontext": "لو سمحت $1 لعرض أو تعديل الصفحات فى لستة مراقبتك.",
+ "watchlistanontext": "لو سمحت اعمل لوجين لعرض أو تعديل الصفحات فى لستة مراقبتك.",
"watchnologin": "مش متسجل",
"addedwatchtext": "تمت إضافة الصفحه \"$1\" [[Special:Watchlist|للستة الصفحات اللى بتراقبها]].\nالتعديلات اللى بعد كده ها تتحط على الصفحه دى، وصفحة المناقش الخاصه بها ها تتحط هناك. واسم الصفحة هايظهر بخط <b>عريض</b> فى صفحة [[Special:RecentChanges|أحدث التعديلات]] لتسهيل تحديدها واكتشافها.",
"removedwatchtext": "الصفحه دى اتشالت \"[[:$1]]\" من [[Special:Watchlist|لستة الصفحات اللى بتراقبها]].",
"whatlinkshere-hidelinks": "$1 لينكات",
"whatlinkshere-hideimages": "$1 وصلة صورة",
"whatlinkshere-filters": "فلاتر",
- "blockip": "منع يوزر",
+ "blockip": "بلوك {{GENDER:$1|اليوزر|اليوزره}}",
"blockip-legend": "منع اليوزر",
"blockiptext": "استخدم الاستمارة اللى تحت لمنع عنوان أيبى أو يوزر معين من الكتابة.\nدا لازم يحصل بس علشان تمنع التخريب ،و على حسب\n[[{{MediaWiki:Policy-url}}|السياسة]].\nاكتب سبب محدد تحت (يعنى مثلا، اكتب الصفحات المعينة اللى اتخربت بسببه).",
"ipaddressorusername": "عنوان الأيبى أو اسم اليوزر:",
"아라",
"Fitoschido",
"Macofe",
- "Matma Rex"
+ "Matma Rex",
+ "Tokvo"
]
},
"tog-underline": "Sorrayar enllaces:",
"tagline": "De {{SITENAME}}",
"help": "Ayuda",
"search": "Buscar",
+ "search-ignored-headings": " #<!-- dexar esta llinia exactamente como ta --> <pre>\n# Testeres que nun se tendrán en cuenta na gueta.\n# Los cambios fechos equí son efeutivos nel momentu que s'indexa la páxina cola testera.\n# Pue forzar el reindexáu d'una páxina faciendo una edición nula.\n# La sintaxis ye la siguiente:\n# * Tolo qu'hai dende un caráuter \"#\" al fin de llinia ye un comentariu\n# * Cada llinia nun-balera ye'l títulu exactu a descartar, incluyendo mayúscules y demás\nReferencies\nEnllaces esternos\nVer tamién\n #</pre> <!-- dexar esta llinia exactamente como ta -->",
"searchbutton": "Guetar",
"go": "Dir",
"searcharticle": "Dir",
"passwordreset-emailelement": "Nome d'usuariu: \n$1\n\nContraseña temporal: \n$2",
"passwordreset-emailsentemail": "Si esta direición de corréu electrónicu ta asociada cola to cuenta, unviaráse un corréu pa reaniciar la contraseña.",
"passwordreset-emailsentusername": "Si hai una direición de corréu electrónicu asociada con esti nome d'usuariu, unviaráse un corréu electrónicu pa reaniciar la contraseña.",
- "passwordreset-emailsent-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
- "passwordreset-emailerror-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
+ "passwordreset-emailsent-capture2": "{{PLURAL:$1|Unvióse'l corréu|Unviáronse los correos}} de reaniciu de contraseña. {{PLURAL:$1|El nome d'usuariu y la contraseña|La llista de nomes d'usuarios y contraseñes}} amuésase de siguío.",
+ "passwordreset-emailerror-capture2": "Nun foi posible mandar un corréu electrónicu {{Gender:$2|al usuariu|a la usuaria}}: $1 {{PLURAL:$3|El nome d'usuariu y la contraseña|La llista de nomes d'usuarios y contraseñes}} amuésase de siguío.",
+ "passwordreset-nocaller": "Tien d'apurrise un llamador",
+ "passwordreset-nosuchcaller": "El llamador nun esiste: $1",
+ "passwordreset-ignored": "Nun se llogró'l reaniciu de la contraseña. ¿Seique nun se configuró un proveedor?",
"passwordreset-invalideamil": "Direición de corréu inválida",
"passwordreset-nodata": "Nun s'apurrió nin un nome d'usuariu nin una dirección de corréu electrónicu",
"changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
"changeemail-header": "Completa esti formulariu pa camudar la dirección de corréu electrónicu. Si quies desaniciar l'asociación de cualquier dirección de corréu electrónicu de la to cuenta, dexa en blancu la nueva dirección de corréu electrónicu cuando unvies el formulariu.",
- "changeemail-passwordrequired": "Vas tener qu'escribir la contraseña pa confirmar esti cambéu.",
"changeemail-no-info": "Tien d'aniciar sesión pa entrar direutamente a esta páxina.",
"changeemail-oldemail": "Direición de corréu electrónicu actual:",
"changeemail-newemail": "Direición de corréu electrónicu nueva:",
"minoredit": "Esta ye una edición menor",
"watchthis": "Vixilar esta páxina",
"savearticle": "Guardar la páxina",
+ "savechanges": "Guardar los cambios",
"publishpage": "Publicar la páxina",
+ "publishchanges": "Publicar los cambios",
"preview": "Vista previa",
"showpreview": "Amosar previsualización",
"showdiff": "Amosar cambeos",
"content-model-css": "CSS",
"content-json-empty-object": "Oxetu baleru",
"content-json-empty-array": "Matriz balera",
+ "deprecated-self-close-category": "Páxines qu'utilicen etiquetes HTML autozarraes inválides",
+ "deprecated-self-close-category-desc": "Esta páxina contien etiquetes HTML autozarraes inválides, tales como <code><b/></code> o <code><span/></code>. El comportamientu d'estes va camudar llueu pa ser coherente cola especificación d'HTML5, polo qu'el so usu nel testu wiki ta en desusu.",
"duplicate-args-warning": "<strong>Avisu:</strong> [[:$1]] llama a [[:$2]] con más d'un valor pal parámetru «$3». Sólo va usase l'últimu valor dau.",
"duplicate-args-category": "Páxines con argumentos duplicaos nes llamaes a plantíes",
"duplicate-args-category-desc": "La páxina contien llamaes a plantíes qu'usen argumentos duplicaos, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Paez que la edición yá ta desfecha.",
"undo-summary": "Esfacer la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]])",
"undo-summary-username-hidden": "Desfacer la revisión $1 d'un usuariu tapecíu",
- "cantcreateaccounttitle": "Nun pue crease la cuenta",
"cantcreateaccount-text": "[[User:$3|$3]] bloquió la creación de cuentes dende esta direición IP (<strong>$1</strong>).\n\nEl motivu dau por $3 ye <em>$2</em>",
"cantcreateaccount-range-text": "La creación de cuentes dende direiciones IP del rangu <strong>$1</strong>, qu'incluye la so direición IP (<strong>$4</strong>), ta bloquiada pol usuariu [[User:$3|$3]].\n\nLa razón dada por $3 ye <em>$2</em>.",
"viewpagelogs": "Ver los rexistros d'esta páxina",
"rightslogtext": "Esti ye un rexistru de los cambeos nos permisos d'usuariu.",
"action-read": "lleer esta páxina",
"action-edit": "editar esta páxina",
- "action-createpage": "crear páxines",
- "action-createtalk": "crear páxines d'alderique",
+ "action-createpage": "crear esta páxina",
+ "action-createtalk": "crear esta páxina d'alderique",
"action-createaccount": "crear esta cuenta d'usuariu",
"action-autocreateaccount": "crear automáticamente esta cuenta d'usuariu esterna",
"action-history": "ver l'historial d'esta páxina",
"upload-http-error": "Hebo un error HTTP: $1",
"upload-copy-upload-invalid-domain": "La xubida de copies nun ta disponible dende esti dominiu.",
"upload-foreign-cant-upload": "Esta wiki nun ta configurada pa xubir ficheros al estoyu de ficheros esternu solicitáu.",
- "upload-foreign-cant-load-config": "Falló la carga de la configuración de xuba de ficheros pal estoyu esternu de ficheros.",
+ "upload-foreign-cant-load-config": "Falló la carga de la configuración pa xubir ficheros al estoyu esternu.",
"upload-dialog-disabled": "Nesta wiki tán desactivaes les xubíes de ficheros por aciu d'esti diálogu.",
"upload-dialog-title": "Xubir ficheru",
"upload-dialog-button-cancel": "Encaboxar",
"trackingcategories-msg": "Categoría de siguimientu",
"trackingcategories-name": "Nome del mensaxe",
"trackingcategories-desc": "Criterios d'inclusión de categoría",
+ "restricted-displaytitle-ignored": "Páxines con títulos de vista inoraos",
+ "restricted-displaytitle-ignored-desc": "Esta páxina tien un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> inoráu porque nun ye equivaliente al títulu verdaderu de la páxina.",
"noindex-category-desc": "La páxina contien una pallabra máxica <code><nowiki>__NOINDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robós nun la indexarán.",
"index-category-desc": "La páxina contien una pallabra máxica <code><nowiki>__INDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robós la indexarán anque normalmente nun lo faigan.",
"post-expand-template-inclusion-category-desc": "El tamañu de la páxina ye mayor que <code>$wgMaxArticleSize</code> después de espander toles plantíes, de mou qu'algunes plantíes nun s'espandieron.",
"table_pager_limit_label": "Elementos por páxina:",
"table_pager_limit_submit": "Dir",
"table_pager_empty": "Nun hai resultaos",
- "autosumm-blank": "Desaniciáu el conteníu de la páxina",
+ "autosumm-blank": "Desaniciáu'l conteníu de la páxina",
"autosumm-replace": "Sustituyendo la páxina por '$1'",
"autoredircomment": "Redirixendo a [[$1]]",
"autosumm-new": "Páxina creada con «$1»",
"log-action-filter-suppress-reblock": "Supresión d'usuariu por rebloquéu",
"log-action-filter-upload-upload": "Nueva carga",
"log-action-filter-upload-overwrite": "Recargar",
+ "authmanager-authn-not-in-progress": "L'autenticación nun ta en cursu o los datos de sesión perdiéronse. Por favor, vuelve de nueves al principiu.",
"authmanager-authn-no-primary": "Les credenciales apurríes nun pudieron autentificase.",
"authmanager-authn-no-local-user": "Les credenciales apurríes nun tán asociaes con nengún usuariu nesta wiki.",
+ "authmanager-authn-no-local-user-link": "Les credenciales suministraes son válides, pero nun tán venceyaes con nengún usuariu d'esta wiki. Empecipia sesión d'otra miente, o crea un usuariu nuevu, y podrás venceyar los tos credenciales anteriores a esa cuenta.",
"authmanager-authn-autocreate-failed": "Falló la creación automática d'una cuenta local: $1",
+ "authmanager-change-not-supported": "Les credenciales apurríes nun pueden camudase porque nun hai nada que les use.",
+ "authmanager-create-disabled": "Ta desactivada la creación de cuentes.",
+ "authmanager-create-from-login": "Pa crear la cuenta, rellena los campos de más abaxo.",
+ "authmanager-create-not-in-progress": "La creación de la cuenta nun ta progresando, o perdiéronse los datos de la sesión. Por favor, vuelve de nueves al principiu.",
+ "authmanager-create-no-primary": "Les credenciales apurríes nun pueden usase pa crear cuentes.",
+ "authmanager-link-no-primary": "Les credenciales apurríes nun pueden usase pa enllazar cuentes.",
+ "authmanager-link-not-in-progress": "L'enllazáu de la cuenta nun ta progresando, o perdiéronse los datos de la sesión. Por favor, vuelve de nueves al principiu.",
+ "authmanager-authplugin-setpass-failed-title": "Falló'l cambiu de contraseña",
+ "authmanager-authplugin-setpass-failed-message": "El complementu d'autenticación refugó'l cambéu de contraseña.",
+ "authmanager-authplugin-create-fail": "El complementu d'autenticación refugó la creación de la cuenta.",
+ "authmanager-authplugin-setpass-denied": "El complementu de autenticación nun permite cambiar contraseñes.",
"authmanager-authplugin-setpass-bad-domain": "Dominiu inválidu.",
"authmanager-autocreate-noperm": "Nun se permite la creación automática de cuentes.",
"authmanager-autocreate-exception": "La creación automática de cuentes desactivóse temporalmente por cuenta d'errores previos.",
"authmanager-provider-password": "Autenticación basada en contraseña",
"authmanager-provider-password-domain": "Autenticación basada en contraseña y dominiu",
"authmanager-provider-temporarypassword": "Contraseña temporal",
+ "authprovider-confirmlink-message": "Basándose nos tos últimos intentos d'aniciar sesión, les siguientes cuentes pueden venceyase a la to cuenta na wiki. Venceyales permite aniciar sesión al traviés d'eses cuentes. Escueye cuáles tienen de venceyase.",
+ "authprovider-confirmlink-request-label": "Cuentes que tienen de venceyase",
+ "authprovider-confirmlink-success-line": "$1: Enllazada correutamente.",
+ "authprovider-confirmlink-failed": "L'enllaz de cuentes nun foi totalmente correutu: $1",
+ "authprovider-confirmlink-ok-help": "Siguir depués d'amosar los mensaxes de fallu nel enllazáu.",
"authprovider-resetpass-skip-label": "Saltar",
"authprovider-resetpass-skip-help": "Saltar el reaniciu de la contraseña.",
+ "authform-nosession-login": "La autenticación foi correuta, pero'l navegador nun \"s'alcuerda\" de que tuvo coneutáu.\n\n$1",
+ "authform-nosession-signup": "Creóse la cuenta, pero'l navegador nun \"s'alcuerda\" de que tuvo coneutáu.\n\n$1",
+ "authform-newtoken": "Falta token. $1",
+ "authform-notoken": "Falta token",
+ "authform-wrongtoken": "Token incorreutu",
+ "specialpage-securitylevel-not-allowed-title": "Nun ta permitío",
+ "cannotauth-not-allowed-title": "Permisu refugáu",
+ "cannotauth-not-allowed": "Nun tienes permisu pa usar esta páxina",
"credentialsform-account": "Nome de la cuenta:",
"cannotlink-no-provider-title": "Nun hai cuentes enllazables",
"cannotlink-no-provider": "Nun hai cuentes enllazables.",
"minoredit": "Kiçik redaktə",
"watchthis": "Bu səhifəni izlə",
"savearticle": "Səhifəni qeyd et",
+ "publishpage": "Səhifəni yayımla",
+ "publishchanges": "Dəyişiklikləri yayımla",
"preview": "Sınaq görüntüsü",
"showpreview": "Sınaq göstərişi",
"showdiff": "Dəyişiklikləri göstər",
"undo-failure": "Dəyişikliklərin toqquşması nəticəsində geriyə qaytarma işi uğursuz oldu.",
"undo-norev": "Düzəlişlər geri qaytarıla bilinmir, çünki onlar ya mövcüd deyil, ya da silinib.",
"undo-summary": "$1 dəyişikliyi [[Special:Contributions/$2|$2]] ([[User talk:$2|Müzakirə]]) tərəfindən geri alındı.",
- "cantcreateaccounttitle": "Hesab açılmır.",
"cantcreateaccount-text": "Bu IP ünvanından ('''$1''') istifadəçi hesabı yaradılması [[User:$3|$3]] tərəfindən əngəllənmişdir.\n\n$3 tərəfindən verilən səbəb ''$2''",
"viewpagelogs": "Bu səhifə ilə bağlı qeydlərə bax",
"nohistory": "Bu səhifənin dəyişikliklər tarixçəsi mövcud deyil.",
},
"tog-underline": "باغلانتیلارین آلتینی خطله:",
"tog-hideminor": "سوْن دییشیکلیکلرده کیچیکلری گیزلت",
- "tog-hidepatrolled": "سوْن دییشیکلیکلرده نظارتلنمیش دَییشیکلیکلری گیزلت",
+ "tog-hidepatrolled": "سوْن دییشیکلیکلرده گؤزدن گئچیریلمیش دَییشیکلیکلری گیزلت",
"tog-newpageshidepatrolled": "یوْخلانمیش صفحهلری یئنی صفحهلر لیستیندن گیزلت",
"tog-hidecategorization": "صفحه بؤلمهلرینی گیزلت",
"tog-extendwatchlist": "ایزلهدیکلری تکجه یئنیلر اۆچون دئییل، بۆتون دییشیکلیکلری گؤسترمک اۆچون گئنیشلندیر.",
"tog-watchlisthideliu": "گیریش ائتمیش ایشلدنلرین دَییشیکلیکلرینی ایزلهدیکلردن گیزلت",
"tog-watchlisthideanons": "تانینمامیش ایشلدنلرین دَییشیکلیکلرینی ایزلهدیکلردن گیزلت",
"tog-watchlisthidepatrolled": "نظارتلنمیش دَییشیکلیکلری گؤزلهدیکلردن گیزلت",
+ "tog-watchlisthidecategorization": "صفحهلرین بؤلمهلرینی گیزلت",
"tog-ccmeonemails": "باشقا ایشلدنلره گؤندردیگیم ایمئیللرین کوْپیلرینی منه گؤندر",
"tog-diffonly": "مۆقایسهلر آلتیندا صفحهنین ایچیندهکیلرینی گؤسترمه",
"tog-showhiddencats": "گیزلی بؤلمهلری گؤستر",
"createaccountreason": "نَدَنلیک:",
"createacct-reason": "سبب",
"createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز",
+ "createacct-reason-help": "حساب یاراتماق لیستینده گؤستریلن مساژ",
"createacct-submit": "حسابینیزی یارادین",
"createacct-another-submit": "حساب یارات",
"createacct-continue-submit": "حساب یاراتماغین دالیسینی توت",
+ "createacct-another-continue-submit": "حساب یاراتماغی داوام ائت",
"createacct-benefit-heading": "{{SITENAME}} سیزین کیمی آداملارین الی ایله یارانیبدیر.",
"createacct-benefit-body1": "{{PLURAL:$1|دَییشیکلیک}}",
"createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
"changepassword-success": "رمزینیز باجارییلا دَییشدیرلدی!",
"changepassword-throttled": "سیزین چوخ گیریش چالیشماغینیز اولوبدور.\nلوطفاً یئنیدن چالیشماقدان اؤنجه $1 دؤزون.",
"botpasswords": "روبات رمزی",
+ "botpasswords-disabled": "روبات پسووْردلاری ایشلدن سالینیبدیر.",
"botpasswords-createnew": "روبات رمزی یارات",
"botpasswords-label-appid": "روبات آدی:",
"botpasswords-label-create": "یارات",
"botpasswords-label-delete": "سیل",
"botpasswords-label-resetpassword": "رمزی یئنیله",
"botpasswords-label-grants-column": "وئریلدی",
+ "botpasswords-bad-appid": "\"$1\" روْبات آدی اعتیبارلی دئییلدیر.",
+ "botpasswords-created-title": "روْبات پسووْردو یارادیلدی.",
+ "botpasswords-updated-title": "روْبات پسووْردو آپدئیت اوْلوندو.",
+ "botpasswords-deleted-title": "روْبات پسووْردو سیلیندی",
"resetpass_forbidden": "رمزلر دَییشیلمز",
"resetpass-no-info": "بو صحیفهنی دوغرو گؤردوگونوز اوچون سیستمه گیرمهلیسینیز.",
"resetpass-submit-loggedin": "رمزی دَییشدیر",
"passwordreset-emailtext-user": "{{SITENAME}} سایتیندا، $1 ایستیفادهچی، سیزین اوردا ($4) حسابینیزین رمزینی یئنیلهمک ایستگی وئریبدیر. آشاغیداکی {{PLURAL:$3|ایستیفادهچی|ایستیفادهچیلر}} بو ایمیل ایله ایلگیلیدیرلر:\n\n$2\n\nبو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر|$5گون}} سونرا واختلاری قورتاراجاقدیر. \nسیز گرک ایندی گیریب و بیر یئنی رمز سئچهسینیز. باشقا آدام بو ایستَگی وئرمیشسه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایستهمیرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.",
"passwordreset-emailelement": "ایشلدن آدی: \n$1\n\nگئچیجی رمز: \n$2",
"passwordreset-emailsentemail": "بۇ ایمئیل آدرسی حسابینیزا ثبت اوْلونموشسا٬ بیر رمز یئنیلهمه ایمئیلی گؤندریلهجکدیر.",
- "passwordreset-emailsent-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیلهمه ایمیلی گؤندریلیبدیر.",
- "passwordreset-emailerror-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیلهمه ایمیلی یارادیلیبدیر، اما {{GENDER:$2ایستیفادهچی}}یه گؤندرمگی باشاریلی اولمادی: $1",
"changeemail": "ایمیل آدرسینی دَییشدیر یا سیل",
"changeemail-header": "ایمیل آدرسیزی دَییشدیرمک اوچون بو فورمو دولدورون. حسابیزا بوتون ایمیللرین ارتباطینی کسمک اوچون، یئنی ایمیل آدرسینی بوش ساخلایین.",
- "changeemail-passwordrequired": "بو دَییشمهنی دوغرولاماق اوچون، رمزینیزی یازمالیسیز.",
"changeemail-no-info": "بو صحیفهنی دوغرو گؤردوگونوز اوچون سیستمه گیرمهلیسینیز.",
"changeemail-oldemail": "ایندیکی ایمیل آدرس:",
"changeemail-newemail": "یئنی ایمیل آدرسی:",
"watchthis": "بو صفحهنی ایزله",
"savearticle": "صفحهنی ذخیره ائت",
"savechanges": "دَییشیکلیکلری ذخیره ائت",
- "publishchanges": "دَییشیکلیکلری یای",
+ "publishpage": "صفحهنی یاییملا",
+ "publishchanges": "دَییشیکلیکلری یاییملا",
"preview": "اؤنگؤستریش",
"showpreview": "سیناق گؤستریش",
"showdiff": "دَییشیکلیکلری گؤستر",
"undo-nochange": "نظره گلیر دَییشدیرمه قاباغجادان قایتاریلیب.",
"undo-summary": "$1 دییشیکلیک [[Special:Contributions/$2|$2]] ([[User talk:$2|دانیشیق]]) طرفیندن قایتاریلدی.",
"undo-summary-username-hidden": "گیزلی ایستیفادهچی ایله ائدیلمیش $1 نوسخهسینی قایتارماق",
- "cantcreateaccounttitle": "حساب یارادماق اولمور",
"cantcreateaccount-text": "بو ای پی عنوانیندان ('$1) ایستیفادهچی حسابی یارادیلماسی [[User:$3|$3]] طرفیندن انگللنمیشدیر.\n\n$3 طرفیندن وئریلن سبب '$2",
"cantcreateaccount-range-text": "<strong>$1</strong> آیپی آدرس آرالیغیندان حساب یارانماق، [[User:$3|$3]] ایشلدنی طرفیندن یاساقلانیبدیر. سیزینده آیپی آدرسیز (<strong>$4</strong>) بو آرادادیر.\n\n$3 طرفیندن وئریلن سبب بودور: «$2»",
"viewpagelogs": "بۇ صفحهنین قئیدلرینه باخ",
"tagline": "{{SITENAME}} проектынан",
"help": "Белешмә",
"search": "Эҙләү",
+ "search-ignored-headings": " #<!-- был юлды нисек бар шулай ҡалдырығыҙ --> <pre>\n# Эҙләүҙәр инҡар иткән атамалар.\n# Атамаһы булған бит индексланғас та үҙгәртмәләр үҙ көсөнә инәсәк.\n# Буш төҙәтеү менән һеҙ битте яңынан индекслата алаһығыҙ\n# Синтаксис шулай күренә:\n# * Ошо символға «#» башланған юлдың аҙағына тиклем комментарий була\n# * Һәр буш булмаған юл - инҡар ителгәндең атамаһы, быға регистр ҙа инә\nИҫкәрмәләр\nҺылтанмалар\nҠарағыҙ шулай уҡ\n#</pre> <!-- был юлды шул көйө ҡалдырығыҙ -->",
"searchbutton": "Эҙләү",
"go": "Күсеү",
"searcharticle": "Күсеү",
"passwordreset-emailelement": "Ҡулланыусы исеме: \n$1\n\nВаҡытлыса серһүҙ: \n$2",
"passwordreset-emailsentemail": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон почта аша хат ебәрелде.",
"passwordreset-emailsentusername": "Әгәр был ҡатнашыусының исеменә бәйле электрон почтаһының адресы булһа, ул саҡта серһүҙҙе тергеҙеү өсөн хат ебәреләсәк.",
- "passwordreset-emailsent-capture": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон хат ебәрелде, уның тексы түбәндә бирелә:",
- "passwordreset-emailerror-capture": "Серһүҙҙе ташлау тураһында хәбәр итеүсе электрон хат булдырылғайны, ләкин уны {{GENDER:$2|kullanıcıya}} түбәндәге сәбәп арҡаһында ебәреп булманы: $1",
"passwordreset-invalideamil": "Электрон почта адресы ҡабул ителмәй",
"changeemail": "Электрон почта адресын үҙгәртергә",
"changeemail-header": "Электрон почта адресын үҙгәртеү",
- "changeemail-passwordrequired": "Әлеге үҙгәрештәрҙе раҫлау өсөн, Һеҙгә ҡулланыусының серһүҙен яҙырға кәрәк",
"changeemail-no-info": "Был биткә туранан ирешеү өсөн һеҙгә системала танылыу кәрәк.",
"changeemail-oldemail": "Хәҙерге электрон почта адресы:",
"changeemail-newemail": "Яңы электрон почта адресы:",
"undo-nochange": "Төҙәтеү кире ҡайтарылған.",
"undo-summary": "[[Special:Contributions/$2|$2]] ҡулланыусыһының ([[User talk:$2|фекер алышыу]]) $1 үҙгәртеүенән баш тартыу",
"undo-summary-username-hidden": "Исеме йәшерелгән ҡатнашыусының төҙәтеүен $1 кире ҡағыу",
- "cantcreateaccounttitle": "Иҫәп яҙыуын яһап булмай",
"cantcreateaccount-text": "Был IP-адрестан (<b>$1</b>) иҫәп яҙыуҙары булдырыу [[User:$3|$3]] тарафынан тыйылған.\n\n$3 белдергән сәбәп: ''$2''",
"cantcreateaccount-range-text": "{{GENDER:$3|Ҡатнашыусы}} [[User:$3|$3]] һеҙҙең IP-адрес ингән (<strong>$4</strong>) <strong>$1</strong> диапозонында иҫәп яҙмаһын булдырмаҫҡа {{GENDER:$3|тыйыу}} ҡуйҙы.\n\nОшо сәбәп күһәтелгән: $2.",
"viewpagelogs": "Был биттең яҙмаларын ҡарарға",
"wlshowtime": "Күрһәтеү өсөн ваҡыт арауығы",
"wlshowhideminor": "Әҙ генә үҙгәрештәр",
"wlshowhidebots": "Бот",
- "wlshowhideliu": "Ñ\82анÑ\8bлÒ\93ан Ò¡Ñ\83лланÑ\8bÑ\83Ñ\81Ñ\8bлаÑ\80",
+ "wlshowhideliu": "Ñ\82еÑ\80кÓ\99лгÓ\99н ҡаÑ\82наÑ\88Ñ\8bÑ\83Ñ\81Ñ\8b",
"wlshowhideanons": "Аноним ҡулланыусылар",
"wlshowhidepatr": "Тикшерелгән төҙәтеүҙәр",
"wlshowhidemine": "Минең үҙгәртеүҙәр",
"exif-webstatement": "Интернеттағы авторлыҡ хоҡуҡтары тураһындағы белдереү",
"exif-originaldocumentid": "Сығанаҡ документтың уникаль идентификаторы",
"exif-licenseurl": "Авторлыҡ рөхсәтнәмәһенең URL",
- "exif-morepermissionsurl": "Альтернатив рөхсәтнәмә мәғлүмәттәре",
+ "exif-morepermissionsurl": "Альтернатив рөхсәтнамә мәғлүмәттәре",
"exif-attributionurl": "Был эште ҡулланғанда, зинһар, ошонда һылтанма яһағыҙ",
"exif-preferredattributionname": "Был эште ҡулланғанда, зинһар, ошоларҙы белдерегеҙ",
"exif-pngfilecomment": "PNG файл өсөн иҫкәрмә",
"logentry-delete-delete": "$1 $3 битен {{GENDER:$2|юйҙы}}",
"logentry-delete-restore": "$1 $3 битен {{GENDER:$2|тергеҙҙе}}",
"logentry-delete-event": "$1 журналдағы {{PLURAL:$5|яҙманы}} $3: $4 {{GENDER:$2|үҙгәртте}}",
- "logentry-delete-revision": "$1 {{PLURAL:$5|$5 версияның}} күренеүсәнлеген $3: $4 битендә {{GENDER:$2|үҙгәртте}}",
+ "logentry-delete-revision": "Ҡатнашыусы $1 $3: $4 битенең {{PLURAL:$5|$5 версиялары|$5 версияларының|1=версиялар}} күренешен {{GENDER:$2|үҙгәртте|үҙгәртте}}.",
"logentry-delete-event-legacy": "$1 $3 журналы яҙмаларының күренеүсәнлеген {{GENDER:$2|үҙгәртте}}",
"logentry-delete-revision-legacy": "$1 $3 битендә версияларҙың күренеүсәнлеген {{GENDER:$2|үҙгәртте}}",
"logentry-suppress-delete": "$1 $3 битен {{GENDER:$2|баҫырылдырҙы}}",
"mw-widgets-dateinput-no-date": "Дата һайланмаған",
"mw-widgets-titleinput-description-new-page": "Был бит юҡ",
"mw-widgets-titleinput-description-redirect": "$1 йүнәлтеү",
- "api-error-blacklisted": "Башҡа аңлайышлы исем һайлағыҙ.",
"sessionmanager-tie": "Бер юлы бер нисә ғаризаның төп нөсхәһен тикшереп булмай: $1.",
"sessionprovider-generic": "$1 сессия",
"sessionprovider-mediawiki-session-cookiesessionprovider": "куки нигеҙендә сессиялар",
"아라",
"Matthias Klostermayr",
"Macofe",
- "George Animal"
+ "George Animal",
+ "Lokal Profil"
]
},
"tog-underline": "Links unterstreichen:",
"accountcreated": "Benytzerkonto is erstöid worn",
"accountcreatedtext": "'s Benytzerkonto $1 is aigrichtt worn.",
"loginlanguagelabel": "Sproch: $1",
+ "pt-login": "Eilogga",
"changepassword": "Posswort ändern",
"oldpassword": "Oids Posswort:",
"newpassword": "Neichs Posswort:",
"post-expand-template-argument-warning": "'''Obocht:''' De Seitn enthoit mindastns oa Argument in da Vorlog, wo expandiat z grouss is. \nDe Parameta wean ignoriad.",
"post-expand-template-argument-category": "Seitn mid ignoriadn Voalognparametan",
"undo-summary": "Änderrung $1 voh [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussión]]) ryckgängig gmocht.",
- "cantcreateaccounttitle": "Benutzerkonto kå ned erstöd wern",
"viewpagelogs": "Logbiacha fia de Datei ozoagn",
"currentrev": "Aktuelle Versión",
"currentrev-asof": "Letzte Version vo $1",
"tagline": "Gikan sa {{SITENAME}}",
"help": "Katabangan",
"search": "Maghanap",
+ "search-ignored-headings": " #<!-- walaton ining linya eksaktong siring sana kaini --> <pre> \n# Mga Kapamayuhanan na pinagpapabayaan sa paghahanap. \n# Mga Kaliwatan kaini magkaka-epekto matapos na an pahina na igwang kapamayuhanan maipaghukdo. \n# Ika makakapagpuwersa sa pahina na maihuhukdo otro sa paagi nin paghimo nin sarong blangko na pagliwat. # An Sintaks iyo ining minasunod: \n# * An gabos magpoon sa sarong karakter na \"#\" sagkod sa tapos kan linya iyo an sarong komento \n# * An lambang linya na bakong blangko iyo an eksaktong titulo na pababayaan, kaso asin gabos na bagay \nMga Panultulan\nPanluwas na mga sugpon\nHilingon man \n#</pre> <!-- walaton ining linya eksaktong siring sana kaini -->",
"searchbutton": "Maghanap",
"go": "Dumani",
"searcharticle": "Lakaw",
"passwordreset-emailtext-user": "Paragamit $1 sa {{SITENAME}} naghahagad nin sarong pagiromdom kan detalye nin saimong panindog para sa {{SITENAME}}\n($4). An minasunod na paragamit {{PLURAL:$3|panindog iyo an|mga panindog iyo an}} na asosyado kaining e-koreong address:\n\n$2\n\n\n{{PLURAL:$3|Ining temporaryong sekretong panlaog|Ining mga temporaryong panlaog}} mapapaso sa {{PLURAL:$5|sarong aldaw|$5 mga aldaw}}.\nIka dapat na maglaog asin magpili nin sarong bagong sekretong panlaog ngunyan. Kun ibang tawo an naghimo kaining kahagadan, o kun saimo nang nagiromdoman an saimong orihinal na sekretong panlaog, asin habo mo nang ribayan ini, ipasapara mo na sana an mensaheng ini asin ipadagos mo nang gamiton an saimong lumang sekretong panlaog.",
"passwordreset-emailelement": "Paragamit-ngaran: \n$1\n\nTemporaryong sekretong panlaog: \n$2",
"passwordreset-emailsentemail": "Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na.",
- "passwordreset-emailsent-capture": "Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na, yaon ipinapahiling sa ibaba.",
- "passwordreset-emailerror-capture": "Sarong e-surat sa pagliliwat kan sekretong panlaog an pinagpuyos na, yaon ipinapahiling sa ibaba, alagad sa pagpapadara kaini sa {{GENDER:$2|paragamit}} nagpalya: $1",
"changeemail": "Ribayan an e-koreong address",
"changeemail-header": "Ribayan an panindog na e-koreong address",
"changeemail-no-info": "Ika dapat nakalaog na tanganing direktang makagamit kaining pahina.",
"undo-norev": "An pagliwat dae tabi magigibo nin huli ta ini bakong eksistido o pinagpura na.",
"undo-summary": "Dae idagos an rebisyon $1 sa [[Special:Contributions/$2|$2]] ([[User talk:$2|olay]])",
"undo-summary-username-hidden": "Dae idagos an rebisyon sa $1 nin sarong nakatago na paragamit",
- "cantcreateaccounttitle": "Dai makagibo nin account",
"cantcreateaccount-text": "An pagbukas nin account halì sa IP na ('''$1''') binágat ni [[User:$3|$3]].\n\n''$2'' an rason na pigtao ni $3",
"viewpagelogs": "\nHilingon an mga katalaanan para sa pahinang ini",
"nohistory": "Mayong paghirá nin uusipón sa pahinang ini.",
"expand_templates_generate_xml": "Ipahiling an panlunhay na kahoy nin XML",
"expand_templates_preview": "Patânaw",
"mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
- "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
- "api-error-blacklisted": "Pakipili tabi nin sarong nalalaen, deskriptibong titulo."
+ "mw-widgets-dateinput-placeholder-month": "TTTT-BB"
}
"tagline": "Зьвесткі з {{GRAMMAR:родны|{{SITENAME}}}}",
"help": "Дапамога",
"search": "Пошук",
+ "search-ignored-headings": " #<!-- не зьмяняйце гэты радок --> <pre>\n# Загалоўкі, якія мусіць ігнараваць пошукавы рухавік.\n# Зьмены будуць ужытыя па наступным індэксаваньні старонкі.\n# Вы можаце змусіць пераіндэксаваць старонку пустым рэдагаваньнем.\n# Сынтакс наступны:\n# * Усё, што пачынаецца з \"#\" — камэнтар\n# * Усякі непусты радок — загаловак, які трэба ігнараваць\nКрыніцы\nВонкавыя спасылкі\nГлядзіце таксама\n #</pre> <!-- не зьмяняйце гэты радок -->",
"searchbutton": "Пошук",
"go": "Старонка",
"searcharticle": "Старонка",
"botpasswords-label-update": "Абнавіць",
"botpasswords-label-cancel": "Скасаваць",
"botpasswords-label-delete": "Выдаліць",
- "botpasswords-label-resetpassword": "Ð\90Ñ\87Ñ\8bÑ\81Ñ\8cÑ\86Ñ\96ць пароль",
+ "botpasswords-label-resetpassword": "СкÑ\96нÑ\83ць пароль",
"botpasswords-label-grants": "Прыдатныя дазволы:",
"botpasswords-help-grants": "Кожны дазвол дае доступ да правоў удзельніка, якія ўжо мае рахунак удзельніка. Глядзіце [[Special:ListGrants|табліцу дазволаў]] дзеля дадатковых зьвестак.",
"botpasswords-label-restrictions": "Абмежаваньні на выкарыстаньне:",
"resetpass-expired-soft": "Тэрмін дзеяньня вашага паролю скончыўся і ён патрабуе замены. Калі ласка, абярыце новы пароль цяпер або націсьніце «{{int:authprovider-resetpass-skip-label}}», каб зьмяніць яго пазьней.",
"resetpass-validity-soft": "Ваш пароль зьяўляецца некарэктным: $1\n\nКалі ласка, абярыце зараз новы пароль або націсьніце «{{int:authprovider-resetpass-skip-label}}», каб скінуць яго пазьней.",
"passwordreset": "Ачыстка паролю",
- "passwordreset-text-one": "Запоўніце гэтую форму, каб скінуць пароль.",
+ "passwordreset-text-one": "Запоўніце гэтую форму, каб атрымаць часовы пароль электроннай поштай.",
"passwordreset-text-many": "{{PLURAL:$1|Запоўніце адно з палёў, каб атрымаць часовы пароль праз электронную пошту.}}",
- "passwordreset-disabled": "Ð\9cагÑ\87Ñ\8bмаÑ\81Ñ\8cÑ\86Ñ\8c аÑ\87Ñ\8bÑ\81Ñ\82кÑ\96 паÑ\80олÑ\8e бÑ\8bла забаÑ\80оненаÑ\8f Ñ\9e {{GRAMMAR:меÑ\81нÑ\8b|{{SITENAME}}}}.",
- "passwordreset-emaildisabled": "Функцыі e-mail у гэтай вікі былі адключаныя.",
+ "passwordreset-disabled": "Ð\9cагÑ\87Ñ\8bмаÑ\81Ñ\8cÑ\86Ñ\8c аÑ\87Ñ\8bÑ\81Ñ\82кÑ\96 паÑ\80олÑ\8e бÑ\8bла адклÑ\8eÑ\87анаÑ\8f Ñ\9e гÑ\8dÑ\82ай вÑ\96кÑ\96.",
+ "passwordreset-emaildisabled": "Функцыі электроннай пошты ў гэтай вікі былі адключаныя.",
"passwordreset-username": "Імя ўдзельніка:",
"passwordreset-domain": "Дамэн:",
"passwordreset-capture": "Паказаць канчатковы электронны ліст?",
"passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
"passwordreset-emailsentemail": "Калі гэты адрас электроннай пошты далучаны да вашага рахунку, тады будзе дасланы ліст пра скідваньне паролю.",
"passwordreset-emailsentusername": "Калі ёсьць адрас электроннай пошты, злучаны з гэтым імем удзельніка, тады будзе дасланы ліст пра скідваньне паролю.",
- "passwordreset-emailsent-capture": "Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.",
- "passwordreset-emailerror-capture": "Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|Электронны ліст|Электронныя лісты}} скіданьня паролю {{PLURAL:$1|быў дасланы|былі дасланыя}}. {{PLURAL:$1|Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя ніжэй.",
"passwordreset-emailerror-capture2": "Не атрымалася даслаць {{GENDER:$2|удзельніку|удзельніцы}} ліст электроннай поштай: $1 {{PLURAL:$3|Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя ніжэй.",
"passwordreset-nocaller": "Мусіць быць пададзены той, хто робіць выклік",
"passwordreset-nodata": "Не былі пададзеныя ні імя ўдзельніка, ні адрас электроннай пошты",
"changeemail": "Зьмяніць або выдаліць адрас электроннай пошты",
"changeemail-header": "Запоўніце гэтую форму, каб зьмяніць ваш адрас электроннай пошты. Калі вы жадаеце выдаліць адрас электроннай пошты, далучаны да вашага рахунку, пакіньце поле новага адрасу электроннай пошты пустым пры запаўненьні формы.",
- "changeemail-passwordrequired": "Вам трэба будзе ўвесьці ваш пароль, каб пацьвердзіць гэтую зьмену.",
"changeemail-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
"changeemail-oldemail": "Цяперашні адрас электроннай пошты:",
"changeemail-newemail": "Новы адрас электроннай пошты:",
"content-json-empty-object": "Пусты аб’ект",
"content-json-empty-array": "Пусты масіў",
"deprecated-self-close-category": "Старонкі зь няслушнымі самазакрытымі HTML-тэгамі",
+ "deprecated-self-close-category-desc": "Старонка ўтрымлівае няслушныя самазакрытыя HTML-тэгі, такія як <code><b/></code> ці <code><span/></code>. Іх паводзіны ў хуткім часе будуць зьмененыя ў адпаведнасьці з спэцыфікацыяй HTML5, таму іх ўжываньне ў вікітэксьце лічыцца састарэлым.",
"duplicate-args-warning": "<strong>Папярэджаньне:</strong> [[:$1]] выклікае [[:$2]] з больш чым адным значэньнем парамэтру «$3». Толькі апошняе з пададзеных значэньняў будзе ўжытае.",
"duplicate-args-category": "Старонкі, на якіх у шаблёнах выкарыстоўваюцца парамэтры-дублікаты",
"duplicate-args-category-desc": "Старонкі, якія ўтрымліваюць шаблёны з парамэтрамі-дублікатамі, напрыклад, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Выглядае, што праўка ўжо была адмененая.",
"undo-summary": "Скасаваньне праўкі $1 {{GENDER:$2|удзельніка|удзельніцы}} [[Special:Contributions/$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-адрасоў у дыяпазоне <strong>$1</strong>, у які ўваходзіць ваш IP-адрас (<strong>$4</strong>), было забароненае {{GENDER:$3|ўдзельнікам|ўдзельніцай}} [[User:$3|$3]].\n\n{{GENDER:$3|Удзельнікам|Удзельніцай}} $3 была пададзеная наступная прычына: <em>$2</em>.",
"viewpagelogs": "Паказаць журналы падзеяў для гэтай старонкі",
"action-applychangetags": "дадаваньне метак пры рэдагаваньні",
"action-changetags": "дадаваньне і выдаленьне адвольных метак да асобных вэрсіяў і запісаў у журнале падзеяў",
"action-deletechangetags": "выдаленьне метак з базы зьвестак",
+ "action-purge": "ачыстку кэшу гэтай старонкі",
"nchanges": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з апошняга візыту}}",
"enhancedrc-history": "гісторыя",
"listgrouprights-namespaceprotection-namespace": "Прастора назваў",
"listgrouprights-namespaceprotection-restrictedto": "Правы, якія дазваляюць удзельніку рэдагаваць",
"listgrants": "Дазволы",
+ "listgrants-summary": "Ніжэй прыведзены сьпіс дазволаў і адпаведных правоў карыстальнікаў, да якіх яны даюць доступ. Удзельнікі могуць дазваляць праграмам ужываць іх рахунак, але з абмежаванымі правамі, якія грунтуюцца на дазволах, дадзеных удзельнікам. Праграмы, якія дзейнічаюць ад імя ўдзельніка, ня могуць карыстацца правамі, якіх ня мае ўдзельнік. Пра асобныя правы можна атрымаць [[{{MediaWiki:Listgrouprights-helppage}}|дадатковую інфармацыю]].",
"listgrants-grant": "Дазвол",
"listgrants-rights": "Правы",
"trackingcategories": "Катэгорыі, якія патрабуюць увагі",
"revertpage": "Рэдагаваньні [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]]) скасаваныя да папярэдняй вэрсіі [[User:$1|$1]]",
"revertpage-nouser": "Рэдагаваньні схаванага ўдзельніка скасаваныя да папярэдняй вэрсіі {{GENDER:$1|[[User:$1|$1]]}}",
"rollback-success": "Адмененыя рэдагаваньні $1;\nвернутая папярэдняя вэрсія $2.",
+ "rollback-success-notify": "Адмененыя праўкі $1;\nвернутая папярэдняя вэрсія $2. [$3 Паказаць зьмены]",
"sessionfailure-title": "Памылка сэсіі",
"sessionfailure": "Магчыма ўзьніклі праблемы ў Вашым цяперашнім сэансе працы;\nгэта дзеяньне было скасавана для прадухіленьня перахопу сэансу.\nКалі ласка, націсьніце «назад» і перазагрузіце старонку, зь якой Вы прыйшлі, і паспрабуйце ізноў.",
"changecontentmodel": "Зьмена мадэлі зьместу старонкі",
"changecontentmodel-emptymodels-text": "Зьмест на [[:$1]] ня можа быць ператвораны ні ў які тып.",
"log-name-contentmodel": "Журнал зьменаў мадэляў зьместу",
"log-description-contentmodel": "Падзеі, зьвязаныя з мадэлямі зьместу старонак",
+ "logentry-contentmodel-new": "$1 {{GENDER:$2|стварыў|стварыла}} старонку $3 з дапамогай нестандартнай мадэлі зьместу «$5»",
"logentry-contentmodel-change": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мадэль зьместу старонкі $3 з «$4» на «$5»",
"logentry-contentmodel-change-revertlink": "адкаціць",
"logentry-contentmodel-change-revert": "адкат",
"sp-contributions-username": "IP-адрас альбо імя ўдзельніка/ўдзельніцы:",
"sp-contributions-toponly": "Паказваць толькі зьмены, якія зьяўляюцца апошнімі вэрсіямі",
"sp-contributions-newonly": "Паказваць толькі праўкі, якімі былі створаныя старонкі",
+ "sp-contributions-hideminor": "Схаваць дробныя праўкі",
"sp-contributions-submit": "Шукаць",
"whatlinkshere": "Спасылкі на старонку",
"whatlinkshere-title": "Старонкі, якія спасылаюцца на $1",
"ipb-unblock": "Разблякаваць рахунак ўдзельніка ці IP-адрас",
"ipb-blocklist": "Паказаць існуючыя блякаваньні",
"ipb-blocklist-contribs": "Унёсак $1",
+ "ipb-blocklist-duration-left": "засталося $1",
"unblockip": "Разблякаваць удзельніка",
"unblockiptext": "Карыстайцеся пададзенай ніжэй формай для аднаўленьня магчымасьці рэдагаваньня для раней заблякаванага IP-адрасу альбо рахунку ўдзельніка.",
"ipusubmit": "Зьняць гэта блякаваньне",
"block-log-flags-hiddenname": "імя ўдзельніка схаванае",
"range_block_disabled": "Адміністратарам забаронена блякаваць дыяпазоны.",
"ipb_expiry_invalid": "Няслушны тэрмін блякаваньня.",
+ "ipb_expiry_old": "Час сканчэньня ўжо мінуў.",
"ipb_expiry_temp": "Блякаваньні са схаваньнем імя ўдзельніка павінны быць бестэрміновымі.",
"ipb_hide_invalid": "Немагчыма схаваць гэты рахунак; зь яго зроблена больш чым {{PLURAL:$1|$1 рэдагаваньне|$1 рэдагаваньні|$1 рэдагаваньняў}}.",
"ipb_already_blocked": "«$1» ужо заблякаваны",
"lockdbsuccesstext": "База зьвестак была заблякаваная.<br />\nНе забудзьцеся [[Special:UnlockDB|зьняць блякаваньне]] пасьля сканчэньня абслугоўваньня.",
"unlockdbsuccesstext": "База зьвестак была разблякаваная.",
"lockfilenotwritable": "Немагчыма запісаць у файл блякаваньняў базы зьвестак.\nБлякаваньне ці разблякаваньне базы зьвестак патрабуе, каб вэб-сэрвэр меў дазвол на запіс у гэты файл.",
+ "databaselocked": "База зьвестак ужо заблякаваная.",
"databasenotlocked": "База зьвестак не заблякаваная.",
"lockedbyandtime": "($1 $2 у $3)",
"move-page": "Перанесьці $1",
"tooltip-ca-nstab-category": "Паказаць старонку катэгорыі",
"tooltip-minoredit": "Пазначыць гэтую зьмену як дробную",
"tooltip-save": "Захаваць Вашы зьмены",
+ "tooltip-publish": "Апублікаваць вашыя зьмены",
"tooltip-preview": "Праглядзець Вашы зьмены. Калі ласка, выкарыстоўвайце гэтую магчымасьць перад тым, як захаваць старонку!",
"tooltip-diff": "Паказаць зробленыя Вамі зьмены ў тэксьце",
"tooltip-compareselectedversions": "Пабачыць розьніцу паміж дзьвюма абранымі вэрсіямі гэтай старонкі.",
"confirmemail_body_set": "Нехта, магчыма Вы, з IP-адраса $1,\nустанавіў адрас электроннай пошты для рахунку «$2» у {{GRAMMAR:месны|{{SITENAME}}}}.\n\nКаб пацьвердзіць, што гэты рахунак сапраўды належыць Вам, і каб актывізаваць падтрымку электроннай пошты ў {{GRAMMAR:месны|{{SITENAME}}}}, адкрыйце гэтую спасылку у Вашым браўзэры:\n\n$3\n\nКалі рахунак Вам *не* належыць, перайдзіце па гэтай спасылцы\nкаб скасаваць пацьверджаньне па электроннай пошце:\n\n$5\n\nГэты код пацьверджаньня дзейнічае да $4.",
"confirmemail_invalidated": "Пацьверджаньне адрасу электроннай пошты адмененае",
"invalidateemail": "Скасаваць пацьверджаньне адрасу электроннай пошты",
+ "notificationemail_subject_changed": "Адрас электроннай пошты на сайце {{SITENAME}} быў зьменены",
+ "notificationemail_subject_removed": "Адрас электроннай пошты на сайце {{SITENAME}} быў выдалены",
+ "notificationemail_body_changed": "Некім, магчыма вамі, з IP-адрасу $1,\nбыў зьменены адрас электроннай пошты «$2» на «$3» на сайце {{SITENAME}}.\n\nКалі гэта былі ня вы, неадкладна зьвяжыцеся з адміністратарам.",
"scarytranscludedisabled": "[Улучэньне інтэрвікі было адключанае]",
"scarytranscludefailed": "[Памылка атрыманьня шаблёну $1]",
"scarytranscludefailed-httpstatus": "[Памылка атрыманьня шаблёну $1: HTTP $2]",
"confirm-watch-top": "Дадаць гэтую старонку ў Ваш сьпіс назіраньня?",
"confirm-unwatch-button": "Добра",
"confirm-unwatch-top": "Выдаліць гэтую старонку з Вашага сьпісу назіраньня?",
+ "confirm-rollback-button": "Так",
+ "confirm-rollback-top": "Адкаціць праўкі на гэтай старонцы?",
"quotation-marks": "«$1»",
"imgmultipageprev": "← папярэдняя старонка",
"imgmultipagenext": "наступная старонка →",
"redirect-page": "Ідэнтыфікатар старонкі",
"redirect-revision": "Вэрсіі старонкі",
"redirect-file": "Імя файла",
+ "redirect-logid": "ID журнала",
"redirect-not-exists": "Значэньне ня знойдзена",
"fileduplicatesearch": "Пошук дублікатаў файлаў",
"fileduplicatesearch-summary": "Пошук аднолькавых файлаў на падставе іх хэшаў.",
"tags-delete-not-found": "Метка «$1» не існуе.",
"tags-delete-too-many-uses": "Метка «$1» выкарыстаная ў больш чым $2 {{PLURAL:$2|вэрсіі|вэрсіях}}, адпаведна, яна ня можа быць выдаленая.",
"tags-delete-warnings-after-delete": "Метка «$1» была выдаленая, але {{PLURAL:$2|1=атрыманае наступнае папярэджаньне|атрыманыя наступныя папярэджаньні}}:",
+ "tags-delete-no-permission": "У вас няма дазволу на выдаленьне метак зьменаў.",
"tags-activate-title": "Актываваць метку",
"tags-activate-question": "Вы зьбіраецеся актываваць метку «$1».",
"tags-activate-reason": "Прычына:",
"feedback-useragent": "Агент удзельніка:",
"searchsuggest-search": "Пошук",
"searchsuggest-containing": "утрымлівае...",
+ "api-error-autoblocked": "Ваш IP-адрас быў аўтаматычна заблякаваны, бо ён быў выкарыстаны заблякаваным удзельнікам.",
"api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
"api-error-badtoken": "Унутраная памылка: няслушны ключ.",
+ "api-error-blocked": "Рэдагаваньне было для вас заблякаванае.",
"api-error-copyuploaddisabled": "Загрузка з URL-адрасу забароненая на гэтым сэрвэры.",
"api-error-duplicate": "На сайце ўжо {{PLURAL:$1|1=існуе іншы файл|існуюць іншыя файлы}} з такім жа зьместам.",
"api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|1=быў файл|былі файлы}} з дакладна такім жа зьместам, але {{PLURAL:$1|1=ён быў выдалены|яны былі выдаленыя}}.",
"expand_templates_preview": "Папярэдні прагляд",
"expand_templates_preview_fail_html": "<em>Праз тое што {{SITENAME}} мае ўключаным неапрацаваны HTML і адбылася страта зьвестак сэсіі, папярэдні прагляд схаваны, як засьцярога ад атакаў з дапамогай JavaScript.</em>\n\n<strong>Калі гэта слушная спроба перадпрагляду, калі ласка, паспрабуйце яшчэ раз.</strong>\nКалі гэта не спрацуе, паспрабуйце [[Special:UserLogout|выйсьці]] і ўвайсьці яшчэ раз, а таксама праверце, што ваш браўзэр дазваляе кукі-файлы з гэтага сайту.",
"expand_templates_preview_fail_html_anon": "<em>Праз тое што {{SITENAME}} мае ўключаным сыры HTML і вы не ўвайшлі ў сыстэму, папярэдні прагляд схаваны, як засьцярога ад атакаў з дапамогай JavaScript.</em>\n\n<strong>Калі гэта слушная спроба перадпрагляду, калі ласка, [[Special:UserLogin|увайдзіце ў сыстэму]] і паспрабуйце яшчэ раз.</strong>",
+ "expand_templates_input_missing": "Вам трэба ўвесьці хоць нейкі тэкст.",
"pagelanguage": "Зьмена мовы старонкі",
"pagelang-name": "Старонка",
"pagelang-language": "Мова",
"pagelang-use-default": "Ужываць мову па змоўчаньні",
"pagelang-select-lang": "Абярыце мову",
+ "pagelang-submit": "Адправіць",
"right-pagelang": "Зьмяніць мову старонкі",
"action-pagelang": "зьмену мовы старонкі",
"log-name-pagelang": "Журнал зьменаў мовы",
"mediastatistics-header-text": "Тэкст",
"mediastatistics-header-executable": "Выконваныя файлы",
"mediastatistics-header-archive": "Сьціснутыя фарматы",
+ "mediastatistics-header-total": "Усе файлы",
"json-warn-trailing-comma": "$1 {{PLURAL:$1|залішняя коска ў канцы была выдаленая|залішнія коскі ў канцы былі выдаленыя|залішніх косак у канцы былі выдаленыя}} з JSON",
"json-error-unknown": "Узьнікла праблема з JSON. Памылка: $1",
"json-error-depth": "Перавышаная максымальная глыбіня стэку",
"special-characters-group-ipa": "МФА (IPA)",
"special-characters-group-symbols": "Сымбалі",
"special-characters-group-greek": "Грэцкія",
+ "special-characters-group-greekextended": "Пашыраная грэцкая",
"special-characters-group-cyrillic": "Кірылічныя",
"special-characters-group-arabic": "Арабскія",
"special-characters-group-arabicextended": "Арабскія пашыраныя",
"mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
"mw-widgets-titleinput-description-redirect": "перанакіраваньне на $1",
"randomrootpage": "Выпадковая карэнная старонка",
+ "log-action-filter-block": "Тып блякаваньня:",
+ "log-action-filter-delete": "Тып выдаленьня:",
+ "log-action-filter-import": "Тып імпарту:",
+ "log-action-filter-move": "Тып пераносу:",
+ "log-action-filter-all": "Усе",
"changecredentials": "Зьмена ўліковых зьвестак",
"removecredentials": "Выдаленьне ўліковых зьвестак",
+ "removecredentials-submit": "Выдаліць уліковыя зьвесткі",
+ "credentialsform-provider": "Тып уліковых зьвестак:",
"credentialsform-account": "Назва рахунку:"
}
"password-change-forbidden": "Вы не можаце змяняць паролі на гэтай Вікі.",
"externaldberror": "Або памылка вонкавай аўтэнтыкацыі ў базе дадзеных, або вам не дазволена абнаўляць свой вонкавы рахунак.",
"login": "Увайсці ў сістэму",
+ "login-security": "Праверыць вашу асобу",
"nav-login-createaccount": "Увайсці ў сістэму / стварыць рахунак",
"userlogin": "Увайсці ў сістэму / стварыць рахунак",
"userloginnocreate": "Увайсці",
"userlogin-resetpassword-link": "Забылі пароль?",
"userlogin-helplink2": "Даведка па прадстаўленні сістэме",
"userlogin-loggedin": "Вы ўжо ўвайшлі ў сістэму як {{GENDER:$1|$1}}.\nСкарыстайцеся формай ніжэй, каб прадставіцца сістэме як іншы ўдзельнік.",
+ "userlogin-reauth": "Вы павінны ўвайсці ў сістэму зноў, каб пераканацца, што Вы {{GENDER:$1|$1}}",
"userlogin-createanother": "Стварыць яшчэ адзін уліковы запіс",
"createacct-emailrequired": "Адрас электроннай пошты",
"createacct-emailoptional": "Адрас электроннай пошты (неабавязкова)",
"createacct-email-ph": "Увядзіце ваш адрас электроннай пошты",
"createacct-another-email-ph": "Увядзіце адрас электроннай пошты",
"createaccountmail": "Ужыць часовы выпадковы пароль і даслаць яго праз эл.пошту",
+ "createaccountmail-help": "Можа быць выкарыстаны для стварэння ўліковага запісу для іншага чалавека без пазнання пароля.",
"createacct-realname": "Сапраўднае імя (неабавязкова)",
"createaccountreason": "Прычына:",
"createacct-reason": "Прычына",
"createacct-reason-ph": "Чаму вы ствараеце іншы ўліковы запіс",
+ "createacct-reason-help": "Паведамленне паказана ў логу стварэння ўліковага запісу",
"createacct-submit": "Стварыць уліковы запіс",
"createacct-another-submit": "Стварыць уліковы запіс",
"createacct-continue-submit": "Працягнуць стварэнне ўліковага запісу",
+ "createacct-another-continue-submit": "Працягнуць стварэнне ўліковага запісу",
"createacct-benefit-heading": "{{SITENAME}} зроблены такімі ж людзьмі, як вы.",
"createacct-benefit-body1": "{{PLURAL:$1|праўка|праўкі|правак}}",
"createacct-benefit-body2": "{{PLURAL:$1|старонка|старонкі|старонак}}",
"nocookiesnew": "Рахунак быў створаны, але ў сістэму вы не ўвайшлі. {{SITENAME}} карыстаецца квіткамі (кукі), каб апрацоўваць уваходы ўдзельнікаў, а гэтая функцыянальнасць адключана ў вашым браўзеры. Уключыце квіткі ў браўзеры, тады ўваходзьце са сваімі новымі імем удзельніка і паролем.",
"nocookieslogin": "{{SITENAME}} карыстаецца квіткамі (кукі), каб пазнаваць удзельнікаў. У вашым браўзеры квіткі не дазволены. Дазвольце іх працу і паспрабуйце ізноў.",
"nocookiesfornew": "Уліковы запіс карыстальніка не быў створаны, бо мы не змаглі пацвердзіць яго крыніцы. \nУпэўніцеся, што кукі ўключаныя, абнавіце старонку і паспрабуйце яшчэ раз.",
+ "createacct-loginerror": "Уліковы запіс быў паспяхова створаны, але Вы не змаглі аўтарызавацц аўтаматычна. Калі ласка, перайдзіце да старонкі [[Адмысловае:Імя_ўдзельніка|ручной аўтарызацыі]].",
"noname": "Вы не вызначылі правільнага імя ўдзельніка.",
"loginsuccesstitle": "Паспяховы ўваход у сістэму",
"loginsuccess": "<strong>Цяпер Вы ўвайшлі на {{SITENAME}} як \"$1\".</strong>",
"passwordreset-emailsent-capture": "Ніжэй прыведзены адпраўлены ліст пра скід пароля.",
"passwordreset-emailerror-capture": "Ніжэй прыведзены створаны ліст пра скід пароля, яго адпраўка не атрымалася па прычыне: $1",
"passwordreset-invalideamil": "Няслушны адрас электроннай пошты",
+ "passwordreset-nodata": "Не былі пададзены ні імя ўдзельніка, ні адрас электроннай пошты",
"changeemail": "Змяніць або выдаліць адрас электроннай пошты",
"changeemail-header": "Запоўніце гэтую форму, каб змяніць свой адрас электроннай пошты. Калі хочаце выдаліць адрас электроннай пошты, злучаны з вашым уліковым запісам, пакіньце поле новага адраса электроннай пошты пустым пры адпраўцы формы.",
"changeemail-passwordrequired": "Вам трэба будзе ўвесці свой пароль, каб пацвердзіць гэта змяненне.",
"minoredit": "Дробная праўка",
"watchthis": "Назіраць за гэтай старонкай",
"savearticle": "Запісаць",
+ "savechanges": "Запісаць змены",
"publishpage": "Апублікаваць старонку",
+ "publishchanges": "Апублікаваць змены",
"preview": "Перадпаказ",
"showpreview": "Як будзе",
"showdiff": "Розніца",
"userpage-userdoesnotexist": "Рахунак удзельніка \"<nowiki>$1</nowiki>\" не зарэгістраваны. Праверце, ці вы жадаеце стварыць або паправіць гэтую старонку.",
"userpage-userdoesnotexist-view": "Уліковы запіс удзельніка \" $1 \"не зарэгістраваны.",
"blocked-notice-logextract": "Гэты карыстальнік у дадзены момант заблакаваны. \n Апошні запіс журнала блакіровак прыводзіцца ніжэй для даведкі:",
- "clearyourcache": "<strong>Заўвага:</strong> Пасля замацоўвання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб убачыць унесеныя змяненні. \n*<strong>Firefox / Safari:</strong> націсніце <em>Reload</em>, утрымліваючы <em>Shift</em>, або націсніце <em>Ctrl-F5</em> ці <em>Ctrl-R</em> (<em>⌘-R</em> на Макінтошах)\n* <strong>Google Chrome</strong>: Націсніце <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer</strong>: націсніце <em>Refresh</em>, утрымліваючы <em>Ctrl</em>, або націсніце <em>Ctrl-F5</em>\n* <strong>Opera</strong>: увайдзіце ў настройкі карыстальніка (меню <em>Tools</em>, падпункт <em>Preferences</em>), там ачысціце кэш;",
+ "clearyourcache": "<strong>Заўвага:</strong> Пасля замацоўвання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб убачыць унесеныя змяненні. \n*<strong>Firefox / Safari:</strong> націсніце <em>Reload</em>, утрымліваючы <em>Shift</em>, або націсніце <em>Ctrl-F5</em> ці <em>Ctrl-R</em> (<em>⌘-R</em> на Макінтошах)\n* <strong>Google Chrome</strong>: Націсніце <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer</strong>: націсніце <em>Refresh</em>, утрымліваючы <em>Ctrl</em>, або націсніце <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Увайдзіце <em>Menu → Settings</em> (<em>Opera → Preferences</em> на Mac), далей <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
"usercssyoucanpreview": "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду CSS ''перад тым'', як яго запісваць.",
"userjsyoucanpreview": "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду JS ''перад тым'', як яго запісваць.",
"usercsspreview": "'''Памятайце, што гэта толькі папярэдні паказ вашага ўласнага CSS. Праўкі яшчэ не замацаваныя!'''",
"content-model-css": "CSS",
"content-json-empty-object": "Пусты аб'ект",
"content-json-empty-array": "Пусты масіў",
+ "deprecated-self-close-category": "Старонкі з недапушчальнымі самазакрытымі HTML-тэгамі",
"duplicate-args-warning": "<strong>Увага:</strong> [[:$1]] выклікае [[:$2]] з больш чым адным значэннем для параметра \"$3\". Толькі апошняе з пададзеных значэнняў будзе ўжытае.",
"duplicate-args-category": "Старонкі, якія выкарыстоўваюць задубляваныя параметры ў шаблонах",
"duplicate-args-category-desc": "Старонка ўтрымлівае шаблоны з задубляванымі параметрамі, напрыклад, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"right-override-export-depth": "Экспартаваць старонкі, у тым ліку звязаныя, да глыбіні спасылак 5.",
"right-sendemail": "Адпраўляць электронныя лісты іншым удзельнікам",
"right-passwordreset": "Бачыць электронныя лісты аб змяненні пароля",
- "right-managechangetags": "Ствараць і выдаляць [[Special:Tags|біркі]] з базы даных",
+ "right-managechangetags": "Ствараць і (дэ)актываваць [[Special:Tags|біркі]]",
"right-applychangetags": "Прымяняць [[Special:Tags|біркі]] са сваімі праўкамі",
"right-changetags": "Дадаваць і выдаляць адвольныя [[Special:Tags|біркі]] да асобных версій і запісаў у журнале падзей",
"right-deletechangetags": "Выдаляць [[Special:Tags|біркі]] з базы даных",
"uploadstash-badtoken": "Не атрымалася выканаць названыя дзеянні. Магчыма, скончыўся тэрмін дзеяння вашага жэтона бяспекі. Паспрабуйце яшчэ раз.",
"uploadstash-errclear": "Ачыстка файлаў не ўдалася",
"uploadstash-refresh": "Абнавіць спіс файлаў",
+ "uploadstash-thumbnail": "паказаць мініяцюру",
"invalid-chunk-offset": "Недапушчальнае зрушэнне фрагмента",
"img-auth-accessdenied": "Доступ забаронены",
"img-auth-nopathinfo": "Адсутнічае PATH_INFO.\nВаш сервер не настроены на перадачу гэтых звестак.\nМагчыма, ён на аснове CGI і не падтрымлівае img_auth.\nГл. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
"rollback-success": "Адкочаны праўкі $1; вернута апошняя версія $2.",
"sessionfailure-title": "Памылка сеансу",
"sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса.\n\nВярніцеся на папярэднюю старонку, перазагрузіце яе і тады паспрабуйце зноў.",
+ "changecontentmodel": "Змяніць мадэль змесціва старонкі",
+ "changecontentmodel-legend": "Змяніць мадэль змесціва",
"changecontentmodel-title-label": "Назва старонкі",
"changecontentmodel-model-label": "Новая мадэль змесціва",
"changecontentmodel-reason-label": "Прычына:",
"changecontentmodel-submit": "Змяніць",
+ "changecontentmodel-success-title": "Мадэль змесціва была зменена",
+ "changecontentmodel-emptymodels-title": "Няма даступных мадэляў змесціва",
"logentry-contentmodel-change-revertlink": "адкаціць",
"logentry-contentmodel-change-revert": "адкат",
"protectlogpage": "Журнал аховы",
"special-characters-group-khmer": "Кхмерскія",
"special-characters-title-endash": "кароткі працяжнік",
"special-characters-title-emdash": "доўгі працяжнік",
- "special-characters-title-minus": "мінус"
+ "special-characters-title-minus": "мінус",
+ "log-action-filter-all": "Усе",
+ "log-action-filter-block-block": "заблакаваць",
+ "log-action-filter-block-reblock": "Змена блакіроўкі",
+ "log-action-filter-block-unblock": "Разблакаваць",
+ "log-action-filter-contentmodel-change": "Змяненне Contentmodel",
+ "log-action-filter-contentmodel-new": "Стварэнне старонкі з нестандартным Contentmodel",
+ "log-action-filter-delete-delete": "Выдаленне старонкі",
+ "log-action-filter-delete-restore": "Узнаўленне старонкі",
+ "log-action-filter-delete-event": "Выдаленне лога",
+ "log-action-filter-delete-revision": "Выдаленне перагляду",
+ "log-action-filter-import-interwiki": "Імпарт Transwiki",
+ "log-action-filter-import-upload": "Імпарт выгрузкай XML",
+ "log-action-filter-managetags-create": "Стварэнне тэгаў",
+ "log-action-filter-managetags-delete": "Выдаленне тэгаў",
+ "log-action-filter-managetags-activate": "Актывацыя тэга",
+ "log-action-filter-managetags-deactivate": "Адключэнне тэга",
+ "log-action-filter-move-move": "Перайсці без перазапісу рэдырэктаў",
+ "log-action-filter-move-move_redir": "Перамясціць з заменай рэдырэктаў",
+ "log-action-filter-newusers-create": "Стварэнне ананімным удзельнікам",
+ "log-action-filter-newusers-create2": "Стварэнне зарэгістраваным удзельнікам",
+ "log-action-filter-newusers-autocreate": "Аўтаматычнае стварэнне",
+ "log-action-filter-newusers-byemail": "Стварэнне паролем, высланым па электроннай пошце",
+ "log-action-filter-patrol-patrol": "Ручны догляд",
+ "log-action-filter-patrol-autopatrol": "Аўтаматычны догляд",
+ "log-action-filter-protect-protect": "Абарона",
+ "log-action-filter-protect-modify": "Мадыфікацыя абароны",
+ "log-action-filter-protect-unprotect": "Зняцце абароны",
+ "log-action-filter-protect-move_prot": "Ахова старонкі",
+ "log-action-filter-rights-rights": "Ручное змяненне",
+ "log-action-filter-rights-autopromote": "Аўтаматычнае змяненне",
+ "log-action-filter-upload-upload": "Новая перадача",
+ "log-action-filter-upload-overwrite": "Выкладванне",
+ "authmanager-authn-not-in-progress": "Праверка сапраўднасці не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
+ "authmanager-authn-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць завераны.",
+ "authmanager-authn-no-local-user": "Прадастаўленыя ўліковыя дадзеныя не звязаныя з нікодным удзельнікам на гэтай Вікі.",
+ "authmanager-authn-no-local-user-link": "Прадастаўленыя ўліковыя дадзеныя сапраўдныя, але не звязаныя з ніводным удзельнікам гэтай Вікі. Увайдзіце іншым спосабам або стварыце новы акаўнт і ў вас з'явіцца магчымасць звязаць свае папярэднія ўліковыя дадзеныя для гэтага ўліковага запісу.",
+ "authmanager-authn-autocreate-failed": "Аўтаматычнае стварэнне лакальнага ўліковага запісу не ўдалося: $1",
+ "authmanager-change-not-supported": "Прадастаўленыя ўліковыя дадзеныя не могуць быць зменены, як нішто не будзе іх выкарыстоўваць.",
+ "authmanager-create-disabled": "стварэнне рахунка не дазволена",
+ "authmanager-create-from-login": "Каб стварыць уліковы запіс, калі ласка, запоўніце палі ніжэй.",
+ "authmanager-create-not-in-progress": "Праверка сапраўднасці не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
+ "authmanager-create-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць выкарыстаны для стварэння ўліковага запісу.",
+ "authmanager-link-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць выкарыстаны для прывязкі рахунку.",
+ "authmanager-link-not-in-progress": "Звязванне ўліковага запісу не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
+ "authmanager-authplugin-setpass-failed-title": "Памылка змены пароля",
+ "authmanager-authplugin-setpass-failed-message": "Убудова аўтэнтыфікацыі адмоўлена па змене пароля.",
+ "authmanager-authplugin-create-fail": "Убудова аўтэнтыфікацыі адмоўлена ў рэгістрацыі.",
+ "authmanager-authplugin-setpass-denied": "Убудова праверкі сапраўднасці не дазваляе змяняць паролі.",
+ "authmanager-authplugin-setpass-bad-domain": "Недапушчальны дамен.",
+ "authmanager-autocreate-noperm": "Аўтаматычнае стварэнне уліковых запісаў не дапускаецца.",
+ "authmanager-autocreate-exception": "Аўтаматычнае стварэнне уліковых запісаў часова адключана з-за памылак папярэдніх.",
+ "authmanager-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.",
+ "authmanager-username-help": "Імя карыстальніка для праверкі сапраўднасці.",
+ "authmanager-password-help": "Пароль для праверкі сапраўднасці.",
+ "authmanager-domain-help": "Дамен для знешняй праверкі сапраўднасці.",
+ "authmanager-retype-help": "Пароль яшчэ раз для пацверджання.",
+ "authmanager-email-label": "Эл.пошта",
+ "authmanager-email-help": "Адрас электроннай пошты:",
+ "authmanager-realname-label": "Сапраўднае імя:",
+ "authmanager-realname-help": "Рэальнае імя карыстальніка",
+ "authmanager-provider-password": "Праверка сапраўднасці на аснове пароляў",
+ "authmanager-provider-temporarypassword": "Тымчасовы пароль:",
+ "authprovider-confirmlink-message": "Грунтуючыся на апошніх спробах падлучэння, наступныя уліковыя запісы могуць быць звязаныя з Вашым ўліковым запісам Вікі. Калі ласка, выберыце, якія з іх павінны быць звязаныя паміж сабой.",
+ "authprovider-confirmlink-request-label": "Рахункі, якія павінны быць звязаныя",
+ "authprovider-confirmlink-success-line": "$1: звязаны паспяхова.",
+ "authprovider-confirmlink-failed": "Прывязка акаўнта не атрымалася ў поўнай меры: $1",
+ "authprovider-confirmlink-ok-help": "Працягнуць пасля вываду паведамленняў аб памылках прывязкі.",
+ "authprovider-resetpass-skip-label": "Прапусціць",
+ "authprovider-resetpass-skip-help": "Прапусціць скід пароля.",
+ "authform-nosession-login": "Праверка сапраўднасці прайшла паспяхова, але ваш браўзэр не можа \"запомніць\" уваход у сістэму.\n\n$1",
+ "authform-nosession-signup": "Уліковы запіс быў створаны, але ваш браўзэр не можа \"запомніць\" у сістэму.\n\n$1",
+ "authform-newtoken": "Адсутнічае маркер. \n\n$1",
+ "authform-notoken": "Адсутнічае маркер",
+ "authform-wrongtoken": "Няправільны маркер",
+ "specialpage-securitylevel-not-allowed-title": "Не дапускаецца",
+ "specialpage-securitylevel-not-allowed": "Прабачце, вам не дазволена выкарыстоўваць гэтую старонку, таму што ваша асоба не можа быць праверана.",
+ "authpage-cannot-login": "Не атрымалася запусціць лагін.",
+ "authpage-cannot-login-continue": "Можаце працягваць аўтарызацыю. Сеанс хутчэй за ўсе скончыўся.",
+ "authpage-cannot-create": "Немагчыма пачаць стварэнне рахунку.",
+ "authpage-cannot-create-continue": "Немагчыма працягнуць стварэнне акаўнта. Сеанс хутчэй за ўсе скончыўся.",
+ "authpage-cannot-link": "Не атрымалася запусціць прывязку акаўнта.",
+ "authpage-cannot-link-continue": "Немагчыма працягваць звязванне ўліковага запісу. Сеанс хутчэй за ўсе скончыўся.",
+ "cannotauth-not-allowed-title": "Доступ забаронены.",
+ "cannotauth-not-allowed": "Вам не дазволена выкарыстоўваць гэтую старонку",
+ "changecredentials": "Змяненне уліковых дадзеных",
+ "changecredentials-submit": "Змяненне уліковых дадзеных",
+ "changecredentials-invalidsubpage": "$1 не з'яўляецца дапушчальным тыпам уліковых дадзеных.",
+ "changecredentials-success": "Вашы дадзеныя былі змененыя.",
+ "removecredentials": "Выдаліць ўліковыя дадзеныя",
+ "removecredentials-submit": "Выдаліць ўліковыя дадзеныя",
+ "removecredentials-invalidsubpage": "$1 не з'яўляецца дапушчальным тыпам уліковых дадзеных.",
+ "removecredentials-success": "Вашы ўліковыя дадзеныя былі выдаленыя.",
+ "credentialsform-provider": "Калі ласка, увядзіце ўліковыя дадзеныя:",
+ "credentialsform-account": "Імя ўліковага запісу:",
+ "cannotlink-no-provider-title": "Няма рахункаў, якія трэба звязваць",
+ "cannotlink-no-provider": "Няма рахункаў, якія трэба звязваць",
+ "linkaccounts": "Звязаць акаўнты",
+ "linkaccounts-success-text": "Акаўнт быў звязаны.",
+ "linkaccounts-submit": "Звязаць акаўнты",
+ "unlinkaccounts": "Адмяніць сувязь уліковых запісаў",
+ "unlinkaccounts-success": "Сувязь акаўнтаў была выдалена."
}
"Xð",
"Miroslav35232",
"Ket",
- "Ricordo.tenerissimo"
+ "Ricordo.tenerissimo",
+ "Plamen",
+ "Iliev"
]
},
"tog-underline": "Подчертаване на препратките:",
"tog-ccmeonemails": "Получаване на копия на писмата, които пращам на другите потребители",
"tog-diffonly": "Без показване на съдържанието на страницата при преглед на разлики",
"tog-showhiddencats": "Показване на скритите категории",
- "tog-norollbackdiff": "Ð\9fÑ\80опÑ\83Ñ\81кане на Ñ\80азликоваÑ\82а вÑ\80Ñ\8aзка Ñ\81лед извÑ\8aÑ\80Ñ\88ване на отмяна на редакции",
+ "tog-norollbackdiff": "Ð\9dе показвай Ñ\80азликаÑ\82а междÑ\83 Ñ\80едакÑ\86ииÑ\82е Ñ\81лед отмяна на редакции",
"tog-useeditwarning": "Предупреждаване при опит за напускане на страница, отворена в режим на редактиране, без да са запазени промените",
"tog-prefershttps": "Да се използва винаги защитена връзка след влизане",
"underline-always": "Винаги",
"protectedinterface": "Тази страница съдържа текст, нужен за работата на системата. Тя е защитена против редактиране, за да се предотвратят възможни злоупотреби.\nЗа извършване на промяна за всички уикита, посетете [https://translatewiki.net/ translatewiki.net], проектът за локализация на MediaWiki.",
"editinginterface": "<strong>Внимание:</strong> Редактирате страница, която се използва за текстовия интерфейс на софтуера. Промяната й ще повлияе на външния вид на уикито.",
"translateinterface": "За да добавите или промените преводи за всички уикита, моля, използвайте [https://translatewiki.net/ translatewiki.net], локализиращия проект на МедияУики.",
- "cascadeprotected": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита:\n$2",
+ "cascadeprotected": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} „каскадна“ защита:\n$2",
"namespaceprotected": "Нямате права за редактиране на страници в именно пространство '''$1'''.",
"customcssprotected": "Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.",
"customjsprotected": "Нямате права за редактиране на тази JavaScript страница, защото тя съдържа чужди потребителски настройки.",
"password-change-forbidden": "Не можете да променяте пароли в това уики.",
"externaldberror": "Или е станала грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.",
"login": "Влизане",
+ "login-security": "Потвърдете идентичността си",
"nav-login-createaccount": "Регистриране или влизане",
"userlogin": "Влизане / създаване на сметка",
"userloginnocreate": "Влизане",
"createacct-reason-ph": "Защо създавате друга сметка",
"createacct-submit": "Създаване на сметката",
"createacct-another-submit": "Създаване на сметка",
+ "createacct-continue-submit": "Продължаване създаването на акаунт",
+ "createacct-another-continue-submit": "Продължаване създаването на акаунт",
"createacct-benefit-heading": "{{SITENAME}} се създава от хора като вас.",
"createacct-benefit-body1": "{{PLURAL:$1|редакция|редакции}}",
"createacct-benefit-body2": "{{PLURAL:$1|страница|страници}}",
"noname": "Не указахте валидно потребителско име.",
"loginsuccesstitle": "Успешно влизане",
"loginsuccess": "'''Влязохте в {{SITENAME}} като „$1“.'''",
- "nosuchuser": "Ð\9dе Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва поÑ\82Ñ\80ебиÑ\82ел Ñ\81 име â\80\9e$1â\80\9c.\nÐ\9fоÑ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е имена Ñ\81а Ñ\87Ñ\83вÑ\81Ñ\82виÑ\82елни на малки и главни бÑ\83кви.\nПроверете изписването или [[Special:CreateAccount|създайте нова сметка]].",
+ "nosuchuser": "Ð\9dе Ñ\81Ñ\8aÑ\89еÑ\81Ñ\82вÑ\83ва поÑ\82Ñ\80ебиÑ\82ел Ñ\81 име â\80\9e$1â\80\9c.\nÐ\9fоÑ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е имена Ñ\81а Ñ\87Ñ\83вÑ\81Ñ\82виÑ\82елни кÑ\8aм Ñ\80егиÑ\81Ñ\82Ñ\8aÑ\80а на бÑ\83квиÑ\82е.\nПроверете изписването или [[Special:CreateAccount|създайте нова сметка]].",
"nosuchusershort": "Не съществува потребител с името „$1“. Проверете изписването.",
"nouserspecified": "Необходимо е да се посочи потребителско име.",
"login-userblocked": "Този потребител е блокиран. Влизането в системата не е позволено.",
"newpassword": "Нова парола:",
"retypenew": "Повтори новата парола:",
"resetpass_submit": "Избиране на парола и влизане",
- "changepassword-success": "Ð\9fаÑ\80олаÑ\82а ви беÑ\88е пÑ\80оменена Ñ\83Ñ\81пеÑ\88но!",
+ "changepassword-success": "Паролата беше променена успешно!",
"changepassword-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
"botpasswords-createnew": "Създаване на нова бот парола",
"botpasswords-editexisting": "Редактиране на съществуваща бот парола",
"resetpass-no-info": "За да достъпвате тази страница директно, необходимо е да влезете в системата.",
"resetpass-submit-loggedin": "Промяна на паролата",
"resetpass-submit-cancel": "Отказ",
- "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече успешно да сте сменили паролата си или да сте поискали нова временна парола.",
+ "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече да сте сменили паролата си или да сте поискали нова временна парола.",
"resetpass-recycled": "Моля, променете паролата си с такава, различна от текущата.",
"resetpass-temp-emailed": "Вие сте влезли в системата с помощта на временен код, който е изпратен чрез електронна поща.\nЗа да завършите влизането в системата, трябва да въведете нова парола тук:",
"resetpass-temp-password": "Временна парола:",
"resetpass-abort-generic": "Промяната на паролата беше прекъсната от използвано разширение.",
"resetpass-expired": "Срокът на валидност на паролата е изтекъл. Изберете нова парола за влизане.",
"resetpass-expired-soft": "Вашата парола е изтекла и трябва да бъде променена. Моля, въведете нова парола сега или натиснете бутона \"{{int:authprovider-resetpass-skip-label}}\" за да я промените по-късно.",
- "resetpass-validity-soft": "Ð\9cолÑ\8f, вÑ\8aведеÑ\82е нова паÑ\80ола Ñ\81ега или наÑ\82иÑ\81неÑ\82е бÑ\83Ñ\82она \"{{int:authprovider-resetpass-skip-label}}\" за да я промените по-късно.",
+ "resetpass-validity-soft": "Ð\92аÑ\88аÑ\82а паÑ\80ола е невалидна: $1\n\nÐ\9cолÑ\8f, вÑ\8aведеÑ\82е нова паÑ\80ола или наÑ\82иÑ\81неÑ\82е бÑ\83Ñ\82она â\80\9e{{int:authprovider-resetpass-skip-label}}â\80\9c за да я промените по-късно.",
"passwordreset": "Възстановяване на парола",
"passwordreset-text-one": "Попълването на формуляра ще доведе до възстановяване на паролата.",
"passwordreset-text-many": "{{PLURAL:$1|За получаване на временна парола по електронна поща е необходимо да попълните едно от полетата.}}",
"passwordreset-emailelement": "Потребителско име: \n$1\n\nВременна парола: \n$2",
"passwordreset-emailsentemail": "Ако електронната Ви поща е свързана със сметката Ви, на нея е изпратено писмо за възстановяване на паролата.",
"passwordreset-emailsentusername": "Ако това потребителско име е свързано с електронна поща, е изпратено писмо за възстановяване на паролата.",
- "passwordreset-emailsent-capture": "По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.",
- "passwordreset-emailerror-capture": "По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1",
"passwordreset-invalideamil": "Неправилен email адрес",
"changeemail": "Промяна или премахване на адреса за е-поща",
"changeemail-header": "Промяна на адреса за е-поща на сметката",
- "changeemail-passwordrequired": "Трябва да въведете паролата си, за да потвърдите тази промяна.",
"changeemail-no-info": "За да достъпвате тази страница директно, необходимо е да влезете в системата.",
"changeemail-oldemail": "Текущ адрес за е-поща:",
"changeemail-newemail": "Нов адрес за е-поща:",
"minoredit": "Това е малка промяна",
"watchthis": "Наблюдаване на страницата",
"savearticle": "Съхраняване",
+ "savechanges": "Съхраняване на промените",
"publishpage": "Публикуване на страницата",
+ "publishchanges": "Публикуване на промените",
"preview": "Предварителен преглед",
"showpreview": "Предварителен преглед",
"showdiff": "Показване на промените",
"undo-failure": "Редакцията не може да бъде върната поради конфликтни междинни редакции.",
"undo-norev": "Редакцията не може да бъде върната, тъй като не съществува или е била изтрита.",
"undo-summary": "Премахната редакция $1 на [[Special:Contributions/$2|$2]] ([[User talk:$2|беседа]])",
- "cantcreateaccounttitle": "Невъзможно е да бъде създадена потребителска сметка.",
"cantcreateaccount-text": "[[User:$3|Потребител:$3]] е блокирал(а) създаването на сметки от този IP-адрес ('''$1''').\n\nПричината, изложена от $3, е ''$2''",
"viewpagelogs": "Преглед на извършените административни действия по страницата",
"nohistory": "Няма редакционна история за тази страница.",
"revdelete-submit": "Прилагане към {{PLURAL:$1|избраната версия|избраните версии}}",
"revdelete-success": "'''Видимостта на версията беше променена успешно.'''",
"revdelete-failure": "'''Видимостта на редакцията не може да бъде обновена:'''\n$1",
- "logdelete-success": "Видимостта на събитието беше променена.",
+ "logdelete-success": "Видимостта на дневника е установена.",
"logdelete-failure": "'''Видимостта на дневника не може да бъде променяна:'''\n$1",
"revdel-restore": "промяна на видимостта",
"pagehist": "История на страницата",
"grouppage-sysop": "{{ns:project}}:Администратори",
"grouppage-bureaucrat": "{{ns:project}}:Бюрократи",
"grouppage-suppress": "{{ns:project}}:Ревизори",
- "right-read": "четене на страници",
+ "right-read": "Четене на страници",
"right-edit": "редактиране на страници",
"right-createpage": "Създаване на страници (които не са беседи)",
"right-createtalk": "Създаване на дискусионни страници",
"right-move-rootuserpages": "Преместване на основни потребителски страници",
"right-move-categorypages": "Преместване на категорийни страници",
"right-movefile": "Преместване на файлове",
- "right-suppressredirect": "без създаване на пренасочване от старото име при преместване на страница",
+ "right-suppressredirect": "Ð\91ез създаване на пренасочване от старото име при преместване на страница",
"right-upload": "Качване на файлове",
"right-reupload": "Презаписване на съществуващ файл",
"right-reupload-own": "Презаписване на съществуващ файл, качен от същия потребител",
"right-reupload-shared": "Предефиниране на едноименните файлове от общото мултимедийно хранилище с локални",
"right-upload_by_url": "качване на файл от URL адрес",
"right-purge": "изчистване на складираното съдържание на страниците без показване на страница за потвърждение",
- "right-autoconfirmed": "редактиране на полузащитени страници",
- "right-bot": "третиране като автоматизиран процес",
+ "right-autoconfirmed": "Редактиране на полузащитени страници",
+ "right-bot": "Третиране като автоматизиран процес",
"right-nominornewtalk": "Малките промени по дискусионните страници не предизвикват известието за ново съобщение",
- "right-apihighlimits": "използване на крайните предели в API заявките",
+ "right-apihighlimits": "Ð\98зползване на крайните предели в API заявките",
"right-writeapi": "Употреба на API за писане",
- "right-delete": "изтриване на страници",
+ "right-delete": "Ð\98зтриване на страници",
"right-bigdelete": "изтриване на страници с големи редакционни истории",
- "right-deleterevision": "изтриване и възстановяване на отделни версии на страниците",
+ "right-deletelogentry": "Изтриване и възстановяване на отделни записи в дневника",
+ "right-deleterevision": "Изтриване и възстановяване на отделни версии на страниците",
"right-deletedhistory": "преглеждане на записи от изтрити редакционни истории без асоциирания към тях текст",
"right-deletedtext": "Преглед на изтрития текст и промените между изтритите версии",
"right-browsearchive": "търсене на изтрити страници",
- "right-undelete": "възстановяване на страници",
- "right-suppressrevision": "преглед и възстановяване на версии, скрити от администраторите",
+ "right-undelete": "Ð\92ъзстановяване на страници",
+ "right-suppressrevision": "Ð\9fреглед и възстановяване на версии, скрити от администраторите",
"right-viewsuppressed": "Преглеждане на версии, скрити от който и да е потребител",
- "right-suppressionlog": "преглеждане на тайните дневници",
+ "right-suppressionlog": "Ð\9fреглеждане на тайните дневници",
"right-block": "спиране на достъпа до редактиране",
- "right-blockemail": "блокиране на потребители да изпращат писма по е-поща",
+ "right-blockemail": "Ð\91локиране на потребители да изпращат писма по е-поща",
"right-hideuser": "блокиране и скриване на потребителско име",
"right-ipblock-exempt": "пренебрегване на блокирания по IP blocks, автоматични блокирания и блокирани IP интервали",
"right-unblockself": "Собствено отблокиране",
"right-protect": "променяне на нивото на защита и редактиране на защитени страници",
"right-editprotected": "редактиране на защитени страници (без каскадна защита)",
- "right-editinterface": "редактиране на потребителския интерфейс",
+ "right-editinterface": "Редактиране на потребителския интерфейс",
"right-editusercssjs": "редактиране на CSS и JS файловете на други потребители",
"right-editusercss": "редактиране на CSS файловете на други потребители",
"right-edituserjs": "редактиране на JS файловете на други потребители",
"right-import": "внасяне на страници от други уикита",
"right-importupload": "внасяне на страници от качен файл",
"right-patrol": "отбелязване на редакциите като проверени",
- "right-autopatrol": "автоматично отбелязване на редакции като проверени",
+ "right-autopatrol": "Ð\90втоматично отбелязване на редакции като проверени",
"right-patrolmarks": "Показване на отбелязаните като патрулирани последни промени",
"right-unwatchedpages": "преглеждане на списъка с ненаблюдаваните страници",
"right-mergehistory": "сливане на редакционни истории на страници",
"activeusers-hidesysops": "Скриване на администраторите",
"activeusers-noresult": "Няма намерени потребители.",
"listgrouprights": "Права по потребителски групи",
- "listgrouprights-summary": "По-долу на тази страница е показан списък на групите потребители в това уики с асоциираните им права за достъп. Допълнителна информация за отделните права може да бъде намерена [[{{MediaWiki:Listgrouprights-helppage}}|тук]].",
+ "listgrouprights-summary": "По-долу на тази страница е показан списък на групите потребители в това уики и права им за достъп. Допълнителна информация за отделните права може да бъде намерена [[{{MediaWiki:Listgrouprights-helppage}}|тук]].",
"listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Поверено право</span>\n* <span class=\"listgrouprights-revoked\">Отнето право</span>",
"listgrouprights-group": "Група",
"listgrouprights-rights": "Права",
"sessionfailure": "Изглежда има проблем със сесията ви; действието беше отказано като предпазна мярка срещу крадене на сесията. Натиснете бутона за връщане на браузъра, презаредете страницата, от която сте дошли, и опитайте отново.",
"changecontentmodel-title-label": "Заглавие на страницата",
"changecontentmodel-reason-label": "Причина:",
+ "changecontentmodel-success-text": "Типът на съдържанието на [[:$1]] е успешно променен.",
"protectlogpage": "Дневник на защитата",
"protectlogtext": "Списък на промените в защитата за страницата.\nМожете да прегледате и [[Special:ProtectedPages|списъка на текущо защитените страници]].",
"protectedarticle": "защити „[[$1]]“",
"whatlinkshere-prev": "{{PLURAL:$1|предишна|предишни $1}}",
"whatlinkshere-next": "{{PLURAL:$1|следваща|следващи $1}}",
"whatlinkshere-links": "← препратки",
- "whatlinkshere-hideredirs": "$1 на пÑ\80енаÑ\81оÑ\87ваÑ\89и Ñ\81Ñ\82Ñ\80аниÑ\86и",
- "whatlinkshere-hidetrans": "$1 на вклÑ\8eÑ\87ени Ñ\81Ñ\82Ñ\80аниÑ\86и",
- "whatlinkshere-hidelinks": "$1 на пÑ\80епÑ\80аÑ\82ки",
+ "whatlinkshere-hideredirs": "$1 пÑ\80енаÑ\81оÑ\87ваниÑ\8f",
+ "whatlinkshere-hidetrans": "$1 вклÑ\8eÑ\87ваниÑ\8f",
+ "whatlinkshere-hidelinks": "$1 препратки",
"whatlinkshere-hideimages": "$1 на препратки към файла",
"whatlinkshere-filters": "Филтри",
"whatlinkshere-submit": "Отваряне",
"exif-dc-contributor": "Сътрудници",
"exif-dc-date": "Дата(и)",
"exif-dc-rights": "Права",
+ "exif-dc-type": "Вид медия",
"exif-isospeedratings-overflow": "По-голяма от 65535",
"exif-iimcategory-ace": "Изкуствa, култура и забавление",
"exif-iimcategory-clj": "Престъпност и право",
"watchlistedit-clear-titles": "Заглавия:",
"watchlistedit-clear-submit": "Изчистване на списъка за наблюдение (Необратимо!)",
"watchlistedit-clear-done": "Списъкът за наблюдение беше изчистен.",
+ "watchlistedit-clear-removed": "{{PLURAL:$1|1 заглавие беше премахнато|$1 заглавия бяха премахнати}}:",
"watchlisttools-clear": "Изчистване на списъка за наблюдение",
"watchlisttools-view": "Преглед на списъка за наблюдение",
"watchlisttools-edit": "Преглед и редактиране на списъка за наблюдение",
"mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
"mw-widgets-titleinput-description-new-page": "страницата все още не съществува",
"mw-widgets-titleinput-description-redirect": "пренасочване към $1",
- "api-error-blacklisted": "Моля, изберете различно, описателно заглавие.",
"randomrootpage": "Случайна начална страница",
+ "log-action-filter-block": "Вид на блокирането:",
+ "log-action-filter-delete": "Вид на изтриването:",
+ "log-action-filter-newusers": "Вид на създаването на акаунт:",
"log-action-filter-protect": "Тип защита:",
+ "log-action-filter-rights": "Вид на промяната на правата за достъп:",
"log-action-filter-upload": "Тип качване:",
"log-action-filter-all": "Всички",
"log-action-filter-block-block": "Блокиране",
"log-action-filter-upload-upload": "Ново качване",
"log-action-filter-upload-overwrite": "Повторно качване",
"authmanager-authplugin-setpass-bad-domain": "Невалиден домейн.",
+ "authmanager-retype-help": "Парола (повторно) за потвърждение.",
"authmanager-email-label": "Е-поща",
"authmanager-email-help": "Електронна поща",
"authmanager-realname-label": "Истинско име",
+ "authmanager-realname-help": "Истинско име на потребителя",
+ "authmanager-provider-temporarypassword": "Временна парола",
"authprovider-resetpass-skip-label": "Пропусни",
"specialpage-securitylevel-not-allowed-title": "Не е позволено",
"cannotauth-not-allowed-title": "Достъпът е отказан"
"passwordreset-emailelement": "ব্যবহারকারী নাম: \n$1\n\nঅস্থায়ী পাসওয়ার্ড: \n$2",
"passwordreset-emailsentemail": "যদি এই ই-মেইল ঠিকানা আপনার অ্যাকাউন্টের সাথে সংযুক্ত করা থাকে, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
"passwordreset-emailsentusername": "যদি এই ব্যবহারকারী নামের সাথে ই-মেইল ঠিকানা সংযুক্ত করা থাকে, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
- "passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
- "passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
"passwordreset-nocaller": "একটি আহ্বানকারী প্রদান করা আবশ্যক",
"passwordreset-nosuchcaller": "আহ্বানকারীর অস্তিত্ব নেই: $1",
"passwordreset-invalideamil": "ভুল ইমেইল ঠিকানা",
+ "passwordreset-nodata": "একটি ব্যবহারকারীর নাম বা একটি ইমেল ঠিকানা দুটির একটিও সরবরা দেয়া হয়নি",
"changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
"changeemail-header": "আপনার ইমেল ঠিকানা পরিবর্তন করতে এই ফরমটি পূরণ করুন। আপনি যদি আপনার একাউন্ট থেকে যে কোন ইমেল ঠিকানার এসোসিয়েশন অপসারণ করতে চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
- "changeemail-passwordrequired": "এই পরিবর্তন নিশ্চিত করতে আপনাকে আপনার পাসওয়ার্ড লিখতে হবে।",
"changeemail-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই প্রবেশ করতে হবে।",
"changeemail-oldemail": "বর্তমান ই-মেইল ঠিকানা:",
"changeemail-newemail": "নতুন ই-মেইল ঠিকানা:",
"content-model-css": "সিএসএস",
"content-json-empty-object": "খালি বস্তু",
"content-json-empty-array": "খালি অ্যারে",
+ "deprecated-self-close-category": "অবৈধ স্ব-বন্ধকৃত এইচটিএমএল ট্যাগ ব্যবহার করা পাতা",
+ "deprecated-self-close-category-desc": "এই পাতাটি অবৈধ স্ব-বন্ধকৃত এইচটিএমএল ট্যাগ ধারন করে, যেমন <code><b/></code> বা <code><span/></code>। এইচটিএমএল৫-এর নির্দিষ্টকরণের সঙ্গে সামঞ্জস্যপূর্ণ হতে এইসবের আচরণ শীঘ্রই পরিবর্তন করা হবে, তাই উইকিপাঠ্যে তাদের ব্যবহার অবচিত হয়েছে।",
"duplicate-args-warning": "<strong>সতর্কীকরণ:</strong> \"$3\" প্যারামিটারের জন্য একের অধিক মানসহ [[:$1]] [[:$2]] কে আহ্বান করছে। শুধুমাত্র প্রদত্ত শেষ মান ব্যবহৃত হবে।",
"duplicate-args-category": "টেমপ্লেট আহ্বানে সদৃশ আর্গুমেন্ট ব্যবহার করা পাতা",
"duplicate-args-category-desc": "এই পাতায় টেমপ্লেট আহ্বান উপস্থিত রয়েছে যা সদৃশ আর্গুমেন্ট ব্যবহার করেছে, যেমন <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> বা <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>।",
"undo-nochange": "সম্পাদনাটি পূর্বেই বাতিল করা হয়েছে।",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-এর সম্পাদিত $1 নম্বর সংশোধনটি বাতিল করা হয়েছে",
"undo-summary-username-hidden": "একজন লুকানো ব্যবহারকারী $1 সংশোধন পুনরায় ফিরিয়ে এনেছেন",
- "cantcreateaccounttitle": "অ্যাকাউন্ট তৈরি করা যাবে না",
"cantcreateaccount-text": "[[User:$3|$3]] এই আইপি ঠিকানা('''$1''') থেকে অ্যাকাউন্ট সৃষ্টিতে বাধা দিয়েছেন।\n\n$3-এর দেয়া কারণ হল ''$2''",
"cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানার ব্যাপ্তি <strong>$1</strong>-এর মধ্যে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানাও (<strong>$4</strong>) রয়েছে। \n\n$3 কর্তৃক <em>$2</em> কারণ দেখানো হয়েছে।",
"viewpagelogs": "এই পাতার জন্য লগগুলো দেখুন",
"right-editmyprivateinfo": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করুন (যেমন ইমেইল ঠিকানা, আসল নাম)",
"right-editmyoptions": "আপনার পছন্দসমূহ পরিবর্তন করুন",
"right-rollback": "একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন",
- "right-markbotedits": "রà§\8bলড-বà§\8dযাà¦\95 সমà§\8dপাদনাসমà§\82হà¦\95à§\87 বà¦\9f সমà§\8dপাদনা হিসà§\87বà§\87 à¦\9aিহà§\8dনিত à¦\95রà§\8b",
+ "right-markbotedits": "ফà§\87রত à¦\86না সমà§\8dপাদনাসমà§\82হà¦\95à§\87 বà¦\9f সমà§\8dপাদনা হিসà§\87বà§\87 à¦\9aিহà§\8dনিত à¦\95রà§\87",
"right-noratelimit": "রেট লিমিটের ভিত্তিতে পরিবর্তন হবে না",
"right-import": "অন্য উইকি থেকে পাতা আমদানী করো",
"right-importupload": "ফাইল আপলোড থেকে এই পাতাগুলো আমদানী করো",
"right-managechangetags": "[[Special:Tags|ট্যাগ]] তৈরি ও সক্রিয়/নিষ্ক্রিয় করুন",
"right-applychangetags": "সম্পাদনার সাথে [[Special:Tags|ট্যাগ]] যুক্ত করুন",
"right-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে [[Special:Tags|ট্যাগ]] সংযোজন ও অপসারণ করুন",
+ "right-deletechangetags": "ডাটাবেজ থেকে [[Special:Tags|ট্যাগ]] অপসারণ করা",
"grant-group-email": "ইমেইল পাঠান",
+ "grant-group-other": "বিবিধ কার্যকলাপ",
"grant-createaccount": "অ্যাকাউন্ট তৈরি করুন",
"grant-createeditmovepage": "পাতা তৈরি, সম্পাদনা এবং স্থানান্তর করুন",
"grant-editmycssjs": "আপনার সিএসএস/জাভাস্ক্রিপ্ট সম্পাদনা করুন",
"action-managechangetags": "ট্যাগ তৈরি ও সক্রিয়/নিষ্ক্রিয়",
"action-applychangetags": "আপনার পরিবর্তনগুলোর সাথে ট্যাগ সংযোজন করুন",
"action-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে ট্যাগ সংযোজন ও অপসারণ করুন",
+ "action-purge": "এই পাতা হালনাগাদ করুন",
"nchanges": "$1টি {{PLURAL:$1|পরিবর্তন}}",
"enhancedrc-since-last-visit": "{{PLURAL:$1|সর্বশেষ প্রদর্শনের পর}} $1টি",
"enhancedrc-history": "ইতিহাস",
"upload-too-many-redirects": "এই ইউআরএলটিতে অনেক বেশি পুনর্নির্দেশনা রয়েছে",
"upload-http-error": "একটি এইচটিটিপি ত্রুটি দেখা দিয়েছে: $1",
"upload-copy-upload-invalid-domain": "এই ডোমেইন থেকে আপলোড সম্ভব নয়।",
+ "upload-dialog-disabled": "এই ডায়ালগ ব্যবহার করে ফাইল আপলোড করা এই উইকিতে নিষ্ক্রিয় করা হয়েছে।",
"upload-dialog-title": "ফাইল আপলোড করুন",
"upload-dialog-button-cancel": "বাতিল",
"upload-dialog-button-done": "সম্পন্ন",
"upload-dialog-button-upload": "আপলোড",
"upload-form-label-infoform-title": "বিস্তারিত",
"upload-form-label-infoform-name": "নাম",
+ "upload-form-label-infoform-name-tooltip": "ফাইলের জন্য একটি অদ্বিতীয় বিবরণমূলক শিরোনাম, যেটি ফাইলের নাম হিসাবে পরিবেশন হবে। আপনি ফাঁকা স্থান সহ সমতল ভাষা ব্যবহার করতে পারেন। ফাইল এক্সটেনশন অন্তর্ভুক্ত করবেন না।",
"upload-form-label-infoform-description": "বিবরণ",
+ "upload-form-label-infoform-description-tooltip": "সংক্ষেপে কাজটি সম্পর্কে উল্লেখযোগ্য সবকিছু বর্ণনা করুন।\nএকটি ছবির জন্য, এতে থাকা প্রধান বিষয়, অনুষ্ঠান, বা জায়গা উল্লেখ করুন।",
"upload-form-label-usage-title": "ব্যবহার",
"upload-form-label-usage-filename": "ফাইলের নাম",
"upload-form-label-own-work": "এটি আমার নিজের কাজ",
"apihelp": "এপিআই সাহায্য",
"apihelp-no-such-module": "মডিউল \"$1\" পাওয়া যায়নি।",
"apisandbox": "এপিআই খেলাঘর",
+ "apisandbox-jsonly": "API খেলাঘর ব্যবহার করতে জাভাস্ক্রিপ্ট প্রয়োজন।",
"apisandbox-api-disabled": "এপিআই এই সাইটে নিষ্ক্রিয় করা আছে।",
"apisandbox-fullscreen": "প্যানেল সম্প্রসারণ করুন",
+ "apisandbox-fullscreen-tooltip": "ব্রাউজারের উইন্ডো পূরণ করতে খেলাঘরের প্যানেল প্রসারিত করুন।",
"apisandbox-unfullscreen": "পাতা দেখাও",
"apisandbox-submit": "অনুরোধ রাখুন",
"apisandbox-reset": "পরিস্কার",
"watchnologin": "আপনি প্রবেশ করেননি",
"addwatch": "নজরতালিকায় যোগ করো",
"addedwatchtext": "\"[[:$1]]\" ও এর আলোচনা পাতাটি আপনার [[Special:Watchlist|নজরতালিকাতে]] যোগ করা হয়েছে।",
+ "addedwatchtext-talk": "\"[[:$1]]\" ও এর সাথে জড়িত পাতা আপনার [[Special:Watchlist|নজরতালিকাতে]] যোগ করা হয়েছে।",
"addedwatchtext-short": "\"$1\" পাতাটি আপনার নজরতালিকায় যোগ করা হয়েছে।",
"removewatch": "নজরতালিকা থেকে অপসারণ",
"removedwatchtext": "\"[[:$1]]\" ও এর আলোচনা পাতাটি আপনার [[Special:Watchlist|নজরতালিকা]] থেকে সরানো হয়েছে।",
+ "removedwatchtext-talk": "\"[[:$1]]\" ও এর সাথে জড়িত পাতা আপনার [[Special:Watchlist|নজরতালিকা]] থেকে সরানো হয়েছে।",
"removedwatchtext-short": "\"$1\" পাতাটি আপনার নজরতালিকা থেকে সরিয়ে নেয়া হয়েছে।",
"watch": "নজর রাখুন",
"watchthispage": "নজরে রাখুন",
"enotif_body": "প্রিয় $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nসম্পাদকের সারাংশ: $PAGESUMMARY $PAGEMINOREDIT\n\nসম্পাদকের সাথে যোগাযোগের উপায়:\nইমেইল: $PAGEEDITOR_EMAIL\nউইকি: $PAGEEDITOR_WIKI\n\nপাতাটির পরবর্তী পরিবর্তনগুলো জন্য আর কোন বিজ্ঞপ্তি পাঠানো হবে না, যতক্ষণ না আপনি প্রবেশ করার সময় এই পাতায় ব্রাউজ করবেন। এছাড়া আপনি আপনার নজরতালিকায় রাখা সবগুলি পাতা জন্য বিজ্ঞপ্তি ফ্ল্যাগ শুরুর অবস্থায় ফিরিয়ে নিতে পারেন।\n\nআপনার বন্ধুত্বপূর্ণ {{SITENAME}} বিজ্ঞপ্তি ব্যবস্থা\n\n--\nইমেইল বিজ্ঞপ্তি সেটিং পরিবর্তনের জন্য দেখুন\n{{canonicalurl:{{#special:Preferences}}}}\n\nআপনার নজরতালিকা সেটিংস পরিবর্তন করতে চাইলে দেখুন, \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nনজরতালিকা থেকে কোন পাতা অপসারণ করতে চাইলে এখানে যান:\n$UNWATCHURL\n\nপ্রতিক্রিয়া জানাতে ও আরও সহযোগিতার জন্য:\n$HELPPAGE",
"created": "তৈরী হয়েছিল",
"changed": "পরিবর্তিত",
- "deletepage": "পাতাটি মুছে ফেলা হোক",
+ "deletepage": "পাতা মুছুন",
"confirm": "নিশ্চিত করুন",
"excontent": "বিষয়বস্তু ছিল: '$1'",
"excontentauthor": "বিষয়বস্তু ছিল: \"$1\", এবং একমাত্র অবদানকারী ছিলেন \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|আলাপ]])",
"movereason": "কারণ:",
"revertmove": "পূর্বাবস্থায় ফেরত নেওয়া হোক",
"delete_and_move_text": "\"[[:$1]]\" শিরোনামের গন্তব্য পাতাটি ইতিমধ্যেই বিদ্যমান। আপনি কি স্থানান্তর সফল করার জন্য পাতাটি মুছে দিতে চান?",
- "delete_and_move_confirm": "হà§\8dযাà¦\81, পাতাà¦\9fি মà§\81à¦\9bà§\87 ফà§\87লা হà§\8bà¦\95",
+ "delete_and_move_confirm": "হà§\8dযাà¦\81, পাতাà¦\9fি মà§\81à¦\9bà§\81ন",
"delete_and_move_reason": "\"[[$1]]\" থেকে স্থানান্তরের স্বার্থে মুছে ফেলা হয়েছে",
"selfmove": "উৎস ও গন্তব্য পাতা একই শিরোনামের; কোন পাতা একই শিরোনামের আরেক পাতায় সরানো যাবে না।",
"immobile-source-namespace": "পাতাটি \"$1\" নামস্থানে স্থানান্তর সম্ভব নয়",
"log-action-filter-delete-restore": "পাতা পুনঃরুদ্ধার",
"log-action-filter-delete-event": "লগ অপসারণ",
"log-action-filter-delete-revision": "সংশোধন অপসারণ",
+ "log-action-filter-import-interwiki": "আন্তঃউইকি আমদানি",
+ "log-action-filter-import-upload": "XML আপলোড কর্তৃক আমদানি",
+ "log-action-filter-newusers-create": "বেনামী ব্যবহারকারী দ্বারা সৃষ্টি",
+ "log-action-filter-newusers-create2": "নিবন্ধিত ব্যবহারকারী দ্বারা সৃষ্টি",
+ "log-action-filter-newusers-autocreate": "স্বয়ংক্রিয় সৃষ্টি",
+ "log-action-filter-newusers-byemail": "ই-মেইলে পাসওয়ার্ড প্রেরণের দ্বারা সৃষ্টি",
"log-action-filter-patrol-patrol": "ম্যানুয়াল টহল",
"log-action-filter-patrol-autopatrol": "স্বয়ংক্রিয় টহল",
"log-action-filter-protect-protect": "সুরক্ষা",
"log-action-filter-protect-modify": "সুরক্ষা পরিমার্জন",
"log-action-filter-protect-unprotect": "অসুরক্ষা",
+ "log-action-filter-protect-move_prot": "সুরক্ষা স্থানান্তরিত",
+ "log-action-filter-rights-rights": "ম্যানুয়াল পরিবর্তন",
"log-action-filter-rights-autopromote": "স্বয়ংক্রিয় পরিবর্তন",
"log-action-filter-upload-upload": "নতুন আপলোড",
"log-action-filter-upload-overwrite": "পুনঃআপলোড",
+ "authmanager-authplugin-setpass-failed-title": "পাসওয়ার্ড পরিবর্তন ব্যর্থ হয়েছে",
"authmanager-authplugin-setpass-bad-domain": "অবৈধ ডোমেইন।",
"authmanager-autocreate-noperm": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি মঞ্জুরিপ্রাপ্ত নয়।",
"authmanager-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
"authmanager-realname-label": "প্রকৃত নাম",
"authmanager-realname-help": "ব্যবহারকারীর প্রকৃত নাম",
"authmanager-provider-temporarypassword": "অস্থায়ী পাসওয়ার্ড",
+ "authprovider-confirmlink-success-line": "$1: সংযোগ করা সফল হয়েছে।",
"authprovider-resetpass-skip-label": "উপেক্ষা করো",
"authprovider-resetpass-skip-help": "পাসওয়ার্ড পুনঃস্থাপন করা উপেক্ষা করুন।",
"authform-wrongtoken": "ভুল টোকেন",
"tagline": "ཡོང་ཁུངས་{{SITENAME}}",
"help": "ཕན་གྲོགས།",
"search": "འཚོལ་བ།",
+ "search-ignored-headings": " #<!-- སྟར་པ་འདི་སྔར་གྱི་ཇི་མ་ཇི་འཞིན་དུ་འཇོག་རོགས། --> <pre>\n# འགོ་བརྗོད་དེ་འཚོལ་ཞིབ་ནང་སྣང་མེད་དུ་བསྐྱུར་རོགས།\n# ཤོག་ངོས་འདིའི་འགོ་བརྗོད་ལ་ཐོ་འགོད་རེའུ་མིག་དུ་འགོད་ཚར་མ་ཐག་འགྱུར་བ་རྣམས་མངོན་ཐུབ།\n# ཁྱེད་ཀྱི་རྩོམ་སྒྲིག་སྟོང་པ་དྱས་མ་ཐག་ཤོག་ངོས་འདི་དབང་ཤུགས་ཀྱི་ཐོ་འགོད་རེའུ་མིག་དུ་འགོད་ཐུབ།\n# ཚིག་སྦྱོར་རྣམས་གཤམ་གསལ་ལྟར་དཀོད་རོགས།\n# * ཡིག་འབྲུ་\"#\" ནས་སྟར་པའི་འཇུག་བར་ཚང་མ་མཆན་འགྲེལ་ཡིན།\n# * སྟོང་ཆ་མེད་པའི་སྟར་པ་འདི་སྣང་མེད་དུ་བསྐྱུར་དགོས་པའི་འགོ་བརྗོད་ཡིན། \nཟུར་མཆན།\nཕྱི་ཕྱོགས་སྦྲེལ་མཐུད།\nའདིར་ཡང་གཟིགས་རོགས།\n #</pre> <!-- སྟར་པ་འདི་སྔར་གྱི་ཇི་མ་ཇི་འཞིན་དུ་འཇོག་རོགས། -->",
"searchbutton": "འཚོལ།",
"go": "སོང་།",
"searcharticle": "འཚོལ།",
"tog-ccmeonemails": "Pošalji mi kopije e-pošte koju pošaljem drugim korisnicima",
"tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
"tog-showhiddencats": "Prikaži skrivene kategorije",
- "tog-norollbackdiff": "Izostavi razliku nakon vraćanja",
+ "tog-norollbackdiff": "Ne prikazuj razliku nakon izvršenog vraćanja",
"tog-useeditwarning": "Upozori me kad napuštam stranicu za izmjene bez sačuvanih promjena",
"tog-prefershttps": "Uvijek koristi sigurnu konekciju kada sam prijavljen.",
"underline-always": "Uvijek",
"passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima Vašeg računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše originalne šifre, a ne želite je više promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
"passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
"passwordreset-emailsentemail": "Ako je ovo adresa e-pošte s kojom ste registrirali ovaj račun, podsjetnik šifre će vam biti poslan na vašu adresu e-pošte.",
- "passwordreset-emailsent-capture": "Poslan je podsjetnik preko e-pošte (prikazano ispod).",
- "passwordreset-emailerror-capture": "E-poruka za resetiranje lozinke, prikazano ispod, poslana je, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspjelo: $1",
"changeemail": "Promjena ili uklanjanje e-adrese",
"changeemail-header": "Ispunite sljedeći formular da biste promijenili adresu e-pošte. Ako želite ukloniti postojeću adresu e-pošte s vašeg korisničkog računa, pri ispunjavanju formulara, polje nove adrese e-pošte ostavite prazno.",
- "changeemail-passwordrequired": "Morat ćete unijeti šifru da biste potvrdili ovu izmjenu.",
"changeemail-no-info": "Morate biti prijavljeni za direktan pristup ovoj stranici.",
"changeemail-oldemail": "Trenutna adresa e-pošte:",
"changeemail-newemail": "Nova adresa e-pošte:",
"minoredit": "Ovo je manja izmjena",
"watchthis": "Prati ovu stranicu",
"savearticle": "Sačuvaj stranicu",
+ "publishpage": "Objavi stranicu",
+ "publishchanges": "Objavi izmjene",
"preview": "Pregled stranice",
"showpreview": "Prikaži izgled",
"showdiff": "Prikaži izmjene",
"undo-nochange": "Izgleda da je izmjena već vraćena.",
"undo-summary": "Poništena izmjena $1 {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$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''",
"cantcreateaccount-range-text": "Pravljenje računa sa IP adresa u rasponu <strong>$1</strong>, koji uključuje i vašu IP adresu (<strong>$4</strong>), je blokirao korisnik [[User:$3|$3]].\n\nNavedeni razlog korisnika $3 je <em>$2</em>",
"viewpagelogs": "Pogledaj zapisnike ove stranice",
"revdelete-unsuppress": "Ukloni ograničenja na vraćenim revizijama",
"revdelete-log": "Razlog:",
"revdelete-submit": "Primijeni na odabrane {{PLURAL:$1|reviziju|revizije}}",
- "revdelete-success": "'''Vidljivost revizije uspješno ažurirana.'''",
+ "revdelete-success": "'''Vidljivost izmjene je ažurirana.'''",
"revdelete-failure": "'''Vidljivost revizije nije mogla biti ažurirana:'''\n$1",
"logdelete-success": "'''Vidljivost evidencije uspješno postavljena.'''",
"logdelete-failure": "'''Zapisnik vidljivosti nije mogao biti postavljen:'''\n$1",
"rightslogtext": "Ovo je zapisnik promjena korisničkih prava.",
"action-read": "čitate ovu stranicu",
"action-edit": "uređujete ovu stranicu",
- "action-createpage": "napravite stranicu",
- "action-createtalk": "kreirate stranice za razgovor",
+ "action-createpage": "napravite ovu stranicu",
+ "action-createtalk": "pravite stranice za razgovor",
"action-createaccount": "napravite ovaj korisnički račun",
"action-history": "gledate historiju ove stranice",
"action-minoredit": "da označite ovu izmjenu kao malu",
"action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
"action-editmyprivateinfo": "uredite svoje privatne podatke",
"action-editcontentmodel": "uredi model sadržaja stranice",
- "action-managechangetags": "napravite i uklonite oznake iz baze podataka",
+ "action-managechangetags": "pravite i (de)aktivirate oznake",
"action-applychangetags": "dodate oznake uz vaše izmjene",
"action-changetags": "dodate ili uklonite razne oznake na pojedinačnim verzijama i unosima u zapisnicima",
"nchanges": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
"tagline": "De {{SITENAME}}",
"help": "Ajuda",
"search": "Cerca",
+ "search-ignored-headings": " #<!-- deixeu aquesta línia tal com està --> <pre>\n# Títols que seran ignorats pel cercador.\n# Els canvis fets aquí tindran efecte tant aviat com la pàgina amb el títol sigui indexada.\n# Podeu forçar que una pàgina s'indexi de nou fent una edició nul·la.\n# La sintaxi és la següent:\n# * Tot el que hi hagi des d'un caràcter \"#\" fins el final de línia és un comentari\n# * Tota línia no buida és el títol exacte a ignorar, amb les majúscules i complet\nReferències\nEnllaços externs\nVegeu també\n #</pre> <!-- deixeu aquesta línia tal com està -->",
"searchbutton": "Cerca",
"go": "Vés-hi",
"searcharticle": "Vés-hi",
"nocookieslogin": "{{SITENAME}} utilitza galetes per a enregistrar usuaris. Teniu les galetes desactivades. Activeu-les i torneu a provar.",
"nocookiesfornew": "No s'ha creat el compte d'usuari, ja que no es podia confirmar el seu origen.\nVerifiqueu que teniu habilitades les galetes al vostre navegador, torneu a carregar aquesta pàgina i intenteu-lo de nou.",
"nocookiesforlogin": "{{int:nocookieslogin}}",
+ "createacct-loginerror": "El vostre compte ha estat creat correctament, però la vostra sessió podria no iniciar-se automàticament. Si us plau, realitzeu l'inici de [[Special:UserLogin|sessió manual]].",
"noname": "No heu especificat un nom vàlid d'usuari.",
"loginsuccesstitle": "Sessió iniciada",
"loginsuccess": "Heu iniciat la sessió a {{SITENAME}} com a «$1».",
"botpasswords-created-title": "S'ha creat la contrasenya del bot",
"botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de l'usuari «$2».",
"botpasswords-updated-title": "Contrasenya de bot actualitzada",
+ "botpasswords-deleted-title": "S'ha eliminat la contrasenya del bot",
+ "botpasswords-deleted-body": "La contrasenya del bot \"$1\", pertanyent a l'usuari \"$2\", ha estat eliminada.",
+ "botpasswords-newpassword": "La nova contrasenya per a iniciar sessió amb <strong>$1</strong> és <strong>$2</strong>. Si us plau, guardeu-la de cara al futur.",
+ "botpasswords-no-provider": "BotPasswordsSessionProvider no està disponible.",
+ "botpasswords-restriction-failed": "Les restriccions de contrasenyes de bots impedeixen aquest inici de sessió.",
"botpasswords-not-exist": "L'usuari «$1» no té una contrasenya de bot anomenada «$2».",
"resetpass_forbidden": "No poden canviar-se les contrasenyes",
+ "resetpass_forbidden-reason": "Les contrasenyes no es poden canviar: $1",
"resetpass-no-info": "Heu d'estar registrats en un compte per a poder accedir directament a aquesta pàgina.",
"resetpass-submit-loggedin": "Canvia la contrasenya",
"resetpass-submit-cancel": "Cancel·la",
"passwordreset-emailtext-user": "L'usuari $1 de {{SITENAME}} ha demanat una reinicialització de la vostra contrasenya per al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar ara per fixar una nova contrasenya. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
"passwordreset-emailelement": "Nom d'usuari: \n$1\n\nContrasenya temporal: \n$2",
"passwordreset-emailsentemail": "Si aquesta adreça electrònica està associada al vostre compte, s’enviarà un missatge de restabliment de contrasenya.",
- "passwordreset-emailsent-capture": "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
- "passwordreset-emailerror-capture": "S'ha generat un correu electrònic de renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
+ "passwordreset-emailsentusername": "Si existeix una adreça electrònica associada a aquest nom d'usuari, s’hi enviarà un missatge de reestabliment de contrasenya.",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|S'ha enviat el correu|S'han enviat els correus}} de restabliment de {{PLURAL:$1|contrasenya|contrasenyes}}. A continuació es mostra {{PLURAL:$1|l'usuari i contrasenya|la llista d'usuaris i contrasenyes}}.",
"passwordreset-invalideamil": "Adreça de correu electrònic no vàlida",
+ "passwordreset-nodata": "No s'ha proporcionat cap nom d'usuari ni adreça electrònica",
"changeemail": "Canvia o elimina l’adreça electrònica",
"changeemail-header": "Empleneu aquest formulari per canviar la vostra adreça electrònica. Si voleu eliminar qualssevol associacions d’adreces electròniques del vostre compte, deixeu en blanc el camp i envieu el formulari.",
- "changeemail-passwordrequired": "Cal que introduïu la vostra contrasenya per confirmar el canvi.",
"changeemail-no-info": "Heu d'entrar en un compte d'usuari per accedir directament a aquesta pàgina.",
"changeemail-oldemail": "Adreça electrònica actual:",
"changeemail-newemail": "Adreça electrònica nova:",
"undo-nochange": "Sembla que ja s'ha desfet la modificació.",
"undo-summary": "Es desfà la revisió $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussió]])",
"undo-summary-username-hidden": "Desfés la revisió $1 d'un usuari ocult",
- "cantcreateaccounttitle": "No es pot crear el compte",
"cantcreateaccount-text": "[[User:$3|$3]] ha bloquejat la creació de comptes des d'aquesta adreça IP ('''$1''').\n\nEl motiu donat per $3 és ''$2''",
"cantcreateaccount-range-text": "La creació de comptes des de les adreces IP en el rang <strong>$1</strong>, que inclou la vostra adreça IP (<strong>$4</strong>), ha estat blocada per [[User:$3|$3]].\n\nEl motiu donat per $3 és <em>$2</em>",
"viewpagelogs": "Visualitza els registres d'aquesta pàgina",
"right-override-export-depth": "Exportar pàgines incloent aquelles enllaçades fins a una fondària de 5",
"right-sendemail": "Enviar missatges de correu electrònic a altres usuaris",
"right-passwordreset": "Veure les sol·licituds de restabliment de contrasenya per correu electrònic",
- "right-managechangetags": "Crear i suprimir [[Special:Tags|etiquetes]] des de la base de dades",
+ "right-managechangetags": "Crear, activar i desactivar [[Special:Tags|etiquetes]]",
"right-applychangetags": "Aplica les [[Special:Tags|etiquetes]] juntament amb els canvis propis",
"right-changetags": "Afegeix i suprimeix [[Special:Tags|etiquetes]] en revisions individuals i entrades de registre",
+ "right-deletechangetags": "Suprimir [[Special:Tags|etiquetes]] des de la base de dades",
"grant-group-page-interaction": "Interacció amb pàgines",
"grant-group-file-interaction": "Interacció amb fitxes multimèdia",
"grant-group-watchlist-interaction": "Interacció amb la vostra llista de seguiment",
"grant-createeditmovepage": "Crea, modifica i reanomena pàgines",
"grant-delete": "Suprimeix pàgines, revisions i entrades de registre",
"grant-editinterface": "Modifica l'espai de noms MediaWiki i els CSS/JavaScript d'usuari",
+ "grant-editmyoptions": "Editeu les vostres preferències d'usuari",
"grant-editmywatchlist": "Modifica la llista de seguiment",
"grant-editpage": "Modifica les pàgines existents",
"grant-editprotected": "Modifica pàgines protegides",
"grant-highvolume": "Edició d'alt volum",
"grant-oversight": "Amaga usuaris i suprimeix revisions",
+ "grant-patrol": "Patrulla els canvis de les pàgines",
"grant-protect": "Protecció i desprotecció de pàgines",
"grant-rollback": "Reversió de canvis en pàgines",
"grant-sendemail": "Enviament de correus a altres usuaris",
"rightslogtext": "Aquest és un registre de canvis dels permisos d'usuari.",
"action-read": "llegir aquesta pàgina",
"action-edit": "modificar aquesta pàgina",
- "action-createpage": "crear pàgines",
- "action-createtalk": "crear pàgines de discussió",
+ "action-createpage": "crear aquesta pàgina",
+ "action-createtalk": "crear aquesta pàgina de discussió",
"action-createaccount": "crear aquest compte d'usuari",
"action-autocreateaccount": "crea automàtica aquest compte d'usuari extern",
"action-history": "mostra l'historial de la pàgina",
"action-managechangetags": "crear i (des)activar etiquetes",
"action-applychangetags": "aplica les etiquetes juntament amb els canvis",
"action-changetags": "afegeix i elimina etiquetes a les revisions i les entrades de registre individuals",
+ "action-deletechangetags": "eliminar etiquetes des de la base de dades",
"nchanges": "$1 {{PLURAL:$1|canvi|canvis}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|des de la darrera visita}}",
"enhancedrc-history": "historial",
"upload-too-many-redirects": "L'URL conté massa redireccions",
"upload-http-error": "Ha ocorregut un error HTTP: $1",
"upload-copy-upload-invalid-domain": "Les càrregues de còpia no són disponibles des d'aquest domini.",
+ "upload-dialog-disabled": "La càrrega de fitxers utilitzant aquest quadre de diàleg està desactivada en aquest wiki.",
"upload-dialog-title": "Carrega un fitxer",
"upload-dialog-button-cancel": "Cancel·la",
"upload-dialog-button-done": "Fet",
"upload-form-label-infoform-name": "Nom",
"upload-form-label-infoform-name-tooltip": "Un únic títol descriptiu pel fitxer, que servirà com a nom del fitxer. Podeu utilitzar llenguatge senzill amb espais. No hi inclogueu l'extensió del fitxer.",
"upload-form-label-infoform-description": "Descripció",
+ "upload-form-label-infoform-description-tooltip": "Descriviu breument tot el que sigui notable d'aquesta obra.\nSi es tracta d'una fotografia, esmenteu els principals elements que hi ha representats o bé l'esdeveniment o lloc en qüestió.",
"upload-form-label-usage-title": "Ús",
"upload-form-label-usage-filename": "Nom del fitxer",
"upload-form-label-own-work": "Això és el meu propi treball",
"upload-form-label-infoform-categories": "Categories",
"upload-form-label-infoform-date": "Data",
+ "upload-form-label-own-work-message-generic-local": "Confirmo que estic carregant aquest fitxer seguint les condicions d'ús i polítiques de concessió de llicències a {{SITENAME}}.",
+ "upload-form-label-not-own-work-message-generic-local": "Si no podeu carregar aquest fitxer sota les polítiques de {{SITENAME}}, si us plau, tanqueu aquest quadre de diàleg i proveu amb un altre mètode.",
"upload-form-label-not-own-work-local-generic-local": "També podeu provar [[Special:Upload|la pàgina de càrrega per defecte]].",
"upload-form-label-own-work-message-generic-foreign": "Entenc que esteu carregant el fitxer en un repositori compartit. Confirmo que ho estic fent seguint les condicions d'ús i les polítiques de llicenciament que s'hi apliquen.",
+ "upload-form-label-not-own-work-message-generic-foreign": "Si no podeu carregar aquest fitxer sota les polítiques del repositori lliure, si us plau, tanqueu aquest quadre de diàleg i proveu amb un altre mètode.",
+ "upload-form-label-not-own-work-local-generic-foreign": "També us recomanem que utilitzeu [[Special:Upload|la pàgina de càrrega a {{SITENAME}}]] si aquest fitxer es pot carregar seguint les seves polítiques.",
"backend-fail-stream": "No s'ha pogut transmetre el fitxer $1.",
"backend-fail-backup": "No s'ha pogut fer una còpia de seguretat del fitxer $1.",
"backend-fail-notexists": "El fitxer $1 no existeix.",
"uploadstash-summary": "Aquesta pàgina permet accedir als fitxers que han estat carregats (o estan en procés de ser carregats), però que encara no s'han publicat al wiki. Aquests fitxers només són visibles per a l'usuari que els ha carregats.",
"uploadstash-clear": "Esborra els fitxers en reserva",
"uploadstash-nofiles": "No teniu fitxers en reserva",
- "uploadstash-badtoken": "No s'ha pogut realitzar l'acció, possiblement perquè han caducat la vostra identificació. Intenteu-ho de nou.",
+ "uploadstash-badtoken": "No s'ha pogut realitzar l'acció, possiblement perquè ha caducat la vostra identificació. Intenteu-ho de nou.",
"uploadstash-errclear": "S'estan netejant els fitxers que han fallat.",
"uploadstash-refresh": "Actualitza la llista de fitxers",
"uploadstash-thumbnail": "mostra una miniatura",
"sp-contributions-username": "Adreça IP o nom d'usuari:",
"sp-contributions-toponly": "Mostra només les darreres revisions",
"sp-contributions-newonly": "Mostra només modificacions que són creacions de pàgina",
+ "sp-contributions-hideminor": "Amaga les edicions menors",
"sp-contributions-submit": "Cerca",
"whatlinkshere": "Què hi enllaça",
"whatlinkshere-title": "Pàgines que enllacen amb «$1»",
"tooltip-ca-nstab-category": "Vegeu la pàgina de la categoria",
"tooltip-minoredit": "Marca-ho com una modificació menor",
"tooltip-save": "Deseu els canvis",
+ "tooltip-publish": "Publica els canvis",
"tooltip-preview": "Reviseu els vostres canvis, feu-ho abans de desar res!",
"tooltip-diff": "Mostra quins canvis heu fet al text",
"tooltip-compareselectedversions": "Vegeu les diferències entre les dues versions seleccionades d'aquesta pàgina.",
"pageinfo-category-files": "Nombre d'arxius",
"markaspatrolleddiff": "Marca com a supervisat",
"markaspatrolledtext": "Marca la pàgina com a supervisada",
+ "markaspatrolledtext-file": "Marc la versió del fitxer com patrullada",
"markedaspatrolled": "Marca com a supervisat",
"markedaspatrolledtext": "S'ha marcat com a patrullada la revisió seleccionada de [[:$1]].",
"rcpatroldisabled": "S'ha inhabilitat la supervisió dels canvis recents",
"log-action-filter-delete-restore": "Restauració de pàgines",
"log-action-filter-delete-event": "Registre de supressió",
"log-action-filter-delete-revision": "Supressió de revisions",
+ "log-action-filter-managetags-create": "Creació de l'etiqueta",
+ "log-action-filter-managetags-delete": "Supressió de l'etiqueta",
+ "log-action-filter-managetags-activate": "Activació de l'etiqueta",
+ "log-action-filter-newusers-autocreate": "Creació automàtica",
"log-action-filter-patrol-patrol": "Patrullatge manual",
"log-action-filter-patrol-autopatrol": "Patrullatge automàtic",
"log-action-filter-protect-protect": "Protecció",
"password-change-forbidden": "Хьан йиш яц хӀокху вики чохь пароль хийца.",
"externaldberror": "Арахьара хаамийн базан гӀоьнца аутентификаци ечу хенахь гӀалат даьлла я хьа дӀаяздаран хийцам бан бакъонаш яц.",
"login": "Системин довзийтар",
+ "login-security": "Хьой хилар бакъде",
"nav-login-createaccount": "Довзийтар / дӀаяздар кхоллар",
"userlogin": "Довзийтар я декъашхочун дӀаяздар кхоллар",
"userloginnocreate": "Довзийта",
"userlogin-resetpassword-link": "Пароль кхоссар?",
"userlogin-helplink2": "Системин чудахаран гӀодар",
"userlogin-loggedin": "Хьо {{GENDER:$1|$1}} цӀарца чохь ву/ю.\nЛахара форманца кхин цӀарца чугӀо.",
+ "userlogin-reauth": "{{GENDER:$1|$1}} хьой хилар бакъдан системин чугӀо.",
"userlogin-createanother": "Кхолла декъашхочун кхин дӀаяздар",
"createacct-emailrequired": "Электронан поштан адрес",
"createacct-emailoptional": "Электронан поштан адрес (ца яздича мега)",
"resetpass-wrong-oldpass": "Нийса йоцу я хана йолу карара пароль. Ахьа кхиамца пароль хийцина я керла хана йолу пароль ехна хила там бу.",
"resetpass-recycled": "Дехар до, хӀинца йолччул башха пароль хӀотта йе.",
"resetpass-temp-emailed": "Ахьа чугӀош язйина цкъачунна электронан поште яийтина пароль. Чудахар чекхдалийта язъян еза керла пароль.",
- "resetpass-temp-password": "ЦÑ\85Ñ\8cан Ñ\85ана пароль:",
+ "resetpass-temp-password": "Ð¥ана пароль:",
"resetpass-abort-generic": "Пароль хийцар дӀахедар",
"resetpass-expired": "Хьан паролан хан чекхелла. Дехар до керла пароль хӀоттаяр.",
"resetpass-expired-soft": "Хьа паролан хан чекхелла. Дехар до, харжа керла пароль я тӀетаӀе «{{int:authprovider-resetpass-skip-label}}», и тӀехо хица.",
"passwordreset-emailtitle": "{{SITENAME}}: декъашхочун дӀаяздарх лаьцна хаам",
"passwordreset-emailtext-ip": "{{SITENAME}} ($4) проектехь цхьам я ахьа хӀокху IP-адрес $1 тӀера хьа декъашхочун пароль кхоссар дехна,\nоьцу электронан адресца дихкина ду {{PLURAL:$3|1хӀара декъашхочун дӀаяздар|хӀара декъашхочун дӀаяздар}}:\n\n$2\n\n{{PLURAL:$3|ХӀара хана пароль|ХӀара хана паролаш}} лелар ю {{PLURAL:$5|$5 дийнахь}}.\nСистемин чугӀой харжа керла пароль. \nХьой пароль кхоссар дехна дацахь я хьалхалера пароль дага еънехь хӀума цадеш Ӏад битта хӀара хаам хьа йиш ю шира пароль лелаян.",
"passwordreset-emailtext-user": "{{SITENAME}} ($4) проектера декъашхочо $1 хьа декъашхочун пароль кхоссар дехна,\nоьцу электронан адресца дихкина ду {{PLURAL:$3|1хӀара декъашхочун дӀаяздар|хӀара декъашхочун дӀаяздар}}:\n\n$2\n\n{{PLURAL:$3|ХӀара хана пароль|ХӀара хана паролаш}} лелар ю {{PLURAL:$5|$5 дийнахь}}.\nСистемин чугӀой харжа керла пароль. \nХьой пароль кхоссар дехна дацахь я хьалхалера пароль дага еънехь хӀума цадеш Ӏад битта хӀара хаам хьа йиш ю шира пароль лелаян.",
- "passwordreset-emailelement": "Ð\94екÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ñ\86Ó\80е: \n$1\n\nХанна йолÑ\83 паÑ\80олÑ\8c: \n$2",
+ "passwordreset-emailelement": "Декъашхочун цӀе: \n$1\n\nХанна пароль: \n$2",
"passwordreset-emailsentemail": "Электронан хаам баийтина кхоьссинчу паролах лаьцна хаам чохь болуш.",
"passwordreset-emailsent-capture": "Электронан хаам баийтина кхоьссинчу паролах лаьцна хаам чохь болуш. \nцуна йозане хьажа йиш ю лахахь.",
"passwordreset-emailerror-capture": "Пароль кхоссаран хаам чохь болуш электронан кехат кхоьллина, цуна йоза хьажа йиш ю лахахь, амма иза {{GENDER:$2|декъашхочунга}} дӀадахьийта тар цаделира бахьнехь: $1",
"mostlinkedtemplates": "Массарел дуккха а лелайо агӀонаш",
"mostcategories": "Дуккха категореш тӀе тоьхна йолу агӀонаш",
"mostimages": "Массарел дуккха лелайо файлаш",
- "mostinterwikis": "Ð\94Ñ\83ккÑ\85а Ñ\8eкÑ\8aаÑ\80вики хьажоргаш тӀе тоьхна йолу агӀонаш",
+ "mostinterwikis": "Ð\94Ñ\83ккÑ\85а Ñ\8eкÑ\8aаÑ\80викаÑ\88-хьажоргаш тӀе тоьхна йолу агӀонаш",
"mostrevisions": "Сих сиха нисйина йолу агӀонаш",
"prefixindex": "Хьалха агӀонийн цӀерш хӀотто еза",
"prefixindex-namespace": "Хьалха агӀонийн цӀерш хӀотто еза («{{ns:$1}}»)",
"activeusers-hidebots": "Къайлабаха боташ",
"activeusers-hidesysops": "Къайлабаха куьйгалхой",
"activeusers-noresult": "Декъашхой цакарий.",
+ "activeusers-submit": "Гайта жигара декъашхой",
"listgrouprights": "Декъашхойн тобанийн бакъонаш",
"listgrouprights-summary": "Лахахьа гойту декъашхошна яла йиш йолу бакъонаш. [[{{MediaWiki:Listgrouprights-helppage}}|хьажа кхин хааме]].",
"listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Ела бакъонаш</span>\n* <span class=\"listgrouprights-revoked\">ДӀаяьхна бакъонаш</span>",
"special-characters-title-minus": "хьаьрк минус",
"mw-widgets-titleinput-description-redirect": "ДӀасхьажорг $1 тӀе",
"sessionprovider-generic": "$1 сесси",
- "randomrootpage": "Цахууш нисъелла ораман агӀо"
+ "randomrootpage": "Цахууш нисъелла ораман агӀо",
+ "authmanager-provider-temporarypassword": "Ханна пароль",
+ "changecredentials": "Декъашхочун дӀаяздаран хийцам",
+ "removecredentials": "ДӀадаха декъашхойн дӀаяздарш",
+ "removecredentials-submit": "ДӀадаха декъашхойн дӀаяздарш",
+ "credentialsform-provider": "ДӀаяздарийн тайпа:",
+ "credentialsform-account": "Декъашхочун цӀе:"
}
"Urbanecm",
"LordMsz",
"Matma Rex",
- "Dvorapa"
+ "Dvorapa",
+ "Walter Klosse",
+ "Martin Urbanec"
]
},
"tog-underline": "Podtrhávat odkazy:",
"tagline": "Z {{grammar:2sg|{{SITENAME}}}}",
"help": "Nápověda",
"search": "Hledat",
+ "search-ignored-headings": " #<!-- tento řádek ponechte beze změny --> <pre>\n# Zde uvedené nadpisy budou ignorovány vyhledáváním.\n# Změny této stránky se projeví ve chvíli, kdy je stránka používající příslušný nadpis indexována.\n# Přeindexování stránky můžete vynutit prázdnou editací.\n# Syntaxe je taková:\n# * Cokoli od znaku „#“ do konce řádky je komentář.\n# * Každá neprázdná řádka je přesný nadpis, který se má ignorovat, včetně velikosti písmen a tak.\nReference\nExterní odkazy\nSouvisející články\nSouvisející stránky\n #</pre> <!-- tento řádek ponechte beze změny -->",
"searchbutton": "Hledat",
"go": "Jít na",
"searcharticle": "Jít na",
"passwordreset-emailelement": "Uživatelské jméno: \n$1\n\nDočasné heslo: \n$2",
"passwordreset-emailsentemail": "Pokud je u vašeho účtu nastavena tato e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
"passwordreset-emailsentusername": "Pokud je u tohoto účtu nastavena e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
- "passwordreset-emailsent-capture": "Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.",
- "passwordreset-emailerror-capture": "Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale {{GENDER:$2|uživateli|uživatelce}} se ho nepodařilo odeslat: $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|Byl odeslán e-mail|Byly odeslány e-maily}} pro získání nového hesla. {{PLURAL:$1|Uživatelské jméno a heslo jsou zobrazeny|Seznam uživatelských jmen a hesel je zobrazen}} níže.",
"passwordreset-emailerror-capture2": "{{GENDER:$2|Uživateli|Uživatelce}} se nepodařilo odeslat e-mail: $1 {{PLURAL:$3|Uživatelské jméno a heslo jsou zobrazeny|Seznam uživatelských jmen a hesel je zobrazen}} níže.",
"passwordreset-nocaller": "Musí být uveden volající",
"passwordreset-nodata": "Nebylo zadáno uživatelské jméno ani e-mailová adresa",
"changeemail": "Změna nebo odstranění e-mailové adresy",
"changeemail-header": "Vyplněním tohoto formuláře můžete změnit svou e-mailovou adresu. Pokud chcete ze svého účtu odstranit vazbu na všechny e-mailové adresy, ponechte při odeslání formuláře novou e-mailovou adresu prázdnou.",
- "changeemail-passwordrequired": "Pro potvrzení této změny musíte zadat své heslo.",
"changeemail-no-info": "K této stránce mají přímý přístup jen přihlášení uživatelé.",
"changeemail-oldemail": "Stávající e-mailová adresa:",
"changeemail-newemail": "Nová e-mailová adresa:",
"undo-nochange": "Zdá se, že editace již byla zrušena.",
"undo-summary": "Zrušena verze $1 od uživatele [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuse]])",
"undo-summary-username-hidden": "Zrušena verze $1 od skrytého uživatele",
- "cantcreateaccounttitle": "Nelze vytvořit uživatelský účet",
"cantcreateaccount-text": "Zakládání nových účtů z této IP adresy (<strong>$1</strong>) bylo zablokováno {{GENDER:$3|uživatelem|uživatelkou}} [[User:$3|$3]].\n\n$3 uvádí toto zdůvodnění: <em>$2</em>",
"cantcreateaccount-range-text": "Zakládání nových účtů z IP adres v rozsahu <strong>$1</strong>, který obsahuje i vaši IP adresu (<strong>$4</strong>), bylo zablokováno {{GENDER:$3|uživatelem|uživatelkou}} [[User:$3|$3]].\n\n$3 uvádí toto zdůvodnění: <em>$2</em>",
"viewpagelogs": "Zobrazit protokolovací záznamy k této stránce",
"action-applychangetags": "přidávat značky k vlastním změnám",
"action-changetags": "přidávat libovolné značky na jednotlivé revize a protokolovací záznamy a odebírat je",
"action-deletechangetags": "mazat značky z databáze",
+ "action-purge": "vyčistit vyrovnávací paměť této stránky",
"nchanges": "$1 {{PLURAL:$1|změna|změny|změn}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|od poslední návštěvy}}",
"enhancedrc-history": "historie",
"querypage-disabled": "Tato speciální stránka je z výkonnostních důvodů vypnuta.",
"apihelp": "Nápověda k API",
"apihelp-no-such-module": "Modul „$1“ nebyl nalezen.",
- "apisandbox": "API pískoviště",
- "apisandbox-jsonly": "Pro použití API pískoviště je nutný JavaScript.",
+ "apisandbox": "Pískoviště API",
+ "apisandbox-jsonly": "Pro použití pískoviště API je nutný JavaScript.",
"apisandbox-api-disabled": "API je na tomto webu vypnuto.",
"apisandbox-intro": "Pomocí této stránky můžete experimentovat s <strong>webovými službami MediaWiki API</strong>.\nPodrobnosti využití API najdete v [[mw:API:Main page|jeho dokumentaci]]. Příklad: [https://www.mediawiki.org/wiki/API#A_simple_example získání obsahu Hlavní stránky]. Další příklady uvidíte vybráním parametru action.\n\nUvědomte si, že přestože jste na pískovišti, mohou akce provedené na této stránce wiki změnit.",
"apisandbox-fullscreen": "Rozbalit panel",
"listgrouprights-namespaceprotection-header": "Omezení jmenných prostorů",
"listgrouprights-namespaceprotection-namespace": "Jmenný prostor",
"listgrouprights-namespaceprotection-restrictedto": "Oprávnění umožňující uživateli editovat",
- "listgrants": "Svolení",
- "listgrants-summary": "Následující seznam obsahuje svolení a jim odpovídající přístup k uživatelským právům. Uživatelé mohou aplikace autorizovat k využití jejich účtu, ale s omezenými právy na základě svolení, která uživatel aplikaci poskytl. Aplikace konající jménem uživatele ale nemůže využít oprávnění, která uživatel nemá.\nK jednotlivým oprávněním mohou existovat [[{{MediaWiki:Listgrouprights-helppage}}|doplňující informace]].",
- "listgrants-grant": "Svolení",
+ "listgrants": "Skupiny oprávnění",
+ "listgrants-summary": "Následující seznam obsahuje skupiny oprávnění a jim odpovídající přístup k uživatelským právům. Uživatelé mohou aplikace autorizovat k využití jejich účtu, ale s omezenými právy na základě skupin oprávnění, která uživatel aplikaci dovolil použít. Aplikace konající jménem uživatele ale nemůže využít oprávnění, která uživatel nemá.\nK jednotlivým oprávněním mohou existovat [[{{MediaWiki:Listgrouprights-helppage}}|doplňující informace]].",
+ "listgrants-grant": "Skupina oprávnění",
"listgrants-rights": "Oprávnění",
"trackingcategories": "Sledovací kategorie",
"trackingcategories-summary": "Tato stránka obsahuje seznam sledovacích kategorií, které automaticky přidává software MediaWiki. Jejich jména lze změnit úpravou příslušných systémových hlášení ve jmenném prostoru {{ns:8}}.",
"watchnologin": "Nejste přihlášen(a)",
"addwatch": "Přidat do sledovaných stránek",
"addedwatchtext": "Stránka „[[:$1]]“ a její diskusní stránka byly přidány mezi [[Special:Watchlist|stránky, které sledujete]].",
+ "addedwatchtext-talk": "„[[:$1]]“ a související stránka byly přidány mezi [[Special:Watchlist|stránky, které sledujete]].",
"addedwatchtext-short": "Stránka „$1“ byla přidána mezi stránky, které sledujete.",
"removewatch": "Vyřadit ze sledovaných stránek",
- "removedwatchtext": "Stránka „[[:$1]]“ a její diskusní stránka byly vyřazeny z vašeho [[Special:Watchlist|seznamu sledovaných stránek]].",
+ "removedwatchtext": "Stránka „[[:$1]]“ a její diskusní stránka byly vyřazeny ze [[Special:Watchlist|stránek, které sledujete]]",
+ "removedwatchtext-talk": "„[[:$1]]“ a související stránka byly vyřazeny ze [[Special:Watchlist|stránek, které sledujete]].",
"removedwatchtext-short": "Stránka „$1“ byla vyřazena z vašeho seznamu sledovaných stránek.",
"watch": "Sledovat",
"watchthispage": "Sledovat tuto stránku",
"tooltip-namespace_association": "Zaškrtnutím tohoto políčka zahrnete i diskusní či obsahový jmenný prostor příslušný k vybranému jmennému prostoru",
"blanknamespace": "(Hlavní)",
"contributions": "Příspěvky {{GENDER:$1|uživatele|uživatelky}}",
- "contributions-title": "Příspěvky {{GENDER:$1|uživatele|uživatelky}} $1",
+ "contributions-title": "Příspěvky {{GENDER:$1|uživatele|uživatelky|uživatele/uživatelky}} $1",
"mycontris": "Příspěvky",
"anoncontribs": "Příspěvky",
"contribsub2": "{{GENDER:$3|uživatele|uživatelky}} $1 ($2)",
"Matma Rex",
"Diafol",
"Nemo bis",
- "Dafyddt"
+ "Dafyddt",
+ "Jdforrester"
]
},
"tog-underline": "Tanlinellu cysylltiadau:",
"passwordreset-emailtext-user": "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ailosod ei gyfrinair ar {{SITENAME}}\n($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:\n\n$2\n\nBydd y {{PLURAL:$3||cyfrinair|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod}}.\nDylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
"passwordreset-emailelement": "Enw'r defnyddiwr: \n$1\n\nY cyfrinair dros dro: \n$2",
"passwordreset-emailsentemail": "Anfonwyd e-bost i ailosod eich cyfrinair atoch.",
- "passwordreset-emailsent-capture": "Anfonwyd e-bost i ailosod cyfrinair, ac fe'i ddangosir isod.",
- "passwordreset-emailerror-capture": "Lluniwyd e-bost i ailosod cyfrinair fel ag a welir isod, ond ni lwyddwyd i'w anfon at y {{GENDER:$2|defnyddiwr}}: $1",
"changeemail": "Newid y cyfeiriad e-bost",
"changeemail-header": "Cwbwlhewch y ffurflen hon i newid cyfeiriad e-bost y cyfrifi. I ddileu pob cysylltiad i bob cyfeiriad ebost, gadewch e'n wag.",
"changeemail-no-info": "Ni allwch fynd at y dudalen hon heblaw eich bod wedi mewngofnodi.",
"minoredit": "Golygiad bychan yw hwn",
"watchthis": "Gwylier y dudalen hon",
"savearticle": "Cadw'r dudalen",
+ "publishpage": "Cyhoeddi tudalen",
+ "publishchanges": "Cyhoeddi newidiadau",
"preview": "Rhagolwg",
"showpreview": "Dangos rhagolwg",
"showdiff": "Dangos newidiadau",
"undo-nochange": "Ymddengys fod y golygiad wedi ei ddadwneud yn barod.",
"undo-summary": "Dadwneud y golygiad $1 gan [[Special:Contributions/$2|$2]] ([[User talk:$2|Sgwrs]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
"undo-summary-username-hidden": "Dadwneud y golygiad $1 gan ddefnyddiwr cudd",
- "cantcreateaccounttitle": "Yn methu creu cyfrif",
"cantcreateaccount-text": "Rhwystrwyd y gallu i greu cyfrif ar gyfer y cyfeiriad IP hwn, ('''$1'''), gan [[User:$3|$3]].\n\nY rheswm a roddwyd dros y bloc gan $3 yw ''$2''.",
"cantcreateaccount-range-text": "Gosododd [[User:$3|$3]] floc ar agor cyfrifon o gyfeiriadau IP yn yr ystod <strong>$1</strong>, sy'n cynnwys eich cyfeiriad IP chi (<strong>$4</strong>).\n\nY rheswm a roddwyd gan $3 yw \"$2\"",
"viewpagelogs": "Dangos logiau'r dudalen hon",
"special-characters-title-emdash": "heiffen em",
"special-characters-title-minus": "arwydd minws",
"mw-widgets-dateinput-placeholder-day": "BBBB-MM-DD",
- "mw-widgets-dateinput-placeholder-month": "BBBB-MM",
- "api-error-blacklisted": "Dewiswch deitl gwahanol sy'n disgrifio'r gwaith, os gwelwch yn dda."
+ "mw-widgets-dateinput-placeholder-month": "BBBB-MM"
}
"tagline": "Fra {{SITENAME}}",
"help": "Hjælp",
"search": "Søg",
+ "search-ignored-headings": " #<!-- lad denne linje være præcis som den er --> <pre>\n# Overskrifter, der vil blive ignoreret af søgning.\n# Ændringer til dette træder i kraft så snart siden med overskriften er indekseret.\n# Du kan tvinge siden til genindeksering ved at lave en nul redigering.\n# syntaksen er som følger:\n# * Alt fra en tegnet \"#\" til slutningen af linjen er en kommentar\n# * Hver ikke-tomme linje er den nøjagtige titel der skal ignoreres, der skelnes også mellem store og små bogstaver\nReferencer\nEksterne henvisninger\nSe også\nKilder og henvisninger\nEksterne kilder/henvisninger\nKilder\n #</pre> <!-- lad denne linje være præcis som den er -->",
"searchbutton": "Søg",
"go": "Gå til",
"searcharticle": "Gå til",
"passwordreset-emailelement": "Brugernavn: \n$1\n\nMidlertidig adgangskode: \n$2",
"passwordreset-emailsentemail": "Hvis denne e-mailadresse er knyttet til din konto, så vil en e-mail om nulstilling af adgangskoden blive sendt.",
"passwordreset-emailsentusername": "Hvis der er en e-mailadresse forbundet med dette brugernavn, så vil en e-mail om nulstilling af adgangskoden blive sendt.",
- "passwordreset-emailsent-capture": "En e-mail om nulstilling af adgangskode, som vist nedenfor, er blevet sendt.",
- "passwordreset-emailerror-capture": "En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1",
"changeemail": "Ændr eller fjern e-mailadresse",
"changeemail-header": "Udfyld denne formular for at ændre din e-mailadresse. Hvis du gerne vil fjerne forbindelsen af en e-mailadresse fra din konto, så lad den nye e-mailadresse være blank, når du sender formularen.",
- "changeemail-passwordrequired": "Du er nødt til at indtaste din adgangskode for at bekræfte denne ændring.",
"changeemail-no-info": "Du skal være logget på for at komme direkte til denne side.",
"changeemail-oldemail": "Nuværende e-mailadresse:",
"changeemail-newemail": "Ny e-mailadresse:",
"undo-nochange": "Ændringen ser ud til allerede at være blevet fjernet.",
"undo-summary": "Fjerner version $1 af [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]])",
"undo-summary-username-hidden": "Fortryde revision $1 af en skjult bruger",
- "cantcreateaccounttitle": "Brugerkontoen kan ikke oprettes.",
"cantcreateaccount-text": "Oprettelsen af en brugerkonto fra IP-adressen ('''$1''') er blevet blokeret af [[User:$3|$3]].\n\nÅrsagen til blokeringen er angivet af $3 som ''$2''",
"cantcreateaccount-range-text": "Oprettelsen af en brugerkonto fra IP-adresser i intervallet <strong>$1</strong>, som omfatter din IP-adresse (<strong>$4</strong>), er blevet blokeret af [[User:$3|$3]].\n\nÅrsagen angivet af $3 er <em>$2</em>",
"viewpagelogs": "Vis loglister for denne side",
"mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
"mw-widgets-titleinput-description-new-page": "side eksisterer ikke endnu",
"mw-widgets-titleinput-description-redirect": "omdiriger til $1",
- "api-error-blacklisted": "Vælg venligst en anden, beskrivende titel.",
"randomrootpage": "Tilfældig stamside",
"log-action-filter-block": "Blokeringstype:",
"log-action-filter-move": "Flyttetype:",
"tog-extendwatchlist": "Alle und nicht nur die aktuellsten Änderungen in der Beobachtungsliste anzeigen",
"tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
"tog-numberheadings": "Überschriften automatisch nummerieren",
- "tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
+ "tog-showtoolbar": "Bearbeiten-Werkzeugleiste aktivieren",
"tog-editondblclick": "Seiten mit Doppelklick bearbeiten",
"tog-editsectiononrightclick": "Einzelne Abschnitte per Rechtsklick bearbeiten",
"tog-watchcreations": "Selbst erstellte Seiten und hochgeladene Dateien automatisch beobachten",
"tagline": "Aus {{SITENAME}}",
"help": "Hilfe",
"search": "Suche",
+ "search-ignored-headings": " #<!-- diese Zeile nicht verändern --> <pre>\n# Überschriften, die von der Suche ignoriert werden.\n# Diese Änderungen werden wirksam, sobald die Seite mit der Überschrift indexiert wurde.\n# Du kannst die Seitenindexierung erzwingen, indem du einen Nulledit durchführst.\n# Syntax:\n# * Alles, was einer Raute („#“) bis zum Zeilenende folgt, ist ein Kommentar.\n# * Jede nicht-leere Zeile ist der exakte zu ignorierende Titel.\nEinzelnachweise\nWeblinks\nSiehe auch\n #</pre> <!-- diese Zeile nicht verändern -->",
"searchbutton": "Suchen",
"go": "Ausführen",
"searcharticle": "Seite",
"passwordreset-emailelement": "Benutzername: \n$1\n\nTemporäres Passwort: \n$2",
"passwordreset-emailsentemail": "Falls diese E-Mail-Adresse mit deinem Benutzerkonto verknüpft ist, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
"passwordreset-emailsentusername": "Falls es eine E-Mail-Adresse gibt, die mit diesem Benutzernamen verknüpft ist, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
- "passwordreset-emailsent-capture": "Eine Passwortzurücksetzungs-E-Mail wurde versandt, die unten angezeigt wird.",
- "passwordreset-emailerror-capture": "Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an {{GENDER:$2|den Benutzer|die Benutzerin}} gescheitert: $1",
"passwordreset-emailsent-capture2": "Die Passwort-Zurücksetzungs-{{PLURAL:$1|E-Mail wurde|E-Mails wurden}} versandt. {{PLURAL:$1|Der Benutzername und das Passwort|Die Liste der Benutzernamen und Passwörter}} wird unten angezeigt.",
"passwordreset-emailerror-capture2": "Das Senden der E-Mail an {{GENDER:$2|den Benutzer|die Benutzerin}} ist fehlgeschlagen: $1 {{PLURAL:$3|Der Benutzername und das Passwort|Die Liste der Benutzernamen und Passwörter}} wird unten angezeigt.",
"passwordreset-nocaller": "Es muss ein Rufer angegeben werden",
"passwordreset-nodata": "Weder ein Benutzername noch eine E-Mail-Adresse wurde angegeben",
"changeemail": "E-Mail-Adresse ändern oder entfernen",
"changeemail-header": "Fülle dieses Formular vollständig aus, um deine E-Mail-Adresse zu ändern. Falls du die Zuweisung einer E-Mail-Adresse zu deinem Benutzerkonto entfernen möchtest, lasse beim Übermitteln des Formulars das Feld für die neue E-Mail-Adresse leer.",
- "changeemail-passwordrequired": "Du musst dein Passwort eingeben, um diese Änderung zu bestätigen.",
"changeemail-no-info": "Du musst angemeldet sein, um direkt auf diese Seite zugreifen zu können.",
"changeemail-oldemail": "Aktuelle E-Mail-Adresse:",
"changeemail-newemail": "Neue E-Mail-Adresse:",
"undo-nochange": "Anscheinend wurde diese Bearbeitung bereits rückgängig gemacht.",
"undo-summary": "Änderung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht.",
"undo-summary-username-hidden": "Änderung $1 eines versteckten Benutzers rückgängig gemacht.",
- "cantcreateaccounttitle": "Das Benutzerkonto kann nicht erstellt werden",
"cantcreateaccount-text": "Die Erstellung eines Benutzerkontos von der IP-Adresse '''($1)''' aus wurde durch [[User:$3|$3]] gesperrt.\n\nGrund der Sperre: ''$2''",
"cantcreateaccount-range-text": "Das Erstellen von Benutzerkonten von IP-Adressen im Bereich <strong>$1</strong>, der deine IP-Adresse (<strong>$4</strong>) enthält, wurde von [[User:$3|$3]] gesperrt.\n\nDer angegebene Grund von $3 lautet: <em>$2</em>",
"viewpagelogs": "Logbücher dieser Seite anzeigen",
"prefs-namespaces": "Namensräume",
"default": "Voreinstellung",
"prefs-files": "Dateien",
- "prefs-custom-css": "Benutzerdefinierte CSS",
+ "prefs-custom-css": "Benutzerdefiniertes CSS",
"prefs-custom-js": "Benutzerdefiniertes JavaScript",
"prefs-common-css-js": "Gemeinsames CSS/JavaScript aller Benutzeroberflächen:",
"prefs-reset-intro": "Du kannst diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.\nDies kann nicht mehr rückgängig gemacht werden.",
"action-applychangetags": "Markierungen zusammen mit deinen Änderungen anzuwenden",
"action-changetags": "beliebige Markierungen zu einzelnen Versionen und Logbucheinträgen hinzuzufügen und zu entfernen",
"action-deletechangetags": "Markierungen aus der Datenbank zu löschen",
+ "action-purge": "den Cache dieser Seite zu leeren",
"nchanges": "$1 {{PLURAL:$1|Änderung|Änderungen}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|seit dem letzten Besuch}}",
"enhancedrc-history": "Versionsgeschichte",
"backend-fail-read": "Die Datei $1 konnte nicht gelesen werden.",
"backend-fail-create": "Die Datei $1 konnte nicht gespeichert werden.",
"backend-fail-maxsize": "Die Datei $1 konnte nicht gespeichert werden, da sie größer als {{PLURAL:$2|ein Byte|$2 Bytes}} ist.",
- "backend-fail-readonly": "Das Speicher-Backend „$1“ befindet sich derzeit im Lesemodus. Der angegebene Grund lautet: <em>$2</em>",
- "backend-fail-synced": "Die Datei „$1“ befindet sich, innerhalb des internen Speicher-Backends, in einem inkonsistenten Zustand.",
- "backend-fail-connect": "Es konnte keine Verbindung zum Speicher-Backend „$1“ hergestellt werden.",
- "backend-fail-internal": "Im Speicher-Backend „$1“ ist ein unbekannter Fehler aufgetreten.",
+ "backend-fail-readonly": "Die Datenbank „$1“ befindet sich derzeit im Lesemodus. Der Grund hierfür ist: <em>$2</em>",
+ "backend-fail-synced": "Die Datei „$1“ befindet sich, innerhalb des internen Datenbanksystems, in einem inkonsistenten Zustand.",
+ "backend-fail-connect": "Es konnte keine Verbindung zur Datenbank „$1“ hergestellt werden.",
+ "backend-fail-internal": "In der Datenbank „$1“ ist ein unbekannter Fehler aufgetreten.",
"backend-fail-contenttype": "Der Inhaltstyp, der im Pfad „$1“ zu speichernden Datei, konnte nicht bestimmt werden.",
- "backend-fail-batchsize": "Eine Stapelverarbeitungsdatei, die {{PLURAL:$1|eine Operation|$1 Operationen}} enthält, wurde an das Speicher-Backend gesandt. Die Begrenzung liegt allerdings bei {{PLURAL:$2|einer Operation|$2 Operationen}}.",
+ "backend-fail-batchsize": "Der Datenbank wurde eine Stapelverarbeitungsdatei mit {{PLURAL:$1|einem Verarbeitungsschritt|$1 Verarbeitungsschritten}} übermittelt. Die zulässige Obergrenze liegt indes bei {{PLURAL:$2|einem Verarbeitungsschritt|$2 Verarbeitungsschritten}}.",
"backend-fail-usable": "Die Datei „$1“ konnte entweder aufgrund eines nicht vorhandenen Verzeichnisses oder wegen unzureichender Berechtigungen weder abgerufen noch gespeichert werden.",
- "filejournal-fail-dbconnect": "Es konnte keine Verbindung zur Journaldatenbank des Speicher-Backends „$1“ hergestellt werden.",
- "filejournal-fail-dbquery": "Die Journaldatenbank des Speicher-Backends „$1“ konnte nicht aktualisiert werden.",
+ "filejournal-fail-dbconnect": "Es konnte keine Verbindung zur Journaldatenbank des Datenbanksystems „$1“ hergestellt werden.",
+ "filejournal-fail-dbquery": "Die Journaldatenbank des Datenbanksystems „$1“ konnte nicht aktualisiert werden.",
"lockmanager-notlocked": "„$1“ konnte nicht entsperrt werden, da keine Sperrung besteht.",
"lockmanager-fail-closelock": "Die Sperrdatei für „$1“ konnte nicht geschlossen werden.",
"lockmanager-fail-deletelock": "Die Sperrdatei für „$1“ konnte nicht gelöscht werden.",
"licenses-edit": "Lizenzoptionen bearbeiten",
"license-nopreview": "(es ist keine Vorschau verfügbar)",
"upload_source_url": "(deine ausgewählte Datei von einer gültigen, öffentlich zugänglichen URL)",
- "upload_source_file": "(deine ausgewählte Datei von deinem Computer)",
+ "upload_source_file": "(die von dir auf deinem Computer ausgewählte Datei)",
"listfiles-delete": "löschen",
"listfiles-summary": "Diese Spezialseite listet alle hochgeladenen Dateien auf.",
"listfiles_search_for": "Suche nach Datei:",
"watchnologin": "Du bist nicht angemeldet",
"addwatch": "Zur Beobachtungsliste hinzufügen",
"addedwatchtext": "„[[:$1]]“ und die Diskussionsseite wurden zu deiner [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.",
+ "addedwatchtext-talk": "„[[:$1]]“ und ihre dazugehörige Seite wurden zu deiner [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.",
"addedwatchtext-short": "Die Seite „$1“ wurde zu deiner Beobachtungsliste hinzugefügt.",
"removewatch": "Von der Beobachtungsliste entfernen",
"removedwatchtext": "„[[:$1]]“ und die Diskussionsseite wurden von deiner [[Special:Watchlist|Beobachtungsliste]] entfernt.",
+ "removedwatchtext-talk": "„[[:$1]]“ und ihre dazugehörige Seite wurden von deiner [[Special:Watchlist|Beobachtungsliste]] entfernt.",
"removedwatchtext-short": "Die Seite „$1“ wurde von deiner Beobachtungsliste entfernt.",
"watch": "Beobachten",
"watchthispage": "Seite beobachten",
"creditspage": "Seitenzuschreibung",
"nocredits": "Für diese Seite sind keine Zuschreibungen vorhanden.",
"spamprotectiontitle": "Spamschutzfilter",
- "spamprotectiontext": "Der Text, die du speichern willst, wurde vom Spamschutzfilter blockiert.\nDas liegt wahrscheinlich an einem Link auf eine externe Seite.",
+ "spamprotectiontext": "Der Text, den du speichern möchtest, wurde vom Spamschutzfilter blockiert.\nDas liegt wahrscheinlich an einem Link auf eine externe Seite.",
"spamprotectionmatch": "'''Der folgende Text wurde vom Spamfilter gefunden: ''$1'''''",
"spambot_username": "MediaWiki-Spam-Säuberung",
"spam_reverting": "Letzte Version ohne Links zu $1 wiederhergestellt.",
"Calak",
"Macofe",
"Matma Rex",
- "Kumkumuk"
+ "Kumkumuk",
+ "Gırd"
]
},
"tog-underline": "Bınê gırey de xete bance:",
"april-date": "Nisane $1",
"may-date": "Gulane $1",
"june-date": "{{PLURAL:$1|1=1ᵉ|$1}} Heziran",
- "july-date": "Temuze $1",
+ "july-date": "Temuz $1",
"august-date": "Tebaxe $1",
"september-date": "Keşkelun $1",
- "october-date": "Tışrino Verên $1",
- "november-date": "Tışrino Peyên $1",
+ "october-date": "$1 Cetan",
+ "november-date": "$1 Kelverdan",
"december-date": "Kanun $1",
"period-am": "AM",
"period-pm": "PM",
"category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
"hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}",
"hidden-category-category": "Kategoriyê nımıtey",
- "category-subcat-count": "{{PLURAL:$2|Na kategoriya de $1 bınkategoriyay estê.|$2 kategoriyan ra $1 bınkategoriyay asenê.}}",
+ "category-subcat-count": "{{PLURAL:$2|Na kategoriya de $1 bınkategoriyay estê.|$2 kategoriyan ra $1 bınkategoriyay asenê.}} \n(K) Kategori (D) Dosya (P) Pela",
"category-subcat-count-limited": "Na kategoriya de {{PLURAL:$1|ena kategoriya bınên est a|enê $1 kategoriyay bınêni est ê}}.",
"category-article-count": "{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Ebe $2 ra pêro piya {{PLURAL:$1|ena pela na kategoriye dera|$1 enê peli na kategoriye derê.}}}}",
"category-article-count-limited": "{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.",
"about": "Heqa cı de",
"article": "Pela zerreki",
"newwindow": "(pençereyê newey de beno a)",
- "cancel": "Peyd ke",
+ "cancel": "Bıtexelne",
"moredotdotdot": "Vêşi...",
"morenotlisted": "Vêşi lista nêbi...",
"mypage": "Pele",
"faq": "PZP",
"faqpage": "Project: PZP",
"actions": "Hereketi",
- "namespaces": "Heruna naman",
+ "namespaces": "Heruna nameyan",
"variants": "Varyanti",
"navigation-heading": "Menuyê navigasyoni",
"errorpagetitle": "Xeta",
"search": "Cı geyre",
"searchbutton": "Cı geyre",
"go": "Şo",
- "searcharticle": "So",
+ "searcharticle": "Şo",
"history": "Tarixê pele",
"history_short": "Tarix",
"updatedmarker": "cıkewtena mına peyêne ra dıme biyo rocane",
- "printableversion": "Versiyonê nusterin",
- "permalink": "Gıreyo jûqere",
+ "printableversion": "Asayışê çapkerdışi",
+ "permalink": "Gıreyo daimi",
"print": "Çap ke",
"view": "Bıvêne",
- "view-foreign": "$1'i bıvin",
+ "view-foreign": "$1 de bıvêne",
"edit": "Bıvurne",
"edit-local": "Şınasnayışê lokali bıvurne",
- "create": "Vıraze",
+ "create": "Bıvıraz",
"create-local": "Şınasnayışê lokali cı ke",
"editthispage": "Ena pele bıvurne",
"create-this-page": "Na pele bınuse",
"redirectedfrom": "($1 ra kırışı yê)",
"redirectpagesub": "Pela berdışi",
"redirectto": "Beno hetê:",
- "lastmodifiedat": "Ena pele tewr peyên roca $2, $1 de biya rocaniye.",
+ "lastmodifiedat": "Ena pele tewr peyên roca $1, seate $2 de biya rocaniye.{{MediaWiki bın}}",
"viewcount": "Ena pele {{PLURAL:$1|rae|$1 rey}} vêniya.",
"protectedpage": "Pela pawıtiye",
"jumpto": "Şo be:",
"copyright": "Zerrekacı $1 bındı not biya.",
"copyrightpage": "{{ns:project}}:Heqa telifi",
"currentevents": "Hediseyê rocaneyi",
- "currentevents-url": "Project:Rocani hadisey",
+ "currentevents-url": "Project:Hediseyê rocaneyi",
"disclaimers": "Redê mesuliyeti",
"disclaimerpage": "Project:Reddê mesuliyetê bıngey",
"edithelp": "Peştdariya vurnayışi",
"policy-url": "Project:Terzê hereketi",
"portal": "Portalê cemaeti",
"portal-url": "Project:Portalê cemaeti",
- "privacy": "Politikay Nımnayışi",
- "privacypage": "Project:Xısusiyetê nımtışi",
+ "privacy": "Politikaya nımıteyiye",
+ "privacypage": "Project:Xısusiyetê nımıtışi",
"badaccess": "Xeta mısadey",
"badaccess-group0": "Heqa şıma çıniya, karo ke şıma waşt, bıkerê.",
"badaccess-groups": "No fealiyeto ke şıma waşt, tenya karberanê {{PLURAL:$2|grubi|gruban ra yewi}} rê akerdeyo: $1.",
"cannotdelete-title": "Şıma nêşenê pela \"$1\" besterê",
"delete-hook-aborted": "Esterıtışi terefê çengeli ra ibtal bi.\nQet tesrih beyan nêbi.",
"no-null-revision": "Qandé \"$1\" zew rewizyono newe névıraziya.",
- "badtitle": "Sernameo xırabın",
+ "badtitle": "Sernameyo xırabın",
"badtitletext": "Sernameyê pela ke şıma waşt, nêvêrd, vengo ya zi zıwano miyanêno ğelet gırêdaye ya zi sernameyê wiki.\nBeno ke, tede yew ya zi zêdê işareti estê ke sernameyan de nêxebetiyenê.",
"perfcached": "Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de",
"perfcachedts": "Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de",
"actionthrottled": "Kerden peysnaya",
"actionthrottledtext": "Riyê tedbirê anti-spami ra, wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.\nÇend deqey ra tepeya reyna bıcerrebnên.",
"protectedpagetext": "Na per qey nêvuriyayiş ho pawyeno ya zi kerdışe bini.",
- "viewsourcetext": "To şikinay çımey na pele bıvêne u kopya kerê:",
+ "viewsourcetext": "To şikinay çımey na pele bıvêne u kopya kerê:{{MediaWiki Wesiqe malumat}}",
"viewyourtext": "Na pela '''Vurnayışê ke kerdê''' re şıma şenê kopya kerê:",
"protectedinterface": "Na pela qandê nusnerin destegê verri dana u kes xırabin nêqero deye kerda kılit.",
"editinginterface": "'''İqaz:''' Şıma hayo yew pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.\nVurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.\nSeba çarnayışi, yardımê [https://translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
"remembermypassword": "Parola mı nê cıgeyrayoği de biya xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}})",
"userlogin-remembermypassword": "Mı biya xo viri",
"userlogin-signwithsecure": "Ebe teqdimkerê asayişın cıkewe",
+ "cannotloginnow-title": "Enewke ronıştışo nêabeno",
+ "cannotloginnow-text": "$1 karkerdışa ronıştış akerdış mıkum niyo.",
"yourdomainname": "Nameyê şıma yo meydani",
"password-change-forbidden": "Şıma na wiki de nêşenê parola bıvurnê.",
"externaldberror": "Ya database de xeta esta ya zi heqê şıma çino şıma no hesab bıvurni.",
"login": "Cı kewe",
+ "login-security": "Kamiya xo araşt kerê",
"nav-login-createaccount": "Dekew de / hesab vıraze",
"userlogin": "Cıkewtış / hesab vıraze",
- "userloginnocreate": "Cı kewe",
+ "userloginnocreate": "Dekewtış",
"logout": "Bıveciye",
"userlogout": "Bıveciye",
"notloggedin": "Şıma cıkewtış nêvıraşto",
"nologinlink": "Yew hesab ake",
"createaccount": "Hesab vıraze",
"gotaccount": "Hesabê şıma esto? '''$1'''.",
- "gotaccountlink": "Cı kewe",
+ "gotaccountlink": "Ronıştış ak",
"userlogin-resetlink": "Melumatê cıkewtışi xo vira kerdê?",
"userlogin-resetpassword-link": "Parola xo kerda xo vira?",
"userlogin-helplink2": "Heqa qeydbiyayışi de peşti bıgêrên",
"userlogin-loggedin": "Tı xora namey {{GENDER:$1|$1}} ra kewtê/kewtay cı.\nFormê cêrêni bıgureyne ke namey karberio bin ra cı kewê.",
+ "userlogin-reauth": "Eger ke {{GENDER:$1|$1}} şımayê se xo araşt kerdışirê fına ronıştış akerê.",
"userlogin-createanother": "Zewbi hesab vıraz",
"createacct-emailrequired": "Adresa e-postey",
"createacct-emailoptional": "Adresa e-postey (mecburi niya)",
"loginlanguagelabel": "Zıwan: $1",
"suspicious-userlogout": "Waştişê tu ya veciyayişi kebul nibiya cunki ihtimal o ke waştiş yew browser ya zi proksiyê heripiyaye ra ameya.",
"createacct-another-realname-tip": "Nameyo raştıkên keyfiyo.\nŞıma nameyo xoyo raştıkên ke bımocnê, seba iştırakanê karberi be ney ra istıfade beno.",
- "pt-login": "Cı kewe",
- "pt-login-button": "Cı kewe",
+ "pt-login": "Cıkewtış",
+ "pt-login-button": "Cıkewtış",
"pt-login-continue-button": "Cıkewten rê dewam ke",
"pt-createaccount": "Hesab vıraze",
"pt-userlogout": "Veciyayış",
"botpasswords-label-appid": "Nameyê boti:",
"botpasswords-label-create": "Vıraze",
"botpasswords-label-update": "Rocane ke",
- "botpasswords-label-cancel": "Bıtexelne",
+ "botpasswords-label-cancel": "Bıterkın",
"botpasswords-label-delete": "Bestere",
"botpasswords-label-resetpassword": "Parola raçarne",
"botpasswords-label-grants-column": "Dayen",
"resetpass_forbidden": "parolayi nêvuryayi",
"resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
"resetpass-submit-loggedin": "Parola bıvurne",
- "resetpass-submit-cancel": "Bıtexelne",
+ "resetpass-submit-cancel": "Bıterkın",
"resetpass-wrong-oldpass": "parolayo parola maqbul niyo.\nşıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.",
"resetpass-recycled": "Parolaya şımaya newiye wa paroloya şımaya verêne ra ferqıne bo.",
"resetpass-temp-emailed": "E postaya rışyayê yubkoda şıma ronıştış akerdo. Ronıştışi xo temammkerdışi rê yu parolaya newi lazım a",
"passwordreset-emailtext-user": "$1 enê karberi, {{SITENAME}} ra ($4) teferuatê hesab dê şıma va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5 roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se yana ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
"passwordreset-emailelement": "Nameyê karberi: \n$1\n\nParolaya vêrdiye: \n$2",
"passwordreset-emailsentemail": "Eke na seba hesabê şıma yew adresa e-posteyê qeydına, yew e-posteyê parola nênkerdışi rışiyeno.",
- "passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
- "passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
"passwordreset-invalideamil": "Adresê eposta raşt niya",
"changeemail": "E-posta adresa xo wedarne",
"changeemail-header": "E-posya adresta hesabdê xo bıvurnê",
"publishpage": "Perer bıhesırne",
"publishchanges": "Vurnayışa vıla ke",
"preview": "Verqayt",
- "showpreview": "Verqayti bıasne",
- "showdiff": "Vurriyayışan bıasne",
+ "showpreview": "Verqayti bımocne",
+ "showdiff": "Vurriyayışan bımocne",
"anoneditwarning": "<strong>İqaz:</strong> Şıma be hesabê xo nêkewtê cı. \nAdresê şımayê IP tarixê vırnayışê na pele de do qeyd bo. Eke şıma <strong>[$1 cıkewê]</strong> ya zi <strong>[$2 hesab vırazê]</strong>, vurnayışê şıma be zewbina kare ra nameyê şıma rê bar beno.",
"anonpreviewwarning": "\"Şıma be hesabê xo nêkewtê cı. Eke qeyd kerê, adresê şımaê IP tarixê vırnayışê na pele de do qeyd bo.\"",
"missingsummary": "'''DİQET:''' Şıma jû xulasa nênuşte.\nEke şıma \"{{int:savearticle}}\" reyna bıtıknê, vırnayışê şıma bê xulasa qeyd beno.",
"newarticle": "(Newe)",
"newarticletext": "To yew gıre tıkna be ra yew pela ke hewna çıniya.\nSeba afernayışê pele ra, qutiya metnê cêrêni bıgurene (seba melumati qaytê [$1 pela peşti] ke).\nEke be ğeletine ameya tiya, wa gocega <strong>peyser</strong>i programê xo de bıtıkne.",
"anontalkpagetext": "----''No pel, pel o karbero hesab a nêkerdeyan o, ya zi karbero hesab akerdeyan o labele pê hesabê xo nêkewto de. No sebeb ra ma IP adres şuxulneni û ney IP adresan herkes eşkeno bıvino. Eke şıma qayil niye ina bo xo ri [[Special:CreateAccount|yew hesab bıvıraze]] veyaxut [[Special:UserLogin|hesab akere]].''",
- "noarticletext": "Ena pele de hewna theba çıni yo.\nTı şenê zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|qandê sernameyê ena pele cı geyre]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre],\nya zi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena pele vıraze]</span>.",
+ "noarticletext": "Ena pele de hewna theba çıniyo.\nTı şenê zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|qandê sernameyê ena pele cı geyre]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre],\nya zi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena pele vıraze]</span>.{{MediaWiki mesaca pera newi}}",
"noarticletext-nopermission": "Ena pele de hewna theba çıniyo.\nTı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê na pele cı geyre]], ya zi <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre]</span>, ema destur çıniyo ke na pele vırazê.",
"missing-revision": "Rewizyonê name dê pela da #$1 \"{{FULLPAGENAME}}\" dı çıniyo.\n\nNo normal de tarix dê pelanê besterneyan dı ena xırabin asena.\nDetayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.",
"userpage-userdoesnotexist": "Hesabê karberi \"<nowiki>$1</nowiki>\" qeyd nêbiyo.\nKerem ke, tı ke wazenay na pele bafernê/bıvurnê, qontrol ke.",
"undo-norev": "Vurnayiş tepêya nêgeryeno çunke ya vere cû hewna biyo ya zi ca ra çino.",
"undo-summary": "Vırnayışê $1'i [[Special:Contributions/$2|$2i]] ([[User talk:$2|Werênayış]]) peyser gırot",
"undo-summary-username-hidden": "Rewizyona veri $1'i hewada",
- "cantcreateaccounttitle": "Nêşenay hesab rakerê",
"cantcreateaccount-text": "Hesabvıraştışê na IP adrese ('''$1''') terefê [[User:$3|$3]] kılit biyo.\n\nSebebo ke terefê $3 ra diyao ''$2''",
"viewpagelogs": "Seba na pele rê qeydan bımocne",
"nohistory": "Verê vurnayışanê na pele çıniyo.",
"mergehistory-empty": "Revizyonî yew nibenê.",
"mergehistory-done": "$1 ra $3 {{PLURAL:$3|revizyon|revizyoni}} [[:$2]] de {{PLURAL:$3|biyo|biyê}} têmiyan.",
"mergehistory-fail": "Tarixê pele yew nibeno, ma rica kenê ke pel u wext control bike.",
+ "mergehistory-fail-bad-timestamp": "Mora zemani ravêrdi niya",
+ "mergehistory-fail-invalid-source": "Çime per ravêrdi niya",
+ "mergehistory-fail-invalid-dest": "Hedef per ravêrdi niya",
+ "mergehistory-fail-permission": "Verori yewkerdışi rê mısade çıni yo.",
+ "mergehistory-fail-self-merge": "Çıne u hedef pera zey pê yê",
"mergehistory-no-source": "Pela çımeyê $1 çıniya.",
"mergehistory-no-destination": "Pela destinasyoni $1 çini yo.",
"mergehistory-invalid-source": "Pela çime gani yew seroğê raşt biy.",
"mergelog": "Qeydé zew kerdışi",
"revertmerge": "Abırnê",
"mergelogpagetext": "Cêr de yew liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.",
- "history-title": "Revizyona pela \"$1\"",
+ "history-title": "Tarixê çımraviyarnayışê \"$1\"",
"difference-title": "Pela \"$1\" ferqê çım ra viyarnayışan",
"difference-title-multipage": "Ferkê pelan dê \"$1\" u \"$2\"",
"difference-multipage": "(Ferqê pelan)",
- "lineno": "Xeta $1i:",
+ "lineno": "Xeta $1:",
"compareselectedversions": "Rewizyonanê weçineyan pêver ke",
"showhideselectedversions": "Revizyonanê weçinıtan bımocne/bınımne",
"editundo": "peyser bıgê",
"searchprofile-images": "Multimedya",
"searchprofile-everything": "Heme çi",
"searchprofile-advanced": "Raverşiyaye",
- "searchprofile-articles-tooltip": "$1 de cı geyré",
- "searchprofile-images-tooltip": "Dosya cı geyr",
+ "searchprofile-articles-tooltip": "$1 de cı geyre",
+ "searchprofile-images-tooltip": "Dosya cı geyre",
"searchprofile-everything-tooltip": "Tedeesteyan hemine cı geyre (pelanê mınaqeşeyi zi tey)",
- "searchprofile-advanced-tooltip": "qe cayê nimeyî bigêre",
+ "searchprofile-advanced-tooltip": "Cayê nameyanê xısusiyan de cı geyre",
"search-result-size": "$1 ({{PLURAL:$2|1 çeku|$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-redirect": "($1 ra ardış)",
"showingresults": "#<strong>$2</strong> netican ra {{PLURAL:$1|<strong>1</strong> netice cêr dero|<strong>$1</strong> neticey cêr derê}}.",
"showingresultsinrange": "{{PLURAL:$1|<strong>1</strong> netice|<strong>$1</strong> neticey}} be mabeynê #<strong>$2</strong> ra be #<strong>$3</strong> cêr asenê.",
"search-showingresults": "{{PLURAL:$4|Netice <strong>$1</strong> be <strong>$3</strong>|Neticeyi <strong>$1 - $2</strong> be <strong>$3</strong>}}",
- "search-nonefound": "Zey perskerdışê şıma netice nêvêniya.",
+ "search-nonefound": "Zey perskerdışê şıma peyniye çıniya.",
"search-nonefound-thiswiki": "Ena sita dı zey waşten da şıma theba nêvineya",
"powersearch-legend": "Cıgeyrayışo hera",
"powersearch-ns": "Cayanê nameyan de cıgeyrayış:",
"right-passwordreset": "E-postayanê parola reset kerdışa vineno",
"right-managechangetags": "[[Special:Tags|Etiketi]] vıraz u aktiv (me)ke",
"right-applychangetags": "[[Special:Tags|Etiketa]] vurnayışana piya dezge fi.",
+ "grant-group-page-interaction": "Peran na tesiri",
+ "grant-group-file-interaction": "Medya na tesiri",
+ "grant-group-watchlist-interaction": "Lista da xoya tesir",
+ "grant-group-email": "e-poste bırışe",
+ "grant-group-high-volume": "Performansa aktiviteya vengê berzi",
+ "grant-group-customization": "Şexsi kerdış u tercihi",
+ "grant-group-administration": "Performans hereketa idarey",
+ "grant-group-other": "Enwayi babet aktivitey",
+ "grant-blockusers": "Karberi men ke u meni wedarne",
+ "grant-createaccount": "Hesab vıraze",
+ "grant-createeditmovepage": "Perer vırazê, bıvurnê u berê",
+ "grant-delete": "Besternayış, revizyon u qeydé peran",
+ "grant-editinterface": "Canameyê MediaWiki u CSS/javScripta karberi bıvurnê",
+ "grant-editmycssjs": "CSS/JavaScripta karberiya xo bıvurnê",
"grant-editmyoptions": "Tercihanê xo bıvurne",
"grant-editmywatchlist": "Listeyseyran de xo bıvırne",
"grant-editpage": "Peran bıvurnê",
"grant-editprotected": "Srar bıyaye peran bıvurnê",
+ "grant-highvolume": "Vengê berzi dayış",
+ "grant-oversight": "Karberan u ploğyayê revizyona bınımn",
+ "grant-patrol": "Perer de vurnayışa çımra ravyarn",
+ "grant-protect": "Şeveknayış u wedarıtışê şeveknayışê pelan",
+ "grant-sendemail": "Karberanê binan rê e-posta bırışê",
+ "grant-uploadeditmovefile": "Dosyaya bar ke, bıvurnê yana berê",
+ "grant-uploadfile": "Dosyaya newi bar ke",
+ "grant-basic": "Heqê basiti",
+ "grant-viewdeleted": "Besteryaya peran u dosyaya bıasne",
+ "grant-viewmywatchlist": "Lista serykerdışê xo bıvêne",
"newuserlogpage": "Cıkewtışê hesabvıraştışi",
"newuserlogpagetext": "Ena log de viraştişê karberî esta.",
"rightslog": "Qeydê heqanê karberi",
"rightslogtext": "Ena listeyê loganê ke heqqa karbaranî mucneno.",
"action-read": "ena pela wanayış",
"action-edit": "ena pela bıvurnê",
- "action-createpage": "pelan vıraze",
+ "action-createpage": "Ena perer bıvıraze",
"action-createtalk": "pelanê werênayışi bıvıraze",
"action-createaccount": "hesabê nê karberi bıvıraze",
+ "action-autocreateaccount": "nê hesabê karberiyê teberi otomatik vıraze",
+ "action-history": "tarixê na pele bıvêne",
"action-minoredit": "nê vurnayışi be qıckek işaret ke",
"action-move": "ena pele bere",
"action-move-subpages": "ena pele, u pelanê daê bınênan bere",
"action-move-rootuserpages": "pelanê karberiyê bıngeyan bere",
+ "action-move-categorypages": "Pera kategoriyer ber",
"action-movefile": "ena dosya bere",
"action-upload": "ena dosya bar ke",
"action-reupload": "dosyayê ke database de esto ser ey binuse",
"action-viewmywatchlist": "Listeyseyran de xo bıvin",
"action-viewmyprivateinfo": "Xısusi tercihane xo bıvin",
"action-editmyprivateinfo": "Xısusi malumate xo bıvurne",
+ "action-editcontentmodel": "Zerrekê modela yu perer timar ke",
+ "action-managechangetags": "Vıraz u etiketa aktiv (me) ke",
+ "action-applychangetags": "Vurnayışana piya etiket kerdışi zi dezge fi",
+ "action-purge": "Ane perer newe ke",
"nchanges": "$1 {{PLURAL:$1|fın vurna|fıni vurna}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ra yok wazino}}",
"enhancedrc-history": "tarix",
"recentchanges": "Vurriyayışê peyêni",
"recentchanges-legend": "Tercihê vurnayışanê peyênan",
- "recentchanges-summary": "Ena pele de wiki sero vurnayışanê peyênan teqib ke.",
+ "recentchanges-summary": "\"Wiki sero vurnayışanê peyênan ena perer ra teqib ke.\"\n{{vp-diq}}",
"recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
"recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
"recentchanges-label-newpage": "Enê vurnayışi ra yew pela newiye vıraziye",
"recentchanges-label-bot": "Eno vurnayış terefê yew boti ra vıraziyo",
"recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
"recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayeyê cı",
- "recentchanges-legend-heading": "<strong>Kıtabek:</strong>",
+ "recentchanges-legend-heading": "<strong>Kıtabekê Vurriyayışê peyêni:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
"recentchanges-legend-plusminus": "''(±123)''",
"recentchanges-submit": "Bıasne",
- "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
+ "rcnotefrom": "Cêr de <strong>$2</strong> ra nata {{PLURAL:$5|vurnayışiyê}} asenê (tewr vêşi <strong>$1</strong> asenê) <strong>$3, $4</strong>",
"rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
- "rcshowhideminor": "vurnayışê werdiyi $1",
- "rcshowhideminor-show": "Bıasne",
+ "rcshowhideminor": "vurriyayışanê werdiyan $1",
+ "rcshowhideminor-show": "Bımocne",
"rcshowhideminor-hide": "Bınımne",
"rcshowhidebots": "botan $1",
- "rcshowhidebots-show": "Bıasene",
+ "rcshowhidebots-show": "Bımocne",
"rcshowhidebots-hide": "Bınımne",
"rcshowhideliu": "karberê qeydbiyayeyi $1",
"rcshowhideliu-show": "Bıasne",
"rcshowhideliu-hide": "Bınımne",
"rcshowhideanons": "karberê bênameyi $1",
- "rcshowhideanons-show": "Bıasene",
+ "rcshowhideanons-show": "Bımocne",
"rcshowhideanons-hide": "Bınımne",
"rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
"rcshowhidepatr-show": "Bıasne",
"rcshowhidepatr-hide": "Bınımne",
"rcshowhidemine": "vurnayışanê mı $1",
- "rcshowhidemine-show": "Bıasne",
+ "rcshowhidemine-show": "Bımocne",
"rcshowhidemine-hide": "Bınımne",
"rcshowhidecategorization": "kategorizasyonê pele $1",
"rcshowhidecategorization-show": "Bıasne",
"rcshowhidecategorization-hide": "Bınımne",
- "rclinks": "Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3",
+ "rclinks": "$2 rocan de $1 vurriyayışanê peyêna bıasne <br />$3",
"diff": "ferq",
"hist": "verên",
"hide": "Bınımne",
- "show": "Bıasne",
+ "show": "Bımocne",
"minoreditletter": "q",
"newpageletter": "N",
"boteditletter": "b",
"recentchangeslinked-to": "Heruna pela ke yena dayene, vurnayışanê pelanê ke daye ra gırêdayiyê inan bımocne",
"recentchanges-page-added-to-category": "[[:$1]] kerd be kategoriye",
"recentchanges-page-removed-from-category": "[[:$1]] kategoriye ra vet",
+ "autochange-username": "MediaWiki vurnayışo otomatik",
"upload": "Dosya bar ke",
"uploadbtn": "Dosya bar ke",
"reuploaddesc": "Barkerdışi iptal ke u peyser şo formê barkerdışi",
"upload-http-error": "Yew ğeletê HTTPî biyo: $1",
"upload-copy-upload-invalid-domain": "Na domain ra kopyayê barkerdışanê nêbenê.",
"upload-dialog-title": "Dosya bar ke",
- "upload-dialog-button-cancel": "Bıtexelne",
+ "upload-dialog-button-cancel": "Bıterkın",
"upload-dialog-button-done": "Temam",
"upload-dialog-button-save": "Bışevekne",
"upload-dialog-button-upload": "Bar ke",
"backend-fail-read": "Na \"$1\" dosya nê wanêna",
"backend-fail-create": "Dosyay $1 nê vırazıyê",
"backend-fail-maxsize": "Dosyay $1 aya nênusneyêna feqet gırdeya cı {{PLURAL:$2|bayta|$2 bayto}}",
- "backend-fail-readonly": "Depo kerdışê \"$1\" enewke salt wanêno.Sebebê cı zi:\"''$2''\"",
+ "backend-fail-readonly": "Depo kerdışê \"$1\" enewke salt wanêno.Sebebê cı zi:<em>$2</em>",
"backend-fail-synced": "Dosyay \" $1 \" miyan de depo kerdışeyda cıdı pê nêtepıştey esta",
"backend-fail-connect": "Depo kerdışê \"$1\" peyni de nêgrêdeya.",
"backend-fail-internal": "Depo kerdışê \"$1\" peyni de ju xırabin vıcyê.",
"uploadstash-badtoken": "Karkerdışê cı nêbı, muhtemelen desture şımayê timarkerdışi zeman do şıma ravêrdo. Fına bıcerbnê.",
"uploadstash-errclear": "Besternayışê dosyayan nêbı",
"uploadstash-refresh": "Listanê dosyayan aneweke",
+ "uploadstash-thumbnail": "asayışê qıckeki bıvêne",
"invalid-chunk-offset": "Ofseto nêravyarde",
"img-auth-accessdenied": "Cıresnayış vındarnayo.",
"img-auth-nopathinfo": "PATH_INFO kemiyo.\nTeqdimkerê şıma seba ravurnayışê nê melumati eyar nêkerdo.\nBeno ke be CGI-bıngeyın bo u img_auth rê desteg nêbeno.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Selahiyetê resımi bıvêne.",
"license": "Lisans:",
"license-header": "Lisansdayış",
"nolicense": "Theba nêweçineya",
+ "licenses-edit": "Weçenega lisansi bıvurnê",
"license-nopreview": "(verqeydî çin o)",
- "upload_source_url": "(yew URLê raştî, şar rê akerde yo)",
- "upload_source_file": "(komputerê ti de yew dosya)",
+ "upload_source_url": "(to yew ravêrde dosya weçina, şar rê akerde URL yo)",
+ "upload_source_file": "(komputer ra dos yu dosya weçina)",
+ "listfiles-delete": "bestere",
"listfiles-summary": "Na pera bağsiya; heme resima bar biyayeyan mocnena.",
"listfiles_search_for": "Qe nameyê medyayî bigêre:",
+ "listfiles-userdoesnotexist": "Hesabê karberi \"$1\" qeyd nêbiyo.",
"imgfile": "dosya",
"listfiles": "Lista Dosya",
"listfiles_thumb": "Resmo qıckek",
"listfiles-latestversion-yes": "Eya",
"listfiles-latestversion-no": "Nê",
"file-anchor-link": "Dosya",
- "filehist": "Ravêrdê dosya",
+ "filehist": "Tarixê dosya",
"filehist-help": "Seba diyayışê viyarteyê dosya tarixê ke qısımê tarix/zemani derê inan bıtıkne.",
"filehist-deleteall": "pêro bestere",
"filehist-deleteone": "bestere",
"filerevert-legend": "Dosya raçarne",
"filerevert-intro": "Ti ho ena dosyayê '''[[Media:$1|$1]]'''î [$4 versiyonê $3, $2] rê reyna anî.",
"filerevert-comment": "Sebeb:",
- "filerevert-defaultcomment": "Versiyonê $2, $1 rê reyna ard",
+ "filerevert-defaultcomment": "Versiyonê $2, $1 rê reyna ard ($3)",
"filerevert-submit": "Reyna biyere",
"filerevert-success": "'''[[Media:$1|$1]]''' peyser çarna ra [versiyonanê $4, $3, $2].",
"filerevert-badversion": "Vesiyonê lokalê verniyê eno dosya pê ena pulêwext de çin o.",
"unwatchedpages": "Pelanê seyrnibiyeyî",
"listredirects": "Listeya Hetenayışan",
"listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
+ "listduplicatedfiles-entry": "[[$3|{{PLURAL:$2|kapyay|$2 kopyey}}]] dosya da [[:File:$1|$1]]'i est a",
"unusedtemplates": "Şablonê ke nêguriyenê",
"unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
"unusedtemplateswlh": "linkanê binî",
"randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
"randomincategory-nopages": "Kategori da [[:Category:$1|$1]] de qet per çıniya.",
"randomincategory-category": "Kategoriye:",
+ "randomincategory-legend": "Kategori ra raştamayi per",
"randomincategory-submit": "Şo",
"randomredirect": "Serçarnayışo rastameye",
"randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
"protectedpages-unknown-performer": "Karbero nêzanaye",
"protectedtitles": "Sernameyê pawıteyi",
"protectedtitlesempty": "pê ney parametreyan sernuşteyê pawite çinê",
+ "protectedtitles-submit": "Sernaman bımocne",
"listusers": "Listeyê Karberan",
"listusers-editsonly": "Teyna karberan bimucne ke ey nuştê",
"listusers-creationsort": "goreyê wextê vıraştışi rêz ker",
"newpages-submit": "Bıasene",
"newpages-username": "Nameyê karberi:",
"ancientpages": "Pelê kehenêri",
- "move": "Wegi",
- "movethispage": "Ena peler wegi",
+ "move": "Bıkırış",
+ "movethispage": "Ena pele bıkırışe",
"unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
"unusedcategoriestext": "Kategoriyê ke cêr derê, nê bıbê zi, terefê qet madeyan ya zi kategoriyan ra nêgureniyenê.",
"notargettitle": "Hedef çini yo",
"apihelp-no-such-module": "Modulê \"$1\" çıniyo.",
"apisandbox": "API qumdor",
"apisandbox-fullscreen": "Panela hera kerdışi",
+ "apisandbox-unfullscreen": "Pele bımocne",
"apisandbox-submit": "Bıwazê",
"apisandbox-reset": "Bestere",
"apisandbox-retry": "Fına",
"apisandbox-results": "Neticey",
"apisandbox-sending-request": "API waştış rışêno...",
"apisandbox-request-url-label": "URL waştış:",
- "apisandbox-request-time": "Demê waştışi: $1",
+ "apisandbox-request-time": "Demê waştışi: {{PLURAL:$1|$1 ms}}",
"booksources": "Çımeyê kıtaban",
"booksources-search-legend": "Seba çımeyanê kıtaban cı geyre",
"booksources-isbn": "ISBN:",
"checkbox-select": "Weçinaye: $1",
"checkbox-all": "Pêro",
"checkbox-none": "Temam",
- "checkbox-invert": "Doç kerdış",
+ "checkbox-invert": "Rageyre",
"allpages": "Peli pêro",
"nextpage": "Pela badê cû ($1)",
"prevpage": "Pela verêne ($1)",
"allpagesfrom": "Pera liste kerdışi bıasne:",
"allpagesto": "Pelanê ke be ena herfe qediyenê bımocne:",
- "allarticles": "Wesiqey pêro",
+ "allarticles": "Peli pêro",
"allinnamespace": "Peli pênro ( $1 cayênameyî)",
"allpagessubmit": "Şo",
"allpagesprefix": "herfê ke şıma tiya de nuşti, pê ney herfan pelê ke destpêkenê liste ker:",
"categoriesfrom": "Kategoriyê ke be ninan dest pêkenê, bımocne:",
"deletedcontributions": "İştırakê karberi esterdi",
"deletedcontributions-title": "İştırakê karberi esterdi",
- "sp-deletedcontributions-contribs": "iştıraqi",
+ "sp-deletedcontributions-contribs": "iştiraki",
"linksearch": "Gıreyê teberi cı geyrê",
"linksearch-pat": "bıgêr motif:",
"linksearch-ns": "Heruna nameyi:",
"mywatchlist": "Lista seyrkerdışi",
"watchlistfor2": "Qandê $1 ($2)",
"nowatchlist": "listeya temaşa kerdıişê şıma de yew madde zi çina.",
- "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdişi $1.",
+ "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdiş ronıştış akerê",
"watchnologin": "Şıma cıkewtış nêvıraşto",
"addwatch": "Lista seyrkerdışi ke",
- "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
+ "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|listeya seyri]] tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
+ "addedwatchtext-short": "Pera $1`i çebyê listeya seyran de şıma",
"removewatch": "Lista seyrkerdışi ra wedare",
"removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
+ "removedwatchtext-short": "Pera $1`i listeya seyran de şıma ra wedari yê",
"watch": "Seyr ke",
"watchthispage": "Ena pele seyr ke",
"unwatch": "Teqib meke",
"wlheader-enotif": "E-mail xeber dayiş abiyo.",
"wlheader-showupdated": "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
"wlnote": "$3 saete $4 ra dıme {{PLURAL:$2|yew saete de|'''$2''' saetan de}} {{PLURAL:$1|vurnayışo peyên|vurnayışê '''$1''' peyêni}} cêrderê.",
- "wlshowlast": "Peyni de vurnayışan ra $1 seata u $2 roca bımocnê",
+ "wlshowlast": "Peyni de $1 seata u $2 roca bıasne",
"watchlist-hide": "Bınımne",
"watchlist-submit": "Bıasene",
"wlshowtime": "Periyoda zemani asenayışi:",
- "wlshowhideminor": "vurnayışê werdiyi",
+ "wlshowhideminor": "vurriyayışê werdi",
"wlshowhidebots": "boti",
"wlshowhideliu": "karberê qeydıni",
"wlshowhideanons": "karberê anonimi",
"delete-edit-reasonlist": "Sebebê vurnayışan bıvurne",
"delete-toobig": "no pel, pê $1 {{PLURAL:$1|tene vuriyayiş|tene vuriyayiş}}i wayirê yew tarixo kehen o.\nqey hewna nêşiyayişi wina pelani u {{SITENAME}}nêxerebnayişê keyepeli yew hed niyaya ro.",
"delete-warning-toobig": "no pel wayirê tarixê vurnayiş ê derg o, $1 {{PLURAL:$1|revizyonê|revizyonê}} seri de.\nhewn a kerdışê ıney {{SITENAME}} şuxul bıne gırano;\nbı diqqet dewam kerê.",
+ "deleteprotected": "Şıma nêşenê ena perer esternê, çıkı per starya ya.",
"rollback": "vurnayişan tepiya bıger",
"rollbacklink": "peyser biya",
"rollbacklinkcount": "$1 {{PLURAL:$1|vurnayış|vurnayışi}} peyd gıroti",
"maximum-size": "Ebatê maximumî",
"pagesize": "(bitî)",
"restriction-edit": "Bıvurne",
- "restriction-move": "Berr",
- "restriction-create": "Vıraze",
+ "restriction-move": "Bıkırış",
+ "restriction-create": "Bıvıraz",
"restriction-upload": "Bar ke",
"restriction-level-sysop": "tam pawiyayo",
"restriction-level-autoconfirmed": "nêm pawiyayo",
"blanknamespace": "(Ser)",
"contributions": "İştiraqê {{GENDER:$1|karber}}i",
"contributions-title": "Dekerdenê karber de $1",
- "mycontris": "İştıraqi",
- "anoncontribs": "İştıraqi",
+ "mycontris": "İştıraki",
+ "anoncontribs": "İştıraki",
"contribsub2": "Qandê {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "Hesabê karberi \"$1\" qeyd nêbiyo.",
"nocontribs": "Ena kriteriya de vurnayîş çini yo.",
"sp-contributions-username": "Adresa IPy ya zi nameyê karberi:",
"sp-contributions-toponly": "Tenya rewizyonanê tewr peyniyan bimocne",
"sp-contributions-submit": "Cı geyre",
- "whatlinkshere": "Pele rê gıreyi",
+ "whatlinkshere": "Linkê tedeestey",
"whatlinkshere-title": "Per da \"$1\" rê perê ke gre danê",
"whatlinkshere-page": "Pele:",
"linkshere": "Ena peleyan grey biya '''[[:$1]]''':",
"whatlinkshere-links": "← gırey",
"whatlinkshere-hideredirs": "Hetenayışê $1",
"whatlinkshere-hidetrans": "Açarnayışê $1",
- "whatlinkshere-hidelinks": "Greyê $1",
+ "whatlinkshere-hidelinks": "Gıreyê $1",
"whatlinkshere-hideimages": "Gıreyê dosya $1",
- "whatlinkshere-filters": "Avrêci",
+ "whatlinkshere-filters": "Parzûn",
"whatlinkshere-submit": "Şo",
"autoblockid": "Otomatik vındarnayış #$1",
"block": "Karberi vındarne",
"ipb-unblock-addr": "$1 a bik",
"ipb-unblock": "Yew adresê IPî ya zi nameyê karberî blok bike",
"ipb-blocklist": "Blokî ke hama estê ey bivîne",
- "ipb-blocklist-contribs": "Qandê {{GENDER:$1|}} ra iştıraqi",
+ "ipb-blocklist-contribs": "İştirakê {{GENDER:$1|$1}}`i",
"ipb-blocklist-duration-left": "$1 vet",
"unblockip": "Hesabê karberî a bike",
"unblockiptext": "Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.",
"blocklink": "kılit ke",
"unblocklink": "bloki wedare",
"change-blocklink": "kılitkerdışi bıvurne",
- "contribslink": "iştıraqi",
+ "contribslink": "iştıraki",
"emaillink": "e-poste bırışe",
"autoblocker": "Şıma otomatikmen kılit biy, çıke adresa şımaya ''IP''y terefê \"[[User:$1|$1]]\" gureniyena.\nSebebê kılitbiyayışê $1'i \"$2\"o",
"blocklogpage": "Qeydê astengi",
"blocklogtext": "No kuliyatê kılitkerdış u rakerdışê fealiyetê karberano.\nAdresê IP'ya ke otomatikmen kılit biyê lista de çıniya.\nSeba lista karberanê ke heta nıka kılit biyê [[Special:BlockList|lista kılitkerdışê IPy]] bıvinê.",
"unblocklogentry": "$1 ake",
"block-log-flags-anononly": "tenya karberê anonimi",
- "block-log-flags-nocreate": "akerdışê hesabi racneyayo",
+ "block-log-flags-nocreate": "akerdışê hesabi kılit bi",
"block-log-flags-noautoblock": "Oto-wedariye terkneyayo",
- "block-log-flags-noemail": "e-posta biya bloqe",
- "block-log-flags-nousertalk": "Pela verênayişi ke xo nêşeno bıvurno",
+ "block-log-flags-noemail": "e-poste kılit bi",
+ "block-log-flags-nousertalk": "pela werênayışê xo nêşeno ke bıvurno",
"block-log-flags-angry-autoblock": "oto-wedariye amayen aktivo",
"block-log-flags-hiddenname": "nameyê karberi nımteyo",
"range_block_disabled": "Desturê administorî ke viraştişê blokê rangeyî kefiliyo.",
"lockfilenotwritable": "dosyaya qefılnayişê databaseyi ser ra çiyek nênusyena.",
"databasenotlocked": "Database a nibiya.",
"lockedbyandtime": "({{GENDER:$1|$1}} ra $2 tepya $3 biyo)",
- "move-page": "$1 Bere",
+ "move-page": "$1 Bıkırış",
"move-page-legend": "Pele bere",
"movepagetext": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|double]] ya zi [[Special:BrokenRedirects|broken redirects]] qontrol bıki.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''Teme!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
"movepagetext-noredirectfixer": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İkaz!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
"tooltip-ca-unprotect": "Starkerdışe ena peler bıvurne",
"tooltip-ca-delete": "Ena pele bestere",
"tooltip-ca-undelete": "peli biyarê halê ver hewnakerdışi",
- "tooltip-ca-move": "Ena peler wegi",
+ "tooltip-ca-move": "Ena pele bıkırışe",
"tooltip-ca-watch": "Ena pele lista xoya seyrkerdışi ke",
"tooltip-ca-unwatch": "Ena pele lista xoya seyrkerdışi ra vece",
"tooltip-search": "{{SITENAME}} de cı geyre",
"tooltip-n-portal": "Heqa proceyi de, çı şenay bıkerê, çı koti vêniyeno",
"tooltip-n-currentevents": "Vurnayışanê peyênan de melumatê pey bıvêne",
"tooltip-n-recentchanges": "Wiki de lista vurnayışanê peyênan",
- "tooltip-n-randompage": "Perake raşt amé",
+ "tooltip-n-randompage": "Pelê da raştameyiye bar ke",
"tooltip-n-help": "Cayê peştigırewtışi",
"tooltip-t-whatlinkshere": "Lista pelanê wikiya pêroina ke tiya gırê bena",
"tooltip-t-recentchangeslinked": "Vurnayışê peyênê pelanê ke ena pela ra gırê biyê",
"tooltip-ca-nstab-project": "Pela proceyi bıvêne",
"tooltip-ca-nstab-image": "Pera dosyayer bıvin",
"tooltip-ca-nstab-mediawiki": "Mesacê sistemi bıvêne",
- "tooltip-ca-nstab-template": "Şabloni bıvin",
+ "tooltip-ca-nstab-template": "Şabloni bıvêne",
"tooltip-ca-nstab-help": "Pela peşti bıvêne",
"tooltip-ca-nstab-category": "Pela kategoriye bıvêne",
"tooltip-minoredit": "Nay vırnayışa werdi nışan bıkeré",
"anonymous": "{{PLURAL:$1|karberê|karberê}} anonimi yê keyepelê {{SITENAME}}i",
"siteuser": "karberê {{SITENAME}}i $1",
"anonuser": "karberê anonim o {{SITENAME}}i $1",
- "lastmodifiedatby": "Ena pele tewr peyên roca $2, $1 by $3. de biya rocaniye",
+ "lastmodifiedatby": "Ena pele tewr peyên roca $2, $1 de tereftê $3 ra vuriya ya.",
"othercontribs": "xebatê $1 ıney geriyayo diqqeti/geriyayo nezer.",
"others": "bini",
"siteusers": "{{SITENAME}} {{PLURAL:$2|karberê ey|karberanê ey}} $1",
"svg-long-desc-animated": "SVG dosya, nominalin $1 × $2 piksela, ebatê dosya: $3",
"svg-long-error": "Nêmeqbul dosyaya SVG'i: $1",
"show-big-image": "Dosyaya oricinale",
- "show-big-image-preview": "Verqayd dergiya: $1'i.",
+ "show-big-image-preview": "Verqaytê dergiya: $1.",
"show-big-image-other": "Zewmi{{PLURAL:$2|Vılêşnayış|Vılêşnayışê}}: $1.",
"show-big-image-size": "$1 × $2 piksel",
"file-info-gif-looped": "viyariye biyo",
"exif-planarconfiguration": "Rezeyê datayi",
"exif-ycbcrsubsampling": "Subsampleyi ebatê Y heta C",
"exif-ycbcrpositioning": "pozisyonê Y u C",
- "exif-xresolution": "Rezulasyanê veriniye",
+ "exif-xresolution": "Qerarê verıniye",
"exif-yresolution": "Rezulasyanê derganiye",
"exif-stripoffsets": "Cayê melumatê resımi",
"exif-rowsperstrip": "Yew reze de teneyê dizeyi",
"exif-referenceblackwhite": "Çiftyê siya u sipe değerê referansi",
"exif-datetime": "Zeman u tarixê vurnayişê dosyayi",
"exif-imagedescription": "Serê resimi",
- "exif-make": "Viraştoğê kamera",
- "exif-model": "Modelê kamerayi",
+ "exif-make": "Vıraştoğê kamera",
+ "exif-model": "Modelê kamera",
"exif-software": "Software ke hebitiyeno",
"exif-artist": "Nuştoğ",
"exif-copyright": "Wahirê copyrighti",
"exif-urgency-low": "($1) Kemiyo",
"exif-urgency-high": "( $1 ) Vêşiyo",
"exif-urgency-other": "Sıftê şınasiya karberi ($1)",
- "namespacesall": "pêron",
+ "namespacesall": "pêro",
"monthsall": "pêro",
"confirmemail": "Adresê e-posta tesdiq ker",
"confirmemail_noemail": "Yew emaîlê tu raştîyê çin o ke [[Special:Preferences|tercihê karberî]] ayar bike.",
"deletedwhileediting": "'''Teme''': Ena pele verniyê ti de eseteriyaya!",
"confirmrecreate": "Karberê [[User:$1|$1]]î ([[User talk:$1|mesac]]), verniyê vurnayîşê ti ra ena pele wedarno, sebeb: ''$2''\nMa rica keno tesdiq bike ke ti raştî wazeno eno pel bivirazo.",
"confirmrecreate-noreason": "karbero [[User:$1|$1]] ([[User talk:$1|mesac]]) , dest pêkerdışiena pela sero vurnayışiya tepya ena pela besternê. Şıma qayıli ke ena pela fına vırazê se ena pela tesdiq kerê.",
- "recreate": "Reyna viraz",
+ "recreate": "Werzayne",
"unit-pixel": "px",
"confirm_purge_button": "Temam",
"confirm-purge-top": "Vervirê na pele bestere?",
"autosumm-replace": "Maqale pê '$1' vuriya",
"autoredircomment": "heteneya [[$1]]",
"autosumm-new": "Pela vıraziyê, '$1' bıvinê",
+ "autosumm-newblank": "Pera veng vıraziyê",
"size-bytes": "$1 {{PLURAL:$1|bayt|bayti}}",
"size-kilobytes": "$1 KB",
"size-megabytes": "$1 MB",
"watchlistedit-raw-done": "Listeyê tuyê seyrkerdişi rocaniye biyo",
"watchlistedit-raw-added": "{{PLURAL:$1|1 sername kerd|$1 sernamey kerdi}} cı:",
"watchlistedit-raw-removed": "{{PLURAL:$1|1 sername dard|$1 sernamey dardi}} we:",
+ "watchlistedit-clear-title": "Lista serykerdışê pak kerê",
+ "watchlistedit-clear-legend": "Lista serykerdışê pak kerê",
+ "watchlistedit-clear-explain": "Listeya serykerdış da şıma dı sernamey pêro besteryay",
"watchlistedit-clear-titles": "Sernamey:",
"watchlisttools-view": "Vurnayışanê elaqedaran bıvêne",
"watchlisttools-edit": "Lista seyrkerdışi bıvêne û bıvurne",
"version-software": "Softwareyê ronayi",
"version-software-product": "Mal",
"version-software-version": "Versiyon",
- "version-entrypoints": "heruna dekewtış de GRE'i",
+ "version-entrypoints": "Heruna cıkewtışê URLi",
"version-entrypoints-header-entrypoint": "Heruna dekewtışi",
"version-entrypoints-header-url": "GRE",
"version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
"fileduplicatesearch-result-1": "Dosyayê ''$1î'' de hem-kopya çini yo.",
"fileduplicatesearch-result-n": "Dosyayê ''$1î'' de {{PLURAL:$2|1 hem-kopya|$2 hem-kopyayî'}} esto.",
"fileduplicatesearch-noresults": "Ebe namey \"$1\" ra dosya nêdiyayê.",
- "specialpages": "Peleyê xısusiy",
+ "specialpages": "Pelê xısusiy",
"specialpages-note-top": "Kıtabek",
"specialpages-note": "* Pelê xasê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xasê nımıtey.</span>",
"specialpages-group-maintenance": "Raporê pawıtışi",
"specialpages-group-other": "Pelê xasiyê bini",
- "specialpages-group-login": "Cı kewe / hesab vıraze",
+ "specialpages-group-login": "Dekew / hesab vıraz",
"specialpages-group-changes": "Vurnayışê peyêni û qeydi",
"specialpages-group-media": "Raporê medya û barkerdışi",
"specialpages-group-users": "Karberi û heqi",
"feedback-bugcheck": "Harika! Sadece [xırabina ke $1 ] çınyayışê cı kontrol keno.",
"feedback-bugnew": "Mı qontrol ke. Xetaya newi xeber ke",
"feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1 jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3 $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
- "feedback-cancel": "Peyd ke",
+ "feedback-cancel": "Bıterkın",
"feedback-close": "Biya star",
"feedback-error1": "Xeta: API ra neticey ne vıcyay",
"feedback-error2": "Xeta: Timar kerdış nebı",
"tagline": "Z {{GRAMMAR:genitiw|{{SITENAME}}}}",
"help": "Pomoc",
"search": "Pytaś",
+ "search-ignored-headings": " #<!-- njezměń toś tu smužku --> <pre>\n# Nadpisma, kótarež pytanje ignorěrujo.\n# Toś te změny budu se wustatkowaś, za tym až bok jo se indicěrował.\n# Móžoš indicěrowanje bokow wunuźiś, z tym až pśewjedujoš proznu změnu.\n# Syntaksa:\n# * Wšykno, což slědujo znamušku \"#\" až do kóńca smužki, jo komentar\n# * Kuzda njeprozna smužka jo eksaktny titel, kótaryž ma se ignorěrowaś\nŽrědła\nEksterne wótkaze\nGlědaj teke\n #</pre> <!-- njezměń toś tu smužku -->",
"searchbutton": "Pytaś",
"go": "Nastawk",
"searcharticle": "Nastawk",
"passwordreset-emailtext-user": "Wužywaŕ $1 jo anulěrowanje gronidła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} pominał ($4). {{PLURAL:$3|Slědujuce wužywarske konto jo|Slědujucej wužywarskej konśe stej|Slědujuce wužywarske konta su}} z toś tej e-mailoweju adresu {{PLURAL:$3|zwězane|zwězanej|zwězane}}:\n\n$2\n\n{{PLURAL:$3|Toś to nachylne gronidło spadnjo|Toś tej nachylnej gronidle spadnjotej|Toś te nachylne gronidła spadnu}} za {{PLURAL:$5|jaden źeń|$5 dnja|$5 dny|$5 dnjow}}.\nTy by měł se něnto pśizjawiś a nowe gronidło wustajiś. Jolic něchten drugi jo toś to napšašowanje pósłał, abo jolic sy se zasej na spócetne gronidło spomnjeł a wěcej njocoš jo změniś, móžoš toś to zdźělenje ignorěrowaś a swójo stare gronidło dalej wužywaś.",
"passwordreset-emailelement": "Wužywarske mě: \n$1\n\nNachylne gronidło: \n$2",
"passwordreset-emailsentemail": "E-mail za anulěrowanje gronidła jo se pósłała.",
- "passwordreset-emailsent-capture": "E-mail za anulěrowanje gronidła jo se pósłała, kótaraž pokazujo se dołojce.",
- "passwordreset-emailerror-capture": "E-mail za anulěrowanje gronidła jo se napórała, kótaraž se dołojce pokazujo, ale słanje {{GENDER:$2|wužywarjeju|wužywarce}} njejo se raźiło: $1",
"changeemail": "E-mailowu adresu změniś",
"changeemail-header": "Kontowu e-mailowu adresu změniś",
"changeemail-no-info": "Dejš pśizjawjony byś, aby direktny pśistup na toś ten bok měł.",
"undo-nochange": "Zda se, až změna jo se južo anulěrowała.",
"undo-summary": "Wersija $1 wót [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusija]]) jo se anulěrowała",
"undo-summary-username-hidden": "Změna $1 schowanego wužywarja jo se anulěrowała",
- "cantcreateaccounttitle": "Njejo móžno wužywarske konto wutwóriś",
"cantcreateaccount-text": "Wutwórjenje wužywarskego konta z toś teje IP adresy ('''$1''') jo blokěrowane pśez [[User:$3|$3]].\n\nPśicyna, kótaruž $3 jo zapódał, jo ''$2''.",
"cantcreateaccount-range-text": "Napóranje kontow z IP-adresow we wobcerku <strong>$1</strong>, kótaryž wopśimujo twóju IP-adresu (<strong>$4</strong>), jo se wót [[User:$3|$3]] zablokěrowało.\n\nPśicyna pódana wót $3 jo <em>$2</em>",
"viewpagelogs": "Protokole boka pokazaś",
"anoneditwarning": "<strong>चेतावनी:</strong> तमले प्रवेश अरेको नाइथिन । तमरो आइपि ठेगाना पाना सम्पादन इतिहासमि दर्ता गरिन्या छ र यो सब्बैले हेद्द सक्कान । यदि तमलाईँ <strong>[$1 लगईन]</strong> वा <strong>[$2 नयाँ खाता बनाउन्या] गर्याभण्या तमबठे गरियाको सम्पादन तमरो प्रयोगकर्तानाममि जोडिन्याछ ।",
"missingsummary": "'''यादगर्या :''' तमीले सम्पादन सारांश दियाका छैनौ ।\nयदि तमीले \"{{int:savearticle}}\" थिच्यौ भण्या , सारांश बिना नै सङ्ग्रहित गरिन्या छ ।",
"selfredirect": "<strong>चेतावनी:</strong> तम यै पानालाई आफुमी पुनः निर्देशित गद्द लाग्याछौ ।\nहुनसक्छ तम अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गद्द लाग्याछौ, वा गलत पानाको सम्पादन गद्द लाग्याछौ ।\nतम पुनः एकपल्ट \"{{int:savearticle}}\" क्लिक गद्दाछौ, पुनः निर्देशित तसै लै बनाइन्याछ।",
- "missingcommentheader": "'''याद गर :''' तमीले टिप्पणीमी विषय /शीर्ष पंक्ति दियाका छैनौ ।\nतमीले फेरि \"{{int:savearticle}}\" थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
+ "missingcommenttext": "कृपया तलतिर टिप्पणी राख ।",
+ "missingcommentheader": "'''याद गर :''' तमले टिप्पणीमी विषय /शीर्ष पंक्ति दियाका छैनौ ।\nतमले फेरि \"{{int:savearticle}}\" थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
"summary-preview": "सारांश पूर्वालोकन:",
"subject-preview": "विषय पूर्वरुप:",
"previewerrortext": "तमरो परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आयाको छ ।",
"parser-unstrip-loop-warning": "अनस्ट्रिप लुप धेखिन्छ",
"parser-unstrip-recursion-limit": "अन्स्ट्रिप पुनरावर्तन सिमा पार गरियो ($1)",
"converter-manual-rule-error": "म्यानुअल भाषा अनुवाद सिध्दान्तमी समस्या धेखियो",
- "cantcreateaccounttitle": "खाता बनाउन सकिएन",
"viewpagelogs": "यै पानाका लगहरू हेर",
"nohistory": "ये पृष्ठका लागी कोइ सम्पादन इतिहास छैन।",
"currentrev": "अहिलको पुनरावलोकन",
"prefs-reset-intro": "तम ये पृष्ठलाई आफनो अभिरुचीहरू साइट पूर्वावस्थामी फर्काउनत फर्काउन प्रयोग गद्दु सकन्छौ । तै पाछा ये लाई रद्द गद्दु सकन्छौ ।",
"prefs-emailconfirm-label": "इ-मेल एकिन प्रक्रिया:",
"youremail": "ईमेल",
- "username": "{{लिंग:$1|प्रयोगकर्ता नाम}}:",
- "prefs-memberingroups": "निम्न {{बहुबचन:$1|समूह | समूहहरू}}को {{लिंग:$2|सदस्य}} :",
+ "username": "{{GENDER:$1|प्रयोगकर्ता नाम}}:",
+ "prefs-memberingroups": "निम्न {{PLURAL:$1|समूह|समूहहरू}}को {{GENDER:$2|सदस्य}} :",
"prefs-registration": "दर्ता समय:",
"yourrealname": "वास्तविक नाम:",
"yourlanguage": "भाषा",
"userrights": "प्रयोगकर्ता अधिकार व्यवस्थापन",
"userrights-lookup-user": "प्रयोगकर्ता समूह व्यवस्थापन गर",
"userrights-user-editname": "प्रयोगकर्ता नाम दिय:",
- "editusergroup": "सम्पादन{{लिंग:$1}}समूहहरु",
+ "editusergroup": "{{GENDER:$1|प्रयोगकर्ता}}समूहहरू सम्पादन",
"userrights-editusergroup": "प्रयोगकर्ता समूह सम्पादन गर",
- "saveusergroups": "सुरक्षित{{लिंग:$1}}समूहहरु",
+ "saveusergroups": "सुरक्षित {{GENDER:$1|प्रयोगकर्ता}} समूहहरू",
"userrights-groupsmember": "को सदस्य:",
"userrights-groupsmember-auto": "अंतर्निहित सदस्य:",
"userrights-reason": "कारण:",
"group-bureaucrat": "प्रशासकहरू",
"group-suppress": "लुकौन्या वाला",
"group-all": "(सबै)",
- "group-user-member": "{{लिङग:$1|प्रयोगकर्ता}}",
- "group-autoconfirmed-member": "{{लिङग:$1|स्वनिर्धारित प्रयोगकर्ता}}",
- "group-bot-member": "{{लिङग:$1|बोट}}",
- "group-sysop-member": "{{लिङग:$1|प्रबन्धक}}",
- "group-bureaucrat-member": "{{लिङग:$1|प्रशासक}}",
- "group-suppress-member": "{{लिङग:$1|दबाउन्या}}",
+ "group-user-member": "{{GENDER:$1|प्रयोगकर्ता}}",
+ "group-autoconfirmed-member": "{{GENDER:$1|स्वनिर्धारित प्रयोगकर्ता}}",
+ "group-bot-member": "{{GENDER:$1|बोट}}",
+ "group-sysop-member": "{{GENDER:$1|प्रबन्धक}}",
+ "group-bureaucrat-member": "{{GENDER:$1|प्रशासक}}",
+ "group-suppress-member": "{{GENDER:$1|दबाउन्या}}",
"grouppage-user": "{{एनयस:आयोजना}}:प्रयोगकर्ताहरू",
"grouppage-autoconfirmed": "{{एनयस:आयोजना}}:स्वनिर्धारित प्रयोगकर्ताहरू",
"grouppage-bot": "{{एनयस:आयोजना}}:बोटहरु",
"right-deletedtext": "मेट्याका संशोधन बीचका मेट्याका पाठ र परिवर्तनहरू हेद्या",
"right-suppressionlog": "व्यक्तिगत लगहरू हेद्या",
"right-block": "अरु प्रयोगकर्तानलाई सम्पादन गद्दाकी ब्लक गर",
+ "right-unblockself": "आफुलाई खुल्ला गर ।",
"right-editprotected": "\"{{int:protect-level-sysop}}\" को हैसियतले सुरक्षित पानाहरू सम्पादन गद्या",
"right-editusercssjs": "अन्य प्रयोगकर्ताको सी.एस.एस. रे जाभास्क्रिप्ट फाइलहरू सम्पादन गद्या",
"right-editusercss": "अन्य प्रयोगकर्ताको सी. एस. एस. फाइलहरू सम्पादन गद्या",
"tooltip-t-whatlinkshere": "यो सित जोडियाका सब्बै विकि पानानको सूची",
"tooltip-t-recentchangeslinked": "यै पानामी जोडियाका पानामी अहिलको परिवर्तन",
"tooltip-feed-atom": "यै पानाकी लेखा एक एटम फिड",
- "tooltip-t-contributions": "यिन प्रयोगकर्ताका योगदानहरूको सूची हेरपुई",
+ "tooltip-t-contributions": "{{GENDER:$1|यिन प्रयोगकर्ता}}का योगदानहरूको सूची हेरपुई",
"tooltip-t-upload": "चित्र अप्लोड अर",
"tooltip-t-specialpages": "सब्बै खास खास पानानको शुचि ।",
"tooltip-t-print": "यो पानाको छापिन्या संस्करण",
"revdelete-submit": "Εφαρμογή {{PLURAL:$1|στην επιλεγμένη αναθεώρηση|στις επιλεγμένες αναθεωρήσεις}}",
"revdelete-success": "'''Η ορατότητα έκδοσης ενημερώθηκε επιτυχώς.'''",
"revdelete-failure": "'''Η ορατότητα της επεξεργασίας δεν ήταν δυνατόν να ενημερωθεί:''' $1",
- "logdelete-success": "'''Η ορατότητα γεγονότος τέθηκε επιτυχώς.'''",
+ "logdelete-success": "Η ορατότητα γεγονότος τέθηκε επιτυχώς.",
"logdelete-failure": "'''Η ορατότητα του καταλόγου δεν μπορούσε να ρυθμιστεί:'''\n$1",
"revdel-restore": "αλλαγή ορατότητας",
"pagehist": "Ιστορικό σελίδας",
"protect_expiry_invalid": "Expiry time is invalid.",
"protect_expiry_old": "Expiry time is in the past.",
"protect-existing-expiry": "Existing expiry time: $3, $2",
- "protect-existing-expiry-infinity": "Existing expiry time: infinite"
+ "protect-existing-expiry-infinity": "Existing expiry time: infinite",
+ "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# Syntax is as follows:\n# * Everything from a \"#\" character to the end of the line is a comment.\n# * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->"
}
"noindex-category": "Noindexed pages",
"broken-file-category": "Pages with broken file links",
"categoryviewer-pagedlinks": "($1) ($2)",
+ "category-header-numerals": "$1–$2",
"about": "About",
"article": "Content page",
"newwindow": "(opens in new window)",
"tagline": "From {{SITENAME}}",
"help": "Help",
"search": "Search",
+ "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n# * Everything from a \"#\" character to the end of the line is a comment.\n# * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
"searchbutton": "Search",
"go": "Go",
"searcharticle": "Go",
"passwordreset-emailelement": "Username:\n$1\n\nTemporary password:\n$2",
"passwordreset-emailsentemail": "If this email address is associated with your account, then a password reset email will be sent.",
"passwordreset-emailsentusername": "If there is an email address associated with this username, then a password reset email will be sent.",
- "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
- "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
"passwordreset-emailsent-capture2": "The password reset {{PLURAL:$1|email has|emails have}} been sent. The {{PLURAL:$1|username and password|list of usernames and passwords}} is shown below.",
"passwordreset-emailerror-capture2": "Emailing the {{GENDER:$2|user}} failed: $1 The {{PLURAL:$3|username and password|list of usernames and passwords}} is shown below.",
"passwordreset-nocaller": "A caller must be provided",
"changeemail": "Change or remove email address",
"changeemail-summary": "",
"changeemail-header": "Complete this form to change your email address. If you would like to remove the association of any email address from your account, leave the new email address blank when submitting the form.",
- "changeemail-passwordrequired": "You will need to enter your password to confirm this change.",
"changeemail-no-info": "You must be logged in to access this page directly.",
"changeemail-oldemail": "Current email address:",
"changeemail-newemail": "New email address:",
"undo-nochange": "The edit appears to have already been undone.",
"undo-summary": "Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
"undo-summary-username-hidden": "Undo revision $1 by a hidden user",
- "cantcreateaccounttitle": "Cannot create account",
"cantcreateaccount-text": "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
"cantcreateaccount-range-text": "Account creation from IP addresses in the range <strong>$1</strong>, which includes your IP address (<strong>$4</strong>), has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
"createaccount-hook-aborted": "$1",
"action-applychangetags": "apply tags along with your changes",
"action-changetags": "add and remove arbitrary tags on individual revisions and log entries",
"action-deletechangetags": "delete tags from the database",
+ "action-purge": "purge this page",
"nchanges": "$1 {{PLURAL:$1|change|changes}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
"enhancedrc-history": "history",
"watchnologin": "Not logged in",
"addwatch": "Add to watchlist",
"addedwatchtext": "\"[[:$1]]\" and its discussion page have been added to your [[Special:Watchlist|watchlist]].",
+ "addedwatchtext-talk": "\"[[:$1]]\" and its associated page have been added to your [[Special:Watchlist|watchlist]].",
"addedwatchtext-short": "The page \"$1\" has been added to your watchlist.",
"removewatch": "Remove from watchlist",
"removedwatchtext": "\"[[:$1]]\" and its discussion page have been removed from your [[Special:Watchlist|watchlist]].",
+ "removedwatchtext-talk": "\"[[:$1]]\" and its associated page have been removed from your [[Special:Watchlist|watchlist]].",
"removedwatchtext-short": "The page \"$1\" has been removed from your watchlist.",
"watch": "Watch",
"watchthispage": "Watch this page",
"Xð",
"Robin van der Vliet",
"Zciric",
- "Psychoslave"
+ "Psychoslave",
+ "Orikrin1998"
]
},
- "tog-underline": "Substreki ligilojn",
- "tog-hideminor": "Kaŝi malgrandajn redaktetojn ĉe <i>Lastaj ŝanĝoj</i>",
+ "tog-underline": "Substrekado de ligiloj:",
+ "tog-hideminor": "Kaŝi etajn redaktojn de la lastaj ŝanĝoj",
"tog-hidepatrolled": "Kaŝi patrolitajn redaktojn en lastaj ŝanĝoj",
"tog-newpageshidepatrolled": "Kaŝi patrolitajn paĝojn de listo de novaj paĝoj",
- "tog-hidecategorization": "Kaŝu enkategoriigon de paĝoj",
+ "tog-hidecategorization": "Kaŝi enkategoriigon de paĝoj",
"tog-extendwatchlist": "Etendi la atentaron por montri ĉiujn ŝanĝojn, ne nur la plej lastajn",
"tog-usenewrc": "Grupigi ŝanĝojn laŭ paĝo en \"Lastaj ŝanĝoj\" kaj \"Atentaro\" (bezonas Ĝavaskripton)",
- "tog-numberheadings": "Aŭtomate numerigi sekciojn",
+ "tog-numberheadings": "Aŭtomate numeri sekciojn",
"tog-showtoolbar": "Montri redakto-breton (per Ĝavaskripto)",
"tog-editondblclick": "Redakti paĝojn per duobla alklako",
"tog-editsectiononrightclick": "Ŝalti sekcian redaktadon per dekstra musklako de sekciaj titoloj (per Ĝavaskripto)",
"tog-watchdefault": "Aldoni al mia atentaro paĝojn kaj dosierojn redaktitajn de mi",
"tog-watchmoves": "Aldoni paĝojn kaj dosierojn, kiujn mi movas, al mia atentaro",
"tog-watchdeletion": "Aldoni paĝojn kaj dosierojn, kiujn mi forigas, al mia atentaro",
- "tog-watchuploads": "Aldonu novajn dosierojn ke mi alŝutas al mia atentaro",
+ "tog-watchuploads": "Aldoni novajn dosierojn, kiujn mi alŝutos, al mia atentaro",
"tog-watchrollback": "Aldoni paĝojn, kie mi amasmalfaris, al mia atentaro.",
"tog-minordefault": "Marki defaŭlte ĉiujn redaktojn kiel etajn",
"tog-previewontop": "Montri antaŭrigardon antaŭ redaktilo",
"tog-watchlisthidebots": "Kaŝi robotajn redaktojn de la atentaro",
"tog-watchlisthideminor": "Kaŝi malgrandajn redaktojn de la atentaro",
"tog-watchlisthideliu": "Kaŝi redaktojn de ensalutitaj uzantoj de la atentaro",
- "tog-watchlistreloadautomatically": "Reŝarĝi la atentaron aŭtomate ĉiam filtro estas ŝanĝita (Necesi Ĝavoskripton)",
+ "tog-watchlistreloadautomatically": "Reŝargi la atentaron aŭtomate ĉiam, kiam filtrilo estas ŝanĝita (bezonas Ĝavoskripton)",
"tog-watchlisthideanons": "Kaŝi redaktojn de anonimuloj de la atentaro",
"tog-watchlisthidepatrolled": "Kaŝi patrolitajn redaktojn de la atentaro",
- "tog-watchlisthidecategorization": "Kaŝu enkategoriigon de paĝoj",
+ "tog-watchlisthidecategorization": "Kaŝi enkategoriigon de paĝoj",
"tog-ccmeonemails": "Sendi al mi kopiojn de retpoŝtaĵoj, kiujn mi sendis al aliaj uzantoj.",
"tog-diffonly": "Ne montri paĝan enhavon sub la ŝanĝmontrilo",
"tog-showhiddencats": "Montri kaŝitajn kategoriojn",
"sun": "dim",
"mon": "lun",
"tue": "mar",
- "wed": "Mer",
- "thu": "Ä´aŭ",
- "fri": "Ven",
+ "wed": "mer",
+ "thu": "ĵaŭ",
+ "fri": "ven",
"sat": "sab",
"january": "januaro",
"february": "februaro",
"period-am": "ATM",
"period-pm": "PTM",
"pagecategories": "{{PLURAL:$1|Kategorio|Kategorioj}}",
- "category_header": "Artikoloj en kategorio \"$1\"",
+ "category_header": "Artikoloj en kategorio “$1”",
"subcategories": "Subkategorioj",
- "category-media-header": "Dosieroj en kategorio \"$1\"",
+ "category-media-header": "Dosieroj en kategorio “$1”",
"category-empty": "<em>Tiu ĉi kategorio nuntempe enhavas neniun artikolon aŭ plurmedian dosieron.</em>",
"hidden-categories": "{{PLURAL:$1|Kaŝita kategorio|Kaŝitaj kategorioj}}",
"hidden-category-category": "Kaŝitaj kategorioj",
"listingcontinuesabbrev": "daŭrigo",
"index-category": "Indeksitaj paĝoj",
"noindex-category": "Neindeksitaj paĝoj",
- "broken-file-category": "Paĝoj kun eraraj dosierligiloj",
+ "broken-file-category": "Paĝoj kun rompita ligilo al dosiero",
"about": "Pri",
"article": "Artikolo",
"newwindow": "(en nova fenestro)",
"badaccess-groups": "La ago, kiun vi petis, estas limigita al uzantoj en {{PLURAL:$2|la grupo|unu el la grupoj}}: $1.",
"versionrequired": "Versio $1 de MediaWiki nepras",
"versionrequiredtext": "La versio $1 de MediaWiki estas necesa por uzi ĉi tiun paĝon. Vidu [[Special:Version|paĝon pri versio]].",
- "ok": "Ek!",
+ "ok": "Bone",
"retrievedfrom": "Elŝutita el \"$1\"",
"youhavenewmessages": "{{PLURAL:$3|Vi havas}} $1 ($2).",
"youhavenewmessagesfromusers": "Riceviĝis $1 de {{PLURAL:$3|alia uzanto|$3 uzantoj}} ($2).",
"createacct-reason": "Kialo",
"createacct-reason-ph": "Kial vi kreas plian konton",
"createacct-reason-help": "Mesaĝo vidigita en la protokolo pri kreado de konto",
- "createacct-submit": "Krei konton",
+ "createacct-submit": "Kreu vian konton",
"createacct-another-submit": "Krei konton",
"createacct-continue-submit": "Daŭri kreadon de konto",
"createacct-another-continue-submit": "Daŭri kreadon de konto",
"passwordreset-emailelement": "Salutnomo: \n$1\n\nProvizora pasvorto: \n$2",
"passwordreset-emailsentemail": "Se tiu ĉu retpoŝta adreso estas kunligita kun via konto, tiam al ĉi tiu adreso estos sendita retpoŝto por renovigi pasvorton.",
"passwordreset-emailsentusername": "Se estas retpoŝta adreso, kiu estas asociita kun tiu uzantnomo, tiam ni sendos retpoŝtan mesaĝon pri reagordado de la pasvorto.",
- "passwordreset-emailsent-capture": "Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata malsupre.",
- "passwordreset-emailerror-capture": "Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al la {{GENDER:$2|uzanto}} malsukcesis: $1",
"passwordreset-emailsent-capture2": "La {{PLURAL:$1|retpoŝto|retpoŝtojn}} de pasvorta reensignado estis sendita. La {{PLURAL:$1|salutnomo kaj pasvorto|listo de salutnomoj kaj pasvortoj}} estas vidigita sube.",
"passwordreset-emailerror-capture2": "Retpoŝtado al la {{GENDER:$2|uzantiĉo|uzantino|uzanto}} malsukcesis: $1 La {{PLURAL:$3|salutnomo kaj pasvorta|listo de salutnomoj kaj pasvortoj}} estas vidigita sube.",
"passwordreset-nocaller": "Vokanto devas esti provizita",
"passwordreset-nodata": "Nek salutnomo nek retpoŝta adreso estis provizita",
"changeemail": "Ŝanĝi aŭ forigi retpoŝtadreson",
"changeemail-header": "Plenigu ĉi tiun formularon por ŝanĝi vian retpoŝtadreson. Se vi volas forigi la difinon de retpoŝtadreso por via uzantokonto, lasu la kampon por la nova retpoŝtadreso malplena ĉe la transigo.",
- "changeemail-passwordrequired": "Vi devas entajpi vian pasvorton, por konfirmi ĉi tiun ŝanĝon.",
"changeemail-no-info": "Vi devas ensaluti por atingi ĉi tiun paĝon rekte.",
"changeemail-oldemail": "Aktuala retpoŝtadreso:",
"changeemail-newemail": "Nova retpoŝtadreso:",
"minoredit": "Ĉi tiu ŝanĝo estas redakteto",
"watchthis": "Atenti ĉi tiun paĝon",
"savearticle": "Konservi paĝon",
+ "savechanges": "Konservi ŝanĝojn",
"publishpage": "Publikigi paĝon",
"preview": "Antaŭrigardo",
"showpreview": "Antaŭrigardo",
"content-model-css": "CSS",
"content-json-empty-object": "Malplena objeto",
"content-json-empty-array": "Malplena tabelo",
+ "deprecated-self-close-category": "Paĝoj, kiuj enhavas nevalidan memferman HTML‑etikedon",
"duplicate-args-warning": "'''Averto:''' [[:$1]] vokas al [[:$2]] kun pli ol unu valoro por la parametro \"$3\". Nur la lasta liverita valoro estos uzata.",
"duplicate-args-category": "Paĝoj kun pluroblaj argumentoj en ŝablonvokoj",
"duplicate-args-category-desc": "La paĝo enhavas uzon de ŝablono kun pluroble uzitaj argumentoj, kiel ekzemple <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> aŭ <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Ŝajne la redakto jam estis malfarita.",
"undo-summary": "Nuligis version $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuto]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
"undo-summary-username-hidden": "Malfari ŝanĝon $1 de kaŝita uzulo",
- "cantcreateaccounttitle": "Ne eblas krei konton",
"cantcreateaccount-text": "Konto-kreado de ĉi tiu IP-adreso ('''$1''') estis forbarita de [[User:$3|$3]].\n\nLa kialo donata de $3 estas ''$2''.",
"cantcreateaccount-range-text": "La kreado de kontoj de IP-adresoj en la intervalo <strong>$1</strong>, kiu inkludas vian IP-adreson (<strong>$4</strong>), estis blokita de [[User:$3|$3]].\n\nLa donita kialo de $3 estas <em>$2</em>",
"viewpagelogs": "Vidi la protokolojn por tiu ĉi paĝo",
"rev-suppressed-unhide-diff": "Unu el la revizioj de ĉi tiu diferenco estis '''kaŝita'''.\nEble estas detaloj en la [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} protokolo pri kaŝado].\nVi povas ankoraŭ [$1 vidi ĉi tiun diferencon] se vi deziras.",
"rev-deleted-diff-view": "Unu el la revizioj de ĉi tiu diferenco estis '''forigita'''.\nVi povas rigardi ĉi tiun diferencon, detaloj estas trovebla en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolo pri forigado].",
"rev-suppressed-diff-view": "Unu el la revizioj de ĉi tiu diferenco estis '''kaŝita'''.\nKiel administranto, vi povas rigardi ĉi tiun diferencon, eble estas detaloj en la [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} protokolo pri kaŝadoj].",
- "rev-delundel": "montri/kaŝi",
+ "rev-delundel": "ŝanĝi videblecon",
"rev-showdeleted": "montri",
"revisiondelete": "Forigi/malforigi versiojn",
"revdelete-nooldid-title": "Nevalida cela revizio",
"mergelog": "Protokolo de kunigoj",
"revertmerge": "Malkunigi",
"mergelogpagetext": "Jen listo de la plej lastatempaj kunigoj de unu paĝhistorio en alian.",
- "history-title": "Revizio-historio de \"$1\"",
+ "history-title": "Revizio-historio de “$1”",
"difference-title": "$1: Malsamoj inter versioj",
"difference-title-multipage": "Malsamoj inter la paĝoj $1 kaj $2",
"difference-multipage": "(Diferenco inter paĝoj)",
"searchprofile-images": "Plurmedio",
"searchprofile-everything": "Ĉion",
"searchprofile-advanced": "Progresa",
- "searchprofile-articles-tooltip": "Serĉo en $1",
+ "searchprofile-articles-tooltip": "Serĉi en $1",
"searchprofile-images-tooltip": "Serĉi dosierojn",
"searchprofile-everything-tooltip": "Traserĉi ĉiun enhavon (inkluzivante diskuto-paĝojn)",
"searchprofile-advanced-tooltip": "Serĉi en specialaj nomspacoj",
"group-bureaucrat": "Burokratoj",
"group-suppress": "Foriganaro",
"group-all": "(ĉiuj)",
- "group-user-member": "{{GENDER:$1|uzanto|uzantino}}",
- "group-autoconfirmed-member": "{{GENDER:$1|aŭtomate konfirmita uzanto|aŭtomate konfirmita uzantino}}",
+ "group-user-member": "{{GENDER:$1|uzanto}}",
+ "group-autoconfirmed-member": "{{GENDER:$1|aŭtomate konfirmita uzanto}}",
"group-bot-member": "{{GENDER:$1|roboto}}",
"group-sysop-member": "{{GENDER:$1|Administranto|Administrantino}}",
"group-bureaucrat-member": "{{GENDER:$1|Burokrato|Burokratino}}",
"badfilename": "Dosiernomo estis ŝanĝita al \"$1\".",
"filetype-mime-mismatch": "Dosiera sufikso \".$1\" ne kongruas la MIME-tipon de la dosiero ($2).",
"filetype-badmime": "Dosieroj de la MIME-tipo \"$1\" ne estas permesitaj por alŝutado.",
- "filetype-bad-ie-mime": "Ne povas alŝuti ĉi tiun dosieron, ĉar Interreta Esplorilo detektus ĝin kiel \"$1\", kiu estas malpermesita kaj eble danĝera dosiertipo.",
+ "filetype-bad-ie-mime": "Ne povas alŝuti ĉi tiun dosieron, ĉar Internet Explorer detektus ĝin kiel dosieron “$1”, kiu estas malpermesita kaj eble danĝera dosiertipo.",
"filetype-unwanted-type": "'''\".$1\"''' estas nevolata dosiero-tipo. {{PLURAL:$3|Preferata dosiero-tipo|Prefereataj dosiero-tipoj}} estas $2.",
"filetype-banned-type": "'''\".$1\"''' ne estas {{PLURAL:$4|permesita dosiero-tipo|permesitaj dosiero-tipoj}}. {{PLURAL:$3|Permesita dosiero-tipo|Permesitaj dosiero-tipoj}} estas $2.",
"filetype-missing": "Ĉi tiu dosiero ne inkluzivas finaĵon de dosiernomo (kiel \".jpg\").",
"namespace_association": "Asociita nomspaco",
"tooltip-namespace_association": "Marku ĉi tiu skatolo por inkluzivi la diskutan aŭ teman nomspacon asocie de la elekta nomspaco",
"blanknamespace": "(Ĉefa)",
- "contributions": "Kontribuoj de {{GENDER:$1|uzanto|uzantino}}",
+ "contributions": "Kontribuoj de {{GENDER:$1|uzanto}}",
"contributions-title": "Kontribuoj de uzanto $1",
"mycontris": "Kontribuoj",
"anoncontribs": "Kontribuoj",
"tooltip-pt-watchlist": "Listo de paĝoj kies ŝanĝojn vi priatentas.",
"tooltip-pt-mycontris": "Listo de viaj kontribuoj",
"tooltip-pt-anoncontribs": "Listo de redaktoj faritaj el ĉi tiu IPa adreso",
- "tooltip-pt-login": "Vi estas invitita ensaluti, tamen ne estas devige.",
+ "tooltip-pt-login": "Vi kuraĝigas ensaluti, tamen ne estas devige.",
"tooltip-pt-logout": "Elsaluti",
"tooltip-pt-createaccount": "Ni rekomendas al vi kreon de uzantokonto kaj ensaluto; tamen, tio ne estas deviga",
"tooltip-ca-talk": "Diskuto pri la artikolo",
"tooltip-ca-nstab-project": "Rigardi la paĝon de la projekto",
"tooltip-ca-nstab-image": "Rigardi la dosierpaĝon",
"tooltip-ca-nstab-mediawiki": "Rigardi la sisteman mesaĝon",
- "tooltip-ca-nstab-template": "Rigardi la ŝablonon",
+ "tooltip-ca-nstab-template": "Vidi la ŝablonon",
"tooltip-ca-nstab-help": "Rigardi la helppaĝon",
"tooltip-ca-nstab-category": "Vidi la paĝon de la kategorio",
"tooltip-minoredit": "Marki tiun ŝanĝon kiel etan",
"tooltip-save": "Konservi viajn ŝanĝojn",
"tooltip-publish": "Publikigi viajn ŝanĝojn",
- "tooltip-preview": "Antaŭrigardi viajn ŝanĝojn. Bonvolu uzi tion antaŭ ol konservi ilin!",
+ "tooltip-preview": "Antaŭrigardi viajn ŝanĝojn. Bonvolu uzi tion antaŭ ol konservi.",
"tooltip-diff": "Montri la ŝanĝojn kiujn vi faris de la teksto.",
"tooltip-compareselectedversions": "Rigardi la malsamojn inter ambaŭ selektitaj versioj de ĉi tiu paĝo.",
"tooltip-watch": "Aldoni ĉi paĝon al via atentaro",
"lastmodifiedatby": "Ĉi paĝo estis laste ŝanĝita je $2, $1 de $3.",
"othercontribs": "Bazita sur la laboro de $1.",
"others": "aliaj",
- "siteusers": "{{GENDER:$2|uzantiĉo|uzantino|uzanto}}{{PLURAL:$2||j}} $1 de {{SITENAME}}",
+ "siteusers": "{{PLURAL:$2|{{GENDER:$1|uzanto}}|uzantoj}} $1 de {{SITENAME}}",
"anonusers": "{{SITENAME}}-{{PLURAL:$2|anonimulo|anonimuloj}} $1",
"creditspage": "Atribuoj de paĝo",
"nocredits": "Ne estas informo pri atribuoj por ĉi paĝo.",
"log-action-filter-newusers": "Tipo de konta kreado:",
"log-action-filter-patrol": "Tipo de patrolado:",
"log-action-filter-protect": "Tipo de protektad:",
- "log-action-filter-rights": "Tipo de rajta ŝanĝo",
- "log-action-filter-suppress": "Tipo de forigado",
+ "log-action-filter-rights": "Tipo de rajta ŝanĝo:",
+ "log-action-filter-suppress": "Tipo de subpremado:",
"log-action-filter-upload": "Tipo de alŝutado:",
"log-action-filter-all": "Ĉia",
"log-action-filter-block-block": "Forbari",
"authmanager-provider-password-domain": "Aŭtentikigo per pasvorto kaj domajno",
"authmanager-provider-temporarypassword": "Provizora pasvorto:",
"authprovider-confirmlink-message": "Laŭ viaj lastatempaj provoj de ensalutado, la sekvantaj kontoj povas esti ligita al via vikia konto. Ligi ilin ebligas ensalutadon per tiuj kontoj. Bonvolu elekti tiun, kiun ligendus.",
- "authprovider-confirmlink-request-label": "Kontoj kiuj devus esti ligita",
+ "authprovider-confirmlink-request-label": "Kontoj, kiuj devas esti ligita",
"authprovider-confirmlink-success-line": "$1: Ligita sukcese.",
"authprovider-confirmlink-failed": "Ligado de konto ne plene sukcesis: $1",
"authprovider-confirmlink-ok-help": "Kontinui post montrado de mesaĝoj pri malsukceso de ligado.",
"2axterix2",
"Matma Rex",
"Dgstranz",
- "Copper12"
+ "Copper12",
+ "Ivanhercaz",
+ "AlvaroMolina",
+ "Tokvo"
]
},
"tog-underline": "Subrayar los enlaces:",
"tagline": "De {{SITENAME}}",
"help": "Ayuda",
"search": "Buscar",
+ "search-ignored-headings": " #<!-- dejar esta línea exactamente como está --> <pre>\n# Títulos que serán ignorados por la búsqueda.\n# Los cambios estarán en vigor tan pronto como la página con el título esté indexada.\n# Puedes forzar la reindexación de una página haciendo una edición nula.\n# La sintaxis es la siguiente:\n# * Todo lo que sigue a un carácter \"#\" hasta el final de la línea, es un comentario.\n# * Todas las líneas que no están en blanco son los títulos exactos que se ignorarán (diferenciando mayúsculas de minúsculas).\nReferencias\nEnlaces externos\nVéase también\n #</pre> <!-- dejar esta línea exactamente como está -->",
"searchbutton": "Buscar",
"go": "Ir",
"searcharticle": "Ir",
"unprotectthispage": "Cambiar la protección de esta página",
"newpage": "Página nueva",
"talkpage": "Discutir esta página",
- "talkpagelinktext": "Discusión",
+ "talkpagelinktext": "discusión",
"specialpage": "Página especial",
"personaltools": "Herramientas personales",
"articlepage": "Ver artículo",
"views": "Vistas",
"toolbox": "Herramientas",
"userpage": "Ver página de usuario",
- "projectpage": "Ver página de proyecto",
+ "projectpage": "Ver página del proyecto",
"imagepage": "Ver página del archivo",
- "mediawikipage": "Ver página de mensaje",
+ "mediawikipage": "Ver página del mensaje",
"templatepage": "Ver página de plantilla",
"viewhelppage": "Ver página de ayuda",
"categorypage": "Ver página de categoría",
"passwordreset-emailelement": "Nombre de {{GENDER:$1|usuario|usuaria}}: \n$1\n\nContraseña temporal: \n$2",
"passwordreset-emailsentemail": "Si esta dirección de correo electrónico está asociada a tu cuenta, entonces se enviará un correo electrónico para restablecer la contraseña.",
"passwordreset-emailsentusername": "Si existe una dirección de correo electrónico asociada a este nombre de usuario, entonces se enviará un correo para restablecer la contraseña.",
- "passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
- "passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|El e-mail de restablecimiento de contraseña ha sido enviado|Los e-mails de restablecimiento de contraseña han sido enviados}}. {{PLURAL:$1|El nombre de usuario y la contraseña se muestra a continuación|La lista de nombres de usuarios y contraseñas se muestra a continuación}}.",
"passwordreset-emailerror-capture2": "No fue posible mandar un correo electrónico {{Gender:$2|al usuario|a la usuaria}}: $1 {{PLURAL:$3|El nombre de usuario y la contraseña|La lista de nombres de usuarios y contraseñas}} se muestra a continuación.",
"passwordreset-nocaller": "Debe de proporcionarse un interlocutor",
"passwordreset-nodata": "No se ha proporcionado ni un nombre de usuario ni una dirección de correo electrónico",
"changeemail": "Cambiar o eliminar la dirección de correo electrónico",
"changeemail-header": "Completa este formulario para cambiar tu dirección de correo electrónico. Si quieres eliminar la asociación de cualquier dirección de correo electrónico con tu cuenta, deja en blanco la nueva dirección de correo electrónico cuando envíes el formulario.",
- "changeemail-passwordrequired": "Tendrás que escribir tu contraseña para confirmar este cambio.",
"changeemail-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
"changeemail-oldemail": "Dirección de correo electrónico actual:",
"changeemail-newemail": "Dirección de correo electrónico nueva:",
"content-model-css": "CSS",
"content-json-empty-object": "Objeto vacío",
"content-json-empty-array": "Matriz vacía",
+ "deprecated-self-close-category": "Páginas que utilizan etiquetas HTML autocerradas no válidas",
+ "deprecated-self-close-category-desc": "Esta página contiene etiquetas HTML de auto-cierre invalidas, tales como <code><b/></code> o <code><span/></code>. El comportamiento de estas en cambiará pronto para ser coherente con la especificación de HTML5, por lo que su utilización en wikitext está en desuso.",
"duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] llama a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
"duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
"duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Parece que ya se había deshecho la edición.",
"undo-summary": "Se ha deshecho la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]])",
"undo-summary-username-hidden": "Se ha deshecho la revisión $1 de un usuario oculto",
- "cantcreateaccounttitle": "No se puede crear la cuenta",
"cantcreateaccount-text": "[[User:$3|$3]] ha bloqueado la creación de cuentas desde esta dirección IP (<strong>$1</strong>).\n\nEl motivo dado por $3 es <em>$2</em>",
"cantcreateaccount-range-text": "[[User:$3|$3]] ha bloqueado la creación de cuentas de usuario desde direcciones IP en el rango <strong>$1</strong>, en el que se encuentra tu dirección IP (<strong>$4</strong>).\n\nEl motivo dado por $3 es <em>$2</em>",
"viewpagelogs": "Ver los registros de esta página",
"action-applychangetags": "aplicar etiquetas junto con los cambios",
"action-changetags": "agregar y quitar etiquetas arbitrarias a revisiones individuales y entradas del registro",
"action-deletechangetags": "eliminar etiquetas de la base de datos",
+ "action-purge": "purgar esta página",
"nchanges": "$1 {{PLURAL:$1|cambio|cambios}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde la última visita}}",
"enhancedrc-history": "historial",
"watchnologin": "No has iniciado sesión",
"addwatch": "Añadir a la lista de seguimiento",
"addedwatchtext": "Se han añadido «[[:$1]]» y su página de discusión a tu [[Special:Watchlist|lista de seguimiento]].",
+ "addedwatchtext-talk": "Se han añadido «[[:$1]]» y su página asociada a tu [[Special:Watchlist|lista de seguimiento]].",
"addedwatchtext-short": "La página \"$1\" ha sido añadida a tu lista de seguimiento.",
"removewatch": "Quitar de la lista de seguimiento",
"removedwatchtext": "Se han eliminado «[[:$1]]» y su página de discusión de tu [[Special:Watchlist|lista de seguimiento]].",
+ "removedwatchtext-talk": "Se han eliminado «[[:$1]]» y su página asociada de tu [[Special:Watchlist|lista de seguimiento]].",
"removedwatchtext-short": "La página \"$1\" ha sido eliminada de tu lista de seguimiento.",
"watch": "Vigilar",
"watchthispage": "Vigilar esta página",
"blocklist-timestamp": "Fecha y hora",
"blocklist-target": "Destino",
"blocklist-expiry": "Caduca",
- "blocklist-by": "Administrador bloqueante",
+ "blocklist-by": "Administrador que realizó el bloqueo",
"blocklist-params": "Parámetros de bloqueo",
"blocklist-reason": "Motivo",
"ipblocklist-submit": "Buscar",
"Postituvi",
"Purodha",
"Macofe",
- "Adeliine"
+ "Adeliine",
+ "Metsavend"
]
},
"tog-underline": "Linkide allakriipsutus:",
"passwordreset-emailelement": "Kasutajanimi: \n$1\n\nAjutine parool: \n$2",
"passwordreset-emailsentemail": "Kui oled sidunud konto selle e-posti aadressiga, siis saadetakse sulle parooli lähtestamise e-kiri.",
"passwordreset-emailsentusername": "Parooli lähtestamise e-kiri saadetakse, kui olemas on kontoga seotud e-posti aadress.",
- "passwordreset-emailsent-capture": "E-kirjatsi on saadetud allpool näidatav parooli lähtestuskiri.",
- "passwordreset-emailerror-capture": "Koostati allpool näidatav parooli lähtestuskiri, aga selle e-kirjatsi {{GENDER:$2|kasutajale}} saatmine ebaõnnestus: $1",
"changeemail": "E-posti aadressi muutmine või eemaldamine",
"changeemail-header": "Täida see vorm, et muuta oma e-posti aadress. Kui soovid, et konto poleks enam seotud ühegi e-posti aadressiga, siis jäta vormi esitamisel e-posti aadressi väli tühjaks.",
- "changeemail-passwordrequired": "Et muudatus kinnitada, pead sisestama oma parooli.",
"changeemail-no-info": "Otselingi kaudu sellele lehele jõudmiseks pead olema sisse loginud.",
"changeemail-oldemail": "Praegune e-posti aadress:",
"changeemail-newemail": "Uus e-posti aadress:",
"minoredit": "See on pisiparandus",
"watchthis": "Jälgi seda lehekülge",
"savearticle": "Salvesta",
+ "publishpage": "Avalda lehekülg",
+ "publishchanges": "Avalda muudatused",
"preview": "Eelvaade",
"showpreview": "Näita eelvaadet",
"showdiff": "Näita muudatusi",
"undo-nochange": "Paistab, et see muudatus on juba eemaldatud.",
"undo-summary": "Eemaldatud muudatus $1, mille tegi [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]])",
"undo-summary-username-hidden": "Eemaldatud redaktsioon $1, mille tegi peidetud kasutaja",
- "cantcreateaccounttitle": "Ei saa kontot luua",
"cantcreateaccount-text": "[[User:$3|$3]] on blokeerinud konto loomise sellelt IP-aadressilt (<strong>$1</strong>).\n\n$3 märkis järgmise põhjuse: <em>$2</em>",
"cantcreateaccount-range-text": "Kontode loomine IP-aadressidelt vahemikus <strong>$1</strong>, millesse jääb sinu IP-aadress (<strong>$4</strong>), on blokeeritud. Blokeeris kasutaja [[User:$3|$3]].\n\n$3 tõi järgmise põhjuse: <em>$2</em>",
"viewpagelogs": "Vaata selle lehekülje logisissekandeid",
"log-title-wildcard": "Selle tekstiga algavad pealkirjad",
"showhideselectedlogentries": "Muuda valitud logisissekannete nähtavust",
"log-edit-tags": "Muuda valitud logisissekannete märgiseid",
+ "checkbox-select": "Vali: $1",
+ "checkbox-all": "kõik",
+ "checkbox-none": "mitte ühtegi",
+ "checkbox-invert": "pööra",
"allpages": "Kõik leheküljed",
"nextpage": "Järgmine lehekülg ($1)",
"prevpage": "Eelmine lehekülg ($1)",
"tooltip-ca-nstab-category": "Näita kategooria lehte",
"tooltip-minoredit": "Märgi see pisiparanduseks",
"tooltip-save": "Salvesta muudatused",
+ "tooltip-publish": "Avalda oma muudatused",
"tooltip-preview": "Näita tehtavaid muudatusi. Palun kasutage seda enne salvestamist!",
"tooltip-diff": "Näita tehtavaid muudatusi.",
"tooltip-compareselectedversions": "Näita erinevusi selle lehe kahe valitud versiooni vahel.",
"tog-ccmeonemails": "Beste erabiltzaileei bidaltzen dizkiedan mezuen kopiak niri ere bidali",
"tog-diffonly": "''Diff''-ak agertzen direnean, orrialdearen edukiera ezkutatu",
"tog-showhiddencats": "Ikusi kategoria ezkutuak",
- "tog-norollbackdiff": "Rollback bat egin ondoren ezberdintasunak ez hartu aintzat",
+ "tog-norollbackdiff": "Rollback bat egin ondoren ezberdintasunak ez erakutsi",
"tog-useeditwarning": "Abisa nazazu gorde gabeko aldaketak eginez orrialde bat uzten dudanean",
"tog-prefershttps": "Erabili beti konexio seguru bat sartzerakoan",
"underline-always": "Beti",
"passwordreset-emailtitle": "{{SITENAME}}-rako kontuaren xehetasunak",
"passwordreset-emailelement": "Erabiltzaile izena: \n$1\n\nBehin-behineko pasahitza: \n$2",
"passwordreset-emailsentemail": "Hau zure konturako erregistratuta dagoen helbide elektronikoa baldin bada, mezu elektronikoa bidaliko da zure pasahitza berrezartzeko.",
- "passwordreset-emailsent-capture": "Pasahitza berrezartzeko e-posta bat bidali dizugu, behean erakusten dena.",
"changeemail": "Aldatu edo kendu e-mail helbidea",
"changeemail-header": "Bete ezazu inprimaki hau, zure helbide elektronikoa aldatzeko. Zure kontuari helbide elektronikorik elkartuta ez izatea nahi baduzu, utz ezazu hutsik helbide elektroniko berria, inprimakia bidaltzen duzunean.",
"changeemail-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
"minoredit": "Aldaketa hau txikia da",
"watchthis": "Orrialde hau jarraitu",
"savearticle": "Gorde orria",
+ "savechanges": "Aldaketak gorde",
+ "publishpage": "Orrialdea argitaratu",
+ "publishchanges": "Aldaketak argitaratu",
"preview": "Aurrebista erakutsi",
"showpreview": "Aurrebista erakutsi",
"showdiff": "Aldaketak erakutsi",
"undo-failure": "Ezin izan da aldaketa desegin tarteko aldaketekin gatazkak direla-eta.",
"undo-norev": "Aldaketa ezin da desegin ez delako existitzen edo ezabatu zutelako.",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|eztabaida]]) wikilariaren $1 berrikuspena desegin da",
- "cantcreateaccounttitle": "Ezin izan da kontua sortu",
"cantcreateaccount-text": "IP helbide honetatik ('''$1''') kontu berria sortzeko aukera blokeatu du [[User:$3|$3]](e)k.\n\n$3(e)k emandako arrazoia: ''$2''",
"viewpagelogs": "Orrialde honen erregistroak ikusi",
"nohistory": "Orrialde honek ez dauka aldaketa historiarik.",
"revdelete-unsuppress": "Berrezarritako aldaketen mugak kendu",
"revdelete-log": "Arrazoia:",
"revdelete-submit": "Hautatutako {{PLURAL:$1|berrikuspenari|berrikuspenei}} aplikatu",
- "revdelete-success": "'''Berrikuspenen ikusgarritasuna eguneratu da.'''",
+ "revdelete-success": "Berrikuspenen ikusgarritasuna eguneratu da.",
"revdelete-failure": "'''Ezin da berrikuspenaren ikuspena eguneratu:'''\n$1",
- "logdelete-success": "'''Log ikusgarritasuna ondo ezarri da.'''",
+ "logdelete-success": "Log ikusgarritasuna ondo ezarri da.",
"logdelete-failure": "'''Erregistroaren ikusgaitasuna ezin da honela ezarri:'''\n$1",
"revdel-restore": "Aldatu ikusgaitasuna",
"pagehist": "Orriaren historia",
"mergehistory-go": "Aldaketa bateragarriak erakutsi",
"mergehistory-submit": "Berrikuspenak bateratu",
"mergehistory-empty": "Ezin da berrikuspenik bateratu",
- "mergehistory-done": "$1(e)ko {{PLURAL:$3|berrikuspen|berrikuspen}} bateratu egin dira [[:$2]](e)n.",
+ "mergehistory-done": "$1(e)ko {{PLURAL:$3|berrikuspen}} bateratu egin {{PLURAL:$3|da|dira}} [[:$2]](e)n.",
"mergehistory-fail": "Ezin izan da historia bateratu; egiaztatu orrialde eta denbora parametroak.",
"mergehistory-no-source": "Ez da $1 jatorrizko orrialdea existitzen.",
"mergehistory-no-destination": "Ez da $1 helburu orrialdea existitzen.",
"badsig": "Baliogabeko sinadura; egiaztatu HTML etiketak.",
"badsiglength": "Zure sinadura luzeegia da.\n$1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.",
"yourgender": "Nola nahiagu duzu deskribatua izatea?",
- "gender-unknown": "Nahiago dut ez esatea",
+ "gender-unknown": "Aipatzen zaituztenean, softwareak genero neutroa erabiliko du hori posible denean",
"gender-male": "Wiki orrialdeak editatzen dituen gizona",
"gender-female": "Wiki orrialdeak editatzen dituen emakumea",
"prefs-help-gender": "Hobespen hau jartzea aukerazkoa da.\nSoftwareak bere balioak erabiltzen ditu zu aipatzeko eta beste batzuek genero gramatikala erabiltzeko aukera izan dezaten.\nInformazio hau publikoa da.",
"editusergroup": "{{GENDER:$1|Erabiltzaile}} taldeak editatu",
"editinguser": "'''[[User:$1|$1]]''' $2 lankidearen erabiltzaile-eskubideak aldatzen",
"userrights-editusergroup": "Erabiltzaile taldeak editatu",
- "saveusergroups": "Erabiltzaile taldeak gorde",
+ "saveusergroups": "Erabiltzaile {{GENDER:$1|taldeak}} gorde",
"userrights-groupsmember": "Ondorengo talde honetako kide da:",
"userrights-groupsmember-auto": "Honen kide inplizitua:",
"userrights-groups-help": "Lankide hau zein taldetakoa den alda dezakezu:\n* Laukia hautatuta baldin badago, esan nahi du lankidea talde horretakoa dela.\n* Laukia hautatu gabe baldin badago, esan nahi du lankidea talde horretakoa ez dela.\n* Izartxoak (*) erakusten du ezin duzula talde horretatik kendu, taldera gehitu eta gero; edo alderantziz, ezin duzula talde horretara gehitu, taldetik kendu eta gero.",
"userrights-changeable-col": "Alda ditzakezun taldeak",
"userrights-unchangeable-col": "Aldatu ezin ditzakezun taldeak",
"userrights-conflict": "Gatazka gertatu da erabiltzaile eskubideak aldatzean. Mesedez, berrikusi eta baieztatu zure aldaketak.",
- "userrights-removed-self": "Arrakasta izan duzu zure eskumenak kentzen. Beraz jada ezin duzu orrialde hau gehiago ikusi.",
+ "userrights-removed-self": "Zure eskumenak kendu dituzu. Beraz jada ezin duzu orrialde hau gehiago ikusi.",
"group": "Taldea:",
"group-user": "Erabiltzaileak",
"group-autoconfirmed": "Lankide autokonfirmatuak",
"right-override-export-depth": "5eko sakonerararteko loturiko orrialdeak barne esportatu",
"right-sendemail": "Beste erabiltzaileei e-posta bidali",
"right-passwordreset": "Ikusi pasahitza berrezartze e-postak",
+ "grant-group-email": "E-posta bidali",
"grant-createaccount": "Kontuak sortu",
"grant-editmycssjs": "Zure CSS/JavaScript aldatu",
"grant-editmyoptions": "Aldatu zure hobespenak",
"rightslogtext": "Erabiltzaile eskubideetan izandako aldaketen erregistroa da hau.",
"action-read": "orrialde hau irakurri",
"action-edit": "orri hau aldatu",
- "action-createpage": "orrialdeak sortu",
- "action-createtalk": "eztabaida orrialdeak sortu",
+ "action-createpage": "Sortu orri hau",
+ "action-createtalk": "eztabaida orrialde hau sortu",
"action-createaccount": "lankide hau sortu",
"action-history": "orrialde honen historia ikusi",
"action-minoredit": "markatu aldaketa hau txikitzat",
"upload-form-label-infoform-title": "Xehetasunak",
"upload-form-label-infoform-name": "Izena",
"upload-form-label-infoform-description": "Deskribapena",
+ "upload-form-label-infoform-description-tooltip": "Azaldu laburki lanaren inguruko kontu aipagarri guztiak. Argazki batean, aipatu agertzen den gai nagusia, momentua, edo lekua.",
"upload-form-label-usage-title": "Erabilera",
"upload-form-label-usage-filename": "Fitxategiaren izena",
"upload-form-label-own-work": "Hau neure lana da",
"filerevert-legend": "Fitxategia leheneratu",
"filerevert-intro": "'''[[Media:$1|$1]]''' berrezartzen ari zara [$4 $3(e)ko, $2(e)tako bertsiora].",
"filerevert-comment": "Arrazoia:",
- "filerevert-defaultcomment": "$2, $1 bertsiora leheneratu da",
+ "filerevert-defaultcomment": "$2, $1 ($3) bertsiora leheneratu da",
"filerevert-submit": "Leheneratu",
"filerevert-success": "'''[[Media:$1|$1]]''' [$4 $3(e)ko, $2(e)tako bertsiora] lehenratua izan da.",
"filerevert-badversion": "Ez dago aurreragoko fitxategi honen bertsio lokalik emandako denbora tartean.",
"listgrouprights-removegroup-self-all": "Talde guztiak norbere kontutik ezabatu",
"listgrouprights-namespaceprotection-namespace": "Izen-tartea",
"listgrants": "Diru-laguntzak",
+ "listgrants-grant": "Baimena eman",
"listgrants-rights": "Eskubideak",
+ "trackingcategories": "Jarraipen kategoriak",
+ "trackingcategories-msg": "Jarraipen kategoria",
"trackingcategories-name": "Mezuaren izena",
"trackingcategories-nodesc": "Ez dago deskribapenik eskuragarri.",
"trackingcategories-disabled": "Kategoria desgaitua dago",
"emailccsubject": "Zure mezuaren kopia $1(r)i: $2",
"emailsent": "Mezua bidali egin da",
"emailsenttext": "Zure e-posta mezua bidali egin da.",
- "emailuserfooter": "E-posta hau $1(e)k bidali dio $2(r)i {{SITENAME}}ko \"{{int:emailuser}}\" funtzioa erabiliz.",
+ "emailuserfooter": "E-posta hau $1(e)k {{GENDER:$1|bidali}} dio {{GENDER:$2|$2}}(r)i {{SITENAME}}ko \"{{int:emailuser}}\" funtzioa erabiliz.",
"usermessage-summary": "Sistema mezua uzten.",
"usermessage-editor": "Sistemako mezularia",
"watchlist": "Jarraipen zerrenda",
"wlshowhideanons": "erabiltzaile anonimoak",
"wlshowhidepatr": "Patruilatutako aldaketak",
"wlshowhidemine": "nire edizioak",
+ "wlshowhidecategorization": "orrialdearen kategorizazioa",
"watchlist-options": "Jarraitze-zerrendaren aukerak",
"watching": "Zerrendan gehitzen...",
"unwatching": "Zerrendatik kentzen...",
"sessionfailure": "Badirudi saioarekin arazoren bat dagoela; bandalismoak saihesteko ekintza hau ezeztatu egin da. Mesedez, nabigatzaileko \"atzera\" botoian klik egin, hona ekarri zaituen orrialde hori berriz kargatu, eta saiatu berriz.",
"changecontentmodel-title-label": "Orriaren izenburua",
"changecontentmodel-reason-label": "Arrazoia:",
+ "changecontentmodel-submit": "Aldatu",
"logentry-contentmodel-change-revertlink": "desegin",
"logentry-contentmodel-change-revert": "desegin",
"protectlogpage": "Babes erregistroa",
"ipb-unblock": "Erabiltzaile izen edo IP helbide bati blokeoa kendu",
"ipb-blocklist": "Blokeaketak ikusi",
"ipb-blocklist-contribs": "{{GENDER:$1|$1(r)en}} ekarpenak",
+ "ipb-blocklist-duration-left": "gainerako $1",
"unblockip": "Erabiltzailea desblokeatu",
"unblockiptext": "Erabili beheko formularioa lehenago blokeatutako IP helbide edo erabiltzaile baten idazketa baimenak leheneratzeko.",
"ipusubmit": "Blokeoa ezabatu",
"pageinfo-category-files": "Fitxategi kopurua",
"markaspatrolleddiff": "Patruilatutzat markatu",
"markaspatrolledtext": "Artikulu hau patruilatutzat markatu",
+ "markaspatrolledtext-file": "Fitxategi honen bertsioa patruilatutzat markatu",
"markedaspatrolled": "Patruilatutzat markatu da",
"markedaspatrolledtext": "[[:$1]]-(r)en bertsio hautatua patruilatutzat markatu da.",
"rcpatroldisabled": "Aldaketa berrien patruilaketa ezgaituta dago",
"confirm-watch-top": "Orrialde hau zure jarraipen-zerrendara gehitu?",
"confirm-unwatch-button": "Ados",
"confirm-unwatch-top": "Orrialde hau zure jarraipen-zerrendatik kendu?",
+ "confirm-rollback-button": "Ados",
"quotation-marks": "«$1»",
"imgmultipageprev": "← aurreko orrialdea",
"imgmultipagenext": "hurrengo orrialdea →",
"logentry-move-move_redir": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik",
"logentry-move-move_redir-noredirect": "$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birbideratze bat gainidatzita, birbideratzerik utzi gabe",
"logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuspena patruilatutzat {{GENDER:$2|markatu}} du",
- "logentry-newusers-newusers": "$1 erabiltzaile kontua sortu da",
+ "logentry-newusers-newusers": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
"logentry-newusers-create": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
"logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua sortu du",
+ "logentry-newusers-byemail": "$1(e)k $3 erabiltzaile kontua {{GENDER:$2|sortu du}} eta pasahitza emailez bidali da",
"logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}",
"log-name-tag": "Etiketen erregistroa",
"rightsnone": "(bat ere ez)",
"expand_templates_generate_xml": "Erakutsi XML parse zuhaitza",
"expand_templates_generate_rawhtml": "Erakutsi HTML gordina",
"expand_templates_preview": "Aurreikusi",
- "pagelanguage": "Orriaren hizkuntza aukeratu",
+ "pagelanguage": "Orriaren hizkuntza aldatu",
"pagelang-name": "Orria",
"pagelang-language": "Hizkuntza",
"pagelang-use-default": "Hizkuntza lehenetsia erabili",
"mw-widgets-dateinput-no-date": "Ez duzu datarik aukeratu",
"mw-widgets-titleinput-description-new-page": "orri hori oraindik ez da existitzen",
"mw-widgets-titleinput-description-redirect": "$1ra birzuzendu",
- "sessionprovider-generic": "$1 sesio"
+ "sessionprovider-generic": "$1 sesio",
+ "log-action-filter-all": "Denak",
+ "log-action-filter-block-block": "Blokeatu",
+ "log-action-filter-block-reblock": "Blokeoa aldatu",
+ "log-action-filter-block-unblock": "blokeoa kendu",
+ "authmanager-userdoesnotexist": "\"$1\" erabiltzaile kontua ez dago erregistratua.",
+ "authmanager-email-label": "Emaila",
+ "authmanager-email-help": "Helbide elektronikoa",
+ "authmanager-realname-label": "Benetako izena",
+ "authmanager-realname-help": "Erabiltzailearen benetako izena",
+ "authprovider-resetpass-skip-label": "Utzi",
+ "authform-wrongtoken": "Token okerra"
}
"tagline": "از {{SITENAME}}",
"help": "راهنما",
"search": "جستجو",
+ "search-ignored-headings": "#<!-- این صفحه را درست همانطور که هست رها کنید --> <pre>\n#سرفصلهایی که توسط تحقیق نادیده گرفته خواهندشد.\n#به محض اینکه صفحه با سرفصل، فهرست شدهاست،تغییرات متاثر میشود.\n#شما میتوانید با انجام یک ویرایش پوچ صفحه را وادار به دوباره فهرست کردن کنید.\n#نحو به شرح زیر است:\n# *همه چیز از یک خصیصهٔ \"#\" گرفته تا آخر خط، یک نظر است\n# *هر خط بدون فاصله، عنوان دقیق برای نادیده گرفتن،موضوع و همه چیز منابع است\nاتصالات خارجی\nهمچنین مشاهده کنید\n#</pre> <!-- leave this line exactly as it is -->",
"searchbutton": "جستجو",
"go": "برو",
"searcharticle": "برو",
"passwordreset-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
"passwordreset-emailsentemail": "اگر نشانی پست الکترونیکی که وارد کردید برای حساب کاربریتان ثبت شده باشد، یک نامهٔ بازنشانی گذرواژه به آن فرستاده میشود.",
"passwordreset-emailsentusername": "اگر نشانی پست الکترونیکی مرتبطی موجود باشد، یک نامه برای بازنشانی گذرواژه به آن ارسال خواهد شد.",
- "passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
- "passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیتآمیز نبود: $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|نامهٔ|نامهٔ}} بازنشانی گذرواژه ارسال شد. در زير $1 نام کاربری و گذرواژه در حال نمایش است.",
"passwordreset-emailerror-capture2": "ارسال ناموفق نامه به $2: $1\nدر زير $3 نام کاربری و گذرواژه در حال نمایش است",
"passwordreset-nocaller": "فراخواننده میبايست مشخص شده باشد",
"passwordreset-nodata": "یک نام کاربری و یا یک آدرس ايميل، هيچکدام ارائه نشده",
"changeemail": "تغییر یا حذف نشانی ایمیل",
"changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
- "changeemail-passwordrequired": "برای تائید این تغییر باید گذرواژهتان را وارد کنید.",
"changeemail-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
"changeemail-oldemail": "آدرس ایمیل کنونی:",
"changeemail-newemail": "آدرس ایمیل جدید:",
"watchthis": "پیگیری این صفحه",
"savearticle": "صفحه ذخیره شود",
"savechanges": "ذخیرهٔ تغییرات",
- "publishpage": "اÙ\86تشار صفحه",
- "publishchanges": "اÙ\86تشار تغییرات",
+ "publishpage": "ذخÛ\8cرÙ\87 صفحه",
+ "publishchanges": "ذخÛ\8cرÙ\87 تغییرات",
"preview": "پیشنمایش",
"showpreview": "پیشنمایش",
"showdiff": "نمایش تغییرات",
"anontalkpagetext": "----<em>این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمیکند.\nبنا بر این برای شناساییاش مجبوریم از نشانی آیپی عددی استفاده کنیم.</em>\nچنین نشانیهای آیپی ممکن است توسط چندین کاربر به شکل مشترک استفاده شود.\nاگر شما کاربر گمنامی هستید و تصور میکنید اظهار نظرات نامربوط به شما صورت گرفته است، لطفاً برای پیشگیری از اشتباه گرفته شدن با کاربران گمنام دیگر در آینده [[Special:CreateAccount|حسابی ایجاد کنید]] یا [[Special:UserLogin|به سامانه وارد شوید]].",
"noarticletext": "این صفحه هماکنون دارای هیچ متنی نیست.\nشما میتوانید در صفحههای دیگر [[Special:Search/{{PAGENAME}}|عنوان این صفحه را جستجو کنید]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهههای مرتبط را جستجو کنید]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} این صفحه را ایجاد کنید]</span>.",
"noarticletext-nopermission": "این صفحه هماکنون متنی ندارد.\nشما میتوانید در دیگر صفحات [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهههای مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.",
- "missing-revision": "ویرایش #$1 از صفحهٔ «{{FULLPAGENAME}}» موجود نیست.\n\nمعمولاً در اثر پیوند به تاریخچهٔ بهروز نشدهٔ صفحهٔ حذف شده است.\nمیتوانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
+ "missing-revision": "ویرایش #$1 از صفحهٔ «{{FULLPAGENAME}}» موجود نیست.\n\nاین اتفاق معمولاً در اثر دنبال کردن پیوندی به تاریخچهٔ یک صفحهٔ حذفشده پیش میآید.\nمیتوانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
"userpage-userdoesnotexist": "حساب کاربر «<nowiki>$1</nowiki>» ثبت نشدهاست.\nلطفاً مطمئن شوید که میخواهید این صفحه را ایجاد یا ویرایش کنید.",
"userpage-userdoesnotexist-view": "حساب کاربری «$1» ثبت نشدهاست.",
"blocked-notice-logextract": "دسترسی این کاربر در حال حاضر بسته است.\nآخرین مورد سیاهه قطع دسترسی در زیر آمدهاست:",
"content-model-css": "سیاساس",
"content-json-empty-object": "ابجکت خالی",
"content-json-empty-array": "آرایهٔ خالی",
+ "deprecated-self-close-category": "صفحه از برچسب اچتیامال self-closed غیرمجاز استفاده میکند",
+ "deprecated-self-close-category-desc": "صفحه دارای برچسب اچتیامال self-closed است مانند <code><b/></code> یا <code><span/></code>. عملکرد این برچسبها در اچتیامال۵ تغییر میکند در نتیجه استفاده از آنها در ویکیمتن منسوخ و بیاثر است.",
"duplicate-args-warning": "<strong>هشدار:</strong> [[:$1]] [[:$2]] را با بیش از یک مقدار برای پارامتر «$3» صدا میزند. فقط آخرین مقدار داده شده استفاده خواهد شد.",
"duplicate-args-category": "صفحههای دارای آرگومان تکراری در فراخوانی الگو",
"duplicate-args-category-desc": "صفحاتی که دارای آرگومان تکراری هستند مانند، <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> یا <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "به نظر میرسد ویرایش از پیش واگردانی شده است.",
"undo-summary": "خنثیسازی ویرایش $1 توسط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])",
"undo-summary-username-hidden": "خنثیسازی نسخهٔ $1 به دست یک کاربر پنهانشده",
- "cantcreateaccounttitle": "نمیتوان حساب باز کرد",
"cantcreateaccount-text": "امكان ساختن حساب کاربری از این این نشانی آیپی ('''$1''') توسط [[User:$3|$3]] سلب شده است.\n\nدلیل ارائه شده توسط $3 چنین است: $2",
"cantcreateaccount-range-text": "ایجاد حساب از آدرس آیپی در مجموعهی <strong>$1</strong>، که شامل آدرس آیپی شما (<strong>$4</strong>) است، توسط [[User:$3|$3]] متوقف شدهاست.\nدلیل ارائه شده توسط $3، $2 است.",
"viewpagelogs": "نمایش سیاهههای این صفحه",
"diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ میانی|$1 نسخهٔ میانی}}ِ همین کاربر نمایش داده نشده است)",
"diff-multi-otherusers": "({{PLURAL:$1|۱ نسخهٔ میانی|$1 نسخهٔ میانی}} ویرایش شده توسط {{PLURAL:$2|۱ کاربر|$2 کاربر}} نشان داده نشده)",
"diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} نسخهٔ میانی ویرایش شده توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده است)",
- "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}} از تفاوت نسخهها ($1) {{PLURAL:$2|یافت|یافت}} نشد.\n\nمعمولاً در اثر پیوند به تاریخچهٔ بهروز نشدهٔ صفحهٔ حذف شده است.\nمیتوانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
+ "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}} از تفاوت نسخهها ($1) {{PLURAL:$2|یافت|یافت}} نشد.\n\nاین اتفاق معمولاً در اثر دنبال کردن پیوند تفاوتی به یک صفحهٔ حذفشده پیش میآید.\nمیتوانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
"searchresults": "نتایج جستجو",
"searchresults-title": "نتایج جستجو برای «$1»",
"titlematches": "تطبیق عنوان مقاله",
"notvisiblerev": "آخرین نسخه توسط کاربری دیگر حذف شدهاست",
"watchlist-details": "بدون احتساب صفحههای جداگانهٔ بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه}} در فهرست پیگیریهای شما قرار {{PLURAL:$1|دارد|دارند}}.",
"wlheader-enotif": "ایمیلهای اعلان فعال است.",
- "wlheader-showupdated": "صفحههایی که پس از آخرین بازدید شما تغییر کردهاند '''پررنگ''' نمایش داده شدهاند.",
+ "wlheader-showupdated": "صفحههایی که پس از آخرین بازدید شما تغییر کردهاند <strong>پررنگ</strong> نمایش داده شدهاند.",
"wlnote": "در زیر {{PLURAL:$1|تغییری|<strong>$1</strong> تغییری}} که در {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4",
"wlshowlast": "نمایش آخرین $1 ساعت $2 روز",
"watchlist-hide": "نهفتن",
"actionfailed": "عمل ناموفق بود",
"deletedtext": "«$1» حذف شد.\nبرای سابقهٔ حذفهای اخیر به $2 مراجعه کنید.",
"dellogpage": "سیاههٔ حذف",
- "dellogpagetext": "فهرست زیر فهرستی از آخرین حذفهاست.\nهمهٔ زمانهای نشاندادهشده زمان خادم (وقت گرینویچ) است.",
+ "dellogpagetext": "فهرست زیر فهرستی از آخرین حذفهاست.\nهمهٔ زمانهای نشاندادهشده زمان کارساز (وقت گرینویچ) است.",
"deletionlog": "سیاههٔ حذف",
"reverted": "به نسخهٔ قدیمیتر واگردانده شد",
"deletecomment": "دلیل:",
"protect-default": "همهٔ کاربرها",
"protect-fallback": "فقط به کاربرهایی که دسترسی «$1» دارند، اجازه داده میشود",
"protect-level-autoconfirmed": "تنها کاربران تأییدشده",
- "protect-level-sysop": "فقط مدیران",
+ "protect-level-sysop": "تنها مدیران",
"protect-summary-cascade": "آبشاری",
"protect-expiring": "زمان سرآمدن $1 (UTC)",
"protect-expiring-local": "منقضی $1",
"confirmrecreate-noreason": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این صفحه را پس از شروع ویرایشتان {{GENDER:$1|پاک}} کردهاست. لطفاً تأیید کنید که شما واقعاً میخواهید آن را دوباره ایجاد کنید.",
"recreate": "باز ایجاد",
"confirm_purge_button": "تأیید",
- "confirm-purge-top": "پاککردن نسخهٔ حافظهٔ نهانی (Cache) این صفحه را تأیید میکنید؟",
+ "confirm-purge-top": "پاک کردن نسخهٔ حافظهٔ نهانی (Cache) این صفحه را تأیید میکنید؟",
"confirm-purge-bottom": "خالی کردن میانگیر یک صفحه باعث میشود که آخرین نسخهٔ آن نمایش یابد.",
"confirm-watch-button": "تأیید",
"confirm-watch-top": "این صفحه به فهرست پیگیریهای شما افزوده شود؟",
"log-action-filter-newusers": "نوع ایجاد حساب",
"log-action-filter-patrol": "نوع گشت:",
"log-action-filter-protect": "نوع محافظت",
- "log-action-filter-rights": "روش تغییر صحیح",
- "log-action-filter-suppress": "روش سرکوب",
+ "log-action-filter-rights": "روش تغییر صحیح:",
+ "log-action-filter-suppress": "روش سرکوب:",
"log-action-filter-upload": "نوع بارگذاری",
"log-action-filter-all": "همه",
"log-action-filter-block-block": "بستن",
"tagline": "Kohteesta {{SITENAME}}",
"help": "Ohje",
"search": "Haku",
+ "search-ignored-headings": "#<!-- jätä tämä rivi sellaiseksi kuin se on --> <pre>\n# Otsikot, jotka haku ohittaa.\n# Muutokset tulevat voimaan heti, kun otsikon sivu indeksoidaan.\n# Voit pakottaa sivun indeksoimisen tekemällä nollamuokkauksen.\n# Syntaksi on seuraava:\n# * Kaikki \"#\"-merkistä rivin loppuun asti on kommenttia\n# * Kaikki ei-tyhjät rivit ovat otsikoita, jotka ohitetaan.\nLähteet\nAiheesta muualla\nKatso myös\n#</pre> <!-- jätä tämä rivi sellaiseksi kuin se on -->",
"searchbutton": "Hae",
"go": "Siirry",
"searcharticle": "Siirry",
"passwordreset-emailelement": "Käyttäjätunnus: \n$1\n\nVäliaikainen salasana: \n$2",
"passwordreset-emailsentemail": "Jos tämä on sinun tunnuksellesi rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
"passwordreset-emailsentusername": "Jos on olemassa vastaava rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
- "passwordreset-emailsent-capture": "Salasanan uudistamisesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.",
- "passwordreset-emailerror-capture": "Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1",
"passwordreset-emailsent-capture2": "Salasananpalautus{{PLURAL:$1|sähköposti|sähköpostit}} on lähetetty. {{PLURAL:$1|Käyttäjä ja salasana|Luettelo käyttäjistä ja salasanoista}} näytetään alapuolella.",
"passwordreset-emailerror-capture2": "Sähköpostin lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1 {{PLURAL:$3|Käyttäjänimi ja salasana|Luettelo käyttäjänimistä ja salasanoista}} näytetään alla.",
"passwordreset-invalideamil": "Virheellinen sähköpostiosoite",
"passwordreset-nodata": "Käyttäjätunnusta ja salasanaa ei annettu",
"changeemail": "Muuta tai poista sähköpostiosoite",
"changeemail-header": "Täydennä tämä lomake, jolla voit muuttaa sähköpostiosoitettasi. Jos haluat poistaa sähköpostiosoitteesi kokonaan tunnuksesi yhteydestä, älä kirjoita uudeksi osoitteeksi mitään vaan jätä se tyhjäksi.",
- "changeemail-passwordrequired": "Sinun on syötettävä salasanasi vahvistaaksesi tämän muutoksen.",
"changeemail-no-info": "Tämän sivun käyttö edellyttää sisäänkirjautumista.",
"changeemail-oldemail": "Nykyinen sähköpostiosoite:",
"changeemail-newemail": "Uusi sähköpostiosoite:",
"undo-nochange": "Tämä muokkaus näyttää olevan jo kumottu.",
"undo-summary": "Kumottu muokkaus $1, jonka teki [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]])",
"undo-summary-username-hidden": "Kumottu muokkaus $1, jonka on tehnyt piilotettu käyttäjä",
- "cantcreateaccounttitle": "Tunnusta ei voida luoda",
"cantcreateaccount-text": "Tunnusten luonti tästä IP-osoitteesta ('''$1''') on estetty. Estäjänä on [[User:$3|$3]].\n\nKäyttäjän $3 antama syy on ''$2''",
"cantcreateaccount-range-text": "Tunnusten luominen IP-osoitteista osoitealueella <strong>$1</strong>, johon kuuluu myös sinun käyttämäsi IP-osoite (<strong>$4</strong>), on estetty. Eston on asettanut [[User:$3|$3]].\n\nSyy estolle on \"$2\".",
"viewpagelogs": "Näytä tämän sivun lokit",
"Psychoslave",
"Trial",
"Matma Rex",
- "Dcausse"
+ "Dcausse",
+ "Lucas"
]
},
"tog-underline": "Soulignement des liens :",
"tagline": "De {{SITENAME}}",
"help": "Aide",
"search": "Rechercher",
+ "search-ignored-headings": " #<!-- laisser cette ligne comme telle --> <pre>\n# Titres des sections qui seront ignorés par la recherche\n# Les changements effectués ici prennent effet dès lors que la page avec le titre est indexée.\n# Vous pouvez forcer la réindexation de la page en effectuant une modification vide\n# La syntaxe est la suivante :\n# * Toute ligne précédée d’un « # » est un commentaire\n# * Toute ligne non-vide est le titre exact à ignorer, casse comprise\nRéférences\nLiens externes\nVoir aussi\n #</pre> <!-- laisser cette ligne comme telle -->",
"searchbutton": "Rechercher",
"go": "Consulter",
"searcharticle": "Lire",
"viewhelppage": "Voir la page d'aide",
"categorypage": "Voir la page de catégorie",
"viewtalkpage": "Voir la page de discussion",
- "otherlanguages": "Dans d'autres langues",
+ "otherlanguages": "Dans d’autres langues",
"redirectedfrom": "(Redirigé depuis $1)",
"redirectpagesub": "Page de redirection",
"redirectto": "Rediriger vers :",
"jumpto": "Aller à :",
"jumptonavigation": "navigation",
"jumptosearch": "rechercher",
- "view-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d’utilisateurs cherchent à consulter cette page.\nVeuillez attendre un peu avant de réessayer d’accéder à celle-ci.\n\n$1",
+ "view-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d’utilisateurs cherchent à consulter cette page.\nVeuillez attendre un peu avant d’essayer à nouveau d’accéder à celle-ci.\n\n$1",
"generic-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d’utilisateurs cherchent à consulter cette ressource.\nVeuillez attendre un peu avant de tenter à nouveau l’accès à celle-ci.",
"pool-timeout": "Délai d’attente du verrou dépassé",
"pool-queuefull": "La file des processus est pleine",
"currentevents-url": "Project:Actualités",
"disclaimers": "Avertissements",
"disclaimerpage": "Project:Avertissements généraux",
- "edithelp": "Aide",
+ "edithelp": "Aide pour l'édition",
"helppage-top-gethelp": "Aide",
"mainpage": "Accueil",
"mainpage-description": "Accueil",
"viewdeleted": "Voir $1 ?",
"restorelink": "{{PLURAL:$1|une modification effacée|$1 modifications effacées}}",
"feedlinks": "Flux :",
- "feed-invalid": "Type de flux invalide pour abonnement.",
+ "feed-invalid": "Type de flux d’abonnement non valide.",
"feed-unavailable": "Les flux de syndication ne sont pas disponibles",
"site-rss-feed": "Flux RSS de $1",
"site-atom-feed": "Flux Atom de $1",
"missing-article": "La base de données n’a pas trouvé le texte d’une page qu’elle aurait dû trouver, intitulée « $1 » $2.\n\nGénéralement, cela survient en suivant un lien vers un diff périmé ou vers l’historique d’une page supprimée.\n\nSi ce n’est pas le cas, il peut s’agir d’une anomalie dans le programme.\nVeuillez la signaler à un [[Special:ListUsers/sysop|administrateur]] sans oublier de lui indiquer l’URL de la page.",
"missingarticle-rev": "(numéro de version : $1)",
"missingarticle-diff": "(diff : $1, $2)",
- "readonly_lag": "La base de données a été automatiquement verrouillée pendant que les serveurs secondaires rattrapent leur retard sur le serveur principal.",
- "nonwrite-api-promise-error": "L’entête HTTP « <code>Promise-Non-Write-API-Action:<code> » a été envoyé mais la requête a été faite à un module d’écriture de l’API.",
+ "readonly_lag": "La base de données a été automatiquement verrouillée pendant que les serveurs secondaires se réalignent sur le serveur principal.",
+ "nonwrite-api-promise-error": "L’entête HTTP « <code>Promise-Non-Write-API-Action:</code> » a été envoyé mais la requête a été faite à un module d’écriture de l’API.",
"internalerror": "Erreur interne",
"internalerror_info": "Erreur interne : $1",
"internalerror-fatal-exception": "Erreur fatale de type « $1 »",
"filecopyerror": "Impossible de copier le fichier « $1 » vers « $2 ».",
"filerenameerror": "Impossible de renommer le fichier « $1 » en « $2 ».",
"filedeleteerror": "Impossible de supprimer le fichier « $1 ».",
- "directorycreateerror": "Impossible de créer le dossier « $1 ».",
+ "directorycreateerror": "Impossible de créer le répertoire « $1 ».",
"directoryreadonlyerror": "Le répertoire « $1 » est en lecture seule.",
"directorynotreadableerror": "Le répertoire « $1 » n’est pas lisible.",
"filenotfound": "Impossible de trouver le fichier « $1 ».",
"viewyourtext": "Vous pouvez voir et copier le contenu de <strong>vos modifications</strong> à cette page.",
"protectedinterface": "Cette page fournit du texte d’interface pour le logiciel sur ce wiki et est protégée pour éviter les abus.\nPour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [https://translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
"editinginterface": "<strong>Attention :</strong> vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel.\nLes changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.",
- "translateinterface": "Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [https://translatewiki.net/ translatewiki.net], le projet de régionalisation de MediaWiki.",
+ "translateinterface": "Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [https://translatewiki.net/ translatewiki.net], le projet de localisation linguistique de MediaWiki.",
"cascadeprotected": "Cette page est protégée contre les modifications car elle est transcluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :\n$2",
"namespaceprotected": "Vous n’avez pas la permission de modifier les pages de l’espace de noms « <strong>$1</strong> ».",
"customcssprotected": "Vous n’avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d’un autre utilisateur.",
"mycustomjsprotected": "Vous n’avez pas le droit de modifier cette page JavaScript.",
"myprivateinfoprotected": "Vous n’avez pas le droit de modifier vos informations personnelles.",
"mypreferencesprotected": "Vous n’avez pas le droit de modifier vos préférences.",
- "ns-specialprotected": "Les pages dans l’espace de noms « {{ns:special}} » ne peuvent pas être modifiées.",
+ "ns-specialprotected": "Les pages spéciales ne peuvent pas être modifiés.",
"titleprotected": "Ce titre a été protégé contre toute création par [[User:$1|$1]].\nLe motif fourni est <em>$2</em>.",
"filereadonlyerror": "Impossible de modifier le fichier « $1 » parce que le répertoire de fichiers « $2 » est en lecture seule.\n\nL’administrateur système qui l’a verrouillé a fourni ce motif : « $3 ».",
"invalidtitle-knownnamespace": "Titre non valide avec l’espace de noms « $2 » et l’intitulé « $3 »",
"pt-createaccount": "Créer un compte",
"pt-userlogout": "Se déconnecter",
"php-mail-error-unknown": "Erreur inconnue dans la fonction <code>mail()</code> de PHP.",
- "user-mail-no-addy": "Tenté d'envoyer un courriel sans adresse de courriel",
- "user-mail-no-body": "Essai d'envoi d'un courriel avec un corps vide ou déraisonnablement court.",
+ "user-mail-no-addy": "Impossible d’envoyer un courriel sans adresse de courriel.",
+ "user-mail-no-body": "Essai d’envoi d’un courriel avec un corps vide ou anormalement court.",
"changepassword": "Changer de mot de passe",
- "resetpass_announce": "Pour terminer l'enregistrement, vous devez fournir un nouveau mot de passe.",
+ "resetpass_announce": "Pour terminer votre inscription, vous devez fournir un nouveau mot de passe.",
"resetpass_text": "<!-- Ajoutez le texte ici -->",
"resetpass_header": "Changer le mot de passe du compte",
"oldpassword": "Ancien mot de passe :",
"changepassword-success": "Votre mot de passe a été modifié !",
"changepassword-throttled": "Vous avez fait trop de tentatives de connexion récemment.\nVeuillez attendre $1 avant de réessayer.",
"botpasswords": "Mots de passe de robots",
- "botpasswords-summary": "<em>Mots de passe de robots</em> permet d’accéder à un compte utilisateur via l’API sans utiliser les identifiants de connexion principaux. Les droits utilisateur disponibles en étant connecté avec un mot de passe robot peuvent être réduits.\n\nSi vous ne voyez pas pourquoi vous voudriez faire cela, c’est que vous n’en avez pas besoin. Personne ne devrait jamais vous demander d’en générer un et de le lui donner.",
+ "botpasswords-summary": "Les <em>mots de passe de robots</em> permettent d’accéder à un compte utilisateur via l’API sans utiliser les identifiants de connexion principaux. Les droits utilisateur disponibles en étant connecté avec un mot de passe robot peuvent être réduits.\n\nSi vous ne voyez pas pourquoi vous voudriez faire cela, c’est que vous n’en avez pas besoin. Personne ne devrait jamais vous demander d’en générer un et de le lui donner.",
"botpasswords-disabled": "Les mots de passe robots sont désactivés.",
"botpasswords-no-central-id": "Pour utiliser les mots de passe de robots, vous devez être connecté à un compte centralisé.",
"botpasswords-existing": "Mots de passe de robots existants",
"botpasswords-label-delete": "Supprimer",
"botpasswords-label-resetpassword": "Réinitialiser le mot de passe",
"botpasswords-label-grants": "Droits applicables :",
- "botpasswords-help-grants": "Chaque droit donne accès aux droits utilisateurs listés qu’a déjà un compte. Voyez le [[Special:ListGrants|tableau des droits]] pour plus d’information.",
+ "botpasswords-help-grants": "Chaque droit accordé donne accès à la liste des droits utilisateurs dont l’utilisateur dispose déjà. Voyez le [[Special:ListGrants|tableau des droits]] pour plus d’informations.",
"botpasswords-label-restrictions": "Restrictions d’utilisation :",
"botpasswords-label-grants-column": "Accordé",
"botpasswords-bad-appid": "Le nom de robot « $1 » n’est pas valide.",
"botpasswords-no-provider": "BotPasswordsSessionProvider n’est pas disponible.",
"botpasswords-restriction-failed": "Les restrictions de mot de passe de robots empêchent cette connexion.",
"botpasswords-invalid-name": "Le nom d’utilisateur spécifié ne contient pas de séparateur de mot de passe de robots (« $1 »).",
- "botpasswords-not-exist": "L’utilisateur « $1 » n’a pas de nom de mot de passe de robots appelé « $2 ».",
+ "botpasswords-not-exist": "L’utilisateur « $1 » n’a pas le mot de passe de robots intitulé « $2 ».",
"resetpass_forbidden": "Les mots de passe ne peuvent pas être changés",
"resetpass_forbidden-reason": "Les mots de passe ne peuvent pas être modifiés : $1",
- "resetpass-no-info": "Vous devez être connecté pour avoir accès à cette page.",
+ "resetpass-no-info": "Vous devez être connecté pour avoir accès directement à cette page.",
"resetpass-submit-loggedin": "Changer de mot de passe",
"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-expired": "Votre mot de passe a expiré. Veuillez en fournir un nouveau pour vous connecter.",
"resetpass-expired-soft": "Votre mot de passe a expiré, et doit être réinitialisé. Veuillez en choisir un nouveau maintenant ou cliquer sur « {{int:authprovider-resetpass-skip-label}} » pour le faire plus tard.",
"resetpass-validity-soft": "Votre mot de passe n’est pas valide : $1\n\nVeuillez choisir un nouveau mot de passe maintenant, ou cliquez sur « {{int:authprovider-resetpass-skip-label}} » pour le réinitialiser plus tard.",
- "passwordreset": "Remise à zéro du mot de passe",
+ "passwordreset": "Réinitialisation du mot de passe",
"passwordreset-text-one": "Remplissez ce formulaire pour réinitialiser votre mot de passe.",
"passwordreset-text-many": "{{PLURAL:$1|Remplissez un des champs pour recevoir un mot de passe temporaire par courriel.}}",
"passwordreset-disabled": "La réinitialisation des mots de passe a été désactivée sur ce wiki.",
- "passwordreset-emaildisabled": "Les fonctionnalités e-mail ont été désactivées sur ce wiki.",
+ "passwordreset-emaildisabled": "Les fonctionnalités de courriel ont été désactivées sur ce wiki.",
"passwordreset-username": "Nom d'utilisateur :",
"passwordreset-domain": "Domaine :",
"passwordreset-capture": "Voir le courriel résultant ?",
- "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-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 avez retrouvé 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 avez retrouvé 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 : \n$1\n\nMot de passe temporaire : \n$2",
+ "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}}. \nVous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé 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é une 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}}. \nVous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou si vous avez retrouvé 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 : \n$1\n\nMot de passe temporaire : \n$2",
"passwordreset-emailsentemail": "Si cette adresse de courriel est associée à votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
"passwordreset-emailsentusername": "S’il y a une adresse de courriel associée à ce nom d’utilisateur, alors un courriel de réinitialisation de mot de passe sera 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|utilisatrice}} a échoué : $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|Le courriel de réinitialisation du mot de passe a été envoyé|Les courriels de réinitialisation du mot de passe ont été envoyés}}. {{PLURAL:$1|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et mots de passe est affichée}} ci-dessous.",
"passwordreset-emailerror-capture2": "L’envoi de courriel à {{GENDER:$2|l’utilisateur|l’utilisatrice}} a échoué : $1 {{PLURAL:$3|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et des mots de passe est affichée}} ci-dessous.",
"passwordreset-nocaller": "Un appelant doit être fourni",
"passwordreset-nosuchcaller": "L’appelant n’existe pas : $1",
- "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être qu'aucun fournisseur n’a été configuré ?",
+ "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être qu’aucun fournisseur n’a été configuré ?",
"passwordreset-invalideamil": "Adresse de messagerie non valide",
- "passwordreset-nodata": "Ni nom d’utilisateur ni adresse de messagerie n’ont été fournis",
+ "passwordreset-nodata": "Aucun nom d’utilisateur ou adresse de messagerie n’a été fourni",
"changeemail": "Changer ou supprimer l’adresse de courriel",
"changeemail-header": "Complétez ce formulaire pour modifier votre adresse de courriel. Si vous voulez supprimer l’association d’une adresse de courriel avec votre compte, laissez la nouvelle adresse de courriel vide lors de la soumission du formulaire.",
- "changeemail-passwordrequired": "Vous devrez saisir votre mot de passe pour confirmer cette modification.",
"changeemail-no-info": "Vous devez être connecté pour pouvoir accéder directement à cette page.",
"changeemail-oldemail": "Adresse de courriel actuelle :",
"changeemail-newemail": "Nouvelle adresse de courriel :",
"italic_tip": "Texte italique",
"link_sample": "Titre du lien",
"link_tip": "Lien interne",
- "extlink_sample": "http://www.example.com titre du lien",
+ "extlink_sample": "http://www.example.com/ titre du lien",
"extlink_tip": "Lien externe (n'oubliez pas le préfixe http://)",
"headline_sample": "Texte du titre",
"headline_tip": "Sous-titre niveau 2",
"preview": "Prévisualisation",
"showpreview": "Prévisualiser",
"showdiff": "Voir les modifications",
- "blankarticle": "<strong>Attention :</strong> La page que vous créez est vide.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la page sera créée sans aucun contenu.",
- "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre nom d’utilisateur, entre autres avantages.",
- "anonpreviewwarning": "''Vous n’êtes pas identifié{{GENDER:||e}}. Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
- "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
- "selfredirect": "<strong>Attention :</strong> Vous êtes en train de rediriger la page vers elle-même.\nVous pouvez avoir spécifié la mauvaise cible pour la redirection, ou vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera créée tout de même.",
+ "blankarticle": "<strong>Attention :</strong> la page que vous créez est vide.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la page sera créée sans aucun contenu.",
+ "anoneditwarning": "<strong>Attention :</strong> vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre nom d’utilisateur, avec d'autres avantages.",
+ "anonpreviewwarning": "<em>Vous n’êtes pas connecté{{GENDER:||e}}. Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.</em>",
+ "missingsummary": "<strong>Rappel :</strong> vous n’avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », vos modifications seront sauvegardées sans résumé.",
+ "selfredirect": "<strong>Attention :</strong> vous êtes en train de rediriger la page vers elle-même.\nVous pouvez avoir spécifié la mauvaise cible pour la redirection, ou vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera tout de même créée.",
"missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
- "missingcommentheader": "<strong>Rappel :</strong> Vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans sujet.",
+ "missingcommentheader": "<strong>Rappel :</strong> vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans sujet.",
"summary-preview": "Aperçu du résumé :",
"subject-preview": "Aperçu du sujet :",
"previewerrortext": "Une erreur s’est produite lors de la tentative de prévisualisation de vos modifications.",
"whitelistedittext": "Vous devez vous $1 pour avoir la permission de modifier le contenu.",
"confirmedittext": "Vous devez confirmer votre adresse de courriel avant de modifier les pages.\nVeuillez entrer et valider votre adresse de courriel dans vos [[Special:Preferences|préférences]].",
"nosuchsectiontitle": "Impossible de trouver la section",
- "nosuchsectiontext": "Vous avez essayé de modifier une section qui n'existe pas.\nElle a peut-être été déplacée ou supprimée depuis que vous avez lu cette page.",
+ "nosuchsectiontext": "Vous avez essayé de modifier une section qui n’existe pas.\nElle a peut-être été déplacée ou supprimée pendant que vous la consultiez.",
"loginreqtitle": "Connexion nécessaire",
"loginreqlink": "connecter",
"loginreqpagetext": "Vous devez vous $1 pour voir les autres pages.",
"accmailtitle": "Mot de passe envoyé.",
"accmailtext": "Un mot de passe généré aléatoirement pour [[User talk:$1|$1]] a été envoyé à $2.\nIl peut être modifié sur la page ''[[Special:ChangePassword|Changement de mot de passe]]'' après connexion.",
"newarticle": "(Nouveau)",
- "newarticletext": "Vous avez suivi un lien vers une page qui n’existe pas encore. \nAfin de créer cette page, entrez votre texte dans la boîte ci-après (vous pouvez consulter [$1 la page d’aide] pour plus d’informations). \nSi vous êtes arrivé{{GENDER:||e}} ici par erreur, cliquez sur le bouton '''retour''' de votre navigateur.",
+ "newarticletext": "Vous avez suivi un lien vers une page qui n’existe pas encore. \nAfin de créer cette page, entrez votre texte dans la boîte ci-après (vous pouvez consulter [$1 la page d’aide] pour plus d’informations). \nSi vous êtes arrivé{{GENDER:||e}} ici par erreur, cliquez sur le bouton <strong>Retour</strong> de votre navigateur.",
"anontalkpagetext": "----\n<em>Vous êtes sur la page de discussion d’un utilisateur anonyme qui n’a pas encore créé de compte ou qui n’en utilise pas</em>.\nPour cette raison, nous devons utiliser son adresse IP pour l’identifier.\nUne adresse IP peut être partagée par plusieurs utilisateurs.\nSi vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:CreateAccount|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d’éviter toute confusion future avec d’autres contributeurs anonymes.",
"noarticletext": "Il n’y a pour l’instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|lancer une recherche sur ce titre]] dans les autres pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les opérations liées]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer cette page]</span>.",
- "noarticletext-nopermission": "Il n'y a pour l'instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|faire une recherche sur ce titre]] dans les autres pages,\nou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les journaux associés]</span>.",
- "missing-revision": "La révision n° $1 de la page intitulée « {{FULLPAGENAME}} » n'existe pas.\n\nCela survient en général en suivant un lien historique obsolète vers une page qui a été supprimée.\nVous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
- "userpage-userdoesnotexist": "Le compte utilisateur « <nowiki>$1</nowiki> » n'est pas enregistré. Veuillez vérifier que vous voulez créer cette page.",
+ "noarticletext-nopermission": "Il n'y a pour l'instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|faire une recherche sur ce titre]] dans les autres pages,\nou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les journaux associés]</span>, mais vous n'avez pas la permission de créer cette page.",
+ "missing-revision": "La révision nº $1 de la page intitulée « {{FULLPAGENAME}} » nâ\80\99existe pas.\n\nCela survient en général en suivant un lien historique obsolète vers une page qui a été supprimée.\nVous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
+ "userpage-userdoesnotexist": "Le compte utilisateur « <nowiki>$1</nowiki> » n’est pas enregistré. Veuillez vérifier que vous voulez créer cette page.",
"userpage-userdoesnotexist-view": "Le compte utilisateur « $1 » n'est pas enregistré.",
"blocked-notice-logextract": "Cet utilisateur est actuellement bloqué.\nLa dernière entrée du journal des blocages est indiquée ci-dessous à titre d’information :",
- "clearyourcache": "<strong>Note :</strong> après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.\n* <strong>Firefox / Safari :</strong> Maintenez la touche <em>Maj</em> (<em>Shift</em>) en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> sur un Mac) ;\n* <strong>Google Chrome :</strong> Appuyez sur <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> sur un Mac) ;\n* <strong>Internet Explorer :</strong> Maintenez la touche <em>Ctrl</em> en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> ;\n* <strong>Opera :</strong> Allez dans <em>Menu → Settings</em> (<em>Opera → Préférences</em> sur un Mac) et ensuite à <em>Confidentialité & sécurité → Effacer les données d'exploration → Images et fichiers en cache</em>.",
- "usercssyoucanpreview": "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l'enregistrer.",
- "userjsyoucanpreview": "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de l'enregistrer.",
- "usercsspreview": "'''Rappelez-vous que vous n'êtes qu'en train de prévisualiser votre propre feuille CSS.'''\n'''Elle n'a pas encore été enregistrée !'''",
- "userjspreview": "'''Rappelez-vous que vous êtes en train de visualiser ou de tester votre code JavaScript et qu'il n'a pas encore été enregistré !'''",
- "sitecsspreview": "'''Souvenez-vous que vous êtes seulement en train de prévisualiser cette feuille de style.'''\n'''Elle n'a pas encore été enregistrée !'''",
- "sitejspreview": "'''Souvenez-vous que vous êtes seulement en train de prévisualiser ce code JavaScript.'''\n'''Il n'a pas encore été enregistré !'''",
- "userinvalidcssjstitle": "'''Attention :''' il n'existe pas d'habillage « $1 ». Rappelez-vous que les pages personnelles avec extensions .css et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
+ "clearyourcache": "<strong>Note :</strong> après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.\n* <strong>Firefox / Safari :</strong> maintenez la touche <em>Maj</em> (<em>Shift</em>) en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> sur un Mac) \n* <strong>Google Chrome :</strong> appuyez sur <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> sur un Mac) \n* <strong>Internet Explorer :</strong> maintenez la touche <em>Ctrl</em> en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> \n* <strong>Opera :</strong> allez dans <em>Menu → Settings</em> (<em>Opera → Préférences</em> sur un Mac) et ensuite à <em>Confidentialité & sécurité → Effacer les données d’exploration → Images et fichiers en cache</em>.",
+ "usercssyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l’enregistrer.",
+ "userjsyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de l’enregistrer.",
+ "usercsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser votre propre feuille CSS. \nElle n’a pas encore été enregistrée !</strong>",
+ "userjspreview": "<strong>Rappelez-vous que vous ne faites que visualiser ou tester votre code JavaScript.\nIl n’a pas encore été enregistré !</strong>",
+ "sitecsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser cette feuille de style. \nElle n’a pas encore été enregistrée !</strong>",
+ "sitejspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser ce code JavaScript. \nIl n’a pas encore été enregistré !</strong>",
+ "userinvalidcssjstitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ». \nLes pages personnelles avec extensions .css et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
"updated": "(Mis à jour)",
- "note": "'''Note :'''",
- "previewnote": "'''Rappelez-vous que ce n'est qu'une prévisualisation.'''\nVos modifications n'ont pas encore été enregistrées !",
+ "note": "<strong>Note :</strong>",
+ "previewnote": "<strong>Rappelez-vous que ce n’est qu’une prévisualisation.</strong>\nVos modifications n’ont pas encore été enregistrées !",
"continue-editing": "Aller à la zone de modification",
- "previewconflict": "Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu'il apparaîtra si vous choisissez de le publier.",
+ "previewconflict": "Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu’il apparaîtra si vous choisissez de le publier.",
"session_fail_preview": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayer.</strong>\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant, et vérifiez que votre navigateur accepte les cookies de ce site.",
"session_fail_preview_html": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\n<em>Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation est masquée afin de prévenir les attaques par JavaScript.</em>\n\n<strong>Si la tentative de modification est légitime, veuillez réessayer.</strong>\nSi cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous, et vérifiez que votre navigateur accepte les cookies de ce site.",
- "token_suffix_mismatch": "'''Votre modification n'a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l'identifiant de modification.'''\nCe rejet est nécessaire pour empêcher la corruption du texte de la page.\nCe problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
- "edit_form_incomplete": "'''Certaines parties du formulaire de modification n'ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
+ "token_suffix_mismatch": "<strong>Votre modification n’a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l’identifiant de modification.</strong>\nCe rejet est nécessaire pour empêcher la corruption du texte de la page.\nCe problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
+ "edit_form_incomplete": "<strong>Certaines parties du formulaire de modification n’ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.</strong>",
"editing": "Modification de $1",
"creating": "Création de $1",
"editingsection": "Modification de $1 (section)",
"editingcomment": "Modification de $1 (nouvelle section)",
"editconflict": "Conflit de modification : $1",
- "explainconflict": "Cette page a été changée après que vous ayez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu'il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n'''Seul''' le texte de la zone supérieure sera sauvegardé si vous cliquez sur « {{int:savearticle}} ».",
+ "explainconflict": "Cette page a été changée après que vous ayez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « {{int:savearticle}} ».",
"yourtext": "Votre texte",
"storedversion": "La version enregistrée",
- "nonunicodebrowser": "'''Attention : Votre navigateur ne supporte pas l'Unicode.'''\nUne solution de rechange a été trouvée pour vous permettre de modifier en toute sûreté une page : les caractères non-ASCII apparaîtront dans votre boîte de modification en tant que codes hexadécimaux. Vous devriez utiliser un navigateur plus récent.",
- "editingold": "'''Attention : vous êtes en train de modifier une ancienne version de cette page.\nSi vous la publiez, toutes les modifications effectuées depuis cette version seront perdues.'''",
+ "nonunicodebrowser": "<strong>Attention : votre navigateur ne supporte pas l’Unicode.</strong>\nUn palliatif est en place vous permettant de modifier les pages en toute sécurité, faisant apparaître les caractères non-ASCII sous forme hexadécimale dans la boîte de modification.",
+ "editingold": "<strong>Attention : vous êtes en train de modifier une ancienne version de cette page.</strong>\nSi vous la publiez, toutes les modifications effectuées depuis cette version seront perdues.",
"yourdiff": "Différences",
- "copyrightwarning": "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br />\nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. '''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
- "copyrightwarning2": "Toutes les contributions à {{SITENAME}} peuvent être modifiées ou supprimées par d’autres utilisateurs. Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br \n/>Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. (voir $1 pour plus de détails).\n'''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
+ "copyrightwarning": "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). \nSi vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br /> \nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public ou d’une ressource libre similaire. \n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
+ "copyrightwarning2": "Notez bien que toutes les contributions à {{SITENAME}} peuvent être modifiées, transformées ou supprimées par d’autres utilisateurs. \nSi vous ne désirez pas que vos écrits soient modifiés contre votre gré, merci de ne pas les soumettre ici.<br /> \nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. (voir $1 pour plus de détails).\n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
"editpage-cannot-use-custom-model": "Le modèle de contenu de cette page ne peut pas être modifié.",
"longpageerror": "<strong>Erreur : Le texte que vous avez soumis fait {{PLURAL:$1|un Kio|$1 Kio}}, ce qui dépasse la limite fixée à {{PLURAL:$2|un Kio|$2 Kio}}.</strong>\nIl ne peut pas être sauvegardé.",
"readonlywarning": "<strong>AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.</strong>\nVous pouvez copier et coller votre texte dans un fichier texte et l’enregistrer pour plus tard.\n\nL’administrateur système ayant verrouillé la base de données a donné l’explication suivante : $1",
- "protectedpagewarning": "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs ayant le statut d'administrateur peuvent la modifier.'''<br />\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
- "semiprotectedpagewarning": "'''Note :''' Cette page a été protégée de telle façon que seuls les contributeurs enregistrés puissent la modifier. La dernière entrée du journal est affichée ci-dessous pour référence :",
+ "protectedpagewarning": "<strong>AVERTISSEMENT : cette page est protégée afin que seuls les utilisateurs ayant le statut d'administrateur puissent la modifier.</strong>\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
+ "semiprotectedpagewarning": "<strong>Note :</strong>Cette page a été protégée de telle façon que seuls les contributeurs enregistrés puissent la modifier. \nLa dernière entrée du journal est affichée ci-dessous pour référence :",
"cascadeprotectedwarning": "'''ATTENTION :''' Cette page a été protégée de manière à ce que seuls les administrateurs puissent la modifier car elle est transcluse dans {{PLURAL:$1|la page protégée suivante, qui a|les pages protégées suivantes, qui ont}} la « protection en cascade » activée :",
- "titleprotectedwarning": "'''ATTENTION : Cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.''' La dernière entrée du journal est affichée ci-dessous pour référence :",
+ "titleprotectedwarning": "<strong>ATTENTION : Cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.</strong> \nLa dernière entrée du journal est affichée ci-dessous pour référence :",
"templatesused": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} par cette page :",
"templatesusedpreview": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette prévisualisation :",
"templatesusedsection": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette section :",
"nocreatetext": "{{SITENAME}} a restreint la possibilité de créer de nouvelles pages.\nVous pouvez revenir en arrière et modifier une page existante, ou bien [[Special:UserLogin|vous connecter ou créer un compte]].",
"nocreate-loggedin": "Vous n'avez pas la permission de créer de nouvelles pages.",
"sectioneditnotsupported-title": "Modification de section non prise en charge",
- "sectioneditnotsupported-text": "La modification d'une section n'est pas prise en charge pour cette page.",
+ "sectioneditnotsupported-text": "La modification d’une section n’est pas prise en charge pour cette page.",
"permissionserrors": "Erreur de permissions",
"permissionserrorstext": "Vous n'avez pas la permission d'effectuer l'opération demandée pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
"permissionserrorstext-withaction": "Vous ne pouvez pas $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
"contentmodelediterror": "Vous ne pouvez pas modifier cette révision car son modèle de contenu est <code>$1</code>, ce qui diffère du modèle de contenu actuel de la page <code>$2</code>.",
- "recreate-moveddeleted-warn": "'''Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.'''\n\nAssurez-vous qu'il est pertinent de poursuivre les modifications sur cette page. Le journal des suppressions et des déplacements est affiché ci-dessous :",
- "moveddeleted-notice": "Cette page a été supprimée. Le journal des suppressions et des déplacements est affiché ci-dessous pour référence.",
- "moveddeleted-notice-recent": "Désolé, cette page a été récemment supprimée (dans les dernières 24 heures).\nLes journaux des suppressions et des renommages pour la page sont fournis ci-dessous à titre d’information.",
+ "recreate-moveddeleted-warn": "<strong>Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.</strong>\n\nAssurez-vous qu'il est pertinent de poursuivre les modifications sur cette page. \nLe journal des suppressions et des déplacements pour cette page est affiché ci-dessous à titre d'information :",
+ "moveddeleted-notice": "Cette page a été supprimée. \nLe journal des suppressions et des déplacements de la page est affiché ci-dessous pour référence.",
+ "moveddeleted-notice-recent": "Désolé, cette page a été récemment supprimée (dans les dernières 24 heures).\nLes journaux des suppressions et des renommages pour la page sont fournis ci-dessous pour référence.",
"log-fulllog": "Voir le journal complet",
- "edit-hook-aborted": "Échec de la modification par une extension.\nCause inconnue",
- "edit-gone-missing": "N'a pas pu mettre à jour la page.\nIl semble qu'elle ait été supprimée.",
+ "edit-hook-aborted": "Échec de la modification par une extension.\nAucune explication n’a été retournée.",
+ "edit-gone-missing": "N’a pas pu mettre à jour la page.\nIl semble qu’elle ait été supprimée.",
"edit-conflict": "Conflit de modification.",
- "edit-no-change": "Votre modification a été ignorée car aucun changement n'a été fait au texte.",
+ "edit-no-change": "Votre modification a été ignorée car aucun changement n’a été fait au texte.",
"postedit-confirmation-created": "La page a été créée.",
"postedit-confirmation-restored": "La page a été restaurée.",
"postedit-confirmation-saved": "Votre modification a été enregistrée.",
- "edit-already-exists": "La nouvelle page n'a pas pu être créée.\nElle existe déjà.",
+ "edit-already-exists": "La nouvelle page n’a pas pu être créée.\nElle existe déjà.",
"defaultmessagetext": "Message par défaut",
"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",
"duplicate-args-warning": "<strong>Avertissement :</strong> [[:$1]] appelle [[:$2]] avec plus d'une valeur pour le paramètre « $3 ». Seule la dernière valeur fournie sera utilisée.",
"duplicate-args-category": "Pages utilisant des arguments dupliqués dans les appels de modèle",
"duplicate-args-category-desc": "La page contient des appels de modèle qui utilisent des arguments dupliqués, comme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
- "expensive-parserfunction-warning": "Attention : cette page contient de trop nombreux appels à des fonctions coûteuses de l'analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a maintenant $1.",
+ "expensive-parserfunction-warning": "<strong>Attention :</strong> cette page contient de trop nombreux appels à des fonctions coûteuses de l’analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maintenant $1.",
"expensive-parserfunction-category": "Pages avec trop d'appels dispendieux de fonctions de l'analyseur syntaxique",
- "post-expand-template-inclusion-warning": "Attention : Cette page contient trop d'inclusions de modèles. Certaines inclusions ne seront pas effectuées.",
+ "post-expand-template-inclusion-warning": "<strong>Attention :</strong> cette page contient trop d’inclusions de modèles. Certaines inclusions ne seront pas effectuées.",
"post-expand-template-inclusion-category": "Pages contenant trop d'inclusions de modèles",
- "post-expand-template-argument-warning": "Attention : Cette page contient au moins un paramètre de modèle dont l'inclusion est rendue impossible. Après extension, celui-ci aurait produit un résultat trop long, il n'a donc pas été inclus.",
+ "post-expand-template-argument-warning": "<strong>Attention :</strong> cette page contient au moins un paramètre de modèle dont la taille après expansion est trop importante. \nCes arguments n’ont donc pas été inclus.",
"post-expand-template-argument-category": "Pages contenant des paramètres de modèle non évalués",
"parser-template-loop-warning": "Modèle en boucle détecté : [[$1]]",
- "parser-template-recursion-depth-warning": "Limite de profondeur des appels de modèles dépassée ($1)",
+ "parser-template-recursion-depth-warning": "Limite de profondeur des appels récursifs 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": "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",
+ "node-count-exceeded-category": "Pages dépassant le nombre de nœuds maximal",
+ "node-count-exceeded-category-desc": "Ces pages dépassent le nombre maximal de nœuds.",
+ "node-count-exceeded-warning": "La page dépasse le nombre de nœuds maximal.",
+ "expansion-depth-exceeded-category": "Pages dépassant la profondeur d'expansion maximale",
"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",
+ "expansion-depth-exceeded-warning": "Page dépassant la profondeur d’expansion maximale",
"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)",
"converter-manual-rule-error": "Erreur détectée dans la règle manuelle de conversion de langue",
- "undo-success": "Cette modification va être défaite. Veuillez vérifier les modifications ci-dessous, puis publier si c’est bien ce que vous voulez faire.",
+ "undo-success": "Cette modification va être annulée.\nVeuillez vérifier les différences ci-dessous, puis publier l’annulation si c’est bien ce que vous voulez faire.",
"undo-failure": "Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.",
"undo-norev": "La modification n’a pas pu être défaite parce qu’elle est inexistante ou qu’elle a été supprimée.",
"undo-nochange": "Il semblerait que la modification ait déjà été annulée.",
"undo-summary": "Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
"undo-summary-username-hidden": "Annuler la révision $1 par un utilisateur masqué",
- "cantcreateaccounttitle": "Vous ne pouvez pas créer de compte.",
- "cantcreateaccount-text": "La création de compte depuis cette adresse IP (<b>$1</b>) a été bloquée par [[User:$3|$3]].\n\nLa raison donnée était ''$2''.",
- "cantcreateaccount-range-text": "La création de compte depuis les adresses IP dans la plage <strong>$1</strong>, qui comprend votre adresse IP (<strong>$4</strong>), ont été bloquées par [[User:$3|$3]].\n\nLe motif fourni par $3 est <em>$2</em>",
+ "cantcreateaccount-text": "La création de compte depuis cette adresse IP (<strong>$1</strong>) a été bloquée par [[User:$3|$3]]. \n\nLa raison donnée par $3 était : <em>$2</em>",
+ "cantcreateaccount-range-text": "La création de compte depuis les adresses IP de la plage <strong>$1</strong>, où se trouve votre adresse IP (<strong>$4</strong>), a été bloquée par [[User:$3|$3]].\n\nLe motif fourni par $3 est <em>$2</em>",
"viewpagelogs": "Voir les opérations sur cette page",
- "nohistory": "Il n'existe pas d'historique pour cette page.",
+ "nohistory": "Il n’existe pas d’historique des modifications pour cette page.",
"currentrev": "Version actuelle",
- "currentrev-asof": "Version actuelle en date du $1",
+ "currentrev-asof": "Version actuelle datée du $1",
"revisionasof": "Version du $1",
- "revision-info": "Révision de $1 par {{GENDER:$6|$2}}$7",
+ "revision-info": "Révision datée du $1 par {{GENDER:$6|$2}}$7",
"previousrevision": "← Version précédente",
"nextrevision": "Version suivante →",
"currentrevisionlink": "Voir la version actuelle",
"last": "diff",
"page_first": "première",
"page_last": "dernière",
- "histlegend": "Légende : ({{int:cur}}) = différence avec la version actuelle, ({{int:last}}) = différence avec la version précédente, <b>{{int:minoreditletter}}</b> = modification mineure",
+ "histlegend": "Diff de sélection: cochez les boîtes radio des révisions à comparer et appuyez sur entrée ou sur le bouton en bas.<br />\nLégende: <strong>({{int:cur}})</strong> = différence avec la dernière révision, <strong>({{int:last}})</strong> = différence avec la précédente révision, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
"history-fieldset-title": "Naviguer dans l’historique",
- "history-show-deleted": "Masqués seulement",
+ "history-show-deleted": "Supprimés seulement",
"histfirst": "les plus anciennes",
"histlast": "les plus récentes",
"historysize": "($1 octet{{PLURAL:$1||s}})",
"historyempty": "(vide)",
"history-feed-title": "Historique des versions",
- "history-feed-description": "Historique pour cette page sur le wiki",
+ "history-feed-description": "Historique des versions pour cette page sur le wiki",
"history-feed-item-nocomment": "$1 le $2",
- "history-feed-empty": "La page demandée n'existe pas.\nElle a peut-être été effacée ou renommée.\nEssayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en rapport.",
+ "history-feed-empty": "La page demandée n'existe pas.\nElle a peut-être été effacée ou renommée.\nEssayez de [[Special:Search|rechercher sur le wiki]] pour trouver de nouvelles pages en rapport avec le sujet.",
"history-edit-tags": "Modifier les balises des révisions sélectionnées",
"rev-deleted-comment": "(résumé de modification retiré)",
"rev-deleted-user": "(nom d'utilisateur retiré)",
- "rev-deleted-event": "(détails de l’entrée retirée)",
- "rev-deleted-user-contribs": "[nom d'utilisateur ou adresse IP retiré - modification masquée sur les contributions]",
- "rev-deleted-text-permission": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
+ "rev-deleted-event": "(détails de l’historique retirés)",
+ "rev-deleted-user-contribs": "[nom d’utilisateur ou adresse IP retiré – modification masquée dans les contributions]",
+ "rev-deleted-text-permission": "Cette version de la page a été <strong>effacée</strong>.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
"rev-suppressed-text-permission": "Cette version de la page a été <strong>masquée</strong>.\nLes détails se trouvent dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des masquages].",
"rev-deleted-text-unhide": "Cette version de la page a été <strong>supprimée</strong>.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} le journal des suppressions].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
"rev-suppressed-text-unhide": "Cette version de la page a été <strong>masquée</strong>.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} le journal des masquages].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
"logdelete-selected": "{{PLURAL:$1|Événement d'historique sélectionné|Événements d'historique sélectionnés}} :",
"revdelete-text-text": "Les révisions supprimées continueront à apparaître dans l’historique de la page, mais une partie de leur contenu sera inaccessible au public.",
"revdelete-text-file": "Les versions de fichier supprimées continueront à apparaître dans l’historique des fichiers, mais une partie de leur contenu sera indisponible au public.",
- "logdelete-text": "Les évènements du journal supprimés continueront à apparaître dans les journaux, mais une partie de leur contenu sera indisponible au public.",
+ "logdelete-text": "Les évènements supprimés du journal continueront à apparaître dans les journaux, mais une partie de leur contenu sera indisponible au public.",
"revdelete-text-others": "Les autres administrateurs seront toujours en mesure d'accéder au contenu caché et le restaurer, à moins que des restrictions supplémentaires soient fixées.",
"revdelete-confirm": "Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences, et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].",
- "revdelete-suppress-text": "La suppression ne doit être utilisée '''que''' dans les cas suivants :\n* Informations potentiellement diffamatoires\n* Informations personnelles inappropriées\n*: ''adresse, numéro de téléphone, numéro de sécurité sociale, …''",
- "revdelete-legend": "Mettre en place des restrictions de visibilité :",
+ "revdelete-suppress-text": "La suppression ne doit être utilisée <strong>que</strong> dans les cas suivants :\n* informations potentiellement diffamatoires\n* informations personnelles inappropriées\n*: <em>adresse, numéro de téléphone, numéro de sécurité sociale, …</em>",
+ "revdelete-legend": "Mettre en place des restrictions de visibilité",
"revdelete-hide-text": "Texte de la révision",
"revdelete-hide-image": "Masquer le contenu du fichier",
"revdelete-hide-name": "Masquer la cible et les paramètres",
"revdelete-radio-same": "(ne pas changer)",
"revdelete-radio-set": "Masqué",
"revdelete-radio-unset": "Visible",
- "revdelete-suppress": "Masquer également les données pour les administrateurs",
+ "revdelete-suppress": "Supprimer également les données des administrateurs",
"revdelete-unsuppress": "Enlever les restrictions sur les versions restaurées",
"revdelete-log": "Motif :",
"revdelete-submit": "Appliquer {{PLURAL:$1|à la révision sélectionnée|aux révisions sélectionnées}}",
"revdelete-no-change": "'''Attention :''' L'élément daté du $1 à $2 a déjà les paramètres de visibilité demandés.",
"revdelete-concurrent-change": "Erreur lors de la modification de l'élément daté du $1 à $2 : son statut a été changé par quelqu'un d'autre pendant que vous le modifiez.\nVérifiez les journaux.",
"revdelete-only-restricted": "Erreur lors de la suppression de l'entrée datée du $1 à $2 : vous ne pouvez pas supprimer ces éléments aux administrateurs sans également sélectionner les autres options de suppression.",
- "revdelete-reason-dropdown": "* Raisons courantes de suppression :\n** Violation des droits d'auteurs ;\n** Commentaires ou renseignements personnels inappropriés ;\n** Informations potentiellement diffamatoires.",
+ "revdelete-reason-dropdown": "* Raisons courantes de suppression \n** Violation des droits d'auteurs \n** Commentaires ou renseignements personnels inappropriés \n** Nom d'utilisateur inapproprié\n** Informations potentiellement diffamatoires",
"revdelete-otherreason": "Autre raison / raison supplémentaire :",
"revdelete-reasonotherlist": "Autre raison",
"revdelete-edit-reasonlist": "Modifier les motifs fréquents de suppression",
"mergehistory-from": "Page d'origine :",
"mergehistory-into": "Page de destination :",
"mergehistory-list": "Historique fusionnable des modifications",
- "mergehistory-merge": "Les versions suivantes de [[:$1]] peuvent être fusionnées avec [[:$2]]. Utilisez la colonne de boutons radio pour fusionner uniquement les versions créées du début jusqu'à la date indiquée. Notez bien que l'utilisation des liens de navigation réinitialisera cette colonne.",
+ "mergehistory-merge": "Les versions suivantes de [[:$1]] peuvent être fusionnées avec [[:$2]]. \nUtilisez la colonne de boutons radio pour fusionner uniquement les versions créées du début jusqu'à la date indiquée. \nNotez bien que l'utilisation des liens de navigation réinitialisera cette colonne.",
"mergehistory-go": "Voir les modifications qui peuvent être fusionnées",
"mergehistory-submit": "Fusionner les versions",
"mergehistory-empty": "Aucune version ne peut être fusionnée.",
"mergehistory-no-destination": "La page de destination $1 n'existe pas.",
"mergehistory-invalid-source": "La page d'origine doit avoir un titre valide.",
"mergehistory-invalid-destination": "La page de destination doit avoir un titre valide.",
- "mergehistory-autocomment": "[[:$1]] fusionnée avec [[:$2]]",
- "mergehistory-comment": "[[:$1]] fusionnée avec [[:$2]] : $3",
- "mergehistory-same-destination": "Les pages d'origine et de destination ne peuvent pas être la même",
+ "mergehistory-autocomment": "[[:$1]] fusionnée dans [[:$2]]",
+ "mergehistory-comment": "[[:$1]] fusionnée dans [[:$2]] : $3",
+ "mergehistory-same-destination": "Les pages d'origine et de destination ne peuvent pas être les mêmes",
"mergehistory-reason": "Motif :",
"mergehistory-revisionrow": "$1 ($2) $3 — $4 $5 $6",
"mergelog": "Journal des fusions",
"revertmerge": "Séparer",
- "mergelogpagetext": "Voici la liste des plus récentes fusions de l’historique d’une page dans celui d’une autre.",
+ "mergelogpagetext": "Voici la liste des fusions les plus récentes de l’historique d’une page dans celui d’une autre.",
"history-title": "$1 : Historique des versions",
"difference-title": "$1 : Différence entre versions",
"difference-title-multipage": "Différences entre les pages « $1 » et « $2 »",
"nextn-title": "$1 {{PLURAL:$1|résultat suivant|résultats suivants}}",
"shown-title": "Afficher $1 résultat{{PLURAL:$1||s}} par page",
"viewprevnext": "Voir ($1 {{int:pipe-separator}} $2) ($3).",
- "searchmenu-exists": "'''Il existe une page nommée « [[:$1]] » sur ce wiki.''' {{PLURAL:$2|0=|Voyez également les autres résultats de votre recherche.}}",
- "searchmenu-new": "<strong>Créer la page « [[:$1|$1]] » sur ce wiki !</strong> {{PLURAL:$2|0=|Voyez également la page trouvée avec votre recherche.|Voyez également les résultats de votre recherche.}}",
+ "searchmenu-exists": "<strong>Il existe une page nommée « [[:$1]] » sur ce wiki.</strong> {{PLURAL:$2|0=|Voyez également les autres résultats de votre recherche.}}",
+ "searchmenu-new": "<strong>Créer la page « [[:$1|$1]] » sur ce wiki !</strong> {{PLURAL:$2|0=Voyez également la page trouvée avec votre recherche.|Voyez également les résultats de votre recherche.}}",
"searchprofile-articles": "Pages de contenu",
"searchprofile-images": "Multimédia",
"searchprofile-everything": "Tout",
"searchprofile-articles-tooltip": "Rechercher dans $1",
"searchprofile-images-tooltip": "Rechercher des fichiers multimédias",
"searchprofile-everything-tooltip": "Rechercher dans tout le site (y compris dans les pages de discussion)",
- "searchprofile-advanced-tooltip": "Choisir les espaces de noms pour la recherche",
+ "searchprofile-advanced-tooltip": "Chercher dans les espaces de noms clients",
"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-redirect": "(redirection depuis $1)",
"prefs-editwatchlist-clear": "Effacer la liste de suivi",
"prefs-watchlist-days": "Nombre de jours à afficher dans la liste de suivi :",
"prefs-watchlist-days-max": "(maximum $1 jour{{PLURAL:$1||s}})",
- "prefs-watchlist-edits": "Nombre de modifications à afficher dans la liste de suivi étendue :",
+ "prefs-watchlist-edits": "Nombre maximum de modifications à afficher dans la liste de suivi étendue :",
"prefs-watchlist-edits-max": "Nombre maximum : 1000",
"prefs-watchlist-token": "Jeton pour la liste de suivi :",
"prefs-misc": "Préférences diverses",
"prefs-emailconfirm-label": "Confirmation du courriel :",
"youremail": "Courriel :",
"username": "{{GENDER:$1|Nom d'utilisateur|Nom d'utilisatrice}} :",
- "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|du groupe|des groupes}}:",
+ "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|du groupe|des groupes}} :",
"prefs-registration": "Date d'inscription :",
"yourrealname": "Nom réel :",
"yourlanguage": "Langue :",
"yourvariant": "Variante de la langue du contenu :",
- "prefs-help-variant": "Votre variante ou orthographe préféré dans lequel afficher les pages de contenu de ce wiki.",
- "yournick": "Signature pour les discussions :",
+ "prefs-help-variant": "Votre variante ou orthographe préférée dans laquelle afficher les pages de contenu de ce wiki.",
+ "yournick": "Nouvelle signature :",
"prefs-help-signature": "Les commentaires sur les pages de discussion doivent être signés avec « <nowiki>~~~~</nowiki> », qui sera remplacé par votre signature et un horodatage.",
"badsig": "Signature brute incorrecte.\nVérifiez les balises HTML.",
"badsiglength": "Votre signature est trop longue.\nElle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.",
"gender-unknown": "Lorsqu’il fera mention de vous, le logiciel utilisera des mots de genre neutre, quand c’est possible",
"gender-male": "Il modifie des pages du wiki",
"gender-female": "Elle modifie des pages du wiki",
- "prefs-help-gender": "Définir cette préférence est facultatif.\nCe logiciel utilise sa valeur pour s’adresser à vous et vous mentionner aux autres en utilisant le bon genre grammatical.\nCette information sera publique.",
+ "prefs-help-gender": "Définir cette préférence est facultatif.\nLe logiciel utilise la valeur pour s’adresser à vous ou pour vous mentionner aux autres en utilisant le bon genre grammatical.\nCette information sera publique.",
"email": "Courriel",
"prefs-help-realname": "Le vrai nom est facultatif.\nS’il est fourni, il sera utilisé pour vous attribuer vos contributions.",
"prefs-help-email": "L'adresse de courriel est facultative, mais elle est nécessaire pour réinitialiser votre mot de passe, si vous veniez à l'oublier.",
- "prefs-help-email-others": "Vous pourriez aussi choisir de laisser les autres vous contacter sur votre page de discussion utilisateur sans que soit nécessaire de révéler votre identité.",
+ "prefs-help-email-others": "Vous pouvez aussi choisir de laisser les autres vous contacter par courriel via un lien sur votre page de discussion ou page utilisateur. \nVotre adresse courriel n'est pas révélée quand les autres utilisateurs vous contactent.",
"prefs-help-email-required": "Une adresse de courriel est requise.",
"prefs-info": "Informations de base",
"prefs-i18n": "Internationalisation",
"userrights-groupsmember-auto": "Membre implicite de :",
"userrights-groups-help": "Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :\n* Une case cochée signifie que l’utilisat{{GENDER:$1|eur|rice}} se trouve dans ce groupe.\n* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.\n* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.",
"userrights-reason": "Motif :",
- "userrights-no-interwiki": "Vous n'avez pas la permission de modifier des droits d'utilisateurs sur d'autres wikis.",
- "userrights-nodatabase": "La base de donnée « $1 » n'existe pas ou n'est pas locale.",
- "userrights-nologin": "Vous devez vous [[Special:UserLogin|connecter]] avec un compte d'administrateur pour modifier des droits d'utilisateur.",
- "userrights-notallowed": "Vous n’avez pas la permission d’ajouter ou supprimer des droits d’utilisateur.",
+ "userrights-no-interwiki": "Vous n'avez pas la permission de modifier les droits utilisateur sur d'autres wikis.",
+ "userrights-nodatabase": "La base de données « $1 » n'existe pas ou n'est pas locale.",
+ "userrights-nologin": "Vous devez vous [[Special:UserLogin|connecter]] avec un compte d'administrateur pour modifier les droits utilisateur.",
+ "userrights-notallowed": "Vous n’avez pas la permission d’ajouter ou de supprimer des droits utilisateur.",
"userrights-changeable-col": "Les groupes que vous pouvez modifier",
"userrights-unchangeable-col": "Les groupes que vous ne pouvez pas modifier",
- "userrights-conflict": "Conflit de modification de droits utilisateur ! Veuillez relire et confirmer vos modifications.",
+ "userrights-conflict": "Conflit de modification des droits utilisateur ! Veuillez relire et confirmer vos modifications.",
"userrights-removed-self": "Vous avez supprimé vos propres droits. Par conséquent, vous ne pouvez plus accéder à cette page.",
"group": "Groupe :",
"group-user": "Utilisateurs",
"right-createtalk": "Créer des pages de discussion",
"right-createaccount": "Créer des comptes utilisateur",
"right-autocreateaccount": "Connexion automatique avec un compte utilisateur externe",
- "right-minoredit": "Marquer ses modifications comme mineures",
+ "right-minoredit": "Marquer les modifications comme mineures",
"right-move": "Renommer des pages",
"right-move-subpages": "Renommer des pages avec leurs sous-pages",
"right-move-rootuserpages": "Renommer la page principale d'un utilisateur",
"right-move-categorypages": "Renommer des pages de catégorie",
"right-movefile": "Renommer des fichiers",
- "right-suppressredirect": "Ne pas créer de redirection depuis le titre d'origine en renommant une page",
+ "right-suppressredirect": "Ne pas créer de redirection depuis le titre d'origine en renommant les pages",
"right-upload": "Importer des fichiers",
"right-reupload": "Écraser un fichier existant",
"right-reupload-own": "Écraser un fichier que l'on a soi-même importé",
- "right-reupload-shared": "Écraser localement un fichier présent sur un dépôt partagé",
+ "right-reupload-shared": "Écraser localement des fichiers présents sur un dépôt partagé",
"right-upload_by_url": "Importer un fichier depuis une adresse URL",
- "right-purge": "Purger le cache des pages sans demande de confirmation",
+ "right-purge": "Effacer une page du cache local sans demander de confirmation",
"right-autoconfirmed": "Ne pas être affecté par les limitations de débit liées aux adresses IP",
"right-bot": "Être traité comme un processus automatisé",
"right-nominornewtalk": "Ne pas déclencher la notification de nouveau message lorsqu'on effectue une modification mineure sur la page de discussion d'un utilisateur",
"right-writeapi": "Utiliser l'API de modification du wiki",
"right-delete": "Supprimer des pages",
"right-bigdelete": "Supprimer des pages ayant un gros historique",
- "right-deletelogentry": "Supprimer et restaurer une entrée particulière du journal",
- "right-deleterevision": "Supprimer ou restaurer une version particulière d'une page",
+ "right-deletelogentry": "Supprimer et restaurer des entrées particulières du journal",
+ "right-deleterevision": "Supprimer ou restaurer des versions particulières de pages",
"right-deletedhistory": "Voir les entrées des historiques supprimées, mais sans leur texte",
"right-deletedtext": "Voir le texte supprimé et les différences entre les versions supprimées",
"right-browsearchive": "Rechercher des pages supprimées",
"right-editmyuserjs": "Modifier vos propres fichiers JavaScript utilisateur",
"right-viewmywatchlist": "Afficher votre propre liste de suivi",
"right-editmywatchlist": "Modifier votre propre liste de suivi. Remarquez que certaines actions ajouteront encore des pages sans ce droit.",
- "right-viewmyprivateinfo": "Voir vos données personnelles (exemple adresse, vrai nom)",
- "right-editmyprivateinfo": "Modifier vos données personnelles (exemple adresse, vrai nom)",
+ "right-viewmyprivateinfo": "Voir vos données personnelles (par exemple votre adresse, votre vrai nom)",
+ "right-editmyprivateinfo": "Modifier vos données personnelles (par exemple votre adresse, votre vrai nom)",
"right-editmyoptions": "Modifier vos préférences",
"right-rollback": "Révoquer rapidement les modifications du dernier contributeur d'une page particulière",
"right-markbotedits": "Marquer des modifications révoquées comme ayant été faites par un robot.",
"right-noratelimit": "Ne pas être affecté par les limites de taux",
"right-import": "Importer des pages depuis d'autres wikis",
"right-importupload": "Importer des pages depuis un fichier",
- "right-patrol": "Marquer des modifications des autres comme relues",
+ "right-patrol": "Marquer les modifications des autres comme étant relues",
"right-autopatrol": "Avoir ses modifications automatiquement marquées comme relues",
"right-patrolmarks": "Voir les marquages de relecture dans les modifications récentes",
"right-unwatchedpages": "Voir la liste des pages non suivies",
"right-mergehistory": "Fusionner les historiques des pages",
"right-userrights": "Modifier tous les droits d'un utilisateur",
- "right-userrights-interwiki": "Modifier les droits d'utilisateurs qui sont sur un autre wiki",
+ "right-userrights-interwiki": "Modifier les droits des utilisateurs qui sont sur d'autres wikis",
"right-siteadmin": "Verrouiller ou déverrouiller la base de données",
"right-override-export-depth": "Exporter les pages en incluant les pages liées jusqu'à une profondeur de 5 niveaux",
"right-sendemail": "Envoyer un courriel aux autres utilisateurs",
"grant-editprotected": "Modifier des pages protégées",
"grant-highvolume": "Modification de gros volumes",
"grant-oversight": "Masquer les utilisateurs et supprimer les révisions",
- "grant-patrol": "Patrouiller les modifications aux pages",
+ "grant-patrol": "Vérifier les modifications de pages",
"grant-protect": "Protéger et déprotéger des pages",
"grant-rollback": "Révoquer des modifications sur des pages",
"grant-sendemail": "Envoyer des courriels aux autres utilisateurs",
"action-applychangetags": "appliquer les balises avec vos modifications",
"action-changetags": "ajouter et supprimer de façon arbitraire des balises sur des révisions individuelles et des entrées de journal",
"action-deletechangetags": "supprimer des balises de la base de données",
+ "action-purge": "purger cette page",
"nchanges": "$1 modification{{PLURAL:$1||s}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|depuis la dernière visite}}",
"enhancedrc-history": "historique",
"newsectionsummary": "/* $1 */ nouvelle section",
"rc-enhanced-expand": "Voir les détails",
"rc-enhanced-hide": "Masquer les détails",
- "rc-old-title": "créé avec le titre « $1 »",
+ "rc-old-title": "créé initialement avec le titre « $1 »",
"recentchangeslinked": "Suivi des pages liées",
"recentchangeslinked-feed": "Suivi des pages liées",
"recentchangeslinked-toolbox": "Suivi des pages liées",
"recentchangeslinked-title": "Suivi des pages associées à « $1 »",
- "recentchangeslinked-summary": "Cette page spéciale montre les modifications récentes sur les pages qui sont liées. Les pages de votre liste de suivi sont '''en gras'''.",
+ "recentchangeslinked-summary": "Voici les modifications faites récemment sur des pages liées depuis une page spécifique ou vers des membres d'une catégorie spécifique. \nLes pages de [[Special:Watchlist|votre liste de suivi]] sont <strong>en gras</strong>.",
"recentchangeslinked-page": "Nom de la page :",
"recentchangeslinked-to": "Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l'inverse",
"recentchanges-page-added-to-category": "[[:$1]] ajouté à la catégorie",
"autochange-username": "Modification automatique de MediaWiki",
"upload": "Importer un fichier",
"uploadbtn": "Importer le fichier",
- "reuploaddesc": "Annuler et retourner au formulaire d'import",
+ "reuploaddesc": "Annuler l'importation et retourner au formulaire d'import",
"upload-tryagain": "Envoyer la description du fichier modifiée",
"uploadnologin": "Non connecté",
"uploadnologintext": "Vous devez vous $1 pour importer des fichiers.",
"upload_directory_missing": "Le répertoire d’import de fichier ($1) est introuvable et n’a pas pu être créé par le serveur web.",
- "upload_directory_read_only": "Le répertoire d’import de fichier ($1) n’est pas accessible en écriture depuis le serveur web.",
+ "upload_directory_read_only": "Le serveur web n’a pas accès en écriture au répertoire d’import de fichier ($1).",
"uploaderror": "Erreur lors de l’import",
"upload-recreate-warning": "'''Attention : Un fichier portant ce nom a été supprimé ou déplacé.'''\n\nLe journal des suppressions et celui des déplacements de cette page sont affichés ici pour informations :",
"uploadtext": "Utilisez ce formulaire pour importer des fichiers sur le serveur.\nPour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. L’import est aussi enregistré dans le [[Special:Log/upload|journal d’import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].\n\nPour inclure un fichier dans une page, utilisez un lien de la forme :\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code>''', pour afficher le fichier en pleine résolution (dans le cas d’une image) ;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.png|200px|thumb|left|texte descriptif]]</nowiki></code>''' pour utiliser une miniature de 200 pixels de large dans une boîte à gauche avec « texte descriptif » comme description ;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code>''' pour lier directement vers le fichier sans l’afficher.",
"upload-preferred": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|préféré|préférés}} : $1.",
"upload-prohibited": "{{PLURAL:$2|Format|Formats}} de fichiers {{PLURAL:$2|interdit|interdits}} : $1.",
"uploadlogpage": "Journal d’import de fichiers",
- "uploadlogpagetext": "Voici la liste des derniers fichiers importés sur le serveur.\nVoyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentation plus visuelle.",
+ "uploadlogpagetext": "Voici les derniers fichiers téléversés.\nVoyez la [[Special:NewFiles|galerie des nouveaux fichiers]] pour une représentation plus visuelle.",
"filename": "Nom du fichier",
"filedesc": "Description",
"fileuploadsummary": "Description :",
"filestatus": "Statut du droit d'auteur :",
"filesource": "Source :",
"ignorewarning": "Ignorer l'avertissement et sauvegarder le fichier quand même",
- "ignorewarnings": "Ignorer les avertissements",
- "minlength1": "Le noms de fichiers doivent comprendre au moins une lettre.",
- "illegalfilename": "Le nom de fichier « $1 » contient des caractères interdits dans les titres de pages. Merci de le renommer et de l'importer à nouveau.",
- "filename-toolong": "Le nom du fichier ne peut pas dépasser 240 octets.",
+ "ignorewarnings": "Ignorer tous les avertissements",
+ "minlength1": "Les noms de fichiers doivent comprendre au moins une lettre.",
+ "illegalfilename": "Le nom de fichier « $1 » contient des caractères interdits dans les titres de pages. \nMerci de le renommer et de l'importer à nouveau.",
+ "filename-toolong": "Les noms de fichier ne peuvent pas dépasser 240 octets.",
"badfilename": "Le fichier a été renommé en « $1 ».",
"filetype-mime-mismatch": "L'extension du fichier « .$1 » ne correspond pas au type MIME détecté du fichier ($2).",
- "filetype-badmime": "Les fichiers du type MIME « $1 » ne peuvent pas être importés.",
+ "filetype-badmime": "Les fichiers de type MIME « $1 » ne peuvent pas être importés.",
"filetype-bad-ie-mime": "Le fichier ne peut pas être importé parce qu'il serait détecté comme « $1 » par Internet Explorer, ce qui correspond à un type de fichier interdit car potentiellement dangereux.",
- "filetype-unwanted-type": "'''« .$1 »''' est un format de fichier non désiré.\n{{PLURAL:$3|Le type de fichier préconisé est|Les types de fichiers préconisés sont}} $2.",
- "filetype-banned-type": "''' « .$1 » '''{{PLURAL:$4|n'est pas un type de fichier autorisé|ne sont pas des types de fichiers autorisés}}. \n{{PLURAL:$3|le type de fichier autorisé est |les types de fichiers autorisés sont}} $2.",
+ "filetype-unwanted-type": "<strong>« .$1 »</strong> est un format de fichier non désiré.\n{{PLURAL:$3|Le type de fichier préconisé est|Les types de fichiers préconisés sont}} $2.",
+ "filetype-banned-type": "<strong>« .$1 »</strong>{{PLURAL:$4|n'est pas un type de fichier autorisé|ne sont pas des types de fichiers autorisés}}. \n{{PLURAL:$3|Le type de fichier autorisé est |Les types de fichiers autorisés sont}} $2.",
"filetype-missing": "Le fichier n'a aucune extension (comme « .jpg » par exemple).",
"empty-file": "Le fichier que vous avez soumis était vide.",
"file-too-large": "Le fichier que vous avez soumis était trop grand.",
"fileexists": "Un fichier existe déjà sous ce nom.\nMerci de vérifier <strong>[[:$1]]</strong> si vous n'êtes pas certain{{GENDER:||e|}} de vouloir le remplacer.\n[[$1|thumb]]",
"filepageexists": "La page de description pour ce fichier a déjà été créée ici <strong>[[:$1]]</strong>, mais aucun fichier n'existe actuellement sous ce nom.\nLe résumé que vous allez spécifier n'apparaîtra pas sur la page de description.\nPour que ce soit le cas, vous devrez modifier manuellement la page. [[$1|thumb]]",
"fileexists-extension": "Un fichier existe avec un nom proche : [[$2|thumb]]\n* Nom du fichier à importer : <strong>[[:$1]]</strong>\n* Nom du fichier existant : <strong>[[:$2]]</strong>\nPeut-être voulez-vous utiliser un nom plus explicite ?",
- "fileexists-thumbnail-yes": "Le fichier semble être une image en taille réduite ''(vignette)''. [[$1|thumb]]\nVeuillez vérifier le fichier <strong>[[:$1]]</strong>.\nSi le fichier vérifié est la même image avec la taille initiale, il n'y a pas besoin d'importer une version réduite.",
- "file-thumbnail-no": "Le nom du fichier commence par <strong>$1</strong>.\nIl est possible qu'il s'agisse d'une version réduite ''(vignette)''.\nSi vous disposez du fichier en haute résolution, importez-le, sinon veuillez modifier son nom.",
- "fileexists-forbidden": "Un fichier avec ce nom existe déjà et ne peut pas être écrasé.\nSi vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. [[File:$1|thumb|center|$1]]",
- "fileexists-shared-forbidden": "Un fichier portant ce nom existe déjà dans le dépôt de fichiers partagé.\nSi vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. [[File:$1|thumb|center|$1]]",
+ "fileexists-thumbnail-yes": "Le fichier semble être une image en taille réduite <em>(vignette)</em>. \n[[$1|thumb]]\nVeuillez vérifier le fichier <strong>[[:$1]]</strong>.\nSi le fichier vérifié est la même image avec la taille initiale, il n'y a pas besoin d'importer une version réduite.",
+ "file-thumbnail-no": "Le nom du fichier commence par <strong>$1</strong>.\nIl est possible qu'il s'agisse d'une version réduite <em>(vignette)</em>.\nSi vous disposez du fichier en haute résolution, importez-le, sinon veuillez modifier son nom.",
+ "fileexists-forbidden": "Un fichier avec ce nom existe déjà et ne peut pas être écrasé.\nSi vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. \n[[File:$1|thumb|center|$1]]",
+ "fileexists-shared-forbidden": "Un fichier portant ce nom existe déjà dans le dépôt de fichiers partagé.\nSi vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. \n[[File:$1|thumb|center|$1]]",
"file-exists-duplicate": "Ce fichier est un doublon {{PLURAL:$1|du fichier suivant|des fichiers suivants}} :",
- "file-deleted-duplicate": "Un fichier identique à celui-ci ([[:$1]]) a déjà été supprimé. Vous devriez vérifier le journal des suppressions de ce fichier avant de l'importer à nouveau.",
+ "file-deleted-duplicate": "Un fichier identique à celui-ci ([[:$1]]) a déjà été supprimé. \nVous devriez vérifier le journal des suppressions de ce fichier avant de l'importer à nouveau.",
"file-deleted-duplicate-notitle": "Un fichier identique à ce fichier a déjà été supprimé ainsi que le titre. \nVous devriez demander à quelqu'un la possibilité de vérifier le journal de ce fichier supprimé afin d'examiner la situation avant de l'importer à nouveau.",
"uploadwarning": "Attention !",
"uploadwarning-text": "Modifiez la description du fichier et essayez de nouveau.",
"watchthisupload": "Suivre ce fichier",
"filewasdeleted": "Un fichier avec ce nom a déjà été importé, puis supprimé.\nVous devriez vérifier le $1 avant de l'importer à nouveau.",
"filename-thumb-name": "Ce titre ressemble à celui d’une vignette. Évitez d’importer des vignettes d’une image déjà présente sur le wiki. Si ce n’est pas le cas, veuillez corriger le nom de fichier afin qu’il soit plus descriptif et qu’il ne commence pas comme un titre de vignette.",
- "filename-bad-prefix": "Le nom du fichier commence par '''« $1 »''' qui est typiquement un nom attribué automatiquement par les appareils photo numériques.\nVeuillez choisir un nom de fichier descriptif.",
+ "filename-bad-prefix": "Le nom du fichier commence par <strong>« $1 »</strong> qui est typiquement un nom non-descriptif attribué automatiquement par les appareils photo numériques.\nVeuillez choisir un nom de fichier plus descriptif.",
"filename-prefix-blacklist": " #<!-- laisser cette ligne telle quelle --><pre>\n# La syntaxe est la suivante :\n# * Tout ce qui figure entre un caractère \"#\" jusqu’à la fin de la ligne est un commentaire ;\n# * Toute ligne non vide est un préfixe typique de nom de fichier assigné automatiquement par les appareils numériques :\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # certains téléphones mobiles\nIMG # générique\nJD # Jenoptik\nMGP # Pentax\nPICT # divers\n #</pre><!-- laisser cette ligne telle quelle -->",
"upload-proto-error": "Protocole incorrect",
- "upload-proto-error-text": "L’import requiert des URL commençant par <code>http://</code> ou <code>ftp://</code>.",
+ "upload-proto-error-text": "L’import à distance requiert que les URL commencent par <code>http://</code> ou <code>ftp://</code>.",
"upload-file-error": "Erreur interne",
- "upload-file-error-text": "Une erreur interne est survenue en voulant créer un fichier temporaire sur le serveur. Veuillez contacter un [[Special:ListUsers/sysop|administrateur]].",
+ "upload-file-error-text": "Une erreur interne est survenue en voulant créer un fichier temporaire sur le serveur. \nVeuillez contacter un [[Special:ListUsers/sysop|administrateur]].",
"upload-misc-error": "Erreur d’import inconnue",
"upload-misc-error-text": "Une erreur inconnue est survenue pendant l’import.\nVeuillez vérifier que l’URL est valide et accessible, puis essayer à nouveau.\nSi le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]].",
"upload-too-many-redirects": "L’URL contient trop de redirections.",
"upload-dialog-button-upload": "Téléverser",
"upload-form-label-infoform-title": "Détails",
"upload-form-label-infoform-name": "Nom",
- "upload-form-label-infoform-name-tooltip": "Un titre descriptif unique pour le fichier, qui servira comme nom de fichier. Vous pouvez utiliser du langage courant avec des espaces. Ne pas inclure l’extension du fichier.",
+ "upload-form-label-infoform-name-tooltip": "Un titre descriptif unique pour le fichier, qui servira comme nom de fichier. Vous pouvez utiliser le langage courant avec des espaces. Ne pas inclure l’extension du fichier.",
"upload-form-label-infoform-description": "Description",
"upload-form-label-infoform-description-tooltip": "Décrire brièvement tout ce qu’il y a de particulier concernant cette œuvre.\nPour une photo, mentionner les choses principales qui sont vues, l’occasion, ou l’endroit.",
"upload-form-label-usage-title": "Utilisation",
"upload-form-label-not-own-work-local-generic-local": "Vous pouvez aussi essayer [[Special:Upload|la page de téléchargement par défaut]].",
"upload-form-label-own-work-message-generic-foreign": "Je comprends que je téléverse ce fichier vers un dépôt partagé. Je confirme agir en accord avec les conditions d’utilisation et les règles relatives aux licences de celui-ci.",
"upload-form-label-not-own-work-message-generic-foreign": "Si vous n’êtes pas en mesure de téléverser ce fichier de façon conforme aux règles de ce dépôt partagé, veuillez fermer cette boîte de dialogue et essayer une autre méthode.",
- "upload-form-label-not-own-work-local-generic-foreign": "Vous pouvez également essayer d’utiliser [[Special:Upload|la page de téléversement de {{SITENAME}}]], si les règles du site autorisent le téléversement du fichier.",
- "backend-fail-stream": "Impossible de lire le fichier $1.",
- "backend-fail-backup": "Impossible de sauvegarder le fichier $1.",
+ "upload-form-label-not-own-work-local-generic-foreign": "Vous pouvez également essayer d’utiliser [[Special:Upload|la page de téléversement de {{SITENAME}}]], si leur règles de site autorisent le téléversement du fichier.",
+ "backend-fail-stream": "Impossible de lire le fichier \"$1\".",
+ "backend-fail-backup": "Impossible de sauvegarder le fichier \"$1\".",
"backend-fail-notexists": "Le fichier $1 n’existe pas.",
"backend-fail-hashes": "Impossible d’obtenir les hachages du fichier pour comparaison.",
- "backend-fail-notsame": "Un fichier différent existe déjà pour $1 .",
+ "backend-fail-notsame": "Un fichier différent existe déjà pour \"$1\" .",
"backend-fail-invalidpath": "$1 n’est pas un chemin de stockage valide.",
- "backend-fail-delete": "Impossible de supprimer le fichier $1.",
+ "backend-fail-delete": "Impossible de supprimer le fichier \"$1\".",
"backend-fail-describe": "Impossible de modifier les métadonnées du fichier « $1 ».",
- "backend-fail-alreadyexists": "Le fichier $1 existe déjà.",
+ "backend-fail-alreadyexists": "Le fichier \"$1\" existe déjà.",
"backend-fail-store": "Impossible de stocker le fichier $1 en $2.",
"backend-fail-copy": "Impossible de copier le fichier $1 en $2.",
"backend-fail-move": "Impossible de déplacer le fichier $1 en $2.",
"watchnologin": "Non connecté",
"addwatch": "Ajouter à la liste de suivi",
"addedwatchtext": "La page « [[:$1]] » et sa page de discussion ont été ajoutées à votre [[Special:Watchlist|liste de suivi]].",
+ "addedwatchtext-talk": "« [[:$1]] » et sa page associée ont été ajoutés à votre [[Special:Watchlist|liste de suivi]].",
"addedwatchtext-short": "La page « $1 » a été ajoutée à votre liste de suivi.",
"removewatch": "Supprimer de la liste de suivi",
"removedwatchtext": "La page « [[:$1]] » et sa page de discussion ont été retirées de votre [[Special:Watchlist|liste de suivi]].",
+ "removedwatchtext-talk": "« [[:$1]] » et sa page associée ont été supprimés de votre [[Special:Watchlist|liste de suivi]].",
"removedwatchtext-short": "La page « $1 » a été supprimée de votre liste de suivi.",
"watch": "Suivre",
"watchthispage": "Suivre cette page",
"passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris an t-seòladh puist-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut logadh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
"passwordreset-emailelement": "Ainm-cleachdaiche: \n$1\n\nFacal-faire sealach: \n$2",
"passwordreset-emailsentemail": "Ma tha am post-d seo co-cheangailte ris a’ chunntas agad, thèid post-d airson ath-shuidheachadh an fhacail-fhaire a chur.",
- "passwordreset-emailsent-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.",
- "passwordreset-emailerror-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
"changeemail": "Atharraich no thoir air falbh an seòladh puist-d",
"changeemail-header": "Lìon am foirm seo a dh’atharrachadh an t-seòlaidh phuist-d agad. Ma tha thu airson an co-cheangal eadar post-d sam bith is an cunntas agad a thoirt air falbh, fàg an seòladh ùr bàn nuair a chuireas tu am foirm.",
"changeemail-no-info": "Feumaidh tu logadh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.",
"minoredit": "Seo mùthadh beag",
"watchthis": "Cum sùil air an duilleag seo",
"savearticle": "Sàbhail an duilleag",
+ "publishpage": "Foillsich an duilleag",
+ "publishchanges": "Foillsich mùthaidhean",
"preview": "Ro-shealladh",
"showpreview": "Seall an ro-shealladh",
"showdiff": "Seall na mùthaidhean",
"undo-nochange": "Tha coltas gun deach am mùthadh seo a neo-dhèanamh mu thràth.",
"undo-summary": "Neo-dhèan mùthadh $1 leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]])",
"undo-summary-username-hidden": "Neo-dhèan am mùthadh $1 le cleachdaiche falaichte",
- "cantcreateaccounttitle": "Cha ghabh an cunntas a chruthachadh",
"cantcreateaccount-text": "Chuir [[User:$3|$3]] bacadh air cruthachadh chunntasan on t-seòladh IP seo (<strong>$1</strong>).\n\nDh'innis $3 gun do rinn {{GENDER:$3|e|i}} seo air sgàth: <em>$2</em>",
"cantcreateaccount-range-text": "Chuir [[User:$3|$3]] casg air daoine a tha airson cunntasan a chruthachadh on sheòlaidhean IP taobh a-staigh na rainse <strong>$1</strong> agus tha sin a' gabhail a-steach an t-seòlaidh IP agad-sa (<strong>$4</strong>).\n\nDh'innis $3 gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} seo air sgàth an adhbhair seo: <em>$2</em>",
"viewpagelogs": "Seall logaichean na duilleige seo",
"tooltip-ca-nstab-category": "Seall duilleag na roinn-seòrsa",
"tooltip-minoredit": "Comharraich seo mar dheasachadh beag",
"tooltip-save": "Sàbhail na mùthaidhean agad",
+ "tooltip-publish": "Foillsich na mùthaidhean agad",
"tooltip-preview": "Ro-sheall na mùthaidhean agad; saoil an cleachd thu seo mus sàbhail thu iad?",
"tooltip-diff": "Seall na mùthaidhean a chuir mi air an teacs",
"tooltip-compareselectedversions": "Seall an diofar eadar an dà mhùthadh dhen duilleag seo a thagh thu",
"tagline": "De {{SITENAME}}",
"help": "Axuda",
"search": "Procura",
+ "search-ignored-headings": " #<!-- Deixe esta liña tal e como está --> <pre>\n# Cabeceiras que serán ignoradas nas buscas.\n# Os cambios feitos aquí realízanse en canto se indexa a páxina coa cabeceira.\n# Pode forzar o reindexado da páxina facendo unha edición baleira.\n# A sintaxe é a seguinte:\n# * Todo o que vaia despois dun carácter \"#\" ata o final da liña é un comentario\n# * Toda liña que non estea en branco é o título exacto que ignorar, coas maiúsculas e minúsculas\nReferencias\nLigazóns externas\nVéxase tamén\n #</pre> <!-- Deixe esta liña tal e como está -->",
"searchbutton": "Procurar",
"go": "Mostrar",
"searcharticle": "Artigo",
"passwordreset-emailelement": "Nome de usuario: \n$1\n\nContrasinal temporal: \n$2",
"passwordreset-emailsentemail": "Se esta é unha dirección de correo electrónico asociada á súa conta, entón enviarase un correo electrónico para o restablecemento do seu contrasinal.",
"passwordreset-emailsentusername": "Se hai unha dirección de correo electrónico asociada con este nome de usuario, entón enviarase un correo electrónico para o restablecemento do contrasinal.",
- "passwordreset-emailsent-capture": "Enviouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación.",
- "passwordreset-emailerror-capture": "Xerouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación, pero o envío {{GENDER:$2|ao usuario|á usuaria}} fallou: $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|O correo de reinicialización do contrasinal foi enviado|Os correos de reinicialización do contrasinal foron enviados}}. {{PLURAL:$1|O nome de usuario e contrasinal móstrase abaixo|A lista de nomes de usuarios e contrasinais móstranse abaixo}}.",
"passwordreset-emailerror-capture2": "O envío do correo {{GENDER:$2|ó usuario|á usuaria}} fallou: $1 {{PLURAL:$3|O nome de usuario e contrasinal móstrase abaixo|A lista de usuarios e contrasinais móstranse abaixo}}.",
"passwordreset-nocaller": "Cómpre proporcionar un chamador",
"passwordreset-nodata": "Non se indicou o nome de usuario ou a dirección de correo electrónico",
"changeemail": "Cambiar ou eliminar o enderezo de correo electrónico",
"changeemail-header": "Encha este formulario para cambiar o seu enderezo de correo electrónico. Se vostede quere eliminar a asociación da dirección de correo electrónico da súa conta, deixe en branco a nova dirección de correo electrónico cando envíe o formulario.",
- "changeemail-passwordrequired": "Terá que escribir o seu contrasinal para confirmar este cambio.",
"changeemail-no-info": "Debe rexistrarse para acceder directamente a esta páxina.",
"changeemail-oldemail": "Enderezo de correo electrónico actual:",
"changeemail-newemail": "Novo enderezo de correo electrónico:",
"content-model-css": "CSS",
"content-json-empty-object": "Obxecto baleiro",
"content-json-empty-array": "Matriz baleira",
+ "deprecated-self-close-category": "Páxinas que usan etiquetas HTML de auto-pechado non válidas",
+ "deprecated-self-close-category-desc": "Páxinas que conteñen unha etiqueta HTML de auto-pechado non válida, como <code><b/></code> ou <code><span/></code>. O comportamento destas etiquetas vai cambiar para gardar a consistencia coa especificación HTML5, polo que o seu uso no texto wiki está desbotado.",
"duplicate-args-warning": "<strong>Advertencia:</strong> [[:$1]] está chamando a [[:$2]] con máis dun valor para o parámetro \"$3\". Só se usará o último valor proporcionado.",
"duplicate-args-category": "Páxinas con argumentos duplicados nas chamadas aos modelos",
"duplicate-args-category-desc": "Esta páxina contén as chamadas aos modelos que utilizan argumentos duplicados, como <code><nowiki>{{exemplo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{exemplo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Semella que alguén xa desfixo a edición.",
"undo-summary": "Desfíxose a edición $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]])",
"undo-summary-username-hidden": "Desfíxose a edición $1 dun usuario agochado",
- "cantcreateaccounttitle": "Non pode crear unha conta de usuario",
"cantcreateaccount-text": "A creación de contas desde este enderezo IP ('''$1''') foi bloqueada por [[User:$3|$3]].\n\nA razón dada por $3 foi ''$2''",
"cantcreateaccount-range-text": "O usuario [[User:$3|$3]] bloqueou a creación de contas desde enderezos IP no rango <strong>$1</strong>, no que se inclúe o seu enderezo IP (<strong>$4</strong>).\n\nA razón que deu $3 foi <em>$2</em>.",
"viewpagelogs": "Ver os rexistros desta páxina",
"action-applychangetags": "aplicar etiquetas xunto cos cambios",
"action-changetags": "engadir e quitar etiquetas arbitrarias a revisións individuais e entradas do rexistro",
"action-deletechangetags": "borrar etiquetas da base de datos",
+ "action-purge": "purgar esta páxina",
"nchanges": "$1 {{PLURAL:$1|modificación|modificacións}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
"enhancedrc-history": "historial",
"recentchanges": "Cambios recentes",
"recentchanges-legend": "Opcións dos cambios",
- "recentchanges-summary": "Nesta páxina pode seguir as modificacións máis recentes feitas no wiki.",
+ "recentchanges-summary": "Nesta páxina podes seguir as modificacións máis recentes feitas no wiki.",
"recentchanges-noresult": "Non se produciron cambios que coincidisen con eses criterios durante o período especificado.",
"recentchanges-feed-description": "Nesta fonte de novas pode seguir as modificacións máis recentes feitas no wiki.",
"recentchanges-label-newpage": "Esta edición creou unha nova páxina",
"watchnologin": "Non accedeu ao sistema",
"addwatch": "Engadir á lista vixilancia",
"addedwatchtext": "A páxina \"[[:$1]]\" e mais a súa conversa foron engadidas á súa [[Special:Watchlist|lista de vixilancia]].",
+ "addedwatchtext-talk": "\"[[:$1]]\" xunto coa súa páxina asociada foron engadidas á túa [[Special:Watchlist|lista de vixilancia]].",
"addedwatchtext-short": "A páxina \"$1\" foi engadida á súa lista de vixilancia.",
"removewatch": "Eliminar da lista de vixilancia",
"removedwatchtext": "A páxina \"[[:$1]]\" e mais a súa conversa foron eliminadas da súa [[Special:Watchlist|lista de vixilancia]].",
+ "removedwatchtext-talk": "\"[[:$1]]\" xunto coa súa páxina asociada foron eliminadas da túa [[Special:Watchlist|lista de vixilancia]].",
"removedwatchtext-short": "A páxina \"$1\" foi eliminada da súa lista de vixilancia.",
"watch": "Vixiar",
"watchthispage": "Vixiar esta páxina",
"notvisiblerev": "A revisión foi borrada",
"watchlist-details": "Hai {{PLURAL:$1|unha páxina|$1 páxinas}} na súa lista de vixilancia, sen contar as de conversa.",
"wlheader-enotif": "A notificación por correo electrónico está activada.",
- "wlheader-showupdated": "As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''.",
+ "wlheader-showupdated": "As páxinas que cambiaron desde a súa última visita móstranse en <strong>letra grosa</strong>.",
"wlnote": "A continuación {{PLURAL:$1|está a última modificación|están as últimas <strong>$1</strong> modificacións}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} ata o $3 ás $4.",
"wlshowlast": "Mostrar as últimas $1 horas e os últimos $2 días",
"watchlist-hide": "Agochar",
"Gothicspeaker"
]
},
- "underline-always": "Sinteino",
- "underline-never": "Niu",
+ "tog-previewonfirst": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐌰𐍄 𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽",
+ "underline-always": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉",
+ "underline-never": "𐌽𐌹 𐌰𐌹𐍅",
"sunday": "𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
"monday": "𐌼𐌴𐌽𐌹𐌽𐍃 𐌳𐌰𐌲𐍃",
"tuesday": "𐍄𐌴𐌹𐍅𐌹𐍃 𐌳𐌰𐌲𐍃",
- "wednesday": "Midiwiko",
- "thursday": "ð\90\8d\80ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8d\84ð\90\8c´𐌳𐌰𐌲𐍃",
- "friday": "ð\90\8d\80ð\90\8c°ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83𐌳𐌰𐌲𐍃",
+ "wednesday": "𐍅𐍉𐌳𐌰𐌽𐌹𐍃 𐌳𐌰𐌲𐍃",
+ "thursday": "ð\90\8c¸ð\90\8c¿ð\90\8c½ð\90\8c°ð\90\8d\82ð\90\8c¹ð\90\8d\83 𐌳𐌰𐌲𐍃",
+ "friday": "ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¿ð\90\8c¾ð\90\8d\89ð\90\8c½ð\90\8d\83 𐌳𐌰𐌲𐍃",
"saturday": "𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
"sun": "𐍃𐌿𐌽",
"mon": "𐌼𐌴𐌽",
- "tue": "ð\90\8c°ð\90\8d\82ð\90\8c´",
+ "tue": "ð\90\8d\84ð\90\8c´ð\90\8c¹ð\90\8d\85",
"wed": "𐍅𐍉𐌳",
- "thu": "ð\90\8d\80ð\90\8c°ð\90\8c¹",
- "fri": "ð\90\8d\86ð\90\8d\82ð\90\8c¹",
+ "thu": "ð\90\8c¸ð\90\8c¿ð\90\8c½",
+ "fri": "ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¿",
"sat": "𐍃𐌰𐌼",
"january": "𐌾𐌰𐌽𐌿𐌰𐍂𐌴𐌹𐍃",
"february": "𐍆𐌰𐌹𐌱𐍂𐌿𐌰𐍂𐌴𐌹𐍃",
"october": "𐌰𐌿𐌺𐍄𐍉𐌱𐌰𐌹𐍂",
"november": "𐌽𐌰𐌿𐌱𐌰𐌹𐌼𐌱𐌰𐌹𐍂",
"december": "𐌾𐌹𐌿𐌻𐌴𐌹𐍃",
- "january-gen": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»ð\90\8c´ð\90\8c¹𐍃",
- "february-gen": "ð\90\8d\86ð\90\8c°ð\90\8c¹ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8c°ð\90\8d\82ð\90\8c´ð\90\8c¹𐍃",
- "march-gen": "ð\90\8cºð\90\8c°ð\90\8c»ð\90\8c³ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
- "april-gen": "ð\90\8c²ð\90\8d\82ð\90\8c°ð\90\8d\83ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸𐌹𐍃",
- "may-gen": "ð\90\8c±ð\90\8c»ð\90\8d\89ð\90\8c¼ð\90\8c°ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
- "june-gen": "ð\90\8d\85ð\90\8c°ð\90\8d\82ð\90\8c¼ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
- "july-gen": "ð\90\8c·ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
- "august-gen": "ð\90\8c°ð\90\8d\83ð\90\8c°ð\90\8c½ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹𐍃",
- "september-gen": "ð\90\8c°ð\90\8cºð\90\8d\82ð\90\8c°ð\90\8c½ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹ð\90\8d\83",
- "october-gen": "ð\90\8d\85ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c´ð\90\8c½ð\90\8d\89ð\90\8c¸ð\90\8c¹ð\90\8d\83",
- "november-gen": "ð\90\8d\86ð\90\8d\82ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\83",
- "december-gen": "ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»ð\90\8c´ð\90\8c¹𐍃",
+ "january-gen": "ð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c¿ð\90\8c°ð\90\8d\82ð\90\8c¾ð\90\8d\89𐍃",
+ "february-gen": "ð\90\8d\86ð\90\8c°ð\90\8c¹ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8c°ð\90\8d\82ð\90\8c¾ð\90\8d\89𐍃",
+ "march-gen": "ð\90\8c¼ð\90\8c°ð\90\8d\82ð\90\8d\84ð\90\8c¹ð\90\8c°ð\90\8c¿𐍃",
+ "april-gen": "ð\90\8c°ð\90\8d\80ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c»𐌹𐍃",
+ "may-gen": "ð\90\8c¼ð\90\8c°ð\90\8c¾ð\90\8c°ð\90\8c¿𐍃",
+ "june-gen": "ð\90\8c¾ð\90\8c¿ð\90\8c½ð\90\8c¹ð\90\8c°ð\90\8c¿𐍃",
+ "july-gen": "ð\90\8c¾ð\90\8c¿ð\90\8c»ð\90\8c¹ð\90\8c°ð\90\8c¿𐍃",
+ "august-gen": "ð\90\8c°ð\90\8c²ð\90\8c¿ð\90\8d\83ð\90\8d\84ð\90\8c°ð\90\8c¿𐍃",
+ "september-gen": "ð\90\8d\83ð\90\8c°ð\90\8c¹ð\90\8d\80ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8c¼ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82",
+ "october-gen": "ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8d\84ð\90\8d\89ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82",
+ "november-gen": "ð\90\8c½ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8c¼ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82",
+ "december-gen": "ð\90\8c¾ð\90\8c¹ð\90\8c¿ð\90\8c»ð\90\8c¾ð\90\8d\89𐍃",
"jan": "𐌾𐌰𐌽",
"feb": "𐍆𐌰𐌽",
"mar": "𐌼𐌰𐍂",
"oct": "𐌰𐌿𐌺",
"nov": "𐌽𐌰𐌿𐌱",
"dec": "𐌳𐌰𐌹𐌺",
+ "january-date": "𐌾𐌰𐌽𐌿𐌰𐍂𐌴𐌹𐍃 $1",
+ "february-date": "𐍆𐌰𐌹𐌱𐍂𐌿𐌰𐍂𐌴𐌹𐍃 $1",
+ "march-date": "𐌼𐌰𐍂𐍄𐌹𐌿𐍃 $1",
+ "april-date": "𐌰𐍀𐍂𐌹𐌻𐌹𐍃 $1",
"september-date": "𐍃𐌰𐌹𐍀𐍄𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
"november-date": "𐌽𐌰𐌿𐌱𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
"pagecategories": "{{PLURAL:$1|𐌺𐌿𐌽𐌹|𐌺𐌿𐌽𐌾𐌰}}",
"category_header": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌹𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
"subcategories": "𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰",
- "category-media-header": "𐌼𐌴𐌳𐌾𐌰 𐌹𐌽𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
+ "category-media-header": "𐌼𐌴𐌳𐌾𐌰 𐌹𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
"hidden-categories": "{{PLURAL:$1|𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽 𐌺𐌿𐌽𐌹|𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}",
+ "hidden-category-category": "𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰 𐌺𐌿𐌽𐌾𐌰",
"category-subcat-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌴𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 {{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌹𐍆𐍄𐌿𐌼𐌰 $1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌺𐌿𐌽𐌾𐌴.}}",
+ "category-subcat-count-limited": "𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌹𐍆𐍄𐌿𐌼𐍉𐌽/𐌹𐍆𐍄𐌿𐌼𐍉𐌽𐌰\n{{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|$1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}.",
"category-article-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌰𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼𐌰𐌽 𐌻𐌰𐌿𐍆.|𐌹𐍆𐍄𐌿𐌼𐌰(𐌽𐍃) {{PLURAL:$1|𐌻𐌰𐌿𐍆𐍃 𐌹𐍃𐍄|$1 𐌻𐌰𐌿𐌱𐍉𐍃 𐍃𐌹𐌽𐌳}} 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌺𐌿𐌽𐌾𐌰, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌻𐌰𐌿𐌱𐌴.}}",
"about": "𐌱𐌹",
"article": "𐌷𐌰𐌱𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
"history_short": "𐍃𐍀𐌹𐌻𐌻",
"printableversion": "𐌿𐍃𐌼𐌴𐍂𐌴𐌹𐌽𐍃 𐌳𐌿 𐌿𐍃𐌼𐌴𐌻𐌾𐌰𐌽",
"permalink": "𐌰𐌹𐍅𐌴𐌹𐌽𐌰 𐌲𐌰𐍅𐌹𐍃𐍃",
+ "print": "𐌿𐍃𐌼𐌴𐌻𐌴𐌹",
"view": "𐍃𐌰𐌹𐍈",
"view-foreign": "𐍃𐌰𐌹𐍈 𐌰𐌽𐌰 $1",
"edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
"create-this-page": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
"delete": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹",
"deletethispage": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
- "protect": "𐌱𐌰𐌹𐍂𐌲𐌰𐌽",
+ "undeletethispage": "𐌽𐌰𐍃𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+ "protect": "𐍆𐍂𐌹𐌸",
"protect_change": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
- "protectthispage": "ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c² ð\90\8c¸ð\90\8d\89 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8c°",
- "unprotect": "ð\90\8c½ð\90\8c¹ð\90\8c±ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c²ð\90\8c°",
- "unprotectthispage": "Nibaírga þo siedo",
+ "protectthispage": "ð\90\8d\86ð\90\8d\82ð\90\8c¹ð\90\8c¸ ð\90\8c¸ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86",
+ "unprotect": "ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ ð\90\8c¼ð\90\8c¿ð\90\8c½ð\90\8c³",
+ "unprotectthispage": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌼𐌿𐌽𐌳 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
"newpage": "𐌽𐌹𐌿𐌾𐌹𐍃 𐌻𐌰𐌿𐍆𐍃",
- "talkpage": "ð\90\8c¼ð\90\8c°ð\90\8c¸ð\90\8c»ð\90\8c°ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8c°",
+ "talkpage": "ð\90\8d\82ð\90\8d\89ð\90\8c³ð\90\8c´ð\90\8c¹ ð\90\8c±ð\90\8c¹ ð\90\8c¸ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86",
"talkpagelinktext": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
- "specialpage": "ð\90\8c¿ð\90\8d\83ð\90\8d\83ð\90\8c¹ð\90\8c½ð\90\8c³ð\90\8c°ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89𐍃",
+ "specialpage": "ð\90\8c¿ð\90\8d\83ð\90\8d\83ð\90\8c¹ð\90\8c½ð\90\8c³ð\90\8d\83 ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86𐍃",
"personaltools": "𐍃𐍅𐌴𐍃𐌰𐌹 𐍃𐌰𐍂𐍅𐌰𐌽𐍃",
"talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
"views": "𐍃𐌹𐌿𐌽𐌴𐌹𐍃",
"toolbox": "𐍃𐌰𐍂𐍅𐌰𐌽𐍃",
+ "projectpage": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆",
+ "viewhelppage": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆",
"otherlanguages": "𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐍂𐌰𐌶𐌳𐍉𐌼",
- "redirectedfrom": "(𐌹𐍃 𐍄𐌹𐌿𐌷𐌰𐌽𐍃/𐍄𐌹𐌿𐌷𐌰𐌽𐌰 𐌷𐌹𐌳𐍂𐌴 𐍆𐍂𐌰𐌼 $1)",
- "redirectpagesub": "ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+ "redirectedfrom": "(𐌹𐍃 {{GENDER:𐍄𐌹𐌿𐌷𐌰𐌽𐍃|𐍄𐌹𐌿𐌷𐌰𐌽𐌰}} 𐌷𐌹𐌳𐍂𐌴 𐍆𐍂𐌰𐌼 $1)",
+ "redirectpagesub": "ð\90\8c°ð\90\8c»ð\90\8c¾ð\90\8c°ð\90\8d\82 ð\90\8c±ð\90\8d\82ð\90\8c¹ð\90\8c²ð\90\8c²ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\83 ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83",
"lastmodifiedat": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌸𐌰𐍄𐌰 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌸𐍃 𐍅𐌰𐍃 ($1) ($2).",
+ "protectedpage": "𐍆𐍂𐌹𐌸𐍉𐌽𐍃 𐌻𐌰𐌿𐍆𐍃",
"jumpto": "𐌲𐌰𐌲𐌲 𐌳𐌿:",
"jumptonavigation": "𐌻𐌰𐌿𐌱𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
"jumptosearch": "𐍃𐍉𐌺𐌴𐌹",
+ "pool-errorunknown": "𐌽𐌰𐍃𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
"aboutsite": "𐌱𐌹 {{SITENAME}}",
"aboutpage": "Project:𐌱𐌹",
- "copyrightpage": "{{ns:project}}:ð\90\8c¼ð\90\8c°ð\90\8c½ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8cºð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8d\89ð\90\8c¸ð\90\8c°",
- "currentevents": "ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c° 𐍅𐌰𐌹𐌷𐍄𐍃",
- "currentevents-url": "Project:ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c° 𐍅𐌰𐌹𐌷𐍄𐍃",
+ "copyrightpage": "{{ns:project}}:ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8c·ð\90\8d\84ð\90\8c´ð\90\8c¹ð\90\8d\83",
+ "currentevents": "ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c¸ð\90\8d\89ð\90\8d\83 ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c¸ð\90\8c°ð\90\8c½ð\90\8d\89ð\90\8d\83 𐍅𐌰𐌹𐌷𐍄𐍃",
+ "currentevents-url": "Project:ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\85ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c¸ð\90\8d\89ð\90\8d\83 ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c¸ð\90\8c°ð\90\8c½ð\90\8d\89ð\90\8d\83 𐍅𐌰𐌹𐌷𐍄𐍃",
"disclaimers": "𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐍂𐌰𐌹𐌷𐍄𐌰𐌹𐍃",
"disclaimerpage": "Project:𐌲𐌰𐌼𐌰𐌹𐌽𐌰 𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐍂𐌰𐌹𐌷𐍄𐌰𐌹𐍃",
- "edithelp": "𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌷𐌹𐌻𐍀𐌰",
+ "edithelp": "ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8c·ð\90\8c¹ð\90\8c»ð\90\8d\80ð\90\8c°",
"mainpage": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
"mainpage-description": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
"portal": "𐌱𐌰𐌿𐍂𐌲𐍃 𐌲𐌰𐍅𐌹",
"privacy": "𐌲𐌰𐍂𐌴𐌳𐌴𐌹𐌽𐍉𐍃 𐍃𐌿𐌽𐌳𐍂𐍉𐍅𐌹𐍃𐌰𐌽𐌰",
"privacypage": "Project:𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐍃𐌿𐌽𐌳𐍂𐍉𐍅𐌹𐍃𐌰𐌽𐌰",
"retrievedfrom": "𐌲𐌰𐌽𐌿𐌼𐌰𐌽 𐍆𐍂𐌰𐌼 \"$1\"",
- "youhavenewmessages": "𐌸𐌿 𐌷𐌰𐌱𐌹𐍃 $1 ($2).",
+ "youhavenewmessages": "{{PLURAL:$3|𐌷𐌰𐌱𐌰𐌹𐍃}} $1 ($2).",
"editsection": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
"editold": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
"editlink": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
"hidetoc": "𐌰𐍆𐍆𐌹𐌻𐌷",
"confirmable-yes": "𐌾𐌰",
"confirmable-no": "𐌽𐌴",
- "site-rss-feed": "$1 RSS Miþnatifodjan",
- "site-atom-feed": "$1 ð\90\8c°ð\90\8d\84ð\90\8d\89ð\90\8c¼ ð\90\8d\86ð\90\8d\89ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83",
+ "site-rss-feed": "$1 RSS 𐍂𐌹𐌽𐌽𐍉",
+ "site-atom-feed": "$1 ð\90\8c°ð\90\8d\84ð\90\8d\89ð\90\8c¼ ð\90\8d\82ð\90\8c¹ð\90\8c½ð\90\8c½ð\90\8d\89",
"page-atom-feed": "\"$1\" 𐌰𐍄𐍉𐌼 𐍂𐌹𐌽𐌽𐍉",
"red-link-title": "$1 (𐌻𐌰𐌿𐍆𐍃 𐌽𐌹𐍃𐍄)",
"nstab-main": "𐌻𐌰𐌿𐍆𐍃",
"nstab-special": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
"nstab-project": "𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
"nstab-image": "𐍆𐌴𐌹𐌻𐌰",
- "nstab-template": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c°ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8c½𐍃",
- "nstab-help": "𐌷𐌹𐌻𐍀𐌰",
+ "nstab-template": "ð\90\8d\83ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8d\86ð\90\8d\82ð\90\8c¹ð\90\8d\83ð\90\8c°ð\90\8c·ð\90\8d\84𐍃",
+ "nstab-help": "𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
"nstab-category": "𐌺𐌿𐌽𐌹",
"mainpage-nstab": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
"error": "𐌰𐌹𐍂𐌶𐌴𐌹",
"createacct-yourpassword-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
"createacct-yourpasswordagain": "𐌲𐌰𐍃𐌹𐌲𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
"createacct-yourpasswordagain-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳 𐌰𐍆𐍄𐍂𐌰",
- "userlogin-remembermypassword": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌼𐌹𐌺 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌽𐌰/𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰",
- "login": "Atgaggan",
- "nav-login-createaccount": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽 / 𐌲𐌰𐌻𐌰𐌽𐌲𐌾𐌰𐌽 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃",
- "userlogin": "Atgaggan / gaskapjan niutandis",
- "userloginnocreate": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽",
- "logout": "ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8c¸ð\90\8c°ð\90\8c½",
- "userlogout": "ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8c¸ð\90\8c°ð\90\8c½",
+ "userlogin-remembermypassword": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌼𐌹𐌺 {{GENDER:𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌽𐌰|𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰}}",
+ "login": "𐌰𐍄𐌲𐌰𐌲𐌲",
+ "nav-login-createaccount": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
+ "userlogin": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
+ "userloginnocreate": "𐌰𐍄𐌲𐌰𐌲𐌲",
+ "logout": "ð\90\8c°ð\90\8d\86ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8c¸",
+ "userlogout": "ð\90\8c°ð\90\8d\86ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8c¸",
"userlogin-noaccount": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽?",
- "userlogin-joinproject": "ð\90\8c²ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c½𐌴𐌹 {{SITENAME}}",
- "nologinlink": "Gaskapjan þein niutandis",
- "createaccount": "ð\90\8c²ð\90\8c°ð\90\8c»ð\90\8c°ð\90\8c²ð\90\8c¾ð\90\8c°ð\90\8c½ ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8d\84ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ð\90\8d\83",
- "gotaccount": "Habiþ þu niutandis? '''$1'''",
- "gotaccountlink": "Atgaggan",
+ "userlogin-joinproject": "ð\90\8c²ð\90\8c°ð\90\8c³ð\90\8c°ð\90\8c¹ð\90\8c»𐌴𐌹 {{SITENAME}}",
+ "nologinlink": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
+ "createaccount": "ð\90\8d\83ð\90\8cºð\90\8c°ð\90\8d\80ð\90\8c´ð\90\8c¹ ð\90\8cºð\90\8c°ð\90\8d\85ð\90\8d\84ð\90\8d\83ð\90\8c¾ð\90\8d\89ð\90\8c½",
+ "gotaccount": "𐌾𐌿 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽 𐌷𐌰𐌱𐌰𐌹𐍃? $1.",
+ "gotaccountlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
"userlogin-resetpassword-link": "𐌿𐍆𐌰𐍂𐌼𐌿𐌽𐌽𐍉𐌳𐌴𐍃 𐌸𐌴𐌹𐌽𐌰𐌼𐌼𐌰 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳𐌰?",
"userlogin-helplink2": "𐌷𐌹𐌻𐍀𐌰 𐌼𐌹𐌸 𐌰𐍄𐌲𐌰𐌲𐌲𐌰",
"createacct-emailoptional": "𐌴-𐌱𐍉𐌺𐍉𐍃 (𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍉𐍃)",
"createacct-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌸𐌴𐌹𐌽𐍉𐍃 𐌴-𐌱𐍉𐌺𐍉𐍃",
- "createaccountreason": "ð\90\8d\86ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c¹ð\90\8c½ð\90\8c°:",
- "createacct-reason": "ð\90\8d\86ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c¹ð\90\8c½ð\90\8c°",
+ "createaccountreason": "ð\90\8c²ð\90\8d\82ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8c¿ð\90\8d\83:",
+ "createacct-reason": "ð\90\8c²ð\90\8d\82ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8c¿ð\90\8d\83",
"createacct-submit": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌴𐌹𐌽𐌰 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
"createacct-benefit-heading": "{{SITENAME}} 𐍄𐌰𐍅𐌹𐌸 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 𐌼𐌰𐌽𐌽𐌰𐌼 𐍃𐍅𐌴 𐌸𐌿𐌺.",
"createacct-benefit-body1": "{{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃}}",
"pt-login-button": "𐌰𐍄𐌲𐌰𐌲𐌲",
"pt-createaccount": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
"passwordreset": "𐌰𐍆𐍄𐍂𐌰 𐍃𐌰𐍄𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
- "bold_sample": "ð\90\8c°ð\90\8c±ð\90\8d\82ð\90\8d\83 ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8c°",
- "bold_tip": "ð\90\8c°ð\90\8c±ð\90\8d\82 ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c°",
- "italic_sample": "ð\90\8d\85ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8cµð\90\8d\83 ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c°",
- "italic_tip": "ð\90\8c³ð\90\8d\82ð\90\8c¹ð\90\8c¿ð\90\8d\83ð\90\8d\89 ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8c°",
- "link_sample": "ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8d\89",
- "link_tip": "ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c±ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ ð\90\8c¹ð\90\8c½ð\90\8c½ð\90\8c°ð\90\8c½ð\90\8c°",
- "extlink_sample": "http://www.example.com ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8d\89",
- "extlink_tip": "Uta táikjabandi (maúdjan http://)",
- "headline_sample": "ð\90\8c·ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c¹ð\90\8c³ð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c°",
- "headline_tip": "ð\90\8c·ð\90\8c°ð\90\8c¿ð\90\8c·ð\90\8d\83 ð\90\8c·ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c¹ð\90\8c³ð\90\8c°ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8c° â\80¢ð\90\8c±â\80¢",
- "nowiki_sample": "ð\90\8d\83ð\90\8c°ð\90\8d\84ð\90\8c¾ð\90\8c´ð\90\8c¹ ð\90\8c¿ð\90\8c½ð\90\8d\83ð\90\8c½ð\90\8c´ð\90\8c¹ð\90\8c¸ð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\83 ð\90\8d\84ð\90\8c´ð\90\8cºð\90\8d\83ð\90\8d\84 ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c°ð\90\8c¼ ð\90\8c·ð\90\8c¹ð\90\8d\84",
+ "bold_sample": "ð\90\8d\83ð\90\8d\85ð\90\8c¹ð\90\8c½ð\90\8c¸ð\90\8d\89ð\90\8d\83 ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8d\89ð\90\8d\83",
+ "bold_tip": "ð\90\8d\83ð\90\8d\85ð\90\8c¹ð\90\8c½ð\90\8c¸ð\90\8d\89ð\90\8d\83 ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8d\89ð\90\8d\83",
+ "italic_sample": "ð\90\8d\85ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8cµð\90\8d\89ð\90\8d\83 ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8d\89ð\90\8d\83",
+ "italic_tip": "ð\90\8d\85ð\90\8d\82ð\90\8c°ð\90\8c¹ð\90\8cµð\90\8d\89ð\90\8d\83 ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8d\89ð\90\8d\83",
+ "link_sample": "ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8d\83ð\90\8d\83ð\90\8c¹-ð\90\8c¿ð\90\8d\86ð\90\8c°ð\90\8d\82ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c¹",
+ "link_tip": "ð\90\8c¹ð\90\8c½ð\90\8c½ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8d\83ð\90\8d\83",
+ "extlink_sample": "http://www.example.com ð\90\8c²ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8d\83ð\90\8d\83ð\90\8c¹-ð\90\8c¿ð\90\8d\86ð\90\8c°ð\90\8d\82ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c¹",
+ "extlink_tip": "𐌿𐍄𐌰𐌲𐌰𐍅𐌹𐍃𐍃 (𐌲𐌰𐌼𐌹𐌽𐌸𐌴𐌹 http:// 𐍆𐌰𐌿𐍂𐌰𐌻𐌰𐌲𐌴𐌹𐌽𐍃)",
+ "headline_sample": "ð\90\8c¿ð\90\8d\86ð\90\8c°ð\90\8d\82ð\90\8d\83ð\90\8d\84ð\90\8d\82ð\90\8c¹ð\90\8cºð\90\8c°ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8d\89ð\90\8d\83",
+ "headline_tip": "ð\90\8c·ð\90\8c°ð\90\8c¿ð\90\8c·ð\90\8c¹ð\90\8c¸ð\90\8c° â\80¢ð\90\8c±â\80¢ ð\90\8c¿ð\90\8d\86ð\90\8c°ð\90\8d\82ð\90\8d\83ð\90\8d\84ð\90\8d\82ð\90\8c¹ð\90\8cºð\90\8d\83",
+ "nowiki_sample": "ð\90\8d\83ð\90\8c°ð\90\8d\84ð\90\8c´ð\90\8c¹ ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8d\89ð\90\8d\83 ð\90\8c¹ð\90\8c½ð\90\8c¿ð\90\8c· ð\90\8c²ð\90\8c°ð\90\8d\82ð\90\8d\85ð\90\8c¹ ð\90\8c·ð\90\8c´ð\90\8d\82",
"nowiki_tip": "𐌿𐌽𐍅𐌹𐍄𐌾𐌹𐍃 𐍅𐌹𐌺𐌹𐍃𐌽𐌴𐌹𐌸𐌾𐌰𐌽𐌳𐍃",
"image_tip": "𐌹𐌽𐌽𐌱𐍉𐌳𐌰𐌽𐍃 𐍆𐌴𐌹𐌻𐌰",
"media_tip": "𐍄𐌰𐌹𐌺𐌾𐌰𐌱𐌰𐌽𐌳𐌾𐌹𐍃 𐍆𐌴𐌹𐌻𐌰𐌽𐌹𐍃",
- "sig_tip": "ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8c°ð\90\8d\82ð\90\8c¼ð\90\8c´ð\90\8c» ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c° ð\90\8c¼ð\90\8c¹ð\90\8c¸ ð\90\8d\83ð\90\8d\84ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8c°𐌼𐌴𐌻𐌰",
- "hr_tip": "𐍂𐌰𐌹𐌷𐍄𐍃𐌱𐌰𐌿𐍂𐌳 (𐌱𐍂𐌿𐌺𐌾𐌰𐌽 𐌼𐌹𐌸 𐌽𐌹𐌿𐍆𐌰𐍂𐌿𐍃𐍃𐌿𐍃)",
- "summary": "ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c°ð\90\8c½ð\90\8d\83ð\90\8d\80ð\90\8c¹ð\90\8c»ð\90\8c»ð\90\8d\89ð\90\8c½:",
- "subject": "ð\90\8c·ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c¹ð\90\8c³ð\90\8c°ð\90\8c±ð\90\8d\89ð\90\8cº𐌰:",
+ "sig_tip": "ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c° ð\90\8c¿ð\90\8d\86ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c¼ð\90\8c¹ð\90\8c¸ ð\90\8c²ð\90\8c»ð\90\8c°ð\90\8c²ð\90\8c²ð\90\8d\85ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° 𐌼𐌴𐌻𐌰",
+ "hr_tip": "𐍂𐌰𐌹𐌷𐍄𐍃 𐍃𐍄𐍂𐌹𐌺𐍃 (𐌽𐌹 𐌱𐍂𐌿𐌺𐌴𐌹 𐌿𐍆𐌰𐍂𐍆𐌹𐌻𐌿)",
+ "summary": "ð\90\8c¼ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c²ð\90\8c¿ð\90\8d\83 ð\90\8d\83ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83:",
+ "subject": "ð\90\8c¿ð\90\8d\86ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8d\80𐌰:",
"minoredit": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
"watchthis": "𐌰𐍄𐍅𐌹𐍄 𐌻𐌰𐌿𐌱𐌰",
"savearticle": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌻𐌰𐌿𐍆",
- "preview": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8d\83ð\90\8c°ð\90\8c¹ð\90\8d\88ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
- "showpreview": "ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8c½ ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8d\83ð\90\8c°ð\90\8c¹ð\90\8d\88ð\90\8c°",
+ "preview": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c°ð\90\8d\83ð\90\8c¹ð\90\8c¿ð\90\8c½ð\90\8d\83",
+ "showpreview": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²ð\90\8c´ð\90\8c¹ ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c°ð\90\8d\83ð\90\8c¹ð\90\8c¿ð\90\8c½",
"showdiff": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃",
"loginreqlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
- "newarticle": "(Niu)",
+ "newarticle": "(𐌽𐌹𐌿𐌾𐌰𐍄𐌰)",
"newarticletext": "𐌻𐌰𐌹𐍃𐍄𐌹𐌳𐌴𐍃 𐌲𐌰𐍅𐌹𐍃 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐍃𐌰𐌴𐌹 𐌽𐌹𐍃𐍄. 𐌳𐌿 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆, 𐌰𐌽 𐌰𐍃𐍄𐍉𐌳𐌴𐌹 𐌼𐌴𐌻𐌾𐌰𐌽 𐌹𐌽 𐌰𐍂𐌺𐌰𐌹 𐌿𐍆 (𐍃𐌰𐌹𐍈 [$1 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆] 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐌹𐌽 𐌺𐌿𐌽𐌸𐌾𐌰). 𐌾𐌰𐌱𐌰𐌹 𐌹𐍃 𐌷𐌴𐍂 𐌹𐌽 𐌰𐌹𐍂𐌶𐌴𐌹𐌽𐍃, 𐌲𐌰𐌲𐌲 𐌳𐌿 <𐍃𐍄𐍂𐍉𐌽𐌲>𐌹𐌱𐌿𐌺𐌰𐌷𐌰𐌿𐌱𐌹𐌳𐌹𐌻𐍉𐌽.",
"noarticletext": "𐌽𐌿 𐌽𐌹 𐍃𐌹𐌽𐌳 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.\n𐌼𐌰𐌲𐍄 [[Special:Search/{{PAGENAME}}|𐍃𐍉𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐌻𐌰𐌿𐌱𐌰-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹]] 𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐌻𐌰𐌿𐌱𐌰𐌼, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 𐍃𐍉𐌺𐌾𐌰𐌽 𐌲𐌰𐌷𐌰𐌷𐌾𐍉 𐌲𐌰𐍆𐌰𐍃𐍄𐍉𐍃], 𐌰𐌹𐌸𐌸𐌰𐌿 [{{fullurl:{{FULLPAGENAME}}|action=edit}} 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆.]</ span>",
"noarticletext-nopermission": "𐌽𐌿 𐌽𐌹 𐍃𐌹𐌽𐌳 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.\n𐌼𐌰𐌲𐍄 [[Special:Search/{{PAGENAME}}|𐍃𐍉𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐌻𐌰𐌿𐌱𐌰-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹]] 𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐌻𐌰𐌿𐌱𐌰𐌼, 𐌸𐌰𐌿 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 𐍃𐍉𐌺𐌾𐌰𐌽 𐌲𐌰𐌷𐌰𐌷𐌾𐍉 𐌲𐌰𐍆𐌰𐍃𐍄𐍉𐍃]</span>, 𐌹𐌸 𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆.",
- "updated": "(Nuwisan)",
- "previewnote": "'''𐍃𐌰𐌷 𐌹𐍃𐍄 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰. 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌲𐌰𐌼𐌴𐌻𐌾𐌹𐌸 𐌽𐌹 𐌰𐍆 𐌸𐌹𐌶𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐍃!'''",
- "editing": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌰𐍆 $1",
- "creating": "𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐍃/𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐌴𐌹 $1",
- "editingsection": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌰𐍆 $1 (𐍆𐌴𐍂𐌰)",
- "editingcomment": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌰𐍆 $1 (𐍂𐍉𐌳𐌾𐌰𐍆𐌴𐍂𐌰)",
- "yourdiff": "ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\83ð\90\8c°ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8cº𐍉𐍃",
+ "updated": "(𐌰𐌽𐌰𐌽𐌹𐍅𐌹𐌸)",
+ "previewnote": "<strong>𐌲𐌰𐌼𐌹𐌽𐌸𐌴𐌹 𐌸𐌰𐍄𐌴𐌹 𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌸𐌰𐍄𐌰𐌹𐌽𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐍃.</strong>\n𐌸𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌽𐌰𐌿𐌷 𐌽𐌹 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌽𐍉𐍃 𐍃𐌹𐌽𐌳!",
+ "editing": "{{GENDER:𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌴𐌹}} $1",
+ "creating": "{{GENDER:𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐍃|𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐌴𐌹}} $1",
+ "editingsection": "{{GENDER:𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌴𐌹}} $1 (𐌳𐌰𐌹𐌻)",
+ "editingcomment": "{{GENDER:𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌴𐌹}} $1 (𐌽𐌹𐌿𐌾𐌰 𐌳𐌰𐌹𐌻)",
+ "yourdiff": "ð\90\8c²ð\90\8c°ð\90\8d\83ð\90\8cºð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½𐍉𐍃",
"template-protected": "(𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳)",
- "template-semiprotected": "(halb-gabaírgjan)",
+ "template-semiprotected": "(𐌷𐌰𐌱𐌰𐌹𐌸 𐌷𐌰𐌻𐌱𐌰𐌼𐌿𐌽𐌸)",
"hiddencategories": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌹𐍃𐍄 𐌲𐌰𐌳𐌰𐌹𐌻𐌰 {{PLURAL:$1|1 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌹𐍃 𐌺𐌿𐌽𐌾𐌹𐍃|$1 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌰𐌹𐌶𐌴 𐌺𐌿𐌽𐌾𐌴}}:",
"permissionserrorstext-withaction": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 $2, 𐌹𐌽 {{PLURAL:$1|𐌹𐍆𐍄𐌿𐌼𐌰𐌹𐌶𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃|𐌹𐍆𐍄𐌿𐌼𐌰𐌹𐌶𐍉 𐍅𐌰𐌹𐌷𐍄𐌴}}:",
"moveddeleted-notice": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌿𐍃𐌽𐌿𐌼𐌰𐌽𐍃 𐌹𐍃𐍄. 𐌿𐍃𐌽𐌿𐌼𐍄𐍃 𐌾𐌰𐌷 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐍃 𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹𐌽𐌰𐌹𐍃 𐌿𐍆 𐍃𐌹𐌽𐌳 𐌿𐍃𐍄𐌰𐌹𐌺𐌽𐌴𐌹𐌽𐌰𐌹.",
"post-expand-template-inclusion-warning": "'''𐌷𐍅𐍉𐍄𐌾𐌰𐌽𐌳𐍃:''' 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐌳 𐌿𐍆𐌰𐍂𐌼𐌹𐌺𐌹𐌻𐍃. 𐍃𐌿𐌼𐍃 𐍆𐌰𐌿𐍂𐌴𐌼𐌴𐌻𐌴𐌹𐌽𐍉𐍃 𐌽𐌹 𐌼𐌰𐌲 𐍅𐌹𐍃𐌰𐌽 𐌸𐌰𐍂",
"post-expand-template-inclusion-category": "𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌸𐌰𐍂 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐌳 𐌿𐍆𐌰𐍂𐌼𐌹𐌺𐌹𐌻𐍃",
"viewpagelogs": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐌹𐌽𐍃 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
- "currentrev": "ð\90\8c½ð\90\8c¿ ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³𐌴𐌹𐌽𐍃",
+ "currentrev": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c° ð\90\8c²ð\90\8c°ð\90\8c±ð\90\8d\89ð\90\8d\84𐌴𐌹𐌽𐍃",
"currentrev-asof": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $1",
"revisionasof": "𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $1",
"revision-info": "𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃 𐌹𐌽 $1 𐍆𐍂𐌰𐌼 {{GENDER:$6|$2}}$7",
"last": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍃",
"page_first": "frumists",
"page_last": "𐍃𐍀𐌴𐌳𐌿𐌼𐌹𐍃𐍄𐍃",
- "histfirst": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c¸ð\90\8c¹ð\90\8d\83",
- "histlast": "ð\90\8d\83ð\90\8d\80ð\90\8c´ð\90\8c³ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8d\83",
+ "histfirst": "ð\90\8c°ð\90\8c»ð\90\8c¸ð\90\8c¹ð\90\8c¶ð\90\8d\89",
+ "histlast": "ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8d\89",
"history-feed-item-nocomment": "$1 at $2",
"rev-delundel": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌰𐌽𐌰𐍃𐌹𐌿𐌽",
- "revdel-restore": "ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c¹ð\90\8d\83 ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8d\83ð\90\8c¹ð\90\8c¿ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c·ð\90\8d\84ð\90\8c´ð\90\8c¹ð\90\8c²ð\90\8d\83",
+ "revdel-restore": "ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8d\83ð\90\8c¹ð\90\8c¿ð\90\8c½",
"revertmerge": "𐌿𐌽𐌲𐌰𐍄𐌹𐌻𐍉𐍃",
"history-title": "𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐌹𐍃𐍀𐌹𐌻𐌻 𐌻𐌰𐌿𐌱𐌹𐍃 \"$1\"",
"difference-title": "𐌲𐌰𐍃𐌺𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌼𐌹𐌸 𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐍉𐌼 𐌻𐌰𐌿𐌱𐌹𐍃 \"$1\"",
"search-suggest": "𐍄𐌰𐌹𐌺𐌽𐌹𐌳𐌰 𐌸𐌿: $1",
"searchall": "𐌰𐌻𐌻𐍃",
"search-showingresults": "{{ZPLURAL:$4|𐍄𐌰𐌿𐌹 <strong>$1 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃 <strong>$3|𐍄𐍉𐌾𐌰 <strong>$1 - $2 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃 <strong>$3}}",
- "search-nonefound": "ð\90\8c½ð\90\8c¹ ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c·ð\90\8c¿ð\90\8c½ ð\90\8c²ð\90\8c°ð\90\8c²ð\90\8c¹ð\90\8c±ð\90\8c¾ð\90\8d\89 ð\90\8d\86ð\90\8c¿ð\90\8c»ð\90\8c»ð\90\8c¾ð\90\8c¹ð\90\8c¸ ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½",
- "powersearch-legend": "𐍃𐍉𐌺𐌴𐌹𐌸",
+ "search-nonefound": "ð\90\8c½ð\90\8c¹ ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c¹ ð\90\8d\85ð\90\8c°ð\90\8d\83 ð\90\8d\83ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8d\83ð\90\8d\85ð\90\8c° ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½.",
+ "powersearch-legend": "𐍃𐍉𐌺𐌴𐌹",
"preferences": "𐌼𐌴𐌹𐌽𐍉𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃",
"mypreferences": "𐌲𐌰𐌻𐌴𐌹𐌺𐌰𐌽𐌳𐌴𐌹𐌽𐍃 𐍅𐌰𐌹𐌷𐍄𐍃",
- "prefs-skin": "Seidofill",
+ "prefs-skin": "𐍆𐌹𐌻𐌻",
"skin-preview": "Faúrsaiƕa",
- "saveprefs": "Melja",
- "searchresultshead": "Sokeiþ",
+ "saveprefs": "𐌲𐌰𐍆𐌰𐍃𐍄",
+ "searchresultshead": "𐍃𐍉𐌺𐌴𐌹",
"grouppage-sysop": "{{ns:project}}:𐍃𐌴𐌹𐌳𐍉𐍆𐌰𐌸𐍃",
"right-writeapi": "𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐍃 API 𐌼𐌴𐌻𐌴𐌹𐌽𐌰𐌹𐍃",
"rightslog": "Niutandis stutjanlog",
"diff": "𐌼𐌹𐍃𐍃",
"hist": "𐍃𐍀𐌹𐌻𐌻",
"hide": "𐍆𐌹𐌻𐌷𐌰𐌽",
- "show": "ð\90\8c·ð\90\8c¿ð\90\8c»ð\90\8c¾ð\90\8c°ð\90\8c½",
+ "show": "ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¿ð\90\8c²ð\90\8c´ð\90\8c¹",
"minoreditletter": "l",
"newpageletter": "N",
"boteditletter": "b",
"imagelinks": "𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐍃 𐍆𐌰𐌴𐌹𐌻𐌴",
"linkstoimage": "𐌰𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|𐍃𐍉 𐍃𐌴𐌹𐌳𐍉 𐌻𐌴𐌹𐌽𐌺𐍉𐌸|𐌸𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐌳}} 𐌸𐌹𐌶𐍉𐌶𐌿𐌷 𐍆𐌴𐌹𐌻𐍉𐍃",
"sharedupload-desc-here": "𐍃𐍉 𐌳𐌰𐍄𐌰 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 $1 𐌾𐌰𐌷 𐌼𐌰𐌲 𐌱𐍂𐌿𐌺𐌾𐌰𐌳𐌰 𐍆𐍂𐌰𐌼 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐍉𐌼.\n𐌲𐌰𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐍃 𐌰𐌽𐌰 𐍃𐌴𐌹𐌽𐌰𐌼𐌼𐌰 [$2 𐌳𐌰𐍄𐌰 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐌱𐌰] 𐌾𐌰𐌹𐌽𐌰𐍂 𐌰𐍄𐌰𐌿𐌲𐌹𐌸𐍃 𐌹𐍃𐍄 𐌿𐍆.",
- "filedelete-submit": "Taíran",
- "mimesearch": "MIME sokeiþ",
+ "filedelete-submit": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹",
+ "mimesearch": "MIME 𐍃𐍉𐌺𐌴𐌹",
"listredirects": "𐍄𐌰𐌻𐌰 𐌰𐍆 𐍄𐌰𐌹𐌺𐌾𐌰𐌽𐍃𐌴𐌹𐌳𐍉𐍃",
"randompage": "𐌸𐌿𐍃 𐌿𐌽𐌺𐌿𐌽𐌸𐍃 𐌻𐌰𐌿𐍆𐍃",
- "statistics": "ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8d\83ð\90\8d\84ð\90\8c°ð\90\8d\84ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c¹ð\90\8cº",
- "brokenredirects-edit": "(𐌼𐌰𐌹𐌳𐌾𐌰𐌽)",
+ "statistics": "ð\90\8d\82ð\90\8c°ð\90\8c¸ð\90\8c¾ð\90\8d\89ð\90\8c½ð\90\8d\83",
+ "brokenredirects-edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
"brokenredirects-delete": "(𐍄𐌰𐌹𐍂𐌰𐌽)",
"nbytes": "$1 {{PLURAL:$1|𐌱𐌹𐍄|𐌱𐌰𐍄𐌰}}",
"ncategories": "$1 {{PLURAL:$1|𐌺𐌿𐌽𐌾𐌰|𐌺𐌿𐌽𐌾𐍉𐍃}}",
- "nlinks": "$1 {{PLURAL:$1|táikjanbandi|táikjanbandja}}",
+ "nlinks": "$1 {{PLURAL:$1|𐌲𐌰𐍅𐌹𐍃𐍃|𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃}}",
"nmembers": "$1 {{PLURAL:$1|niutand|niutanda}}",
- "wantedpages": "Gaírnedum seidam",
- "shortpages": "ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\84ð\90\8c¹ð\90\8c»ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³𐍉𐍃",
- "longpages": "𐌻𐌰𐌲𐌲𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
+ "wantedpages": "𐌲𐌰𐌹𐍂𐌽𐌹𐌳𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
+ "shortpages": "ð\90\8c¼ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c²ð\90\8c°ð\90\8c¹ ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±𐍉𐍃",
+ "longpages": "𐌻𐌰𐌲𐌲𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
"listusers": "𐍂𐌴𐌲𐌹𐍃𐍄𐍂𐌴𐍂𐌰𐌳𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
"newpages": "𐌽𐌹𐌿𐌾𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
"move": "𐌽𐌰𐌼𐌾𐌰𐌽 𐌰𐍆𐍄𐍂𐌰",
- "movethispage": "ð\90\8d\83ð\90\8cºð\90\8c¹ð\90\8c¿ð\90\8c±ð\90\8c°ð\90\8c½ ð\90\8d\83ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+ "movethispage": "ð\90\8c¼ð\90\8c¹ð\90\8c¸ð\90\8d\83ð\90\8c°ð\90\8d\84ð\90\8c´ð\90\8c¹ ð\90\8c¸ð\90\8c°ð\90\8c½ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86",
"booksources": "𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
"booksources-search-legend": "𐍃𐍉𐌺𐌴𐌹 𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
"booksources-search": "𐍃𐍉𐌺𐌴𐌹",
"speciallogtitlelabel": "Namo:",
"log": "𐌻𐍉𐌲𐌱𐍉𐌺𐍉𐍃",
"all-logs-page": "𐌰𐌻𐌻𐌰 𐌻𐍉𐌲𐍉𐍃",
- "allpages": "ð\90\8c°ð\90\8c»ð\90\8c»ð\90\8c¹ð\90\8d\83 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³𐍉𐍃",
+ "allpages": "ð\90\8c°ð\90\8c»ð\90\8c»ð\90\8c°ð\90\8c¹ ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±𐍉𐍃",
"nextpage": "𐌹𐍆𐍄𐌿𐌼𐌰 𐍃𐌴𐌹𐌳𐍉 ($1)",
- "prevpage": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89 ($1)",
+ "prevpage": "ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8d\83 ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8d\86ð\90\8d\83 ($1)",
"allarticles": "𐌰𐌻𐌻𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
"allpagessubmit": "𐌲𐌰𐌲𐌲",
"categories": "𐌺𐌿𐌽𐌾𐌰",
"linksearch-ns": "𐍃𐌴𐌹𐌳𐍉𐍆𐌴𐍂𐌰:",
- "emailuser": "𐍃𐌰𐌽𐌳𐌾𐌰𐌽 𐌸𐍉 𐌽𐌹𐌿𐍄𐌰𐌽𐌳 𐌱𐍉𐌺𐍉𐌼",
- "watchlist": "ð\90\8c¼ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8d\83ð\90\8c»ð\90\8c´ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c°",
+ "emailuser": "{{GENDER: 𐍃𐌰𐌽𐌳𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌳𐌿 𐌸𐌰𐌼𐌼𐌰 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳|𐍃𐌰𐌽𐌳𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌳𐌿 𐌸𐌹𐌶𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌾𐌰𐌹}}",
+ "watchlist": "ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8d\85ð\90\8c¹ð\90\8cºð\90\8d\89",
"mywatchlist": "𐌻𐌰𐌹𐍃𐍄𐌰𐌻𐌴𐌹𐍃𐍄𐌰",
"watch": "𐍅𐌰𐍂𐌰𐌽",
- "watchthispage": "ð\90\8d\85ð\90\8c°ð\90\8d\82ð\90\8c°ð\90\8c½ ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+ "watchthispage": "ð\90\8c°ð\90\8d\84ð\90\8d\85ð\90\8c¹ð\90\8d\84 ð\90\8c¸ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°",
"unwatch": "𐌽𐌹𐍅𐌰𐍂𐌰𐌽",
- "watchlist-details": "{{PLURAL:$1|$1 seido|$1 seidona}} witáiþs inu maþleiseidam.",
+ "watchlist-details": "{{PLURAL:$1|$1 𐌻𐌰𐌿𐍆𐍃|$1 𐌻𐌰𐌿𐌱𐍉𐍃}} 𐌰𐌽𐌰 𐌸𐌴𐌹𐌽𐌰𐌹 𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉𐌽, 𐌽𐌹 𐍃𐌿𐌽𐌳𐍂𐍉 𐍂𐌰𐌷𐌽𐌾𐌰𐌽𐌳𐌰 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰𐌻𐌰𐌿𐌱𐍉𐍃.",
"watching": "Wita...",
"unwatching": "Niwita...",
"created": "𐌲𐌰𐍃𐌺𐌰𐍀𐌾𐌰𐌽",
- "deletepage": "ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c° ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+ "deletepage": "ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8cµð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c´ð\90\8c¹ ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°",
"delete-legend": "𐍄𐌰𐌹𐍂𐌰𐌽",
"actioncomplete": "𐍅𐌰𐍃𐌿𐌷 𐌹𐍄𐌰 𐌲𐌰𐌿𐍃𐍄𐌹𐌿𐌷𐌰𐌽",
"dellogpage": "𐍄𐌰𐌹𐍂𐌰 𐌰𐌹𐍂𐍅𐌱𐍉𐌺𐌰",
"rollbacklink": "𐌰𐍆𐍅𐌰𐌻𐍅𐌴𐌹",
"rollbacklinkcount": "𐌰𐍆𐍅𐌰𐌻𐍅𐌴𐌹 $1 {{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃}}",
"protectlogpage": "Log af Baírgjan",
- "prot_1movedto2": "[[$1]] skiubiþ du [[$2]]",
- "protect-level-sysop": "ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8d\86ð\90\8c°ð\90\8c¸ð\90\8d\83 ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c°ð\90\8c·ð\90\8c°",
- "protect-expiring": "bláuþiþ $1 (UTC)",
+ "prot_1movedto2": "[[$1]] 𐌼𐌹𐌸𐍃𐌰𐍄𐌹𐌸 𐌳𐌿 [[$2]]",
+ "protect-level-sysop": "ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c»ð\90\8c´ð\90\8d\84ð\90\8c¹ð\90\8c¸ ð\90\8c¸ð\90\8c°ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c´ð\90\8c¹ ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8cºð\90\8d\83",
+ "protect-expiring": "𐌿𐍃𐍄𐌹𐌿𐌷𐌹𐌸 $1 (UTC)",
"restriction-type": "Freihals:",
- "restriction-edit": "ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c°ð\90\8c½",
+ "restriction-edit": "ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹",
"restriction-move": "𐍃𐌺𐌹𐌿𐌱𐌰𐌽",
"undeletebtn": "𐌰𐍆𐍄𐍂𐌰 𐌲𐌰𐌱𐍉𐍄𐌾𐌰𐌽",
"undeletelink": "𐍃𐌰𐌹𐍈𐌰𐌽/𐌰𐍆𐍄𐍂𐌰𐌲𐌰𐍃𐌰𐍄𐌾𐌰𐌽",
"undeleteviewlink": "𐍃𐌰𐌹𐍈𐌹𐍃",
- "undelete-search-submit": "Sokeiþ",
+ "undelete-search-submit": "𐍃𐍉𐌺𐌴𐌹",
"namespace": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼:",
- "invert": "Afwandjan kustus",
+ "invert": "𐌲𐌰𐍅𐌰𐌽𐌳𐌴𐌹 𐌸𐌰𐍄𐌰 𐌲𐌰𐍅𐌰𐌻𐌹𐌳𐍉",
"blanknamespace": "(𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐍃)",
"contributions": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃 {{{{GENDER:$1|User}}",
"mycontris": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃",
"year": "𐍆𐍂𐌰𐌼 𐌾𐌴𐍂𐌰 (𐌾𐌰𐌷 𐌰𐍆𐍄𐌿𐌼𐌰):",
"sp-contributions-newbies-sub": "Faúr niujis niutandis",
"sp-contributions-blocklog": "Logboka af afdraúsjan",
- "sp-contributions-talk": "Maþleiseido",
+ "sp-contributions-talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
"whatlinkshere": "𐌰𐌻𐌻𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 𐌷𐌹𐌳𐍂𐌴",
"whatlinkshere-title": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐍄𐌰𐌹𐌺𐌽𐌾𐌰𐌽𐌳 𐌳𐌿 \"$1\"",
"whatlinkshere-page": "𐌻𐌰𐌿𐍆𐍃:",
"istemplate": "ináukan",
"whatlinkshere-prev": "{{PLURAL:$1|aftuma|aftumans $1}}",
"whatlinkshere-next": "{{PLURAL:$1|iftuma|iftumans $1}}",
- "whatlinkshere-links": "← táikajanbandja",
+ "whatlinkshere-links": "← 𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
"whatlinkshere-hidelinks": "$1 𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
- "blockip": "ð\90\8c°ð\90\8d\86ð\90\8c³ð\90\8d\82ð\90\8c°ð\90\8c¿ð\90\8d\83ð\90\8c¾ð\90\8c°ð\90\8c½ ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8d\84ð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ð\90\8d\83",
+ "blockip": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c´ð\90\8c¹ {{GENDER:$1|user}}",
"ipbreason": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰:",
"ipboptions": "𐌱 𐌰𐍅𐍂𐌰:2 hours, 𐌰 𐌳𐌰𐌲𐍃:1 day, 𐌲 𐌳𐌰𐌲𐍉𐍃:3 days, 𐌰 𐍅𐌹𐌺𐍉:1 week, 𐌱 𐍅𐌹𐌺𐍉𐌽𐍃:2 weeks, 𐌰 𐌼𐌴𐌽𐍉𐌸𐍃:1 month, 𐌲 𐌼𐌴𐌽𐍉𐌸𐍉𐍃:3 months, 𐌵 𐌼𐌴𐌽𐍉𐌸𐍉𐍃:6 months, 𐌰 𐌾𐌴𐍂:1 year, 𐌹𐌽𐌿𐍄𐍂𐌹𐌲𐌲𐌴𐌽𐌳𐌴𐌹𐍃:infinite",
- "ipblocklist-submit": "Sokeiþ",
- "infiniteblock": "ajukduþs",
+ "ipblocklist-submit": "𐍃𐍉𐌺𐌴𐌹",
+ "infiniteblock": "𐌰𐌽𐌳𐌰𐌻𐌰𐌿𐍃",
"blocklink": "𐍆𐌰𐌿𐍂𐌳𐌰𐌼𐌼𐌴𐌹",
"unblocklink": "𐍅𐌰𐌽𐌳𐌾𐌰𐌽",
"change-blocklink": "𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐍅𐌰𐌿𐍂𐌾𐌰𐍅𐌰𐌳𐌳𐌾𐌿𐍃",
"contribslink": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃",
- "blocklogpage": "ð\90\8c»ð\90\8d\89ð\90\8c²ð\90\8c±ð\90\8d\89ð\90\8cºð\90\8c° ð\90\8c°ð\90\8d\86 ð\90\8c°ð\90\8d\86ð\90\8c³ð\90\8d\82ð\90\8c°ð\90\8c¿ð\90\8d\83ð\90\8c¾ð\90\8c°ð\90\8c½",
+ "blocklogpage": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c°ð\90\8c¹ð\90\8d\83 ð\90\8c²ð\90\8c°ð\90\8d\86ð\90\8c°ð\90\8d\83ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8d\83.",
"blocklogentry": "𐌰𐍆𐌳𐍂𐌰𐌿𐍃𐌹𐌸 [[$1]] 𐍆𐌰𐌿𐍂 $2 $3",
- "newtitle": "ð\90\8c³ð\90\8c¿ ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c¹ð\90\8d\83 ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8d\89ð\90\8d\83:",
- "move-watch": "ð\90\8d\85ð\90\8c¹ð\90\8d\84ð\90\8c°ð\90\8c½ ð\90\8d\83ð\90\8d\89 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+ "newtitle": "ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c¹ ð\90\8c¿ð\90\8d\86ð\90\8c°ð\90\8d\82ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c¹:",
+ "move-watch": "ð\90\8c°ð\90\8d\84ð\90\8d\85ð\90\8c¹ð\90\8d\84 ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8c½ð\90\8c½ð\90\8c°ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c° ð\90\8c¾ð\90\8c°ð\90\8c· ð\90\8c¼ð\90\8c¿ð\90\8c½ð\90\8c³ð\90\8d\82ð\90\8c´ð\90\8c¹ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°",
"movepagebtn": "𐍃𐌺𐌹𐌿𐌱𐌰 𐍃𐌴𐌹𐌳𐍉",
- "movelogpage": "Log af skiubans",
+ "movelogpage": "𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽",
"movereason": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰:",
"revertmove": "𐍂𐌰𐌹𐌳𐌾𐌰𐌽",
"export": "𐌿𐍄𐌱𐌰𐌹𐍂 𐌻𐌰𐌿𐌱𐌰𐌽𐍃",
"thumbnail-more": "\n𐌼𐌹𐌺𐌹𐌻𐌴𐌹",
"tooltip-pt-userpage": "{{GENDER:|Your user}} 𐌻𐌰𐌿𐍆𐍃",
- "tooltip-pt-mytalk": "{{GENDER:|Your}} 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃",
+ "tooltip-pt-mytalk": "{{GENDER:|𐌸𐌴𐌹𐌽𐍃}} 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃",
"tooltip-pt-preferences": "{{GENDER:|Your}} 𐌲𐌰𐌻𐌴𐌹𐌺𐌰𐌽𐌳𐌴𐌹𐌽𐍃 𐍅𐌰𐌹𐌷𐍄𐍃",
"tooltip-pt-watchlist": "𐍅𐌹𐌺𐍉 𐌻𐌰𐌿𐌱𐌴 𐌸𐌹𐌶𐌴𐌴𐌹 𐌰𐍄𐍅𐌰𐌹𐍃𐍄 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌼",
"tooltip-pt-mycontris": "A list of {{GENDER:|your}} 𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃",
"tooltip-ca-viewsource": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳. 𐌼𐌰𐌲𐍄 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌼𐌿𐌽𐌳 𐍃𐌰𐌹𐍈𐌰𐌽.",
"tooltip-ca-history": "𐌰𐍆𐍄𐌿𐌼𐍉𐍃 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍉𐍃 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
"tooltip-ca-protect": "𐌱𐌰𐌹𐍂𐌲𐌰 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉",
- "tooltip-ca-delete": "ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c°ð\90\8c½ ð\90\8d\83ð\90\8d\89 ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89",
+ "tooltip-ca-delete": "ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8cµð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c´ð\90\8c¹ ð\90\8c¸ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c°",
"tooltip-ca-move": "𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
"tooltip-ca-watch": "𐌱𐌹𐌰𐌹𐌰𐌿𐌺 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆 𐌳𐌿 𐌸𐌴𐌹𐌽𐌰𐌹 𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉𐌽",
- "tooltip-search": "ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c½ {{SITENAME}}",
+ "tooltip-search": "ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c´ð\90\8c¹ {{SITENAME}}",
"tooltip-search-go": "𐌾𐌰𐌱𐌰𐌹 𐌹𐍃𐍄, 𐌲𐌰𐌲𐌲 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐌼𐌹𐌸 𐍃𐌰𐌼𐌹𐌽 𐌽𐌰𐌼𐌹𐌽.",
"tooltip-search-fulltext": "𐍃𐍉𐌺𐌴𐌹 𐌻𐌰𐌿𐌱𐌰𐌽𐍃 𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼",
"tooltip-p-logo": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
"tooltip-ca-nstab-user": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌺𐌾𐌰𐌻𐌰𐌿𐍆",
"tooltip-ca-nstab-special": "𐍃𐌰 𐌹𐍃𐍄 𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃 𐌾𐌰𐌷 𐌽𐌹 𐌼𐌰𐌲 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰.",
"tooltip-ca-nstab-project": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆",
- "tooltip-ca-nstab-image": "𐍃𐌰𐌹𐍈𐌰𐌽 𐌸𐍉 𐍆𐌴𐌹𐌻𐌰𐍃𐌴𐌹𐌳𐍉𐌽",
- "tooltip-ca-nstab-template": "𐍃𐌰𐌹𐍈𐌹𐍃 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽",
+ "tooltip-ca-nstab-image": "𐍃𐌰𐌹𐍈 𐍆𐌰𐌴𐌹𐌻𐌰𐌻𐌰𐌿𐍆",
+ "tooltip-ca-nstab-template": "𐍃𐌰𐌹𐍈 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽",
"tooltip-ca-nstab-category": "𐍃𐌰𐌹𐍈 𐌺𐌿𐌽𐌾𐌰𐌻𐌰𐌿𐍆",
"tooltip-save": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌸𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃",
- "tooltip-preview": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8d\83ð\90\8c°ð\90\8d\88ð\90\8c¹ð\90\8d\83 ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c°, ð\90\8c±ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c° ð\90\8c¸ð\90\8c¿ð\90\8cº ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c¾ð\90\8c°ð\90\8c½ ð\90\8c¸ð\90\8c°ð\90\8d\84ð\90\8c° ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c° ð\90\8c¼ð\90\8c´ð\90\8c»ð\90\8c¾ð\90\8c¹ð\90\8d\83!",
+ "tooltip-preview": "ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c°ð\90\8d\83ð\90\8c°ð\90\8c¹ð\90\8d\88 ð\90\8c¸ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83 ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\89ð\90\8d\83. ð\90\8c±ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c°ð\90\8c¼ ð\90\8c¸ð\90\8c¿ð\90\8cº, ð\90\8c±ð\90\8d\82ð\90\8c¿ð\90\8cºð\90\8c´ð\90\8c¹ ð\90\8c¸ð\90\8c¹ð\90\8d\83 ð\90\8c¸ð\90\8c°ð\90\8d\84ð\90\8c° ð\90\8d\86ð\90\8d\82ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84 ð\90\8d\86ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c¸ð\90\8c¹ð\90\8c¶ð\90\8c´ð\90\8c¹ ð\90\8c²ð\90\8c°ð\90\8d\86ð\90\8c°ð\90\8d\83ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8d\83.",
"tooltip-diff": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍈𐌹𐌻𐌴𐌹𐌺𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃 𐌲𐌰𐍄𐌰𐍅𐌹𐌳𐌴𐍃 𐌳𐌿 𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼",
- "tooltip-rollback": "\"ð\90\8c°ð\90\8d\86ð\90\8d\85ð\90\8c°ð\90\8c»ð\90\8d\85ð\90\8c¾ð\90\8c°ð\90\8c½\" ð\90\8c±ð\90\8c°ð\90\8cºð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c¹ð\90\8c¸ ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c¾ð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8c±ð\90\8c¹ ð\90\8c¸ð\90\8c¹ð\90\8c¶ð\90\8c°ð\90\8c¹ ð\90\8d\83ð\90\8c´ð\90\8c¹ð\90\8c³ð\90\8d\89ð\90\8c½ ð\90\8d\85ð\90\8c¹ð\90\8d\83ð\90\8c°ð\90\8c½ ð\90\8d\83ð\90\8d\89 ð\90\8c²ð\90\8c°ð\90\8c¼ð\90\8c°ð\90\8c³ð\90\8c¾ð\90\8c´ð\90\8c¹ ð\90\8c¼ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8c²ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8d\83 ð\90\8c½ð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c° ð\90\8c²ð\90\8c¹ð\90\8c±ð\90\8c°ð\90\8c¾ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8d\86ð\90\8d\82ð\90\8c°ð\90\8c¼ ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8d\83 ð\90\8cºð\90\8c»ð\90\8c¹ð\90\8cº",
+ "tooltip-rollback": "\"ð\90\8c°ð\90\8d\86ð\90\8d\85ð\90\8c°ð\90\8c»ð\90\8d\85ð\90\8c´ð\90\8c¹\" ð\90\8c²ð\90\8c°ð\90\8c½ð\90\8c°ð\90\8d\83ð\90\8c¾ð\90\8c¹ð\90\8c¸ ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½(ð\90\8d\89ð\90\8d\83) ð\90\8c³ð\90\8c¿ ð\90\8c¸ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8c»ð\90\8c°ð\90\8c¿ð\90\8c±ð\90\8c° ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c¹ð\90\8d\83 ð\90\8c±ð\90\8c¹ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¹ð\90\8d\83/ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c¹ð\90\8d\83ð\90\8d\84ð\90\8c°ð\90\8c¹ð\90\8c¶ð\90\8d\89ð\90\8d\83 ð\90\8c±ð\90\8c¹ð\90\8c°ð\90\8c¿ð\90\8cºð\90\8c°ð\90\8c½ð\90\8c³ð\90\8c¾ð\90\8d\89ð\90\8d\83 ð\90\8c¹ð\90\8c½ ð\90\8c°ð\90\8c¹ð\90\8c½ð\90\8c°ð\90\8c¼ð\90\8c¼ð\90\8c° ð\90\8d\83ð\90\8c¹ð\90\8c½ð\90\8c¸ð\90\8c°",
"tooltip-undo": "\"𐌽𐌹𐌿𐍃𐌺𐌰𐍀𐌾𐌰𐌽\" 𐌱𐌰𐌺𐌼𐌰𐌹𐌳𐌾𐌹𐌸 𐌹𐌽𐌼𐌰𐌹𐌳𐌲𐌴𐌹𐌽𐍃 𐌾𐌰𐌷 𐌿𐍃𐌻𐌿𐌺𐍉𐌸 𐌼𐌰𐌹𐌳𐌾𐌰𐍆𐍉𐍂𐌼𐍉𐌽 𐍃𐍅𐌴 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰 𐌷𐌹𐍅𐌾𐌰. 𐌸𐌰𐍄𐌰 𐌻𐌴𐍄 𐌰𐌽𐌰𐌿𐌺𐌰𐌽𐌰𐌽 𐍃𐌰𐌿𐌸𐌰 𐌹𐌽 𐌹𐌽𐌽𐌰𐌷𐌰𐌻𐌳𐌰𐌰𐌽𐌲𐌰𐌱𐌰.",
"tooltip-summary": "𐌰𐍄𐌲𐌰𐌲𐌲𐌹𐍃 𐌹𐌽𐌽𐌰𐌷𐌰𐌻𐌳𐌰𐌰𐌽𐌲𐌰𐌱𐌰 𐌼𐌰𐌿𐍂𐌲𐌾𐌰",
"pageinfo-toolboxlink": "𐌺𐌿𐌽𐌸𐌹 𐌻𐌰𐌿𐌱𐌹𐍃",
- "previousdiff": "â\86\90 ð\90\8c°ð\90\8d\86ð\90\8d\84ð\90\8c¿ð\90\8c¼ð\90\8c° ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c¹𐍃",
+ "previousdiff": "â\86\90 ð\90\8d\86ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c½ð\90\8c¹ð\90\8c¶ð\90\8c´ð\90\8c¹ ð\90\8c¹ð\90\8c½ð\90\8c¼ð\90\8c°ð\90\8c¹ð\90\8c³ð\90\8c´ð\90\8c¹ð\90\8c½𐍃",
"nextdiff": "𐌽𐌹𐌿𐌾𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 →",
"file-info-size": "$1 × $2 𐍀𐌹𐌺𐍃𐌴𐌻𐌰, 𐍆𐌴𐌹𐌻𐍅𐌰𐌷𐍃𐍄𐌿𐍃: $3, 𐌼𐌹𐌼𐌴 𐌺𐌿𐌽𐌹: $4",
"show-big-image": "𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐌰 𐌳𐌰𐍄𐌰",
"show-big-image-preview": "𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌸𐌹𐌶𐍉𐍃 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐌰𐌹𐍃: $1.",
"show-big-image-size": "$1 × $2 𐍆𐍂𐌹𐍃𐌰𐌷𐍄𐌹𐍃𐍄𐌰𐌱𐌴𐌹𐍃",
- "ilsubmit": "Sokeiþ",
+ "ilsubmit": "𐍃𐍉𐌺𐌴𐌹",
"metadata": "𐌿𐍆𐌰𐍂𐌳𐌰𐍄𐌰",
"exif-colorspace": "𐍆𐌰𐍂𐍅𐌰𐍂𐌿𐌼",
"exif-orientation-1": "𐌱𐌹 𐌱𐌹𐌿𐌷𐍄𐌾𐌰",
"namespacesall": "𐌰𐌻𐌻",
- "monthsall": "𐌰𐌻𐌻𐌹𐍃",
- "imgmultigo": "Afgaggan!",
+ "monthsall": "𐌰𐌻𐌻",
+ "imgmultigo": "𐌲𐌰𐌲𐌲!",
"table_pager_limit_submit": "Affgaggan",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰]])",
"version-other": "Anþar",
"tags-create-reason": "𐌳𐌿𐌸𐌸𐌴:",
"tags-create-submit": "𐍃𐌺𐌰𐍀𐌴𐌹",
"tags-create-warnings-below": "𐍅𐌹𐌻𐌴𐌹𐌶𐌿 𐌸𐌰𐌹𐍂𐍈𐌹𐍃𐌰𐌽 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳?",
- "tags-delete-title": "ð\90\8c¿ð\90\8d\83ð\90\8c½ð\90\8c¹ð\90\8c¼ ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c°𐍅𐌰𐌿𐍂𐌳",
+ "tags-delete-title": "ð\90\8c¿ð\90\8d\83ð\90\8c½ð\90\8c¹ð\90\8c¼ ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹𐍅𐌰𐌿𐍂𐌳",
"tags-delete-explanation-initial": "𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐍃 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌿𐍃𐌽𐌹𐌼𐌰𐌽 𐌿𐍃 𐌲𐌹𐌱𐌰𐌲𐌰𐍃𐌰𐍄𐌴𐌹𐌽𐌰𐌹.",
"tags-delete-reason": "𐌳𐌿𐌸𐌸𐌴:",
- "tags-delete-not-found": "ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c°𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌽𐌹𐍃𐍄.",
- "tags-activate-title": "ð\90\8c²ð\90\8c°ð\90\8cµð\90\8c¹ð\90\8c¿ð\90\8c´ð\90\8c¹ ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c°𐍅𐌰𐌿𐍂𐌳",
- "tags-activate-question": "ð\90\8d\85ð\90\8c°ð\90\8c¹ð\90\8d\82ð\90\8c¸ð\90\8c°ð\90\8c¹ð\90\8d\83 ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c°ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ \"$1\" ð\90\8c²ð\90\8c°ð\90\8cµð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c°ð\90\8c½.",
+ "tags-delete-not-found": "ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌽𐌹𐍃𐍄.",
+ "tags-activate-title": "ð\90\8c²ð\90\8c°ð\90\8cµð\90\8c¹ð\90\8c¿ð\90\8c´ð\90\8c¹ ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹𐍅𐌰𐌿𐍂𐌳",
+ "tags-activate-question": "ð\90\8d\83ð\90\8d\89ð\90\8cºð\90\8c´ð\90\8c¹ð\90\8c½ð\90\8c¹ð\90\8d\85ð\90\8c°ð\90\8c¿ð\90\8d\82ð\90\8c³ \"$1\" ð\90\8c²ð\90\8c°ð\90\8cµð\90\8c¹ð\90\8c¿ð\90\8c¾ð\90\8c¹ð\90\8d\83.",
"tags-activate-reason": "𐌳𐌿𐌸𐌸𐌴:",
"tags-activate-not-found": "𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌽𐌹𐍃𐍄.",
"tags-activate-submit": "𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
"tags-deactivate-reason": "𐌳𐌿𐌸𐌸𐌴:",
"tags-deactivate-submit": "𐌿𐌽𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
"logentry-delete-delete": "$1 {{GENDER:$2|𐌿𐍃𐌽𐌰𐌼}} 𐌻𐌰𐌿𐍆 $3",
- "logentry-move-move": "$1 {{GENDER:$2|𐌼𐌹𐌸𐍃𐌰𐍄𐌹𐌳𐌰}} 𐌻𐌰𐌿𐍆𐍃 $3 𐌳𐌿 $4",
+ "logentry-move-move": "$1 {{GENDER:$2|𐌼𐌹𐌸𐍃𐌰𐍄𐌹𐌳𐌰}} 𐌻𐌰𐌿𐍆 $3 𐌳𐌿 $4",
"logentry-newusers-create": "𐌱𐍂𐌿𐌺𐌾𐌰𐌺𐌰𐍅𐍄𐍃𐌾𐍉 $1 𐍅𐌰𐍃 {{{{GENDER:$2|𐌲𐌰𐍃𐌺𐌰𐍀𐌰𐌽𐌰}}",
- "rightsnone": "(ni áinshun)",
+ "rightsnone": "(𐌽𐌹)",
"searchsuggest-search": "𐍃𐍉𐌺𐌴𐌹"
}
"november-date": "નવેમ્બર $1",
"december-date": "ડિસેમ્બર $1",
"pagecategories": "{{PLURAL:$1|શ્રેણી|શ્રેણીઓ}}",
- "category_header": "શ્રેણી \"$1\"માં પાના",
+ "category_header": "શ્રેણી \"$1\" ના પાનાં",
"subcategories": "ઉપશ્રેણીઓ",
"category-media-header": "શ્રેણી \"$1\"માં દ્રશ્ય કે શ્રાવ્ય સભ્યો",
"category-empty": "''આ શ્રેણીમાં હાલમાં કોઇ લેખ કે અન્ય સભ્ય નથી.''",
"passwordreset-emailtext-user": "વેબસાઈટ {{SITENAME}} ના વપરાશકર્તા $1 એ તમારા {{SITENAME}} ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલ છે.\n\n$2\n\n{{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસ}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો..",
"passwordreset-emailelement": "વપરાશકર્તા નામ: \n$1\n\nકામચલાઉ પાસવર્ડ: \n$2",
"passwordreset-emailsentemail": "પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે.",
- "passwordreset-emailsent-capture": "પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે, જે નીચે પ્રમાણે છે.",
- "passwordreset-emailerror-capture": "પાસવર્ડ ફરી ગોઠવવા માટેનો ઇમેલ બનાવવામાં આવ્યો છે, જે નીચે પ્રમાણે છે, પરંતુ તે {{GENDER:$2|સભ્ય}}ને મોકલવામાં નિષ્ફળ થયો છે: $1",
"changeemail": "ઇમેલ સરનામું બદલો",
"changeemail-header": "તમારા ખાતાનું ઇમેલ સરનામું બદલો",
"changeemail-no-info": "બારોબાર આ પાનું જોવા માટે પ્રવેશ કરવો આવશ્યક છે.",
"minoredit": "આ એક નાનો સુધારો છે",
"watchthis": "આ પાનાને ધ્યાનમાં રાખો",
"savearticle": "પાનું સાચવો",
+ "publishpage": "પાનું પ્રકાશિત કરો",
+ "publishchanges": "ફેરફારો પ્રકાશિત કરો",
"preview": "પૂર્વાવલોકન",
"showpreview": "ઝલક જુવો",
"showdiff": "ફેરફારો દર્શાવો",
"undo-failure": "વચ્ચે થયેલા અન્ય ફેરફાર થવાને કારણે આ ફેરફારો ઉલટાવી ન શકાયા",
"undo-norev": "ફેરફાર સાચવી ન શકાયો કેમકે તે અસ્તિત્વમાં નથી અથવા તો ભૂંસી નખાયો છે.",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])એ કરેલો ફેરફાર $1 પાછો વાળ્યો",
- "cantcreateaccounttitle": "ખાતું ખોલી શકાય તેમ નથી",
"cantcreateaccount-text": "આ IP સરનામા ('''$1''') પર નવા ખાતાની રચના પર [[User:$3|$3]] દ્વારા રોક લગાવાઇ છે.\n\n\n$3 દ્વારા અપાયેલ કારણ છે ''$2''",
"viewpagelogs": "આ પાનાનાં લૉગ જુઓ",
"nohistory": "આ પાનાનાં ફેરફારનો ઇતિહાસ નથી.",
"special-characters-group-thai": "થાઈ",
"special-characters-group-lao": "લાઓ",
"special-characters-group-khmer": "ખ્મેર",
- "mw-widgets-titleinput-description-new-page": "પાનું અસ્તિત્વ ધરાવતું નથી.",
- "api-error-blacklisted": "મહેરબાની કરી વધુ વિસ્તૃત અર્થ સભર શીર્ષક આપો."
+ "mw-widgets-titleinput-description-new-page": "પાનું અસ્તિત્વ ધરાવતું નથી."
}
"tog-showtoolbar": "Chán-sṳ phiên-siá kûng-khí-làn",
"tog-editondblclick": "Sûng-khim phiên-siá ya̍p-mien",
"tog-editsectiononrightclick": "Yún-hí yu-khim phiêu-thì phiên-siá thon-lo̍k",
- "tog-watchcreations": "Kâ ngài kien-li̍p ke ya̍p-mien lâu sông-chhòn ke vùn-khien kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
+ "tog-watchcreations": "Kâ ngài kien-li̍p ke ya̍p-mien lâu sông-chhòn ke tóng-on kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
"tog-watchdefault": "Chiông ngài phiên-siá ke ya̍p-mien lâu tóng-on kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
"tog-watchmoves": "Chiông ngài yì-thûng ke ya̍p-mien lâu tóng-on kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
"tog-watchdeletion": "加亻厓刪除嘅頁面撈文件入亻厓嘅監視列表",
"edit": "Phiên-siá",
"create": "Kien-li̍p",
"create-local": "Sîn-chen pún-thi sot-mìn",
- "editthispage": "Phiên-siá pún-ya̍p",
+ "editthispage": "Phiên-siá liá ya̍p",
"create-this-page": "Kien-li̍p pún-ya̍p",
"delete": "San-chhù",
"deletethispage": "San-chhù pún-ya̍p",
"talkpagelinktext": "kâu-liù",
"specialpage": "Thi̍t-sû ya̍p-mien",
"personaltools": "Sṳ̂-ngìn kûng-khí",
- "articlepage": "Chhà-khon nui-yùng ya̍p-mien",
+ "articlepage": "Khon nui-yùng ya̍p",
"talk": "Thó-lun",
"views": "Chhà-khon-sú",
"toolbox": "Kûng-khí-siông",
"youhavenewmessagesmulti": "Ngì chhai $1-tú yû sîn sêu-sit",
"editsection": "phiên-siá",
"editold": "phiên-siá",
- "viewsourceold": "chhà-khon ngièn-ma",
+ "viewsourceold": "Khon ngièn-sṳ́-mâ",
"editlink": "phiên-siá",
- "viewsourcelink": "chhà-khon ngièn-ma",
+ "viewsourcelink": "Khon ngièn-sṳ́-mâ",
"editsectionhint": "Phiên-siá chông-chiet: $1",
"toc": "Muk-liu̍k",
"showtoc": "Chán-sṳ",
"perfcached": "下列係緩存數據,因此可能毋係最新嘅。最多{{PLURAL:$1|單淨有1嘅結果|$1嘅結果}}可用。",
"perfcachedts": "下列係緩存數據,其最後更新時間係$1。單淨有{{PLURAL:$4|一嘅結果|$4嘅結果}}會畀顯示。",
"querypage-no-updates": "當前禁止對邇頁面進行更新。\n邇位嘅數據將做毋得分立即重新整理。",
- "viewsource": "Chhà-khon ngièn-ma",
- "viewsource-title": "查看$1嘅源代碼",
+ "viewsource": "Khon ngièn-sṳ́-mâ",
+ "viewsource-title": "Khon $1 ke ngièn-sṳ́-mâ",
"actionthrottled": "動作已經壓制",
"actionthrottledtext": "基於反垃圾嘅考量,短時間內毋可以多次重複某操作,今下汝已經超過邇隻上限。\n請在數分鐘後再嘗試。",
"protectedpagetext": "邇隻頁面已經分人保護以防止編輯或其他操作。",
"group-bureaucrat-member": "行政員",
"grouppage-bot": "{{ns:project}}:機器人",
"grouppage-sysop": "{{ns:project}}:管理員",
- "right-upload": "Sông-chhòn vùn-khien",
+ "right-upload": "Sông-chhòn tóng-on",
"right-writeapi": "Sṳ́-yung siá-ngi̍p API",
"newuserlogpage": "Sîn-kien yung-fu miàng-chhak",
"newuserlogpagetext": "邇係一隻最近人創建用戶嘅新日誌",
"recentchanges-legend": "Chui-khiûn kiên-kói sién-hong",
"recentchanges-summary": "Kiên-chiûng pún wiki sông ke chui-sîn kiên-kói.",
"recentchanges-feed-description": "Kiên-chiûng pún thin-ye̍t chhai wiki sông ke chui-khiûn kiên-kói.",
- "recentchanges-label-newpage": "Liá-chhṳ phiên-si̍p kien-li̍p hí yit-chak sîn ya̍p-mien",
+ "recentchanges-label-newpage": "Liá-ke phiên-siá kien-li̍p sîn ya̍p",
"recentchanges-label-minor": "Liá-he yit-chak se-mì siû-kói",
"recentchanges-label-bot": "Liá-chhṳ phiên-siá he yù kî-hi-ngìn chin-hàng",
"recentchanges-label-unpatrolled": "Liá-chhṳ phiên-siá hàn-mò sùn-chhà ko",
"recentchanges-label-plusminus": "Kâi ya̍p-mien kiên-kói ke thai-séu (vi-ngièn-chû)",
"recentchanges-legend-heading": "<strong>Chu-yi:</strong>",
- "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (chhiáng chhâm-siòng [[Special:NewPages|sîn ya̍p-mien]])",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (chhâm-siòng [[Special:NewPages|sîn ya̍p]])",
"rcnotefrom": "下背係從'''$2'''起嘅更改(最多展示'''$1'''):",
"rclistfrom": "Chán-sṳ chhiùng $3 $2 yî-lòi ke sîn kiên-kói",
"rcshowhideminor": "$1細微編寫",
"recentchangeslinked-summary": "邇一隻特殊頁面列示''由''所分出嘅一隻頁面之鏈接到頁面嘅最近更改(或者是對於指定分類嘅成員)。\n在[[Special:Watchlist|汝嘅監視列表]]肚嘅頁面會用'''粗體'''顯示。",
"recentchangeslinked-page": "Ya̍p-mien miàng:",
"recentchangeslinked-to": "Chán-sṳ lièn-to só fûn-chhut ke ya̍p-mien",
- "upload": "Sông-chhòn vùn-khien",
- "uploadbtn": "Sông-chhòn vùn-khien",
+ "upload": "Sông-chhòn tóng-on",
+ "uploadbtn": "Sông-chhòn tóng-on",
"reuploaddesc": "取消上載並返回上載表單",
"uploadnologin": "還吂登入",
"uploadnologintext": "汝必須先[[Special:UserLogin|登入]]\n正做得上傳文件。",
"uploaderror": "上傳差錯",
"uploadtext": "Sṳ́-yung ha-mien ke péu-tân lòi song-chhòn yung-chhai vùn-chông nui sîn-ke thù-hìn tóng-on. Yeu kiám-sṳ fe̍t-chá sêu-chhà yî-chhièn song-chhòn ke thù-phién khó-yî chin-ngi̍p [[Special:FileList|Thù-hìn chhîn-tân]], song-chhòn lâu chhù-hi chiông-chhai [[Special:Log/upload|Song-chhòn ngit-ki]] chûng ki-liu̍k. Yeu-chhai vùn-chông chûng kâ-ngi̍p thù-hiong, sṳ́-yung yî-ha hìn-sṳt ke lièn-chiap: '''<nowiki>[[{{ns:file}}:file.jpg]]</nowiki>''', '''<nowiki>[[{{ns:file}}:file.png|Thi-von vùn-sṳ]]</nowiki>''' fe̍t-he '''<nowiki>[[{{ns:media}}:file.ogg]]</nowiki>'''.",
"uploadlogpage": "上傳日誌",
- "uploadlogpagetext": "Yî-ha he chui-khiûn song-chhòn vùn-khien ke chúng-péu.",
+ "uploadlogpagetext": "Yî-ha he chui-khiûn sông-chhòn tóng-on ke chúng-péu.",
"filename": "文件名",
"filedesc": "Vùn-khien sot-mìn",
"fileuploadsummary": "文件摘要:",
"pager-older-n": "khiu $1-chhṳ",
"booksources": "Mióng-lok sû-ngièn",
"booksources-search-legend": "Chhìm-cháu mióng-lok sû-ngièn",
- "booksources-search": "Chhìm-cháu",
+ "booksources-search": "Chhìm",
"booksources-text": "下背係一份銷售新書或二手書嘅列表,並可能有汝尋找緊嘅書嘅進一步信息:",
"specialloguserlabel": "Yung-fu:",
"speciallogtitlelabel": "Phêu-thì:",
"sp-contributions-username": "IP地址或用戶名:",
"sp-contributions-toponly": "單淨展示最新修訂版本嘅編寫",
"sp-contributions-submit": "搜尋",
- "whatlinkshere": "Lièn-chiap ngi̍p ya̍p-mien",
+ "whatlinkshere": "Nâi-têu lièn to liá-têu",
"whatlinkshere-title": "Lièn-chiap to \"$1\" ke ya̍p-mien",
"whatlinkshere-page": "Ya̍p-mien:",
"linkshere": "Hâ-poi ya̍p-mien lièn-chiap to <strong>[[:$1]]</strong>:",
"tooltip-pt-mycontris": "{{GENDER:|Ngì ke}} kung-hien lie̍t-péu",
"tooltip-pt-login": "Kien-ngi ngì tên-ngi̍p, than-he pin fî pit-sî ke",
"tooltip-pt-logout": "Tên-chhut",
- "tooltip-ca-talk": "Kôan-yî ya̍p-mien chang-vùn ke thó-lun",
+ "tooltip-ca-talk": "Liá ya̍p ke thó-lun",
"tooltip-ca-edit": "Phiên-siá pún-ya̍p",
"tooltip-ca-addsection": "Khôi-sṳ́ yit-chak sîn thon-lo̍k",
- "tooltip-ca-viewsource": "Pún ya̍p-mien su-to pó-fu. \nNgì cho-tet chhà-khon khì ke ngièn-ma.",
- "tooltip-ca-history": "Pún ya̍p-mien chó-siên ke siû-thin pán-pún",
+ "tooltip-ca-viewsource": "Liá-ke ya̍p-mien su-to pó-fu. \nNgì cho-tet khon khì ke ngièn-sṳ́-mâ.",
+ "tooltip-ca-history": "Liá ya̍p chó-siên ke pán-pún",
"tooltip-ca-protect": "保護邇頁",
"tooltip-ca-delete": "刪除邇頁",
"tooltip-ca-undelete": "Chiông liá-ke vùn-chông fî-fu̍k to pûn chhù-hi yî-chhièn ke chhong-khóng",
"tooltip-feed-atom": "Thin-ye̍t liá-ya̍p ke Atom ngièn",
"tooltip-t-contributions": "Chhà-khon {{GENDER:$1|liá-chak yung-fu}} ke kung-hien lie̍t-péu",
"tooltip-t-emailuser": "向邇隻用戶發送電子郵件",
- "tooltip-t-upload": "Sông-chhòn vùn-khien",
+ "tooltip-t-upload": "Sông-chhòn tóng-on",
"tooltip-t-specialpages": "Chhiòn-phu thi̍t-sû vùn-chông ke lie̍t-péu",
"tooltip-t-print": "Pún ya̍p-mien cho-tet tá-yin ke pán-pún",
"tooltip-t-permalink": "Liá-chak ya̍p-mien pán-pún ke ku-thin lièn-kiet",
- "tooltip-ca-nstab-main": "Chhà-khon nui-yùng ya̍p",
+ "tooltip-ca-nstab-main": "Khon nui-yùng ya̍p",
"tooltip-ca-nstab-user": "Chhà-khon yung-fu ya̍p-mien",
"tooltip-ca-nstab-media": "Chhà-khon hìn-thí-chông",
"tooltip-ca-nstab-special": "Pún ya̍p-mien he thi̍t-sû ya̍p-mien, ngì cho-m̀-tet phiên-siá pún-ya̍p",
"newimages": "Sîn-kien thù-chhiong ke va̍k-lòng",
"imagelisttext": "Yî-ha he on $2 phài-lie̍t ke $1-ke tóng-on lie̍t-péu.",
"noimages": "Mò-khó kiám-sṳ thù-chhiong.",
- "ilsubmit": "Chhìm-cháu",
+ "ilsubmit": "Chhìm",
"bydate": "on-cheu ngit-khì",
"sp-newimages-showfrom": "Chhiùng $1 khôi-sṳ́ hién-sṳ sîn thù-phién",
"bad_image_list": "請按照下列格式編寫:\n\n單淨係有(以*開頭)列出嘅項目會分考慮。\n每一行嘅第一條鏈接必須係損壞文件嘅鏈接。\n然後同一行後方嘅鏈接會分看做例外,也就係講邇文件做得在哪兜頁面肚分顯示。",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kâu-liù]])",
"duplicate-defaultsort": "'''警告:'''默認排序關鍵字“$2”蓋過矣先前嘅默認排序關鍵字“$1”。",
"version": "Pán-pún",
- "fileduplicatesearch-submit": "Chhìm-cháu",
+ "fileduplicatesearch-submit": "Chhìm",
"specialpages": "Thi̍t-sû ya̍p",
"external_image_whitelist": " #留下撈邇行一樣嘅文字<pre>\n#在下背(//中間部份)輸入正則表達式\n#邇兜將會撈外部(已超鏈接嘅)圖片配合\n#遐兜配合上嘅會顯示成圖片,否則就單淨會顯示成鏈接\n#有#開頭嘅行會當成意見\n#大小寫並無區分\n\n#在邇行上片輸入全部正則表達式。留下撈邇行一樣嘅文字</pre>",
"tag-filter": "[[Special:Tags|Phiêu-chhiam]] ko-lì-hi:",
"logentry-upload-upload": "$1 {{GENDER:$2|yí-kîn sông-chhòn}} $3",
"rightsnone": "(無)",
"revdelete-summary": "piên-sip tsak-yêu",
- "searchsuggest-search": "Chhìm-cháu"
+ "searchsuggest-search": "Chhìm"
}
"tagline": "מתוך {{SITENAME}}",
"help": "עזרה",
"search": "חיפוש",
+ "search-ignored-headings": " #<!-- יש להשאיר את השורה הזאת ללא שינוי --> <pre>\n# בשורות ההסבר בעברית בהערה הזאת יש תווי כיווניות לשם סידור סימני פיסוק.\n# כותרות של פסקאות שהחיפוש יתעלם מהן.\n# שינויים כאן ייכנסו לתוקף כשדף עם הכותרת הזאת ייכנס לאינדקס החיפוש.\n# אפשר לכפות מפתוח חוזר של דפים על־ידי עשיית עריכה אפסית.\n# התחביר הוא:\n# * כל דבר מהתו \"#\" עד סוף השורה הוא הערה.\n# * כל שורה שאינה ריקה היא כותרת שיש להתעלם ממנה, רגישות לאותיות רישיות וקטנות וכו'.\nהערות שוליים\nקישורים חיצוניים\nלקריאה נוספת\n #</pre> <!-- יש להשאיר את השורה הזאת ללא שינוי -->",
"searchbutton": "חיפוש",
"go": "הצגה",
"searcharticle": "לדף",
"actionthrottledtext": "כאמצעי נגד שימוש לרעה, קיימת מגבלה על ביצוע פעולה זו פעמים רבות מדי בזמן קצר, וחרגת מהמגבלה הזאת.\nנא לנסות שוב בעוד מספר דקות.",
"protectedpagetext": "דף זה מוגן כדי למנוע עריכה ופעולות אחרות.",
"viewsourcetext": "ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} לצפות בטקסט המקור של הדף ולהעתיקו.",
- "viewyourtext": "באפשרותך לצפות בטקסט המקור של <strong>העריכות שלך</strong> בדף הזה ולהעתיקו.",
+ "viewyourtext": "ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} לצפות בטקסט המקור של <strong>העריכות {{GENDER:|שלך|שלך|שלכם}}</strong> בדף הזה ולהעתיקו.",
"protectedinterface": "דף זה הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}, והוא מוגן כדי למנוע השחתות.\nכדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
"editinginterface": "<strong>אזהרה:</strong> הדף ש{{GENDER:|אתה עורך|את עורכת|אתם עורכים}} הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}.\nשינויים בדף הזה ישפיעו על ממשק המשתמש של משתמשים אחרים באתר.",
"translateinterface": "כדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
"pt-login-continue-button": "המשך כניסה לחשבון",
"pt-createaccount": "יצירת חשבון",
"pt-userlogout": "יציאה מהחשבון",
- "php-mail-error-unknown": "שגיאה לא ידועה בפונקציה mail() של PHP",
+ "php-mail-error-unknown": "שגיאה לא ידועה בפונקציה mail() של PHP.",
"user-mail-no-addy": "ניסיון לשלוח דוא\"ל ללא כתובת דוא\"ל.",
"user-mail-no-body": "ניסיון לשלוח דוא\"ל עם תוכן ריק או קצר מאוד.",
"changepassword": "שינוי סיסמה",
"passwordreset-emailelement": "שם משתמש:\n$1\n\nסיסמה זמנית:\n$2",
"passwordreset-emailsentemail": "אם כתובת הדואר האלקטרוני הזאת משויכת לחשבון שלך, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
"passwordreset-emailsentusername": "אם יש כתובת דואר אלקטרוני שמשויכת לשם המשתמש הזה, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
- "passwordreset-emailsent-capture": "נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.",
- "passwordreset-emailerror-capture": "נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|דוא\"ל איפוס הסיסמה נשלח|הודעות דוא\"ל של איפוס הסיסמה נשלחו}}. {{PLURAL:$1|שם המשתמשים והסיסמה מוצגים|רשימה של שמות המשתמשים והסיסמאות מוצגת}} להלן.",
"passwordreset-emailerror-capture2": "לא ניתן היה לשלוח דוא\"ל ל{{GENDER:$2|משתמש|משתמשת}}: $1 {{PLURAL:$3|שם המשתמש והסיסמה מוצגים|רשימה של שמות המשתמשים והסיסמאות מוצגת}} להלן.",
"passwordreset-nocaller": "לא סופק הקורא הנדרש",
"passwordreset-nodata": "לא סופק שם משתמש או כתובת דוא\"ל",
"changeemail": "שינוי או הסרת כתובת דוא\"ל",
"changeemail-header": "יש למלא את הטופס הזה כדי לשנות את כתובת הדוא\"ל שלך. אם ברצונך להימנע משיוך כתובת דוא\"ל כלשהי לחשבון שלך, יש להשאיר את שדה כתובת הדוא\"ל החדשה ריק בעת שליחת הטופס.",
- "changeemail-passwordrequired": "יש להקליד את הסיסמה שלך כדי לאשר את השינוי.",
"changeemail-no-info": "נדרשת כניסה לחשבון כדי לגשת לדף זה ישירות.",
"changeemail-oldemail": "כתובת דוא\"ל נוכחית:",
"changeemail-newemail": "כתובת דוא\"ל חדשה:",
"editingsection": "עריכת הדף \"$1\" (פסקה)",
"editingcomment": "עריכת הדף \"$1\" (פסקה חדשה)",
"editconflict": "התנגשות עריכה: $1",
- "explainconflict": "משתמש אחר שינה את הדף מאז שהתחלתם לערוך אותו.\nחלון העריכה העליון מציג את הטקסט בדף כפי שהוא כרגע.\nהשינויים שלכם מוצגים בחלון העריכה התחתון.\nעליכם למזג את השינויים שלכם לתוך הטקסט הקיים.\n<strong>רק</strong> הטקסט בחלון העריכה העליון יישמר כשתלחצו על \"{{int:savearticle}}\".",
+ "explainconflict": "משתמש אחר שינה את הדף מאז שהתחלת לערוך אותו.\nתיבת העריכה העליונה מכילה את הטקסט בדף כפי שהוא כרגע.\nהשינויים שלך מוצגים בתיבת העריכה התחתונה.\nיש למזג את השינויים שלך מתיבת העריכה התחתונה לתיבת העריכה העליונה.\n<strong>רק</strong> הטקסט בתיבת העריכה העליונה יישמר לאחר לחיצה על \"{{int:savearticle}}\".",
"yourtext": "הטקסט שלך",
"storedversion": "גרסה שמורה",
"nonunicodebrowser": "'''אזהרה: הדפדפן שלך אינו תואם לתקן יוניקוד.'''\nכדי למנוע בעיות הנוצרות כתוצאה מכך ולאפשר לך לערוך דפים בבטחה, תווים שאינם ב־ASCII יוצגו בתיבת העריכה כקודים הקסדצימליים.",
- "editingold": "<strong>אזהרה: אתם עורכים גרסה לא עדכנית של דף זה.</strong>\nאם תשמרו את הדף, כל השינויים שנעשו מאז גרסה זו יאבדו.",
+ "editingold": "<strong>אזהרה: {{GENDER:|אתה עורך|את עורכת|אתם עורכים}} גרסה ישנה של דף זה.</strong>\nאם {{GENDER:|תשמור|תשמרי|תשמרו}} את העריכה, כל השינויים שנעשו מאז גרסה זו יאבדו.",
"yourdiff": "הבדלים",
"copyrightwarning": "'''שימו לב:''' תרומתכם ל{{grammar:תחילית|{{SITENAME}}}} תפורסם תחת תנאי הרישיון $2 (ראו $1 לפרטים נוספים). אם אינכם רוצים שעבודתכם תהיה זמינה לעריכה על־ידי אחרים, שתופץ לעיני כול, ושאחרים יוכלו להעתיק ממנה בציון המקור – אל תפרסמו אותה פה. כמו־כן, אתם מבטיחים לנו כי כתבתם את הטקסט הזה בעצמכם, או העתקתם אותו ממקור שאינו מוגן בזכויות יוצרים. '''אל תעשו שימוש בחומר המוגן בזכויות יוצרים ללא רשות!'''",
"copyrightwarning2": "'''שימו לב:''' תורמים אחרים עשויים לערוך או אף להסיר את תרומתכם ל{{grammar:תחילית|{{SITENAME}}}}. אם אינכם רוצים שעבודתכם תהיה זמינה לעריכה על־ידי אחרים, אל תפרסמו אותה פה. כמו־כן, אתם מבטיחים לנו כי כתבתם את הטקסט הזה בעצמכם, או העתקתם אותו ממקור שאינו מוגן בזכויות יוצרים (ראו $1 לפרטים נוספים). '''אל תעשו שימוש בחומר המוגן בזכויות יוצרים ללא רשות!'''",
"undo-nochange": "נראה שהעריכה כבר בוטלה.",
"undo-summary": "ביטול גרסה $1 של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]])",
"undo-summary-username-hidden": "ביטול גרסה $1 של משתמש מוסתר",
- "cantcreateaccounttitle": "לא ניתן ליצור את החשבון",
"cantcreateaccount-text": "אפשרות יצירת החשבונות מכתובת ה־IP הזאת (<strong>$1</strong>) נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא \"$2\".",
"cantcreateaccount-range-text": "אפשרות יצירת החשבונות מכתובות IP בתוך הטווח <strong>$1</strong>, כולל כתובת ה־IP שלך (<strong>$4</strong>), נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא \"$2\".",
"viewpagelogs": "הצגת יומנים עבור דף זה",
"prefs-help-prefershttps": "העדפה זו תיכנס לתוקף בכניסה הבאה לחשבון.",
"prefswarning-warning": "ביצעת שינויים בהעדפות שלך, והם עדיין לא נשמרו.\nעזיבת דף זה ללא לחיצה על \"$1\" תגרום לכך שההעדפות שלך לא יעודכנו.",
"prefs-tabs-navigation-hint": "טיפ: ניתן להשתמש במקשי החצים הימני והשמאלי כדי לנווט בין הלשוניות ברשימת הלשוניות.",
- "userrights": "ניהול הרשאות {{GENDER:{{BASEPAGENAME}}|משתמש|משתמשת}}",
+ "userrights": "ניהול הרשאות משתמש",
"userrights-lookup-user": "ניהול קבוצות משתמש",
"userrights-user-editname": "שם משתמש:",
"editusergroup": "עריכת הקבוצות של ה{{GENDER:$1|משתמש}}",
"right-reupload-own": "העלאת גרסאות חדשות של קבצים קיימים שהועלו על־ידי המשתמש עצמו",
"right-reupload-shared": "דריסה מקומית של קבצים מאתר קובצי המדיה המשותף",
"right-upload_by_url": "העלאת קבצים מכתובת אינטרנט (URL)",
- "right-purge": "×¨×¢× ×\95×\9f ×\96×\99×\9bר×\95×\9f ×\94×\9e×\98×\9e×\95×\9f ש×\9c ×\94×\90תר ללא מעבר בדף אישור",
+ "right-purge": "× ×\99ק×\95×\99 ×\96×\99×\9bר×\95×\9f ×\94×\9e×\98×\9e×\95×\9f ש×\9c ×\93×£ ללא מעבר בדף אישור",
"right-autoconfirmed": "עקיפת ההגבלה על קצב הפעולות שניתן לבצע מכתובת IP מסוימת",
"right-bot": "התייחסות לעריכות כאוטומטיות",
"right-nominornewtalk": "ביטול שליחת התראה על הודעה חדשה למשתמש בעת עריכה משנית בדף השיחה שלו",
"action-applychangetags": "להחיל תגיות יחד עם שינויים",
"action-changetags": "להוסיף או להסיר תגיות מגרסאות ומרשומות יומן",
"action-deletechangetags": "למחוק תגיות מבסיס הנתונים",
+ "action-purge": "לנקות את זיכרון המטמון של דף זה",
"nchanges": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|מאז ביקורך האחרון}}",
"enhancedrc-history": "היסטוריה",
"watchnologin": "לא נכנסת לחשבון",
"addwatch": "הוספה לרשימת המעקב",
"addedwatchtext": "הדף \"[[:$1]]\" ודף השיחה שלו נוספו ל[[Special:Watchlist|רשימת המעקב]] שלך.",
+ "addedwatchtext-talk": "הדף \"[[:$1]]\" ודף התוכן המשויך אליו נוספו ל[[Special:Watchlist|רשימת המעקב]] שלך.",
"addedwatchtext-short": "הדף \"$1\" נוסף לרשימת המעקב.",
"removewatch": "הסרה מרשימת המעקב",
"removedwatchtext": "הדף \"[[:$1]]\" ודף השיחה שלו הוסרו מ[[Special:Watchlist|רשימת המעקב]] שלך.",
+ "removedwatchtext-talk": "הדף \"[[:$1]]\" ודף התוכן המשויך אליו הוסרו מ[[Special:Watchlist|רשימת המעקב]] שלך.",
"removedwatchtext-short": "הדף \"$1\" הוסר מרשימת המעקב.",
"watch": "מעקב",
"watchthispage": "מעקב אחרי דף זה",
"protect-expiring-local": "פוקעת ב{{GRAMMAR:תחילית|$1}}",
"protect-expiry-indefinite": "בלתי מוגבלת בזמן",
"protect-cascade": "הגנה על כל הדפים המוכללים בדף זה (הגנה מדורגת)",
- "protect-cantedit": "אין באפשרותך לשנות את רמת ההגנה על דף זה כיוון שאין לך הרשאה לערוך אותו.",
+ "protect-cantedit": "אין {{GENDER:|באפשרותך|באפשרותך|באפשרותכם}} לשנות את רמת ההגנה של דף זה כיוון שאין {{GENDER:|לך|לך|לכם}} הרשאה לערוך אותו.",
"protect-othertime": "זמן אחר:",
"protect-othertime-op": "זמן אחר",
"protect-existing-expiry": "זמן פקיעה נוכחי: $3, $2",
"fix-double-redirects": "עדכון הפניות לכותרת הדף המקורית",
"move-leave-redirect": "השארת הפניה בדף המקורי",
"protectedpagemovewarning": "'''אזהרה:''' דף זה מוגן כך שרק מפעילי מערכת יכולים להעביר אותו.\nפעולת היומן האחרונה מוצגת להלן:",
- "semiprotectedpagemovewarning": "'''הערה:''' דף זה מוגן כך שרק משתמשים רשומים יכולים להעביר אותו.\nפעולת היומן האחרונה מוצגת להלן:",
+ "semiprotectedpagemovewarning": "<strong>הערה:</strong> דף זה מוגן כך שרק משתמשים רשומים יכולים להעביר אותו.\nפעולת היומן האחרונה מוצגת להלן:",
"move-over-sharedrepo": "[[:$1]] כבר קיים במאגר משותף. העברת הקובץ לכותרת זו תדרוס את הקובץ המשותף.",
"file-exists-sharedrepo": "קובץ בשם שנבחר כבר קיים כקובץ משותף.\nיש לבחור שם אחר.",
"export": "ייצוא דפים",
"monthsall": "הכול",
"confirmemail": "אימות כתובת דוא\"ל",
"confirmemail_noemail": "אין לך כתובת דוא\"ל תקפה המוגדרת ב[[Special:Preferences|העדפות המשתמש]] שלך.",
- "confirmemail_text": "אתר זה דורש שתאמתו את כתובת הדוא\"ל שלכם לפני שתשתמשו בשירותי הדוא\"ל. לחצו על הכפתור למטה כדי לשלוח דוא\"ל עם קוד אימות לכתובת הדוא\"ל שהזנתם. טענו את הקישור בדפדפן שלכם כדי לאשר שכתובת הדוא\"ל תקפה.",
- "confirmemail_pending": "ק×\95×\93 ×\90×\99×\9e×\95ת ×\93×\95×\90\"×\9c ×\9b×\91ר × ×©×\9c×\97 ×\90×\9c×\99×\9b×\9d; ×\90×\9d ×\99צרת×\9d ×\90ת ×\94×\97ש×\91×\95×\9f ×\9c×\90×\97ר×\95× ×\94, ×\99×\99ת×\9b×\9f שתרצ×\95 ×\9c×\97×\9b×\95ת ×\9eספר ×\93ק×\95ת ×¢×\93 ש×\99×\92×\99×¢ ×\9c×¤× ×\99 ×©×ª× ×¡×\95 ×\9c×\91קש קוד חדש.",
+ "confirmemail_text": "{{GENDER:|עליך|עלייך|עליכם}} לאמת את כתובת הדוא\"ל {{GENDER:|שלך|שלך|שלכם}} לפני ש{{GENDER:|תוכל|תוכלי|תוכלו}} להשתמש בשירותי הדוא\"ל של {{SITENAME}}.\n{{GENDER:|לחץ|לחצי|לחצו}} על הכפתור שלמטה כדי לשלוח קוד אימות לכתובת הדוא\"ל ש{{GENDER:|הזנת|הזנת|הזנתם}}.\n{{GENDER:|פתח|פִתחי|פִתחו}} את הקישור בדפדפן {{GENDER:|שלך|שלך|שלכם}} כדי לאשר שכתובת הדוא\"ל תקפה.",
+ "confirmemail_pending": "ק×\95×\93 ×\94×\90×\99×\9e×\95ת ×\9b×\91ר × ×©×\9c×\97 ×\9c×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 {{GENDER:|ש×\9c×\9a|ש×\9c×\9a|ש×\9c×\9b×\9d}};\n×\90×\9d {{GENDER:|×\99צרת|×\99צרת|×\99צרת×\9d}} ×\90ת ×\94×\97ש×\91×\95×\9f ×\9c×\90×\97ר×\95× ×\94, ×\9b×\93×\90×\99 ×\9c×\94×\9eת×\99×\9f ×\9eספר ×\93ק×\95ת ×¢×\93 ש×\94×\93×\95×\90\"×\9c ×\99×\92×\99×¢ ×\9c×¤× ×\99 ×\91קשת קוד חדש.",
"confirmemail_send": "לשלוח קוד אימות",
"confirmemail_sent": "הדוא\"ל עם קוד האימות נשלח.",
"confirmemail_oncreate": "קוד אימות דוא\"ל נשלח לכתובת הדוא\"ל שלכם. הקוד הזה אינו נדרש לכניסה, אך תצטרכו לספקו כדי להשתמש בכל תכונה מבוססת דוא\"ל באתר זה.",
- "confirmemail_sendfailed": "{{SITENAME}} לא הצליח לשלוח לכם הודעת דוא\"ל עם קוד האימות.\nאנא בדקו שאין תווים שגויים בכתובת הדוא\"ל.\n\nתוכנת שליחת הדוא\"ל החזירה את ההודעה הבאה: $1",
+ "confirmemail_sendfailed": "אתר {{SITENAME}} לא הצליח לשלוח דוא\"ל האימות שלך.\nנא לבדוק שבכתובת הדוא\"ל שלך אין תווים בלתי־תקינים.\n\nמערכת שליחת הדוא\"ל החזירה את ההודעה הבאה: $1",
"confirmemail_invalid": "קוד האימות שגוי. ייתכן שפג תוקפו.",
"confirmemail_needlogin": "נדרשת $1 כדי לאמת את כתובת הדוא\"ל שלך.",
"confirmemail_success": "כתובת הדוא\"ל שלך אושרה.\nכעת באפשרותך [[Special:UserLogin|להיכנס לחשבון שלך]] וליהנות מהאתר.",
"tog-watchlisthidebots": "Sakrij uređivanja botova s popisa praćenja",
"tog-watchlisthideminor": "Sakrij manje promjene s popisa praćenja",
"tog-watchlisthideliu": "Sakrij uređivanja prijavljenih s popisa praćenja",
- "tog-watchlistreloadautomatically": "Automatski ponovno pokreni nadzornu listu kad god dođe do promjene filtra (potreban JavaScript)",
+ "tog-watchlistreloadautomatically": "Ponovno učitaj popis praćenja kad god dođe do promjene filtra (potreban JavaScript)",
"tog-watchlisthideanons": "Sakrij uređivanja neprijavljenih s popisa praćenja",
"tog-watchlisthidepatrolled": "Sakrij pregledane izmjene u popisu praćenja",
"tog-watchlisthidecategorization": "Sakrij kategorizaciju stranica",
"tog-ccmeonemails": "Pošalji mi kopiju e-maila kojeg pošaljem drugim suradnicima",
"tog-diffonly": "Ne prikazuj sadržaj stranice prilikom usporedbe inačica",
"tog-showhiddencats": "Prikaži skrivene kategorije",
- "tog-norollbackdiff": "Izostavi razliku nakon vraÄ\8danja",
+ "tog-norollbackdiff": "Izostavi razliku nakon vraÄ\87anja",
"tog-useeditwarning": "Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena",
"tog-prefershttps": "Uvijek koristi sigurnu vezu kod prijave",
"underline-always": "Uvijek",
"botpasswords-label-create": "Stvori",
"botpasswords-label-update": "Ažuriraj",
"botpasswords-label-cancel": "Odustani",
- "botpasswords-label-resetpassword": "Reset lozinke",
+ "botpasswords-label-resetpassword": "Ponovno postavljanje lozinke",
"botpasswords-insert-failed": "Nije moguće dodavanje imena bota \"$1\". Možda je već dodano?",
"resetpass_forbidden": "Lozinka ne može biti promijenjena",
"resetpass-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
"passwordreset-emailtext-user": "Suradnik $1 na {{SITENAME}} zatražio podsjetnik o pojedinostima vašeg računa za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru lozinku.",
"passwordreset-emailelement": "Suradničko ime: \n$1\n\nPrivremena lozinka: \n$2",
"passwordreset-emailsentemail": "Ako je ova adresa povezana s Vašim suradničkim računom, na nju će biti poslan podsjetnik na zaporku.",
- "passwordreset-emailsent-capture": "Poslan Vam je podsjetnik kao e-pošta (tekst je prikazan dolje).",
- "passwordreset-emailerror-capture": "Napravljena je e-poruka za ponovno postavljanje zaporke (prikazana ispod), ali njeno slanje suradniku nije uspjelo: $1",
"changeemail": "Promijeni ili izbriši e-mail adresu",
"changeemail-header": "Promijeni adresu e-pošte računa",
"changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
"undo-norev": "Izmjena nije mogla biti uklonjena jer ne postoji ili je obrisana.",
"undo-nochange": "Čini se da je uređivanje već otkazano.",
"undo-summary": "uklanjanje izmjene $1 {{GENDER:$2|suradnika|suradnice}} [[Posebno:Doprinosi/$2|$2]] ([[Razgovor sa suradnikom:$2|razgovor]])",
- "cantcreateaccounttitle": "Nije moguće stvoriti suradnički račun",
"cantcreateaccount-text": "Otvaranje suradničkog računa ove IP adrese ('''$1''') blokirao/la je [[User:$3|$3]].\n\nRazlog koji je dao/la $3 je ''$2''",
"viewpagelogs": "Vidi evidencije za ovu stranicu",
"nohistory": "Ova stranica nema starijih izmjena.",
"prefs-advancedwatchlist": "Napredne mogućnosti",
"prefs-displayrc": "Prikaži opcije",
"prefs-displaywatchlist": "Mogućnosti prikaza",
- "prefs-diffs": "razl",
+ "prefs-diffs": "Razlike između inačica uređivanja",
"prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod sljedeće prijave.",
"prefswarning-warning": "Napravili ste promjene u Vašim postavkama koje još nisu snimljene.\nAko napustite ovu stranicu bez pritiska na \"$1\", postavke neće biti ažurirane.",
"prefs-tabs-navigation-hint": "Savjet: možete rabiti tipke sa strjelicama lijevo i desno za prebacivanje između kartica na popisu kartica.",
"saveusergroups": "Snimi suradničke skupine",
"userrights-groupsmember": "Član:",
"userrights-groupsmember-auto": "Uključeni član:",
- "userrights-groups-help": "Možete promijeniti skupine za ovog suradnika:\n* Označena kućica pokazuje skupinu kojoj suradnik pripada.\n* Neoznačena kućica pokazuje skupinu kojoj suradnik ne pripada.\n* Zvjezdica * označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.",
+ "userrights-groups-help": "Možete promijeniti skupine za ovog suradnika:\n* označena kućica pokazuje skupinu kojoj suradnik pripada;\n* neoznačena kućica pokazuje skupinu kojoj suradnik ne pripada;\n* zvjezdica (*) označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.",
"userrights-reason": "Razlog:",
"userrights-no-interwiki": "Nemate dopuštenje za uređivanje suradničkih prava na drugim wikijima.",
"userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalno dostupna.",
"grant-blockusers": "Blokiraj i odblokiraj korisnike",
"grant-createaccount": "Otvori račune",
"grant-createeditmovepage": "Stvori, uredi i premjesti stranice",
- "grant-editmyoptions": "Izmjeni korisničke postavke",
+ "grant-editmyoptions": "Uredi korisničke postavke",
"grant-highvolume": "Uređivanja velikog opsega",
"grant-basic": "Osnovna prava",
"grant-viewdeleted": "Prikaz izbrisanih datoteka i stranica",
"recentchangeslinked-summary": "Ova posebna stranica pokazuje nedavne promjene na povezanim stranicama (ili stranicama određene kategorije). Stranice koje su na [[Special:Watchlist|Vašem popisu praćenja]] su '''podebljane'''.",
"recentchangeslinked-page": "Naslov stranice:",
"recentchangeslinked-to": "Pokaži promjene na stranicama s poveznicom na ovu stranicu",
- "recentchanges-page-added-to-category": "[[:$1]] dodana u kategoriju",
+ "recentchanges-page-added-to-category": "[[:$1]] dodano u kategoriju",
"recentchanges-page-removed-from-category": "[[:$1]] uklonjeno iz kategorije",
"upload": "Postavi datoteku",
"uploadbtn": "Postavi datoteku",
"unusedimages": "Nekorištene slike",
"wantedcategories": "Tražene kategorije",
"wantedpages": "Tražene stranice",
+ "wantedpages-summary": "Niže je popis nepostojećih stranica s najviše poveznica prema njima, osim stranica koje imaju preusmjeravanje na njih. Cijeli popis nepostojećih stranica na koje postoje preusmjeravanja može se vidjeti na [[{{#special:BrokenRedirects}}|popisu]].",
"wantedpages-badtitle": "Nevaljani naslov kao rezultat: $1",
"wantedfiles": "Tražene datoteke",
"wantedfiletext-cat": "Sljedeće datoteke se rabe ali ne postoje. Datoteke iz drugih izvora mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> s popisa. Osim toga, stranice koje sadrže nepostojeće datoteke popisane su [[:$1|ovdje]].",
"protectedpages-reason": "Razlog",
"protectedpages-submit": "Prikaži stranice",
"protectedpages-unknown-timestamp": "Nepoznato",
- "protectedpages-unknown-performer": "Nepoznati korisnik",
+ "protectedpages-unknown-performer": "Nepoznati suradnik",
"protectedtitles": "Zaštićeni naslovi",
"protectedtitlesempty": "Nijedan naslov nije trenutačno zaštićen s tim parametrima.",
"protectedtitles-submit": "Prikaži nazive",
"activeusers-hidebots": "Sakrij botove",
"activeusers-hidesysops": "Sakrij administratore",
"activeusers-noresult": "Niti jedan suradnik nije nađen.",
- "activeusers-submit": "Prikaz aktivnih sudionika",
+ "activeusers-submit": "Prikaz aktivnih suradnika",
"listgrouprights": "Prava suradničkih skupina",
"listgrouprights-summary": "Ovo je popis suradničkih skupina određenih na ovoj wiki, s njihovim pripadajućim pravima.\nDodatne informacije o pojedinim pravim se mogu pronaći [[{{MediaWiki:Listgrouprights-helppage}}|ovdje]].",
"listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dodijeljeno pravo</span>\n* <span class=\"listgrouprights-revoked\">Ukinuto pravo</span>",
"rollback-success": "uklonjeno uređivanje {{GENDER:$1|suradnika|suradnice}} $1\nvraćeno na posljednju inačicu {{GENDER:$2|suradnika|suradnice}} $2.",
"sessionfailure-title": "Prekid sesije",
"sessionfailure": "Uočili smo problem s Vašom prijavom. Zadnja naredba nije izvršena kako bi se izbjegla zloupotreba. Molimo Vas da se u pregledniku vratite natrag na prethodnu stranicu, ponovno je učitate i zatim pokušate opet.",
- "changecontentmodel-legend": "Promjeni model sadržaja",
+ "changecontentmodel-legend": "Promijeni model sadržaja",
"changecontentmodel-title-label": "Naziv stranice",
"changecontentmodel-model-label": "Novi model sadržaja",
"changecontentmodel-reason-label": "Razlog:",
"sp-contributions-username": "IP adresa ili suradnik:",
"sp-contributions-toponly": "Prikaži samo najnovije izmjene",
"sp-contributions-newonly": "Pokaži samo stranice koje je suradnik započeo",
+ "sp-contributions-hideminor": "Sakrij manje izmjene",
"sp-contributions-submit": "Traži",
"whatlinkshere": "Što vodi ovamo",
"whatlinkshere-title": "Stranice koje vode na \"$1\"",
"exif-gaincontrol-3": "Malo smanjenje",
"exif-gaincontrol-4": "Veliko smanjenje",
"exif-contrast-0": "Normalno",
- "exif-contrast-1": "Meko",
- "exif-contrast-2": "Tvrdo",
+ "exif-contrast-1": "Slabo",
+ "exif-contrast-2": "Jako",
"exif-saturation-0": "Normalno",
"exif-saturation-1": "Niska saturacija",
"exif-saturation-2": "Visoka saturacija",
"revdelete-uname-unhid": "suradničko ime je otkriveno",
"revdelete-restricted": "primijenjeno ograničenje za administratore",
"revdelete-unrestricted": "uklonjeno ograničenje za administratore",
+ "logentry-merge-merge": "$1 je {{GENDER:$2|spojio|spojila}} $3 s $4 (izmjene do $5)",
"logentry-move-move": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4",
"logentry-move-move-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 bez preusmjeravanja",
"logentry-move-move_redir": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja",
"mw-widgets-dateinput-placeholder-month": "GGGG-MM",
"mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
"mw-widgets-titleinput-description-redirect": "preusmjeravanje na $1",
+ "log-action-filter-block": "Vrsta blokiranja:",
+ "log-action-filter-newusers": "Način stvaranja računa:",
"log-action-filter-upload": "Vrsta postavljanja:",
"log-action-filter-all": "sve",
+ "log-action-filter-block-block": "blokiranje",
+ "log-action-filter-block-reblock": "promjena blokiranja",
+ "log-action-filter-block-unblock": "deblokiranje",
+ "log-action-filter-newusers-create": "stvorio anonimni suradnik",
+ "log-action-filter-newusers-create2": "stvorio registrirani suradnik",
+ "log-action-filter-newusers-autocreate": "automatski stvoren",
+ "log-action-filter-newusers-byemail": "stvoren lozinkom poslanom na e-poštu",
"log-action-filter-upload-upload": "novo postavljanje",
"log-action-filter-upload-overwrite": "ponovno postavljanje"
}
"tog-ccmeonemails": "Mi kopije e-mejlkow pósłać, kotrež druhim wužiwarjam pósćelu",
"tog-diffonly": "Jenož rozdźěle pokazać (nic pak zbytny wobsah)",
"tog-showhiddencats": "Schowane kategorije pokazać",
- "tog-norollbackdiff": "Rozdźěl po wróćostajenju zanjechać",
+ "tog-norollbackdiff": "Rozdźěl po wróćostajenju njepokazać",
"tog-useeditwarning": "Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća",
"tog-prefershttps": "Po přizjewjenju přeco wěsty zwisk wužiwać",
"underline-always": "Přeco",
"morenotlisted": "Tuta lisćina dospołna njeje.",
"mypage": "Strona",
"mytalk": "Diskusija",
- "anontalk": "Diskusijna strona tuteje IP.adresy",
+ "anontalk": "Diskusija",
"navigation": "Nawigacija",
"and": " a",
"qbfind": "Namakać",
"tagline": "z {{GRAMMAR:genitiw|{{SITENAME}}}}",
"help": "Pomoc",
"search": "Pytać",
+ "search-ignored-headings": " #<!-- njezměń tutu linku --> <pre>\n# Nadpisma, kotrež pytanje ignoruje.\n# Tute změny budu so wuskutkować, po tym zo strona bě so indikowała.\n# Móžeš indikowanje stronow wunuzować, přewjedujo prózdnu změnu.\n# Syntaksa:\n# * Wšitko, štož znamješku \"#\" hač do kónca linki slěduje, je komentar\n# * Kózda njeprózdna linka je eksaktny titul, kotryž dyrbi so ignorować\nŽórła\nEksterne wotkazy\nHlej tež\n #</pre> <!-- njezměń tutu linku -->",
"searchbutton": "Pytać",
"go": "Pytać",
"searcharticle": "Pytać",
"laggedslavemode": "'''Kedźbu:''' Je móžno, zo strona žane zaktualizowanja njewobsahuje.",
"readonly": "Datowa banka je zawrjena",
"enterlockreason": "Zapodaj přičinu za zawrjenje a přibližny čas, hdy budźe zawrjenje zběhnjene",
- "readonlytext": "Datowa banka je tuchwilu za nowe zapiski a druhe změny zawrjena, najskerje wothladowanskich dźěłow dla; po jich zakónčenju budźe wšitko zaso normalne.\n\nAdministrator, kiž je datowu banku zawrěł, je jako přičinu podał: $1",
+ "readonlytext": "Datowa banka je tuchwilu za nowe zapiski a druhe změny zawrjena, najskerje wothladowanskich dźěłow dla; po jich zakónčenju budźe wšitko zaso normalne.\n\nSystemowy administrator, kiž je datowu banku zawrěł, je slědowacu přičinu podał: $1",
"missing-article": "Datowa banka njenamaka tekst strony z mjenom \"$1\" $2, kotryž dyrbjał so namakać.\n\nTo so zwjetša zawinuje, hdyž so njepłaćiwa změna abo zapisk stawiznow na stronu wotkazuje, kotraž bu wušmórnjena.\n\nJeli to njetrjechi, sy najskerje programowy zmylk w softwarje namakał.\nZdźěl to prošu [[Special:ListUsers/sysop|admininistratorej]] podawajo wotpowědny URL.",
"missingarticle-rev": "(Wersijowe čisło: $1)",
"missingarticle-diff": "(Rozdźěl: $1, $2)",
"viewsource": "Žórłowy tekst",
"viewsource-title": "Žórłowy tekst za $1 sej wobhladać",
"actionthrottled": "Akcije wobmjezowane",
- "actionthrottledtext": "Jako připrawa přećiwo spamej, je častosć wuwjedźenja tuteje akcije w krótkej dobje wobmjezowana a ty sy tutón limit překročił. Prošu spytaj za něšto mjeńšiny hišće raz.",
+ "actionthrottledtext": "Jako naprawa přećiwo znjewužiwanju, je ličba wuwjedźenjow tuteje akcije w krótkej dobje wobmjezowana a ty sy tutón limit překročił. Prošu spytaj za něšto mjeńšin hišće raz.",
"protectedpagetext": "Tuta strona je přećiwo wobdźěłowanju abo druhim akcijam škitana.",
- "viewsourcetext": "Móžeš sej žórłowy tekst tuteje strony wobhladać a jón kopěrować:",
- "viewyourtext": "Móžeš sej žórłowy tekst '''swojich změnow''' wobhladać a do slědowaceje strony kopěrować:",
+ "viewsourcetext": "Móžeš sej žórłowy tekst tuteje strony wobhladać a jón kopěrować.",
+ "viewyourtext": "Móžeš sej žórłowy tekst <strong>swojich změnow</strong> wobhladać a do slědowaceje strony kopěrować.",
"protectedinterface": "Tuta strona wobsahuje tekst za wužiwarski powjerch softwary na tutym wikiju a je škitana, zo by so znjewužiwanje zadźěwało.\nZo by přełožki za wšě wikije přidał abo změnił, wužij prošu [https://translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizaciju.",
"editinginterface": "<strong>Warnowanje:</strong> Wobdźěłuješ stronu, kotraž so wužiwa, zo by tekst za wužiwarski powjerch softwary k dispoziciji stajiła. Změny na stronje wuskutkuja so na napohlad wužiwarskeho powjercha za druhich wužiwarjow na tutym wikiju.",
"translateinterface": "Zo by přełožki za wšě wikije přidał abo změnił, wužiwajće prošu [https://translatewiki.net/ translatewiki.net], lokalizaciski projekt MediaWiki.",
- "cascadeprotected": "Tuta strona je za wobdźěłowanje zawrjena, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane|škitane}}:\n$2",
+ "cascadeprotected": "Tuta strona je za wobdźěłowanje zawrjena, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane}}:\n$2",
"namespaceprotected": "Nimaš dowolnosć, zo by stronu w mjenowym rumje '''$1''' wobdźěłał.",
"customcssprotected": "Nimaš prawo, zo by tutu CSS-stronu wobdźěłał, dokelž wosobinske nastajenja druheho wužiwarja wobsahuje.",
"customjsprotected": "Nimaš prawo, zo by tutu JavaScript-stronu wobdźěłał, dokelž wosobinske nastajenja druheho wužiwarja wobsahuje.",
"mypreferencesprotected": "Nimaš prawo swoje nastajenja wobdźěłać.",
"ns-specialprotected": "Specialne strony njedadźa so wobdźěłać.",
"titleprotected": "Tutón titul bu přećiwo wutworjenju přez [[User:$1|$1]] škitany.\nPodata přičina je <em>$2</em>.",
- "filereadonlyerror": "Njeje móžno dataju \"$1\" změnić, dokelž datajowy repozitorij \"$2\" je jenož čitajomny.\n\nAdministrator, kiž je jón zawrěł, je tule přičinu podał: \"$3\".",
+ "filereadonlyerror": "Njeje móžno dataju \"$1\" změnić, dokelž datajowy repozitorij \"$2\" je jenož čitajomny.\n\nSystemowy administrator, kiž je jón zawrěł, je tule přičinu podał: \"$3\".",
"invalidtitle-knownnamespace": "Njepłaćiwy titul z mjenowym rumom \"$2\" a tekstom \"$3\"",
"invalidtitle-unknownnamespace": "Njepłaćiwy titul z njeznatym mjenowym rumom $1 a tekstom \"$2\"",
"exception-nologin": "Njejsy přizjewjeny",
"nocookieslogin": "{{SITENAME}} wužiwa placki za přizjewjenje wužiwarjow.\nSy placki znjemóžnił. \nProšu zmóžń je a spytaj hišće raz.",
"nocookiesfornew": "Wužiwarske konto njeje so załožiło, dokelž njemóžachmy jeho žórło wobkrućić.\nPřeswědč so, zo placki su zmóžnjene, ačitaj tutu stronu znowa a spytaj hišće raz.",
"noname": "Njejsy płaćiwe wužiwarske mjeno podał.",
- "loginsuccesstitle": "Přizjewjenje wuspěšne",
+ "loginsuccesstitle": "Přizjewjeny",
"loginsuccess": "'''Sy nětko jako \"$1\" w {{GRAMMAR:lokatiw|{{SITENAME}}}} {{GENDER:|přizjewjeny|přizjewjena|přizjewjene}}.'''",
- "nosuchuser": "Njeje wužiwar z mjenom \"$1\".\nWužiwarske mjena wobkedźbuja wulkopisanje.\nPřepruwuj swój prawopis abo [[Special:CreateAccount|wutwor nowe konto]].",
+ "nosuchuser": "Njeje wužiwar z mjenom \"$1\".\nWužiwarske mjena dźiwaja na wulkopisanje.\nPřepruwuj swój prawopis abo [[Special:CreateAccount|załož nowe konto]].",
"nosuchusershort": "Wužiwarske mjeno „$1” njeeksistuje. Prošu skontroluj prawopis.",
"nouserspecified": "Dyrbiš wužiwarske mjeno podać",
"login-userblocked": "Tutón wužiwar je zablokowany. Přizjewjenje njedowolene.",
"noemail": "Za wužiwarja \"$1\" žana e-mejlowa adresa podata njeje.",
"noemailcreate": "Dyrbiš płaćiwu e-mejlowa adresu podać",
"passwordsent": "Nowe hesło bu na e-mejlowu adresu zregistrowanu za wužiwarja „$1” pósłane.\nProšu přizjew so znowa, po tym zo sy je přijał.",
- "blocked-mailpassword": "Twoja IP-adresa je přećiwo wobdźěłowanju zablokowana, a tohodla njeje dowolene, funkciju za wobnowjenje hesłow wužiwać, zo by znjewužiwanju zadźěwało.",
+ "blocked-mailpassword": "Twoja IP-adresa je přećiwo wobdźěłowanju zablokowana. Zo by znjewužiwanju zadźěwało, njeje dowolene, funkciju za wobnowjenje hesłow z tuteje IP-adresy wužiwać.",
"eauthentsent": "Wobkrućenska e-mejlka je so na podatu e-mejlowu adresu pósłała.\nPrjedy hač so druha e-mejlka na konto pósćele, dyrbiš so po instrukcijach w e-mejlce měć, zo by wobkrućił, zo konto woprawdźe tebi słuša.",
"throttled-mailpassword": "E-mejl za anulowanje hesło je so za {{PLURAL:$1|poslednju hodźinu|poslednjej $1 hodźinje|poslednje $1 hodźiny|poslednich $1 hodźin}} pósłała. Zo by znjewužiwanju zadźěwało, so jenož jedna e-mejl za anulowanje hesła na {{PLURAL:$1|hodźinu|$1 hodźinje|$1 hodźiny|$1 hodźin}} pósćele.",
"mailerror": "Zmylk při słanju e-mejlki: $1",
"createaccount-title": "Wutworjenje wužiwarskeho konta za {{SITENAME}}",
"createaccount-text": "Něchtó je wužiwarske konto za twoju e-mejlowu adresu na {{SITENAME}} ($4) z mjenom \"$2\" z hesłom \"$3\" wutworił. Ty měł so nětko přizjewić a swoje hesło změnić.\n\nMóžeš tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutworiło.",
"login-throttled": "Sy přehusto spytał so přizjewić. Počakaj prošu $1, prjedy hač hišće raz spytaš.",
- "login-abort-generic": "Twoje přizjewjenje njebě wuspěšne - přetorhnjene",
+ "login-abort-generic": "Twoje přizjewjenje je so nimokuliło - přetorhnjene",
"login-migrated-generic": "Waše konto je so přesunyło, a waše wužiwarske mjeno na tutym wikiju hižo njeeksistuje.",
"loginlanguagelabel": "Rěč: $1",
"suspicious-userlogout": "Twoje naprašowanje za wotzjewjenje bu wotpokazane, dokelž zda so, jako by so přez wobškodźeny wobhladowak abo pufrowacy proksy pósłało",
"newpassword": "Nowe hesło:",
"retypenew": "Nowe hesło wospjetować:",
"resetpass_submit": "Hesło posrědkować a so přizjewić",
- "changepassword-success": "Twoje hesło je so wuspěšnje změniło!",
+ "changepassword-success": "Twoje hesło je so změniło!",
"changepassword-throttled": "Sy přehusto spytał so přizjewić. Počakaj prošu $1, prjedy hač hišće raz spytaš.",
"resetpass_forbidden": "Hesła njedadźa so změnić.",
"resetpass-no-info": "Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.",
"resetpass-submit-loggedin": "Hesło změnić",
"resetpass-submit-cancel": "Přetorhnyć",
- "resetpass-wrong-oldpass": "Njepłaćiwe nachwilne abo aktualne hesło.\nSnano sy swoje hesło hižo wuspěšnje změnił abo nowe nachwilne hesło požadał.",
+ "resetpass-wrong-oldpass": "Njepłaćiwe nachwilne abo aktualne hesło.\nSnano sy swoje hesło hižo změnił abo nowe nachwilne hesło požadał.",
"resetpass-recycled": "Prošu staj swoje hesło na druhe hesło hač twoje aktualne hesło.",
"resetpass-temp-emailed": "Sy so z nachwilnym e-mejlowym kodom přizjewił.\nZo by přizjewjenje skónčił, dyrbiš tu nowe hesło postajić:",
"resetpass-temp-password": "Nachwilne hesło:",
"passwordreset-emailtext-ip": "Něchtó (najskerje ty, z IP-adresu $1) je anulowanje hesła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} požadał ($4). {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane}}:\n\n$2\n\n{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.\nTy měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.",
"passwordreset-emailtext-user": "Wužiwar $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}} je anulowanje twojeho hesła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} požadał ($4). {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane}}:\n\n$2\n\n{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.\nTy měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.",
"passwordreset-emailelement": "Wužiwarske mjeno: \n$1\n\nNachwilne hesło: \n$2",
- "passwordreset-emailsentemail": "E-mejl za anulowanje hesło je so pósłała.",
- "passwordreset-emailsent-capture": "E-mejl za anulowanje hesła je so pósłała, kotraž so deleka pokazuje.",
- "passwordreset-emailerror-capture": "E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje {{GENDER:$2|wužiwarjej|wužiwarce}} je so njeporadźiło: $1",
+ "passwordreset-emailsentemail": "Jeli tuta e-mejlowa adresa je z wašim kontom zwjazana, so mejlka za wróćostajenje hesła pósćele.",
"changeemail": "E-mejlowu adresu změnić abo wotstronić",
- "changeemail-header": "Kontowu e-mejlowu adresu změnić",
+ "changeemail-header": "Wupjelń tutón formular, zo by swoju e-mejlowu adresu změnił. Jeli chceš zwisk e-mejloweje adresy ze swijim kontom wotstronić, wostaj polo e-mejloweje adresy prózdne, hdyž formular preč sćeleš.",
"changeemail-no-info": "Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.",
"changeemail-oldemail": "Aktualna e-mejlowa adresa:",
"changeemail-newemail": "Nowa e-mejlowa adresa:",
"sig_tip": "Twoja signatura z časowym kołkom",
"hr_tip": "Wodoruna linija (zrědka wužiwać!)",
"summary": "Zjeće:",
- "subject": "Tema/Nadpismo:",
+ "subject": "Tema:",
"minoredit": "Snadna změna",
"watchthis": "Stronu wobkedźbować",
"savearticle": "Stronu składować",
+ "publishpage": "Stronu wozjewić",
+ "publishchanges": "Změny wozjewić",
"preview": "Přehlad",
"showpreview": "Přehlad pokazać",
"showdiff": "Změny pokazać",
"anonpreviewwarning": "''Njejsy přizjewjeny. Składowanje přenošuje twoju IP-adresu do wobdźěłowanskeje historije tuteje strony.''",
"missingsummary": "'''Kedźbu:''' Njejsy žane zjeće zapodał. Jeli hišće raz na \"{{int:savearticle}}\" kliknješ, budźe so twoja změna bjez njeho składować.",
"missingcommenttext": "Prošu zapodaj komentar.",
- "missingcommentheader": "'''Kedźbu:''' Njejsy temu/nadpis za tutón komentar podał. Jeli na „{{int:savearticle}}” kliknješ, składuje so twoja změna bjez temy/nadpisa.",
+ "missingcommentheader": "<strong>Kedźbu:</strong> Njejsy temu za tutón komentar podał. Jeli na „{{int:savearticle}}” kliknješ, składuje so twoja změna bjez temy.",
"summary-preview": "Přehlad zjeća:",
- "subject-preview": "Přehlad temy/napisma:",
+ "subject-preview": "Přehlad temy:",
"blockedtitle": "Wužiwar je zablokowany",
"blockedtext": "'''Twoje wužiwarske mjeno bu zablokowane abo twoja IP-adresa bu zablokowana.'''\n\nBlokowar je $1.\nPodata přičina je ''$2''.\n\n* Spočatk blokowanja: $8\n* Kónc blokowanja: $6\n* Zablokowany wužiwar: $7\n\nMóžeš $1 abo druheho [[{{MediaWiki:Grouppage-sysop}}|administratora]] kontaktować, zo by wo blokowanju diskutował.\nNjemóžeš funkciju 'Tutomu wužiwarjej e-mejlować' wužiwać, chibazo sy płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|kontowych nastajenjach]] podał a njebu přećiwo jeje wužiwanju zablokowany.\nTwoja tuchwilna IP-adresa je $3 a blokowanski ID je #$5. Prošu podaj wšě horjeka naspomnjene podrobnosće w swojich naprašowanjach.",
"autoblockedtext": "Twoja IP-adresa bu awtomatisce blokowana, dokelž ju druhi wužiwar wužiwaše, kiž bu wot $1 zablokowany.\nPřičina blokowanja bě:\n\n:''$2''\n\n* Započatk blokowanja: $8\n* Kónc blokowanja: $6\n* Zablokowany wužiwar: $7\n\nMóžeš $1 abo jednoho z druhich [[{{MediaWiki:Grouppage-sysop}}|administratorow]] kontaktować, zo by blokowanje diskutował.\n\nWobkedźbuj, zo njemóžeš funkciju \"Wužiwarjej mejlku pósłać\" wužiwać, jeli nimaš płaćiwu e-mejlowu adresu, kotraž je w twojich [[Special:Preferences|wužiwarskich nastajenjach]] zregistrowana a njebi blokowany ju wužiwać.\n\nTwój aktualna adresa IP je $3 a ID blokowanja je #$5.\nProšu podaj wšě horjeka naspomnjene podrobnosće w naprašowanjach, kotrež činiš.",
"accmailtext": "Připadnje spłodźene hesło za [[User talk:$1|$1]] bu na $2 pósłane. Daj so na stronje ''[[Special:ChangePassword|hesło změnić]]'' při přizjewjenju změnić.",
"newarticle": "(Nowy)",
"newarticletext": "Sy wotkaz k stronje slědował, kotraž hišće njeeksistuje. Zo by stronu wutworił, wupjelń slědowace tekstowe polo (hlej [$1 stronu pomocy] za dalše informacije). Jeli sy zmylnje tu, klikń prosće na tłóčatko <b>Wróćo</b> we swojim wobhladowaku.",
- "anontalkpagetext": "---- ''To je diskusijna strona za anonymneho wužiwarja, kiž hišće konto wutworił njeje abo je njewužiwa. Dyrbimy tohodla numerisku IP-adresu wužiwać, zo bychmy jeho/ju identifikowali. Tajka IP-adresa hodźi so wot wjacorych wužiwarjow zhromadnje wužiwać. Jeli sy anonymny wužiwar a měniš, zo buchu irelewantne komentary k tebi pósłane, [[Special:CreateAccount|wutwor prošu konto]] abo [[Special:UserLogin|přizjew so]], zo by přichodnu šmjatańcu z anonymnymi wužiwarjemi wobešoł.''",
- "noarticletext": "Tuchwilu tuta strona žadyn tekst njewobsahuje. Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony na druhich stronach pytać]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} wotpowědne protokole pytać] abo [{{fullurl:{{FULLPAGENAME}}|action=edit}} tutu stronu wobdźěłać]</span>.",
+ "anontalkpagetext": "---- \n<em>To je diskusijna strona za anonymneho wužiwarja, kiž hišće konto wutworił njeje abo je njewužiwa.</em>\nDyrbimy tohodla numerisku IP-adresu wužiwać, zo bychmy jeho/ju identifikowali.\nTajka IP-adresa hodźi so wot wjacorych wužiwarjow zhromadnje wužiwać. Jeli sy anonymny wužiwar a měniš, zo buchu irelewantne komentary k tebi pósłane, [[Special:CreateAccount|wutwor prošu konto]] abo [[Special:UserLogin|přizjew so]], zo by přichodnu šmjatańcu z anonymnymi wužiwarjemi wobešoł.",
+ "noarticletext": "Tuchwilu tuta strona žadyn tekst njewobsahuje. Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony na druhich stronach pytać]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} wotpowědne protokole pytać] abo [{{fullurl:{{FULLPAGENAME}}|action=edit}} tutu stronu wutworić]</span>.",
"noarticletext-nopermission": "Tuchwilu žadyn tekst na tutej stronje njeje.\nMóžeš [[Special:Search/{{PAGENAME}}|tutón titul strony]] na druhich stronach pytać abo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pytaj wotpowědne protokole]</span>, ale nimaš prawo, strou wutworić.",
"missing-revision": "Wersija #$1 strony z mjenom \"{{FULLPAGENAME}}\" njeeksistuje.\n\nPřičina je zwjetša zestarjeny wotkaz w stawiznach k stronje, kotraž je so zhašała.\nPodrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wušmórnjenjow] namakać.",
"userpage-userdoesnotexist": "Wužiwarske konto „$1“ njeje zregistrowane. Prošu pruwuj, hač chceš tutu stronu woprawdźe wutworić/wobdźěłać.",
"userpage-userdoesnotexist-view": "Wužiwarske konto \"$1\" njeje zregistrowane.",
"blocked-notice-logextract": "Tutón wužiwar je tuchwilu zablokowany. Najnowši protokolowy zapisk so deleka jako referenca podawa:",
- "clearyourcache": "'''Kedźbu: Po składowanju dyrbiš snano pufrowak swojeho wobhladowaka wuprózdnić, zo by změny widźał.''' \n* '''Firefox/Safari:''' Tłóč na ''Umsch'' kliknjo na ''Znowa'' abo tłóč ''Strg-F5'' abo ''Strg-R'' (''⌘-R'' na Macintosh);\n* '''Google Chrome:''' Tłóč na ''Strg-Umsch-R'' (''⌘-Umsch-R'' na Mac)\n* '''Internet Explorer:''' Dźěrź ''Strg'' tłóčeny kliknjo na ''Znowa,'' abo tłóč ''Strg-F5''.\n* '''Opera:''' Wuprózdń pufrowak w ''Extras → Einstellungen'';",
+ "clearyourcache": "<strong>Kedźbu:</strong> Po składowanju dyrbiš snano pufrowak swojeho wobhladowaka wuprózdnić, zo by změny widźał.\n* <strong>Firefox/Safari:</strong> Dźerž tastu <em>Umsch</em> tłóčenu a klikń na <em>Znowa</em> abo tłóč pak <em>Strg-F5</em> abo <em>Strg-R</em> (<em>⌘-R</em> na Mac);\n* <strong>Google Chrome:</strong> Tłóč na <em>Strg-Umsch-R</em> (<em>⌘-Umsch-R</em> na Mac)\n* <strong>Internet Explorer:</strong> Dźěrź tastu <em>Strg</em> tłóčen a klikń na <em>Znowa</em> abo tłóč <em>Strg-F5</em>.\n* <strong>Opera:</strong> Dźi k <em>Menü → Einstellungen</em> (<em>Opera → Einstellungen</em> na Mac) a potom k <em>Datenschutz & Sicherheit → Browserdaten löschen → Gespeicherte Bilder und Dateien</em>.",
"usercssyoucanpreview": "'''Pokiw:''' Wužij tłóčku '{{int:showpreview}}', zo by swój nowy css do składowanja testował.",
"userjsyoucanpreview": "'''Pokiw:''' Wužij tłóčatko \"{{int:showpreview}}\", zo by swój nowy JavaScript do składowanja testował.",
"usercsspreview": "'''Wobkedźbujće, zo sej jenož přehlad swojeho wužiwarskeho CSS wobhladuješ. Hišće njeje składowany!'''",
"undo-nochange": "Zda so, zo změna je so hižo cofnyła.",
"undo-summary": "Změna $1 [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusija]]) bu cofnjena.",
"undo-summary-username-hidden": "Změna $1 schowaneho wužiwarja je so anulowała",
- "cantcreateaccounttitle": "Wužiwarske konto njeda so wutworić.",
"cantcreateaccount-text": "Wutworjenje wužiwarskeho konta z IP-adresy '''$1''' bu wot [[User:$3|$3]] zablokowane.\n\nPřičina za blokowanje, podata wot $3, je: ''$2''",
"cantcreateaccount-range-text": "Załoženje kontow z IP-adresow we wobłuku '''$1'', kotryž twoju IP-adresu wobsahuje (<strong>$4</strong>), je so wot [[User:$3|$3]] zablokowało.\n\nPřičina podata wot $3 je <em>$2</em>",
"viewpagelogs": "protokole tuteje strony pokazać",
"revdelete-unsuppress": "Wobmjezowanja za wobnowjene wersije zběhnyć",
"revdelete-log": "Přičina:",
"revdelete-submit": "Na {{PLURAL:$1|wubranu wersiju|wubranej wersiji|wubrane wersije|wubrane wersije}} nałožować",
- "revdelete-success": "'''Widźomnosć wersije bu wuspěšnje zaktualizowana.'''",
+ "revdelete-success": "Widźomnosć wersije je so zaktualizowała.",
"revdelete-failure": "'''Wersijowa widźomnosć njeda so aktualizować:'''\n$1",
- "logdelete-success": "Widźomnosć zapiska bu wuspěšnje změnjena.",
+ "logdelete-success": "Widźomnosć protokola je so změniła.",
"logdelete-failure": "'''Protokolowa widźomnosć njeda so nastajić:'''\n$1",
"revdel-restore": "Widźomnosć změnić",
"pagehist": "Stawizny strony",
"mergehistory-go": "Zjednoćujomne změny pokazać",
"mergehistory-submit": "Wersije zjednoćić",
"mergehistory-empty": "Njehodźa so žane wersije zjednoćeć.",
- "mergehistory-done": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wot $1 wuspěšnje z [[:$2]] {{PLURAL:$3|zjednoćena|zjednoćenej|zjednoćene|zjednoćene}}.",
+ "mergehistory-done": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wot $1 z [[:$2]] {{PLURAL:$3|zjednoćena|zjednoćenej|zjednoćene}}.",
"mergehistory-fail": "Njeje móžno zjednócenje stawiznow přewjesć, prošu přepruwuj stronu a časowe parametry.",
"mergehistory-no-source": "Žórłowa strona $1 njeeksistuje.",
"mergehistory-no-destination": "Cilowa strona $1 njeeksistuje.",
"prefs-watchlist-token": "Marka wobkedźbowankow:",
"prefs-misc": "Wšelake nastajenja",
"prefs-resetpass": "Hesło změnić",
- "prefs-changeemail": "E-mejl změnić",
+ "prefs-changeemail": "E-mejlowu adresu změnić abo wotstronić",
"prefs-setemail": "E-mejlowu adresu postajić",
"prefs-email": "E-mejlowe opcije",
"prefs-rendering": "Napohlad",
"rows": "Rjadki:",
"columns": "Stołpiki:",
"searchresultshead": "Pytać",
- "stub-threshold": "Wotkazowe formatowanje <a href=\"#\" class=\"stub\">małych stronow</a> (w bajtach):",
+ "stub-threshold": "Wotkazowe formatowanje małych stronow ($1):",
"stub-threshold-disabled": "Znjemóžnjeny",
"recentchangesdays": "Ličba dnjow w lisćinje aktualnych změnow:",
"recentchangesdays-max": "(Maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})",
"userrights": "Zrjadowanje wužiwarskich prawow",
"userrights-lookup-user": "Wužiwarske skupiny zrjadować",
"userrights-user-editname": "Wužiwarske mjeno:",
- "editusergroup": "Wužiwarske skupiny wobdźěłać",
- "editinguser": "Změni wužiwarske prawa wužiwarja '''[[User:$1|$1]]''' $2",
+ "editusergroup": "{{GENDER:$1|Wužiwarske}} skupiny wobdźěłać",
+ "editinguser": "Změni wužiwarske prawa {{GENDER:$1|wužiwarja|wužiwarki}} <strong>[[User:$1|$1]]</strong> $2",
"userrights-editusergroup": "Wužiwarske skupiny wobdźěłać",
- "saveusergroups": "Wužiwarske skupiny składować",
+ "saveusergroups": "{{GENDER:$1|Wužiwarske}} skupiny składować",
"userrights-groupsmember": "Čłon wot:",
"userrights-groupsmember-auto": "Implicitny čłon wot:",
"userrights-groups-help": "Móžeš skupiny změnić, w kotrychž wužiwar je.\n* Markěrowany kašćik woznamjenja, zo wužiwar je w tej skupinje.\n* Njemarkěrowany kašćik woznamjenja, zo wužiwar w tej skupinje njeje.\n* \"*\" podawa, zo njemóžeš skupinu wotstronić, tak ruče kaž sy ju přidał abo nawopak.",
"userrights-changeable-col": "Skupiny, kotrež móžeš změnić",
"userrights-unchangeable-col": "Skupiny, kotrež njemóžeš změnić",
"userrights-conflict": "Konflikt změnow wužiwarskich prawow! Prošu přepruwuj a wobkruć swoje změny.",
- "userrights-removed-self": "Sy swoje prawa wuspěšnje wotstronił. Tohodla nimaš hižo přistup na tutu stronu měć.",
+ "userrights-removed-self": "Sy swoje prawa wotstronił. Tohodla nimaš hižo přistup na tutu stronu měć.",
"group": "Skupina:",
"group-user": "wužiwarjo",
"group-autoconfirmed": "Awtomatisce potwjerdźeni wužiwarjo",
"group-bot": "Boty",
"group-sysop": "Administratorojo",
"group-bureaucrat": "Běrokraća",
- "group-suppress": "dohladowarjo",
+ "group-suppress": "Potłóčowarjo",
"group-all": "(wšě)",
"group-user-member": "{{GENDER:$1|wužiwar|wužiwarka}}",
"group-autoconfirmed-member": "{{GENDER:$1|awtomatisce potwjerdźeny wužiwar|awtomatisce potwjerdźena wužiwarka}}",
"group-bot-member": "{{GENDER:$1|bot}}",
"group-sysop-member": "{{GENDER:$1|administrator|administratorka}}",
"group-bureaucrat-member": "{{GENDER:$1|běrokrat|běrokratka}}",
- "group-suppress-member": "{{GENDER:$1|dohladowar|dohladowarka}}",
+ "group-suppress-member": "{{GENDER:$1|potłóčowar|potłóčowarka}}",
"grouppage-user": "{{ns:project}}:Wužiwarjo",
"grouppage-autoconfirmed": "{{ns:project}}:Awtomatisce potwjerdźeni wužiwarjo",
"grouppage-bot": "{{ns:project}}:Boćiki",
"grouppage-sysop": "{{ns:project}}:Administratorojo",
"grouppage-bureaucrat": "{{ns:project}}:Běrokraća",
- "grouppage-suppress": "{{ns:project}}:Dohladowanje",
+ "grouppage-suppress": "{{ns:project}}:Potłóčowarjo",
"right-read": "Strony čitać",
"right-edit": "Strony wobdźěłać",
"right-createpage": "Strony wutworić (kotrež diskusijne strony njejsu)",
"right-override-export-depth": "Strony inkluziwnje wotkazanych stronow hač do hłubokosće 5 eksportować",
"right-sendemail": "Druhim wužiwarjam e-mejl pósłać",
"right-passwordreset": "E-mejlki za wróćostajenje hesłow sej wobhladać",
- "right-managechangetags": "[[Special:Tags|markěrowanja]] wutworić a z datoweje banki zhašeć",
+ "right-managechangetags": "[[Special:Tags|Markěrowanja]] wutworić a z(nje)móžnić",
"right-applychangetags": "[[Special:Tags|Markěrowanja]] hromadźe ze změnami nałožować",
"newuserlogpage": "Protokol nowych wužiwarjow",
"newuserlogpagetext": "To je protokol wutworjenja nowych wužiwarskich kontow.",
"rightslogtext": "To je protokol změnow wužiwarskich prawow.",
"action-read": "tutu stronu čitać",
"action-edit": "tutu stronu wobdźěłać",
- "action-createpage": "strony wutworić",
- "action-createtalk": "diskusijne strony wutworić",
+ "action-createpage": "tutu stronu wutworić",
+ "action-createtalk": "tutu diskusijnu stronu wutworić",
"action-createaccount": "wužiwarske konto załožić",
"action-history": "historiju tuteje strony pokazać",
"action-minoredit": "tutu změnu jako snadnu markěrować",
"action-viewmyprivateinfo": "twoje priwatne informacije sej wobhladać",
"action-editmyprivateinfo": "twoje priwatne informacije wobdźěłać",
"action-editcontentmodel": "wobsahowy model strony wobdźěłać",
- "action-managechangetags": "markěrowanja wutworić a z datoweje banki zhašeć",
+ "action-managechangetags": "markěrowanja wutworić a z(nje)móžnić",
"action-applychangetags": "markěrowanja hromadźe z wašimi změnami nałožować",
"nchanges": "$1 {{PLURAL:$1|změna|změnje|změny|změnow}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|wot poslednjeho wopyta}}",
"boteditletter": "B",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|wobkedźbowacy wužiwar|wobkedźbowacaj wužiwarjej|wobkedźbowacy wužiwarjo|wobkedźbowacych wužiwarjow}}]",
"rc_categories": "Jenož kategorije (dźělene z \"|\")",
- "rc_categories_any": "wšě",
+ "rc_categories_any": "Někajka z wubranych",
"rc-change-size": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}}",
"rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}} po změnje",
"newsectionsummary": "Nowy wotrězk: /* $1 */",
"backend-fail-read": "Dataja $1 njeda so čitać",
"backend-fail-create": "Dataja $1 njeda so pisać.",
"backend-fail-maxsize": "Dataja $1 njeda so pisać, dokelž je wjetša hač {{PLURAL:$2|jedyn bajt|$2 bajtaj|$2 bajty|$2 bajtow}}.",
- "backend-fail-readonly": "Składowanski backend \"$1\" da so tuchwilu jenož čitać. Přičina je była: \"$2\"",
+ "backend-fail-readonly": "Składowanski backend \"$1\" da so tuchwilu jenož čitać. Přičina je: <em>$2</em>",
"backend-fail-synced": "Dataja \"$1\" je znutřka interneho składowanskeho backenda w inkonsistentnym stawje",
"backend-fail-connect": "Zwisk z datajowym składowanskim backendom \"$1\" móžno njeje.",
"backend-fail-internal": "W składowanskim backendźe \"$1\" je njeznaty zmylk wustupił.",
"uploadstash-summary": "Tuta strona zmóžnja přistup k datajam, kotrež su nahrate (abo so nahrawaja), ale hišće njejsu do wikija wozjejwene. Tute dataje za nikoho widźomne njejsu, jenož za wužiwarja, kiž je je nahrał.",
"uploadstash-clear": "Schowane nahrate dataje zhašeć",
"uploadstash-nofiles": "Nimaš žane schowane nahrate dataje.",
- "uploadstash-badtoken": "Wuwjedźenje teje akcije je so njeporadźiło, snano dokelž twoje wobdźěłowanske daty su spadnjene. Spytaj hišće raz.",
- "uploadstash-errclear": "Wotstronjenje datajow je so njeporadźiło.",
+ "uploadstash-badtoken": "Wuwjedźenje teje akcije njeje so poradźiło, snano dokelž twoje wobdźěłowanske daty su spadnjene. Spytaj prošu hišće raz.",
+ "uploadstash-errclear": "Wotstronjenje datajow njeje so poradźiło.",
"uploadstash-refresh": "Lisćinu datajow aktualizować",
"invalid-chunk-offset": "Njepłaćiwy startowy dypk",
"img-auth-accessdenied": "Přistup wotpokazany",
"nopagetext": "Cilowa strona, kotruž sće podał, njeeksistuje.",
"pager-newer-n": "{{PLURAL:$1|nowši 1|nowšej $1|nowše $1|nowšich $1}}",
"pager-older-n": "{{PLURAL:$1|starši 1|staršej $1|starše $1|staršich $1}}",
- "suppress": "Dohladowanje",
+ "suppress": "Potłóčować",
"querypage-disabled": "Tuta specialna strona je z wukonowych přičinow znjemóžnjena.",
"apihelp": "API-pomoc",
"apihelp-no-such-module": "Modul \"$1\" njeje so namakał.",
"apisandbox-intro": "Wužij tutu stronu, zo by z '''websłužbu Mediawiki API''' eksperimentował.\nHlej [https://www.mediawiki.org/wiki/API:Main_page API-dokumentaciju] za dalše podrobnosće za wužiwanje API. Přikład: [https://www.mediawiki.org/wiki/API#A_simple_example Wobsah hłowneje strony wotwołać]. Wubjer akciju, zo by dalše přikłady widźał.\n\nDźiwaj na to, zo, hačrunjež to je hrajkanišćo, akcije, kotrež na tutej stronje přewjedźeš, móhli wiki změnić.",
"apisandbox-submit": "Naprašowanje přewjesć",
"apisandbox-reset": "Wuprózdnić",
- "apisandbox-examples": "Přikład",
- "apisandbox-results": "Wuslědk",
+ "apisandbox-examples": "Přikłady",
+ "apisandbox-results": "Wuslědki",
"apisandbox-request-url-label": "URL naprašowanja:",
- "apisandbox-request-time": "Naprašowanski čas: $1",
+ "apisandbox-request-time": "Traće naprašowanja: {{PLURAL:$1|$1 milisekunda|$1 milisekundźe|$1 milisekundy|$1 milisekundow}}",
"booksources": "Pytanje po ISBN",
"booksources-search-legend": "Žórła za knihi pytać",
"booksources-search": "Pytać",
"booksources-text": "To je lisćina wotkazow k druhim sydłam, kotrež nowe a trjebane knihi předawaja. Tam móžeš tež dalše informacije wo knihach dóstać, kotrež pytaš:",
"booksources-invalid-isbn": "Podate ISBN-čisło njezda so płaćiwe być; přepruwuj za zmylkami, z tym zo z orginialneho žórła kopěruješ.",
"specialloguserlabel": "Wukonjer:",
- "speciallogtitlelabel": "Cil (titul abo wužiwar):",
+ "speciallogtitlelabel": "Cil (titul abo {{ns:user}}:wužiwarske mjeno za wužiwarja):",
"log": "Protokole",
"all-logs-page": "Wšě zjawne protokole",
"alllogstext": "Kombinowane zwobraznjenje wšěch k dispozicij stejacych protokolow w {{GRAMMAR:lokatiw|{{SITENAME}}}}. Móžeš napohlad wobmjezować, wuběrajo typ protokola, wužiwarske mjeno (dźiwajo na wulkopisanje) abo potrjechu stronu (tež dźiwajo na wulkopisanje).",
"wlheader-showupdated": "Strony, kotrež su so po twojim poslednim wopyće změnili, so '''tučne''' pokazuja.",
"wlnote": "Deleka {{PLURAL:$1|je poslednja změna|stej poslednjej <strong>$1</strong> změnje|su poslednje <strong>$1</strong> změny|je poslednich <strong>$1</strong> změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje <strong>$2</strong> hodźinje|poslednje <strong>$2</strong> hodźiny|poslednich <strong>$2</strong> hodźin}}, staw : $3, $4.",
"wlshowlast": "Změny zańdźenych $1 hodźin, $2 dnjow, pokazać",
- "wlshowtime": "Pokazaj změny zašłych",
+ "wlshowtime": "Perioda, kotraž ma so pokazać:",
"watchlist-options": "Opcije wobkedźbowankow",
"watching": "Wobkedźbuju…",
"unwatching": "Njewobkedźbuju…",
"deletepage": "Stronu zhašeć",
"confirm": "Wobkrućić",
"excontent": "wobsah běše: '$1'",
- "excontentauthor": "wobsah bě: '$1' (a jenički wobdźěłowar bě '[[Special:Contributions/$2|$2]]')",
+ "excontentauthor": "wobsah bě: „$1“, a jenički wobdźěłar bě „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskusija]])",
"exbeforeblank": "wobsah do wuprózdnjenja běše: '$1'",
"delete-confirm": "„$1“ wušmórnyć",
"delete-legend": "Wušmórnyć",
"delete-toobig": "Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje tajkich stronow bu wobmjezowane, zo by připadne přetorhnjenje {{SITENAME}} wobešło.",
"delete-warning-toobig": "Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje móže operacije datoweje banki {{SITENAME}} přetorhnyć; pokročuj z kedźbliwosću.",
"deleteprotected": "Njemóžeš tutu stronu zhašeć, dokelž je so škitała.",
- "deleting-backlinks-warning": "'''Warnowanje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druhe strony]] wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
+ "deleting-backlinks-warning": "<strong>Warnowanje:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druhe strony]] wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
"rollback": "Změny cofnyć",
"rollbacklink": "Cofnyć",
"rollbacklinkcount": "$1 {{PLURAL:$1|změnu|změnje|změny|změnow}} cofnyć",
"protect-locked-blocked": "Njemóžeš škit strony změnič, dokelž twoje konto je zablokowane. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
"protect-locked-dblock": "Datowa banka je zawrjena, tohodla njemóžeš škit strony změnić. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
"protect-locked-access": "Nimaš trěbne prawa, zo by škit strony změnił. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
- "protect-cascadeon": "Tuta strona je tuchwilu škitana, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitane}}. Změny na škitnym schodźenku tuteje strony njebudu kaskadowy škit wobwliwować.",
+ "protect-cascadeon": "Tuta strona je tuchwilu škitana, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane}}. Změny na škitnym schodźenku tuteje strony njebudu kaskadowy škit wobwliwować.",
"protect-default": "Wšěm wužiwarjam dowolić",
"protect-fallback": "Jenož wužiwarjow z prawom \"$1\" dowolić",
"protect-level-autoconfirmed": "Jenož awtomatisce wobkrućenym wužiwarjam dowolić",
"undeletepagetext": "{{PLURAL:$1|Slědowaca strona bu wušmórnjena, ale je|Slědowacej $1 stronje buštej wušmórnjenej, ale stej|Slědowace $1 strony buchu wušmórnjene, ale su|Slědowacych $1 bu wušmórnjene, ale je}} hišće w archiwje a {{PLURAL:$1|da so|datej so|dadźa so|da so}} wobnowić.\nArchiw da so periodisce wuprózdnić.",
"undelete-fieldset-title": "Wersije wobnowić",
"undeleteextrahelp": "Zo by wšě stawizny strony wobnowił, wostaj prošu wšě kontrolowe kašćiki njewubrane a klikń na '''''{{int:undeletebtn}}'''''.\nZo by selektiwne wobnowjenje přewjedł, wubjer kašćiki, kotrež wersijam wotpowěduja, kotrež maja so wobnowić, a klikń na '''''{{int:undeletebtn}}'''''.",
- "undeleterevisions": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} {{PLURAL:$1|archiwowana|archiwowanej|archiwowane|archiwowane}}",
+ "undeleterevisions": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} {{PLURAL:$1|zhašana|zhašanej|zhašane|zhašanych}}",
"undeletehistory": "Jeli tutu stronu wobnowiš, so wšě (tež prjedy wušmórnjene) wersije zaso do stawiznow wobnowja. Jeli bu po wušmórnjenju nowa strona ze samsnym mjenom wutworjena, budu so wobnowjene wersije w prjedawšich stawiznach jewić.",
"undeleterevdel": "Wobnowjenje so njepřewjedźe, jeli je najwyša strona docpěta abo datajowa wersija budźe so zdźěla wušmórnje.\nW tutym padźe dyrbiš najnowšu wušmórnjenu wersiju znjemóžnić abo pokazać.",
"undeletehistorynoadmin": "Strona bu wušmórnjena. Přičina za wušmórnjenje so deleka w zjeću pokazuje, zhromadnje z podrobnosćemi wužiwarjow, kotřiž běchu tutu stronu do zničenja wobdźěłali. Tuchwilny wobsah strony je jenož administratoram přistupny.",
"contributions": "Přinoški {{GENDER:$1|wužiwarja|wužiwarki}}",
"contributions-title": "Wužiwarske přinoški wot „$1“",
"mycontris": "Přinoški",
+ "anoncontribs": "Přinoški",
"contribsub2": "Za {{GENDER:$3|$1}} ($2)",
"contributions-userdoesnotexist": "Wužiwarske konto \"$1\" njeje zregistrowane.",
"nocontribs": "Žane změny, kotrež podatym kriterijam wotpowěduja.",
"whatlinkshere-next": "{{PLURAL:$1|přichodny|přichodnej|přichodne|přichodne $1}}",
"whatlinkshere-links": "← wotkazy",
"whatlinkshere-hideredirs": "Daleposrědkowanja $1",
- "whatlinkshere-hidetrans": "Zapřijeća $1",
+ "whatlinkshere-hidetrans": "Transkluzije $1",
"whatlinkshere-hidelinks": "Wotkazy $1",
"whatlinkshere-hideimages": "Datajowe wotkazy $1",
"whatlinkshere-filters": "Filtry",
"cant-move-to-user-page": "Nimaš prawo stronu do wužiwarskeje strony přesunyć (z wuwzaćom do wužiwarskeje podstrony).",
"cant-move-category-page": "Nimaš prawo, zo by kategorijowe strony přesunył.",
"cant-move-to-category-page": "Nimaš prawo, stronu do kategorijoweje strony přesunyć.",
- "newtitle": "pod nowe hesło",
+ "newtitle": "Nowy titul:",
"move-watch": "Stronu wobkedźbować",
"movepagebtn": "Stronu přesunyć",
"pagemovedsub": "Přesunjenje wuspěšne",
"javascripttest": "JavaScriptowy test",
"javascripttest-pagetext-unknownaction": "Njeznata akcija \"$1\"",
"javascripttest-qunit-intro": "Hlej [$1 testowansku dokumentaciju] na mediawiki.org.",
- "tooltip-pt-userpage": "Twoja wužiwarska strona",
+ "tooltip-pt-userpage": "{{GENDER:|Twoja wužiwarska}} strona",
"tooltip-pt-anonuserpage": "Wužiwarska strona IP-adresy, z kotrejž tuchwilu dźěłaš",
- "tooltip-pt-mytalk": "Twoja diskusijna strona",
+ "tooltip-pt-mytalk": "{{GENDER:|Twoja}} diskusijna strona",
"tooltip-pt-anontalk": "Diskusija wo změnach z tuteje IP-adresy",
- "tooltip-pt-preferences": "moje nastajenja",
+ "tooltip-pt-preferences": "{{GENDER:|Twoje}} nastajenja",
"tooltip-pt-watchlist": "lisćina stronow, kotrež wobkedźbuješ",
- "tooltip-pt-mycontris": "Lisćina twojich přinoškow",
+ "tooltip-pt-mycontris": "Lisćina {{GENDER:|twojich}} přinoškow",
"tooltip-pt-login": "Móžeš so woměrje přizjewić, to pak zawjazowace njeje.",
"tooltip-pt-logout": "so wotzjewić",
"tooltip-pt-createaccount": "Pozbudźujemy će, konto załožić a so přizjewić; njeje wšak nuznje trěbne",
"tooltip-t-recentchangeslinked": "aktualne změny w stronach, na kotrež tuta strona wotkazuje",
"tooltip-feed-rss": "RSS-feed za tutu stronu",
"tooltip-feed-atom": "Atom-feed za tutu stronu",
- "tooltip-t-contributions": "přinoški tutoho wužiwarja wobhladać",
- "tooltip-t-emailuser": "wužiwarjej mejlku pósłać",
+ "tooltip-t-contributions": "Lisćina přinoškow {{GENDER:$1|tutoho wužiwarja|tuteje wužiwarki}}",
+ "tooltip-t-emailuser": "{{GENDER:$1|Tutomu wužiwarjej|Tutej wužiwarce}} mejlku pósłać",
"tooltip-t-info": "Dalše informacije wo tutej stronje",
"tooltip-t-upload": "Dataje nahrać",
"tooltip-t-specialpages": "lisćina wšěch specialnych stronow",
"lastmodifiedatby": "Strona bu dnja $1 w $2 hodź. wot $3 změnjena.",
"othercontribs": "Bazěruje na dźěle wužiwarja $1.",
"others": "druhich",
- "siteusers": " {{PLURAL:$2|wužiwarja|wužiwarjeju|wužiwarjow|wužiwarjow}} $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
+ "siteusers": " {{PLURAL:$2|{{GENDER:$1|wužiwarja|wužiwarki}}|wužiwarjow|wužiwarkow}} $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
"anonusers": " {{PLURAL:$2|anonymny wužiwar|anonymnaj wužiwarjej|anonymni wužiwarjo|anonymnych wužiwarjow}} $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
"creditspage": "Dźak awtoram",
"nocredits": "Za tutu stronu žane informacije wo zasłužbach njejsu.",
"scarytranscludefailed-httpstatus": "[Wotwołanje předłohi za $1 je so njeporadźiło: HTTP $2]",
"scarytranscludetoolong": "[URL je předołhi]",
"deletedwhileediting": "'''Kedźbu''': Tuta strona bu wušmórnjena, po tym zo sy započał ju wobdźěłać!",
- "confirmrecreate": "Wužiwar [[User:$1|$1]] ([[User talk:$1|diskusija]]) je stronu wušmórnył, po tym zo sy započał ju wobdźěłać. Přičina:\n: ''$2''\nProšu potwjerdź, zo chceš tutu stronu woprawdźe znowa wutworić.",
- "confirmrecreate-noreason": "Wužiwar [[User:$1|$1]] ([[User talk:$1|diskusija]]) je tutu stronu zhašał, po tym zo sće wobdźěłanje započał. Prošu wobkruć, zo woprawdźe chceš tutu stronu znowa wutworić.",
+ "confirmrecreate": "{{GENDER:$1|Wužiwar|Wužiwarka}} [[User:$1|$1]] ([[User talk:$1|diskusija]]) je stronu {{GENDER:$1|wušmórnył|wušmórnyła}}, po tym zo sy započał ju wobdźěłać. Přičina:\n: <em>$2</em>\nProšu potwjerdź, zo chceš tutu stronu woprawdźe znowa wutworić.",
+ "confirmrecreate-noreason": "{{GENDER:$1|Wužiwar|Wužiwarka}} [[User:$1|$1]] ([[User talk:$1|diskusija]]) je tutu stronu {{GENDER:$1|zhašał|zhašała}}, po tym zo sće wobdźěłowanje započał. Prošu wobkruć, zo woprawdźe chceš tutu stronu znowa wutworić.",
"recreate": "Znowa wutworić",
"confirm_purge_button": "W porjadku",
"confirm-purge-top": "Pufrowak strony wuprózdnić?",
"watchlistedit-raw-done": "Twoje wobkedźbowanki buchu składowane.",
"watchlistedit-raw-added": "{{PLURAL:$1|1 zapisk bu dodaty|$1 zapiskaj buštej dodatej|$1 zapiski buchu dodate|$1 zapiskow buchu dodate}}:",
"watchlistedit-raw-removed": "{{PLURAL:$1|1 zapisk bu wotstronjeny|$1 zapiskaj buštej wotstronjenej|$1 zapiski buchu wotstronjene|$1 zapiskow buchu wotstronjene}}:",
- "watchlistedit-clear-title": "Wotstronjene wobkedźbowanki",
+ "watchlistedit-clear-title": "Wobkedźbowanki zhašeć",
"watchlistedit-clear-legend": "Wobkedźbowanki wotstronić",
"watchlistedit-clear-explain": "Wšě titule budu so z twojich wobkedźbowankow wotstronjeć",
"watchlistedit-clear-titles": "Titule:",
"version-libraries": "Instalowane biblioteki",
"version-libraries-library": "Biblioteka",
"version-libraries-version": "Wersija",
- "redirect": "Po datajowym mjenje, wužiwarju, stronje abo wersijowym ID dale sposrědkować",
+ "redirect": "Na dataju, wužiwarja, stronu abo wersiju abo protokolowy ID dale sposrědkować",
"redirect-summary": "Tuta specialna strona so do dataje (datajowe mjeno je podate), strony (wersijowy ID abo ID strony je podaty) abo wužiwarskeje strony (numeriski wužiwarski ID je podaty) dale sposrědkuje. Wužiće:\n[[{{#Special:Redirect}}/file/Přikład.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] abo [[{{#Special:Redirect}}/user/101]].",
"redirect-submit": "Los",
"redirect-lookup": "Pytać:",
"tags-deactivate-submit": "Znjemóžnić",
"tags-edit-revision-selected": "{{PLURAL:$1|Wubrana wersija|Wubranej wersiji|Wubrane wersije}} wot [[:$2]]:",
"tags-edit-logentry-selected": "{{PLURAL:$1|Wubrany protokolowy podawk|Wubranej protokolowej podawkaj|Wubrane protokolowe podawki}}",
- "tags-edit-existing-tags-none": "\"Žadyn\"",
+ "tags-edit-existing-tags-none": "<em>Žadyn</em>",
"tags-edit-reason": "Přičina:",
"tags-edit-revision-submit": "Změny na {{PLURAL:$1|tutu wersiju|$1 wersiji|$1 wersije|$1 wersijow}} nałožić",
"tags-edit-logentry-submit": "Změny na {{PLURAL:$1|tutón protokolowy zapisk|$1 protokolowej zapiskaj|$1 protokolowe zapiski|$1 protokolowych zapiskow}}",
- "tags-edit-success": "Změny su so wuspěšnje nałožili.",
+ "tags-edit-success": "Změny su so nałožili.",
"tags-edit-failure": "Změny njehodźa so nałožować:\n$1",
"tags-edit-nooldid-title": "Njepłaćiwa cilowa wersija",
"comparepages": "Strony přirunać",
"logentry-newusers-create2": "$1 je wužiwarske konto $3 {{GENDER:$2|załožił|załožiła}}",
"logentry-newusers-byemail": "$1 je wužiwarske konto $3 {{GENDER:$2|załožił|załožiła}} a hesło je so přez e-mejl pósłało.",
"logentry-newusers-autocreate": "Wužiwarske konto $1 je so awtomatisce {{GENDER:$2|załožiło}}",
- "logentry-rights-rights": "$1 je skupinske čłonstwo za $3 z $4 do $5 {{GENDER:$2|změnił|změniła}}",
+ "logentry-rights-rights": "$1 je skupinske čłonstwo za {{GENDER:$6|$3}} z $4 do $5 {{GENDER:$2|změnił|změniła}}",
"logentry-rights-rights-legacy": "$1 je skupinske čłonstwo za $3 {{GENDER:$2|změnił|změniła}}",
"logentry-rights-autopromote": "$1 je so awtomatisce wot $4 do $5 {{GENDER:$2|přirjadował|přirjadowała}}",
"logentry-upload-upload": "$1 je $3 {{GENDER:$2|nahrał|nahrała}}",
"api-error-badaccess-groups": "Nimaš prawo dataje do tutoho wikija nahrać.",
"api-error-badtoken": "Nutřkowny zmylk: Wopačny token.",
"api-error-copyuploaddisabled": "Nahrawanje přez URL je na tutym serwerje znjemóžnjene.",
- "api-error-duplicate": "{{PLURAL:$1|Je|Stej|Su|Je}} hižo {{PLURAL:$1|druha dataja|druhej dataji|druhe dataje|druhich datajow}} ze samsnym wobsahom na sydle",
+ "api-error-duplicate": "{{PLURAL:$1|Je|Stej|Su}} hižo {{PLURAL:$1|druha dataja|druhej dataji|druhe dataje}} ze samsnym wobsahom na sydle.",
"api-error-duplicate-archive": "{{PLURAL:$1|Bě druha dataja|Běštej druhej dataji|Běchu druhe dataje|Bě druhich datajow}} hižo na websydle ze samsnym wobsahom, ale {{PLURAL:$1|je so zhašała|stej so zhašałoj|su so zhašeli|je so zhašało}}.",
"api-error-empty-file": "Dataja, kotruž sy nahrał, je prózdna.",
"api-error-emptypage": "Wutworjenje nowych, prózdnych stronow njeje dowolene.",
"expand_templates_generate_xml": "Analyzowy štom XML pokazać",
"expand_templates_generate_rawhtml": "Hruby HTML pokazać",
"expand_templates_preview": "Přehlad",
- "pagelanguage": "Selektor rěče strony",
+ "pagelanguage": "Rěč strony změnić",
"pagelang-name": "Strona",
"pagelang-language": "Rěč",
"pagelang-use-default": "Standardnu rěč wužiwać",
"special-characters-title-minus": "minusowe znamješko",
"mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
"mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
- "api-error-blacklisted": "Prošu wubjer druhi, wuprajiwy titul.",
"randomrootpage": "Připadna korjenjowa strona"
}
"Lucas"
]
},
- "tog-underline": "Souliyen lyen yo :",
+ "tog-underline": "Souliyen lyen yo :",
"tog-hideminor": "Kache tout modifikasyon resan yo ki tou piti",
"tog-hidepatrolled": "Kache modifikasyon yo ki fèk fèt pou moun ki ap veye yo",
"tog-newpageshidepatrolled": "Kache paj ki siveye yo nan mitan lis nouvo paj yo",
"parser-template-recursion-depth-warning": "Limit depase pou kantite fwa yon modèl ka rele tèt li ($1)",
"language-converter-depth-warning": "Limit sou pwofondè konvètisè lang yo depase ($1)",
"undo-summary": "Revoke revizyon $1 ki te fèt pa [[Special:Contributions/$2|$2]] ([[User talk:$2|diskite]])",
- "cantcreateaccounttitle": "Ou pa kapab kreye yon kont.",
"viewpagelogs": "gade jounal paj sa a",
"nohistory": "Istorik pou paj sa pa egziste ditou.",
"currentrev": "Vèsyon kounye a",
"skin-preview": "Voye kout je",
"youremail": "Adrès imèl :",
"username": "Non itilizatè a:",
- "prefs-memberingroups": "Manm {{PLURAL:$1|nan gwoup sa|nan gwoup sa yo }} :",
+ "prefs-memberingroups": "{{GENDER:$2|Manm}} {{PLURAL:$1|nan gwoup sa|nan gwoup sa yo}} :",
"yourrealname": "Vre non ou:",
"yourlanguage": "Lang:",
"yournick": "Siyati pou espas diskisyon :",
"tagline": "A {{SITENAME}} wikiből",
"help": "Segítség",
"search": "Keresés",
+ "search-ignored-headings": " #<!-- ezen a soron ne változtass --> <pre>\n# Az itt megadott szakaszokat figyelmen kívül hagyja a kereső.\n# Ha megváltoztatod ezt a listát, csak a változtatás után indexelt lapokra lesz hatása.\n# Ha újra akarsz indexelni egy adott oldalt, egy üres szerkesztéssel (megnyit-elment) megteheted.\n# Szintaxis:\n# * A # jeltől a sor végéig tartó rész megjegyzés, a szoftver figyelmen kívül hagyja\n# * Minden nem üres sor egy olyan szakasz címe, amit nem akarjuk, hogy indexeljen a kereső. (Csak a pontos egyezés számít, kisbetű/nagybetűt is beleértve.)\nForrások\nJegyzetek\nHivatkozások\nKülső hivatkozások\nLásd még\n #</pre> <!-- ezen a soron ne változtass -->",
"searchbutton": "Keresés",
"go": "Menj",
"searcharticle": "Menj",
"password-change-forbidden": "Nem módosíthatod a jelszót ezen a wikin.",
"externaldberror": "Hiba történt a külső adatbázis hitelesítése közben, vagy nem vagy jogosult a külső fiókod frissítésére.",
"login": "Bejelentkezés",
+ "login-security": "Személyazonosságod igazolása",
"nav-login-createaccount": "Bejelentkezés / fiók létrehozása",
"userlogin": "Bejelentkezés / fiók létrehozása",
"userloginnocreate": "Bejelentkezés",
"userlogin-resetpassword-link": "Elfelejtetted a jelszavad?",
"userlogin-helplink2": "Segítség a bejelentkezéshez",
"userlogin-loggedin": "Már be vagy jelentkezve mint {{GENDER:$1|$1}}. Ha más néven akarsz belépni, alább megteheted.",
+ "userlogin-reauth": "Újra be kell jelentkezned, hogy igazold, te vagy $1.",
"userlogin-createanother": "Másik felhasználói fiók létrehozása",
"createacct-emailrequired": "E-mail cím",
"createacct-emailoptional": "E-mail cím (opcionális)",
"createacct-reason-ph": "Miért hozol létre egy másik fiókot",
"createacct-submit": "Felhasználói fiók létrehozása",
"createacct-another-submit": "Fiók létrehozása",
+ "createacct-continue-submit": "Fiók létrehozásának folytatása",
+ "createacct-another-continue-submit": "Fiók létrehozásának folytatása",
"createacct-benefit-heading": "A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.",
"createacct-benefit-body1": "{{PLURAL:$1|szerkesztés|szerkesztés}}",
"createacct-benefit-body2": "{{PLURAL:$1|lap|lap}}",
"nocookiesnew": "A felhasználói fiókod létrejött, de nem vagy bejelentkezve. A wiki sütiket („cookie”) használ a szerkesztők azonosítására. Nálad ezek le vannak tiltva. Kérlek, engedélyezd őket a böngésződben, majd lépj be az új azonosítóddal és jelszavaddal.",
"nocookieslogin": "A wiki sütiket („cookie”) használ a szerkesztők azonosításhoz.\nNálad ezek le vannak tiltva.\nEngedélyezd őket a böngésződben, majd próbáld újra.",
"nocookiesfornew": "A felhasználói fiók nem lett létrehozva, mivel nem sikerült megerősítenünk a forrását.\nEllenőrizd, hogy a sütik engedélyezve vannak-e, majd frissítsd az oldalt, és próbálkozz újra.",
+ "createacct-loginerror": "A fiók sikeresen létrejött, de nem tudtál automatikusan bejelentkezni. Kérjük, [[Special:UserLogin|jelentkezz be manuálisan]]!",
"noname": "Érvénytelen szerkesztőnevet adtál meg.",
"loginsuccesstitle": "Sikeres bejelentkezés",
"loginsuccess": "'''Sikeresen bejelentkeztél a(z) {{SITENAME}} wikibe „$1” néven.'''",
"resetpass-abort-generic": "A jelszómódosítást megszakította egy kiterjesztés.",
"resetpass-expired": "A jelszavad lejárt. Adjál meg egy új jelszót a bejelentkezéshez!",
"resetpass-expired-soft": "A jelszavad lejárt, ezért újat kell beállítanod. Válassz most egy új jelszót, vagy kattints a {{int:authprovider-resetpass-skip-label}} gombra, ha később akarod csak beállítani.",
- "resetpass-validity-soft": "Adj meg egy új jelszót most, vagy kattints a \"{{int:authprovider-resetpass-skip-label}}\" gombra, ha később akarod megadni.",
+ "resetpass-validity-soft": "A jelszavad érvénytelen: $1\n\nAdj meg egy új jelszót most, vagy kattints a „{{int:authprovider-resetpass-skip-label}}” gombra, ha később akarod megadni.",
"passwordreset": "Jelszó visszaállítása",
"passwordreset-text-one": "A jelszó átmeneti beállításához töltsd ki az űrlapot.",
"passwordreset-text-many": "{{PLURAL:$1|Az átmeneti jelszó elküldéséhez töltsd ki az alábbi mezők egyikét.}}",
"passwordreset-emailelement": "Felhasználónév: \n$1\n\nIdeiglenes jelszó: \n$2",
"passwordreset-emailsentemail": "Ha ez az e-mail-cím van a fiókodhoz társítva, egy jelszó-visszaállító e-mailt küldünk.",
"passwordreset-emailsentusername": "Ha ehhez a felhasználónévhez tartozik e-mail cím, akkor egy jelszó-visszaállító levelet küld a rendszer.",
- "passwordreset-emailsent-capture": "Az alább látható jelszó-visszaállító e-mail lett elküldve.",
- "passwordreset-emailerror-capture": "A jelszó-visszaállító e-mail generálása megtörtént, mint az alább látszik, de elküldése a {{GENDER:$2|szerkesztőnek}} nem sikerült: $1",
+ "passwordreset-emailsent-capture2": "A jelszóvisszaállító {{PLURAL:$1|e-mailt|e-maileket}} elküldtük. A felhasználói {{PLURAL:$1|név és a jelszó|nevek és jelszavak listája}} lentebb látható.",
"passwordreset-invalideamil": "Érvénytelen e-mail cím",
"changeemail": "E-mail cím megváltoztatása vagy eltávolítása",
"changeemail-header": "Töltsd ki ezt az űrlapot az e-mail-címed megváltoztatásához. Ha nem szeretnél semmilyen e-mail-címet kapcsolni a fiókodhoz, hagyd üresen az új e-mail-cím mezőjét az űrlap elküldésekor.",
- "changeemail-passwordrequired": "Meg kell adnod a jelszavadat ennek a változtatásnak a végrehajtásához.",
"changeemail-no-info": "A lap közvetlen eléréséhez be kell jelentkezned.",
"changeemail-oldemail": "Jelenlegi e-mail-cím:",
"changeemail-newemail": "Új e-mail-cím:",
"minoredit": "Apró változtatás",
"watchthis": "A lap figyelése",
"savearticle": "Lap mentése",
- "publishpage": "Lap mentése",
+ "publishpage": "Lap közzététele",
+ "publishchanges": "Változtatások közzététele",
"preview": "Előnézet",
"showpreview": "Előnézet megtekintése",
"showdiff": "Változtatások megtekintése",
"userpage-userdoesnotexist": "Nincs „<nowiki>$1</nowiki>” nevű regisztrált felhasználónk.\nNézd meg, hogy valóban ezt a lapot szeretnéd-e létrehozni vagy szerkeszteni.",
"userpage-userdoesnotexist-view": "Nincs regisztrálva „$1” szerkesztői azonosító.",
"blocked-notice-logextract": "A felhasználó jelenleg blokkolva van.\nA blokkolási napló legutóbbi ide vonatkozó bejegyzése a következő:",
- "clearyourcache": "'''Megjegyzés:''' mentés után frissítened kell a böngésződ gyorsítótárát, hogy lásd a változásokat.\n'''Firefox / Safari:''' tartsd lenyomva a Shift gombot és kattints a ''Frissítés'' gombra a címsorban, vagy használd a ''Ctrl–F5'' vagy ''Ctrl–R'' billentyűkombinációt (Mac-en ''Command–R'');\n'''Google Chrome:''' használd a ''Ctrl–Shift–R'' billentyűkombinációt (Mac-en ''Command–Shift–R'');\n'''Internet Explorer:''' tartsd nyomva a ''Ctrl''-t, és kattints a ''Frissítés'' gombra, vagy nyomj ''Ctrl–F5''-öt;\n'''Opera:''' ürítsd ki a gyorsítótárat a ''Beállítások / Haladó / Előzmények→Törlés most'' gombbal, majd frissítsd az oldalt.",
+ "clearyourcache": "<strong>Megjegyzés:</strong> mentés után frissítened kell a böngésződ gyorsítótárát, hogy lásd a változásokat.\n* <strong>Firefox / Safari:</strong> tartsd lenyomva a <em>Shift</em> gombot és kattints a <em>Frissítés</em> gombra a címsorban, vagy használd a <em>Ctrl–F5</em> vagy <em>Ctrl–R</em> (Macen <em>⌘–R</em>) billentyűkombinációt\n* <strong>Google Chrome:</strong> használd a <em>Ctrl–Shift–R</em> (Macen <em>⌘–Shift–R</em>) billentyűkombinációt\n* <strong>Internet Explorer:</strong> tartsd nyomva a <em>Ctrl</em>-t, és kattints a <em>Frissítés</em> gombra, vagy nyomj <em>Ctrl–F5</em>-öt\n* <strong>Opera:</strong> Nyisd meg a Beállításokat a <em>Menü</em>ből (Macen <em>Opera</em> menüből), majd válaszd az <em>Adatvédelem és biztonság → Böngészési adatok törlése → Gyorsítótáras képek és fájlok</em> opciót.",
"usercssyoucanpreview": "'''Tipp:''' mentés előtt használd az „{{int:showpreview}}” gombot az új CSS-ed teszteléséhez.",
"userjsyoucanpreview": "'''Tipp:''' mentés előtt használd az „{{int:showpreview}}” gombot az új JavaScipted teszteléséhez.",
"usercsspreview": "'''Ne felejtsd el, hogy ez csak a felhasználói CSS-ed előnézete és még nincs elmentve!'''",
"editingsection": "$1 szerkesztése (szakasz)",
"editingcomment": "$1 szerkesztése (új szakasz)",
"editconflict": "Szerkesztési ütközés: $1",
- "explainconflict": "Valaki megváltoztatta a lapot, mióta elkezdted szerkeszteni. A felső szövegdobozban láthatod az oldal jelenlegi tartalmát. A te módosításaid az alsó dobozban találhatók. Át kell másolnod a módosításaidat a felsőbe! \n\n'''Csak''' a felső dobozban levő szöveg lesz elmentve, amikor a „{{int:savearticle}}” gombra kattintasz.",
+ "explainconflict": "Valaki megváltoztatta a lapot, mióta elkezdted szerkeszteni. A felső szövegdobozban láthatod az oldal jelenlegi tartalmát. A te módosításaid az alsó dobozban találhatók. Át kell másolnod a módosításaidat a felsőbe! \n\n<strong>Csak</strong> a felső dobozban levő szöveg lesz elmentve, amikor a „{{int:savearticle}}” gombra kattintasz.",
"yourtext": "A te változatod",
"storedversion": "A tárolt változat",
"nonunicodebrowser": "'''Figyelem: A böngésződ nem Unicode kompatibilis. Egy kerülő megoldásként biztonságban szerkesztheted a cikkeket: a nem ASCII karakterek a szerkesztőablakban hexadeciális kódokként jelennek meg.'''",
"content-model-css": "CSS",
"content-json-empty-object": "Üres objektum",
"content-json-empty-array": "Üres tömb",
+ "deprecated-self-close-category": "Érvénytelen önzáró HTML-címkéket használó lapok",
"duplicate-args-warning": "<strong>Figyelmeztetés:</strong> A(z) [[:$1]] lap dupla értékkel hívja meg a(z) [[:$2]] sablont („$3” paraméter). Csak az utolsó érték lesz felhasználva.",
"duplicate-args-category": "Dupla paramétermegadást tartalmazó lapok",
"duplicate-args-category-desc": "Az oldal olyan sablon hívásokat tartalmaz, amely ugyanazt a paramétert használja, például <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "A szerkesztés már vissza lett állítva.",
"undo-summary": "Visszavontam [[Special:Contributions/$2|$2]] ([[User talk:$2|vita]]) szerkesztését (oldid: $1)",
"undo-summary-username-hidden": "A rejtett felhasználó által végzett $1 változat visszavonása",
- "cantcreateaccounttitle": "Felhasználói fiók létrehozása sikertelen",
"cantcreateaccount-text": "Erről az IP-címről ('''$1''') nem lehet regisztrálni, mert [[User:$3|$3]] blokkolta az alábbi indokkal:\n\n:''$2''",
"cantcreateaccount-range-text": "A regisztrációt a(z) <strong>$1</strong> IP-címtartományban, amelybe a te IP-címed (<strong>$4</strong>) is tartozik, [[User:$3|$3]] blokkolta.",
"viewpagelogs": "A lap a rendszernaplókban",
"userrights-changeable-col": "Megváltoztatható csoportok",
"userrights-unchangeable-col": "Nem megváltoztatható csoportok",
"userrights-conflict": "Felhasználói jogok ütközése! Kérlek, végezd el újra a változtatásokat.",
- "userrights-removed-self": "Sikeresen eltávolítottad a saját jogosultságaidat, így már nem tudod elérni ezt az oldalt.",
+ "userrights-removed-self": "Eltávolítottad a saját jogosultságaidat, így már nem tudod elérni ezt az oldalt.",
"group": "Csoport:",
"group-user": "szerkesztők",
"group-autoconfirmed": "automatikusan megerősített szerkesztők",
"right-override-export-depth": "Lapok exportálása a hivatkozott lapokkal együtt, legfeljebb 5-ös mélységig",
"right-sendemail": "e-mail küldése más felhasználóknak",
"right-passwordreset": "Jelszó visszaállítási emailek megtekintése",
- "right-managechangetags": "[[Special:Tags|címkék]] létrehozása és törlése az adatbázisban",
+ "right-managechangetags": "[[Special:Tags|címkék]] létrehozása és (de)aktiválása",
"right-applychangetags": "[[Special:Tags|címkék]] alkalmazása a változakra",
"right-changetags": "egyedi lapváltozatokon és naplóbejegyzéseken tetszőleges [[Special:Tags|címkék]] hozzáadása és törlése",
"right-deletechangetags": "[[Special:Tags|Címkék]] törlése az adatbázisból",
"rightslogtext": "Ez a rendszernapló a felhasználó jogosultságok változásait mutatja.",
"action-read": "lap olvasása",
"action-edit": "lap szerkesztése",
- "action-createpage": "új lap készítése",
- "action-createtalk": "vitalap készítése",
+ "action-createpage": "ennek a lapnak a létrehozása",
+ "action-createtalk": "vitalap létrehozása",
"action-createaccount": "felhasználói fiók elkészítése",
"action-history": "laptörténet megtekintése",
"action-minoredit": "szerkesztés aprónak jelölése",
"action-viewmyprivateinfo": "személyes adatok megtekintése",
"action-editmyprivateinfo": "személyes adatok szerkesztése",
"action-editcontentmodel": "a lap tartalom modelljének szerkesztése",
- "action-managechangetags": "adatbázis címkék létrehozása és törlése",
+ "action-managechangetags": "adatbáziscímkék létrehozása és (de)aktiválása",
"action-applychangetags": "változtatások címkézése",
"action-changetags": "egyedi változtatások és napló bejegyzések tetszőleges címkével való ellátása és törlése",
"action-deletechangetags": "címkék törlése az adatbáziból",
+ "action-purge": "oldal gyorsítótárának ürítése",
"nchanges": "$1 változtatás",
"enhancedrc-since-last-visit": "$1 az utolsó látogatás óta",
"enhancedrc-history": "történet",
"recentchanges-page-added-to-category": "[[:$1]] hozzáadva a kategóriához",
"recentchanges-page-added-to-category-bundled": "[[:$1]] hozzáadva a kategóriához, [[Special:WhatLinksHere/$1|ez a lap be van illesztve más lapokra]]",
"recentchanges-page-removed-from-category": "[[:$1]] eltávolítva a kategóriából",
- "recentchanges-page-removed-from-category-bundled": "[[:$1]] és {{PLURAL:$2|egy oldal|$2 oldal}} eltávolítva a kategóriából",
+ "recentchanges-page-removed-from-category-bundled": "[[:$1]] eltávolítva a kategóriából, [[Special:WhatLinksHere/$1|ez a lap be van illesztve más lapokra]]",
"upload": "Fájl feltöltése",
"uploadbtn": "Fájl feltöltése",
"reuploaddesc": "Visszatérés a feltöltési űrlaphoz.",
"uploaded-script-svg": "A feltöltött SVG fájlodban szkriptelemet találtunk: \"$1\".",
"uploaded-hostile-svg": "Nem biztonságos CSS kódot találtunk a feltöltött SVG fájlod stíluselemei között.",
"uploaded-event-handler-on-svg": "Az alábbi eseménykezelő-attribútum beállítása nem megengedett az SVG fájlokban: <code>$1=$2</code>.",
- "uploaded-href-unsafe-target-svg": "Nem biztonságos célra mutató href-et találtam a feltöltött SVG fájlban: <code><$1 $2=\"$3\"></code>.",
+ "uploaded-href-unsafe-target-svg": "Nem biztonságos adatra mutató href-et találtunk a feltöltött SVG-fájlban: URI-cél <code><$1 $2=\"$3\"></code>.",
"uploaded-animate-svg": "A feltöltött SVG fájlban \"animate\" taget találtam, ami az alábbi \"from\" attribútumával megváltoztathat egy href-et: <code><$1 $2=\"$3\"></code>.",
"uploaded-setting-handler-svg": "Az SVG kódok, amelyek a \"handler\" attribútumot távolra/adatra/szkriptre állítják, le vannak tiltva. A feltöltött SVG fájlban a következőt találtam: <code>$1=\"$2\"</code>.",
"uploaded-remote-url-svg": "Az SVG kódok, amelyek bármely stílus-attribútumot távoli URL-ra állítják, le vannak tiltva. A feltöltött SVG fájlban a következőt találtam: <code>$1=\"$2\"</code>.",
"mw-widgets-dateinput-placeholder-month": "ÉÉÉÉ-HH",
"mw-widgets-titleinput-description-new-page": "a lap még nem létezik",
"mw-widgets-titleinput-description-redirect": "átirányítás ide: $1",
- "api-error-blacklisted": "Válasszon egy másik, leíró címet.",
"sessionprovider-generic": "$1-munkamenetek",
"sessionprovider-mediawiki-session-cookiesessionprovider": "sütialapú munkamenetek",
"sessionprovider-nocookies": "A sütik le lehetnek tiltva. Engedélyezd a sütiket, és próbáld meg újra!",
"tagline": "De {{SITENAME}}",
"help": "Adjuta",
"search": "Recerca",
+ "search-ignored-headings": " #<!-- non modificar in alcun modo iste linea --> <pre>\n# Titulos de sectiones que essera ignorate per le recerca.\n# Cambiamentos in isto habera effecto post le indexation del paginas con iste sectiones.\n# Tu pote fortiar le re-indexation de un pagina per medio de un modification nulle.\n# Le syntaxe es:\n# * Toto a partir de un character \"#\" usque al fin del linea es un commento\n# * Cata linea non vacue es un titulo exacte a ignorar, con distinction inter majusculas e minusculas\nReferentias\nLigamines externe\nVide etiam\n #</pre> <!-- non modificar in alcun modo iste linea -->",
"searchbutton": "Cercar",
"go": "Va",
"searcharticle": "Va",
"passwordreset-emailelement": "Nomine de usator: \n$1\n\nContrasigno temporari: \n$2",
"passwordreset-emailsentemail": "Si iste adresse es associate a tu conto, alora un e-mail pro reinitialisar le contrasigno essera inviate.",
"passwordreset-emailsentusername": "Si il ha un adresse de e-mail associate a iste conto, alora un e-mail pro reinitialisar le contrasigno essera inviate.",
- "passwordreset-emailsent-capture": "Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate; iste message es monstrate hic infra.",
- "passwordreset-emailerror-capture": "Un e-mail pro le reinitialisation del contrasigno ha essite generate; iste message es monstrate hic infra, ma le invio al {{GENDER:$2|usator}} ha fallite: $1",
"passwordreset-emailsent-capture2": "Le {{PLURAL:$1|message|messages}} de e-mail pro reinitialisation de contrasigno ha essite inviate. Le {{PLURAL:$1|nomine de usator e contrasigno|lista de nomines de usator e contrasignos}} appare hic infra.",
"passwordreset-emailerror-capture2": "Le invio de e-mail al {{GENDER:$2|usator}} ha fallite: $1 Le {{PLURAL:$3|nomine de usator e contrasigno|lista de nomines de usator e contrasignos}} appare hic infra.",
"passwordreset-nocaller": "Un appellator debe esser fornite",
"passwordreset-nodata": "Ni un nomine de usator ni un adresse de e-mail ha essite fornite",
"changeemail": "Cambiar o remover adresse de e-mail",
"changeemail-header": "Completa iste formulario pro cambiar tu adresse de e-mail. Si tu vole remover le association de omne adresse de e-mail ab tu conto, lassa le campo pro le nove adresse de e-mail vacue quando tu submitte le formulario.",
- "changeemail-passwordrequired": "Essera necessari entrar tu contrasigno pro confirmar iste cambiamento.",
"changeemail-no-info": "Tu debe aperir un session pro poter acceder directemente a iste pagina.",
"changeemail-oldemail": "Adresse de e-mail actual:",
"changeemail-newemail": "Adresse de e-mail nove:",
"content-model-css": "CSS",
"content-json-empty-object": "Objecto vacue",
"content-json-empty-array": "Array vacue",
+ "deprecated-self-close-category": "Paginas que usa etiquettas HTML auto-claudite non valide",
+ "deprecated-self-close-category-desc": "Le pagina contine etiquettas HTML auto-claudite non valide, como <code><b/></code> o <code><span/></code>. Le comportamento de istes cambiara proximemente pro esser in accordo con le specification HTML5, dunque lor uso in wikitexto es obsolete.",
"duplicate-args-warning": "<strong>Attention:</strong> [[:$1]] appella [[:$2]] con plure valores pro le parametro \"$3\". Solmente le ultime valor fornite essera usate.",
"duplicate-args-category": "Paginas que usa parametros duplicate in appellos de patrono",
"duplicate-args-category-desc": "Le pagina contine appellos de patrono que usa duplicatos de parametros, como per exemplo <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Pare que iste modification ha jam essite disfacite.",
"undo-summary": "Annullava le version $1 per [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
"undo-summary-username-hidden": "Disfacer le revision $1 facite per un usator celate",
- "cantcreateaccounttitle": "Non pote crear conto",
"cantcreateaccount-text": "Le creation de contos desde iste adresse IP ('''$1''') ha essite blocate per [[User:$3|$3]].\n\nLe motivo que $3 dava es ''$2''",
"cantcreateaccount-range-text": "Le creation de contos ab le adresses IP in le intervallo <strong>$1</strong>, le qual include tu adresse IP (<strong>$4</strong>), ha essite blocate per [[User:$3|$3]].\n\nLe motivo fornite per $3 es <em>$2</em>",
"viewpagelogs": "Vider le entratas del registro pro iste pagina",
"action-applychangetags": "applicar etiquettas al proprie modificationes",
"action-changetags": "adder e remover qualcunque etiquettas sur individual versiones e entratas de registro",
"action-deletechangetags": "deler etiquettas del base de datos",
+ "action-purge": "purgar iste pagina",
"nchanges": "$1 {{PLURAL:$1|modification|modificationes}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde le ultime visita}}",
"enhancedrc-history": "historia",
"watchnologin": "Tu non ha aperite un session",
"addwatch": "Adder al observatorio",
"addedwatchtext": "Le pagina \"[[:$1]]\", e su pagina de discussion, ha essite addite a [[Special:Watchlist|tu observatorio]].",
+ "addedwatchtext-talk": "\"[[:$1]]\" e su pagina associate ha essite addite a tu [[Special:Watchlist|observatorio]].",
"addedwatchtext-short": "Le pagina \"$1\" ha essite addite a tu observatorio.",
"removewatch": "Remover del observatorio",
"removedwatchtext": "Le pagina \"[[:$1]]\", e su pagina de discussion, ha essite removite de [[Special:Watchlist|tu observatorio]].",
+ "removedwatchtext-talk": "\"[[:$1]]\" e su pagina associate ha essite removite de tu [[Special:Watchlist|observatorio]].",
"removedwatchtext-short": "Le pagina \"$1\" ha essite removite de tu observatorio.",
"watch": "Observar",
"watchthispage": "Observar iste pagina",
"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
"mw-widgets-titleinput-description-new-page": "pagina non existe ancora",
"mw-widgets-titleinput-description-redirect": "redirection a $1",
- "api-error-blacklisted": "Per favor elige un altere titulo, plus descriptive.",
"sessionmanager-tie": "Impossibile combinar plure typos de authentication de requesta: $1.",
"sessionprovider-generic": "sessiones $1",
"sessionprovider-mediawiki-session-cookiesessionprovider": "sessiones basate sur cookies",
"log-action-filter-newusers": "Typo de creation de conto:",
"log-action-filter-patrol": "Typo de patrulia:",
"log-action-filter-protect": "Typo de protection:",
- "log-action-filter-rights": "Typo de cambio de derecto",
- "log-action-filter-suppress": "Typo de suppression",
+ "log-action-filter-rights": "Typo de cambio de derecto:",
+ "log-action-filter-suppress": "Typo de suppression:",
"log-action-filter-upload": "Typo de incargamento:",
"log-action-filter-all": "Toto",
"log-action-filter-block-block": "Blocar",
"tagline": "Manipud iti {{SITENAME}}",
"help": "Tulong",
"search": "Biruken",
+ "search-ignored-headings": " #<!-- saan a kutkutien daytoy a linia --> <pre>\n# Dagiti paulo a saanto nga ikaskaso babaen ti panagbiruk.\n# Dagiti panagbalbaliw mabalinton intono ti panid nga addaan ti paulo ket maipasurotan.\n# Mabalinmo a piliten ti panangisurot manen iti panid babaen ti awan linaon a panagurnos.\n# Ti eskritu ket kasla dagiti sumaganad:\n# * Amin manipud ti karater ti \"#\" aginggana ti gibus ti linia ket komentario.\n# * Amin a saan a blanko a linia ket eksakto a titulo a saan nga maikaskaso, kadakkel ti letra ken amin.\nDagiti reperensia\nDagiti silpo ti ruar\nKitaen pay\n #</pre> <!-- saan a kutkutien daytoy a linia -->",
"searchbutton": "Biruken",
"go": "Inkan",
"searcharticle": "Inkan",
"passwordreset-emailelement": "Nagan ti agar-aramat: \n$1\n\nTemporario a kontrasenias: \n$2",
"passwordreset-emailsentemail": "No daytoy nga adres ti esurat ket mainaig iti pakabilangam, maipatulodto ti maysa nga esurat iti panangisaad manen ti kontrasenias.",
"passwordreset-emailsentusername": "No adda adres ti esurat a mainaig iti daytoy a nagan ti agar-aramat, addanto maipatulod nga esurat iti panangisaad manen ti kontrasenia.",
- "passwordreset-emailsent-capture": "Ti maysa nga esurat ti panangisaad manen ti kontrasenias ket naipatuloden, a naipakita dita baba.",
- "passwordreset-emailerror-capture": "Naaramid ti maysa nga esurat a panangisaad manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1",
"changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
"changeemail-header": "Kompletuen daytoy a porma tapno masukatan ti adres ti esuratmo. No kayatmo a maikkat ti pannakainaig iti ania man nga adres ti esurat manipud iti pakabilangam, ibati a blanko ti baro nga adres ti esurat no ited ti porma.",
- "changeemail-passwordrequired": "Masapulmonto nga ikabil ti kontraseniasmo tapno mapasingkedan daytoy a panagbaliw.",
"changeemail-no-info": "Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.",
"changeemail-oldemail": "Agdama nga esurat a pagtaengan:",
"changeemail-newemail": "Baro nga esurat a pagtaengan:",
"undo-nochange": "Ti inurnos ket kasla naibabawin.",
"undo-summary": "Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])",
"undo-summary-username-hidden": "Isubli ti $1 a binaliwan babaen ti nailemmeng nga agar-aramat",
- "cantcreateaccounttitle": "Saan a makapartuat iti pakabilangan",
"cantcreateaccount-text": "Ti panagpartuat iti pakabilangan manipud ti daytoy nga IP a pagtaengan (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
"cantcreateaccount-range-text": "Ti panagpartuat iti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti <strong>$1</strong>, a mairaman ti IP a pagtaengam (<strong>$4</strong>), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
"viewpagelogs": "Kitaen dagiti listaan para iti daytoy a panid",
"mw-widgets-dateinput-placeholder-month": "TTTT-BB",
"mw-widgets-titleinput-description-new-page": "awan pay ti panid",
"mw-widgets-titleinput-description-redirect": "ibaw-ing iti $1",
- "api-error-blacklisted": "Pangngaasi nga agpili iti sabali, a mangipalpalawag a titulo.",
"sessionmanager-tie": "Saan a mabalin nga itipon dagiti nadumaduma kita ti kiddaw ti pammasingked: $1.",
"sessionprovider-generic": "Dagiti sesion ti $1",
"sessionprovider-mediawiki-session-cookiesessionprovider": "dagiti sesion a naibatay iti galieta",
"tagline": "Da {{SITENAME}}.",
"help": "Aiuto",
"search": "Ricerca",
+ "search-ignored-headings": " #<!-- lascia questa riga esattamente come è --> <pre>\n# Elenco delle intestazioni che saranno ignorate dalla ricerca.\n# Le modifiche a questa pagina saranno effettive non appena la pagina sarà indicizzata.\n# Puoi forzare la re-indicizzazione di una pagina effettuando una modifica nulla.\n# La sintassi è la seguente:\n# * Tutto dal carattere \"#\" alla fine della riga è un commento\n# * Tutte le righe non vuote sono le intestazioni esatte da ignorare, maiuscolo/minuscolo e tutto\nNote\nVoci correlate\nCollegamenti esterni\n #</pre> <!-- lascia questa riga esattamente come è -->",
"searchbutton": "Ricerca",
"go": "Vai",
"searcharticle": "Vai",
"passwordreset-emailelement": "Nome utente: \n$1\n\nPassword temporanea: \n$2",
"passwordreset-emailsentemail": "Se questo indirizzo di posta elettronica è associato con la tua utenza, allora verrà inviata una email per reimpostare la password.",
"passwordreset-emailsentusername": "Se c'è un indirizzo di posta elettronica associato con questo nome utente, allora verrà inviata una email per reimpostare la password.",
- "passwordreset-emailsent-capture": "È stata inviata una email di reimpostazione della password, il contenuto è riportato di seguito.",
- "passwordreset-emailerror-capture": "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
"passwordreset-emailsent-capture2": "L'email di reimpostazione della password {{PLURAL:$1|è stata inviata|sono state inviate}}. {{PLURAL:$1|Il nome|L'elenco di nomi}} utente e password è mostrato di seguito.",
"passwordreset-emailerror-capture2": "Invio di email {{GENDER:$2|all'utente}} non riuscito: $1. {{PLURAL:$3|Il nome|L'elenco di nomi}} utente e password è mostrato di seguito.",
"passwordreset-nocaller": "Un chiamante deve essere fornito",
"passwordreset-nodata": "Non è stato fornito né un nome utente né un indirizzo di posta elettronica",
"changeemail": "Modifica o rimuovi indirizzo di posta elettronica",
"changeemail-header": "Completa questo modulo per cambiare il tuo indirizzo email. Se vuoi rimuovere l'associazione di qualsiasi indirizzo email dalla tua utenza, lascia il nuovo indirizzo email vuoto quando invii il modulo.",
- "changeemail-passwordrequired": "Sarà necessario inserire la password per confermare la modifica.",
"changeemail-no-info": "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
"changeemail-oldemail": "Indirizzo email attuale:",
"changeemail-newemail": "Nuovo indirizzo email:",
"undo-nochange": "Sembra che la modifica sia già stata annullata.",
"undo-summary": "Annullata la modifica $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]])",
"undo-summary-username-hidden": "Annullata la modifica $1 di un utente nascosto",
- "cantcreateaccounttitle": "Impossibile registrare un utente",
"cantcreateaccount-text": "La registrazione è stata bloccata da [[User:$3|$3]] per questo indirizzo IP ('''$1''').\n\nLa motivazione del blocco fornita da $3 è la seguente: ''$2''",
"cantcreateaccount-range-text": "La registrazione da indirizzi IP nell'intervallo <strong>$1</strong>, che include il tuo (<strong>$4</strong>), è stata bloccata da [[User:$3|$3]].\n\nLa motivazione fornita da $3 è <em>$2</em>",
"viewpagelogs": "Visualizza i registri relativi a questa pagina",
"action-applychangetags": "applicare delle etichette alle tue modifiche",
"action-changetags": "aggiungere o rimuovere specifiche etichette su singole versioni o voci di registro",
"action-deletechangetags": "cancellare le etichette dal database",
+ "action-purge": "aggiornare questa pagina",
"nchanges": "$1 {{PLURAL:$1|modifica|modifiche}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dall'ultima visita}}",
"enhancedrc-history": "cronologia",
"watchnologin": "Accesso non effettuato",
"addwatch": "Aggiungi agli osservati speciali",
"addedwatchtext": "\"[[:$1]]\" e la sua pagina di discussione sono state aggiunte alla propria [[Special:Watchlist|lista degli osservati speciali]].",
+ "addedwatchtext-talk": "\"[[:$1]]\" e la sua pagina associata sono state aggiunte alla propria [[Special:Watchlist|lista degli osservati speciali]].",
"addedwatchtext-short": "La pagina \"$1\" è stata aggiunta alla propria lista degli osservati speciali.",
"removewatch": "Rimuovi dagli osservati speciali",
"removedwatchtext": "\"[[:$1]]\" e la sua pagina di discussione sono state rimosse dalla propria [[Special:Watchlist|lista degli osservati speciali]].",
+ "removedwatchtext-talk": "\"[[:$1]]\" e la sua pagina associata sono state rimosse dalla propria [[Special:Watchlist|lista degli osservati speciali]].",
"removedwatchtext-short": "La pagina \"$1\" è stata rimossa dalla propria lista degli osservati speciali.",
"watch": "Segui",
"watchthispage": "Segui questa pagina",
"tagline": "提供: {{SITENAME}}",
"help": "ヘルプ",
"search": "検索",
+ "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# 検索で無視される見出しを記述します。\n# この変更は、見出し付きページがインデックスされると同時に有効になります。\n# 空の編集を実行することで、強制的にページの再インデックスが行われます。\n# 文法は以下のとおり:\n# * \"#\" で始まる行は、その行末までがすべてコメントです。\n# * 非空白行が、無視したい見出しになります。大文字小文字の区別を含め、完全に一致するものが対象です。\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
"searchbutton": "検索",
"go": "表示",
"searcharticle": "表示",
"createacct-another-realname-tip": "本名は省略できます。\n入力すると、その利用者の著作物の帰属表示に使われます。",
"pt-login": "ログイン",
"pt-login-button": "ログイン",
+ "pt-login-continue-button": "ログインを続行",
"pt-createaccount": "アカウント作成",
"pt-userlogout": "ログアウト",
"php-mail-error-unknown": "PHPのmail()関数での不明なエラーです。",
"passwordreset-emailelement": "利用者名: \n$1\n\n仮パスワード: \n$2",
"passwordreset-emailsentemail": "このメールアドレスがあなたのアカウントに関連付けられている場合は、パスワードリセットのメールが送信されます。",
"passwordreset-emailsentusername": "この利用者名に関連付けられたメールアドレスがある場合は、パスワードリセットのメールが送信されます。",
- "passwordreset-emailsent-capture": "下記の内容の、パスワード再設定メールをお送りしました。",
- "passwordreset-emailerror-capture": "以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1",
"passwordreset-emailsent-capture2": "パスワードリセットの{{PLURAL:$1|メール}}が送信されました。{{PLURAL:$1|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
"passwordreset-emailerror-capture2": "{{GENDER:$2|利用者}}へのメール送信に失敗しました: $1{{PLURAL:$3|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
"passwordreset-ignored": "パスワードのリセットが処理されませんでした。プロバイダーが設定されていない可能性があります。",
"passwordreset-invalideamil": "無効なメールアドレスです",
"changeemail": "メールアドレスの変更または除去",
"changeemail-header": "あなたのメールアドレスを変更するには、このフォームを完成させます。もし、あなたのアカウントから任意のメールアドレスの関連付けを削除したい場合は、フォームの送信時に、新しいメールアドレスを空白のままにします。",
- "changeemail-passwordrequired": "この変更を確認するためにパスワードを入力する必要があります。",
"changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
"changeemail-oldemail": "現在のメールアドレス:",
"changeemail-newemail": "新しいメールアドレス:",
"savearticle": "ページを保存",
"savechanges": "変更を保存",
"publishpage": "ページを公開",
+ "publishchanges": "変更を公開",
"preview": "プレビュー",
"showpreview": "プレビューを表示",
"showdiff": "差分を表示",
"undo-nochange": "指定した編集は既に取り消されたようです。",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による版 $1 を取り消し",
"undo-summary-username-hidden": "秘匿された利用者による版 $1 を取り消し",
- "cantcreateaccounttitle": "アカウントを作成できません",
"cantcreateaccount-text": "この IP アドレス (<strong>$1</strong>) からのアカウント作成は、[[User:$3|$3]] によってブロックされています。\n\n$3 が示した理由: <em>$2</em>",
"cantcreateaccount-range-text": "この IP アドレス (<strong>$4</strong>) を含む、IP アドレス範囲 <strong>$1</strong> からのアカウント作成は、[[User:$3|$3]] によってブロックされています。\n\n$3 が示した理由: <em>$2</em>",
"viewpagelogs": "このページの記録を閲覧",
"watchnologin": "ログインしていません",
"addwatch": "ウォッチリストに追加",
"addedwatchtext": "「[[:$1]]」および付随する議論ページを、[[Special:Watchlist|ウォッチリスト]]に追加しました。",
+ "addedwatchtext-talk": "「[[:$1]]」および付随するページを[[Special:Watchlist|ウォッチリスト]]に追加しました。",
"addedwatchtext-short": "ページ「$1」をウォッチリストに追加しました。",
"removewatch": "ウォッチリストから除去",
"removedwatchtext": "「[[:$1]]」および付随する議論ページを[[Special:Watchlist|ウォッチリスト]]から除去しました。",
+ "removedwatchtext-talk": "「[[:$1]]」および付随するページを[[Special:Watchlist|ウォッチリスト]]から除去しました。",
"removedwatchtext-short": "ページ「$1」をウォッチリストから除去しました。",
"watch": "ウォッチ",
"watchthispage": "このページをウォッチする",
"tooltip-ca-nstab-category": "カテゴリページを閲覧",
"tooltip-minoredit": "この編集に細部の変更の印を付ける",
"tooltip-save": "変更を保存する",
+ "tooltip-publish": "あなたによる変更を公開",
"tooltip-preview": "変更内容をプレビューで確認できます。保存前に使用してください。",
"tooltip-diff": "文章への変更箇所を表示する",
"tooltip-compareselectedversions": "選択した2つの版の差分を表示する",
"sqlite-no-fts": "$1 (全文検索なし)",
"logentry-delete-delete": "$1 がページ「$3」を{{GENDER:$2|削除しました}}",
"logentry-delete-restore": "$1 がページ「$3」を{{GENDER:$2|復元しました}}",
- "logentry-delete-event": "$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
- "logentry-delete-revision": "$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
- "logentry-delete-event-legacy": "$1 が「$3」の記録項目の閲覧レベルを{{GENDER:$2|変更しました}}",
+ "logentry-delete-event": "$1 が $3 の{{PLURAL:$5|記録項目|記録項目$5件}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
+ "logentry-delete-revision": "$1 がページ「$3」の{{PLURAL:$5|版|$5件の版}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
+ "logentry-delete-event-legacy": "$1 が $3 の記録項目の閲覧レベルを{{GENDER:$2|変更しました}}",
"logentry-delete-revision-legacy": "$1 がページ「$3」の版の閲覧レベルを{{GENDER:$2|変更しました}}",
- "logentry-suppress-delete": "$1 がページ「$3」を{{GENDER:$2|隠蔽しました}}",
- "logentry-suppress-event": "$1 が$3の{{PLURAL:$5|記録項目$5件}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4",
- "logentry-suppress-revision": "$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4",
- "logentry-suppress-event-legacy": "$1 が$3で記録項目の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}",
+ "logentry-suppress-delete": "$1 がページ「$3」を{{GENDER:$2|秘匿しました}}",
+ "logentry-suppress-event": "$1 が $3 の{{PLURAL:$5|記録項目|$5件の記録項目}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4",
+ "logentry-suppress-revision": "$1 がページ「$3」の{{PLURAL:$5|版|$5件の版}}の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}: $4",
+ "logentry-suppress-event-legacy": "$1 が $3 の記録項目の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}",
"logentry-suppress-revision-legacy": "$1 がページ「$3」の版の閲覧レベルを見えない形で{{GENDER:$2|変更しました}}",
"revdelete-content-hid": "本文の不可視化",
"revdelete-summary-hid": "編集要約の不可視化",
"logentry-tag-update-add-logentry": "$1 がページ $3 の記録項目 $5 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
"logentry-tag-update-remove-revision": "$1 がページ $3 の版 $4 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
"logentry-tag-update-remove-logentry": "$1 がページ $3 の記録項目 $5 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
- "logentry-tag-update-revision": "$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81®ç\89\88 $4 ã\81§ã\81®ã\82¿ã\82°ã\82\92{{GENDER:$2|æ\9b´æ\96°ã\81\97ã\81¾ã\81\97ã\81\9f}} ($6 ã\81\8c{{PLURAL:$7|追å\8a }}ã\80\81$8 ã\81\8c{{PLURAL:$9|削除}})",
+ "logentry-tag-update-revision": "$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81®ç\89\88 $4 ã\81®ã\82¿ã\82°ã\82\92{{GENDER:$2|æ\9b´æ\96°ã\81\97ã\81¾ã\81\97ã\81\9f}} ($6 ã\82\92{{PLURAL:$7|追å\8a }}ã\80\81$8 ã\82\92{{PLURAL:$9|削除}})",
"logentry-tag-update-logentry": "$1 がページ「$3」の記録項目 $5 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
"rightsnone": "(なし)",
"revdelete-summary": "編集内容の要約",
"log-action-filter-protect-modify": "保護設定の変更",
"log-action-filter-protect-unprotect": "保護解除",
"log-action-filter-protect-move_prot": "保護設定の移動",
+ "log-action-filter-rights-rights": "手動変更",
+ "log-action-filter-rights-autopromote": "自動変更",
"log-action-filter-suppress-event": "記録の秘匿",
"log-action-filter-suppress-revision": "版の秘匿",
"log-action-filter-suppress-delete": "ページの秘匿",
"passwordreset-emailtext-user": "Panganggo $1 seka {{SITENAME}} njaluk ganti tembung sandhiné Sampéyan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Rèkèning|Rèkèning-rèkèning}} ngisor iki magepokan karo padunungané layang èlèktronik iki:\n\n$2\n\n{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.\nSampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn Sampéyan jebul wis kèlingan tembung sandhiné sing lawas saéngga ora ana niyat kanggo ngganti, Sampéyan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung sandhiné lawas Sampéyan.",
"passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung wadi sauntara: \n$2",
"passwordreset-emailsentemail": "Yèn layang èlèktronik iki nggayut akuning sampéyan, layang kanggo salin tembung wadi bakal dikirim.",
- "passwordreset-emailsent-capture": "Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim, bisa didelok ngisor iki.",
- "passwordreset-emailerror-capture": "Layang èlèktronik pangèling tembung sandhi wis digawe, yaiku sing ditampilaké nèng ngisor iki, nanging ora kasil dikirim ing {{GENDER:$2|panganggo}}: $1",
"changeemail": "Owah utawa busak alamat layang èlèktronik",
"changeemail-header": "Ganti alamat layang èlèktronik akun",
"changeemail-no-info": "Sampéyan kudu mlebu log kanggo ngaksès kaca iki langsung.",
"minoredit": "Iki besutan cilik",
"watchthis": "Awasi kaca iki",
"savearticle": "Simpen kaca",
+ "publishpage": "Babar kaca",
+ "publishchanges": "Babar owahan",
"preview": "Pratuduh",
"showpreview": "Deleng pratuduh",
"showdiff": "Tuduhaké owahan",
"parser-unstrip-loop-warning": "Unstrip loop detected",
"parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
"converter-manual-rule-error": "Kasalahan kadètèk nèng aturan pangubahan basa manual",
- "undo-success": "Suntingan iki bisa dibatalaké. Tulung priksa prabandhingan ing ngisor iki kanggo mesthèkaké yèn prakara iki pancèn sing bener panjenengan pèngin lakoni, banjur simpenen pangowahan iku kanggo ngrampungaké pambatalan suntingan.",
+ "undo-success": "Besutan iki kena diwurungaké.\nTiliki bandhingan ngisor iki saperlu mesthèkaké yèn bener iki sing arep kolakoni, nuli simpen owahan ngisor iki kanggo ngiyai yèn besutané diwurungaké.",
"undo-failure": "Suntingan iki ora bisa dibatalakén amerga ana konflik panyuntingan antara.",
- "undo-norev": "Suntingan iki ora bisa dibatalaké amerga ora ana utawa wis dibusak.",
- "undo-summary": "Balèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
+ "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis dibusak.",
+ "undo-summary": "Mbalèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
"undo-summary-username-hidden": "Batalna revisi $1 saking panganggo kang didhelikake",
- "cantcreateaccounttitle": "Akun ora bisa digawé",
"cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa rékening. Sing mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
"cantcreateaccount-range-text": "Nggawe akun saking alamat IP \"$1\", sing termasuk IP sampeyan (<strong>$4</strong>), sampun diblokir kaliyan [[User:$3|$3]].\n\nAlesan pamblokiran yaiku \"$2\"",
"viewpagelogs": "Deleng cathetaning kaca iki",
"prefs-tokenwatchlist": "Token",
"prefs-diffs": "Prabédan",
"prefs-help-prefershttps": "Pamiji iki bakal lumaku mentas sampeyan mbalèni mlebu.",
- "prefs-tabs-navigation-hint": "Tip: Sampeyan isa nganggo dapat menggunakan tombol panah kiwa lan tengen kanggo navigasi tab-tab ing daftar tab.",
+ "prefs-tabs-navigation-hint": "Saran: Sampeyan bisa nganggo tombol jemparing kiwa lan tengen saperlu navigasi tab-tab ing pratélan tab.",
"userrights": "Manajemen hak panganggo",
"userrights-lookup-user": "Ngatur kelompok panganggo",
"userrights-user-editname": "Isi jeneng panganggo:",
"rcshowhidemine": "$1 besutanku",
"rcshowhidemine-show": "Tuduhaké",
"rcshowhidemine-hide": "Dhelikaké",
+ "rcshowhidecategorization": "$1 kategorisasi kaca",
"rcshowhidecategorization-show": "Tuduhaké",
"rcshowhidecategorization-hide": "Dhelikaké",
"rclinks": "Tuduhaké $1 owahan kawit $2 dina kapungkur.<br />$3",
"wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
"wlnote": "Ngisor iki {{PLURAL:$1|owahan pungkasan|'''$1''' owahan pungkasan}} {{PLURAL:$2|jam|'''$2''' jam}} kapungkur, per $3, $4.",
"wlshowlast": "Tuduhna $1 jam $2 dina pungkasan",
+ "wlshowhidecategorization": "kategorisasi kaca",
"watchlist-options": "Pilihaning pawawangan",
"watching": "Ngawasi...",
"unwatching": "Ngilangi pangawasan...",
"immobile-target-namespace-iw": "Pranala interwiki dudu target sing sah kanggo pamindhahan kaca.",
"immobile-source-page": "Kaca iki ora bisa dilih-lih.",
"immobile-target-page": "Ora bisa mindhahaké menyang irah-irahan tujuan kasebut.",
- "bad-target-model": "Halaman yang dituju menggunakan model isi yang berbeda. Tidak dapat mengonversi $1 ke $2.",
+ "bad-target-model": "Tujuan sing diarepaké nganggo gagrag isi sing béda. Ora bisa ngganti $1 dadi $2.",
"imagenocrossnamespace": "Ora bisa mindhahaké gambar menyang bilik nama non-gambar",
"nonfile-cannot-move-to-file": "Ora bisa mindhahaké non-berkas nèng bilik jeneng berkas",
"imagetypemismatch": "Èkstènsi anyar berkas ora cocog karo jenisé",
"import-error-interwiki": "Kaca \"$1\" ora diimpor amarga jenengé dicadhangaké kango pranala njaba (interwiki).",
"import-error-special": "Kaca \"$1\" ora diimpor amarga kuwi kalebu nèng bilik jeneng kusus sing ora nglilakaké anané kaca.",
"import-error-invalid": "Kaca \"$1\" ora diimpor amarga jenengé ora sah.",
- "import-error-unserialize": "Revisi $2 dari halaman \"$1\" tidak dapat di-''unserialized''. Revisi tersebut dilaporkan menggunakan model konten $3 diserialisasi sebagai $4.",
+ "import-error-unserialize": "Revisi $2 saka kaca \"$1\" ora bisa diurutaké. Revisi iku dilapuraké murih nganggo gagrag isi $3 sing diurutaké minangka $4.",
"import-options-wrong": "{{PLURAL:$2|Opsi|Opsi}} salah: <nowiki>$1</nowiki>",
"import-rootpage-invalid": "Halaman turunan yang diberikan adalah judul yang salah.",
"import-rootpage-nosubpage": "Ruang nama \"$1\" di halaman turunan tidak mengizinkan subhalaman.",
"history-show-deleted": "صرفی حذف شدہ",
"histfirst": "قدیم ترین",
"histlast": "تازہ ترین",
- "historysize": "({{PLURAL:$1|1 بائٹ|$1 بائٹس}})",
+ "historysize": "({{PLURAL:$1|1 بائٹ|$1 بائٹ}})",
"historyempty": "(خالی)",
"history-feed-title": "تاریخچۂ نظرثانی",
"history-feed-description": "ویکیپیڈیا ھیہ صفحو تاریخچۂ نظرثانی",
"Marmase",
"Mirzali",
"아라",
- "Macofe"
+ "Macofe",
+ "Kumkumuk"
]
},
"tog-underline": "Bınê gırey de xete bonce:",
"retypenew": "Parola newiye tekrar ke:",
"resetpass_submit": "Parola ayar ke u cı kuye",
"changepassword-success": "Parola sıma ebe serkotene vurriye! Nıka hesabê sıma beno ra...",
+ "botpasswords-label-cancel": "Bıtexelne",
"resetpass_forbidden": "Paroley nêşikinê bıvurniyê",
"resetpass-submit-loggedin": "Parola bıvurne",
"resetpass-submit-cancel": "Bıtexelne",
"watchthis": "Na pele de şêr ke",
"savearticle": "Pele qeyd ke",
"preview": "Verqayt",
- "showpreview": "Verqayti bıasne",
+ "showpreview": "Verqayti bımocne",
"showdiff": "Vurnaisun bıasne",
"anoneditwarning": "'''Diqet:''' Tı cınêkota.\nTarixê vurnaena na pele de, hurêndia leqeme de numra tuya IPy qeyd bena.",
"missingcommenttext": "Cêr de jü xulasa bınuse.",
"upload-source": "Dosya çımey",
"sourcefilename": "Namê dosya çımey:",
"watchthisupload": "Na dosya de şêr ke",
+ "upload-dialog-button-cancel": "Bıtexelne",
"license": "Lisans:",
"license-header": "Lisansdais",
"imgfile": "dosya",
"blanknamespace": "(Ser)",
"contributions": "İştıraqê {{GENDER:$1|karber}}i",
"contributions-title": "$1 de iştırakê karberi",
- "mycontris": "İştıraqi",
+ "mycontris": "İştıraki",
"contribsub2": "Serba $1 ($2)",
"uctop": "(rocane)",
"month": "Asme ra (u ravêr):",
"blocklink": "kilıt ke",
"unblocklink": "ra ke",
"change-blocklink": "mani bıvurne",
- "contribslink": "iştıraqi",
+ "contribslink": "iştıraki",
"emaillink": "e-poste bırusne",
"autoblocker": "Sıma otomatikmen kılit biy, çıke adresa sımawa ''IP''y terefê \"[[User:$1|$1]]\" gurenina.\nSebebê kılitbiyaena $1'i \"$2\"o",
"blocklogpage": "Protokolê kilıti",
"compare-page1": "Pele 1",
"compare-page2": "Pele 2",
"rightsnone": "(qet jü)",
- "revdelete-summary": "xulasa vurnaene"
+ "revdelete-summary": "xulasa vurnaene",
+ "feedback-cancel": "Bıtexelne"
}
"passwordreset-emailtext-user": "$1 есімді қатысушы {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунт|аккаунттар}} осы електронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз бұрынғы құпия сөзіңізді еске түсірсеңіз, және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрыңғы құпия сөзді қолдана беруіңізге болады.",
"passwordreset-emailelement": "Қатысушы есімі: \n$1\n\nУақытша құпия сөз: \n$2",
"passwordreset-emailsentemail": "Бұл email мекенжайы тіркелгіңізге байланысқан, сол себепті құпия сөзді өзгерту электронды пошта арқылы жөнелтіледі.",
- "passwordreset-emailsent-capture": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді, ол төменде көрсетілген.",
- "passwordreset-emailerror-capture": "Құпиясөзді өзгерту электрон хаты жасалды, ол төменде көрсетілген, бірақ ол {{GENDER:$2|қатысушыға}} жөнелтілмеді: $1",
"changeemail": "Е-пошта мекенжайын өзгерту немесе аластау",
"changeemail-header": "Е-пошта мекен-жайының өзгертілуі",
"changeemail-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
"minoredit": "Бұл шағын өңдеме",
"watchthis": "Бұл бетті бақылау",
"savearticle": "Бетті сақтау",
+ "savechanges": "Өзгерістерді сақтау",
+ "publishpage": "Бетті жариялау",
+ "publishchanges": "Өзгерістерді жариялау",
"preview": "Қарап шығу",
"showpreview": "Алдын-ала қарау",
"showdiff": "Өзгерістерді көрсет",
"undo-nochange": "Өңдеме әлдеқашан жоққа шығарылғаны анықталды.",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) істеген нөмір $1 нұсқасын жоққа шығарды",
"undo-summary-username-hidden": "$1 нұсқасын жасырылған қатысушы жоққа шығарды",
- "cantcreateaccounttitle": "Тіркелгі жасалмады",
"cantcreateaccount-text": "Бұл IP мекенжайдан (<strong>$1</strong>) жаңа тіркелгі жасауын [[User:$3|$3]] бұғаттаған.\n\n$3 есімді қатысушының келтіріген себебі: <em>$2</em>",
"cantcreateaccount-range-text": "<strong>$1</strong> ауқымындағы IP мекенжайдан сіздің IP мекенжайыңыз да кіреді (<strong>$4</strong>) жаңа тіркелгі жасауын [[User:$3|$3]] бұғаттаған.\n\n$3 есімді қатысушының келтіріген себебі: ''$2'",
"viewpagelogs": "Бұл беттің журнал оқиғаларын қарау",
"tooltip-ca-nstab-category": "Санат бетін қарау",
"tooltip-minoredit": "Бұны шағын өңдеме деп белгілеу",
"tooltip-save": "Жасаған өзгерістеріңізді сақтау",
+ "tooltip-publish": "Өзгерістеріңізді жариялаңыз",
"tooltip-preview": "Сақтаудың алдынан жасаған өзгерістеріңізді қарап шығыңыз!",
"tooltip-diff": "Мәтінге қандай өзгерістерді жасағаныңызды қарау.",
"tooltip-compareselectedversions": "Беттің екі бөлектенген нұсқасы айырмасын қарау.",
"mw-widgets-dateinput-placeholder-day": "ЖЖЖЖ-АА-КК",
"mw-widgets-dateinput-placeholder-month": "ЖЖЖЖ-АА",
"mw-widgets-titleinput-description-new-page": "бет жоқ екен",
- "mw-widgets-titleinput-description-redirect": "$1 дегенге бағыттату",
- "api-error-blacklisted": "Өтініш, сипаттама атауының басқасын таңдаңыз."
+ "mw-widgets-titleinput-description-redirect": "$1 дегенге бағыттату"
}
"Ananth subray",
"MarcoAurelio",
"Macofe",
- "రహ్మానుద్దీన్"
+ "రహ్మానుద్దీన్",
+ "ಶಿವಕುಮಾರ್ ನಾಯಕ್",
+ "Yogesh"
]
},
"tog-underline": "ಕೊಂಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
"tog-hideminor": "ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳಲ್ಲಿ ಚಿಕ್ಕಪುಟ್ಟ ಸಂಪಾದನೆಗಳನ್ನು ಅಡಗಿಸಿ",
"tog-hidepatrolled": "ಪಹರೆಯಲ್ಲಿ ಆದ ಸಂಪಾದನೆಗಳನ್ನು ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳಲ್ಲಿ ಅಡಗಿಸು",
"tog-newpageshidepatrolled": "ಪಹರೆಯಲ್ಲಿ ಆದ ಪುಟಗಳನ್ನು ಹೊಸ ಪುಟಗಳ ಪಟ್ಟಿಯಲ್ಲಿ ಅಡಗಿಸು",
- "tog-extendwatchlist": "à²\95à³\87ವಲ à²\87ತà³\8dತà³\80à²\9aà³\86à²\97ಿನ ಬದಲಾವಣà³\86à²\97ಳಲà³\8dಲದà³\86, ಸà²\82ಬà²\82ಧಿತ à²\8eಲà³\8dಲಾ ಬದಲಾವಣà³\86à²\97ಳನà³\8dನà³\81 ತà³\8bರà³\81ವà²\82ತà³\86 ಪà²\9fà³\8dà²\9fಿಯನà³\8dನà³\81 ವಿಸà³\8dತರಿಸಿ",
+ "tog-extendwatchlist": "ಕೇವಲ ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳಲ್ಲದೆ, ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳನ್ನು ತೋರುವಂತೆ ಪಟ್ಟಿಯನ್ನು ವಿಸ್ತರಿಸಿ",
"tog-usenewrc": "ಹೆಚ್ಚು ವರ್ಧಿಸಲಾದ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳು ಪುಟ ಬಳಸು",
"tog-numberheadings": "ತಲೆಬರಹಗಳಿಗೆ ಅಂಕಿಗಳನ್ನು ತೋರಿಸು",
"tog-showtoolbar": "ಸಂಪಾದನೆಯ ಉಪಕರಣಗಳ ಪಟ್ಟಿಯನ್ನು ತೋರು",
"faqpage": "Project:ಸಾಮಾನ್ಯವಾಗಿ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು",
"actions": "ಕ್ರಿಯೆಗಳು",
"namespaces": "ನಾಮವರ್ಗಗಳು",
- "variants": "ಹಲವà³\81",
- "navigation-heading": "ಸà²\82à²\9aರಣà³\86 ಮà³\86ನà³\81",
+ "variants": "ವà³\8dಯತà³\8dಯಾಸ ಹà³\8aà²\82ದಿರà³\81ವ",
+ "navigation-heading": "ಸà²\82à²\9aರಣà³\86 ಪà²\9fà³\8dà²\9fಿ",
"errorpagetitle": "ದೋಷ",
"returnto": "$1 ಗೆ ಹಿಂತಿರುಗಿ.",
"tagline": "{{SITENAME}} ಇಂದ",
"history_short": "ಇತಿಹಾಸ",
"updatedmarker": "ನನ್ನ ಕೊನೆಯ ವೀಕ್ಷಣೆಯ ನಂತರ ಬದಲಾಗಿರುವವು",
"printableversion": "ಪ್ರಿಂಟ್ ಆವೃತ್ತಿ",
- "permalink": "ಸà³\8dಥಿರ ಸà²\82ಪರà³\8dà²\95",
+ "permalink": "ಸà³\8dಥಿರ à²\95à³\8aà²\82ಡಿ",
"print": "ಮುದ್ರಿಸು",
"view": "ನೋಟ",
"view-foreign": "$1 ರಲ್ಲಿ ನೋಡಿ",
"undelete_short": "{{PLURAL:$1|ಒಂದು ಸಂಪಾದನೆಯ|$1 ಸಂಪಾದನೆಗಳ}} ಅಳಿಸುವಿಕೆಯನ್ನು ತೊಡೆದುಹಾಕು",
"viewdeleted_short": "ನೋಟ {{PLURAL:$1|೧ ಅಳಿಸಲ್ಪಟ್ಟ ಸಂಪಾದನೆ|$1 ಅಳಿಸಲ್ಪಟ್ಟ ಸಂಪಾದನೆಗಳು}}",
"protect": "ಸಂರಕ್ಷಿಸು",
- "protect_change": "ಬದಲಾಯಿಸಿ",
+ "protect_change": "ಬದಲಾಯಿಸà³\81",
"protectthispage": "ಈ ಪುಟವನ್ನು ಸಂರಕ್ಷಿಸಿ",
- "unprotect": "ರà²\95à³\8dಷಣà³\86ಯನà³\8dನà³\81 ಬದಲಾವಣà³\86",
- "unprotectthispage": "à²\88 ಪà³\81à²\9fದ ರà²\95à³\8dಷಣà³\86ಯನà³\8dನà³\81 ಬದಲಾಯಿಸಲà³\81",
+ "unprotect": "ರà²\95à³\8dಷಣà³\86ಯನà³\8dನà³\81 ಬದಲಾಯಿಸà³\81",
+ "unprotectthispage": "ಈ ಪುಟದ ರಕ್ಷಣೆಯನ್ನು ಬದಲಾಯಿಸು",
"newpage": "ಹೊಸ ಪುಟ",
- "talkpage": "à²\88 ಪà³\81à²\9fದ ಬà²\97à³\8dà²\97à³\86 à²\9aರà³\8dà²\9aà³\86 ಮಾಡಿ",
+ "talkpage": "à²\88 ಪà³\81à²\9fವನà³\8dನà³\81 à²\9aರà³\8dà²\9aಿಸಿ",
"talkpagelinktext": "ಚರ್ಚೆ",
"specialpage": "ವಿಶೇಷ ಪುಟ",
"personaltools": "ವೈಯಕ್ತಿಕ ಉಪಕರಣಗಳು",
"talk": "ಚರ್ಚೆ",
"views": "ನೋಟಗಳು",
"toolbox": "ಉಪಕರಣಗಳು",
- "userpage": "ಸದಸ್ಯರ ಪುಟ ತೋರು",
+ "userpage": "ಸದಸ್ಯರ ಪುಟವನ್ನು ವೀಕ್ಷಿಸು",
"projectpage": "ಯೋಜನೆಯ ಪುಟವನ್ನು ನೋಡು",
"imagepage": "ಕಡತದ ಪುಟ ವೀಕ್ಷಿಸಿ",
"mediawikipage": "ಸಂದೇಶ ಪುಟವನ್ನು ನೋಡು",
"templatepage": "ಟೆಂಪ್ಲೇಟು ಪುಟವನ್ನು ವೀಕ್ಷಿಸಿ",
"viewhelppage": "ಸಹಾಯ ಪುಟ ತೋರು",
- "categorypage": "ವರ್ಗ ಪುಟ ತೋರು",
+ "categorypage": "ವರ್ಗದ ಪುಟವನ್ನು ವೀಕ್ಷಿಸಿ",
"viewtalkpage": "ಚರ್ಚೆಯನ್ನು ವೀಕ್ಷಿಸಿ",
"otherlanguages": "ಇತರ ಭಾಷೆಗಳಲ್ಲಿ",
"redirectedfrom": "($1 ಇಂದ ಪುನರ್ನಿರ್ದೇಶಿತ)",
"jumpto": "ಇಲ್ಲಿಗೆ ಹೋಗು:",
"jumptonavigation": "ಸಂಚರಣೆ",
"jumptosearch": "ಹುಡುಕು",
- "view-pool-error": "$1",
+ "view-pool-error": "ಕ್ಷಮಿಸಿ, ಸದ್ಯಕ್ಕೆ ಸರ್ವರ್ಗಳ ಮೇಲೆ ಹೆಚ್ಚಿನ ಹೊರೆ ಇದೆ.\nಬಹಳಷ್ಟು ಬಳಕೆದಾರರು ಈ ಸಂಪನ್ಮೂಲವನ್ನು ನೋಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ.\nನೀವು ಈ ಸಂಪನ್ಮೂಲವನ್ನು ಇನ್ನೊಮ್ಮೆ ನೋಡಲು ಪ್ರಯತ್ನಿಸುವ ಮೊದಲು ಸ್ವಲ್ಪಹೊತ್ತು ಕಾಯಿರಿ.\n\n$1",
"generic-pool-error": "ಕ್ಷಮಿಸಿ, ಸದ್ಯಕ್ಕೆ ಸರ್ವರ್ಗಳ ಮೇಲೆ ಹೆಚ್ಚಿನ ಹೊರೆ ಇದೆ.\nಬಹಳಷ್ಟು ಬಳಕೆದಾರರು ಈ ಸಂಪನ್ಮೂಲವನ್ನು ನೋಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ.\nನೀವು ಈ ಸಂಪನ್ಮೂಲವನ್ನು ಇನ್ನೊಮ್ಮೆ ನೋಡಲು ಪ್ರಯತ್ನಿಸುವ ಮೊದಲು ಸ್ವಲ್ಪಹೊತ್ತು ಕಾಯಿರಿ.",
"pool-timeout": "ಕಾಲಾವಕಾಶ ಲಾಕ್ ಕಾಯುವುದು",
"pool-queuefull": "ಪ್ರಕ್ರಿಯೆಯನ್ನು ವಿಶೇಷ ಕ್ಯು ಪೂರ್ಣ",
"copyrightpage": "{{ns:project}}:ಕೃತಿಸ್ವಾಮ್ಯತೆಗಳು",
"currentevents": "ಪ್ರಚಲಿತ ಸಂಗತಿಗಳು",
"currentevents-url": "Project:ಪ್ರಚಲಿತ ಸಂಗತಿಗಳು",
- "disclaimers": "à²\85ಬಾಧà³\8dಯತೆಗಳು",
+ "disclaimers": "ಹà²\95à³\8dà²\95à³\81 ನಿರಾà²\95ರಣೆಗಳು",
"disclaimerpage": "Project:ಸಾಮಾನ್ಯ ಅಬಾಧ್ಯತೆಗಳು",
"edithelp": "ಸಂಪಾದನೆಗೆ ಸಹಾಯ",
"helppage-top-gethelp": "ಸಹಾಯ",
"policy-url": "Project:ನಿಯಮಾವಳಿಗಳು",
"portal": "ಸಮುದಾಯ ಪುಟ",
"portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
- "privacy": "à²\97à³\8cಪà³\8dಯತà³\86ಯ à²\95ಾರà³\8dಯನೀತಿ",
+ "privacy": "à²\97à³\8cಪà³\8dಯತಾ ನೀತಿ",
"privacypage": "Project:ಗೌಪ್ಯತೆಯ ಕಾರ್ಯನೀತಿ",
"badaccess": "ಅನುಮತಿ ದೋಷ",
"badaccess-group0": "ನೀವು ಕೋರಿರುವ ಕ್ರಿಯೆಯನ್ನು ನಿರ್ವಹಿಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
"passwordreset-domain": "ಕ್ಷೇತ್ರ:",
"passwordreset-email": "ಇ-ಮೇಲ್ ವಿಳಾಸ:",
"passwordreset-emailsentemail": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿದ ಮಿಂಚಂಚೆಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.",
- "passwordreset-emailsent-capture": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿದ ಮಿಂಚಂಚೆಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ,ಇದನ್ನು ಈ ಕೆಳಗೆ ತೋರಿಸಲಾಗಿದೆ.",
"changeemail": "ಮಿಂಚಂಚೆ ವಿಳಾಸವನ್ನು ಬದಲಾಯಿಸಿ",
"changeemail-no-info": "ನೀವು ಈ ಪುಟವನ್ನು ನೇರತಲುಪಲು ಲಾಗಿನ್ ಆಗಿರುವುದು ಆವಶ್ಯಕ.",
"changeemail-oldemail": "ಪ್ರಸ್ತುತ ಮಿಂಚಂಚೆ ವಿಳಾಸ:",
"minoredit": "ಇದು ಚುಟುಕಾದ ಬದಲಾವಣೆ",
"watchthis": "ಈ ಪುಟವನ್ನು ವೀಕ್ಷಿಸಿ",
"savearticle": "ಪುಟವನ್ನು ಉಳಿಸಿ",
+ "publishpage": "ಪುಟವನ್ನು ಪ್ರಕಟಿಸು",
+ "publishchanges": "ಬದಲಾವಣೆಗಳನ್ನು ಪ್ರಕಟಿಸು",
"preview": "ಮುನ್ನೋಟ",
"showpreview": "ಮುನ್ನೋಟ ತೋರಿಸು",
"showdiff": "ಬದಲಾವಣೆಗಳನ್ನು ತೋರಿಸು",
"undo-success": "ಸಂಪಾದನೆಯನ್ನು ವಜಾ ಮಾಡಬಹುದು. ದಯವಿಟ್ಟು ಕೆಳಗಿರುವ ತುಲನೆಯನ್ನು ಪರೀಕ್ಷಿಸಿ ನೀವು ಮಾಡಲು ಇಚ್ಚಿಸಿರುವುದನ್ನು ಖಾತ್ರಿ ಮಾಡಿಕೊಂಡು ವಜಾಗೊಳಿಸುವ ಕ್ರಿಯೆಯನ್ನು \nಪೂರ್ಣಗೊಳಿಸಲು ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಿ.",
"undo-norev": "ಸಂಪಾದನೆಯನ್ನು ವಜಾಗೊಳಿಸಲು ಸಾದ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಒಂದೊ ಇದು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ ಅಧವಾ ಇದು ಅಳಿಸಲ್ಪಟ್ಟಿದೆ",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) ರ $1 ಪರಿಷ್ಕರಣೆಯನ್ನು ವಜಾ ಮಾಡಿ",
- "cantcreateaccounttitle": "ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಲಾಗುತ್ತಿಲ್ಲ",
"viewpagelogs": "ಈ ಪುಟಗಳ ದಾಖಲೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ",
"nohistory": "ಈ ಪುಟಕ್ಕೆ ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ ಇಲ್ಲ.",
"currentrev": "ಈಗಿನ ತಿದ್ದುಪಡಿ",
"previousrevision": "←ಹಿಂದಿನ ಪರಿಷ್ಕರಣೆ",
"nextrevision": "ಮುಂದಿನ ಪರಿಷ್ಕರಣೆ",
"currentrevisionlink": "ಈಗಿನ ಪರಿಷ್ಕರಣೆ",
- "cur": "ಸಧ್ಯದ",
+ "cur": "ಸದ್ಯದ",
"next": "ಮುಂದಿನದು",
"last": "ಕೊನೆಯ",
"page_first": "ಮೊದಲ",
"recentchangeslinked-summary": "ಒಂದು ನಿರ್ದಿಷ್ಟ ಪುಟದಿಂದ (ಅಥವ ನಿರ್ದಿಷ್ಟ ವರ್ಗಕ್ಕೆ ಸೇರಿರುವ ಪುಟಗಳಿಂದ) ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಪುಟಗಳಲ್ಲಿ ಇತ್ತೀಚೆಗೆ ಮಾಡಲಾಗಿರುವ ಬದಲಾವಣೆಗಳನ್ನು ಈ ಕೆಳಗೆ ಪಟ್ಟಿ ಮಾಡಲಾಗಿದೆ.\n[[Special:Watchlist|ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ]] ಇರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರ'''ಗಳಲ್ಲಿ ಇವೆ.",
"recentchangeslinked-page": "ಪುಟದ ಹೆಸರು:",
"recentchangeslinked-to": "ಇದರ ಬದಲಿಗೆ ನೇಮಿತ ಪುಟಕ್ಕೆ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿರುವ ಪುಟಗಳಲ್ಲಿನ ಬದಲಾವಣೆಗಳನ್ನು ತೋರು",
- "upload": "ಫà³\88ಲà³\8d à²\85ಪà³\8dಲà³\8bಡà³\8d",
+ "upload": "ಫà³\88ಲà³\8d ಮà³\87ಲà²\95à³\8dà²\95à³\86ರಿಸಿ",
"uploadbtn": "ಫೈಲನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ",
"reuploaddesc": "ಅಪ್ಲೋಡ್ ಅನ್ನು ನಿಲ್ಲಿಸಿ ಮತ್ತೆ ಅಪ್ಲೋಡ್ ವಕ್ಕಣೆಗೆ ಹಿಂದಿರುಗಿ",
"uploadnologin": "ಲಾಗಿನ್ ಆಗಿಲ್ಲ",
"unusedtemplates": "ಉಪಯೋಗದಲ್ಲಿರದ ಟೆಂಪ್ಲೇಟುಗಳು",
"unusedtemplatestext": "ಯಾವ ಪುಟದಲ್ಲೂ ಉಪಯೋಗದಲ್ಲಿ ಇರದ ಟೆಂಪ್ಲೇಟುಗಳನ್ನು ಇಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡಲಾಗಿದೆ. ಇವನ್ನು ಅಳಿಸುವ ಮುನ್ನ ಟೆಂಪ್ಲೇಟುಗಳಿಗೆ ಇತರ ಲಿಂಕುಗಳಿದೆಯೆ ಎಂದು ಪರೀಕ್ಷಿಸಲು ಮರೆಯದಿರಿ.",
"unusedtemplateswlh": "ಇತರ ಕೊಂಡಿಗಳು",
- "randompage": "ಯಾದà³\83à²\9aà³\8dà²\9bಿà²\95 ಪುಟ",
+ "randompage": "ಯಾವà³\81ದಾದರà³\81 à²\92à²\82ದà³\81 ಪುಟ",
"randompage-nopages": "ಈ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ ಇಲ್ಲ.",
"randomincategory-category": "ವರ್ಗ:",
"randomincategory-submit": "ಹೋಗು",
"tooltip-search": "{{SITENAME}} ಅನ್ನು ಹುಡುಕಿ",
"tooltip-search-go": "ಇದೇ ಹೆಸರಿನ ಪುಟವಿದ್ದಲ್ಲಿ ಅಲ್ಲಿಗೆ ಹೋಗು",
"tooltip-search-fulltext": "ಈ ಪಠ್ಯವನ್ನು ಹೊಂದಿರುವ ಪುಟಗಳನ್ನು ಹುಡುಕು",
- "tooltip-p-logo": "ಮುಖ್ಯ ಪುಟ",
+ "tooltip-p-logo": "ಮುಖ್ಯ ಪುಟಕ್ಕೆ ಭೇಟಿ ಕೊಡಿ",
"tooltip-n-mainpage": "ಮುಖ್ಯ ಪುಟ ನೋಡಿ",
"tooltip-n-mainpage-description": "ಮುಖ್ಯ ಪುಟ ನೋಡಿ",
"tooltip-n-portal": "ಯೋಜನೆಯ ಬಗ್ಗೆ, ನೀವು ಏನು ಮಾಡಬಹುದು, ಎಲ್ಲಿ ಇದರ ಬಗ್ಗೆ ತಿಳಿದುಕೊಳ್ಳಬಹುದು",
"tooltip-n-currentevents": "ಪ್ರಸಕ್ತ ಆಗುಹೋಗುಗಳ ಬಗ್ಗೆ ಹಿನ್ನಲೆ ಮಾಹಿತಿ ಪಡೆಯಿರಿ",
"tooltip-n-recentchanges": "ವಿಕಿಯಲ್ಲಿನ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳ ಪಟ್ಟಿ.",
- "tooltip-n-randompage": "ಯದà³\83à²\9aà³\8dà²\9bಿà²\95 ಪುಟವೊಂದನ್ನು ತೋರಿಸು",
+ "tooltip-n-randompage": "ಯಾವà³\81ದಾದರà³\81 ಪುಟವೊಂದನ್ನು ತೋರಿಸು",
"tooltip-n-help": "ಇದರ ಬಗ್ಗೆ ತಿಳಿದುಕೊಳ್ಳಲು ಜಾಗ.",
"tooltip-t-whatlinkshere": "ಇಲ್ಲಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಎಲ್ಲಾ ವಿಕಿ ಪುಟಗಳ ಪಟ್ಟಿ",
"tooltip-t-recentchangeslinked": "ಈ ಪುಟದಿಂದ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಪುಟಗಳಲ್ಲಿನ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳು",
"tooltip-feed-atom": "ಈ ಪುಟಕ್ಕೆ Atom ಫೀಡು",
"tooltip-t-contributions": "ಈ ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳ ಪಟ್ಟಿಯನ್ನು ತೋರಿಸು",
"tooltip-t-emailuser": "ಈ ಸದಸ್ಯರಿಗೆ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸು",
- "tooltip-t-upload": "ಫà³\88ಲನà³\8dನà³\81 à²\85ಪà³\8dಲà³\8bಡà³\8d ಮಾಡಿ",
+ "tooltip-t-upload": "ಫà³\88ಲನà³\8dನà³\81 ಮà³\87ಲà²\95à³\8dà²\95à³\86ರಿಸಿ",
"tooltip-t-specialpages": "ಎಲ್ಲಾ ವಿಶೇಷ ಪುಟಗಳ ಪಟ್ಟಿ",
"tooltip-t-print": "ಈ ಪುಟದ ಮುದ್ರಣ ಮಾಡಬಹುದಾದಂತ ಆವೃತ್ತಿ",
"tooltip-t-permalink": "ಪುಟದ ಈ ಆವೃತ್ತಿಗೆ ಶಾಶ್ವತ ಕೊಂಡಿ",
"file-nohires": "ಇದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ವಿವರವಾದ ನೋಟ ಇಲ್ಲ.",
"svg-long-desc": "SVG ಫೈಲು, ಸುಮಾರಾಗಿ $1 × $2 ಚಿತ್ರಬಿಂದುಗಳು, ಫೈಲಿನ ಗಾತ್ರ: $3",
"show-big-image": "ಮೂಲ ಕಡತ",
+ "show-big-image-preview": "ಈ ಮುನ್ನೋಟ ಗಾತ್ರ:$1.",
+ "show-big-image-other": "ಇತರೆ{{PLURAL:$2|resolution|resolutions}}: $1.",
"show-big-image-size": "$1 × $2 ಪಿಕ್ಸೆಲ್ಗಳು",
"file-info-gif-looped": "ಲೂಪ್",
"file-info-png-looped": "ಲೂಪ್",
"specialpages-group-pages": "ಪುಟಗಳ ಪಟ್ಟಿ",
"specialpages-group-redirects": "ವಿಶೇಷ ಪುಟಗಳನ್ನು ಪುನರ್ನಿರ್ದೇಶಿಸಲಾಗುತ್ತಿದೆ",
"blankpage": "ಖಾಲಿ ಪುಟ",
- "tag-filter": "[[ವಿಶೇಷ:ಟ್ಯಾಗ್ಗಳು|ಟ್ಯಾಗ್]] ಶೋಧಕ:",
+ "tag-filter": "[[Special:Tags|Tag]] ಶೋಧಕ:",
"tag-filter-submit": "ಶೋಧಕ",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ಟ್ಯಾಗ್|ಟ್ಯಾಗ್ಗಳು}}]]: $2)",
"tags-title": "ಅಂಕಿತಗಳು",
"tog-oldsig": "현재 서명:",
"tog-fancysig": "서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)",
"tog-uselivepreview": "실시간 미리 보기 사용하기",
- "tog-forceeditsummary": "편집 요약을 쓰지 않았을 때 알려주기",
+ "tog-forceeditsummary": "편집 요약을 쓰지 않았을 때 물어보기",
"tog-watchlisthideown": "주시문서 목록에서 내 편집을 숨기기",
"tog-watchlisthidebots": "주시문서 목록에서 봇 편집을 숨기기",
"tog-watchlisthideminor": "주시문서 목록에서 사소한 편집을 숨기기",
"category_header": "\"$1\" 분류에 속하는 문서",
"subcategories": "하위 분류",
"category-media-header": "\"$1\" 분류에 속하는 미디어",
- "category-empty": "<em>이 분류에는 문서나 자료가 하나도 없습니다.</em>",
+ "category-empty": "<em>현재 이 분류에는 문서나 미디어가 하나도 없습니다.</em>",
"hidden-categories": "{{PLURAL:$1|숨은 분류|숨은 분류}}",
"hidden-category-category": "숨은 분류",
"category-subcat-count": "{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|하위 분류}} $2개 가운데 $1개입니다.}}",
"tagline": "{{SITENAME}}",
"help": "도움말",
"search": "검색",
+ "search-ignored-headings": " #<!-- 이 줄은 그대로 두십시오 --> <pre>\n# 검색에서 무시되는 문단 제목입니다.\n# 이 문서에 대한 바뀜은 즉시 문단 제목으로 된 문서가 다시 색인됩니다.\n# null 편집을 하여 문서 다시 색인을 강제할 수 있습니다.\n# 문법은 다음과 같습니다:\n# * \"#\" 문자에서 줄의 끝까지는 주석입니다\n# * 빈 줄이 아닌 줄은 무시할 정확한 제목이며, 대소문자를 무시합니다\n각주\n참조\n참고\n출처\n바깥 링크\n바깥 고리\n같이 보기\n함께 보기\n #</pre> <!-- 이 줄은 그대로 두십시오 -->",
"searchbutton": "검색",
"go": "보기",
"searcharticle": "보기",
"youhavenewmessagesmanyusers": "여러 사용자로부터의 $1가 있습니다. ($2)",
"newmessageslinkplural": "{{PLURAL:$1|새 메시지|999=새 메시지}}",
"newmessagesdifflinkplural": "마지막으로 {{PLURAL:$1|바뀐 내용|999=바뀐 내용}}",
- "youhavenewmessagesmulti": "다른 사용자가 $1에 남긴 새 메시지가 있습니다",
+ "youhavenewmessagesmulti": "$1에 새 메시지가 있습니다",
"editsection": "편집",
"editold": "편집",
"viewsourceold": "원본 보기",
"internalerror": "내부 오류",
"internalerror_info": "내부 오류: $1",
"internalerror-fatal-exception": "종류 \"$1\"에서 심각한 오류",
- "filecopyerror": "\"$1\" 파일을 \"$2\"로 복사할 수 없습니다.",
- "filerenameerror": "\"$1\" 파일을 \"$2\"로 옮길 수 없습니다.",
+ "filecopyerror": "\"$1\" 파일을 \"$2\"(으)로 복사할 수 없습니다.",
+ "filerenameerror": "\"$1\" 파일을 \"$2\"(으)로 이름을 바꿀 수 없습니다.",
"filedeleteerror": "\"$1\" 파일을 삭제할 수 없습니다.",
"directorycreateerror": "\"$1\" 디렉터리를 만들 수 없습니다.",
"directoryreadonlyerror": "\"$1\" 디렉터리는 읽기 전용입니다.",
"formerror": "오류: 양식을 제출할 수 없습니다.",
"badarticleerror": "이 명령은 이 문서에서 수행할 수 없습니다.",
"cannotdelete": "\"$1\" 문서나 파일을 삭제할 수 없습니다.\n이미 삭제되었을 수도 있습니다.",
- "cannotdelete-title": "\"$1\" 문서를 삭제할 수 없습니다.",
+ "cannotdelete-title": "\"$1\" 문서를 삭제할 수 없습니다",
"delete-hook-aborted": "훅이 삭제를 중단했습니다.\n아무런 설명도 주어지지 않았습니다.",
"no-null-revision": "\"$1\" 문서에 대한 빈 판을 새로 만들 수 없습니다.",
"badtitle": "잘못된 제목",
"myprivateinfoprotected": "내 개인 정보를 편집할 권한이 없습니다.",
"mypreferencesprotected": "내 환경 설정을 편집할 권한이 없습니다.",
"ns-specialprotected": "특수 문서는 편집할 수 없습니다.",
- "titleprotected": "[[User:$1|$1]] 사용자가 문서 만들기를 금지했습니다.\n이유는 다음과 같습니다. <em>$2</em>",
+ "titleprotected": "[[User:$1|$1]]님이 문서 만들기를 보호했습니다.\n이유는 다음과 같습니다. <em>$2</em>",
"filereadonlyerror": "\"$2\" 파일 저장소가 읽기 전용이기 때문에 \"$1\" 파일을 바꿀 수 없습니다.\n\n파일 저장소를 잠근 시스템 관리자가 다음과 같은 설명을 남겼습니다: \"$3\".",
"invalidtitle-knownnamespace": "제목 오류: \"$2\" 이름공간과 \"$3\" 텍스트",
"invalidtitle-unknownnamespace": "제목 오류: 알 수 없는 $1 이름공간 번호와 \"$2\" 텍스트",
"userlogin-resetpassword-link": "비밀번호를 잊으셨나요?",
"userlogin-helplink2": "로그인에 대한 도움말",
"userlogin-loggedin": "이미 {{GENDER:$1|$1}} 사용자로 로그인되어 있습니다.\n다른 사용자로 로그인하려면 아래의 양식을 사용하세요.",
- "userlogin-reauth": "사용자가 $1임을 확인하려면 다시 로그인해야 합니다.",
+ "userlogin-reauth": "당신이 {{GENDER:$1|$1}}임을 검증하려면 다시 로그인해야 합니다.",
"userlogin-createanother": "다른 계정 만들기",
"createacct-emailrequired": "이메일 주소",
"createacct-emailoptional": "이메일 주소 (선택 사항)",
"password-login-forbidden": "이 사용자 계정 이름과 비밀번호는 사용할 수 없습니다.",
"mailmypassword": "비밀번호 재설정",
"passwordremindertitle": "{{SITENAME}}의 새 임시 비밀번호",
- "passwordremindertext": "$1 IP 주소에서 누군가가 아마 자신이 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.\n\"$2\" 사용자의 임시 비밀번호는 \"$3\"로 설정되었습니다. 이것이 자신이 의도한 바라면\n지금 로그인하여 새로운 비밀번호를 만드세요.\n임시 비밀번호는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n\n이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면\n이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.",
+ "passwordremindertext": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.\n\"$2\" 사용자의 임시 비밀번호는 \"$3\"로 설정되었습니다. 이것이 자신이 의도한 바라면\n지금 로그인하여 새로운 비밀번호를 만드세요.\n임시 비밀번호는 {{PLURAL:$5|1일|$5일}} 후에 만료됩니다.\n\n이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면\n이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.",
"noemail": "\"$1\" 사용자는 이메일 주소를 등록하지 않았습니다.",
"noemailcreate": "올바른 이메일 주소를 제공해야 합니다.",
"passwordsent": "\"$1\" 계정의 새로운 비밀번호를 이메일로 보냈습니다.\n비밀번호를 받고 다시 로그인해 주세요.",
"accountcreated": "계정이 만들어짐",
"accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|토론]]) 사용자 계정이 만들어졌습니다.",
"createaccount-title": "{{SITENAME}} 계정 만들기",
- "createaccount-text": "ë\88\84êµ°ê°\80ê°\80 {{SITENAME}} ($4)ì\97\90ì\84\9c ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84 \"$2\", ë¹\84ë°\80ë²\88í\98¸ \"$3\"ë¡\9c ë\8b¹ì\8b ì\9d\98 ì\9d´ë©\94ì\9d¼ 주ì\86\8cê°\80 ë\93±ë¡\9dë\90\9c ê³\84ì \95ì\9d\84 ë§\8cë\93¤ì\97\88ì\8aµë\8b\88ë\8b¤. \nì§\80ê¸\88 ë¡\9cê·¸ì\9d¸í\95\98ì\97¬ ë¹\84ë°\80ë²\88í\98¸ë¥¼ ë°\94꾸ì\8bì\8b\9cì\98¤.\n\nì\8b¤ì\88\98ë¡\9c ê³\84ì \95ì\9d\84 ì\9e\98못 ë§\8cë\93¤ì\97\88ë\8b¤ë©´ ì\9d´ ë©\94ì\8b\9cì§\80ë\8a\94 무ì\8b\9cí\95´ë\8f\84 ë\90©ë\8b\88ë\8b¤.",
+ "createaccount-text": "ë\88\84êµ°ê°\80ê°\80 {{SITENAME}} ($4)ì\97\90ì\84\9c ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84 \"$2\", ë¹\84ë°\80ë²\88í\98¸ \"$3\"ë¡\9c ë\8b¹ì\8b ì\9d\98 ì\9d´ë©\94ì\9d¼ 주ì\86\8cê°\80 ë\93±ë¡\9dë\90\9c ê³\84ì \95ì\9d\84 ë§\8cë\93¤ì\97\88ì\8aµë\8b\88ë\8b¤. \nì§\80ê¸\88 ë¡\9cê·¸ì\9d¸í\95\98ì\97¬ ë¹\84ë°\80ë²\88í\98¸ë¥¼ ë°\94꾸ì\85\94ì\95¼ í\95©ë\8b\88ë\8b¤.\n\nì\8b¤ì\88\98ë¡\9c ê³\84ì \95ì\9d\84 ì\9e\98못 ë§\8cë\93¤ì\97\88ë\8b¤ë©´ ì\9d´ ë©\94ì\8b\9cì§\80ë\8a\94 무ì\8b\9cí\95´ë\8f\84 ë\90©ë\8b\88ë\8b¤.",
"login-throttled": "최근 너무 많이 로그인을 시도했습니다.\n$1 뒤에 다시 시도하세요.",
"login-abort-generic": "로그인에 실패했습니다 - 중지됨",
"login-migrated-generic": "당신의 계정이 마이그레이션되었으며, 당신의 사용자 이름이 더 이상 이 위키에 존재하지 않습니다.",
"botpasswords-label-delete": "삭제",
"botpasswords-label-resetpassword": "비밀번호 재설정",
"botpasswords-label-grants": "적용할 수 있는 부여:",
- "botpasswords-help-grants": "ê°\9cê°\9cì\9d\98 ë¶\80ì\97¬ 기ë\8a¥ì\9d\80 ì\82¬ì\9a©ì\9e\90 ê³\84ì \95ì\9d´ ì\9d´ë¯¸ ì\86\8cì\9c í\95\98ê³ ì\9e\88ë\8a\94 ì\82¬ì\9a©ì\9e\90 ê¶\8cí\95\9cì\97\90 ë\8c\80í\95\9c ì \91ê·¼ì\9d\84 ì \9cê³µí\95©ë\8b\88ë\8b¤. ì\9e\90ì\84¸í\95\9c ì\82¬í\95ì\9d\80 [[Special:ListGrants|ë¶\80ì\97¬ 목ë¡\9d]]ì\9d\84 í\99\95ì\9d¸í\95´ 주ì\8bì\8b\9cì\98¤.",
+ "botpasswords-help-grants": "ê°\81ê°\81 ë¶\80ì\97¬ë\90\9c ê°\92ì\9d\80 목ë¡\9dì\97\90ì\84\9c ì\82¬ì\9a©ì\9e\90 ê³\84ì \95ì\9d\84 ì\9d´ë¯¸ ê°\96ê³ ì\9e\88ë\8a\94 ì\82¬ì\9a©ì\9e\90 ê¶\8cí\95\9cì\97\90 ì \91ê·¼í\95 ì\88\98 ì\9e\88ë\8a\94 ê¶\8cí\95\9cì\9d\84 ì¤\8dë\8b\88ë\8b¤. ì\9e\90ì\84¸í\95\9c ì \95ë³´ë\8a\94 [[Special:ListGrants|ë¶\80ì\97¬ í\91\9c]]ì\9d\84 ë³´ì\84¸ì\9a\94.",
"botpasswords-label-restrictions": "사용 제한:",
"botpasswords-label-grants-column": "승인됨",
"botpasswords-bad-appid": "\"$1\"이라는 봇 이름은 유효하지 않습니다.",
"botpasswords-updated-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 업데이트되었습니다.",
"botpasswords-deleted-title": "봇 비밀번호 제거",
"botpasswords-deleted-body": "사용자 \"$2\"의 \"$1\"라는 이름의 봇 비밀번호가 삭제되었습니다.",
- "botpasswords-newpassword": "<strong>$1</strong> 계정의 비밀번호가 <strong>$2</strong>로 변경되었습니다. <em>잊어버리지 않도록 기록해두시기 바랍니다.</em>",
+ "botpasswords-newpassword": "<strong>$1</strong>님으로 로그인하기 위한 새 비밀번호가 <strong>$2</strong>입니다. <em>잊어버리지 않도록 기록해두시기 바랍니다.</em>",
"botpasswords-no-provider": "'BotPasswordsSessionProvider'는 이용할 수 없습니다.",
"botpasswords-restriction-failed": "봇 비밀번호 제한으로 인해 로그인할 수 없습니다.",
"botpasswords-invalid-name": "지정된 사용자 이름은 봇 비밀번호 구분자(\"$1\")를 포함하고 있지 않습니다.",
"passwordreset-capture-help": "이 상자에 체크하면 이메일이 발송된 즉시 임시 비밀번호가 담긴 이메일을 볼 수 있습니다.",
"passwordreset-email": "이메일 주소:",
"passwordreset-emailtitle": "{{SITENAME}} 계정에 대한 자세한 정보",
- "passwordreset-emailtext-ip": "$1 IP 주소를 사용하는 누군가가 아마 자신이 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
+ "passwordreset-emailtext-ip": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 사용자 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|1일|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
"passwordreset-emailtext-user": "{{SITENAME}} ($4)의 사용자 $1이 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
"passwordreset-emailelement": "사용자 이름: \n$1\n\n임시 비밀번호: \n$2",
"passwordreset-emailsentemail": "당신의 계정과 연결된 이메일 주소가 있다면, 비밀번호 재설정 메일이 전해질 것입니다.",
"passwordreset-emailsentusername": "이 사용자 이름과 연결된 이메일 주소가 있다면 비밀번호 초기화 이메일이 전송됩니다.",
- "passwordreset-emailsent-capture": "비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.",
- "passwordreset-emailerror-capture": "비밀번호 재설정 이메일이 생성되어 아래에 나타나 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1",
"passwordreset-emailsent-capture2": "비밀번호 재설정 이메일을 보냈습니다. {{PLURAL:$1|사용자 이름과 비밀번호는|사용자 이름과 비밀번호의 목록은}} 아래에 나타납니다.",
"passwordreset-emailerror-capture2": "{{GENDER:$2|사용자}} 이메일 보내기 실패: $1 {{PLURAL:$3|사용자 이름과 비밀번호가|사용자 이름과 비밀번호의 목록이}} 아래에 나타납니다.",
"passwordreset-nocaller": "호출자를 지정해야 합니다",
"passwordreset-nodata": "사용자 이름이나 이메일 주소가 지정되지 않았습니다",
"changeemail": "이메일 주소를 바꾸거나 제거하기",
"changeemail-header": "이메일 주소를 바꾸려면 이 양식을 채우세요. 계정에서 이메일 연동을 취소하고 싶다면 양식을 제출할 때 새 이메일 주소를 공란으로 두세요.",
- "changeemail-passwordrequired": "변경을 적용하려면 비밀번호를 입력해야 합니다.",
"changeemail-no-info": "이 페이지에 직접 접근하려면 로그인해야 합니다.",
"changeemail-oldemail": "현재 이메일 주소:",
"changeemail-newemail": "새 이메일 주소:",
"showpreview": "미리 보기",
"showdiff": "차이 보기",
"blankarticle": "<strong>경고:</strong> 만들려는 문서가 비어 있습니다.\n\"{{int:savearticle}}\"을 다시 클릭하면, 아무 내용 없이 문서가 만들어집니다.",
- "anoneditwarning": "<strong>경고:</strong> 로그인을 하고 있지 않습니다. 편집을 하면 IP 주소가 공개적으로 보이게 됩니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 생성하면]</strong>, 편집 시에 사용자 이름이 표시되며 더불어 다른 혜택들도 누릴 수 있습니다.",
+ "anoneditwarning": "<strong>경고:</strong> 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 생성하면]</strong> 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.",
"anonpreviewwarning": "<em>로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서의 편집 역사에 남게 됩니다.</em>",
"missingsummary": "'''알림:''' 편집 요약을 적지 않았습니다.\n이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
"selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"{{int:savearticle}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
"previewerrortext": "변경사항을 미리보기하는 도중 오류가 발생했습니다.",
"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이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
- "autoblockedtext": "당신의 IP 주소는 $1님이 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:$2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
+ "autoblockedtext": "당신의 IP 주소는 $1님이 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:$2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|사용자 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
"blockednoreason": "이유를 입력하지 않음",
"whitelistedittext": "문서를 편집하기 전에 $1해야 합니다.",
"confirmedittext": "문서를 고치려면 이메일 인증 절차가 필요합니다.\n[[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해주시기 바랍니다.",
"loginreqlink": "로그인",
"loginreqpagetext": "다른 문서를 보기 위해서는 $1해야 합니다.",
"accmailtitle": "비밀번호를 보냈습니다",
- "accmailtext": "[[User talk:$1|$1]] 사용자의 비밀번호를 임의로 만들어 $2(으)로 보냈습니다. 로그인하고 나서 <em>[[Special:ChangePassword|비밀번호를 바꿀]]</em> 수 있습니다.",
+ "accmailtext": "[[User talk:$1|$1]]님의 비밀번호를 임의로 만들어 $2(으)로 보냈습니다. 로그인하고 나서 <em>[[Special:ChangePassword|비밀번호를 바꿀]]</em> 수 있습니다.",
"newarticle": "(새 문서)",
"newarticletext": "아직 없는 문서의 링크를 따라왔습니다.\n새 문서를 만들려면 아래 상자에 내용을 입력하면 됩니다. (자세한 내용은 [$1 도움말 문서]를 참조하세요)\n만약 잘못 찾아왔다면, 브라우저의 '''뒤로''' 버튼을 눌러 주세요.",
"anontalkpagetext": "----\n여기는 계정을 만들지 않았거나 사용하고 있지 않은 익명 사용자를 위한 토론 문서입니다.\n익명 사용자를 구별하기 위해서는 숫자로 된 IP 주소를 사용해야만 합니다.\nIP 주소는 여러 사용자가 공유할 수 있습니다.\n자신과 관계없는 의견이 자신에게 남겨져 있어 불쾌하다고 생각하는 익명 사용자는 [[Special:CreateAccount|계정을 만들고]] [[Special:UserLogin|로그인해서]] 나중에 다른 익명 사용자에게 줄 혼란을 줄일 수 있습니다.",
"editingold": "<strong>경고: 이 문서의 오래된 판을 편집하고 있습니다.</strong>\n이것을 저장하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.",
"yourdiff": "차이",
"copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n<strong>저작권이 있는 내용을 허가 없이 저장하지 마세요!</strong>",
- "copyrightwarning2": "{{SITENAME}}에서의 모든 기여는 다른 사용자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.\n만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 내용에 대해서는 $1 문서를 읽어 주세요).\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
+ "copyrightwarning2": "{{SITENAME}}에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.\n만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 $1 문서를 보세요).\n<strong>저작권이 있는 내용을 허가 없이 저장하지 마세요!</strong>",
"editpage-cannot-use-custom-model": "이 문서의 콘텐츠 모델은 변경될 수 없습니다.",
"longpageerror": "'''오류: 문서의 크기가 {{PLURAL:$1|$1킬로바이트}}로 최대 크기인 {{PLURAL:$2|$2킬로바이트}}보다 큽니다.'''\n저장할 수 없습니다.",
"readonlywarning": "<strong>경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.</strong>\n편집 내용을 복사하여 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.\n\n데이터베이스를 잠근 시스템 관리자가 남긴 설명은 다음과 같습니다: $1",
"permissionserrors": "권한 오류",
"permissionserrorstext": "해당 명령을 수행할 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해보세요:",
"permissionserrorstext-withaction": "$2 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해주세요:",
- "contentmodelediterror": "ì\82¬ì\9a©ì\9e\90ë\8a\94 ì\9d´ í\8c\90ì\9d\84 í\8e¸ì§\91í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤. ì½\98í\85\90ì¸ ëª¨ë\8d¸ì\9d\80 <code>$1</code>ì\9d´ë©°, ì\9d´ 문ì\84\9cì\9d\98 í\98\84 콘텐츠 모델은 <code>$2</code>이므로 차이가 있습니다.",
+ "contentmodelediterror": "ì\9d´ í\8c\90ì\9d\84 í\8e¸ì§\91í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤. ì½\98í\85\90ì¸ ëª¨ë\8d¸ì\9d\80 <code>$1</code>ì\9d´ë©°, ì\9d´ 문ì\84\9cì\9d\98 í\98\84ì\9e¬ 콘텐츠 모델은 <code>$2</code>이므로 차이가 있습니다.",
"recreate-moveddeleted-warn": "<strong>경고: 삭제된 문서를 다시 만들고 있습니다.</strong>\n\n이 문서를 계속 편집하는 것이 적합한 것인지 확인해주세요.\n편의를 위해 삭제와 이동 기록을 다음과 같이 제공합니다:",
"moveddeleted-notice": "이 문서는 삭제되었습니다.\n이 문서의 삭제 및 이동 기록은 다음과 같습니다.",
"moveddeleted-notice-recent": "죄송합니다, 이 문서는 최근 (24시간 내)에 삭제된 적이 있습니다.\n삭제와 이동 기록이 참고를 위해 남겨져 있습니다.",
"content-failed-to-parse": "$1 모델에 대한 $2 내용을 구문 분석하는 데 실패했습니다: $3",
"invalid-content-data": "잘못된 내용 데이터입니다",
"content-not-allowed-here": "\"$1\" 내용은 [[$2]] 문서예 허용하지 않습니다",
- "editwarning-warning": "이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.\n로그인을 했다면, 환경 설정의 \"{{int:편집 상자}}\"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.",
+ "editwarning-warning": "이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.\n로그인을 했다면, 환경 설정의 \"{{int:prefs-editing}}\"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.",
"editpage-notsupportedcontentformat-title": "지원하지 않는 내용 형식",
- "editpage-notsupportedcontentformat-text": "내용 형식 $1(은)는 $2 내용 모델에서 지원하지 않습니다.",
+ "editpage-notsupportedcontentformat-text": "내용 형식 $1은(는) $2 내용 모델에서 지원하지 않습니다.",
"content-model-wikitext": "위키텍스트",
"content-model-text": "일반 텍스트",
"content-model-javascript": "자바스크립트",
"content-model-css": "CSS",
"content-json-empty-object": "빈 오브젝트",
"content-json-empty-array": "빈 배열",
+ "deprecated-self-close-category": "유효하지 않은, 스스로 닫는 HTML 태그를 사용하고 있는 문서",
+ "deprecated-self-close-category-desc": "이 문서는 <code><b/></code>나 <code><span/></code>와 같은 유효하지 않은, 스스로 닫는 HTML 태그를 포함하고 있습니다. 이 태그들의 동작은 곧 HTML5 사양과 일관되도록 변경될 예정이므로 위키텍스트에서 이것들을 사용하는 것은 권장되지 않습니다.",
"duplicate-args-warning": "<strong>경고:</strong> [[:$1]] 문서는 [[:$2]]에 \"$3\" 변수를 하나보다 더 많이 입력했습니다. 마지막으로 주어진 값만이 유효합니다.",
"duplicate-args-category": "중복된 인수를 사용한 틀의 호출을 포함한 문서",
"duplicate-args-category-desc": "문서에 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>나 <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>와 같은, 인수를 중복하여 사용한 틀 호출을 포함합니다.",
"undo-nochange": "편집이 이미 되돌려진 것으로 나타납니다.",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]])의 $1판 편집을 되돌림",
"undo-summary-username-hidden": "숨겨진 사용자가 $1 판을 되돌림",
- "cantcreateaccounttitle": "계정을 만들 수 없습니다",
"cantcreateaccount-text": "현재 IP 주소('''$1''')는 [[User:$3|$3]] 사용자에 의해 계정 만들기가 차단되었습니다.\n\n차단 이유는 다음과 같습니다: $2",
- "cantcreateaccount-range-text": "당신의 IP 주소(<strong>$4</strong>)가 속해 있는 <strong>$1</strong> 대역에서의 계정 생성을 [[User:$3|$3]] 사용자가 차단하였습니다.\n\n$3 사용자가 제시한 이유는 \"$2\"입니다.",
+ "cantcreateaccount-range-text": "당신의 IP 주소(<strong>$4</strong>)가 속해 있는 <strong>$1</strong> 대역에서의 계정 만들기를 [[User:$3|$3]]님이 차단했습니다.\n\n$3님이 제시한 이유는 \"$2\"입니다.",
"viewpagelogs": "이 문서의 기록 보기",
"nohistory": "이 문서는 편집 역사가 없습니다.",
"currentrev": "최신판",
"currentrev-asof": "$1 기준 최신판",
"revisionasof": "$1 판",
- "revision-info": "{{GENDER:$6|$2}} 사용자의 $1 판$7",
+ "revision-info": "{{GENDER:$6|$2}}님의 $1 판$7",
"previousrevision": "← 이전 판",
"nextrevision": "다음 판 →",
"currentrevisionlink": "최신판",
"mergehistory-comment": "[[:$1]] 문서를 [[:$2]] 문서로 합침: $3",
"mergehistory-same-destination": "원본 문서 이름과 대상 문서 이름은 같을 수 없습니다",
"mergehistory-reason": "이유:",
- "mergelog": "합치기 기록",
+ "mergelog": "병합 기록",
"revertmerge": "합치기 해제",
- "mergelogpagetext": "다음은 한 문서의 역사를 다른 문서의 역사와 í\95©ì¹\9c ìµ\9cê·¼ 기ë¡\9dì\9e\85ë\8b\88ë\8b¤.",
+ "mergelogpagetext": "다음은 한 문서의 역사를 다른 문서의 역사와 ë³\91í\95©í\95\9c ìµ\9cê·¼ 기ë¡\9dì\9e\85ë\8b\88ë\8b¤.",
"history-title": "\"$1\"의 편집 역사",
"difference-title": "\"$1\"의 두 판 사이의 차이",
"difference-title-multipage": "\"$1\" 문서와 \"$2\" 문서 사이의 차이",
"prefs-changeemail": "이메일 주소를 바꾸거나 제거하기",
"prefs-setemail": "이메일 주소 설정하기",
"prefs-email": "이메일 설정",
- "prefs-rendering": "문서 보이기 설정",
+ "prefs-rendering": "문서 보이기",
"saveprefs": "저장",
"restoreprefs": "(모든 부분에서) 모두 기본 설정으로 되돌리기",
- "prefs-editing": "편집 상자",
+ "prefs-editing": "편집",
"rows": "줄 수:",
"columns": "열 수:",
"searchresultshead": "검색",
"email": "이메일",
"prefs-help-realname": "실명은 선택 사항입니다.\n실명을 입력하면 당신의 기여에 대한 저작자 표시에 쓰이게 될 수 있습니다.",
"prefs-help-email": "이메일 주소 입력은 선택 사항입니다. 다만 비밀번호를 잊었을 때 비밀번호를 재설정하기 위해 필요합니다.",
- "prefs-help-email-others": "자신의 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.\n이 경우에도 이메일 주소는 다른 사용자가 연락할 때 공개되지 않습니다.",
+ "prefs-help-email-others": "자신의 사용자 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.\n이 경우에도 이메일 주소는 다른 사용자가 연락할 때 공개되지 않습니다.",
"prefs-help-email-required": "이메일 주소가 필요합니다.",
"prefs-info": "기본 정보",
"prefs-i18n": "언어 설정",
"right-move-rootuserpages": "최상위 사용자 문서 이동",
"right-move-categorypages": "분류 문서 이동",
"right-movefile": "파일 이동",
- "right-suppressredirect": "문ì\84\9c를 ì\98®ê¸¸ 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
+ "right-suppressredirect": "문ì\84\9c를 ì\9d´ë\8f\99í\95 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
"right-upload": "파일 올리기",
"right-reupload": "이미 존재하는 파일을 다시 올리기",
"right-reupload-own": "자신이 이미 올린 파일 덮어쓰기",
"right-applychangetags": "자신이 편집할 때 [[Special:Tags|태그]]를 적용하기",
"right-changetags": "문서의 특정 판과 특정 기록 항목에 임의의 [[Special:Tags|태그]]를 추가하거나 제거하기",
"right-deletechangetags": "데이터베이스에서 [[Special:Tags|태그]]를 지우기",
- "grant-generic": "\"$1\" ê¶\8cí\95\9c ë²\88ë\93¤",
+ "grant-generic": "\"$1\" ê¶\8cí\95\9c 묶ì\9d\8c",
"grant-group-page-interaction": "문서로 상호 작용",
"grant-group-file-interaction": "미디어로 상호 작용",
"grant-group-watchlist-interaction": "당신의 주시문서로 상호작용",
"action-applychangetags": "당신이 편집할 때 태그를 적용하기",
"action-changetags": "문서의 특정 판과 특정 기록 항목에 임의의 태그를 추가하거나 제거하기",
"action-deletechangetags": "데이터베이스에서 태그를 지우기",
+ "action-purge": "이 문서 새로 고침",
"nchanges": "$1개 {{PLURAL:$1|바뀜}}",
"enhancedrc-since-last-visit": "{{PLURAL:$1|마지막 방문 이후}} $1개",
"enhancedrc-history": "역사",
"minlength1": "파일 이름은 적어도 1글자 이상이어야 합니다.",
"illegalfilename": "파일 이름 \"$1\"에는 문서 제목에 허용되지 않는 글자가 포함되어 있습니다.\n이름을 바꾸어 다시 시도해 주세요.",
"filename-toolong": "파일 이름은 240바이트를 넘을 수 없습니다.",
- "badfilename": "파일 이름이 \"$1\"로 바뀌었습니다.",
+ "badfilename": "파일 이름이 \"$1\"(으)로 바뀌었습니다.",
"filetype-mime-mismatch": "\".$1\" 파일 확장자와 이 파일의 MIME 형식($2)이 일치하지 않습니다.",
"filetype-badmime": "\"$1\" MIME 형식을 가진 파일은 올릴 수 없습니다.",
- "filetype-bad-ie-mime": "이 파일을 올릴 수 없습니다. Internet Explorer가 잠재적으로 위험한 파일 형식으로 판단하여 사용이 금지된 \"$1\"로 인식할 수 있습니다.",
+ "filetype-bad-ie-mime": "이 파일을 올릴 수 없습니다. Internet Explorer가 잠재적으로 위험한 파일 형식으로 판단하여 사용이 금지된 \"$1\"(으)로 인식할 수 있습니다.",
"filetype-unwanted-type": "'''\".$1\"''' 확장자는 권장하지 않습니다.\n권장하는 {{PLURAL:$3|파일 확장자}}는 $2입니다.",
"filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|형식의 파일은 올릴 수 없습니다}}.\n$2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.",
"filetype-missing": "파일에 확장자(\".jpg\" 등)가 없습니다.",
"backend-fail-notexists": "$1 파일이 존재하지 않습니다.",
"backend-fail-hashes": "비교 해시값을 얻지 못했습니다.",
"backend-fail-notsame": "\"$1\" 파일과 같은 이름을 가진 다른 파일이 존재합니다.",
- "backend-fail-invalidpath": "\"$1\"(은)는 올바른 저장소 경로가 아닙니다.",
+ "backend-fail-invalidpath": "\"$1\"은(는) 올바른 저장소 경로가 아닙니다.",
"backend-fail-delete": "\"$1\" 파일을 삭제할 수 없습니다.",
"backend-fail-describe": "\"$1\" 파일에 대한 메타데이터를 바꿀 수 없습니다.",
"backend-fail-alreadyexists": "\"$1\" 파일이 이미 존재합니다.",
"img-auth-public": "img_auth.php는 개인 위키 파일을 바깥 사이트로 전송하는 기능입니다.\n이 기능은 기본적으로 공개적인 위키에서 사용하도록 설계되어 있습니다.\n보안적인 문제로 기본적으로 img_auth.php 기능은 비활성화되어 있습니다.",
"img-auth-noread": "\"$1\" 파일을 볼 권한이 없습니다.",
"http-invalid-url": "잘못된 URL: $1",
- "http-invalid-scheme": "\"$1\"로 시작하는 URL은 지원되지 않습니다.",
+ "http-invalid-scheme": "\"$1\"(으)로 시작하는 URL은 지원되지 않습니다.",
"http-request-error": "알 수 없는 오류로 HTTP 요청에 실패했습니다.",
"http-read-error": "HTTP 읽기 오류입니다.",
"http-timed-out": "HTTP 요청 시간 초과입니다.",
"randompage": "임의 문서로",
"randompage-nopages": "{{PLURAL:$2|다음}} 이름공간에는 문서가 없습니다: $1",
"randomincategory": "분류 안의 임의 문서",
- "randomincategory-invalidcategory": "\"$1\"(은)는 올바른 분류 이름이 아닙니다.",
+ "randomincategory-invalidcategory": "\"$1\"은(는) 올바른 분류 이름이 아닙니다.",
"randomincategory-nopages": "[[:Category:$1]]에 문서가 없습니다.",
"randomincategory-category": "분류:",
"randomincategory-legend": "분류 안의 임의 문서",
"booksources-text": "아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다.",
"booksources-invalid-isbn": "입력한 ISBN이 올바르지 않은 것으로 보입니다. 원본과 대조해 문제가 있는지 확인해보세요.",
"specialloguserlabel": "작업 수행자:",
- "speciallogtitlelabel": "ë\8c\80ì\83\81 (ì \9c목 ë\98\90ë\8a\94 {{ns:user}}:ì\82¬ì\9a©ì\9e\90_ì\9d´ë¦\84 ì\9c¼ë¡\9c ì\82¬ì\9a©ì\9e\90):",
+ "speciallogtitlelabel": "ë\8c\80ì\83\81 (ì\82¬ì\9a©ì\9e\90ê³\84ì \95ì\97\90 ë\8c\80í\95\9c ì \9c목 ë\98\90ë\8a\94 {{ns:user}}:ì\82¬ì\9a©ì\9e\90ì\9d´ë¦\84):",
"log": "기록 목록",
"logeventslist-submit": "보기",
"all-logs-page": "모든 공개 기록",
"linksearch-error": "와일드카드는 주소의 처음 부분에만 사용될 수 있습니다.",
"listusersfrom": "다음으로 시작하는 사용자 보기:",
"listusers-submit": "보기",
- "listusers-noresult": "해당 사용자가 없습니다.",
+ "listusers-noresult": "사용자를 찾을 수 없습니다.",
"listusers-blocked": "(차단됨)",
"activeusers": "활동하는 사용자 목록",
"activeusers-intro": "다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.",
"activeusers-from": "다음으로 시작하는 사용자를 보기:",
"activeusers-hidebots": "봇을 숨기기",
"activeusers-hidesysops": "관리자를 숨기기",
- "activeusers-noresult": "사용자가 없습니다.",
+ "activeusers-noresult": "사용자를 찾을 수 없습니다.",
"activeusers-submit": "활동하고 있는 사용자 보이기",
"listgrouprights": "사용자 권한 목록",
"listgrouprights-summary": "다음은 이 위키에 있는 사용자 권한 그룹의 목록입니다.\n각각의 권한에 대해서는 [[{{MediaWiki:Listgrouprights-helppage}}|추가 정보]]를 참조하세요.",
"listgrants-grant": "부여",
"listgrants-rights": "권한",
"trackingcategories": "추적용 분류",
- "trackingcategories-summary": "이 페이지는 미디어위키 소프트웨어에 의해 자동으로 만들어지는 추적용 분류를 나열합니다. 그들의 이름은 {{ns:8}} 이름공간에 관련된 시스템 메시지를 바꾸어서 바꿀 수 있습니다.",
+ "trackingcategories-summary": "이 페이지는 미디어위키 소프트웨어에 의해 자동으로 만들어지는 추적용 분류를 나열합니다. 이들의 이름은 {{ns:8}} 이름공간의 관련 시스템 메시지들을 변경함으로써 바꿀 수 있습니다.",
"trackingcategories-msg": "추적용 분류",
"trackingcategories-name": "메시지 이름",
"trackingcategories-desc": "분류 포함 기준",
"watchnologin": "로그인하지 않음",
"addwatch": "주시문서 목록에 추가",
"addedwatchtext": "\"[[:$1]]\" 문서와 그 토론 문서가 [[Special:Watchlist|주시문서 목록]]에 추가되었습니다.",
+ "addedwatchtext-talk": "\"[[:$1]]\" 문서와 관련 문서가 [[Special:Watchlist|주시문서 목록]]에 추가되었습니다.",
"addedwatchtext-short": "\"$1\" 문서를 주시문서 목록에 추가했습니다.",
"removewatch": "주시문서 목록에서 제거",
"removedwatchtext": "\"[[:$1]]\" 문서와 그 토론 문서가 [[Special:Watchlist|주시문서 목록]]에서 제거되었습니다.",
+ "removedwatchtext-talk": "\"[[:$1]]\" 문서와 관련 문서가 [[Special:Watchlist|주시문서 목록]]에서 제거되었습니다.",
"removedwatchtext-short": "\"$1\" 문서를 주시문서 목록에 제거했습니다.",
"watch": "주시",
"watchthispage": "주시하기",
"watcherrortext": "\"$1\" 문서에 대한 주시 여부를 바꾸는 중 오류가 발생했습니다.",
"enotif_reset": "모든 문서를 방문한 것으로 표시하기",
"enotif_impersonal_salutation": "{{SITENAME}} 사용자",
- "enotif_subject_deleted": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|삭제했습니다}}",
- "enotif_subject_created": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|만들었습니다}}",
- "enotif_subject_moved": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|이동하였습니다}}",
- "enotif_subject_restored": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|되살렸습니다}}",
- "enotif_subject_changed": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|바꾸었습니다}}",
- "enotif_body_intro_deleted": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|삭제했으며}} $3 에서 볼 수 있습니다.",
- "enotif_body_intro_created": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|만들었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
- "enotif_body_intro_moved": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|이동하였으며}} 현재 판은 $3 에서 볼 수 있습니다.",
- "enotif_body_intro_restored": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.",
- "enotif_body_intro_changed": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
+ "enotif_subject_deleted": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|삭제했습니다}}",
+ "enotif_subject_created": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|만들었습니다}}",
+ "enotif_subject_moved": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|이동팼습니다}}",
+ "enotif_subject_restored": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|되살렸습니다}}",
+ "enotif_subject_changed": "{{SITENAME}} $1 문서를 $2님이 {{GENDER:$2|바꾸었습니다}}",
+ "enotif_body_intro_deleted": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|삭제했으며}} $3 에서 볼 수 있습니다.",
+ "enotif_body_intro_created": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|만들었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
+ "enotif_body_intro_moved": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|이동하였으며}} 현재 판은 $3 에서 볼 수 있습니다.",
+ "enotif_body_intro_restored": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.",
+ "enotif_body_intro_changed": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
"enotif_lastvisited": "마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1을 보세요.",
"enotif_lastdiff": "이 바뀜을 보려면 $1을 보세요.",
"enotif_anon_editor": "익명 사용자 $1",
"rollbacklinkcount-morethan": "{{PLURAL:$1|편집}} $1회 이상 되돌리기",
"rollbackfailed": "되돌리기 실패",
"rollback-missingparam": "요청에 필요한 변수가 존재하지 않습니다.",
- "cantrollback": "í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8c릴 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.\n문ì\84\9c를 í\8e¸ì§\91í\95\9c ì\82¬ì\9a©자가 한 명뿐입니다.",
+ "cantrollback": "í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8c릴 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.\n문ì\84\9c를 í\8e¸ì§\91í\95\9c ì \80자가 한 명뿐입니다.",
"alreadyrolled": "[[:$1]]에서 [[User:$2|$2]] ([[User talk:$2|토론]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])의 편집을 되돌릴 수 없습니다.\n누군가가 이미 문서를 고치거나 되돌렸습니다.\n\n마지막으로 이 문서를 편집한 사용자는 [[User:$3|$3]] ([[User talk:$3|토론]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])입니다.",
"editcomment": "편집 요약: <em>$1</em>",
"revertpage": "[[Special:Contributions/$2|$2]]([[User talk:$2|토론]])의 편집을 [[User:$1|$1]]의 마지막 판으로 되돌림",
"log-name-contentmodel": "콘텐츠 모델 변경 기록",
"log-description-contentmodel": "페이지의 콘텐츠 모델과 관련된 행위",
"logentry-contentmodel-new": "$1님이 비 기본값 \"$5\" 콘텐츠 모델을 사용해 $3 문서를 {{GENDER:$2|만들었습니다}}",
- "logentry-contentmodel-change": "$1님이 $3 문서의 콘텐츠 모델을 \"$4\"에서 \"$5\"로 {{GENDER:$2|바꾸었습니다}}",
+ "logentry-contentmodel-change": "$1님이 $3 문서의 콘텐츠 모델을 \"$4\"에서 \"$5\"(으)로 {{GENDER:$2|바꾸었습니다}}",
"logentry-contentmodel-change-revertlink": "되돌리기",
"logentry-contentmodel-change-revert": "되돌리기",
"protectlogpage": "문서 보호 기록",
"protectlogtext": "아래의 목록은 문서 보호에 관한 바뀜에 대한 기록입니다.\n현재 보호된 문서의 목록에 대해서는 [[Special:ProtectedPages|보호된 문서 목록]]을 참조하세요.",
- "protectedarticle": "사용자가 \"[[$1]]\" 문서를 보호했습니다",
- "modifiedarticleprotection": "사용자가 \"[[$1]]\" 문서의 보호 설정을 바꿨습니다",
- "unprotectedarticle": "사용자가 \"[[$1]]\" 문서를 보호 해제했습니다",
- "movedarticleprotection": "사용자가 문서의 보호 설정을 \"[[$2]]\"에서 \"[[$1]]\"으로 변경했습니다",
+ "protectedarticle": "님이 \"[[$1]]\" 문서를 보호했습니다",
+ "modifiedarticleprotection": "님이 \"[[$1]]\" 문서의 보호 설정을 바꿨습니다",
+ "unprotectedarticle": "\"[[$1]]\" 문서를 보호 해제했습니다",
+ "movedarticleprotection": "님이 문서의 보호 설정을 \"[[$2]]\"에서 \"[[$1]]\"(으)로 이동했습니다",
"protect-title": "\"$1\" 보호하기",
"protect-title-notallowed": "\"$1\" 문서의 보호 수준 보기",
- "prot_1movedto2": "[[$1]] 문ì\84\9c를 [[$2]] 문ì\84\9cë¡\9c ì\98®ê¹\80",
+ "prot_1movedto2": "[[$1]] 문ì\84\9c를 [[$2]] 문ì\84\9cë¡\9c ì\9d´ë\8f\99í\95¨",
"protect-badnamespace-title": "보호할 수 없는 이름공간",
"protect-badnamespace-text": "이 이름공간에 있는 문서는 보호할 수 없습니다.",
"protect-norestrictiontypes-text": "이 문서는 제한 유형을 사용할 수 없음으로 보호할 수 없습니다.",
"ipb-confirm": "차단 확인",
"badipaddress": "잘못된 IP 주소",
"blockipsuccesssub": "차단 완료",
- "blockipsuccesstext": "[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다.<br />\n차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.",
+ "blockipsuccesstext": "[[Special:Contributions/$1|$1]]님이 차단되었습니다.<br />\n차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.",
"ipb-blockingself": "자기 자신을 차단하려고 합니다! 정말로 실행할까요?",
"ipb-confirmhideuser": "사용자를 차단하면서 \"사용자 숨기기\" 설정을 선택했습니다. 모든 기록에서 이 사용자의 사용자 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?",
"ipb-confirmaction": "그것을 정말로 하기 원한다면 아래에 있는 \"{{int:ipb-confirm}}\" 부분에 체크하세요",
"unblockip": "사용자 차단 해제",
"unblockiptext": "아래의 양식에 차단 해제하려는 IP 주소나 사용자 이름을 입력하세요.",
"ipusubmit": "차단 해제",
- "unblocked": "[[User:$1|$1]] 사용자의 차단을 해제했습니다.",
+ "unblocked": "[[User:$1|$1]]님의 차단을 해제했습니다.",
"unblocked-range": "$1 대역이 차단 해제되었습니다.",
"unblocked-id": "$1 차단이 해제되었습니다.",
- "unblocked-ip": "[[Special:Contributions/$1|$1]] 사용자가 차단 해제되었습니다.",
+ "unblocked-ip": "[[Special:Contributions/$1|$1]]님이 차단 해제되었습니다.",
"blocklist": "차단된 사용자 목록",
"ipblocklist": "차단된 사용자",
"ipblocklist-legend": "차단된 사용자 찾기",
"createaccountblock": "계정 만들기 금지됨",
"emailblock": "이메일 차단됨",
"blocklist-nousertalk": "자신의 토론 문서 편집 불가",
- "ipblocklist-empty": "차단된 사용자가 없습니다.",
+ "ipblocklist-empty": "차단 목록이 비어 있습니다.",
"ipblocklist-no-results": "요청한 IP 주소나 사용자는 차단되지 않았습니다.",
"blocklink": "차단",
"unblocklink": "차단 해제",
"change-blocklink": "차단 설정 바꾸기",
"contribslink": "기여",
"emaillink": "이메일 보내기",
- "autoblocker": "당신의 IP 주소는 최근에 \"[[User:$1|$1]]\" 사용자가 사용하였기 때문에 자동으로 차단되었습니다.\n$1님이 차단된 이유는 다음과 같습니다: \"$2\"",
+ "autoblocker": "당신의 IP 주소는 최근에 \"[[User:$1|$1]]\"님이 사용하였기 때문에 자동으로 차단되었습니다.\n$1님이 차단된 이유는 다음과 같습니다: \"$2\"",
"blocklogpage": "차단 기록",
"blocklog-showlog": "이 사용자는 과거에 차단된 기록이 있습니다.\n해당 사용자의 차단 기록은 다음과 같습니다:",
"blocklog-showsuppresslog": "이 사용자는 과거에 차단된 적이 있으며, 그 기록이 숨겨져 있습니다.\n해당 사용자의 차단 기록은 다음과 같습니다:",
"lockfilenotwritable": "데이터베이스 잠금 파일에 쓰기 권한이 없습니다.\n데이터베이스를 잠그거나 잠금 해제하려면, 웹 서버에서 이 파일의 쓰기 권한을 설정해야 합니다.",
"databaselocked": "데이터베이스가 이미 잠겨 있습니다.",
"databasenotlocked": "데이터베이스가 잠겨 있지 않습니다.",
- "lockedbyandtime": "({{GENDER:$1|$1}} 사용자가 $2 $3에 잠금)",
+ "lockedbyandtime": "({{GENDER:$1|$1}}님이 $2 $3에 잠금)",
"move-page": "$1 이동",
"move-page-legend": "문서 이동",
- "movepagetext": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c 문ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94ê¾¸ê³ ëª¨ë\93 ì\97ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c 문ì\84\9cë¡\9c ì\98®ê¸¸ 수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 되고,\n원래 이름을 가리키는 넘겨주기는 자동으로 갱신됩니다.\n만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 할 책임이 있습니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 이동한 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
- "movepagetext-noredirectfixer": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c 문ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94ê¾¸ê³ ëª¨ë\93 ì\97ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c 문ì\84\9cë¡\9c ì\9d´ë\8f\99í\95 ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9b\90ë\9e\98ì\9d\98 문ì\84\9cë\8a\94 ì\83\88 문ì\84\9cë¡\9c ë\84\98겨주ë\8a\94 ë§\81í\81¬ë¡\9cë§\8c ë\82¨ê²\8c ë\90©ë\8b\88ë\8b¤.\n[[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ì\99\80 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]를 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\në\8b¹ì\8b ì\9d\80 ë§\81í\81¬ì\99\80 ê°\80리í\82¤ë\8a\94 ë\8c\80ì\83\81ì\9d´ ì\84\9cë¡\9c ì\9d¼ì¹\98í\95\98ë\8f\84ë¡\9d í\95´ì\95¼ í\95 ì±\85ì\9e\84ì\9d´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\n\në§\8cì\95½ ì\9d´ë¯¸ ì\9e\88ë\8a\94 문ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ì\9e\85ë ¥í\96\88ì\9d\84 ë\95\8cë\8a\94 ê·¸ 문ì\84\9cê°\80 ë\84\98겨주기 문ì\84\9cì\9d´ê³ 문ì\84\9c ì\97ì\82¬ê°\80 ì\97\86ì\96´ì\95¼ë§\8c ì\9d´ë\8f\99ì\9d´ ë\90©ë\8b\88ë\8b¤. ê·¸ë \87ì§\80 ì\95\8aì\9d\84 ê²½ì\9a°ì\97\90ë\8a\94 ì\9d´ë\8f\99ë\90\98ì§\80 <strong>ì\95\8aì\8aµë\8b\88ë\8b¤</strong>.\nì\9d´ê²\83ì\9d\80 ì\8b¤ì\88\98ë¡\9c ì\98®ê¸´ 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
+ "movepagetext": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c 문ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94ê¾¸ê³ ëª¨ë\93 ì\97ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c 문ì\84\9cë¡\9c ì\9d´ë\8f\99í\95 수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 되고,\n원래 이름을 가리키는 넘겨주기는 자동으로 갱신됩니다.\n만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 할 책임이 있습니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 이동한 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
+ "movepagetext-noredirectfixer": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c 문ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94ê¾¸ê³ ëª¨ë\93 ì\97ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c 문ì\84\9cë¡\9c ì\9d´ë\8f\99í\95 ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.\nì\9b\90ë\9e\98ì\9d\98 문ì\84\9cë\8a\94 ì\83\88 문ì\84\9cë¡\9c ë\84\98겨주ë\8a\94 ë§\81í\81¬ë¡\9cë§\8c ë\82¨ê²\8c ë\90©ë\8b\88ë\8b¤.\n[[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ì\99\80 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]를 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\në\8b¹ì\8b ì\9d\80 ë§\81í\81¬ì\99\80 ê°\80리í\82¤ë\8a\94 ë\8c\80ì\83\81ì\9d´ ì\84\9cë¡\9c ì\9d¼ì¹\98í\95\98ë\8f\84ë¡\9d í\95´ì\95¼ í\95 ì±\85ì\9e\84ì\9d´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\n\në§\8cì\95½ ì\9d´ë¯¸ ì\9e\88ë\8a\94 문ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ì\9e\85ë ¥í\96\88ì\9d\84 ë\95\8cë\8a\94 ê·¸ 문ì\84\9cê°\80 ë\84\98겨주기 문ì\84\9cì\9d´ê³ 문ì\84\9c ì\97ì\82¬ê°\80 ì\97\86ì\96´ì\95¼ë§\8c ì\9d´ë\8f\99ì\9d´ ë\90©ë\8b\88ë\8b¤. ê·¸ë \87ì§\80 ì\95\8aì\9d\84 ê²½ì\9a°ì\97\90ë\8a\94 ì\9d´ë\8f\99ë\90\98ì§\80 <strong>ì\95\8aì\8aµë\8b\88ë\8b¤</strong>.\nì\9d´ê²\83ì\9d\80 ì\8b¤ì\88\98ë¡\9c ì\9d´ë\8f\99í\95\9c 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
"movepagetalktext": "이 칸에 체크하면, 딸린 토론 문서가 자동으로 이동됩니다. 다만 비어있지 않은 토론 문서가 있다면 이동되지 않습니다.\n\n이러한 경우에는 수동으로 이동하거나 합쳐야 합니다.",
"moveuserpage-warning": "<strong>경고:</strong> 사용자 문서를 이동하려고 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 <strong>않는다</strong>는 점을 참고하세요.",
"movecategorypage-warning": "<strong>경고:</strong> 분류 문서를 이동하려고 합니다. 해당 문서만 이동되고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
"movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
- "movenotallowed": "문ì\84\9c를 ì\98®ê¸¸ 권한이 없습니다.",
- "movenotallowedfile": "í\8c\8cì\9d¼ì\9d\84 ì\98®ê¸¸ 권한이 없습니다.",
- "cant-move-user-page": "ì\82¬ì\9a©ì\9e\90 문ì\84\9c를 ì\98®ê¸¸ 권한이 없습니다 (하위 문서는 예외).",
- "cant-move-to-user-page": "문ì\84\9c를 ì\82¬ì\9a©ì\9e\90 문ì\84\9cë¡\9c ì\98®ê¸¸ 권한이 없습니다 (하위 문서는 예외).",
- "cant-move-category-page": "ë¶\84ë¥\98 문ì\84\9c를 ì\98®ê¸¸ 권한이 없습니다.",
- "cant-move-to-category-page": "문ì\84\9c를 ë¶\84ë¥\98 문ì\84\9cë¡\9c ì\98®ê¸¸ 권한이 없습니다.",
+ "movenotallowed": "문ì\84\9c를 ì\9d´ë\8f\99í\95 권한이 없습니다.",
+ "movenotallowedfile": "í\8c\8cì\9d¼ì\9d\84 ì\9d´ë\8f\99í\95 권한이 없습니다.",
+ "cant-move-user-page": "ì\82¬ì\9a©ì\9e\90 문ì\84\9c를 ì\9d´ë\8f\99í\95 권한이 없습니다 (하위 문서는 예외).",
+ "cant-move-to-user-page": "문ì\84\9c를 ì\82¬ì\9a©ì\9e\90 문ì\84\9cë¡\9c ì\9d´ë\8f\99í\95 권한이 없습니다 (하위 문서는 예외).",
+ "cant-move-category-page": "ë¶\84ë¥\98 문ì\84\9c를 ì\9d´ë\8f\99í\95 권한이 없습니다.",
+ "cant-move-to-category-page": "문ì\84\9c를 ë¶\84ë¥\98 문ì\84\9cë¡\9c ì\9d´ë\8f\99í\95 권한이 없습니다.",
"newtitle": "새 제목:",
"move-watch": "원래 문서와 대상 문서를 주시하기",
"movepagebtn": "문서 이동",
"movepage-moved-redirect": "넘겨주기 문서를 만들었습니다.",
"movepage-moved-noredirect": "넘겨주기 문서를 남기지 않았습니다.",
"articleexists": "문서가 이미 존재하거나 이름이 올바르지 않습니다.\n다른 이름을 선택하세요.",
- "cantmove-titleprotected": "ì\83\88ë¡\9cì\9a´ ì \9c목ì\9c¼ë¡\9c 문ì\84\9c를 ë§\8cë\93\9cë\8a\94 ê²\83ì\9d´ ê¸\88ì§\80ë\90\98ì\96´ ì\9e\88ì\96´ 문ì\84\9c를 ì\98®ê¸¸ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤",
+ "cantmove-titleprotected": "ì\83\88ë¡\9cì\9a´ ì \9c목ì\9c¼ë¡\9c 문ì\84\9c를 ë§\8cë\93\9cë\8a\94 ê²\83ì\9d´ ê¸\88ì§\80ë\90\98ì\96´ ì\9e\88ì\96´ 문ì\84\9c를 ì\9d´ë\8f\99í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.",
"movetalk": "딸린 토론 문서도 이동하기",
"move-subpages": "하위 문서도 이동 ($1개까지)",
"move-talk-subpages": "토론 문서의 하위 문서도 이동하기 ($1개까지)",
"movepage-page-exists": "$1 문서가 이미 존재하므로 자동으로 덮어쓸 수 없습니다.",
"movepage-page-moved": "\"$1\" 문서를 \"$2\" 문서로 이동했습니다.",
- "movepage-page-unmoved": "$1 문ì\84\9c를 $2 문ì\84\9cë¡\9c ì\98®ê¸¸ 수 없습니다.",
+ "movepage-page-unmoved": "$1 문ì\84\9c를 $2 문ì\84\9cë¡\9c ì\9d´ë\8f\99í\95 수 없습니다.",
"movepage-max-pages": "{{PLURAL:$1|문서}}를 최대 $1개 이동했으며 나머지 문서는 자동으로 이동하지 않습니다.",
"movelogpage": "이동 기록",
- "movelogpagetext": "ì\95\84ë\9e\98ë\8a\94 ì\98®ê²¨ì§\84 모든 문서의 목록입니다.",
+ "movelogpagetext": "ì\95\84ë\9e\98ë\8a\94 ì\9d´ë\8f\99ë\90\9c 모든 문서의 목록입니다.",
"movesubpage": "{{PLURAL:$1|하위 문서}}",
"movesubpagetext": "이 문서에는 다음 {{PLURAL:$1|하위 문서}} $1개가 있습니다.",
"movenosubpage": "이 문서에는 하위 문서가 존재하지 않습니다.",
"delete_and_move_text": "== 삭제 필요 ==\n이동하려는 제목으로 된 \"[[:$1]]\" 문서가 이미 존재합니다.\n삭제하고 이동할까요?",
"delete_and_move_confirm": "네. 문서를 삭제합니다",
"delete_and_move_reason": "\"[[$1]]\"에서 문서를 이동하기 위해 삭제함",
- "selfmove": "ì\9b\90ë\9e\98 ì \9c목과 ì\9d´ë\8f\99í\95\98ë ¤ë\8a\94 ì \9c목ì\9d´ ê°\99ì\8aµë\8b\88ë\8b¤.\nê°\99ì\9d\80 ì \9c목ì\9c¼ë¡\9cë\8a\94 문ì\84\9c룰 ì\98®ê¸¸ 수 없습니다.",
+ "selfmove": "ì\9b\90ë\9e\98 ì \9c목과 ì\9d´ë\8f\99í\95\98ë ¤ë\8a\94 ì \9c목ì\9d´ ê°\99ì\8aµë\8b\88ë\8b¤.\nê°\99ì\9d\80 ì \9c목ì\9c¼ë¡\9cë\8a\94 문ì\84\9c룰 ì\9d´ë\8f\99í\95 수 없습니다.",
"immobile-source-namespace": "\"$1\" 이름공간에 속한 문서는 이동시킬 수 없습니다.",
"immobile-target-namespace": "\"$1\" 이름공간에 속한 문서는 이동시킬 수 없습니다.",
- "immobile-target-namespace-iw": "ì\9d¸í\84°ì\9c\84í\82¤ ë§\81í\81¬ë¥¼ ë\84\98ì\96´ 문ì\84\9c를 ì\98®ê¸¸ 수 없습니다.",
- "immobile-source-page": "ì\9d´ 문ì\84\9cë\8a\94 ì\98®ê¸¸ 수 없습니다.",
- "immobile-target-page": "새 이름으로 옮길 수 없습니다.",
+ "immobile-target-namespace-iw": "ì\9d¸í\84°ì\9c\84í\82¤ ë§\81í\81¬ë¥¼ ë\84\98ì\96´ 문ì\84\9c를 ì\9d´ë\8f\99í\95 수 없습니다.",
+ "immobile-source-page": "ì\9d´ 문ì\84\9cë\8a\94 ì\9d´ë\8f\99í\95 수 없습니다.",
+ "immobile-target-page": "목표 제목으로 이동할 수 없습니다.",
"bad-target-model": "원하는 대상은 다른 내용 모델을 사용합니다. $1에서 $2로 변환할 수 없습니다.",
- "imagenocrossnamespace": "í\8c\8cì\9d¼ì\9d\84 í\8c\8cì\9d¼ì\9d´ ì\95\84ë\8b\8c ì\9d´ë¦\84ê³µê°\84ì\9c¼ë¡\9c ì\98®ê¸¸ 수 없습니다.",
- "nonfile-cannot-move-to-file": "í\8c\8cì\9d¼ì\9d´ ì\95\84ë\8b\8c 문ì\84\9c를 í\8c\8cì\9d¼ ì\9d´ë¦\84ê³µê°\84ì\9c¼ë¡\9c ì\98®ê¸¸ 수 없습니다.",
+ "imagenocrossnamespace": "í\8c\8cì\9d¼ì\9d\84 í\8c\8cì\9d¼ì\9d´ ì\95\84ë\8b\8c ì\9d´ë¦\84ê³µê°\84ì\9c¼ë¡\9c ì\9d´ë\8f\99í\95 수 없습니다.",
+ "nonfile-cannot-move-to-file": "í\8c\8cì\9d¼ì\9d´ ì\95\84ë\8b\8c 문ì\84\9c를 í\8c\8cì\9d¼ ì\9d´ë¦\84ê³µê°\84ì\9c¼ë¡\9c ì\9d´ë\8f\99í\95 수 없습니다.",
"imagetypemismatch": "새 파일의 확장자가 원래의 확장자와 일치하지 않습니다.",
"imageinvalidfilename": "새 파일 이름이 잘못되었습니다.",
"fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
- "move-leave-redirect": "ì\98®ê¸´ 뒤 넘겨주기를 남기기",
+ "move-leave-redirect": "ì\9d´ë\8f\99í\95\9c 뒤 넘겨주기를 남기기",
"protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만 이동할 수 있도록 보호되어 있습니다.\n최근 기록을 참조를 위해 아래에 제공합니다:",
"semiprotectedpagemovewarning": "<strong>참고:</strong> 이 문서는 등록된 사용자만이 이동할 수 있도록 보호되어 있습니다.\n최근 기록 내용이 참조를 위해 아래에 제공됩니다:",
"move-over-sharedrepo": "== 파일이 존재함 ==\n[[:$1]] 파일이 공용 저장소에 있습니다. 이 이름으로 파일을 이동하면 공용의 파일을 덮어쓰게 될 것입니다.",
"tooltip-pt-anontalk": "현재 사용하는 IP 주소에 대한 토론 문서",
"tooltip-pt-preferences": "{{GENDER:|사용자}} 환경 설정",
"tooltip-pt-watchlist": "주시문서에 대한 바뀜 목록",
- "tooltip-pt-mycontris": "{{GENDER:|내}} 기여의 목록",
+ "tooltip-pt-mycontris": "{{GENDER:|내}} 기여 목록",
"tooltip-pt-anoncontribs": "이 IP 주소의 편집 목록",
"tooltip-pt-login": "꼭 로그인해야 하는 것은 아니지만, 로그인을 권장합니다.",
"tooltip-pt-logout": "로그아웃",
"anonymous": "{{SITENAME}} 익명 {{PLURAL:$1|사용자}}",
"siteuser": "{{SITENAME}} 사용자 $1",
"anonuser": "{{SITENAME}} 익명 사용자 $1",
- "lastmodifiedatby": "이 문서는 $3 사용자가 $1 $2에 마지막으로 바꾸었습니다.",
+ "lastmodifiedatby": "이 문서는 $3님이 $1 $2에 마지막으로 바꾸었습니다.",
"othercontribs": "$1의 작업을 바탕으로 합니다.",
"others": "기타",
"siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|사용자}}}} $1",
"spamprotectiontext": "스팸 필터가 문서 저장을 막았습니다.\n바깥 사이트로 연결하는 링크 중에 블랙리스트에 포함된 사이트가 있을 것입니다.",
"spamprotectionmatch": "문제가 되는 부분은 다음과 같습니다: $1",
"spambot_username": "미디어위키 스팸 정리",
- "spam_reverting": "$1(을)를 포함하지 않는 최신 버전으로 되돌림",
+ "spam_reverting": "$1에 대한 링크를 포함하지 않는 최신 버전으로 되돌림",
"spam_blanking": "모든 버전에 $1 링크를 포함하고 있어 차단함",
"spam_deleting": "모든 버전에 $1 링크를 포함하고 있어 삭제함",
"simpleantispam-label": "스팸 방지 검사입니다.\n이것을 입력하지 <strong>마세요</strong>!",
"confirmemail_success": "이메일 주소가 인증되었습니다.\n이제 [[Special:UserLogin|로그인]]해서 위키를 사용하세요.",
"confirmemail_loggedin": "이메일 주소가 인증되었습니다.",
"confirmemail_subject": "{{SITENAME}} 이메일 주소 인증",
- "confirmemail_body": "$1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정에 이메일 인증 신청을 했습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면\n아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
- "confirmemail_body_changed": "$1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정의 이메일 주소를 바꾸었습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면\n아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
- "confirmemail_body_set": "$1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정의 이메일 주소를 지정하였습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을\n활성화하려면 아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
+ "confirmemail_body": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정에 이메일 인증 신청을 했습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면\n아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
+ "confirmemail_body_changed": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정의 이메일 주소를 바꾸었습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면\n아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
+ "confirmemail_body_set": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가\n{{SITENAME}}의 \"$2\" 계정의 이메일 주소를 지정하였습니다.\n\n이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을\n활성화하려면 아래 주소를 열어서 이메일 인증을 해 주세요:\n\n$3\n\n당신의 계정이 아니라면,\n이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:\n\n$5\n\n인증 코드는 $4에 만료됩니다.",
"confirmemail_invalidated": "이메일 확인이 취소됨",
"invalidateemail": "이메일 확인 취소",
"notificationemail_subject_changed": "{{SITENAME}}의 등록된 이메일 주소가 변경되었습니다",
"notificationemail_subject_removed": "{{SITENAME}}의 등록된 이메일 주소가 제거되었습니다",
- "notificationemail_body_changed": "IP 주소 $1에 속하는 누군가가 {{SITENAME}}의 사용자 \"$2\" 계정의 이메일 주소를 \"$3\"으로 변경하였습니다.\n\n지금 이 글을 보고 계신 사용자로 추정되지만 만약 본인이 아닌 경우, 지금 바로 사이트 관리자에게 문의하십시오.",
- "notificationemail_body_removed": "IP 주소 $1에 속하는 누군가가 {{SITENAME}}의 사용자 \"$2\" 계정의 이메일 주소를 제거하였습니다.\n\n지금 이 글을 보고 계신 사용자로 추정되지만 만약 본인이 아닌 경우, 지금 바로 사이트 관리자에게 문의하십시오.",
+ "notificationemail_body_changed": "당신일 수도 있는 IP 주소 $1에 속하는 사용자가\n{{SITENAME}}의 사용자 \"$2\" 계정의 이메일 주소를 \"$3\"(으)로 바꾸었습니다.\n\n지금 이 글을 보고 계신 사용자로 추정되지만 만약 본인이 아닌 경우, 지금 바로 사이트 관리자에게 문의하십시오.",
+ "notificationemail_body_removed": "당신일 수도 있는 IP 주소 $1에 속하는 사용자가 {{SITENAME}}의 사용자 \"$2\" 계정의 이메일 주소를 제거하였습니다.\n\n지금 이 글을 보고 계신 사용자로 추정되지만 만약 본인이 아닌 경우, 지금 바로 사이트 관리자에게 문의하십시오.",
"scarytranscludedisabled": "[인터위키가 비활성되어 있습니다]",
"scarytranscludefailed": "[$1 틀을 불러오는 데에 실패했습니다]",
"scarytranscludefailed-httpstatus": "[$1 틀을 가져오는 데 실패했습니다: HTTP $2]",
"table_pager_limit_submit": "확인",
"table_pager_empty": "결과 없음",
"autosumm-blank": "문서를 비움",
- "autosumm-replace": "문ì\84\9c ë\82´ì\9a©ì\9d\84 \"$1\"ì\9c¼로 바꿈",
+ "autosumm-replace": "ë\82´ì\9a©ì\9d\84 \"$1\"(ì\9c¼)로 바꿈",
"autoredircomment": "[[$1]] 문서로 넘겨주기",
"autosumm-new": "새 문서: $1",
"autosumm-newblank": "빈 문서를 만듦",
"logentry-suppress-delete": "$1님이 $3 문서를 {{GENDER:$2|숨겼습니다}}",
"logentry-suppress-event": "$1님이 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
"logentry-suppress-revision": "$1님이 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
- "logentry-suppress-event-legacy": "$1님이 비공개적으로 $3의 항목에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}",
+ "logentry-suppress-event-legacy": "$1님이 비공개적으로 $3의 기록 항목에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}",
"logentry-suppress-revision-legacy": "$1님이 비공개적으로 $3 문서의 특정 판에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}",
"revdelete-content-hid": "내용 숨겨짐",
"revdelete-summary-hid": "편집 요약 숨겨짐",
"revdelete-restricted": "관리자에게 제한을 적용함",
"revdelete-unrestricted": "관리자에 대한 제한을 해제함",
"logentry-block-block": "$1님이 {{GENDER:$4|$3}}님을 $5 {{GENDER:$2|차단했습니다}} $6",
- "logentry-block-unblock": "$1님이 {{GENDER:$4|$3}} 사용자의 {{GENDER:$2|차단을 해제했습니다}}",
- "logentry-block-reblock": "$1 님이 {{GENDER:$4|$3}} 사용자의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
+ "logentry-block-unblock": "$1님이 {{GENDER:$4|$3}}님의 {{GENDER:$2|차단을 해제했습니다}}",
+ "logentry-block-reblock": "$1님이 {{GENDER:$4|$3}}님의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
"logentry-suppress-block": "$1님이 {{GENDER:$4|$3}} 사용자를 $5 {{GENDER:$2|차단했습니다}} $6",
- "logentry-suppress-reblock": "$1 님이 {{GENDER:$4|$3}} 사용자의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
+ "logentry-suppress-reblock": "$1님이 {{GENDER:$4|$3}}님의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
"logentry-import-upload": "$1님이 $3 문서를 파일 올리기로 {{GENDER:$2|가져왔습니다}}",
"logentry-import-upload-details": "$1님이 $3 문서 ({{PLURAL:$4|판}} $4개)를 파일 올리기로 {{GENDER:$2|가져왔습니다}}",
"logentry-import-interwiki": "$1님이 $3 문서를 다른 위키에서 {{GENDER:$2|가져왔습니다}}",
"logentry-protect-protect-cascade": "$1님이 $3 문서를 {{GENDER:$2|보호했습니다}} $4 [연쇄적]",
"logentry-protect-modify": "$1님이 $3 문서의 보호 수준을 {{GENDER:$2|바꾸었습니다}} $4",
"logentry-protect-modify-cascade": "$1님이 $3 문서의 보호 수준을 {{GENDER:$2|바꾸었습니다}} $4 [연쇄적]",
- "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-rights-rights": "$1님이 {{GENDER:$6|$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|올렸습니다}}",
"log-name-managetags": "태그 관리 기록",
"log-description-managetags": "이 문서는 [[Special:Tags|태그]]에 관한 관리 작업의 목록입니다. 이 기록에는 관리자가 직접 실행한 동작만이 기록되며, 위키 소프트웨어에 의해 태그가 생성 및 삭제되는 경우는 기록되지 않습니다.",
"logentry-managetags-create": "$1님이 \"$4\" 태그를 {{GENDER:$2|만들었습니다}}",
- "logentry-managetags-delete": "$1ë\8b\98ì\9d´ \"$4\" í\83\9c그를 ì\82ì \9cí\95\98ì\98\80습니다 ($5개 {{PLURAL:$5|판 및 기록}}에서 {{GENDER:$2|제거되었습니다}})",
+ "logentry-managetags-delete": "$1ë\8b\98ì\9d´ \"$4\" í\83\9c그를 ì\82ì \9cí\96\88습니다 ($5개 {{PLURAL:$5|판 및 기록}}에서 {{GENDER:$2|제거되었습니다}})",
"logentry-managetags-activate": "$1님이 \"$4\" 태그를 사용자나 봇이 사용하도록 {{GENDER:$2|활성화시켰습니다}}",
"logentry-managetags-deactivate": "$1님이 \"$4\" 태그를 사용자나 봇이 사용하지 못하도록 {{GENDER:$2|비활성화시켰습니다}}",
"log-name-tag": "태그 기록",
"logentry-tag-update-add-logentry": "$1님이 $3 문서의 기록 항목 $5에 $6 {{PLURAL:$7|태그}}를 {{GENDER:$2|추가했습니다}}",
"logentry-tag-update-remove-revision": "$1님이 $3 문서의 $4판에서 $8 {{PLURAL:$9|태그}}를 {{GENDER:$2|제거했습니다}}",
"logentry-tag-update-remove-logentry": "$1님이 $3 문서의 기록 항목 $5에서 $8 {{PLURAL:$9|태그}}를 {{GENDER:$2|제거했습니다}}",
- "logentry-tag-update-revision": "$1님이 $3 문서의 $4 판에서 태그를 {{GENDER:$2|업데이트했습니다}} ($6 {{PLURAL:$7|추가함}}; $8 {{PLURAL:$9|제거함}})",
+ "logentry-tag-update-revision": "$1님이 $3 문서의 $4판에서 태그를 {{GENDER:$2|업데이트했습니다}} ($6 {{PLURAL:$7|추가함}}; $8 {{PLURAL:$9|제거함}})",
"logentry-tag-update-logentry": "$1님이 $3 문서의 기록 항목 $5에 있는 태그를 {{GENDER:$2|업데이트했습니다}} ($6 {{PLURAL:$7|추가함}}; $8 {{PLURAL:$9|제거함}})",
"rightsnone": "(없음)",
"revdelete-summary": "편집 요약",
"expand_templates_generate_rawhtml": "원본 HTML 보이기",
"expand_templates_preview": "미리 보기",
"expand_templates_preview_fail_html": "<em>{{SITENAME}}에서 순수 HTML 입력을 허용한 상태에서 세션 데이터가 분실되었습니다. 그러므로 자바스크립트 공격을 예방하기 위해 미리 보기는 숨겨져 있습니다.</em>\n\n<strong>적합하게 미리 보기를 시도했다면 다시 시도해 주십시오.</strong>\n그래도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인하여 사용자의 브라우저가 이 사이트에서 쿠키를 허용하는지 확인해 주십시오.",
- "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}}에서 순수 HTML 입력을 허용한 상태에서 사용자는 로그인되어 있지 않습니다. 그러므로 자바스크립트 공격을 예방하기 위해 미리 보기는 숨겨져 있습니다.</em>\n\n<strong>적합하게 미리 보기를 시도했다면 [[Special:UserLogin|로그인]]한 다음 다시 시도해 주십시오.",
+ "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}}에서 순수 HTML 입력을 허용한 상태에서 사용자는 로그인되어 있지 않습니다. 그러므로 자바스크립트 공격을 예방하기 위해 미리 보기는 숨겨져 있습니다.</em>\n\n<strong>적합하게 미리 보기를 시도했다면 [[Special:UserLogin|로그인]]한 다음 다시 시도해 주십시오.</strong>",
"expand_templates_input_missing": "전개할 내용을 입력해야 합니다.",
"pagelanguage": "문서 언어 바꾸기",
"pagelang-name": "문서",
"listingcontinuesabbrev": "jatkuu",
"about": "Tietuo",
"article": "Šivu",
- "newwindow": "(avautuu uuvešša ikkunašša)",
+ "newwindow": "(avautuu uuvvešša ikkunašša)",
"cancel": "Keškeytä",
"moredotdotdot": "Lisyä...",
"mypage": "Šivu",
"retrievedfrom": "Lähte - \"$1\"",
"youhavenewmessages": "{{PLURAL:$3|Šiula on}} $1 ($2).",
"editsection": "kohentele",
- "editold": "kohenna",
+ "editold": "kohentele",
"viewsourceold": "näytä wikiteksti",
"editlink": "kohentele",
"viewsourcelink": "näytä lähtehkoodi",
"nstab-main": "Šivu",
"nstab-user": "Käyttäjäšivu",
"nstab-media": "Mediašivu",
- "nstab-special": "Toimintosivu",
+ "nstab-special": "Toimintošivu",
"nstab-project": "Projektišivu",
"nstab-image": "Faili",
"nstab-template": "Malli",
"databaseerror-query": "Kyšely: $1",
"databaseerror-error": "Hairahuš: $1",
"badtitle": "Šivun nimi ei kelpua",
- "badtitletext": "Šiun annetti šivunimi oli virheellini, tyhjä tahi viärin linkitetty kielienvälini tahi wikienvälini nimi.\nSiinä suattau olla yksi tahi usiempi sellani merkki, kumpasta ei voi käyttyä šivujen nimissä.",
+ "badtitletext": "Šiun pyytämä šivunimi oli virhiellini, tyhjä tahi viärin linkitetty kielienvälini tahi wikienvälini nimi.\nŠiinä šuattau olla yksi tahi ušiempi šemmoni merkki, kumpaista ei voi käyttyä šivujen nimilöissä.",
"viewsource": "näytä lähtehkoodi",
"yourname": "Käyttäjänimi:",
"userlogin-yourname": "Käyttäjänimi",
"userlogin-yourname-ph": "Kirjuta käyttäjänimi",
"yourpassword": "Tunnuššana:",
- "userlogin-yourpassword": "Tunnuššana",
- "userlogin-yourpassword-ph": "Kirjuta tunnuššana",
- "createacct-yourpassword-ph": "Kirjuta tunnuššana",
- "createacct-yourpasswordagain": "Vahvista tunnuššana",
- "createacct-yourpasswordagain-ph": "Kirjuta tunnuššana uuvveštah",
+ "userlogin-yourpassword": "Šalašana",
+ "userlogin-yourpassword-ph": "Kirjuta šalašana",
+ "createacct-yourpassword-ph": "Kirjuta šalašana",
+ "createacct-yourpasswordagain": "Vahvista šalašana",
+ "createacct-yourpasswordagain-ph": "Kirjuta šalašana uuvveštah",
"userlogin-remembermypassword": "Pijä miut kirjuttautunuona",
"login": "Kirjauvu šiämeh",
"nav-login-createaccount": "Kirjauvu šiämeh / rekisteriyvy",
"userlogin-joinproject": "Liity {{SITENAME}}",
"createaccount": "Luaji käyttäjätili",
"gotaccountlink": "Kirjauvu šiämeh",
- "userlogin-resetpassword-link": "Unohitko tunnuššanan?",
+ "userlogin-resetpassword-link": "Unohitko šalašanan?",
"userlogin-helplink2": "Apu kirjuttautumiseh",
- "createacct-emailoptional": "Sähköpostiadressi (ei tarviče vältämättäh kirjuttua)",
- "createacct-email-ph": "Kirjuta oma sähkopostiadressi",
+ "createacct-emailoptional": "Šähköpoštiošoiteh (ei tarviče välttämättä kirjuttua)",
+ "createacct-email-ph": "Kirjuta oma šähköpoštiošoiteh",
"createaccountreason": "Šyy:",
"createacct-reason": "Šyy",
"createacct-submit": "Luaji oma käyttäjätunnuš",
"passwordreset": "Kirjuta šalašana uuvveštah",
"passwordreset-username": "Käyttäjänimi:",
"passwordreset-domain": "Domain:",
- "bold_sample": "Sankie teksta",
- "bold_tip": "Sankie teksta",
+ "bold_sample": "Lihavointa",
+ "bold_tip": "Lihavointa",
"italic_sample": "Kuršivoitu teksti",
"italic_tip": "Kuršivointa",
"link_sample": "Linkki",
"link_tip": "Šiämilinkki",
"extlink_sample": "http://www.example.com linkin nimi",
- "extlink_tip": "Ulkohini linkki (musta http:// alkuh)",
- "headline_sample": "Rupriekkatekšta",
- "headline_tip": "Tašon 2 rupriekka",
+ "extlink_tip": "Ulkopuolini linkki (muissa laittua http:// alkuh)",
+ "headline_sample": "Očikkoteksti",
+ "headline_tip": "Tašon 2 očikko",
"nowiki_sample": "Lisyä täh teksti, kumpaista ei pijä korjata",
"nowiki_tip": "Penkuo wiki-korjaušta",
"image_tip": "Tallennettu faili",
"media_tip": "Linkki failih",
"sig_tip": "Teijän allakirjutuš ta aika",
- "hr_tip": "Horišontualini viiva (älä käytä liijakši)",
+ "hr_tip": "Vuakašuora viiva (elä käytä liijakši)",
"summary": "Yhtehveto",
- "minoredit": "Tämä on pieni muutoš",
+ "minoredit": "Tämä on pieni kohennuš",
"watchthis": "Tarkkaile tätä šivuo",
"savearticle": "Tallenna šivu",
"showpreview": "Esikačo",
"blockednoreason": "ei šyytä annettu",
"loginreqlink": "kirjauvu šiämeh",
"newarticle": "(Uuši)",
- "newarticletext": "Olet piätynyn šivulla, kumpasta ei ole. Ku luatie šivu, rupie kirjuttamah alla olijah juaššiekkah (kačo [$1 ohjavošivulta] lisätietuo).\nKu ollet piätynyn tänne petties, käytä livaimen <strong>mennä järilleh</strong>-toimintuo.",
+ "newarticletext": "Linkki toi šivulla, kumpaista ei vielä ole.\nVoit luuvva šivun kirjuttamalla alla olijah ikkunah (kačo [$1 ohješivulta] lisätietoja). \nJoš et haluo luuvva šivuo, käytä šelaimen paluutoimintuo.",
"noarticletext": "Tällä šivulla ei ole juuri nyt tekstie.\nVoit [[Special:Search/{{PAGENAME}}|eččie šivun nimellä]] muilta šivuilta,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie šitä koškijua logie],\ntahi [{{fullurl:{{FULLPAGENAME}}|action=edit}} luuvva tämän šivun]</span>.",
"noarticletext-nopermission": "Tällä šivulla ei ole juuri nyt tekstie.\nVoit [[Special:Search/{{PAGENAME}}|eččie šivun nimellä]] muilta šivuilta, tahi <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie šivuo koškijua logie]</span>, ka šiula ei ole oikeutta luuvva tätä šivuo.",
- "editing": "Kohennellah sivuu $1",
- "creating": "Luajitah šivuu \"$1\"",
+ "editing": "Kohennellah šivuo $1",
+ "creating": "Luajitah šivuo \"$1\"",
"editingsection": "Kohennellah $1 (alaluku)",
"templatesused": "Tällä šivulla {{PLURAL:$1|käytetty malli|käytetyt mallit}}:",
"template-protected": "(šuojattu)",
"template-semiprotected": "(ošittain šuojattu)",
"hiddencategories": "Tämä šivu kuuluu {{PLURAL:$1|1 peitettyh kategorijah|$1 peitettylöih kategorijoih}}:",
"permissionserrorstext-withaction": "Šiula ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|šeuruavašta šyyštä|šeuruavista šyistä}}:",
- "moveddeleted-notice": "Tämä šivu on otettu iäre. Šivun iäreotanta- ta siirtoistorija ollah annettu alla viittavuksena.",
+ "moveddeleted-notice": "Tämä šivu on poistettu.\nAlla on tämän šivun poisto- ta šiirtoistorija.",
"viewpagelogs": "Näytä tämän šivun lokit",
"currentrev-asof": "Nykyni versija $1",
"revisionasof": "Versija $1",
"difference-title": "Ero šivun ”$1” versijien välillä",
"lineno": "Rivi $1:",
"editundo": "lakauttua",
- "diff-multi-sameuser": "({{PLURAL:$1|Yksi keskitason versija |$1 keskitason versijua}} samalta käyttäjältä ei näytetty)",
+ "diff-multi-sameuser": "({{PLURAL:$1|Yksi keškitasšon versija |$1 keškitašon versijua}} šamalta käyttäjältä ei näytetty)",
"searchresults": "Eččimisen tulokšet",
"searchresults-title": "Eči \"$1\"",
"prevn": "iellini {{PLURAL:$1|$1}}",
"nextn-title": "Šeuruava $1 {{PLURAL:$1|tuloš|tulokšet}}",
"shown-title": "Näytä $1 {{PLURAL:$1|tuloš|tulošta}} šivulla",
"viewprevnext": "Näytä ($1 {{int:pipe-separator}} $2) ($3)",
- "searchmenu-new": "<strong>Luaji šivu \"[[:$1]]\" täh wikih!</strong> {{PLURAL:$2|0=|Kačo niise šiun eččolla löyvetyt šivut.|Kačo niise löyvetyt ečon tulokšet.}}",
+ "searchmenu-new": "<strong>Luaji šivu \"[[:$1]]\" täh wikih!</strong> {{PLURAL:$2|0=|Kačo niise šiun ečolla löyvetyt šivut.|Kačo niise löyvetyt ečon tulokšet.}}",
"searchprofile-articles": "Šisältöšivut",
"searchprofile-images": "Multimedija",
"searchprofile-everything": "Kaikki",
"search-result-size": "$1 ({{PLURAL:$2|1 šana|$2 šanua}})",
"search-redirect": "(šiirretty $1)",
"search-section": "(alaluku $1)",
- "search-suggest": "Tarkoititko: $1",
+ "search-suggest": "Tarkotitko: $1",
"searchall": "kaikki",
"search-showingresults": "{{PLURAL:$4|Tuloš <strong>$1</strong> / <strong>$3</strong>|Tulokšet <strong>$1 - $2</strong> / <strong>$3</strong>}}",
"search-nonefound": "Kyšelyh ei löytyn tulokšie.",
"newpageletter": "U",
"boteditletter": "b",
"rc-change-size-new": "$1 {{PLURAL:$1|baitti|baittie}} muutokšien jälkeh",
- "recentchangeslinked": "Toini toišeh liittyjät kohennukšet",
+ "recentchangeslinked": "Toini toiseh liittyjät kohennukšet",
"recentchangeslinked-toolbox": "Toini toiseh liittyjät kohennukšet",
"recentchangeslinked-title": "Šivuo \"$1\" koškijat muutokšet",
"recentchangeslinked-summary": "Tämä on niijen šivujen korjaukšien luvettelo, kumpasih viittuau tämä šivu (tahi šiih luokkah kuulujat). Šivut, kumpaset kuulutah [[Special:Watchlist|teijän valvontaluvetteloh]], ollah kirjutettu <strong>lihavalla</strong>.",
"booksources-search-legend": "Eči kirjalähtehie",
"booksources-search": "Eči",
"log": "Lokit",
- "allarticles": "Kai artikkelit",
+ "allarticles": "Kaikki šivut",
"allpagessubmit": "Mäne",
"categories": "Kategorijat",
"linksearch-ok": "Ečindy",
"watchlist": "Kaččuolistu",
"mywatchlist": "Valvontaluvettelo",
"watch": "Valvo",
- "dellogpage": "Iäreotantaistorija",
+ "dellogpage": "Poistoloki",
"rollbacklink": "Tuo entini versija",
"rollbacklinkcount": "palauta $1 {{PLURAL:$1|muutoš|muutošta}}",
- "protectlogpage": "Šuojavusistorija",
+ "protectlogpage": "Šuojaušloki",
"protectcomment": "Šyy",
"restriction-edit": "Kohennuš",
"undelete-search-submit": "Ečindy",
"tooltip-namespace_association": "Valiče tämä kohta, još haluot lisätä niise valittuh nimitilah liittyjät pakina- tahi aihenimitilat",
"blanknamespace": "(Piä)",
"contributions": "{{GENDER:$1|Käyttäjän}} panoš",
- "mycontris": "Omat kohennukšet",
+ "mycontris": "Kirjutukšet",
"anoncontribs": "Omat kohennukšet",
- "month": "Täššä kuušša (tahi aijempi)",
+ "month": "Kuukauši",
"year": "Vuosi",
"sp-contributions-submit": "Ečindy",
"whatlinkshere": "Linkit tänne",
- "whatlinkshere-title": "Šivut, kumpaset košketah šivuu \"$1\"",
+ "whatlinkshere-title": "Šivut, kumpaset viitatah šivulla \"$1\"",
"whatlinkshere-page": "Šivu:",
"linkshere": "Šeuruavilta šivuilta on linkki šivulla <strong>[[:$1]]</strong>:",
"isredirect": "ohjauššivu",
"istemplate": "šisällytetty",
"isimage": "failin linkki",
- "whatlinkshere-prev": "{{PLURAL:$1|iellini|iellini $1}}",
- "whatlinkshere-next": "{{PLURAL:$1|tulija|tulija $1}}",
+ "whatlinkshere-prev": "{{PLURAL:$1|iellini|iellistä $1}}",
+ "whatlinkshere-next": "{{PLURAL:$1|tulija|tulijua $1}}",
"whatlinkshere-links": "← linkit",
"whatlinkshere-hideredirs": "$1 ohjaukšet",
"whatlinkshere-hidetrans": "$1 šisällytykšet",
"allmessages-filter-translate": "Kiännä",
"thumbnail-more": "Šuurenna",
"tooltip-pt-userpage": "{{GENDER:|Oma käyttäjäšivu}}",
- "tooltip-pt-mytalk": "Oma paginsivu",
- "tooltip-pt-preferences": "{{GENDER:|Omat ašetukset}}",
+ "tooltip-pt-mytalk": "Oma pakinašivu",
+ "tooltip-pt-preferences": "{{GENDER:|Omat ašetukšet}}",
"tooltip-pt-watchlist": "Lista šivuista, kumpasien muutokšie valvot",
"tooltip-pt-mycontris": "Luvettelo {{GENDER:|šiun}} kirjutukšista",
"tooltip-pt-login": "Täššä voit kirjuttautuo, ka še ei ole välttämätöintä",
"tooltip-n-help": "Täštä voit kyšyö apuo",
"tooltip-t-whatlinkshere": "Kaikkien šivujen luvettelo, kumpasista on linkki täh šivuh",
"tooltip-t-recentchangeslinked": "Viimesimmät muokkaukšet šivuloilla, kumpasih viitatah tältä šivulta",
- "tooltip-feed-atom": "Atom-šyöte tällä sivulla",
+ "tooltip-feed-atom": "Atom-šyöteh tällä šivulla",
"tooltip-t-contributions": "Lista tämän käyttäjän kirjutukšista {{GENDER:$1|this user}}",
"tooltip-t-upload": "Tallenna failija",
"tooltip-t-specialpages": "Kaikkien erikoisien šivujen luvettelo",
"tooltip-preview": "Esikačo muutokšet. Ole hyvä, luaji šitä aina ennen tallennušta.",
"tooltip-diff": "Näytä luajitut muutokšet",
"tooltip-rollback": "Pyyhi pois viimesen kohentelijan luatimat muutokšet yhellä kertua",
- "tooltip-undo": "Kumoamini palauttau tämän muutokšen ta avuau artikkelin esikaččelussa. Yhtehvetokenttäh voi kirjuttua palautukšen šyyn.",
+ "tooltip-undo": "Kumuomini palauttau tämän muutokšen ta avuau artikkelin esikaččelušša. Yhtehvetokenttäh voi kirjuttua palautukšen šyyn.",
"tooltip-summary": "Kirjuta lyhyt kuvauš",
"simpleantispam-label": "Anti-spam-tarkissuš. \n<strong>älä</strong> täytä tätä!",
"pageinfo-toolboxlink": "Šivun tiijot",
"svg-long-desc": "SVG-faili, oletuštarkkuš $1 × $2 pikselie, failin koko: $3",
"show-big-image": "Alkuperäni faili",
"show-big-image-preview": "Tämän failin koko: $1.",
- "show-big-image-other": "{{PLURAL:$2|Toini resolutija|Toiset resolutijat}}: $1.",
+ "show-big-image-other": "{{PLURAL:$2|Toini resol'uutijo|Toiset resol'uutijot}}: $1.",
"show-big-image-size": "$1 × $2 kuvapistehtä",
"ilsubmit": "Ečintä",
"metadata": "Metatiijoštot",
"metadata-help": "Failih kuulutah lisätiijot, kumpasie tavan mukah lisätäh digikameralla tahi skannerilla. Još kuvua on muokattu šen alkuperäsen luonnan jälkeh, niin eryähät parametrit voijah erota nykyseštä kuvašta.",
"metadata-fields": "Šeuruavat metatietojen kentät ruvetah näkymäh kuvašivulla, konša metatietojen taulukko ei ole näkyvissä.\nMuut kentät ollah automattisešti piilotettuja.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"exif-orientation": "Šuunta",
- "exif-xresolution": "Kuvan resoluutijo vuakašuorašša",
- "exif-yresolution": "Vertikualini resolutsija",
+ "exif-xresolution": "Kuvan resol'uutijo vuakašuorašša",
+ "exif-yresolution": "Pistyšuora resol'uutijo",
"exif-datetime": "Failin muutokšen päivä ta aika",
"exif-make": "Kameran valmistaja",
"exif-model": "Kameran malli",
"tagline": "Uß {{GRAMMAR:Dativ | {{ucfirst:{{SITENAME}}}}}}",
"help": "Hölp",
"search": "Söhke",
+ "search-ignored-headings": " #<!-- Lohß heh di Reih jenou esu, wi se es --> <pre>\n# Övverschreffte, di beim Söhke överjange wähde.\n# Änderonge werke vun däm Momang aan, woh di Sigg met dä Övverschreff neu önersöhk weed.\n# Dat kann De sellver aanstivvelle, endäm dat De di Sigg afscheijschere deihß, derbei moß De nix draan verändert han.\n# Syntax:\n# * Alles, wat en ener reih henger „#“ schteiht, bedüüg nix.\n# * Läddeje Reihje bedüüge nix.\n# * Reije met jät dren sin jenou de Övverschreffte, di nit opjenumme wääde, met jruuße un kleine Schreff.\nWäbsigge\nLohr och noh\n #</pre> <!-- Lohß heh di Reihj jenou esu, wi se es -->",
"searchbutton": "em Tex",
"go": "Lohß Jonn!",
"searcharticle": "Sigg",
"databaseerror-query": "Opdraach: $1",
"databaseerror-function": "Fonxjuhn: $1",
"databaseerror-error": "Fähler: $1",
+ "transaction-duration-limit-exceeded": "Domedd et Dahtebangk-Koppehre zoh doll henger her hengk, ham_mer heh dä Vörjang affjebroche, weijl dä met $1 de zweijte Jräns vun $2 övverschredde hät.\n\nWann De vill Saache op eijmohl aam Änndere bes, versöhk ens schtatt dämm en Aanzahl kleijnere Ännderonge.",
"laggedslavemode": "<strong>Opjepass:</strong> Künnt sin, dat heh nit dä neuste Stand vun dä Sigg aanjezeich weed.",
"readonly": "De Daatebank es jesperrt",
"enterlockreason": "Jevv aan, woröm un för wie lang dat de Daatebank jesperrt wääde soll",
- "readonlytext": "De Daatebank es jesperrt. Neu Saache dren avspeichere jeiht jrad nit, un ändere och nit. Dä Jrund: „$1“",
+ "readonlytext": "De Dahtebangk es jeschpächt. Neu Saache dren avschpeijschere jeiht jrahd nit, un et Ändere och nit. Künnt sin wähje en rutihnemähßejje Waadong, un dernoh es alles widder zerögg op Nommahl.\n\nDä Verantwootlesche doför hät beim Deeschmaache als Jrond aanjejovve: „$1“.",
"missing-article": "Dä Tex för de Sigg „$1“ $2 kunnte mer nit en de Daatebank fenge.\nDe Sigg es velleisch fottjeschmeße udder ömjenannt woode.\nWann dat nidd esu sin sullt, dann had_Der velleich ene Fähler em Projramm vum Wikke jefonge.\nVerzälld et enem [[Special:ListUsers/sysop|Wiki_Köhbeß]],\nun doht em och dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> vun dä Sigg heh sare.",
"missingarticle-rev": "(Väsjohn Numero: $1)",
"missingarticle-diff": "(Ongerscheed zwesche de Versione $1 un $2)",
"readonly_lag": "De Daatebank es för en koote Zigg automattesch jesperrt, för de Daate vun de ongerjeodente Rääschner mem Houprääschner avzejliiche.",
+ "nonwrite-api-promise-error": "Di Kopp-Reihj „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Promise-Non-Write-API-Action</code>“ wood mem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol\">HTTP</i> jeschek, ävver di Aanfrohch jingk aan e <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>-Moduhl zom Schrihve.",
"internalerror": "De Wiki-Soffwär hät ene Fähler jefunge",
"internalerror_info": "Enne ennere Fäähler en de ẞoffwäer es opjetrodde: $1",
"internalerror-fatal-exception": "Ene schlemme Fähler vun dä Zoot „$1“ es opjetrodde.",
"mypreferencesprotected": "Do häs nit dat Rääsch, Ding Enschtällonge ze verändere.",
"ns-specialprotected": "{{int:nstab-special}}e künne mer nit ändere.",
"titleprotected": "Di Övverschreff för en Sigg eß fum [[User:$1|$1]] verbodde woode, un der Jrond wohr: „$2“",
- "filereadonlyerror": "Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeshtand „$2“ bloß för ze Lässe doh es.\n\nDä Verantwootlesche doför hät beim Deeschmaache als Jrond aanjejovve: „$3“",
+ "filereadonlyerror": "Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeschtand „$2“ för bloß ze Lässe ennjeschtalld es.\n\nDä Verantwootlesche doför hät beim Deeschmaache als Jrond aanjejovve: „$3“.",
"invalidtitle-knownnamespace": "„$3“ es en onjöltijje Övverschreff för em Appachtemang „$2“",
"invalidtitle-unknownnamespace": "„$2“ es sn onjöltijje Övverschreff em onbikannte Appachtemang met dä Nommer $1",
"exception-nologin": "Nit enjelogg",
"createacct-email-ph": "Jiv Ding Addräß för de <i lang=\"en\">e-mail</i> en!",
"createacct-another-email-ph": "Jivv en Addräß för de <i lang=\"en\" xml:lang=\"en\">e-mail</i> aan",
"createaccountmail": "Scheck mer en <i lang=\"en\">e-mail</i> met enem neu ußjedaachte Paßwood op Zick",
+ "createaccountmail-help": "Kammer ennsäzze, öm ene Zohjang föe ene Anndere Metmaacher aanzelähje, der ohne dat Paßwoot känne ze lihre.",
"createacct-realname": "Dinge börjerlesche Nahme, kans De och fott lohße",
"createaccountreason": "Jrond:",
"createacct-reason": "Der Jrond udder Aanlaß",
"createacct-reason-ph": "Woröm deihs De noch ene Zohjang aanlääje?",
+ "createacct-reason-help": "Wadd em Logbohch för et Zohjäng Aanlähje schtonn sull",
"createacct-submit": "Lohß Jonn!",
"createacct-another-submit": "Donn jäz enne zohsäzlejje Zohjang aanlääje",
"createacct-continue-submit": "Wigger maache mem Aanmällde",
"nocookiesnew": "Dinge neue Metmaacher Name es enjerich, ävver dat automatisch Enlogge wor dann nix.\nSchad.\n{{ucfirst:{{GRAMMAR:Nom|{{SITENAME}}}}}} bruch Cookies, öm ze merke, wä enjelogg es.\nWann De Cookies avjeschald häs en Dingem Brauser, dann kann dat nit laufe.\nSök Der ene Brauser, dä et kann, dun se enschalte, un dann log Dich noch ens neu en, met Dingem neue Metmaacher Name un Passwood.",
"nocookieslogin": "{{ucfirst:{{GRAMMAR:Nominativ|{{SITENAME}}}}}} bruch <i lang=\"en\">cookies</i> för et Enlogge. Et süht esu us, als hätts De de <i lang=\"en\">cookies</i> avjeschalt. Dun se aanschalte un dann versök et noch ens. Odder söök Der ene Brauser, dä et kann.",
"nocookiesfornew": "Et wood keine Zohjang opjemaat, weil mer nit jeweß sin künne, woh de Daate her kohme.\nDinge Brauser moß <i lang=\"en\">cookies</i> enjeschalldt han.\nDonn dat prööfe, donn heh di Sigg norr_ens neu laade, un dann versöhk et norr_ens.",
+ "nocookiesforlogin": "{{int:nocookieslogin}}",
+ "createacct-loginerror": "Dä Zohjang es aanjelaat, ävver mer kunnts Desch nit automattesch enlogge. Be sesu jood un jangk mohm [[Special:UserLogin|Ennlogge vun Hand]].",
"noname": "Dat jeiht nit als ene Metmaacher Name. Jetz muss De et noch ens versöke.",
"loginsuccesstitle": "Enjelogg",
"loginsuccess": "'''Do bes jetz enjelogg {{GRAMMAR:en|{{SITENAME}}}}, un Dinge Name als ene Metmaacher es „$1“.'''",
- "nosuchuser": "Dä Metmaacher Name „$1“ wor verkihrt.\nJroß- un Kleinboochshtabe maache ene Ungerscheid!\n<br />\nJetz muss De et noch ens versöke.\nUdder donn_[[Special:CreateAccount|ene neue Metmaacher aanmelde]].",
+ "nosuchuser": "Dä Metmaacher-Name „$1“ wohr verkihrt.\nJrohß- un Kleinbohchschtahbe maache ene Ongerscheid!\nSchrihv en eeschtesch, udder donn_[[Special:CreateAccount|ene neue Metmaacher aanmälde]].",
"nosuchusershort": "Dä Metmaacher Name „$1“ wor verkihrt. Jetz muss De et noch ens versöke.",
"nouserspecified": "Dat jeiht nit als ene Metmaacher Name",
"login-userblocked": "Heh dä Kääl es jesperrt. Enlogge verbodde.",
"noemail": "Dä Metmaacher „$1“ hät en dämm sing Ennschtällonge kein <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß aanjejovve.",
"noemailcreate": "Do moß en jöltijje Adräß för Ding <i lang=\"en\">e-mail</i> aanjävve",
"passwordsent": "E neu Passwood es aan de E-Mail Adress vun däm Metmaacher „$1“ ungerwähs. Meld dich domet aan, wann De et häs. Dat ahle Passwood bliev erhalde un kann och noch jebruch wääde, bes dat De Dich et eetste Mol met däm Neue enjelogg häs.",
- "blocked-mailpassword": "Ding IP Adress es blockeet.",
+ "blocked-mailpassword": "Ding IP Adress es blockeet, Änderonge em Wikki sin verbodde. Öm nix aanbränne ze lohße, es ed och verbode, vun heh dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß et Passwoot affrohe ze lohße.",
"eauthentsent": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es jäz ungerwähs aan di Adräß en de Enschtällonge. Ih dat mih <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> verschek wääde künne, moß mer maache, wat en dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> dren schteiht, öm ze beschtähteje, dat di Adräß schtemmp.",
"throttled-mailpassword": "En Erennerung för di Passwood es alld ongerwähs, un mieh wi eimol en {{PLURAL:$1|der Schtond|$1 Schtonde|nidd ens ener Schtond}} dommer kein schecke.",
"mailerror": "Fähler beim E-Mail Verschecke: $1.",
"changepassword-success": "Et Paßwood es jeändert.",
"changepassword-throttled": "Do häs zoh öff versöhk, enzelogge. Waat $1 Ih dat De es widder probeers.",
"botpasswords": "Bot-Paßwööter",
+ "botpasswords-summary": "<strong>Bot-Paßwööter</strong> lohße ene Zohjreff obb enem Metmaacher singem Zohjang övver de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> zoh, ohne dem Houp-Zohjang sing Dahte bwnözze ze möße.\nDi Rääschte, di mer kritt, wam_mer med enem Bot-Paßwood ennlogg, künnte beschängk sin.\n\nWam_mer nit weijß, woröm mer dat donn sullt, sullt mer et wascheijnlesch nit donn. Opjepaß: Keijne sulld jehmohls welle, dat De eijn dervon oplähschß, öm ed em dann wiggerzejävve.",
"botpasswords-disabled": "Bot-Paßwööter sin ußjeschallt",
"botpasswords-no-central-id": "Öm Bot-Paßwööter bruche ze künne, moß De övve en jemeinsamme Aanmälldong ennjelogg sin.",
"botpasswords-existing": "Vörhande Bot-Paßwööter",
"botpasswords-label-cancel": "Ophüre",
"botpasswords-label-delete": "Fottschmiiße",
"botpasswords-label-resetpassword": "Paßwoot neu säze",
+ "botpasswords-label-grants": "Aanwändba Rääschte:",
+ "botpasswords-help-grants": "Jehde Ennwellejong deihjd e Räsch wigger jävve, wad enem Metmaacher övver singe Zohjang alld zohschteihjt.\nLoor op de Sigg met de [[Special:ListGrants|Tabäll met de Rääschde un Enwellejonge]], wann De mih weße wells.",
"botpasswords-label-restrictions": "Beschränkonge:",
"botpasswords-label-grants-column": "Zohjelohße",
"botpasswords-bad-appid": "„$1“ es keine jölltejje Nahme för ene Bot.",
"botpasswords-updated-body": "Dat Bot-Paßwoot för dä Bot „$1“ {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ wood veränndert.",
"botpasswords-deleted-title": "Dat Bot-Paßwood es fott",
"botpasswords-deleted-body": "Dat Bot-Paßwoot för dä Bot „$1“ {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ wood fott jeschmeße.",
+ "botpasswords-newpassword": "Et neuje Passwoot zom Ennlogge met <strong>$1</strong> es <strong>$2</strong>. Bes esu johd, dat för de Zohkonnef faßzehallde.",
+ "botpasswords-restriction-failed": "Beschrängkonge för em Bot sing Paßwoot maache et Ennlogge onmüjjelesch.",
+ "botpasswords-invalid-name": "En äm aanjejovve Nahme vum Metmaacher fähld et Trännzeijsche „$1“ för dem Bot sing Paßwoot.",
+ "botpasswords-not-exist": "Dä Metmaacher „$1“ kät keijn Paßwoot „$2“ för ene Bot.",
"resetpass_forbidden": "E Passwoot kann nit jeändert wääde.",
"resetpass_forbidden-reason": "Paßwööter kam_mer nit änndere: $1",
"resetpass-no-info": "Do mööts ad enjelogg sin, öm tiräk op di Sigg jonn ze dörve",
"passwordreset-emailtext-ip": "Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm\ne neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
"passwordreset-emailtext-user": "Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,\nför Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
"passwordreset-emailelement": "Metmaacher Name: \n$1\n\nEijmohl-Paßwoot: \n$2",
- "passwordreset-emailsentemail": "Wann dat en ennjedrahre <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun Der es, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> för der Zohjang heh verschek, öm e neu Paßwoot ze krijje.",
- "passwordreset-emailsent-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh es verschek woode. Heh dronger kanns De se lässe.",
- "passwordreset-emailerror-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh sullt verschek wääde, ävver dat Verscheke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1",
+ "passwordreset-emailsentemail": "Wann dat en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun Der es, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> för Dinge Zohjang verschek, öm e neu Paßwoot ze krijje.",
+ "passwordreset-emailsentusername": "Wann heh dä Metmaacher en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß hät, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> verschek, öm e neu Paßwoot ze krijje.",
+ "passwordreset-emailsent-capture2": "{{PLURAL:$1|En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es|De <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>s sin|Nix es}} verschek woode, öm e neu Paßwoot ze krijje. {{PLURAL:$1|Dä Nahme vum Metmaacher un dat Paßwood|Di Leß met dä Nahme un Paßwööter|Nix weed}} heh noh aanjezeijsch.",
+ "passwordreset-emailerror-capture2": "{{GENDER:$2|Däm|Däm|Däm Metmaacher|Dä|Däm}} $1 en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze scheke hät nit jeflupp: {{PLURAL:$3|Dä Nahme vum Metmaacher un dat Paßwood|Di Leß met dä Nahme un Paßwööter|Nix weed}} heh noh aanjezeijsch.",
+ "passwordreset-nocaller": "Entärne Fähler: Ene Oprohfer moß aanjejovve sin.",
+ "passwordreset-nosuchcaller": "Entärne Fähler: Dä Oprohfer „$1“ känne mer nit.",
"passwordreset-invalideamil": "Dat es en onjöltejje Addräß fö de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
+ "passwordreset-nodata": "Keine Metmaacher_Nahme un kein Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es aanjejovve woode.",
"changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
"changeemail-header": "Donn heh dat Fommulaa ußfölle, öm Ding Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze ändere. Wann De en Adräß loß wähde wells, maach dat Fäld läddesch, ih dat De dat Fommolaa loß scheks.",
- "changeemail-passwordrequired": "Do moß Ding Paßwood enjävve, öm di Änderong ze beschtähteje.",
"changeemail-no-info": "Do mööts ald enjelogg sin, öm tiräk op di Sigg jonn ze dörve",
"changeemail-oldemail": "Ding Address för de <i lang=\"en\">e-mail</i> es jäz:",
"changeemail-newemail": "Ding neue Address för de <i lang=\"en\">e-mail</i> sull wääde:",
"accmailtext": "En automattesch un zofällesch neu ußjewörfelt Passwood för dä\nMetmaacher „[[User talk:$1|$1]]“ es noh „$2“ jescheck woode.\n\nDat Passwoot för dä neue Zojang kanns De op dä {{int:Specialpage}} zom\n„[[Special:ChangePassword|{{int:resetpass}}]]“ ändere,\nwann De wider enjelogg bes.",
"newarticle": "(Neu)",
"newarticletext": "Ene Link op en Sigg, wo noch nix drop steiht, weil et se noch jar nit jitt, hät Dich noh heh jebraht.\nÖm di Sigg aanzelähje, schriev heh unge en dat Feld eren, un dun dat dann avspeichere.\nLuur op de [$1 Sigge met Hölp] noh, wann De mih doh drövver weßße wells.\nWann De jar nit heh hen kumme wollts, dann jangk zeröck op di Sigg, wo De herjekumme bes, Dinge Brauser hät ene Knopp doför.",
- "anontalkpagetext": "----\n<i>Dat heh es de Klaaf Sigg för ene namenlose Metmaacher. Dä hät sich noch keine Metmaacher Name jejovve un\nenjerich, ov deit keine bruche. Dröm bruche mer sing IP Adress öm It oder In en uns Lisste fasszehalde.\nSu en IP Adress kann vun janz vill Metmaacher jebruch wääde, un eine Metmaacher kann janz flöck\nzwesche de ungerscheidlichste IP Adresse wähßele, womöchlich ohne dat hä et merk. Wann Do jetz ene namenlose\nMetmaacher bes, un fings, dat heh Saache an Dich jeschrevve wääde, wo Do jar nix met am Hot häs, dann bes Do\nwahrscheinlich och nit jemeint. Denk villeich ens drüvver noh, datte Dich [[Special:CreateAccount|anmelde]] deis,\ndomet De dann donoh nit mieh met esu en Ömständ ze dun häs, wie de andere namenlose Metmaacher heh. Wann de aanjemelldt bes un deis [[Special:UserLogin|enlogge]], dann kam_mer Desch och fun alle andere Metmaacher ongerschejde.</i>",
+ "anontalkpagetext": "----\n<strong>Dat heh es de Klaaf Sigg för ene nahmelohse Metmaacher. Dä hät sich noch keine Metmaacher Name jejovve un enjerich, ov deit keine bruche.</strong> Dröm bruche mer sing \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß, öm It oder In en uns Lisste faßßzehalde.\nSu en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß kann vun janz vill Metmaacher jebruch wääde, un eine Metmaacher kann flöck zwesche de ungerscheidleschste <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräßw ähßele, womöchlich ohne dat hä et merk. Wann Do jetz ene nahmelohse Metmaacher bes, un fengs, dat heh Saache an Desch jeschrevve wääde, wo Do jar nix med am Hoht häs, dann bes Do\nwahrscheinlich och nit jemeijnt. Dängk velleisch ens drövver noh, datte Dich [[Special:CreateAccount|anmelds]],\ndomet De dann donoh nit mih met esu en Ömständ ze don häs, wi de andere namenlose Metmaacher heh. Wann de aanjemälldt bes un deis [[Special:UserLogin|enlogge]], dann kam_mer Desch och fun alle andere Metmaacher ongerscheijde.",
"noarticletext": "<span class=\"plainlinks\">Em Momang es keine Täx op heh dä Sigg. Jangk en de Täxte vun ander Sigge [[Special:Search/{{PAGENAME}}|noh däm Titel söhke]], udder [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} donn en de Logböscher donoh loore], udder [{{FULLURL:{{FULLPAGENAME}}|action=edit}} fang di Sigg aan] ze schrieve, udder jangk zeröck woh De heer kohms. Do hät Dinge Brauser ene Knopp för.</span>",
"noarticletext-nopermission": "Op dä Sigg es em Momang nix drop.\nDo kanns noh däm Tittel vun heh dä Sigg [[Special:Search/{{PAGENAME}}|em Tex op ander Sigge söhke]],\nudder en dä zopaß <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Logbööscher nohloore]</span>.",
"missing-revision": "En Version $1 vun dä Sigg „{{FULLPAGENAME}}“ jidd_et nit.\n\nEsu jät kütt för jewöhnlesch, wam_mer enem övverhollte Lengk ob en Sigg follesch, di zweschedren fottjeschmeße woode es.\nMih doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbooch vum Sigge Fottschmiiße].",
"previewnote": "<strong>Heh kütt blohß en Aanseesch vöraff — Ding Änderonge sin noch nidd em Wikki faßjehallde!</strong>",
"continue-editing": "Jangk tiräk nohm Plaz zom Schrieve",
"previewconflict": "Heh di Vör_Aanseesch zeisch dä Enhald vum bovvere Täxfäld.\nEsu wööd di Sigg ußsinn, wann De se jäz afschpeijschere dähts.",
- "session_fail_preview": "<strong>Schahd: Met Dinge Änderonge kunnte mer su nix aanfange.\nVersöhk et jrahd noch ens.\nWann dat widder nit flupp, dann versöhk et ens met [[Special:UserLogout|Ußlogge]] un widder Enlogge.</strong>",
- "session_fail_preview_html": "'''Schad: Ding Änderunge kunnte mer su nix met aanfange. De Daate vun Dinge Login-Säschen sin nit öntlich erüvver jekumme, oder einfach ze alt.'''\n\n''Dat Wiki heh hät rüh HTML zojelooße, dröm weed de Vör-Aansich nit jezeich. Domet solls De jeschötz wääde - hoffe mer - un Aanjreffe met Java_Skripp jäje Dinge Kompjuter künne Der nix aandun.''\n\n'''Falls för Dich söns alles jod ussüht, versök et jrad noch ens. Wann dat widder nit flupp, dann versök et ens met [[Special:UserLogout|Uslogge]] un widder Enlogge.'''",
+ "session_fail_preview": "Schahd: Met Dinge Änderonge kunnte mer su nix aanfange. De Sezongsdahte sin verschött jejange.\nDo künnts ußjelogg wohde sin.\n<strong>Bes sescher, dat De verhaftesc noch ennjelogg bes un dann versöhk et jrahd noch ens.</strong>\nWann dat widder nit flupp, dann versöhk et ens met [[Special:UserLogout|Ußlogge]] un widder Enlogge,\nun pröhf, dat Dinge Brauser <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">cookies</i> vum Wikki aannemmp.",
+ "session_fail_preview_html": "<strong>Schahd: Ding Änderonge kunnte mer su nix met aanfange. De Daate vun Dinge Login-Swzong sin nit öntlich erövver jekumme, udder einfach zoh ahl un affjeloufe.</strong>\n\nDat Wiki heh hät rüh HTML zohjelohße, dröm weed de Vör-Aansesch nit aanjezeisch. Domet solls De jeschötz wääde - hoffe mer - un Aanjreffe met Java_Skripp jäje Dinge Kompjuter künne Der nix aandon.\n\n<strong>Falls för Dich söns alles jod ussüht, versök et jrad noch ens.</strong>\nWann dat widder nit flupp, dann versök et ens met [[Special:UserLogout|Uslogge]] un widder Enlogge,\nun pröhf, dat Dinge Brauser <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">cookies</i> vum Wikki aannemmp.",
"token_suffix_mismatch": "'''Ding Änderong ham_mer nit övvernomme. Dinge Brauser hät Sazzeijsche en dä verschtoche Makkehrong för et Ändere versout. Dat paßehrt och ens, wann enne <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„ene ẞööver en de Nohberschaff, ene Zweschedrääjer udder Zwescheschpeijscher, ene Vermeddelongsrääschner“\">proxy</i>-ẞööver nit fungkßjeneet. Et Affschpeischere wöhr doh jefährlesch, do künnt dä Sigge_Enhaldt kapott bei jon.'''",
"edit_form_incomplete": "<strong>Ene Aandeil vun dämm Fommolaa es nit reeschtesch om ẞööver aanjekumme. Donn Ding Ennjahbe pröhve, reparehre, un versöhg et norrens.</strong>",
"editing": "De Sigg „$1“ ändere",
"template-semiprotected": "(halfjeschöz - tabu för neu Metmaacher un ohne Enlogge)",
"hiddencategories": "Di Sigg heh is en {{PLURAL:$1|dä verschtoche Saachjropp: |dä $1 verschtoche Saachjroppe: |keij verschtoche Saachjroppe dren.}}",
"edittools": "<!-- Dä Täx heh zeisch et Wikki onger däm Täxfeld zom „Ändere/Beärbeijde“ un beim Täxfeld vum „Huhlade“ ann. -->",
+ "edittools-upload": "-",
"nocreatetext": "Sigge neu aanläje es nor müjjelich, wann de [[Special:UserLogin|enjelogg]] bes. Der ohne kanns De ävver Sigge ändere, di ald doh sin.",
"nocreate-loggedin": "Do häs nit dat Rääch, neu Sigge aanzelääje.",
"sectioneditnotsupported-title": "Afschnedde Ändere is nit zohjelohße",
"content-model-json": "<i lang=\"en\" xml:lang=\"en\" title=\"JavaScript Object Notation\">JSON</i>",
"content-json-empty-object": "Nix dren",
"content-json-empty-array": "Nix dren",
+ "deprecated-self-close-category": "Sigge med onjölltejje <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>-Befähle, di en sesch sällf ze Äng jonn.",
+ "deprecated-self-close-category-desc": "De Sigg hädd onjölltejje <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>-Befähle, di en sesch sällf ze Äng jonn. Beijshpelle sin <code><b/></code> udder <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><span/></code>. Wat di donn, weed bahl esu verännert, dat se mem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language Version 5\">HTML5</i> zesamme paße, woh mer se en Wikkitäx it bruche sullt.",
"duplicate-args-warning": "<strong>Opjepaß:</strong> [[:$1]] röhf [[:$2]] met mih wi eijnem Wäät för der Parramehter „$3“ op. Blohß der läzde Wäät vun dänne weed opjenumme un jebruch.",
"duplicate-args-category": "Sigge met dubbelt aanjejovve Parramehtere för Schablohne.",
"duplicate-args-category-desc": "Sigge met Oprohve vun Schablohne met dubbelt aanjejovve Parramehtere dren, alsu esu jät wi <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> un <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Di Änderong schingk ald retuur jemaat woode ze sin.",
"undo-summary": "Di Änderong $1 wood {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} [[Special:Contributions/$2|$2]] ([[User talk:$2|Klaaf]]) zeröck jenomme.",
"undo-summary-username-hidden": "Nemm di Väsjohn $1 vun enem verschtoche Metmaacher widder retuhr.",
- "cantcreateaccounttitle": "Kann keine Zojang enrichte",
"cantcreateaccount-text": "Dä [[User:$3|$3]] hät verbodde, dat mer sich vun dä IP-Adress '''$1''' uß als ene neue Metmaacher aanmelde könne soll.\n\nAls Jrund för et Sperre es enjedraare: ''$2''",
"cantcreateaccount-range-text": "Ne neue Metmaacher aanmälde vun <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße em Berett vun <strong>$1</strong>, woh de Dinge dren es, wood vum {{GENDER:$3|vum|vum|vumm Metmaacher|vun dä|vum}} [[User:$3|$3]] verbodde.\nDer Jrond: <em><$2</em>\n\nDing <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß es: <strong>$4</strong>",
"viewpagelogs": "De Logböcher för heh di Sigg beloore",
"mergehistory-fail-bad-timestamp": "Dattom odder Zigg udder beeds sin nit jöltesch",
"mergehistory-fail-invalid-source": "De Quällesigg es nit jöltesch",
"mergehistory-fail-invalid-dest": "De Zihlsigg es nit jöltesch",
+ "mergehistory-fail-no-change": "Et sin kein verjange Väsjohne zesamme jelaat wohde. Doht de Parramehtere för Sigg un Zigg norr_ens pröhfe.",
"mergehistory-fail-permission": "Kein Berääschtejong, de vörreje Väsjohne zesamme ze lähle.",
"mergehistory-fail-self-merge": "De Quell-Sigg un de Ziel-Sigg sin deselve Sigg.",
"mergehistory-fail-timestamps-overlap": "De Väjsohne vun de Quällesigg kumme övverkrüz udder noh de Väsjohne vun de Zihlsigg.",
"mergehistory-comment": "„[[:$1]]“ zosamme jelaat met „[[:$2]]“ — $3",
"mergehistory-same-destination": "De Quell-Sigg un de Ziel-Sigg dörve nit deselve Sigg sinn.",
"mergehistory-reason": "Der Jrond:",
+ "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
"mergelog": "Logbohch fum Sigge zesamme Lähje",
"revertmerge": "Dat Zosammelääje widder retuhr maache",
"mergelogpagetext": "Dat heh es dat Logbohch fun de zesammejelaate Väsjohne fun Sigge",
"youremail": "E-Mail *",
"username": "{{GENDER:$1|Metmaacher|Metmaacherėnne|Metmaacher|Metmaacherėnne|Metmaacher}} Name:",
"prefs-memberingroups": "{{GENDER:$2|Bes}} en {{PLURAL:$1|de Metmaacherjrupp:|$1 Metmaacherjruppe:|keijn Metmaacherjruppe.}}",
+ "prefs-memberingroups-type": "$1",
"prefs-registration": "Aanjemäldt zigg",
"prefs-registration-date-time": "dem $2 öm $3 Uhr",
"yourrealname": "Dinge richtije Nahme *",
"saveusergroups": "Donn {{GENDER:$1|däm|dem|däm Metmaacher|dä|däm}} [[User:$1|$1]] {{GENDER:$1|sing|singe|sing|ier|sing}} Jroppe faßhalle",
"userrights-groupsmember": "Dä Metmaacher es en {{PLURAL:$1|dä Jropp:|dä Jroppe:|keine Jropp.}}",
"userrights-groupsmember-auto": "Dä Metmaacher es automattesch en {{PLURAL:$1|dä Jropp:|dä Jroppe:|keine Jropp.}}",
+ "userrights-groupsmember-type": "$1",
"userrights-groups-help": "Do kanns de Jroppe för dä Metmaacher heh änndere, ävver opjepaß:\n* E Käßje met Höksche bedüg, dat dä Metmaacher en dä Jropp es.\n* E Käßje ohne Höksche bedüg, dat dä Metmaacher nit en dä Jropp es.\n* E Käßje met Stähnsche donävve bedüg, dat De dat Rääsch zwa ändere, ävver de Änderong nit mih zeröck nämme kanns.",
"userrights-reason": "Aanlaß odder Jrund:",
"userrights-no-interwiki": "Do häs nit dat Rääsch, Metmaacher ier Rääschte in ander Wikis ze ändere.",
"grant-patrol": "Änderonge aan Sigge nohkike",
"grant-protect": "Sigge schöze un der Schoz wider ophävve",
"grant-rollback": "Änderonge aan Sigge retuhr maache",
- "grant-sendemail": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> aan ander Metmaacher schecke",
- "grant-uploadeditmovefile": "Datteije uhlahde, ußtuusche un ömbenänne",
- "grant-uploadfile": "Neu datteije huhlahde",
+ "grant-sendemail": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> aan annder Metmaacher schecke",
+ "grant-uploadeditmovefile": "Datteije huhlahde, ußtuusche un ömbenänne",
+ "grant-uploadfile": "Neu Datteije huhlahde",
"grant-basic": "Jrondlähje Rääsch",
- "grant-viewdeleted": "Fottjeschmeße Dahte un Sigge belohre",
- "grant-viewmywatchlist": "De eije Oppaßleß ze belooere",
+ "grant-viewdeleted": "Fottjeschmeße Dahteije un Sigge belohre",
+ "grant-viewmywatchlist": "De eije Oppaßleß ze belohre",
"newuserlogpage": "Logbohch för neu Metmaachere",
"newuserlogpagetext": "He sin de Metmaacher opjelėßß, di sesh nöü aanjemäldt han.",
"rightslog": "Logbohch för Änderonge aan Metmaacher-Rääschde",
"rc_categories_any": "Öhndseijne vun dä aanjejovve Saachjroppe",
"rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
"rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes|Bytes}} noh dem Ändere",
- "newsectionsummary": "Neu Avschnet /* $1 */",
+ "newsectionsummary": "Neuje Afschnet /* $1 */",
"rc-enhanced-expand": "Einzelheite aanzeije",
"rc-enhanced-hide": "Einzelheite versteiche",
"rc-old-title": "ojinaal als „$1“ aanjelaat",
"uploaded-hostile-svg": "Mer han onseescher <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Cascading Style Sheet\">CSS</i>-Befähle en enem „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">style</code>“-Ellemänt vun dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
"uploaded-event-handler-on-svg": "Projramme för Ä'eijschneße ze behanndelle „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><$1=\"$2\"></code>“ ennzesäze es en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Datteije verbodde.",
"uploaded-href-attribute-svg": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Datteije darrev övver <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code> blohß op <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol\">HTTP://</i> udder <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol Secure - HTTP övver SSL - HTTP övver TSL\">HTTPS://</i> verlenk wähde. Heh es ävver <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><$1 $2=\"$3\"></code> dren.",
- "uploaded-href-unsafe-target-svg": "Mer han ene „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code>“-Befähl obb e onseescher Zihl „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><$1 $2=\"$3\"></code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
+ "uploaded-href-unsafe-target-svg": "Mer han ene „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code>“-Befähl obb e onseescher Zihl mem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Identifier\">URI</i> „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><$1 $2=\"$3\"></code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
"uploaded-animate-svg": "Mer han dä Befähl „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">animate</code>“ en dä huhjelahde \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge, dä ene „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code>“-Befähl verändere künnt övver de „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">from</code>“-Eijeschaff „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><$1 $2=\"$3\"></code>“.",
"uploaded-setting-event-handler-svg": "Ed es verbodde, Projramme för Ä'eijschneße ze behanndelle ennzesäze, un de Datteije, di dat donn, wähde jeschpächt. Mer han „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><$1 $2=\"$3\"></code>“ en dä huhjelahde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Scalable Vector Graphics\">SVG</i>_Dattei jefonge.",
"uploaded-setting-href-svg": "Dä Befähl „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">set</code>“ för de „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">href</code>“-Eijeschaff vun övverjeohdente Ällemänt ze säze es jeschpächt.",
"upload-too-many-redirects": "Zoh vill Ömleitunge en däm <i lang=\"en\">URL</i>",
"upload-http-error": "Ene <i lang=\"en\">HTTP</i>-Fäähler es opjetrodde: $1",
"upload-copy-upload-invalid-domain": "Fun dä Domain künne mer nix noh heh huh laade. Di es nit zohjelohße.",
+ "upload-foreign-cant-upload": "Heh dat Wikki es nit esu ennjeschtallt, dat mer Datteije en dat jewönschte Repposetohrejom vun Datteije ußerhallef vum Wikki huhlahde künnt.",
+ "upload-foreign-cant-load-config": "Mer kunnte de Enschtälonge för et Datteije-Huhlahde en e Repposetohrejom vun Datteije ußerhallef vum Wikki nit lahde.",
+ "upload-dialog-disabled": "Op heh däm Wähsch Datteije huhzelahe es heh em Wikki affjeschalldt.",
"upload-dialog-title": "Dateij huhlahde",
"upload-dialog-button-cancel": "Ophühre!",
"upload-dialog-button-done": "Jedonn",
"upload-dialog-button-upload": "Lohß Jonn!",
"upload-form-label-infoform-title": "Eijnzelheijte",
"upload-form-label-infoform-name": "Nahme",
+ "upload-form-label-infoform-name-tooltip": "En eijndeutejje Titel för di Datei, di se beschrihv un als Dattejnahme dehnt. Mer kan jewöhnlejje Schprohch met Zweschreum zwesche de Wööter nämme. Donn keine Datteijnahme-Zohsaz derbeij.",
"upload-form-label-infoform-description": "Äkliehrong",
+ "upload-form-label-infoform-description-tooltip": "Donn koot beschrihve, wat vun Belang es för dat Wärk.\nFör e Fotto, schrihv de Houpsaache op, di affjebelld sin, de Zigg un Jelähjeheid un der Plaz.",
"upload-form-label-usage-title": "Der Jebruch",
"upload-form-label-usage-filename": "Dä Dattei iehre Nahme",
"upload-form-label-own-work": "Dat es ming eije Wärk",
"upload-form-label-infoform-categories": "Saachjroppe",
"upload-form-label-infoform-date": "Dattum",
+ "upload-form-label-own-work-message-generic-local": "Esch beschtähtejjen, dadd esch heh di Dattei aam Huhlahde ben un derbeij de Bedengonge för der Dehns un de Rähjelle för de Lezänze {{GRAMMAR:em|{{ucfirst:{{SITENAME}}}}}} ennhallden.",
"upload-form-label-not-own-work-message-generic-local": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei och de Rähjelle {{GRAMMAR:vun|{{ucfirst:{{SITENAME}}}}}} ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
"upload-form-label-not-own-work-local-generic-local": "Do künnts edd och ens met dä [[Special:Upload|Schtandatt-Sigg zom Huhlahde]] versöhke welle.",
"upload-form-label-own-work-message-generic-foreign": "Esch verschtonn, dadd esch en en jemeinsamme Sammlong huh aam lahde ben un dadd sesch dat met dä Bedengonge un de Lezänzbedengonge heh verdräht.",
"uploadstash-badtoken": "Dat ze donn hät nit jeflupp. Velleich wohre Ding Daate zom Deil verschött jejange udder afjeloufe. Versöhg et nor_rens.",
"uploadstash-errclear": "Mer kunnte de Dateie nit fottschmieße.",
"uploadstash-refresh": "De Leß met de Dateie op ene neue Shtand bränge",
+ "uploadstash-thumbnail": "et Minni-Belldsche aanlohre",
"invalid-chunk-offset": "Ene onjöltijje Aanfangspungk för dä Rötsch",
"img-auth-accessdenied": "Keine Zohjang",
"img-auth-nopathinfo": "De <code xml:lang=\"en\" lang=\"en\" dir=\"rtl\">PATH_INFO</code> fäält.\nDä Webßööver es nit doför ennjerescht, di Ennfommazjuhn wigger ze jävve.\nHä künnd_op <code xml:lang=\"en\" lang=\"en\" dir=\"rtl\">CGI</code> opjebout sin, un dröm <code xml:lang=\"en\" lang=\"en\" dir=\"rtl\">img_auth</code> nit ongschtöze künne. Loor em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Handbohch] noh, wat domed es.",
"apisandbox-jsonly": "Der ohne JavaSkrepp kam_mer de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> för zom erömprobehre nit bruche.",
"apisandbox-api-disabled": "Dat <i lang=\"en\">API</i> es en heh dämm Wiki afjeschalldt.",
"apisandbox-intro": "Op heh dä Sigg kanns De met dä <strong><i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> vum MehdijaWikki singem Wäbdehns</strong> eröm schpelle.\nBeloor Der de Einzelheijte, un wi di jebruch weed, op dä iere [[mw:API:Main_page Sigg met de Verklieronge]].\nE Beischpell: [https://www.mediawiki.org/wiki/API#A_simple_example De Houpsigg holle].\nSöhk ene {{int:Apisb-label-action}} uß, öm mih Beischpelle aanjezeisch ze krijje.\nOch wann dat heh nor zom Ußprobehre es, kann dat, wat De heh mähß, et Wikki veränndere.",
- "apisandbox-unfullscreen": "Sigg aanzeije",
+ "apisandbox-fullscreen": "Om jannze Scherrem zeije",
+ "apisandbox-fullscreen-tooltip": "Maach de Sandkeß esu jruhß wi et jannze Brauser-Finster.",
+ "apisandbox-unfullscreen": "De Sigg nommahl aanzeije",
+ "apisandbox-unfullscreen-tooltip": "Maach de Sandkeß kleijner, esu dat dem Mehdijawikki sing Navvijazjuhns-Lengks zohjänglesch wähde.",
"apisandbox-submit": "Lohß jonn!",
"apisandbox-reset": "Läddesch maache",
"apisandbox-retry": "Norr_ens versöhke",
+ "apisandbox-loading": "Ben de Ennfommazjuhne för et Moduhl „$1“ vun de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> aam lahde …",
+ "apisandbox-load-error": "Ene Fähler es opjetrodde beim Lahde vun Enfommazjuhne för et \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>-Moduhl „$1“: $2",
+ "apisandbox-no-parameters": "Heh dat <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>Moduhl hät kein Parramehtere.",
"apisandbox-helpurls": "Lengks för Hölp",
"apisandbox-examples": "Bäijshpelle",
"apisandbox-dynamic-parameters": "Zohsäzlejje Parrameetere",
"apisandbox-dynamic-error-exists": "Ne Parramehter mem Nahme „$1“ ham_mer ald.",
"apisandbox-deprecated-parameters": "Övverhollte Parramehtere",
"apisandbox-submit-invalid-fields-title": "Paa Flder sin nit jöltesch",
+ "apisandbox-submit-invalid-fields-message": "Donn de makkehrte Fällder bereeschtejje un versöhg et norr_ens.",
"apisandbox-results": "Erus jekumme:",
+ "apisandbox-sending-request": "Ben en Aanfrohch aan et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> aam schecke …",
+ "apisandbox-loading-results": "Ben en Antwoot vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> aam krijje …",
+ "apisandbox-results-error": "Ene Fähler es opjetrodde beim Lahde vun dä Antwoot ob de Aanfrohch aan et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>: $1.",
"apisandbox-request-url-label": "Dä <i lang=\"en\">URL</i> vun dä Aanfrooch:",
- "apisandbox-request-time": "De Zigg vum Afroof: $1",
+ "apisandbox-request-time": "De Dooer vun däm Afroof: {{PLURAL:$1|ein Millisekond|$1 Millisekonde|kein Millisekond}}.",
"apisandbox-alert-page": "Heh op dä Sigg sin onjölltejje Aanjahbe.",
"apisandbox-alert-field": "Dä Wääd en dämm Fäld heh es onjölltesch.",
"booksources": "Böcher",
"log-title-wildcard": "Sök noh Titelle, di aanfange met …",
"showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
"log-edit-tags": "Donn de Makehronge vun de ußjesöhk Enndrähsch em Logbohch beärbeide",
+ "checkbox-select": "Söhk us: $1",
"checkbox-all": "Alle",
"checkbox-none": "Keine",
"checkbox-invert": "Ußwahl ömdrihje",
"listgrouprights-namespaceprotection-header": "Beschrängkonge för Appachtemangs",
"listgrouprights-namespaceprotection-namespace": "Appachtemang",
"listgrouprights-namespaceprotection-restrictedto": "Rääsch(de) zom Verändere",
+ "listgrants": "Berääschtejonge",
+ "listgrants-grant": "Berääschtejong",
"listgrants-rights": "Rääschte",
"trackingcategories": "Saachjroppe för täschnsche Saache ze verfollje.",
"trackingcategories-summary": "Op hee dä {{int:nstab-special}} sin Saachjroppe opjeleß, di automattesch vum Wikki jevöllt wähde. Dä iehr Nahme künne övver Veränderonge aan beschtemmpte Täxte em Appachtemang {{ns:8}} faßjelaat wäde.",
"trackingcategories-msg": "Saachjropp för täschnsche Saache ze verfollje.",
"trackingcategories-name": "Dä Nohreesch udder däm Täxschtöck singe Nahme",
"trackingcategories-desc": "Bedengonge för enjeschloße ze sin",
+ "restricted-displaytitle-ignored": "Sigge met övverjange „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">{<nowiki />{DISPLAYTITLE}}</code>“-Befähle",
+ "restricted-displaytitle-ignored-desc": "Dä Sigg iere „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">{<nowiki />{DISPLAYTITLE}}</code>“-Befähl weed övverjange. Hä kütt nit zopaß met dä aktoälle Övverschreff vun dä Sigg.",
"noindex-category-desc": "Di Sigg sull vun de Wäbkrauler Robots un de Söhkmaschihne nit opjenumme wähde, weil dat Zauberwoot <code><nowiki>__NOINDEX__</nowiki></code> dren schteiht un se en enem Appachemang es, woh dat zohjelohße es.",
"index-category-desc": "Di Sigg sull vun de Wäbkrauler Robots un de Söhkmaschihne opjenumme wähde, weil dat Zauberwoot <code><nowiki>__INDEX__</nowiki></code> dren schteiht un se en enem Appachemang es, woh dat zohjelohße es, un wat nommahlerwihs nit vun de Robots dorschsöhk weed.",
"post-expand-template-inclusion-category-desc": "Nohdämm a paa Schablohne enjesaz woode sen, hät di Sigg mieh Dahte wi <code xml:lang=\"en\" lang=\"en\">$wgMaxArticleSize</code> zohlöhß. Et sin nit alle Oprohve vun Schablohne opjelöhß.",
"wlnote": "{{PLURAL:$1|Hee es de läzde Änderong uß|Hee sin de läzde <strong>$1</strong> Änderonge uß|Mer han kein Änderonge en}} de läzde {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.",
"wlshowlast": "Zeisch de läzde $1 Schtunde, $2 Dähsch aan.",
"watchlist-hide": "Verschtisch",
+ "watchlist-submit": "Aanzeije!",
+ "wlshowtime": "De Aandeijl vun e Zigg zom Aanzeije:",
"wlshowhideminor": "klein Minni-Änderonge",
"wlshowhidebots": "de Bots ehr Änderonge",
"wlshowhideliu": "de ennjeloggte Metmaacher ier Änderonge",
"wlshowhideanons": "de nahmelohse Metmaacher ier Änderonge",
"wlshowhidepatr": "de nohjelohrte Änderonge",
"wlshowhidemine": "ming eije Änderonge",
+ "wlshowhidecategorization": "de Sigge ier Ennohdenong",
"watchlist-options": "Eijeschaffte fun de Oppassless",
"watching": "Drobb oppaßße…",
"unwatching": "Nimmih drobb oppaßße",
"delete-confirm": "„$1“ fottschmieße",
"delete-legend": "Fottschmieße",
"historywarning": "<strong>Opjepass:</strong> Di Sigg, di De fott schmiiße wells, hät {{PLURAL:$1|ein ällder Väsjohn|ald $1 ällder Väsjohne|jaa kein ällder Väsjohne}}.",
+ "historyaction-submit": "Aanzeije!",
"confirmdeletetext": "Do bes koot dovör, en Sigg för iiwich fottzeschmiiße. Dobei verschwind och de janze Verjangeheit vun dä Sigg us de Dahtebangk, met all ehr Änderonge un Metmaacher Nahme, un all dä Opwand, dä do dren stich. Do moß heh jäz beschtähteje, dat de verschteihs, wat dat bedügg, un dat De weiß, wat Do do mähs.\n<strong>Dun et blohß, wann dat met de [[{{MediaWiki:Policy-url}}|Rääjelle]] verhaftech zosamme jeiht!</strong>",
"actioncomplete": "Jedonn!",
"actionfailed": "Dat es donevve jejange",
"rollbacklinkcount": "{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderonge}} schtantepee retuur nämme",
"rollbacklinkcount-morethan": "{{PLURAL:$1|Mih wi ein Änderong|Övver $1 Änderonge|Kein Änderonge}} schtantepee retuur nämme",
"rollbackfailed": "Dat Zeröcknemme jingk scheiv",
+ "rollback-missingparam": "Doh fähle nühdejje Parramehtere",
"cantrollback": "De läzde Änderong zeröckzenemme es nit müjjelich. Dä läzde Schrihver es dä eijnzeje, dä aan dä Sigg heh jht jedonn hät!",
"alreadyrolled": "Mer künne de letzte Änderonge vun dä Sigg „[[:$1]]“ vum Metmaacher „[[User:$2|$2]]“ ([[User talk:$2|Klaaf]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) nimieh zeröcknemme, dat hät ene Andere enzwesche ald jedon, udder de Sigg ömjeändert.\n\nDe Neuste Änderong aan dä Sigg es jetz vun däm Metmaacher „[[User:$3|$3]]“ ([[User talk:$3|Klaaf]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
"editcomment": "Bei dä Änderong schtundt: „$1“.",
"revertpage": "Änderunge vun däm Metmaacher „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|däm sing Klaafsigg]]) fottjeschmeße, un doför de lätzde Väsjohn vum „[[User:$1|$1]]“ widder zeröckjehollt",
"revertpage-nouser": "Änderunge vun enem Metmaacher, däm singe Name vershtoche es, retuur jemaat op de letzte Version {{GENDER:$1|vum|vum|vumm Metmaacher|vun dä|vum}} [[User:$1|$1]]",
"rollback-success": "De Änderungen vum $1 zeröckjenumme, un dobei de letzte Version vum $2 widder jehollt.",
+ "rollback-success-notify": "Änderonge {{GENDER:$1|vum|vum|vumm Metmaacher|vun dä|vum}} „$1“ sin zerök jenumme un di Sigg es op der Schtand vun doför {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ jesaz. [$3 Belohr, wat derbeij veränndert wood]",
"sessionfailure-title": "Fähler met dä Daate vum Enlogge",
"sessionfailure": "Et jov wall e täschnesch Problehm met Dingem Login. Dröm ham_mer dat us Vörseesch jäz nix jemaht, domet mer nit velleich Ding Änderong däm verkihrte Metmaacher ongerjubele. Jangk zeröck un versöhk et noch ens.",
"changecontentmodel": "Et Modäll vum Ennhald vun ene Sigg verändere",
"block-log-flags-hiddenname": "Däm Metmaacher singe Name es för de Öffentleschkeit vershtoche",
"range_block_disabled": "Adresse Jebeede ze sperre, es nit erlaub.",
"ipb_expiry_invalid": "De Duur es Dress. Jevv se richtich aan.",
+ "ipb_expiry_old": "Di Zick för ed Ußloufe es ald eröm.",
"ipb_expiry_temp": "Sperre för Metmaacher met verschtoche Nahme mößße för ihwish dohre.",
"ipb_hide_invalid": "Mer künne dä Metmaacher nit verschteische. Dä hät övver {{PLURAL:$1|ein Änderong|$1 Änderong|kein Änderong}} jemaat.",
"ipb_already_blocked": "„$1“ es ald jesperrt",
"lockdbsuccesstext": "{{ucfirst:{{GRAMMAR:Genitive sing|{{SITENAME}}}}}} Daatebank jetz jesperrt.<br /> Dun se widder [[Special:UnlockDB|freijevve]], wann Ding Waadung eröm es.",
"unlockdbsuccesstext": "De Daatebank es jetz freijejovve.",
"lockfilenotwritable": "De Datei, wo de Daatebank met jesperrt wääde wööd, künne mer nit aanläje, oder nit dren schrieve. Esu ene Dress! Dat mööt dä Websörver ävver künne! Verzäll dat enem Verantwortliche för de Installation vun däm ẞööver oder repareer et selvs, wann De et kanns.",
+ "databaselocked": "De Dahtebangk es ald jeschpächt.",
"databasenotlocked": "<strong>Opjepass:</strong> De Daatebank es <strong>nit</strong> jesperrt.",
"lockedbyandtime": "(aam $2 öm $3 Uhr vum $1)",
"move-page": "De Sigg „$1“ ömnenne",
"move-page-legend": "Sigg Ömnenne",
- "movepagetext": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.\nUnger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.\n\nDo kannß dat Höksche säze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.\nLinks op dä ahle Tittel blieve ävver wi se wore, wann De dat Höksche nit säz.\nDat heiß, dann moß De selver nohluure, of do jäz [[Special:DoubleRedirects|dubbelde Ömleidonge]] udder [[Special:BrokenRedirects|kapodde Ömleiduoge]] bei eruskumme.\nWann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffene Links do henjonn, wo se hen jonn solle.\nAlsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDe Sigg weed '''nit''' ömjenannt, wann et met däm neue Name ald en Sigg jitt, '''ußer''' et es en Ömleidong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder zeröck ömbenänne, wam_mer sich bem Ömbenänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n'''Oppjepass!'''\nWat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änderong aam Wiki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
+ "movepagetext": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.\nUnger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.\n\nDo kannß dat Höksche säze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.\nLinks op dä ahle Tittel blieve ävver wi se wore, wann De dat Höksche nit säz.\nDat heiß, dann moß De selver nohluure, of do jäz [[Special:DoubleRedirects|dubbelde Ömleidonge]] udder [[Special:BrokenRedirects|kapodde Ömleiduoge]] bei eruskumme.\nWann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffene Links do henjonn, wo se hen jonn solle.\nAlsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDe Sigg weed <strong>nit</strong> ömjenannt, wann et met däm neue Name ald en Sigg jitt, <strong>ußer</strong> et es en Ömleidong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder zeröck ömbenänne, wam_mer sich bem Ömbenänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n<strong>Oppjepass!</strong>\nWat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änderong aam Wiki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
"movepagetext-noredirectfixer": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Nahme, un all vörherije Väsjohne vun dä Sigg och.\nOnger däm ahle Tittel weed automattesch en Ömleidong op dä neue Tittel enjedrare.\n\nLenks op dä ahle Tittel bliive ävver, wie se wohre.\nDat heiß, Do moß selver nohloore, ov doh jetz [[Special:DoubleRedirects|dubbelde]] oder [[Special:BrokenRedirects|kapodde Ömleidonge]] bei eruskumme.\nWann De en Sigg ömnenne deiß, häs Do och doför ze sorje, dat de betroffe Links doh henjonn, wo se hen jonn solle.\nAlsu holl Der di Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDi Sigg weed '''nit''' ömjenannt, wann et met däm neue Tittel ald en Sigg jitt, '''ußer''' doh es nix drop, oder et es en Ömleijdong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder retuur ömnänne, wam_mer sich mem Ömnänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n<strong>Oppjepaß!</strong>\nWat beim Ömnänne erus kütt, künnt en opfällije un velleijsch stührende Änderong aam Wikki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
"movepagetalktext": "Wam_mer en däm Kääsje e Höhksche määt, weed heh di Sigg automattesch ömjenannd op di neuje Övverschreff, ußer wann en Klaafsigg met dä neuje Övverschrev ald do es, un et steiht och jet drop.\n\nEn dämm Fall mpß De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un eröm kopeere wat De bruchs.",
"moveuserpage-warning": "'''Opjepaß:''' Do wells en Metmaachersigg ömnänne, domet weed ävver dä Metmaacher sellver ''nit'' met ömjenannt.",
"movenosubpage": "Di Sigg hät kei Ongersigge.",
"movereason": "Aanlass:",
"revertmove": "Et Ömnänne zerök_nämme",
- "delete_and_move_text": "== Dä! Dubbelte Name ==\nDi Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg ömnenne ze künne?",
+ "delete_and_move_text": "Di Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg ömnenne ze künne?",
"delete_and_move_confirm": "Jo, dun di Sigg fottschmieße.",
"delete_and_move_reason": "Fottjeschmeße, öm di Sigg „[[$1]]“ ömbenänne ze künne.",
"selfmove": "Du Doof! - dä ahle Name un dä neue Name es däselve - do hät et Ömnenne winnich Senn.",
"move-leave-redirect": "Donn en Ömleidong doför ennreschte",
"protectedpagemovewarning": "'''Opjepaß:''' Heh di Sigg es jespert su dat blooß de Wiki-Kööbeße se ömnänne künne.\nHeh kütt der neuste Enndrach em Logbooch doh drövver:",
"semiprotectedpagemovewarning": "'''Opjepaß:''' Heh di Sigg es jespert su dat blooß aanjemeldte Metmaacher se ömnänne künne.\nHeh kütt der neuste Enndrach em Logbooch doh drövver:",
- "move-over-sharedrepo": "==Di Dattei jidd_et ald==\nEn Dattei [[:$1]] jidd_et ald en enem jemeinsame Beschtand. En annder Dattei op dä Name ömzenänne sorresch doför, dat mer aan di Dattei em jemeinsame Beschtand vun heh uß donoh nit mieh draan kütt.",
+ "move-over-sharedrepo": "En Dattei [[:$1]] jidd_et ald en enem jemeinsame Beschtand. En annder Dattei op dä Name ömzenänne sorresch doför, dat mer aan di Dattei em jemeinsame Beschtand vun heh uß donoh nit mieh draan kütt.",
"file-exists-sharedrepo": "Dinge Nahme för di Dattei weed ald jebruch, un zwa en enem jemeinsame Beschtand vun Dateije.\nDröm söhk ene andere Nahme uß.",
"export": "Sigge Exporteere",
"exporttext": "Heh exportees De dä Tex un de Eijeschaffte vun ener Sigg, oder vun enem Knubbel Sigge, de aktuelle Version, met oder ohne ehr ählere Versione.\nDat Janze es enjepack en XML.\nDat kam_mer en en ander Wiki — wann et och met dä MediaWiki-Soffwär läuf — övver de Sigg „[[Special:Import|Import]]“ do widder empotehre.\n\nSchriev de Titele vun dä Sigge en dat Feld för Tex enzejevve, unge, eine Titel en jede Reih.\nDann dun onoch ussöke, ov De all de vörherije Versione vun dä Sigge han wells, oder nor de aktuelle met dä Informazjuhne vun de läzde Änderong.\n\nEn däm Fall künns De, för en einzelne Sigg, och ene tirekte Link bruche, zom Beispill „[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]“ för de Sigg „[[{{MediaWiki:Mainpage}}]]“ ze exporteere.",
"tooltip-pt-preferences": "De eije Ennschtällonge{{GENDER:|}}",
"tooltip-pt-watchlist": "De Leß met de Sigge en Dinge eije Oppaßleß",
"tooltip-pt-mycontris": "En Leß met Dinge eije Beijdrähsch{{GENDER:|}}",
+ "tooltip-pt-anoncontribs": "En Leß met de Verännderong, di vun heh dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß uß jemaat wode sin.",
"tooltip-pt-login": "Do moß Desch nit Enlogge, kannz_E ävver jähn maache!",
"tooltip-pt-logout": "Ußlogge",
"tooltip-pt-createaccount": "mer schlonn vör, dat De Desch aanmällde deihs un ennloggs, ävver müüdesch es et nit.",
"tooltip-feed-rss": "Dä RSS-Abonnomang-Kannal (Feed) för heh di Sigg",
"tooltip-feed-atom": "Dä Atom-Abonnomang-Kannal (Feed) för heh di Sigg",
"tooltip-t-contributions": "Donn en Leß met dä Bedrähsch {{GENDER:$1|vun heh däm|vun heh dämm|vun heh dämm Metmaacher|vun heh dä|vun heh däm}} belohre",
- "tooltip-t-emailuser": "Scheck en E-Mail aan dä Metmaacher",
+ "tooltip-t-emailuser": "Scheck en E-Mail aan {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|dä Metmaacher}}",
"tooltip-t-info": "Mih Aanjahbe övver heh di Sigg",
"tooltip-t-upload": "Dateie huhlade",
"tooltip-t-specialpages": "Leß met de {{int:nstab-special}}e",
"lastmodifiedatby": "Di Sigg heh wohd et läz aam $1 öm $2 Uhr vum $3 jeändert.",
"othercontribs": "Bout op et Werk vun $1 op.",
"others": "ander",
- "siteusers": "{{PLURAL:$2|däm|de|keine}} {{PLURAL:$2|Metmaacher|Metmaachere|Metmaacher}} $1 aan {{GRAMMAR:Dat|{{SITENAME}}}}",
+ "siteusers": "{{PLURAL:$2|däm Metmaacher|dä Metmaacher|keijnem Metmaacher}} $1 {{GRAMMAR:vum|{{ucfirst:{{SITENAME}}}}}}",
"anonusers": "{{PLURAL:$2|dä|de|keine}} nameloose Metmaacher $1 vun de translatewiki.net",
"creditspage": "Övver de Metmaacher un dänne ehr Beijdrähsch för heh di Sigg",
"nocredits": "För di Sigg ham_mer nix en de Leß.",
"pageinfo-category-files": "De Aanzahl Dateie",
"markaspatrolleddiff": "Nohjeluurt. Dun dat fasshallde.",
"markaspatrolledtext": "De Änderong es nohjeluhrt, don dat faßhallde",
+ "markaspatrolledtext-file": "Makkehr heh di Väsjohn vun dä Dateij als nohjekik.",
"markedaspatrolled": "Et Kennzeiche „Nohjeluurt“ speichere",
"markedaspatrolledtext": "Et es jetz fassjehallde, dat de usjewählte Version vun dä Sigg „[[:$1]]“ nohjeluurt sin.",
"rcpatroldisabled": "Et Nohluure vun de letzte Änderunge es avjeschalt",
"newimages-legend": "Ußwähle",
"newimages-label": "Dä Dattei ier Name udder e Stöck dofun:",
"newimages-showbots": "Zeisch, wat de Bots huhjelaade han.",
+ "newimages-hidepatrolled": "Donn de nohjekik huhjelahde Dateije ußblännde.",
"noimages": "Kein Dateie jefunge.",
"ilsubmit": "Söhk",
"bydate": "nohm Datum",
"exif-compression-34712": "<i lang=\"en\">JPEG</i>2000",
"exif-copyrighted-true": "Häd_en Urhävverrääsch",
"exif-copyrighted-false": "Nix övver et Urhävverrääsch jesaat",
+ "exif-photometricinterpretation-1": "Schwazz un Wiiß (Schwazz es 0)",
"exif-photometricinterpretation-2": "RJB",
"exif-photometricinterpretation-6": "<i lang=\"en\">YCbCr</i>",
"exif-unknowndate": "Dattum onbikannt",
"confirmemail_body_set": "Künnt johd sin, Do wors et sällver. Vun dä IP-Adräß $1 hät op\njede Fall einer för dä Metmaacher \"$2\" op {{GRAMMAR:Akk bet|{{SITENAME}}}}\nheh di Adräß för däm sing e-mail aanjejovve.\n\nÖm jäz kloh ze kreje, dat di neu Adräß un dä Metmaacher och\nzosamme jehühre, un öm de e-mail op {{GRAMMAR:Akk bet|{{SITENAME}}}}\naanzschallde, moß dä Metmaacher en singem Brauser dä Lengk:\n\n$3\n\nopmaache. Noch för em $6 öm $7 Uhr. Alsu dun dat, wann dat sing\nReeschteschkeijt hät.\n\nWann nit Doh, sönders söns wä Ding Addräß för de e-Mail aanjejovve hät, bruchs\nDe jar nix ze don. Di Adräß weed nit jebruch, wann se nit beschtähtesch es.\nDo kanns ävver och op heh dä Lengk jon:\n\n$5\n\nDomet deiß De tirek vermällde, dat De di Adräß nit beschtähteje wells.",
"confirmemail_invalidated": "Et Beschtähtejje för di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß es afjebroche wohde, un di Adräß es '''nit''' beschtähtesch.",
"invalidateemail": "E-Mail-Adress nit bestätich",
+ "notificationemail_subject_changed": "{{SITENAME}} - De Addräß för de e-mail wood veränndert.",
+ "notificationemail_subject_removed": "{{SITENAME}} - De Addräß för de e-mail wood fott jeschmeße.",
+ "notificationemail_body_changed": "Velleijsch wohß De_t sällver. Eijne hät vun dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß $1 us {{ucfirst:{{GRAMMAR:em|{{ucfirst:{{SITENAME}}}}}}}} de \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ op „<code>$3</code>“ ömjeschtallt.\n\nWann De et nit sällver wohs, saach tirägg enem Verantwootlijje för di Wäbßait bescheijd!",
+ "notificationemail_body_removed": "Velleijsch wohß De_t sällver. Eijne hät vun dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß $1 us {{ucfirst:{{GRAMMAR:em|{{ucfirst:{{SITENAME}}}}}}}} de \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ fott jenumme.\n\nWann De et nit sällver wohs, saach tirägg enem Verantwootlijje för di Wäbßait bescheijd!",
"scarytranscludedisabled": "[Et Enbinge per Interwiki es avjeschalt]",
"scarytranscludefailed": "[De Schablohn „$1“ enzebenge hät nit jeflupp]",
"scarytranscludefailed-httpstatus": "[De Schablohn „$1“ enzebenge hät nit jeflupp. Dä HTTP-Fähler es: $2]",
"confirm-unwatch-button": "Lohß Jonn!",
"confirm-unwatch-top": "Sulle mer di Sigg uß Dinger Oppaßleß erußnämme?",
"confirm-rollback-button": "Lohß Jonn!",
+ "confirm-rollback-top": "Ännderonge aan dä Sigg heh zerök nämme?",
"semicolon-separator": ";",
"word-separator": " ",
"ellipsis": " …",
"watchlistedit-raw-done": "Ding Oppaßßleß es fassjehallde.",
"watchlistedit-raw-added": "{{PLURAL:$1|Ein Övverschreffför en Sigge wood|<strong>$1</strong> Övverschreffte för Sigge woodte|Kein Övverschreffte för Sigge}} dobeijedonn:",
"watchlistedit-raw-removed": "{{PLURAL:$1|Eine Endrach es eruß jefloore:|<strong>$1</strong> Endräsh es eruß jefloore:|Keine Endrach es eruß jefloore.}}",
- "watchlistedit-clear-title": "Oppaßleß läddesch jemaad",
+ "watchlistedit-clear-title": "Oppaßleß läddesch maache",
"watchlistedit-clear-legend": "Oppaßleß läddesch maache",
"watchlistedit-clear-explain": "Alle vun heh dä Siggetettelle fleeje uß dä Oppaßless eruß.",
"watchlistedit-clear-titles": "Siggetettelle",
"expand_templates_generate_xml": "Och dä XML-Parser-Boum zeije",
"expand_templates_generate_rawhtml": "Donn de Röh HTML Ußjaav aanzeije",
"expand_templates_preview": "Vör-Aansich",
- "expand_templates_preview_fail_html": "<em>Weil et Wiki rüh <i xml:lang=\"en\" title=\"HyperText Markup Language\" lang=\"en\">HTML</i> zohlöht un de Sezongsdahte verschött jejange sin, dom_mer de {{int:preview}} uß Vörseesch nit aanzeije, öm Aanjreffe övver JavaSkrep zevör ze kumme.</em>\n\n<strong>Wann dat heh en Ohdenong es, bes esu johd un versöhg et norr_ens.</strong>\nwann dat nix hellef, versöhg ens [[Special:UserLogout|ußzelogge]] un neu enzelogge.",
+ "expand_templates_preview_fail_html": "<em>Weil et Wiki rüh <i xml:lang=\"en\" title=\"HyperText Markup Language\" lang=\"en\">HTML</i> zohlöht un de Sezongsdahte verschött jejange sin, dom_mer de {{int:preview}} uß Vörseesch nit aanzeije, öm Aanjreffe övver JavaSkrep zevör ze kumme.</em>\n\n<strong>Wann dat heh en Ohdenong es, bes esu johd un versöhg et norr_ens.</strong>\nwann dat nix hellef, versöhg ens [[Special:UserLogout|ußzelogge]] un neu enzelogge, un donn pröhve dat Dinge Brauser <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">cookies</i> vun heh däm Wikki aannemmp.",
"expand_templates_preview_fail_html_anon": "<em>Weil et Wiki rüh <i xml:lang=\"en\" title=\"HyperText Markup Language\" lang=\"en\">HTML</i> zohlöht un Do nit ennjelogg bes, dom_mer de {{int:preview}} uß Vörseesch nit aanzeije, öm Aanjreffe övver JavaSkrep zevör ze kumme.</em>\n\n<strong>Wann dat heh en Ohdenong es, bes esu johd un donn [[Special:UserLogin|enlogge]] un versöhg et norr_ens.</strong>",
"expand_templates_input_missing": "Mer mß winnischsdrens jät Täx ennjävve.",
"pagelanguage": "De Schprohch för di Sigg faßlääje",
"log-name-pagelang": "Logbohch vum Tuusche vun Sige iehr Schprohche",
"log-description-pagelang": "Dat heh es et Logbohch vun de Veränderonge aan de Schprohch vun de Sigge.",
"logentry-pagelang-pagelang": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Schprohch vun dä Sigg „$3“ vun $4 op $5 verändert.",
- "default-skin-not-found": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndrahch <code lang=\"en\" xml:lang=\"en\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\">LocalSettings.php</code> om ẞööver faßjelaat.\n\n{{PLURAL:$4|Heh di Bedehnbovverfläsch es|Heh di Bedehnbovverfläsche sin|Kein Bedehnbovverfläsche sin}} doh:\n\n$2\n\nLohr och en et [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Handbohch övver et Enschtälle vun Bedehnbovverfläsche].\n\n*'''Falls dat heh e fresch enjereesch MehdijaWikki es:'''\n*: MehdijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\">Git</i> enschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier enschtallehrt. Met däm Problehm heh wohr ze rääschne. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche vum MehdijaWikki] enschtallehre. Dat jeihd, endämm dat De:\n*:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holls,\n*:* winneschsdens eins vun dä Verzeischneße us <code lang=\"en\" xml:lang=\"en\">mediawiki/skins/*</code> met <i lang=\"en\" xml:lang=\"en\">Git</i> en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MehdijaWikki_Enschtallazuhn holls,\n*:* de [https://www.mediawiki.org/wiki/Download Dattei vum MehdijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holle.\n*: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\">git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MehdijaWikki bes.\n*'''Falls dat MehdijaWikki heh jrahd obb ene neue Schtand jebraht wood:'''\n*: Bei MehdijaWikki en dä Väsjohn 1.24 un hüüter wääde de enschtallehrte Bedehnbovverfläsche nit mieh automattesch alle aanjemaat; süsch och em [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Handbohch] dernoh. Do kanns heh di {{PLURAL:$5|Reih|Reihje|kein Reihje}} en de Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> eren koppehre, öm {{PLURAL:$5|di enschtallehrte Bedehnbovverfläsch|alle enschtallehrte Bedehnbovverfläsche|kein Bedehnbovverfläsch}} aanzeschallde:\n<pre lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3</pre>\n* '''Falls de jrahd aan dä Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> jät geändert häs:'''\n*: Donn de Nahme vun de Bedehnbovverfläsche en dä Dattei pröhve. Se künnte verhehrt jeschrevve sin.",
+ "default-skin-not-found": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndrahch <code dir=\"ltr\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> om ẞööver faßjelaat.\n\n{{PLURAL:$4|Heh di Bedehnbovverfläsch es|Heh di Bedehnbovverfläsche sin|Kein Bedehnbovverfläsche sin}} doh:\n\n$2\n\nLohr och en et [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Handbohch övver et Enschtälle vun Bedehnbovverfläsche].\n\n; Falls dat heh e fresch enjereesch MehdijaWikki es:\n: MehdijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Git</i> enschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier enschtallehrt. Met däm Problehm heh wohr ze rääschne. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche vum MehdijaWikki] enschtallehre. Dat jeihd, endämm dat De:\n:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holls,\n:* winneschsdens eins vun dä Verzeischneße us <code lang=\"en\" xml:lang=\"en\">mediawiki/skins/*</code> met <i lang=\"en\" xml:lang=\"en\">Git</i> en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MehdijaWikki_Enschtallazuhn holls,\n:* de [https://www.mediawiki.org/wiki/Download Dattei vum MehdijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun dä MehdijaWikki_Enschtallazuhn holle.\n: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MehdijaWikki bes.\n\n;Falls dat MehdijaWikki heh jrahd obb ene neue Schtand jebraht wood:\n: Bei MehdijaWikki en dä Väsjohn 1.24 un hüüter wääde de enschtallehrte Bedehnbovverfläsche nit mih automattesch alle aanjemaat; süsch och em [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Handbohch] dernoh. Do kanns heh di {{PLURAL:$5|Reih|Reihje|kein Reihje}} en de Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> eren koppehre, öm {{PLURAL:$5|di enschtallehrte Bedehnbovverfläsch|alle enschtallehrte Bedehnbovverfläsche|kein Bedehnbovverfläsch}} aanzeschallde:\n\n<pre lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3</pre>\n\n;Falls de jrahd aan dä Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> jät geändert häs:\n: Donn de Nahme vun de Bedehnbovverfläsche en dä Dattei pröhve. Se künnte verhehrt jeschrevve sin.",
"default-skin-not-found-no-skins": "De schtandattmähßejje Bedehnbovverfläsch <code>$1</code> för et Wikki es nit ze fenge. Se weed övver dä Enndraach <code lang=\"en\" xml:lang=\"en\">$wgDefaultSkin</code> en dä Dattei <code lang=\"en\" xml:lang=\"en\">LocalSettings.php</code> om ẞööver faßjelaat.\n\nEt sinn_er kein Bedehnbovverfläsche doh.\n\n*'''Falls dat heh e fresch enjereesch MehdijaWikki, es udder jrahd obb ene neue Schtand jebraht wood:'''\n*: MehdijaWikki wood velleisch övver <i lang=\"en\" xml:lang=\"en\">Git</i> enschtallehrt, udder der Quälltäx wood tiräk obb_en ander Manier enschtallehrt. Met däm Problehm heh wohr ze rääschne. Bei MehdijaWikki en dä Väsjohn 1.24 un hüüter sin kein Bedehnbovverfläsche mieh automattesch derbei. Donn winneschßdens eine vun dä Bovverfläsche uss_em [https://www.mediawiki.org/wiki/Category:All_skins Verzeischneß vun de Bedehnbovverfläsche] enschtallehre. Dat jeihd, endämm dat De:\n*:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins <i lang=\"en\" xml:lang=\"en\">Git</i> nemms, öm de Bedehnbovverfläsche eronger ze lahde].\n*:* einzel veröffentleschte Bovverfläsche us [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] erongerlähds un en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge MehdijaWikki_Enschtallazuhn holls,\n*:* de [https://www.mediawiki.org/wiki/Download Dattei vum MehdijaWikki] erongerlähds, woh ongerscheidlejje Bedehnbovverfläsche dren sin un Zohsäz derzoh. Uß däm Verzeischneß doh dren kam_mer Saache en et Verzeischneß <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">skins/</code> vun Dinge vun dä MehdijaWikki_Enschtallazuhn holle.\n*: Dat sullt sesch nit met Dingem <i lang=\"en\" xml:lang=\"en\">Git</i>-Verzeischneß schtühre, falls De och ene Äntweckler vum MehdijaWikki bes. Lohr em [https://www.mediawiki.org/wiki/Manual:Skin_configuration Handbohch] dernoh, wi mer Bedehnbovverfläsche aanmääd un ene Schtandatt faßlähsch.",
"default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enjeschalldt)",
"default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>ußjeschalldt</strong>)",
"special-characters-group-ipa": "IPA, et engernazjonal foneetesch Alfabeet",
"special-characters-group-symbols": "Symbole",
"special-characters-group-greek": "Jriischesch",
+ "special-characters-group-greekextended": "Jrihschesch met Zohsäz",
"special-characters-group-cyrillic": "Kyrillesch",
"special-characters-group-arabic": "Arabesch",
"special-characters-group-arabicextended": "Araabesch met Extras",
"mw-widgets-dateinput-no-date": "Kein Dattom es ußjewählt",
"mw-widgets-titleinput-description-new-page": "di Sigg jidd_et noch nit",
"mw-widgets-titleinput-description-redirect": "ömleijde op „$1“",
- "api-error-blacklisted": "Söhk Der ene anndere Nahme uß, dä mih drövver säht.",
+ "sessionprovider-generic": "Sezonge övver $1",
+ "sessionprovider-mediawiki-session-cookiesessionprovider": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">cookies</i>",
+ "sessionprovider-nocookies": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Plätzjer“\">Cookies</i> künnte affjeschalld sin. Schtäl sescher, dat se ennjeschalld sin un fang norr_ens aan.",
"randomrootpage": "Zofällige Aanfangs-Sigg",
+ "log-action-filter-block": "Zoot vun Spärr",
+ "log-action-filter-delete": "Zoot vum Fottschmiiße:",
+ "log-action-filter-import": "Zoot vum Emmpoot:",
+ "log-action-filter-managetags": "Zoot vun Verwalldongsaxjuhn",
+ "log-action-filter-move": "Zoot vum Ömnänne:",
+ "log-action-filter-newusers": "Zoot vum Zohjang aanlähje:",
+ "log-action-filter-patrol": "Zoot vum Nohlohre:",
+ "log-action-filter-protect": "Zoot vum Schoz:",
+ "log-action-filter-rights": "De Zoot Ännderong aan de Rääschte:",
+ "log-action-filter-suppress": "De Zoot Ongerdrökong:",
+ "log-action-filter-upload": "Zoot vum Huhlahde:",
"log-action-filter-all": "Alle",
"log-action-filter-block-block": "Schpärre",
+ "log-action-filter-block-reblock": "Änderung vun ener Schpärr",
"log-action-filter-block-unblock": "Sperr ophävve",
"log-action-filter-delete-delete": "En Sigg wohd fott jeschmeße",
+ "log-action-filter-delete-restore": "Sigge-Zerökholle",
+ "log-action-filter-delete-event": "Logbohch-Fottschmiiße",
+ "log-action-filter-delete-revision": "Väsjohn-Fottschmiiße",
+ "log-action-filter-import-interwiki": "Emmpood us enem anndre Wikki",
+ "log-action-filter-import-upload": "Empood uß ene huhjelade <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Datteij",
+ "log-action-filter-managetags-create": "Makkehrong aanjelaat",
+ "log-action-filter-managetags-delete": "Makkehrong fottjeschmeße",
+ "log-action-filter-managetags-activate": "Makkehrong aanjeschalldt",
+ "log-action-filter-managetags-deactivate": "Makkehrong affjeschalldt",
+ "log-action-filter-move-move": "Ömjenannt ohne en Ömleijdong ze övverschrihve",
+ "log-action-filter-move-move_redir": "Ömjenannt obb en övverschrihve Ömleijdong",
+ "log-action-filter-newusers-create": "Aanjelaat vun enem Nahmelohse",
+ "log-action-filter-newusers-create2": "Aanjelaat vun enem ennjelogg Metmaacher",
+ "log-action-filter-newusers-autocreate": "Aumattesch-Aanlähje",
+ "log-action-filter-newusers-byemail": "Aanjelaat mem Paßwood pä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> jescheck",
+ "log-action-filter-patrol-patrol": "Vun Hand Nohjelohrt",
+ "log-action-filter-patrol-autopatrol": "Automattesch Nohjelohrt",
+ "log-action-filter-protect-protect": "Schoz",
+ "log-action-filter-protect-modify": "Schoz-Ännderong",
+ "log-action-filter-protect-unprotect": "Schoz-Ophävve",
+ "log-action-filter-protect-move_prot": "Schoz jähje et Ömbenänne",
+ "log-action-filter-rights-rights": "Vun Hand veränndert",
+ "log-action-filter-rights-autopromote": "Automattesch veränndert",
+ "log-action-filter-suppress-event": "Logbohch ongerdrök",
+ "log-action-filter-suppress-revision": "Väsjohn ongerdrök",
+ "log-action-filter-suppress-delete": "Sigg ongerdrök",
+ "log-action-filter-suppress-block": "Metmaacher ongerdrök pä Schpärr",
+ "log-action-filter-suppress-reblock": "Metmaacher ongerdrök pä Wider-Schpärr",
+ "log-action-filter-upload-upload": "Neu huhjelahde",
+ "log-action-filter-upload-overwrite": "Neu huhlahde",
+ "authmanager-authn-autocreate-failed": "Automattesch ene Zojang för heh et Wikki hät nit jeflup: $1",
"authmanager-create-disabled": "Neu Aanmelde es afjeschalldt",
"authmanager-create-from-login": "Öm Der ene Zohjang aanzelähje, bes esu johd, un föll heh di Fällder us:",
"authmanager-authplugin-setpass-failed-title": "Dat Paßwoot ze änndere hät nit jeflupp",
+ "authmanager-authplugin-setpass-bad-domain": "Onjöltijje Domäijn",
+ "authmanager-autocreate-noperm": "Automattesch Zohjäng aanzelähje es nit zohjelohße.",
+ "authmanager-autocreate-exception": "Automattesch Zohjäng aanzelähje es wähje verjange Fähler för en Zigg nit zohjelohße.",
"authmanager-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ es nit ennjedrahre.",
+ "authmanager-username-help": "Der Metmaacher_Nahme för et Enlloge.",
+ "authmanager-password-help": "Et Paßwootför et Enlogge.",
"authmanager-domain-help": "De Domäijn för de Zohjangsdaht vun ußerhallef beschtähtech ze krijje.",
"authmanager-retype-help": "Norr_ens dat Paßwoot zom beschähtejje",
"authmanager-email-label": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
"authmanager-email-help": "De Addräß för de <i lang=\"en\">e-mail</i>",
"authmanager-realname-label": "Der „reeschteje“ Nahme",
+ "authmanager-realname-help": "Der ääschte Nahme vun däm Metmaaacher",
"authmanager-provider-temporarypassword": "Zweschepasswood:",
+ "authprovider-confirmlink-request-label": "De Zohjäng, di verlengk wähde sulle",
+ "authprovider-confirmlink-success-line": "$1 es jäz verbonge.",
"authprovider-confirmlink-failed": "Et Zohjang-Verlengke hät nit kumplätt jeflupp: $1",
+ "authprovider-confirmlink-ok-help": "Maach wigger nohdämm Fählernohreeschte övver et verbenge ußjejovve woode sin.",
"authprovider-resetpass-skip-label": "Övverjonn",
+ "authprovider-resetpass-skip-help": "Övverjangk et Paßwood zerök ze säzze.",
+ "authform-nosession-login": "Et Ennlogge hät jeflupp, ävver Dinge Brauser kunnt sesch nit draan „äntsenne“, enjelogg ze sin.\n\n$1",
+ "authform-nosession-signup": "Dä Zohjang es ennjereescht, ävver Dinge Brauser kunnt sesch nit draan „äntsenne“, enjelogg ze sin.\n\n$1",
"authform-newtoken": "Keij CSRF Makkehrong:FUZZY!!$1",
"authform-notoken": "Keij CSRF Makkehrong!FUZZY!!",
"specialpage-securitylevel-not-allowed-title": "Nit zohjelohße",
+ "authpage-cannot-login": "Mer künne et Ennlogge nit bejenne.",
+ "authpage-cannot-login-continue": "Mer kunnte mem Ennlogge nit wigger maache. Ding Sezong weed ußjeloufe sinn.",
+ "authpage-cannot-create": "Mer künne et Aanlähje vun enem Zohjang nit bejenne.",
+ "authpage-cannot-create-continue": "Mer kunnte mem Aanlähje vun däm Zohjang nit wigger maache. Ding Sezong weed ußjeloufe sinn.",
+ "authpage-cannot-link": "Mer künne mem Zohjang Verbenge nit bejenne.",
+ "authpage-cannot-link-continue": "Mer kunnte mem Zohjang Verbenge nit wigger maache. Ding Sezong weed ußjeloufe sinn.",
"cannotauth-not-allowed-title": "Zohjang verbodde.",
"cannotauth-not-allowed": "Do häs nit dat Rääsch, he di Sigg ze bruche.",
"changecredentials-submit": "Ändere",
- "removecredentials-submit": "Fott nämme"
+ "removecredentials-submit": "Fott nämme",
+ "credentialsform-account": "Der Nahme för der Zohjang:",
+ "cannotlink-no-provider-title": "Mer han kein zweij Zohjäng, di mer verbenge künnt.",
+ "cannotlink-no-provider": "Mer han kein zweij Zohjäng, di mer verbenge künnt.",
+ "linkaccounts": "Zohjäng verbenge",
+ "linkaccounts-success-text": "Der Zohjang es jäz verbonge.",
+ "linkaccounts-submit": "Lohß jonn!",
+ "unlinkaccounts": "Zohjäng tränne",
+ "unlinkaccounts-success": "De Zohjäng sin jäz jetrännt."
}
"showingresults": "{{PLURAL:$1|Encamek|'''$1''' encam}}, bi #'''$2''' dest pê dike.",
"search-nonefound": "Ti rûpelên wek ya daxwazkirî nînin.",
"powersearch-legend": "Lêgerîna pêşketî",
- "powersearch-ns": "Di valahiya navan de lêbigere:",
+ "powersearch-ns": "Di valahiya navan de lê bigere:",
"powersearch-togglelabel": "Kontrol bike:",
"powersearch-toggleall": "Hemû",
"powersearch-togglenone": "Tune",
"pageinfo-category-pages": "Hejmara rûpelan",
"pageinfo-category-subcats": "Hejmara binkategoriyan",
"pageinfo-category-files": "Hejmara dosyeyan",
- "markaspatrolleddiff": "Wek serrastkirî nîşan bide",
- "markaspatrolledtext": "Vê rûpelê wek serrastkirî nîşan bide",
- "markedaspatrolled": "Wek serrastkirî tê nîşandan",
+ "markaspatrolleddiff": "Wek sererastkirî nîşan bide",
+ "markaspatrolledtext": "Vê rûpelê wek sererastkirî nîşan bide",
+ "markedaspatrolled": "Wek sererastkirî tê nîşandan",
"markedaspatrolledtext": "Guherandina rûpelê wek serrastkirî tê nîşandan.",
"patrol-log-page": "Têketina kontrolkirinê",
"deletedrevision": "Guhertoya berê $1 hate jêbirin.",
"minoredit": "Haec est recensio minor",
"watchthis": "Hanc paginam observare",
"savearticle": "Hanc redactionem servare",
+ "publishpage": "Hanc paginam edere",
+ "publishchanges": "Hanc recensionem edere",
"preview": "Praevidere",
"showpreview": "Prospectum ostendere",
"showdiff": "Mutationes ostendere",
"parser-template-loop-warning": "Ansa formulae detecta: [[$1]]",
"undo-norev": "Recensio abrogari non potuit quia non est aut deleta est.",
"undo-summary": "Abrogans recensionem $1 ab usore [[Special:Contributions/$2|$2]] ([[User talk:$2|Disputatio]])",
- "cantcreateaccounttitle": "Non licuit nomen tibi imponere",
"cantcreateaccount-text": "Ex hoc loco IP ('''$1''') nomen sibi imponere ab usore [[User:$3|$3]] interdicitur.\nQui hanc causam dedit: ''$2''",
"viewpagelogs": "Vide acta huius paginae",
"nohistory": "Huic paginae non est historia.",
"tooltip-ca-nstab-category": "Videre paginam categoriae",
"tooltip-minoredit": "Indicare hanc recensionem minorem",
"tooltip-save": "Servare mutationes tuas",
+ "tooltip-publish": "Hanc recensionem edere",
"tooltip-preview": "Sinet prospicere, quod mutationes tuas effecerint. Utere, quaesumus, hac facultate, antequam servas!",
"tooltip-diff": "Comparabit hanc redactionem cum superiore earumque differentias notabit",
"tooltip-compareselectedversions": "Inspicere, quatenus contenta redactionum selectarum inter se distent",
"tog-watchlisthidebots": "Ännerunge vu Botten op menger Iwwerwaachungslëscht verstoppen",
"tog-watchlisthideminor": "Kleng Ännerungen op menger Iwwerwaachungslëscht verstoppen",
"tog-watchlisthideliu": "Ännerunge vun ugemellte Benotzer verstoppen",
+ "tog-watchlistreloadautomatically": "D'Iwwerwaachungslëscht nei lueden esoubal wéi e Filter geännert ass (JavaScript gëtt gebraucht)",
"tog-watchlisthideanons": "Ännerunge vun anonyme Benotzer (IP-Adressen) verstoppen",
"tog-watchlisthidepatrolled": "Iwwerkuckten Ännerungen op der Iwwerwaachungslëscht verstoppen",
"tog-watchlisthidecategorization": "Kategorisatioun vu Säite verstoppen",
"hidden-category-category": "Verstoppt Kategorien",
"category-subcat-count": "Dës Kategorie huet {{PLURAL:$2|nëmmen dës Ënnerkategorie.|dës {{PLURAL:$1|Ënnerkategorie|$1 Ënnerkategorien}}, vu(n) $2 am Ganzen.}}",
"category-subcat-count-limited": "Dës Kategorie huet dës {{PLURAL:$1|Ënnerkategorie|$1 Ënnerkategorien}}.",
- "category-article-count": "An dëser Kategorie {{PLURAL:$2|ass just dës Säit.|{{PLURAL:$1|ass just dës Säit|si(nn) $1 Säiten}}, vu(n) $2 am Ganzen.}}",
+ "category-article-count": "An dëser Kategorie {{PLURAL:$2|ass just dës Säit.|{{PLURAL:$1|ass just dës Säit|sinn dës $1 Säiten}}, vu(n) $2 am Ganzen.}}",
"category-article-count-limited": "Dës {{PLURAL:$1|Säit ass|$1 Säite sinn}} an dëser Kategorie.",
"category-file-count": "{{PLURAL:$2|Just dëse Fichier ass an dëser Kategorie.|{{PLURAL:$1|Just dëse Fichier ass|Dës $1 Fichiere sinn}} an dëser Kategorie, vu(n) $2 am Ganzen.}}",
"category-file-count-limited": "{{PLURAL:$1|Dëse Fichier ass|Dës $1 Fichiere sinn}} an dëser Kategorie.",
"tagline": "Vu {{SITENAME}}",
"help": "Hëllef",
"search": "Sichen",
+ "search-ignored-headings": " #<!-- dës Zeil net änneren --> <pre>\n# Iwwerschrëften, déi vun der Sich ignoréiert ginn.\n# Dës Ännerunge gi wirksam, soubal déi Säit mat der Iwwerschrëft indexéiert gouf.\n# Dir kënnt déi Säitenindexéierung erzwéngen, andeem dir eng Nullännerung maacht.\n# Syntax:\n# * Alles, wat no enger Raut („#“) bis zum Ënn vun der Zeil steet, ass eng Bemierkung.\n# * All net-eidel Zeil ass de geneeën Titel fir z'ignoréieren.\nReferenzen\nWeblinken\nKuckt och\n #</pre> <!-- dës Zeil net änneren -->",
"searchbutton": "Volltext-Sich",
"go": "Lass",
"searcharticle": "Säit",
"userlogin-resetpassword-link": "Hutt Dir Äert Passwuert vergiess?",
"userlogin-helplink2": "Hëllef beim Aloggen",
"userlogin-loggedin": "Dir sidd schonn als {{GENDER:$1|$1}} ageloggt.\nBenotzt de Formulaire hei drënner fir Iech als een anere Benotzer anzeloggen.",
+ "userlogin-reauth": "Dir musst Iech nach emol aloggen fir z'iwwerpréiwen datt Dir {{GENDER:$1|$1}} sidd.",
"userlogin-createanother": "Maacht een anere Benotzerkont op",
"createacct-emailrequired": "E-Mail-Adress",
"createacct-emailoptional": "E-Mailadress (fakultativ)",
"createacct-email-ph": "Gitt Är E-Mail-Adress an",
"createacct-another-email-ph": "E-Mailadress aginn",
"createaccountmail": "En temporäert zoufällegt Passwuert benotzen an et per E-Mail un déi spezifizéiert E-Mailadress schécken",
+ "createaccountmail-help": "Ka benotzt gi fir e Benotzerkont fir eng aner Persoun unzeleeën ouni d'Passwuert gewuer ze ginn.",
"createacct-realname": "Richtegen Numm (fakultativ)",
"createaccountreason": "Grond:",
"createacct-reason": "Grond",
"passwordreset-emailelement": "Benotzernumm: \n$1\n\nTemporärt Passwuert: \n$2",
"passwordreset-emailsentemail": "Wann dës E-Mailadress mat Ärem Benotzerkont assoziéiert ass, da gëtt Eng E-Mail fir d'Passwuert zréckzesetze geschéckt.",
"passwordreset-emailsentusername": "Wann eng E-Mailadress mat dësem Benotzernumm associéiert ass, da gëtt Eng E-Mail fir d'Passwuert zeréckzesetze geschéckt.",
- "passwordreset-emailsent-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
- "passwordreset-emailerror-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de {{GENDER:$2|Benotzer}} konnt se net kréien: $1",
"passwordreset-invalideamil": "Net-valabel E-Mail-Adress",
"passwordreset-nodata": "Et gouf weder e Benotzernumm nach e Passwuert uginn",
"changeemail": "E-Mail-Adress änneren oder ewechhuelen",
"changeemail-header": "Fëllt dëse Formulaire aus fir Är E-Mailadress z'änneren. Wann Dir d'Verbindung tëscht Ärer E-Mailadress an Ärem Benotzerkont ewechhuele wëllt, da loosst d'Feld e-Mailadress eidel wann Dir de Formulaire späichert.",
- "changeemail-passwordrequired": "Dir musst Äert Passwuert agi fir dës Ännerung ze konfirméieren.",
"changeemail-no-info": "Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.",
"changeemail-oldemail": "Aktuell Mailadress:",
"changeemail-newemail": "Nei Mailadress:",
"showpreview": "Kucken ouni ofzespäicheren",
"showdiff": "Ännerunge weisen",
"blankarticle": "<strong>Opgepasst:</strong> D'Säit déi Dir uleet ass eidel.\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Säit ugeluecht.",
- "anoneditwarning": "<strong>Opgepasst:</strong> Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress ëffentlech gewise wann Dir Ännerunge maacht. Wann Dir <strong>[$1 Iech aloggt]</strong> oder <strong>[$2 e Bnotzerkont opmaachen]</strong>, Är Ännerunge ginn dann Ärem Benotzerkont zougedeelt, genee wéi aner Avantagen.",
+ "anoneditwarning": "<strong>Opgepasst:</strong> Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress ëffentlech gewise wann Dir Ännerunge maacht. Wann Dir <strong>[$1 Iech aloggt]</strong> oder <strong>[$2 e Benotzerkont opmaachen]</strong>, Är Ännerunge ginn dann Ärem Benotzerkont zougedeelt, genee wéi aner Avantagen.",
"anonpreviewwarning": "''Dir sidd net ageloggt. Wann Dir ofspäichert gëtt Är IP-Adress an der Lëscht vun de Versioune vun dëser Säit enregistréiert.''",
"missingsummary": "'''Erënnerung:''' Dir hutt kee Resumé aginn.\nWann Dir nacheemol op \"{{int:savearticle}}\" klickt, gëtt Är Ännerung ouni Resumé ofgespäichert.",
"selfredirect": "<strong>Opgepasst:</strong> Dir maacht eng Viruleedung vun dëser Aäit op sech selwer.\n\nEt ka sinn datt Dir déi falsch Zilsäit fir d'Viruleedung aginn hutt oder datt Dir déi falsch Säit ännert.\n\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Viruleedung trotzdem ugeluecht.",
"undo-nochange": "D'Ännerung gouf anscheinend schonn zeréckgesat.",
"undo-summary": "Ännerung $1 vu(n) [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) annulléieren.",
"undo-summary-username-hidden": "Versioun $1 vun engem verstoppte Benotzer zrécksetzen",
- "cantcreateaccounttitle": "Benotzerkont konnt net opgemaach ginn",
"cantcreateaccount-text": "D'Opmaache vu Benotzerkonten vun dëser IP Adress ('''$1''') gouf vum [[User:$3|$3]] gespaart.\n\nDe Benotzer $3 huet \"$2\" als Grond uginn.",
"cantcreateaccount-range-text": "D'Uleeë vu Benotzerkonte vun IP-Adressen aus dem Beräich \"$1\", zu deem Är IP-Adress (<strong>$4</strong>) gehéiert, gouf vum [[User:$3|$3]] gespaart.\n\nDe Grond den den $3 uginn huet ass <em>$2</em>",
"viewpagelogs": "Logbicher fir dës Säit weisen",
"mergehistory-fail-bad-timestamp": "Zäitstempel ass net valabel.",
"mergehistory-fail-invalid-source": "Quellsäit ass net valabel.",
"mergehistory-fail-invalid-dest": "Zilsäit ass net valabel.",
+ "mergehistory-fail-self-merge": "Quell an Zilsäit sinn déi selwecht.",
"mergehistory-fail-toobig": "D'zesummeleeë vun der Lëscht vun de Versioune konnt net gemaach ginn well méi wéi d'Limite vun $1 {{PLURAL:$1|Versioun|Versioune}} geréckelt géife ginn",
"mergehistory-no-source": "Originalsäit \"$1\" gëtt et net.",
"mergehistory-no-destination": "Zilsäit \"$1\" gëtt et net.",
"right-unwatchedpages": "Lëscht vun den net iwwerwaachte Säite weisen",
"right-mergehistory": "Zesummeféierung vum Historique vun de Versioune vu Säiten",
"right-userrights": "All Benotzerrechter änneren",
- "right-userrights-interwiki": "Benotzerrechter vu Benotzer op anere Wiki-Siten änneren",
+ "right-userrights-interwiki": "Benotzerrechter vu Benotzer op anere Wiki-Sitten änneren",
"right-siteadmin": "Datebank spären an d'Spär ophiewen",
"right-override-export-depth": "Säiten exportéieren inklusiv de verlinkte Säite bis zu enger Déift vu 5",
"right-sendemail": "Anere Benotzer E-Maile schécken",
"action-createpage": "dës Säit uleeën",
"action-createtalk": "dës Diskussiounssäit uleeën",
"action-createaccount": "dëse Benotzerkont unzeleeën",
+ "action-autocreateaccount": "automatesch dësen externe Benotzerkont opzemaachen",
"action-history": "d'Versioune vun dëser Säit weisen",
"action-minoredit": "dës Ännerung als kleng Ännerung ze markéieren",
"action-move": "dës Säit ze réckelen",
"action-viewmyprivateinfo": "Är privat Informatioune kucken",
"action-editmyprivateinfo": "Är privat Informatiounen änneren",
"action-editcontentmodel": "de Modell vum Inhalt vun enger Säit änneren",
+ "action-purge": "dës Säit eidelzemaachen",
"nchanges": "$1 {{PLURAL:$1|Ännerung|Ännerungen}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|zanter dem leschte Passage}}",
"enhancedrc-history": "Versiounen",
"upload-too-many-redirects": "Et waren zevill Viruleedungen fir d'URL do",
"upload-http-error": "Et ass en HTTP-Feeler geschitt: $1",
"upload-copy-upload-invalid-domain": "Vun dësem Domain ass d'Eropluede vu Kopien net méiglech.",
+ "upload-foreign-cant-upload": "Dës Wiki ass net agestallt fir Fichieren an den ugefrote frieme Repertoire fir Fichieren eropzelueden.",
"upload-dialog-disabled": "D'Eropluede vu Fichieren mat dësem Dialog ass op dëser Wiki desaktivéiert.",
"upload-dialog-title": "Fichier eroplueden",
"upload-dialog-button-cancel": "Ofbriechen",
"listgrouprights-namespaceprotection-header": "Limitatioune vum Nummraum",
"listgrouprights-namespaceprotection-namespace": "Nummraum",
"listgrouprights-namespaceprotection-restrictedto": "Recht(er), déi dem Benotzer d'Änneren erlaben",
+ "listgrants": "Autorisatiounen",
+ "listgrants-grant": "Autorisatioun",
"listgrants-rights": "Rechter",
"trackingcategories": "Tracking-Kategorien",
"trackingcategories-msg": "Tracking-Kategorie",
"log-action-filter-patrol-autopatrol": "Automatesch Kontroll",
"log-action-filter-protect-protect": "Spär",
"log-action-filter-protect-modify": "Spär-pÄnnerung",
+ "log-action-filter-protect-unprotect": "Spär ophiewen",
"log-action-filter-protect-move_prot": "Geréckelt Spär",
"log-action-filter-rights-rights": "Manuell Ännerung",
"log-action-filter-rights-autopromote": "Automatesch Ännerung",
"tog-hidepatrolled": "Gemarkeerde wieziginge verberge in recente wieziginge",
"tog-newpageshidepatrolled": "Gemarkeerde pagina's verberge in de lies mit nuuj pagina's",
"tog-extendwatchlist": "Oetgebreide volglies gebroeke óm alle verangeringe te zeen en neet allein de lèste",
- "tog-usenewrc": "Tuun verangeringe per pagina in recènte verangeringe en volglies (Javascript nudig)",
+ "tog-usenewrc": "Tuun verangeringe per pagina in recènte verangeringe en volglies",
"tog-numberheadings": "Köpkes automatisch nummere",
- "tog-showtoolbar": "Laot edit toolbar zeen",
- "tog-editondblclick": "Bewirk pagina's bie 'ne dobbelklik (JavaScript)",
- "tog-editsectiononrightclick": "Secties bewirke mit 'ne rechtermoesklik op sectietitels (JavaScript nudig)",
+ "tog-showtoolbar": "Laot bewirkingwerkbalk zeen",
+ "tog-editondblclick": "Bewirk pagina's bie 'ne dobbelklik",
+ "tog-editsectiononrightclick": "Secties bewirke mit 'ne rechtermoesklik op sectietitels",
"tog-watchcreations": "Volg autematis pagina's die ich aanmaak en bestenj die ich upload",
"tog-watchdefault": "Voog pagina's em bestenj die se bewirks toe aan dien volglies",
"tog-watchmoves": "Volg autematis pagina's en bestenj die ich verplaats",
"tog-watchdeletion": "Volg autematis pagina's en bestenj die ich ewegsjaf",
+ "tog-watchuploads": "Nuuj besjtenj die ich upload toevoge aan mienn volglies",
+ "tog-watchrollback": "Pagina's boe-in ich get höb óngedaon gemaak autematis volge",
"tog-minordefault": "Markeer sjtanderd alle bewirkinge es klein",
"tog-previewontop": "Veurvertuin baove bewèrkingsveld tuine",
"tog-previewonfirst": "Preview laote zien bie de ierste bewirking",
"tog-shownumberswatching": "'t Aantal gebroekers tuine die dees pagina volg",
"tog-oldsig": "Bestaonde ongerteikening:",
"tog-fancysig": "Es wikiteks behanjele (zonder autematische verwiezing)",
- "tog-uselivepreview": "\"live veurbesjouwing\" gebroeke (vereis JavaScript - experimenteel)",
+ "tog-uselivepreview": "\"live veurbesjouwing\" gebroeke",
"tog-forceeditsummary": "'n Melding gaeve bie 'n laeg samevatting",
"tog-watchlisthideown": "Eige bewirkinge verberge op mien volglies",
"tog-watchlisthidebots": "Botbewirkinge op mien volglies verberge",
"tog-watchlisthideminor": "Klein bewirkinge op mien volglies verberge",
"tog-watchlisthideliu": "Bewirkinge van aangemelde gebroekers op mien volglies versjtaeke",
+ "tog-watchlistreloadautomatically": "Herlaaj de volglies autematis es 'n filter is verangerd (JavaScript vereis)",
"tog-watchlisthideanons": "Bewirkinge van anonieme gebroekers op mien volglies versjtaeke",
"tog-watchlisthidepatrolled": "Gemarkeerde wieziginge op mien volglies verberge",
+ "tog-watchlisthidecategorization": "Verberg categorisatie van pagina's",
"tog-ccmeonemails": "'n Kopie nao mich versjikke van de e-mail dae ich nao anger gebroekers sjik",
"tog-diffonly": "Pagina-inhaud zónger verangeringe neet tuine",
"tog-showhiddencats": "Verbórge categorië tuine",
"tog-norollbackdiff": "Wieziginge eweglaote nao trökdrieje",
- "tog-useeditwarning": "Waorssjoew mich es ich 'n bewerkdje pagina die nag neet is opgeslage wil verlaote",
+ "tog-useeditwarning": "Waarsjoew mich es ich 'n bewerkde pagina die nog neet is opgeslage wil verlaote",
+ "tog-prefershttps": "Ummer 'n beveiligde verbinding gebroeke es ich ingelog bin",
"underline-always": "Altied",
"underline-never": "Noets",
"underline-default": "Sjtanderd van de browser",
"oct": "okt",
"nov": "nov",
"dec": "dec",
+ "january-date": "$1 jannewarie",
+ "february-date": "$1 fibberwarie",
+ "march-date": "$1 miert",
+ "april-date": "$1 april",
+ "may-date": "$1 mei",
+ "june-date": "$1 juni",
+ "july-date": "$1 juli",
+ "august-date": "$1 augustus",
+ "september-date": "$1 september",
+ "october-date": "$1 oktober",
+ "november-date": "$1 november",
+ "december-date": "$1 december",
+ "period-am": "AM",
+ "period-pm": "PM",
"pagecategories": "{{PLURAL:$1|Categorie|Categorieë}}",
"category_header": "Artikele in categorie \"$1\"",
"subcategories": "Subcategorieë",
"newwindow": "(in nuuj venster)",
"cancel": "Aafbraeke",
"moredotdotdot": "Miè...",
+ "morenotlisted": "Deze lies is neet compleet.",
"mypage": "Mien gebroekerspagina",
"mytalk": "Euverlèk",
"anontalk": "Euverlèk veur dit IP adres",
"actions": "Hanjeling",
"namespaces": "Naamruumdes",
"variants": "Anger vorme",
+ "navigation-heading": "Navigatiemenu",
"errorpagetitle": "Fout",
"returnto": "Truuk nao $1.",
"tagline": "Van {{SITENAME}}",
"permalink": "Permanente link",
"print": "Aafdrukke",
"view": "Bekieke",
- "edit": "Bewèrk",
+ "view-foreign": "Betrach op $1",
+ "edit": "Bewirk",
+ "edit-local": "Lokaal besjrieving bewirke",
"create": "Aanmake",
- "editthispage": "Pagina bewirke",
+ "create-local": "Lokaal besjrieving toeveuge",
+ "editthispage": "Dees pagina bewirke",
"create-this-page": "Dees pagina aanmake",
"delete": "Wisse",
"deletethispage": "Wisse",
+ "undeletethispage": "Dees pagina trökzètte",
"undelete_short": "$1 {{PLURAL:$1|bewirking|bewirkinge}} trökzètte",
"viewdeleted_short": "{{PLURAL:$1|ein eweggesjafde versie|$1 eweggesjafde versies}} bekieke",
"protect": "Besjirm",
"otherlanguages": "Anger tale",
"redirectedfrom": "(Doorverweze van $1)",
"redirectpagesub": "Doorverwiespagina",
+ "redirectto": "Doorverwieze nao:",
"lastmodifiedat": "Dees pagina is 't lèts verangerd op $2, $1.",
"viewcount": "Dees pagina is {{PLURAL:$1|1 kier|$1 kier}} bekeke.",
"protectedpage": "Beveiligde pagina",
"pool-errorunknown": "Ónbekènde fout",
"aboutsite": "Euver {{SITENAME}}",
"aboutpage": "Project:Info",
- "copyright": "De inhawd is besjikbaar ónger de $1.",
+ "copyright": "De inhawd is besjikbaar ónger de $1 behauve is angers aangegeve.",
"copyrightpage": "{{ns:project}}:Auteursrechte",
"currentevents": "In 't nuujs",
"currentevents-url": "Project:In 't nuujs",
"disclaimers": "Aafwiezinge aansjprakelikheid",
"disclaimerpage": "Project:Algemein aafwiezing aansjprakelikheid",
"edithelp": "Hulp bie bewirke",
+ "helppage-top-gethelp": "Hölp",
"mainpage": "Veurblaad",
"mainpage-description": "Veurblaad",
"policy-url": "Project:Beleid",
"hidetoc": "versjtaek",
"collapsible-collapse": "Inklappe",
"collapsible-expand": "Oetklappe",
+ "confirmable-confirm": "Bis {{GENDER:$1|diech}} zeker?",
+ "confirmable-yes": "Jao",
+ "confirmable-no": "Nein",
"thisisdeleted": "$1 tuine of trökzètte?",
"viewdeleted": "$1 tuine?",
"restorelink": "{{PLURAL:$1|ein eweggesjafde versie|$1 eweggesjafde versies}}",
"nstab-template": "Sjabloon",
"nstab-help": "Hulppagina",
"nstab-category": "Categorie",
+ "mainpage-nstab": "Veurblaad",
"nosuchaction": "Gevraogde hanjeling besjteit neet",
"nosuchactiontext": "De opdrach in de URL is ongeldig.\nMäögelik höbs te 'n typefout gemaak in de URL, of 'n verkierde verwiezing gevolg.\n't Kan ouch wieze op 'n fout in de software van {{SITENAME}}.",
"nosuchspecialpage": "D'r besjteit gein speciaal pagina mit deze naam",
"passwordreset-emailtext-user": "Gebroeker $1 op de site {{SITENAME}} haet dien gebroekersgegaeves veur {{SITENAME}} ($4) ópgevraog.\nDe volgende {{PLURAL:$3|gebroeker is|gebroekers zint}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tiedelik wachwaord vervilt|Dees tiedelike wachweurd vervallen}} euver {{PLURAL:$5|einen daag|$5 daag}}.\nMel dich aan en veranger 't wachwaord noe. Es se dit verzeuk neet zelf hes gedaon, of es se 't oorspronkelik wachwaord nog kins en 't neet anges wils, laot dit berich den en blief dien aad wachwaord gebroeke.",
"passwordreset-emailelement": "Gebroekersnaam: \n$1\n\nTiedelik wachwaord: \n$2",
"passwordreset-emailsentemail": "d'r Is per mail 'n herinnering versjik.",
- "passwordreset-emailsent-capture": "d'r Is 'ne herinneringse-mail versjik. Deze weurt hieónger getuind.",
- "passwordreset-emailerror-capture": "d'r Is 'ne herinneringse-mail aangemaak. Deze weurt hieónger getuind. 't Verzènje nao de gebroeker is mislök óm de volgende raeje: $1",
"changeemail": "Veranger dien e-mailadres",
"changeemail-header": "Veranger 't e-mailadres van miene gebroekersnaam",
"changeemail-no-info": "Doe moos aangemeld zien ierdets doe dees pagina gebroeke kens.",
"minoredit": "Dit is 'n klein verangering",
"watchthis": "Volg dees pagina",
"savearticle": "Pagina opsjlaon",
+ "publishpage": "Pagina publicere",
+ "publishchanges": "Verangeringe publicere",
"preview": "Naokieke",
"showpreview": "Betrach dees bewirking",
"showdiff": "Toen verangeringe",
"token_suffix_mismatch": "'''Dien bewerking is geweigerd omdat dien client de laesteikes in 't bewerkingstoken onjuist haet behandeld. De bewerking is geweigerd om verminking van de paginateks te veurkomme. Dit gebeurt soms es d'r een webgebaseerde proxydienst wurt gebroek die foute bevat.'''",
"edit_form_incomplete": "'''Sommige ongerdeile van 't bewerkingsformuleer höbbe de server neet bereik. Controleer of dien bewerkinge intak zien en perbeer 't obbenuits.'''",
"editing": "Bewirkingspagina: $1",
- "creating": "$1 aanmakendj",
+ "creating": "Aanmake van $1",
"editingsection": "Bewirke van sectie van $1",
"editingcomment": "Bewirke $1 (commentair)",
"editconflict": "Bewirkingsconflik: $1",
"undo-failure": "De verangering kòs neet ongedaon gemaak waere waeges angere striedige verangeringe.",
"undo-norev": "De bewerking kon neet ongedaan gemaak waere, omdat die neet besteet of is verwijderd.",
"undo-summary": "Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|euverlèk]]) óngedaon gemaak.",
- "cantcreateaccounttitle": "Aanmake gebroeker misluk.",
"cantcreateaccount-text": "'t Aanmake van gebroekers van dit IP-adres ('''$1''') is geblokkeerd door [[User:$3|$3]].\n\nDe door $3 opgegaeve reje is ''$2''",
"viewpagelogs": "Logbeuk veur dees pagina tuine",
"nohistory": "Dees pagina is nog neet bewirk.",
"special-characters-group-lao": "Lao",
"special-characters-group-khmer": "Cambodzjaans",
"mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
- "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
- "api-error-blacklisted": "Kees 'nen angere, besjrievendje naam."
+ "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
}
"tog-watchdefault": "Azonzi e paggine e i files che modiffico a-i mæ sotta oservaçion",
"tog-watchmoves": "Azonzi e paggine e i file che mescio a-i mæ sotta oservaçion",
"tog-watchdeletion": "Azonzi e paggine e i files che scancello a-i mæ sotta oservaçion",
+ "tog-watchuploads": "Azonzi i noeuvi file che metto in osservaçion",
"tog-watchrollback": "Azonzi a-i sotta osservassion e paggine dovve ho fæto un rollback",
"tog-minordefault": "Indica de longo comme menô e modiffiche",
"tog-previewontop": "Veddi l'anteprimma de d'äto a-o spaçio pe cangiâ",
"tog-previewonfirst": "Veddi l'anteprimma a-o primmo cangiamento",
"tog-enotifwatchlistpages": "Famme savéi via e-mail quande 'na paggina o in file inti mæ osservæ a ven cangiâ.",
"tog-enotifusertalkpages": "Màndime un'e-mail se gh'é de modìffiche inta mæ pagina de discuscion.",
- "tog-enotifminoredits": "Inviami una email pe e modifiche menoî ascì de pagine e di file",
+ "tog-enotifminoredits": "Mandime una email ascì pe e modifiche menoî de pagine e di file",
"tog-enotifrevealaddr": "Mostra o mæ addresso inte e-mail de notiffica",
"tog-shownumberswatching": "Mostra o numero di utenti che tegnan d'oeuggio sta pagina",
"tog-oldsig": "Firma attuale:",
"editfont-sansserif": "Carattere sans-serif",
"editfont-serif": "Carattere serif",
"sunday": "Domenega",
- "monday": "Lunedì",
- "tuesday": "Martedì",
+ "monday": "Lunesdì",
+ "tuesday": "Matesdì",
"wednesday": "Mäcordì",
"thursday": "Zeuggia",
"friday": "Venardì",
"talkpage": "Paggina de discuscion",
"talkpagelinktext": "Ciæti",
"specialpage": "Pagina speçiâ",
- "personaltools": "Strùmenti personâli",
+ "personaltools": "Strumenti personâli",
"articlepage": "Veddi a voxe",
"talk": "Discuscion",
"views": "Vìxite",
"viewcount": "'Sta paggina a l'è stæta vista {{PLURAL:$1|solo 'na vòtta|$1 vòtte}}.",
"protectedpage": "Paggina protetta",
"jumpto": "Vanni a:",
- "jumptonavigation": "Navegaçión",
+ "jumptonavigation": "navegaçión",
"jumptosearch": "çerca",
"view-pool-error": "Scuza ma a-o momento i server sono stracarreghi.\nTroppi utenti çercan d' amiâ sta paggina.\nAspeta quarche menuto primma de çercâ torna d'accede a sta pagina.\n\n$1",
"generic-pool-error": "Scuza ma a-o momento i server sono stracarreghi.\nTroppi utenti çercan d' amiâ sta risorsa.\nAspeta quarche menuto primma de çercâ torna d'accede a sta risorsa.",
"databaseerror-query": "Query: $1",
"databaseerror-function": "Fonsion: $1",
"databaseerror-error": "Errô: $1",
+ "transaction-duration-limit-exceeded": "Pe evitâ un ato ritardo de replica, questa opiaçion a l'è stæta interotta perché a duata do tempo de scrittua ($1) a l'ha superou o limmite de $2 {{PLURAL:$2|segondo|segondi}}.\nSe t'ê aproeuvo a cangiâ tante cose inte'na votta sola, proeuva invece a cangiâ poche cose in tante votte.",
"laggedslavemode": "'''Attension:''' a paggina a porriæ no riportâ i aggiornamenti ciù reçenti.",
"readonly": "Database bloccòu",
"enterlockreason": "Scrivi o motivo do blocco, e 'na stimma de quande o saiâ rimosso",
"mypreferencesprotected": "No ti g'hæ o permisso pe modificâ e teu preferense.",
"ns-specialprotected": "No se pœu modificâ e paggine speciali",
"titleprotected": "A creaçion de 'na paggina con sto tittolo a l'è stæta bloccâ da [[User:$1|$1]].\nA raxon a l'è: <em>$2</em>.",
- "filereadonlyerror": "N'ho posciuo modificâ o file \"$1\" perché o repository de file \"$2\" o l'è in modalitæ de sola lettua.\n\nL'amministratô ch'o l'ha bloccòu o l'ha fornio sta motivaçion: \"$3\".",
+ "filereadonlyerror": "N'ho posciuo modificâ o file \"$1\" perché o repository de file \"$2\" o l'è in modalitæ de sola lettua.\n\nL'amministratô de scistema ch'o l'ha bloccòu o l'ha fornio sta motivaçion: \"$3\".",
"invalidtitle-knownnamespace": "Tittolo non vallido con namespace \"$2\" e testo \"$3\"",
"invalidtitle-unknownnamespace": "Tittolo non vallido con namespace sconosciuo \"$1\" e testo \"$2\"",
"exception-nologin": "No t'ê introu",
"virus-scanfailed": "scansion fallia (codice $1)",
"virus-unknownscanner": "antivirus sconosciuo:",
"logouttext": "'''Sciortîa effettuâ.'''\n\nDanni a mente che gh'è de paggine che porrieivan continuâ a pai comme se a sciortîa a no foise avegnua, pe scin che no ti nettezzi a cache do to navegatô.",
+ "cannotlogoutnow-title": "Aoa no se poeu sciortî",
+ "cannotlogoutnow-text": "Quande s'adoeuvia $1 no se poeu sciortî.",
"welcomeuser": "Benvegnuo, $1!",
"welcomecreation-msg": "L'utensa a l'è stæta creâ correttamente.\nSe ti veu ti peu personalizzâ e [[Special:Preferences|preferençe de {{SITENAME}}]].",
"yourname": "Nomme",
"remembermypassword": "Aregòrda a mæ login in sto navegatô (pe in mascimo de $1 {{PLURAL:$1|giórno|giórni}})",
"userlogin-remembermypassword": "Mantegnime collegou",
"userlogin-signwithsecure": "Adoeuvia una conescion segua",
+ "cannotloginnow-title": "Aoa no se poeu intrâ",
+ "cannotloginnow-text": "Quande s'adoeuvia $1 no se poeu intrâ.",
"yourdomainname": "Indirisso do scito:",
"password-change-forbidden": "No ti peu cangiâ poula segretta in questa wiki.",
- "externaldberror": "Gh'è stæto un aro co-ol server de autenticaçion esterno, oppû no ti g'hæ i aotorizzaçioin pe aggiornâ o to accesso esterno.",
+ "externaldberror": "Gh'è stæto un aro co-o server de aotenticaçion esterno, oppû no ti g'hæ i aotorizzaçioin pe aggiornâ o to accesso esterno.",
"login": "Intra",
+ "login-security": "Veifica a to identitæ",
"nav-login-createaccount": "Intra / Registrate",
"userlogin": "Intra / Registrite",
"userloginnocreate": "Intra",
"userlogin-resetpassword-link": "T'hæ miga ascordou a teu poula segretta?",
"userlogin-helplink2": "Agiutto pe intrâ",
"userlogin-loggedin": "Ti t'ê zà connesso comme {{GENDER:$1|$1}}.\nUsa o formulaio sottostante pe accede comme 'n atro utente.",
+ "userlogin-reauth": "Ti g'hæ da intrâ 'n'atra votta pe veificâ che ti t'ê {{GENDER:$1|$1}}.",
"userlogin-createanother": "Crea 'n atra utensa",
"createacct-emailrequired": "Addresso e-mail:",
"createacct-emailoptional": "Adresso email (opsionale)",
"createacct-email-ph": "Scrivi o teu adresso email",
"createacct-another-email-ph": "Scrivi o teu adresso email",
"createaccountmail": "Doeuvia una password temporanea abrettio e mandila a l'adresso de posta elettronica speçificou",
+ "createaccountmail-help": "O poeu ese doeuviou pe creâ un'utensa pe 'n'atra person-a sensa doveine conosce a password.",
"createacct-realname": "Nomme reale (opçionâ)",
"createaccountreason": "Raxon:",
"createacct-reason": "Raxon",
"createacct-reason-ph": "Perché t'ê apreuvo a creâ un'atra utensa",
+ "createacct-reason-help": "Messaggio vixualizou into registro da creaçion de l'utença",
"createacct-submit": "Crea a to utensa",
"createacct-another-submit": "Crea utensa",
+ "createacct-continue-submit": "Continnoa a creaçion de l'utença",
+ "createacct-another-continue-submit": "Continnoa a creaçion de l'utença",
"createacct-benefit-heading": "{{SITENAME}} o l'è realizzou da de gente comme ti.",
"createacct-benefit-body1": "{{PLURAL:$1|modiffica|modiffiche}}",
"createacct-benefit-body2": "{{PLURAL:$1|paggina|paggine}}",
"nocookiesnew": "L'utensa a l'è stæta creâ, ma ti no t'ê intròu. {{SITENAME}} o deuvia i cookie pe lasciâ intrâ i utenti e ti ti ghe l'hæ disattivæ.\nRipreuva a intrâ co-o to nomme utente e poula segretta apen-a creæ doppo avei attivòu i cookie.",
"nocookieslogin": "Pe intrâ in {{SITENAME}} bezeugna aveighe i cookie attivæ. Ti ti ghe l'hæ disattivæ. Pe piaxei attîvili e preuva torna a intrâ.",
"nocookiesfornew": "L'utensa a no l'è stæta creâ, perché n'emmo posciuo confermâ a so sorgente.\nAsseguite d'avei attivòu i cookie, recarrega sta paggina e ripreuva.",
+ "createacct-loginerror": "L'utença a l'è stæta creaa correttamente, ma no l'è stæto poscibbile fate accede in moddo aotomattico. Procedi co l'[[Special:UserLogin|accesso manoâ]].",
"noname": "O nomme d'ûtente o l'è sballiòu.",
"loginsuccesstitle": "Accesso effettuòu",
"loginsuccess": "'''O collegamento a-o server de {{SITENAME}} co-o nomme d'ûtente \"$1\" o l'è attivo.'''",
"nouserspecified": "Ti g'hæ da specificâ un nomme utente.",
"login-userblocked": "St'utente o l'è bloccou. Accesso negou.",
"wrongpassword": "Ti gh'æ scrîo 'na paròlla d'ordine sbaliâ. Tenta torna.",
- "wrongpasswordempty": "No ti g'hæ scrîo nisciûnn-a paròlla d'ordine. Tenta torna.",
+ "wrongpasswordempty": "No ti g'hæ scrîto nisciûnn-a paròlla d'ordine. Ritenta.",
"passwordtooshort": "E password devan aveighe aomanco {{PLURAL:$1|1 carattere|$1 caratteri}}.",
"passwordtoolong": "A poula segretta a no peu contegnî ciù de {{PLURAL:$1|1 carattere|$1 caratteri}}.",
"passwordtoopopular": "No se peu deuviâ de paole segrette troppo ordenaie. Pe piaxei çernitene un-a ciu particolâ.",
"passwordremindertext": "Quarchedûn (probabilmente ti, con addresso IP $1) o l'ha domandòu l'invîo de 'na nêuva poula segretta pe l'accesso a {{SITENAME}} ($4).\nA poula segretta temporannia pe l'utente \"$2\" a l'è stæta impostâ a \"$3\".\nSe l'è questo che ti voeivi, intra òua e cangia subbito a poula segretta. A poula segretta temporannia a descazziâ doppo {{PLURAL:$5|un giorno|$5 giorni}}.\n\nSe no t'ê stæto ti a fâ 'sta recesta, oppûre se ti t'ê aregordòu da teu poula segretta e no ti veu ciu cangiâla , ti peu ignorâ sto messaggio e andâ avanti deuviando a vegia poula segretta.",
"noemail": "No gh'è nisciûn indirisso e-mail registròu pe l'ûtente \"$1\".",
"noemailcreate": "Ti devi dâ un addresso e-mail vallido.",
- "passwordsent": "Ûnn-a nêuva paròlla d'ordine a l'è stæta inviâa a l'indirisso e-mail registròu pe l'ûtente \"$1\".\nPe piaxei, fa 'n accesso appenn-a ti a ghe reçeivi.",
- "blocked-mailpassword": "O teu addresso IP o l'è bloccòu, e pe sta raxon non se peu usâ a funsion de recuppero da pòula segretta, pe prevegnî di abuxi.",
+ "passwordsent": "Ûnn-a nêuva paròlla d'ordine a l'è stæta inviâ a l'indirisso e-mail registròu pe l'ûtente \"$1\".\nPe piaxei, fa 'n accesso appenn-a ti a riçeivi.",
+ "blocked-mailpassword": "O teu addresso IP o l'è bloccòu a-e modiffiche, pe prevegnî di abuxi non se peu doeuviâ a fonçion de recuppero da pòula segretta da queseto addresso IP.",
"eauthentsent": "Un messaggio e-mail de conferma o l'è stæto inviòu a l'addresso indicòu.\nPe abilitâ l'invîo de messaggi e-mail pe quest'utensa, se deve seguî e instrussioin indicæ, pe confermâ che ti t'ê o legittimo propietâio de l'utensa.",
"throttled-mailpassword": "Un'e-mail de reimpostassione da poula segretta a l'è zà stæta inviâ da meno de {{PLURAL:$1|1 oa|$1 oe}}.\nPe prevegnî di abuxi, a fonsion de reimpostassion da poula segretta a peu vese deuviâ solo che 'na votta ogni {{PLURAL:$1|oa|$1 oe}}.",
"mailerror": "Errô inte l'invio do messaggio: $1",
"createacct-another-realname-tip": "O nomme veo o l'è opçionâ.\nSe ti çerni de inseilo, o saiâ deuviòu pe attribuî a l'aotô a paternitæ di contengnui inviæ.",
"pt-login": "Intra",
"pt-login-button": "Intra",
+ "pt-login-continue-button": "Continoa l'accesso",
"pt-createaccount": "Registrite",
"pt-userlogout": "Sciorti",
"php-mail-error-unknown": "Errô sconosciuo intaa funçion PHP mail()",
"newpassword": "Neuva poula segretta",
"retypenew": "Ripette a nêuva paròlla d'ordine:",
"resetpass_submit": "Çerni a poula segretta e intra",
- "changepassword-success": "O cangio de password o l'é anæto ben!",
+ "changepassword-success": "A to password a l'è stæta cangiâ!",
"changepassword-throttled": "T'hæ çercòu de intrâ troppe votte tutt'assemme.\nPe piaxei aspeta $1 primma de provâ torna.",
+ "botpasswords": "Password bot",
+ "botpasswords-summary": "<em>Password bot</em> o consente l'accesso a un'utença tramite API sença doeuviâ e credençiæ d'accesso prinçipæ de l'utença. I driti utente disponibili quande s'è effettuou l'accesso co-ina password bot poeuan ese limitæ.\n\nSe no ti conosci o motivo pe-o quæ ti porriesci voeilo fâ, alloa foscia no ti doviesci fâlo. Nisciun doviæ mai domandâte de generâ un de questi e dapoeu dâlo a liatri.",
+ "botpasswords-disabled": "E password bot son disabilitæ.",
+ "botpasswords-no-central-id": "Pe doeuviâ una password bot, l'è necessaio accede a un'utença çentralizzâ.",
+ "botpasswords-existing": "Password bot in existença",
+ "botpasswords-createnew": "Crea una noeuva password bot",
+ "botpasswords-editexisting": "Modifica una password bot existente",
+ "botpasswords-label-appid": "Nomme bot:",
+ "botpasswords-label-create": "Crea",
+ "botpasswords-label-update": "Aggiorna",
+ "botpasswords-label-cancel": "Anulla",
+ "botpasswords-label-delete": "Scassa",
+ "botpasswords-label-resetpassword": "Reimposta a poula segretta",
+ "botpasswords-label-grants": "Assegnaçioin applicabile:",
+ "botpasswords-help-grants": "Ogni assegnaçion a dà accesso a-i driti utente elencæ che un'utença a g'ha zà. Amia a [[Special:ListGrants|tabella d'e assegnaçioin]] pe de ulteioî informaçioin.",
+ "botpasswords-label-restrictions": "Restriçioin d'utilizzo:",
+ "botpasswords-label-grants-column": "Assegnaçioin",
+ "botpasswords-bad-appid": "O nomme bot \"$1\" o no l'è vallido.",
+ "botpasswords-insert-failed": "Imposcibile azonze o nomme bot \"$1\". O l'è za stæto azonto?",
+ "botpasswords-update-failed": "Imposcibile aggiornâ o nomme bot \"$1\". O l'è stæto scassou?",
+ "botpasswords-created-title": "Password bot creâ",
+ "botpasswords-created-body": "A password pe-o bot de nomme \"$1\" de l'utente \"$2\" a l'è stæta creâ.",
+ "botpasswords-updated-title": "Password bot aggiornâ",
+ "botpasswords-updated-body": "A password pe-o bot de nomme \"$1\" de l'utente \"$2\" a l'è stæta aggiornâ.",
+ "botpasswords-deleted-title": "Password bot scassâ",
+ "botpasswords-deleted-body": "A password pe-o bot de nomme \"$1\" de l'utente \"$2\" a l'è stæta scassâ.",
+ "botpasswords-newpassword": "A noeuva password pe accede con <strong>$1</strong> a l'è <strong>$2</strong>. <em>Marchitelo pe rifeimento futuo.</em>",
+ "botpasswords-no-provider": "BotPasswordsSessionProvider o no l'è disponibbile.",
+ "botpasswords-restriction-failed": "E restriçioin de password bot impediscian questo accesso.",
+ "botpasswords-invalid-name": "O nomme utente indicou o no conten o separatô pe-o password bot (\"$1\").",
+ "botpasswords-not-exist": "L'utente \"$1\" o no dispon-e de 'na password bot ciamâ \"$2\".",
"resetpass_forbidden": "No l'é poscìbile cangiâ e paròlle segrétte",
+ "resetpass_forbidden-reason": "No l'é poscìbile cangiâ e paole segrette: $1",
"resetpass-no-info": "Pe anâ direttamente a sta paggina, primma ti g'hæ da intrâ .",
"resetpass-submit-loggedin": "Cangia a password",
"resetpass-submit-cancel": "Anulla",
"passwordreset-email": "Addresso e-mail:",
"passwordreset-emailtitle": "Dettaggi account sciu {{SITENAME}}",
"passwordreset-emailtext-ip": "Quarcun (probabilmente ti, con adresso IP $1) o l'ha domandòu l'invio de 'na neuva poula segretta per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associòu|I utenti associæ}} a sto addresso e-mail son:\n\n$2\n\n{{PLURAL:$3|Questa poula segretta temporannia a descazziâ|Queste poule segrette temporannie descazzian}} doppo {{PLURAL:$5|un giorno|$5 giorni}}.\nTi doviesci accede e çerne una neuva poula segretta oua. \n\nSe no t'ê stæto ti a fâ a domanda, ò se ti t'hæ aregordòu a poula segretta originale e no ti veu ciù cangiâla, ti peu ignorâ sto messaggio e continuâ a deuviâ a teu vegia poula segretta.",
+ "passwordreset-emailtext-user": "L'utente $1 de {{SITENAME}} o l'ha domandou l'inandio de 'na noeuva password pe l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associou|I utenti associæ}} a questo indriçço email son:\n\n$2\n\n{{PLURAL:$3|Questa password temporannia a descazziâ|Queste password temporannie descazian}} doppo {{PLURAL:$5|un giorno|$5 giorni}}.\nTi doviesci accede e çerne una noeuva password aoa. \n\nSe no t'ê stæto ti a fâ a recesta, o se ti t'ê aregordou a password originâ e no ti voeu ciu cangiala, ti poeu ignorâ sto messaggio e continoâ a doeuviâ a to vegia password.",
"passwordreset-emailelement": "Nomme utente: \n$1\n\nPoula segretta temporannia: \n$2",
- "passwordreset-emailsentemail": "Se questo o l'è un addresso de posta elettronnica registròu pe-a teu utensa, alloa saiâ inviâ un'e-mail pe reimpostâ a poula segretta.",
+ "passwordreset-emailsentemail": "Se questo addresso de posta elettronnica o l'è associou a-a teu utença, alloa saiâ inviou un'e-mail pe rempostâ a poula segretta.",
+ "passwordreset-emailsentusername": "Se gh'è un adreçço de posta elettronica associou con questo nomme utente, alloa saiâ inviou una email pe rempostâ a password.",
"passwordreset-emailsent-capture": "L'è stæto inviòu un'e-mail de reimpostaçion da poula segretta, o contegnuo o l'è riportòu chì appreuvo.",
"passwordreset-emailerror-capture": "L'è stæto generòu un'e-mail de reimpostaçion da poula segretta, riportà chì appreuvo. L'invio {{GENDER:$2|a l'utente}} o no l'è ariêscîo: $1",
+ "passwordreset-emailsent-capture2": "L'email de rempostaçion da password {{PLURAL:$1|a l'è stæta inviâ|son stæte inviæ}}. {{PLURAL:$1|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
+ "passwordreset-emailerror-capture2": "Invio de email {{GENDER:$2|a l'utente}} non ariescio: $1. {{PLURAL:$3|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
+ "passwordreset-nocaller": "Un chi ciamma ti g'hæ da dâlo",
+ "passwordreset-nosuchcaller": "O ciamante o no l'existe: $1",
+ "passwordreset-ignored": "A reimpostaçion da password a no l'è stæta gestia. Foscia n'è stæto configuou nisciun provider ?",
+ "passwordreset-invalideamil": "Addresso e-mail non vallido",
+ "passwordreset-nodata": "No è stæto fornio ni un nomme utente ni un adreçço de posta elettronica",
"changeemail": "Cangia o elimmina l'adresso e-mail",
"changeemail-header": "Completa sto formulaio pe cangiâ o to adresso e-mail. Se ti veu rimeuve l'associaçion de quasesegge addresso e-mail da-a teu utensa, lascia io neuvo addresso e-mail veuo quande ti invii o formulaio.",
"changeemail-passwordrequired": "Saiâ necessaio insei a poula segretta pe confermâ a modiffica.",
"minoredit": "Cangiamento minô (m)",
"watchthis": "Metti sotta oservaçion",
"savearticle": "Sarva a pàgina",
+ "savechanges": "Sarva e modiffiche",
+ "publishpage": "Pubbrica a paggina",
+ "publishchanges": "Pubbrica e modiffiche",
"preview": "Anteprìmma",
"showpreview": "Veddi l'anteprimma",
"showdiff": "Veddi i cangiamenti",
"blockedtext": "''''O to nomme utente ò adresso IP o l'è stæto bloccòu.'''\n\nO blòcco o l'è stæto fæto da $1. A raxon dæta a l'è ''$2''.\n\n* Iniçio do blocco: $8\n* Fin do blocco: $6\n* Utente blocou: $7\n\nL'è poscibbile contattâ $1 o un âtro [[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe discûtte inscio blòcco.\nNo ti poeu doeuviâ o comando \"Manda un'e-mail a st'ûtente\" se no ti g'hæ 'n adresso e-mail registròu inte to [[Special:Preferences|preferençe]] e se no t'ê stæto bloccòu ascì.\nO to adresso IP o l'è $3, e o to blòcco ID o l'è #$5.\nPe piaxei, pe domandâ informaçioin, speçifficali tutti doî.",
"autoblockedtext": "O teu addresso IP o l'è stæto bloccòu outomaticamente perché o l'ea za usòu da 'n âtro utente, bloccòu da $1.\nA raxon dæta a l'è stæta:\n\n:''$2''\n\n* Prinsippio do blòcco: $8\n* Fin do blòcco: $6\n\nTi peu contattâ $1 ò un âtro\n[[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe discutte o blòcco.\n\nDanni a mente a che no ti pêu ûsâ o comando \"manda 'na e-mail a sto utente\" se non ti g'hæ 'n addresso de posta elettronega registròu in te têu [[Special:Preferences|preferense]] e se ti no t'ê stæto bloccòu ascì.\n\nO to adresso IP o l'è $3, e o to blòcco ID o l'è #$5. Pe piaxei, pe domandâ informaçioin, speçifficali tutti doî.",
"blockednoreason": "nisciun-a motivaçion dæta",
- "whitelistedittext": "Pe cangia sta pagina devvi $1.",
+ "whitelistedittext": "Pe modificâ e paggine l'è necessaio $1.",
"confirmedittext": "Pe ese abilitæ a-a modiffica de paggine bezeugna confermâ o proppio addresso e-mail. Pe impostâ e confermâ l'adresso servîse de [[Special:Preferences|preferençe]].",
"nosuchsectiontitle": "Imposcibbile trovâ a seçion",
"nosuchsectiontext": "T'hæ çercòu de modificâ una seçion inexistente.\nA porriæ ese stæta mesciâ ò eliminâ mentre ti t'amiavi a paggina.",
"loginreqtitle": "Besêugna registrâse primma de modificâ 'sta paggina.",
- "loginreqlink": "intra",
+ "loginreqlink": "intrâ",
"loginreqpagetext": "Pe amiâ di atre paggine gh'è da $1",
"accmailtitle": "Pòula segretta spedïa",
"accmailtext": "Una poula segretta generâ abrettio pe [[User talk:$1|$1]] a l'è stæta mandâ a $2.\n\nSta poula segretta a peu ese cangiâ inta paggina pe ''[[Special:ChangePassword|cangiâ a poula segretta]]'' subbito doppo l'accesso.",
"newarticle": "(Nêuvo)",
"newarticletext": "Sto colegaménto o corisponde a 'na pàgina ch'a no l'existe ancon.\n\nSe se vêu creâ a pàgina òua, se pêu comensâ a scrive into spàçio chì sotta.\n(amia e [$1 paggine d'agiûtto] pe ciû informaçioìn).\n\nSe t'ê intròu chì pe sballio, sciacca '''Inderê''' into navegatô.",
- "anontalkpagetext": "----\n''Sta chì a l'è a paggina de discuscion de un utente anonnimo, ch'o no l'ha ancon creou un'utensa o comunque o no a doeuvia oua. Pe identificâlo l'è quindi necessaio doeuviâ o nummero do so adresso IP. I adresci IP poeuan però ese condivixi da ciù utenti. Se t'ê un utente anonimo e ti ritegni che i commenti inte sta pagina no se riferiscian a ti, [[Special:CreateAccount|crea una noeuva utensa]] o donque [[Special:UserLogin|intra con quella che ti g'hæ za]] pe evitâ de chì avanti de ese confuzo con di atri utenti anonnimi .''",
- "noarticletext": "Po-u momento a pagina çercâ a l'è vêua. L'è poscibbile [[Special:Search/{{PAGENAME}}|çercâ 'sto tittolo]] inte âtre pagine do scîto opû [{{fullurl:{{FULLPAGENAME}}|action=edit}} cangiâ a pagina òua].",
+ "anontalkpagetext": "----\n<em>Sta chì a l'è a paggina de discuscion de un utente anonnimo, ch'o no l'ha ancon creou un'utensa o comunque o no a doeuvia oua.</em> Pe identificâlo l'è quindi necessaio doeuviâ o nummero do so adresso IP. I adresci IP poeuan però ese condivixi da ciù utenti. Se t'ê un utente anonnimo e ti ritegni che i commenti inte sta pagina no se riferiscian a ti, [[Special:CreateAccount|crea una noeuva utensa]] o donque [[Special:UserLogin|intra con quella che ti g'hæ za]] pe evitâ de chì avanti de ese confuzo con di atri utenti anonnimi .",
+ "noarticletext": "Po-u momento a pagina çercâ a l'è vêua. Ti poeu [[Special:Search/{{PAGENAME}}|çercâ sto tittolo]] inti atre pagine do scito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri correlæ] oppû [{{fullurl:{{FULLPAGENAME}}|action=edit}} creâ questa pagina]</span>.",
"noarticletext-nopermission": "Òua a pàgina çercâ a l'è vêua. L'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte di âtre pàgine do scîto o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri corelæ]</span>, ma no ti gh'hæ i outorizzaçioin pe creâ sta paggina.",
"missing-revision": "La verscion #$1 da paggina \"{{FULLPAGENAME}}\" a no l'esiste.\n\nQuesto succede solitamente se inta stoia ti sciacchi un vegio ingancio a una paggina scassâ.\n\nI dettaggi peuan ese attrovæ into [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scançellaçioin].",
"userpage-userdoesnotexist": "L'utensa \"$1\" a no corisponde a un utente registròu.\nTi veu davei creâ o modificâ sta paggina?",
"userpage-userdoesnotexist-view": "L'utensa \"$1\" a no l'è registrâ.",
"blocked-notice-logextract": "St'utente o l'è attualmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì appreuvo pe informassion:",
- "clearyourcache": "<strong>Notta:</strong> doppo avei sarvou, poriæ ese necessaio nettezâ a cache do proppio navegatô pe vedde i cangiamenti. \n*<strong>Firefox / Safari:</strong> tegnî sciacou o tasto de maiuscole <em>Shift</em> e cliccâ <em>Riecarrega</em>, oppû premme <em>Ctrl-F5</em> ò <em>Ctrl-R</em> (<em>⌘-R</em> insce Mac)\n*<strong>Google Chrome:</strong> premme <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> insce un Mac)\n*<strong>Internet Explorer:</strong> tegnî sciacou o tasto <em>Ctrl</em> e cliccâ <em>Aggiorna</em>, oppû premme <em>Ctrl-F5</em>\n*<strong>Opera:</strong> svuâ completamente a cache da-o menu <em>Strumenti → Preferençe</em>",
+ "clearyourcache": "<strong>Notta:</strong> doppo avei sarvou, poriæ ese necessaio netezâ a cache do proppio browser pe vedde i cangiamenti. \n*<strong>Firefox / Safari:</strong> tegni sciacou o tasto de maiuscole <em>Shift</em> e clicca <em>Recarega</em>, oppû sciacca <em>Ctrl-F5</em> ò <em>Ctrl-R</em> (<em>⌘-R</em> su Mac)\n*<strong>Google Chrome:</strong> sciacca <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> insce un Mac)\n*<strong>Internet Explorer:</strong> tegni sciacou o tasto <em>Ctrl</em> e clicca <em>Aggiorna</em>, oppû sciacca <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Vanni into <em>Menu → Impostaçioin</em> (<em>Opera → Preferençe</em> insce 'n Mac) e dapoeu inte <em>Privacy & segueçça → Nettezza dæti do browser → Inmaggine e file inta cache</em>.",
"usercssyoucanpreview": "'''Suggerimento:''' adeuvia o pomello 'Amia l'anteprimma' per provâ o to neuvo CSS primma de sarvâlo.",
"userjsyoucanpreview": "'''Suggerimento:''' adeuvia o pomello 'Amia l'anteprimma' per provâ o to neuvo JavaScript primma de sarvâlo.",
"usercsspreview": "'''Questa a l'è solo un'anteprimma do proppio CSS personâ. E modiffiche no son ancon stæte sarvæ!'''",
"previewnote": "'''Questa chì a l'è solo 'n'anteprimma; i cangiamenti no son ancon stæti sarvæ!'''",
"continue-editing": "Vanni a l'area de modiffica",
"previewconflict": "L'anteprimma a mostra o scrito presente inta casella de modiffica de d'ato coscì comme o l'apaiâ se ti çerni de sarvalo òua.",
- "session_fail_preview": "'''N'emmo posciuo elaborâ a modiffica a caosa da pèrdia di dæti relativi a-a sescion.'''\nRitenta.\nSe-o problema o persciste, preuva a [[Special:UserLogout|sciortî]] e a intrâ torna.'''",
+ "session_fail_preview": "Spiaxenti. No è stæto poscibile elaboâ a modifica perché son andæti persci i dæti relativi a-a sescion.\n\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon collegou e riproeuva</strong>.\nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettuâ un nuoeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+ "session_fail_preview_html": "Spiaxenti. No è stæto poscibbile elaboâ a modifica perché son anæti persci i dæti relativi a-a sescion.\n\n<em>Scicomme {{SITENAME}} o g'ha de l'HTML sgroeuzzo attivou e gh'è stæto una perdia di dæti da sescion, l'anteprimma a l'è ascosa comme precaoçion contra i attacchi JavaScript.</em>\n\n<strong>Se se tratta de un normale tentativo d'anteprimma, riproeuva.</strong> \nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegati]] e effettuâ un noeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+ "token_suffix_mismatch": "'''A modiffica a no l'è stæta sarvâ perché o to client o l'ha mostrou de gestî in moddo errou i carattei de puntezatua into token associou a-a mæxima. Pe evitâ una poscibile corruçion do testo da pagina, l'è stæto refuou l'intrega modiffica. Questa scituaçion a poeu veificase, de votte, quande s'adoeuvia di serviççi de proxy anonnimi via web che presentan di bug.'''",
"edit_form_incomplete": "'''De parte do formulaio de modiffica n'han razonto o server; controlla che e modiffiche seggian intatte e ripreuva.'''",
"editing": "Modiffica de $1",
"creating": "T'ê apreuvo a creâ $1",
"editingold": "<strong>Attençion: t'ê apreuvo a modificâ una verscion non aggiornâ da paggina.</strong>\nSarvandola coscì, tutti i cangi fæti doppo sta verscion saian sorvescriti.",
"yourdiff": "Differense",
"copyrightwarning": "Nota: Tùtte e contribuçioìn a {{SITENAME}} van conscideræ comme rilasciæ drento a-i termini da licensa d'ûso $2 (veddi $1 pe savéine de ciù).\nSe no ti veu che i testi teu pêuan esse modificæ da quarchedùn sensa limitaçioìn, no mandâli a {{SITENAME}}.<br />\nInviando o testo ti diciâri, sott'a teu responsabilitæ, ch'o l'é stæto scrîto da ti personalmente oppure ch'o l'é stæto piggiòu da 'na fonte de pùbrico domìnio òu anàlogamente lìbea.<br />\n'''NO INVIÂ MATERIÂLE COVERTO DA DRÎTI D'AUTÔ SENSA OUTORIZAÇION!'''",
+ "copyrightwarning2": "Pe piaxei tegni presente che tutti i contributi a {{SITENAME}} poeuan ese modificæ, alteræ ò scassæ da di atri contributoî.\nSe no ti voeu che se faççe ravaxo di to testi, alloa no stali manco a mette.<br />\nInviando o testo ti deciæi ascì, sotta a to responsabilitæ, ch'o l'è stæto scrito da ti personalmente oppù ch'o l'è stæto copiou da 'na fonte de pubbrico dominnio o scimilemente libera (vedi $1 pe dettaggi).\n'''No stanni a inviâ do mateiâ protetto da-o drito d'aotô sença aotorizzaçion!'''",
"editpage-cannot-use-custom-model": "O modello do contegnuo de sta paggina o no peu ese modificòu.",
"longpageerror": "'''Errô: o scrito inviou o l'è longo {{PLURAL:$1|1|$1}} kilobyte, ciu che-o mascimo consentio de ({{PLURAL:$2|1|$2}} kilobyte).'''\nNo se peu sarvâ.",
+ "readonlywarning": "<strong>Attençion</strong>: o database o l'è bloccou pe manutençion, no l'è momentaniamente poscibile sarvâ e modifiche effettuæ.\nPe no perdile, coppile in te'n file de testo e sarvilo in atteisa do sbrocco do database.\n\nL'amministratô de scistema ch'o l'ha misso l'abrocco o l'ha fornio questa spiegaçion: $1.",
"protectedpagewarning": "'''Attençion: questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala.'''\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referença:",
"semiprotectedpagewarning": "'''Notta:''' Questa paggina a l'è stæta bloccä de moddo che solo i utenti registræ possan modificâla.\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referensa:",
"cascadeprotectedwarning": "'''Attençion:''' Questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala da-o momento ch'a l'é inclusa seleçionando a proteçion \"ricorsciva\" {{PLURAL:$1|inta paggina|inte paggine}}:",
"permissionserrors": "No ti g'hæ o permisso",
"permissionserrorstext": "No ti g'hæ i permissi pe fâlo, pe {{PLURAL:$1|questa raxon|queste raxoin}}:",
"permissionserrorstext-withaction": "No ti g'hæ i permìssi pe $2 pe {{PLURAL:$1|sta raxon|ste raxoìn}}:",
- "contentmodelediterror": "No ti peu modificâ sta verscion da-o momento che o so modello de contegnuo o l'è <code>$1</code>, mentre o corrente modello de contegnuo da paggina o l'è <code>$2</code>.",
+ "contentmodelediterror": "No ti peu modificâ sta verscion da-o momento che o so modello de contegnuo o l'è <code>$1</code>, ch'o diffeisce da-o corrente modello de contegnuo da paggina <code>$2</code>.",
"recreate-moveddeleted-warn": "Atençión: ti stæ pe ricreâ 'na pàgina zà scancelâ into passòu.'''\n\nConsciddera se l'è o caxo de continoâ a cangiâ 'sta pàgina.\nPe comoditæ e cancellaçioìn e i stramui son pubricæ chì sotta:",
"moveddeleted-notice": "Sta pàgina a l'é stæta scancelâ.\nA lista de scancelaçioìn e di stramui son riportæ chi de sotta pe informaçión.",
"moveddeleted-notice-recent": "Spiaxenti, sta paggina a l'è stæta scassâ reçentemente (inte urtime 24 oe).\n\nE açioin de cançellaçion e spostamento pe questa paggina son disponibile chì appreuvo pe referença.",
"content-model-javascript": "JavaScript",
"content-json-empty-object": "Ogetto veuo",
"content-json-empty-array": "Array veuo",
+ "deprecated-self-close-category": "Paggine ch'adoeuvian di tag HTML aoto-ciosi non vallidi",
+ "deprecated-self-close-category-desc": "A pagina a conten di tag HTML aoto-ciosi non vallidi, comme <code><b/></code> o <code><span/></code>. O comportamento de questi fito o cangiâ pe ese coerente co-e specifiche HTML5, pe questo o so utilizzo into wikitesto o l'è deprecou.",
"duplicate-args-warning": "<strong>Avvertensa:</strong> [[:$1]] o ciamma [[:$2]] con ciù de un valô pe-o parammetro \"$3\". Solo l'urtimo valô fornio o saiâ deuviou.",
"duplicate-args-category": "Paggine che ciamman i template deuviando di parammetri duplicæ",
"duplicate-args-category-desc": "A paggina a conten de ciamæ a di template ch'adeuvian di argomenti duplicæ, comme presempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ò <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
- "expensive-parserfunction-warning": "'''Attençion:''' Questa paggina a conten troppe ciamæ a-e fonçioin de parser .\n\nA doviæ aveighene meno de $2, a-o momento ghe n'è $1.",
+ "expensive-parserfunction-warning": "'''Attençion:''' Questa paggina a conten troppe ciamæ a-e fonçioin de parser .\n\nA doviæ aveighene meno de $2, a-o momento ghe {{PLURAL:$1|n'è $1}}.",
"expensive-parserfunction-category": "Paggine con troppe ciamæ a-e fonçioin de parser .",
"post-expand-template-inclusion-warning": "'''Atento:''' a dimensción di template che t'æ misso a l'é tròppo grande.\nQuarchedun di teu template o no saiâ incluzo.",
"post-expand-template-inclusion-category": "Pàgine con di template che gh'àn a dimensción ciù âta do limite mascimo",
"currentrevisionlink": "Ûrtima revixon",
"cur": "cor",
"next": "Proscimo",
- "last": "Ûrtima",
+ "last": "prec",
"page_first": "primma",
"page_last": "ûrtima",
"histlegend": "Confronto tra verscioîn: selession-a e cascette corispondenti a-e verscioîn dexidiæ e schissa Invio oppû o pomello da basso.\n\nLegenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a verscion precedente, '''m''' = modiffica minô",
"rev-deleted-no-diff": "No ti peu amiâ sto diff percose un-a de verscioin a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.",
"rev-suppressed-no-diff": "No ti peu fâ sto confronto tra verscioin perché un-a a l'è stæta '''scassâ'''.",
"rev-deleted-unhide-diff": "Un-a de verscioin de sto confronto a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.\nTi ti peu ancon [$1 fâ sto confronto] se necessaio.",
+ "rev-suppressed-unhide-diff": "Un-a de verscioin de sto confronto a l'è stæta '''sopressa'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.\nTi peu ancon [$1 fâ sto confronto] se necessaio.",
+ "rev-deleted-diff-view": "Un-a de verscioin de sto confronto a l'è stæta '''scassâ'''.\nTi ti peu amiala; consurta o [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} recistro de rimoçioin] pe-i dettaggi.",
+ "rev-suppressed-diff-view": "Un-a de verscioin de sto confronto a l'è stæta '''sopressa'''.\nTi ti peu amiâla; consurta o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de soprescioin] pe-i dettaggi.",
"rev-delundel": "fanni védde/ascondi",
"rev-showdeleted": "mostra",
"revisiondelete": "Scassa ò ripristina verscioin",
"revdelete-nooldid-title": "Verscion non specificâ",
+ "revdelete-nooldid-text": "No t'hæ speçificou nisciun-a revixon in sciâ quæ eseguî questa fonçion, oppû a revixon speçificâ a no l'existe, ò che donque t'ê aproeuvo a çercâ d'asconde a revixon attuale.",
"revdelete-no-file": "O file specificou o no l'existe.",
"revdelete-show-file-confirm": "T'ê seguo de voei amiâ a verscion scassâ do file \"<nowiki>$1</nowiki>\" do $2 a $3?",
"revdelete-show-file-submit": "Sci",
"revdelete-selected-text": "{{PLURAL:$1|Verscion seleçionâ|Verscioin seleçionæ}} de [[:$2]]:",
- "revdelete-selected-file": "{{PLURAL:$1|Verscion seleçionata|Verscioin seleçionæ}} do file [[:$2]]:",
+ "revdelete-selected-file": "{{PLURAL:$1|Verscion seleçionâ|Verscioin seleçionæ}} do file [[:$2]]:",
"logdelete-selected": "{{PLURAL:$1|Evento do registro seleçionou|Eventi do registro seleçionou}}:",
+ "revdelete-text-text": "E verscioin scassæ apparian ancon inta cronologia da pagina, ma parte do so contegnuo o saiâ inaccescibile a-o pubbrico.",
+ "revdelete-text-file": "E verscioin di file scassæ apparian ancon inta cronologia do file, ma parte do so contegnuo a saiâ inaccescibile a-o pubbrico.",
+ "logdelete-text": "I eventi scassæ apparian ancon inti registri, ma 'na parte do so contegnuo a saiâ inaccescibile a-o pubbrico.",
+ "revdelete-text-others": "Di atri amministratoî saian ancon in grou de accede a-i contegnui ascoxi e porian ripristinali, se no l'è stæto impostou de restriçioin azontive.",
+ "revdelete-confirm": "Pe piaxei conferma che questo l'è quante t'intendi fâ, che t'accapisci e conseguençe, e che ti o fæ into rispetto de [[{{MediaWiki:Policy-url}}|linnie guidda]].",
+ "revdelete-suppress-text": "A rimoçion a saiæ da doeuviâ '''solo''' che inti seguenti caxi:\n* informaçioin potençialmente diffamatoie\n* dæti personæ inoportun\n*: ''indiriççi, nummeri de teleffono, coddiçi fiscali, ecc.''",
"revdelete-legend": "Imposta e limitaçioin de vixibilitæ:",
"revdelete-hide-text": "Testo da verscion",
"revdelete-hide-image": "Ascondi i contegnui do file",
"revdelete-unsuppress": "Elimmina e limitaçioin in scê verscioin ripristinæ",
"revdelete-log": "Raxon:",
"revdelete-submit": "Applica {{PLURAL:$1|a-a verscion seleçionâ|a-e verscioin seleçionæ}}",
- "revdelete-success": "'''Vixibilitæ da verscion agiornâ con successo.'''",
+ "revdelete-success": "'''Vixibilitæ da verscion agiornâ.'''",
"revdelete-failure": "'''A vixibilitæ da verscion a no peu ese agiornâ:'''\n$1",
- "logdelete-success": "'''Registro de vixibilitæ impostou con successo.'''",
+ "logdelete-success": "'''Registro de vixibilitæ impostou.'''",
"logdelete-failure": "No s'è posciuo impostâ o registro de vixibilitæ: $1",
"revdel-restore": "càngia a vixibilitæ",
"pagehist": "Stoia da paggina",
"revdelete-modify-no-access": "Imposcibbile modificâ l'ogetto con dæta $1 $2 in quanto o l'è stæto identificou comme \"riservou\" e no se dispon-e do relativo accesso.",
"revdelete-modify-missing": "Imposcibbile modificâ l'ogetto con ID $1: into database o no gh'è!",
"revdelete-no-change": "'''Attençion:''' l'ogetto con dæta $1 $2 o l'aveiva zà e impostaçioin de vixibilitæ domandæ.",
+ "revdelete-concurrent-change": "Imposcibile modificâ l'ogetto con dæta $1, $2: pâ che o so stato o segge stæto modificou da un atro utente dementre che ti ti çercavi de modificalo.",
+ "revdelete-only-restricted": "Errô inte l'asconde l'ogetto datou $1, $2: no ti poeu asconde i ogetti a-i amministratoî sença seleçionâ un-a di atre opçioin de vixibilitæ.",
"revdelete-reason-dropdown": "* Raxoin ciù comun-e pe-o scassamento\n** Violaçion do drito d'outô\n** Commenti ò informaçioin personæ inappropiæ\n** Nomme utente inappropiou\n** Informaçion potençialmente diffamatoia",
"revdelete-otherreason": "Un atro motivo:",
"revdelete-reasonotherlist": "Un'atra raxon",
"revdelete-edit-reasonlist": "Modiffica e raxoin do scassamento",
"revdelete-offender": "Aotô da verscion:",
"suppressionlog": "Registro de sopprescioin",
+ "suppressionlogtext": "De sotta gh'è 'na lista de scassatue e di brocchi con do contegnuo ascoso a-i amministratoî.\nAmia a [[Special:BlockList|lista di blocchi]] pe l'elenco di bandi e di blocchi attivi a-o momento.",
"mergehistory": "Union de stoie da paggina",
+ "mergehistory-header": "Questa pagina a consente de unî e verscioin d'a cronologia de 'na pagina sorgente a 'na pagina ciù reçente.\nAsseguite che sto cangio o mantegne a continuitæ storica da pagina.",
"mergehistory-box": "Unisci a stoia de doe paggine:",
"mergehistory-from": "Paggina d'origgine:",
"mergehistory-into": "Paggina de destinaçion:",
"mergehistory-empty": "Nisciun-a verscion da unî.",
"mergehistory-done": "{{PLURAL:$3|Una verscion de $1 a l'è stæta unia|$3 vercsioin de $1 son stæte unie}} a-a stoia de [[:$2]].",
"mergehistory-fail": "Imposcibbile unî e stoie. Verificâ a paggina e i parammetri temporali.",
+ "mergehistory-fail-bad-timestamp": "O timestamp o no l'è vallido.",
+ "mergehistory-fail-invalid-source": "A pagina sorgente a no l'è vallida.",
+ "mergehistory-fail-invalid-dest": "A pagina de destinaçion a no l'è vallida.",
+ "mergehistory-fail-no-change": "L'union de cronologie a no l'ha unio arcun-a verscion. Ricontrolla e pagine e i parametri temporali.",
+ "mergehistory-fail-permission": "Aotorizzaçioin insuffixente pe unî e cronologie.",
+ "mergehistory-fail-self-merge": "A paggina d'origgine e quella de destinaçion son a mæxima",
+ "mergehistory-fail-timestamps-overlap": "E verscioin d'origine se sorvepon-an ò vegnan doppo e verscioin de destinaçion.",
"mergehistory-fail-toobig": "Imposcibbile eseguî l'union da stoia essendoghe ciu che o limmite de $1 {{PLURAL:$1|verscion|verscioin}} da mesciâ.",
"mergehistory-no-source": "A paggina d'origgine $1 a no l'existe.",
"mergehistory-no-destination": "A paggina de destinaçion $1 a no l'existe.",
"lineno": "Linia $1:",
"compareselectedversions": "Confronta e verscioîn selessionæ",
"showhideselectedversions": "Mostra/ascondi verscioin seleçionæ",
- "editundo": "Anùlla",
+ "editundo": "anùlla",
"diff-empty": "(Nisciun-a diferença)",
"diff-multi-sameuser": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de 'n mæximo utente {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
"diff-multi-otherusers": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de {{PLURAL:$2|'n atro utente|$2 utenti}} {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
"diff-multi-manyusers": "({{PLURAL:$1|Una verscion intermedia|$1 verscioin intermedie}} de ciu che $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrâ|mostræ}})",
- "searchresults": "Resultati da reçerca",
- "searchresults-title": "Rezoltati da riçerca de \"$1\"",
+ "difference-missing-revision": "{{PLURAL:$2|Una verscion|$2 verscioin}} de questa differença ($1) {{PLURAL:$2|a no l'è stæta atrovâ|no son stæte atrovæ}}.\n\nQuesto succede a l'uso se inta stoia ti sciacchi un vegio ingancio a una paggina scassâ.\n\nI dettaggi ti-i peu attrovâ into [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scançellaçioin].",
+ "searchresults": "Risultæ da riçerca",
+ "searchresults-title": "Risultæ da riçerca de \"$1\"",
"titlematches": "Corispondençe into tittolo de paggine",
"textmatches": "Corispondençe into scrito de paggine",
"notextmatches": "Nisciun-a corispondença into scrito de paggine",
"prev-page": "paggina precedente",
"next-page": "paggina succesciva",
"prevn-title": "{{PLURAL:$1|rezoltato precedénte|rezoltati precedénti}}",
- "nextn-title": "Pròscimo $1 {{PLURAL:$1|rezoltato|rezoltati}}",
- "shown-title": "Fanni védde {{PLURAL:$1|in rizoltato|$1 rizoltati}} pe pàgina",
+ "nextn-title": "{{PLURAL:$1|Risultou succescivo|$1 risultæ succescivi}}",
+ "shown-title": "Fanni védde {{PLURAL:$1|un rizultou|$1 rizultæ}} pe pàgina",
"viewprevnext": "Veddi ($1 {{int:pipe-separator}} $2) ($3).",
"searchmenu-exists": "'''Inte questa wiki gh'è za 'na pàgina co-o nómme \"[[:$1]]\"'''",
"searchmenu-new": "<strong>Crea a paggina \"[[:$1]]\" insce questo wiki!</strong> {{PLURAL:$2|0=|Amia ascì a paggina trovâ co-a teu riçerca|Amia ascì i risultæ da riçerca}}",
- "searchprofile-articles": "Pàgina di contegnûi",
+ "searchprofile-articles": "Pàgina de contegnûi",
"searchprofile-images": "Moltimedia",
"searchprofile-everything": "Tùtto",
"searchprofile-advanced": "Avansæ",
"powersearch-togglenone": "Nisciun",
"powersearch-remember": "Aregordite a seleçion pe-e proscime riçerche",
"search-external": "Riçerca esterna",
- "searchdisabled": "La riçerca de {{SITENAME}} a no l'è attiva. Into fra tempo ti peu çercâ in sce Google. \nNotta che i seu indexi di contegnui de {{SITENAME}} porrieivan no ese aggiornæ.)",
+ "searchdisabled": "A riçerca de {{SITENAME}} a no l'è attiva. Into fratempo ti peu çercâ in sce Google. \nNotta che i so indexi di contegnui de {{SITENAME}} porrieivan no ese aggiornæ.",
"search-error": "S'è verificou 'n errô durante a riçerca: $1",
"preferences": "Preferençe",
"mypreferences": "Preferençe",
"recentchangesdays-max": "Mascimo $1 {{PLURAL:$1|giorno|giorni}}",
"recentchangescount": "Nummero de modiffiche da mostrâ pe difetto:",
"prefs-help-recentchangescount": "Comprende i urtime modiffiche, paggine de stoie e registri.",
+ "prefs-help-watchlist-token2": "Questa a l'è a ciave segretta pe-o feed web di to oservæ.\nChiunque a conosce saiâ in graddo de leze i to oservæ, quindi no stanni a condividdila. [[Special:ResetTokens|Clicca chi se ti g'hæ de besoeugno de rempostâla]].",
"savedprefs": "E teu preferençe son stæte sarvæ.",
"savedrights": "I driti utente de {{GENDER:$1|$1}} son stæti sarvæ.",
"timezonelegend": "Fuso oraio:",
"timezoneregion-europe": "Euiropa",
"timezoneregion-indian": "Oçeano Indian",
"timezoneregion-pacific": "Oçeano Paxiffego",
- "allowemail": "Permitti a posta elettronega da ätri utenti",
+ "allowemail": "Permetti a posta elettronega da di ätri utenti",
"prefs-searchoptions": "Çerca",
"prefs-namespaces": "Namespace:",
"default": "Predefinïo",
"prefs-custom-css": "CSS personalizzou",
"prefs-custom-js": "JavaScript personalizzou",
"prefs-common-css-js": "CSS/JavaScript condiviso pe tutte e pelle:",
+ "prefs-reset-intro": "L'è poscibile doeuviâ sta pagina pe rimpostâ e propie preferençe a quelle predefinie do scito.\nL'opiaçion a no poeu ese annullâ.",
"prefs-emailconfirm-label": "Conferma de l'e-mail:",
"youremail": "Indirìsso email:",
"username": "{{GENDER:$1|Nomme utente}}:",
"yourvariant": "Variante da lengoa do contegnuo:",
"prefs-help-variant": "A variante o grafia co-a quæ ti prefeisci che e paggine do wiki seggian mostræ.",
"yournick": "Nomiagio:",
+ "prefs-help-signature": "I commenti inte pagine de discuscion devan ese firmæ con \"<nowiki>~~~~</nowiki>\" ch'o saiâ convertio inta proppia firma seguia da-a dæta.",
"badsig": "Errô in ta firma; controlla i comandi HTML.",
"badsiglength": "A firma scelta a l'è troppo longa.\nA non deve passâ $1 {{PLURAL:$1|carattere|caratteri}}.",
+ "yourgender": "Comme rifeise a ti?",
+ "gender-unknown": "Into mençunâte, o software o l'adoeuviâ de paole de genere noeütro ogni votta che saiâ poscibile",
"gender-male": "O l'è registrou insce {{SITENAME}}",
"gender-female": "A l'è registrâ insce {{SITENAME}}",
"prefs-help-gender": "L'impostassion de sta preferensa a l'è opsionâ.\nO software o deuvia sto valô pe addressâse a ti e mensunate a-i atri deuviando o gennere grammaticale apropiou.\nQuesta informassion a saiâ pubblica.",
"userrights": "Manezzo di driti di utenti",
"userrights-lookup-user": "Gestisci i gruppi di utenti",
"userrights-user-editname": "Scrivi o teu nomme utente:",
- "editusergroup": "Modiffica i gruppi di utenti",
+ "editusergroup": "Modiffica groppi {{GENDER:$1|utente}}",
"editinguser": "Apreuvo a cangiâ i driti de l'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
"userrights-editusergroup": "Modiffica i gruppi di utenti",
- "saveusergroups": "Sarva i gruppi di utenti",
+ "saveusergroups": "Sarva groppi {{GENDER:$1|utente}}",
"userrights-groupsmember": "Membro de:",
"userrights-groupsmember-auto": "Membro impliçito de:",
+ "userrights-groups-help": "L'è poscibile modificâ i groppi de st'utente:\n* Una casella marcâ voeu dî che l'utente o l'è inte quello groppo.\n* Una casella smarcâ voeu dî che l'utente o no l'è inte quello groppo.\n* O scimbolo * o voeu dî che no ti poeu smarcâ o groppo una votta che ti l'hæ azonto (ò viçeversa).",
"userrights-reason": "Raxon:",
"userrights-no-interwiki": "No ti g'hæ i permissi pe modificâ i driti di utenti insce di atre wiki.",
"userrights-nodatabase": "O database $1 o no l'esiste ò o no l'è un database locale.",
"userrights-changeable-col": "Gruppi che ti peu modificâ",
"userrights-unchangeable-col": "Gruppi che no ti peu modificâ",
"userrights-conflict": "Conflito de modiffica di driti utente! Pe piaxei controlla e conferma e teu modiffiche.",
- "userrights-removed-self": "T'hæ rimosso con successo i teu driti. E quindi, no ti saiæ ciù in grou de accede a questa paggina.",
+ "userrights-removed-self": "T'hæ rimosso i teu driti. E quindi, no ti saiæ ciù in grou de accede a questa paggina.",
"group": "Gruppo:",
"group-user": "Ûtenti",
"group-autoconfirmed": "Utenti aotoconfermæ",
"grouppage-sysop": "{{ns:project}}:Amministratoî",
"grouppage-bureaucrat": "{{ns:project}}:Buroccrati",
"grouppage-suppress": "{{ns:project}}:Soppressoî",
+ "right-read": "Leze paggine",
+ "right-edit": "Modiffica paggine",
+ "right-createpage": "Crea paggine (escluse e pagine de discuscion)",
+ "right-createtalk": "Crea pagine de discuscion",
+ "right-createaccount": "Crea noeuve utençe",
+ "right-autocreateaccount": "Accede aotomaticamente con un'utença esterna",
+ "right-minoredit": "Marca e modifiche comme menoî",
"right-move": "Mescia e paggine",
+ "right-move-subpages": "Mescia e pagine insemme a-e relative sottopagine",
+ "right-move-rootuserpages": "Mescia e pagine prinçipæ di utenti",
+ "right-move-categorypages": "Mescia e categorie",
+ "right-movefile": "Mescia i file",
+ "right-suppressredirect": "O no crea un redirect aotomatico quande se mescia una pagina",
+ "right-upload": "Carrega file",
+ "right-reupload": "Sorvescrive un file existente",
+ "right-reupload-own": "Sorvescrive un file existente caregou da-o mæximo utente",
+ "right-reupload-shared": "Sorvescrive localmente di file presenti inte l'archivio condiviso",
+ "right-upload_by_url": "Carega un file da un addreçço URL",
+ "right-purge": "Nettezza a cache do scito sença conferma",
+ "right-autoconfirmed": "Non soggetto a-o limmite de açioin pe IP",
+ "right-bot": "Da trattâ comme processo aotomatico",
+ "right-nominornewtalk": "Fa scì che e modiffiche menoî a-e pagine de discuscion no faççan comparî l'avviso de noeuvo messaggio",
+ "right-apihighlimits": "Doeuvia di limmiti ciù erti pe-e interrogaçioin API",
"right-writeapi": "Deuvia l'API in scrittua",
+ "right-delete": "Scassa e paggine",
+ "right-bigdelete": "Scassa e pagine con cronologie longhe",
+ "right-deletelogentry": "Scassa e ripristina voxe de registro specifiche",
+ "right-deleterevision": "Scassa e ripristina de verscion specifiche de pagine",
+ "right-deletedhistory": "Vixualizza e verscioin da cronologia scassæ, sença o so testo associou",
+ "right-deletedtext": "Vixualizza o testo scassou e-e modifiche fra de verscioin scassæ",
+ "right-browsearchive": "Çerca inte pagine scassæ",
+ "right-undelete": "Recuppera una paggina",
+ "right-suppressrevision": "Vedde, asconde e ripristina de verscioin specifiche de pagine a quæ-se-segge utente",
+ "right-viewsuppressed": "Vedde de verscioin ascose a qua-se-sæ utente",
+ "right-suppressionlog": "Vixualizza i registri privæ",
+ "right-block": "Blocca e modifiche di atri utenti",
+ "right-blockemail": "Impedisce a un utente de mandâ de email",
+ "right-hideuser": "Blocca un nomme utente, ascondendolo a-o pubbrico",
+ "right-ipblock-exempt": "Ignora i blocchi di IP, i blocchi aotomatichi e i blocchi de range de IP",
+ "right-unblockself": "Sblocca lê mæximo",
+ "right-protect": "Camgia i livelli de proteçion e modifica e pagine protette ricorscivamente",
+ "right-editprotected": "Modifica e pagine protette con \"{{int:protect-level-sysop}}\"",
+ "right-editsemiprotected": "Modifica e pagine protette con \"{{int:protect-level-autoconfirmed}}\"",
+ "right-editcontentmodel": "Modifica o modello de contegnuo de 'na paggina",
+ "right-editinterface": "Modiffica l'interfaccia utente",
+ "right-editusercssjs": "Modifica i file CSS e JS di atri utenti",
+ "right-editusercss": "Modifica i file CSS di atri utenti",
+ "right-edituserjs": "Modiffica i file JS di atri utenti",
+ "right-editmyusercss": "Modifica o file CSS do proppio utente",
+ "right-editmyuserjs": "Modifica o file JavaScript do proppio utente",
+ "right-viewmywatchlist": "Vixualizza i proppi osservæ speçiali",
+ "right-editmywatchlist": "Modifica i to osservæ speçiali. Da notâ che arcun-e açioin porian ancon azonze de pagine anche sença questo drito.",
+ "right-viewmyprivateinfo": "Vixualizza i proppi dæti personæ (presempio: adreçço email, nomme veo)",
+ "right-editmyprivateinfo": "Modiffica i proppi dæti personæ (presempio: addreçço email, nomme veo)",
+ "right-editmyoptions": "Modiffica e proppie preferençe",
+ "right-rollback": "Annulla rapidamente e modifiche de l'urtimo utente ch'o l'ha modificou una pagina in particolâ",
+ "right-markbotedits": "Marca e modifiche soggette a rollback comme effettuæ da bot",
+ "right-noratelimit": "No soggetto a-o limmite de açioin",
+ "right-import": "Importa de pagine da di atri wiki",
+ "right-importupload": "Importa paggine da un upload de file",
+ "right-patrol": "Marca e modifiche di altri utenti comme controllæ",
+ "right-autopatrol": "Marca aotomaticamente e proppie modifiche comme controllæ",
+ "right-patrolmarks": "Doeuvia a fonçion de verifica di urtime modiffiche",
+ "right-unwatchedpages": "Vixualizza una lista de pagine non öservæ",
+ "right-mergehistory": "Unisce a cronologia de paggine",
+ "right-userrights": "Modiffica tutti i driti de l'utente",
+ "right-userrights-interwiki": "Modiffica i driti di utenti insce di atre wiki",
+ "right-siteadmin": "Abbrocca e sbrocca o database",
+ "right-override-export-depth": "Esporta e paggine includendo e pagine collegæ scin a 'na profonditæ de 5",
+ "right-sendemail": "Manda de email a di atri utenti",
+ "right-passwordreset": "Vedde i messaggi de rempostaçion da password",
+ "right-managechangetags": "Crea e attiva/disattiva i [[Special:Tags|etichette]]",
+ "right-applychangetags": "Apprica di [[Special:Tags|etichette]] a-e proppie modiffiche",
+ "right-changetags": "Azonze e leva de specifiche [[Special:Tags|etichette]] insce scingole verscioin o voxe de registro",
+ "right-deletechangetags": "Scassa i [[Special:Tags|etichette]] da-o database",
+ "grant-generic": "Pacchetto diritti \"$1\"",
+ "grant-group-page-interaction": "Interagisce co-e paggine",
+ "grant-group-file-interaction": "Interagisce co-i file murtimediali",
+ "grant-group-watchlist-interaction": "Interagisce con i to oservæ speçiali",
+ "grant-group-email": "Invia email",
+ "grant-group-high-volume": "Esegue açioin mascive",
+ "grant-group-customization": "Personalizzaçion e preferençe",
+ "grant-group-administration": "Esegue açioin amministrative",
+ "grant-group-other": "Attivitæ varrie",
+ "grant-blockusers": "Blocca e sblocca utenti",
+ "grant-createaccount": "Crea un'utença",
+ "grant-createeditmovepage": "Crea, modiffica e mescia e pagine",
+ "grant-delete": "Scassa pagine, revixoin, e voxe de registro",
+ "grant-editinterface": "Modifica o namespace MediaWiki e i CSS/JavaScript di utenti",
+ "grant-editmycssjs": "Modifica i CSS/JavaScript da to utença",
+ "grant-editmyoptions": "Modifica e preferençe da to utença",
+ "grant-editmywatchlist": "Modiffica a to lista di öservæ",
+ "grant-editpage": "Modifica pagine existente",
+ "grant-editprotected": "Modifica pagine protette",
+ "grant-highvolume": "Modiffiche mascive",
+ "grant-oversight": "Asconde i utenti e soprimme e revixoin",
+ "grant-patrol": "Marca e modifiche a-e paggine comme veificæ",
+ "grant-protect": "Proteze e sproteze e paggine",
+ "grant-rollback": "Rollback de modifiche a-e pagine",
+ "grant-sendemail": "Manda di email a di atri utenti",
+ "grant-uploadeditmovefile": "Carega, sostituisce e mescia i file",
+ "grant-uploadfile": "Carrega di noeuvi file",
+ "grant-basic": "Driti de base",
+ "grant-viewdeleted": "Vedde i file e e pagine scassæ",
+ "grant-viewmywatchlist": "Vedde i to öservæ speçiali",
"newuserlogpage": "Nêuvi utenti",
+ "newuserlogpagetext": "Questo o l'è un registro de creaçioin di utençe.",
"rightslog": "Diritti d'ûtente",
+ "rightslogtext": "Questo o l'è un registro di cangi a-i driti di utenti.",
+ "action-read": "leze sta paggina",
"action-edit": "càngia sta pàgina",
+ "action-createpage": "creâ sta paggina",
+ "action-createtalk": "creâ sta paggina de discuscion",
+ "action-createaccount": "creâ st'utença",
+ "action-autocreateaccount": "creâ aotomaticamente st'utença esterna",
+ "action-history": "vedde a cronologia de sta pagina",
+ "action-minoredit": "marcâ sta modifica comme menô",
+ "action-move": "mesciâ sta pagina",
+ "action-move-subpages": "mesciâ sta pagina e e relative sottopagine",
+ "action-move-rootuserpages": "mesciâ e paggine prinçipæ di utenti",
+ "action-move-categorypages": "mesciâ e categorie",
+ "action-movefile": "mesciâ sto file",
+ "action-upload": "caregâ sto file",
+ "action-reupload": "sorvescrive sto file existente",
+ "action-reupload-shared": "soviascrive sto file presente inte l'archivio condiviso",
+ "action-upload_by_url": "caregâ sto file da un addreçço URL",
+ "action-writeapi": "deuviâ l'API in scrittua",
+ "action-delete": "scassâ 'sta paggina",
+ "action-deleterevision": "scassâ sta verscion",
+ "action-deletedhistory": "vixualizzâ a cronologia scassâ de sta pagina",
+ "action-browsearchive": "çercâ paggine scassæ",
"action-undelete": "Recuppera sta paggina",
"action-suppressrevision": "rivedde e ripristinâ e modiffiche ascose",
+ "action-suppressionlog": "vedde questo registro privou",
+ "action-block": "bloccâ st'utente in scrittua",
+ "action-protect": "modificâ i livelli de proteçion pe questa pagina",
+ "action-rollback": "annullâ rapidamente e modifiche de l'urtimo utente ch'o l'ha modificou una pagina determinâ",
+ "action-import": "importâ de pagine da 'n'atra wiki",
+ "action-importupload": "importâ de pagine tramite upload da file",
+ "action-patrol": "marcâ e modifiche di atri utenti comme controllæ",
+ "action-autopatrol": "marcâ e proppie modifiche comme controllæ",
+ "action-unwatchedpages": "vixonâ a lista de pagine non öservæ",
+ "action-mergehistory": "unî a cronologia de sta pagina",
+ "action-userrights": "modificâ tutti i driti di utenti",
+ "action-userrights-interwiki": "modificâ i driti di utenti insce di atre wiki",
+ "action-siteadmin": "broccâ e sbroccâ o database",
+ "action-sendemail": "mandâ di e-mail",
+ "action-editmywatchlist": "modificâ a to lista di öservæ",
+ "action-viewmywatchlist": "vedde i to öservæ speçiali",
+ "action-viewmyprivateinfo": "vedde i proppi dæti personali",
+ "action-editmyprivateinfo": "modificâ i proppi dæti personali",
+ "action-editcontentmodel": "modificâ o modello de contegnuo de 'na paggina",
+ "action-managechangetags": "creâ e attivâ/disattivâ i etichette",
+ "action-applychangetags": "appricâ di etichette a-e to modiffiche",
+ "action-changetags": "Azonze e levâ de specifiche etichette sciu scingole verscioin o voxe de registro",
+ "action-deletechangetags": "scassâ i etichette da-o database",
"nchanges": "$1 {{PLURAL:$1|modiffica|modiffiche}}",
+ "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|da l'urtima vixita}}",
"enhancedrc-history": "cronologia",
"recentchanges": "Ùrtimi cangiamenti",
"recentchanges-legend": "Opçioin di ùrtimi cangiaménti",
- "recentchanges-summary": "Questa pàgina a g'ha di càngi ciù reçenti a-i contegnûi do scîto.",
- "recentchanges-feed-description": "Questo feed o g'ha di cangiaménti ciù reçenti a-i contegnûi do scîto.",
+ "recentchanges-summary": "Questa pagina a te mostra i cangiamenti ciu reçenti a-i contegnui do scito.",
+ "recentchanges-noresult": "Nisciun-a modiffica durante o periodo inseio ch'a soddisfe sti critei.",
+ "recentchanges-feed-description": "Questo feed o te mostra i cangiamenti ciu reçenti a-i contegnui do scito.",
"recentchanges-label-newpage": "Sto cangiaménto o l'à creòu 'na pàgina nêuva",
"recentchanges-label-minor": "Cangiamento minô (m)",
"recentchanges-label-bot": "Sto cangiaménto o l'à fæto in bot",
"recentchanges-label-plusminus": "Variassion da paggina in nummero de byte",
"recentchanges-legend-heading": "<strong>Legenda:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veddi e [[Special:NewPages|neuve paggine]])",
- "rcnotefrom": "Chì sotta gh'è i cangiamenti fæti comensando da '''$2''' (scin a '''$1''').",
+ "recentchanges-submit": "Fanni vedde",
+ "rcnotefrom": "Chì sotta gh'è {{PLURAL:$5|o cangiamento|i cangiamenti}} a partî da <strong>$3, $4</strong> (scin a '''$1''').",
"rclistfrom": "Fanni vedde e modiffiche apportæ partindo da $3 $2",
- "rcshowhideminor": "$1 cangiaménti minoi",
+ "rcshowhideminor": "$1 cangiaménti minoî",
"rcshowhideminor-show": "Fanni vedde",
"rcshowhideminor-hide": "Ascondi",
"rcshowhidebots": "$1 bot",
"rcshowhidebots-show": "Fanni vedde",
"rcshowhidebots-hide": "Ascondi",
"rcshowhideliu": "$1 i utenti registræ",
+ "rcshowhideliu-show": "Fanni vedde",
"rcshowhideliu-hide": "Ascondi",
"rcshowhideanons": "$1 utenti anonnimi",
"rcshowhideanons-show": "Fanni vedde",
"rcshowhideanons-hide": "Ascondi",
"rcshowhidepatr": "$1 i cangiaménti controllæ",
+ "rcshowhidepatr-show": "Fanni vedde",
+ "rcshowhidepatr-hide": "Ascondi",
"rcshowhidemine": "$1 i mæ cangiamenti",
"rcshowhidemine-show": "Fanni vedde",
"rcshowhidemine-hide": "Ascondi",
+ "rcshowhidecategorization": "$1 categorizzaçion da pagina",
+ "rcshowhidecategorization-show": "Fanni vedde",
+ "rcshowhidecategorization-hide": "Ascondi",
"rclinks": "Fanni vedde i $1 cangiaménti ciù reçenti fæti inti ùrtimi $2 giorni<br />$3",
"diff": "diff",
"hist": "stö",
"minoreditletter": "m",
"newpageletter": "N",
"boteditletter": "b",
+ "number_of_watching_users_pageview": "[osservâ da {{PLURAL:$1|un utente|$1 utenti}}]",
+ "rc_categories": "Limite a-e categorie (separæ da \"|\"):",
"rc_categories_any": "Quâ-se-sæ fra quelle indicæ",
"rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} doppo a modiffica",
"newsectionsummary": "/* $1 */ neuva seçion",
"recentchangeslinked-page": "Nómme da pàgina:",
"recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàgine colegæ a-a pàgina specificâ",
"recentchanges-page-added-to-category": "[[:$1]] azonto a-a categoria",
- "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|una paggina a l'è azonta|$2 paggine son azonte}}]] a-a categoria",
+ "recentchanges-page-added-to-category-bundled": "[[:$1]] azonta a-a categoria, [[Special:WhatLinksHere/$1|questa pagina a l'è inclusa a l'interno di atre pagine]]",
"recentchanges-page-removed-from-category": "[[:$1]] rimosso da-a categoria",
- "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|una paggina a l'è rimossa|$2 paggine son rimosse}} da-a categoria",
+ "recentchanges-page-removed-from-category-bundled": "[[:$1]] rimossa da-a categoria, [[Special:WhatLinksHere/$1|questa pagina a l'è inclusa a l'interno di atre pagine]]",
"autochange-username": "Modiffica aotomattica MediaWiki",
"upload": "Carrega 'n file",
"uploadbtn": "Carrega 'n file",
"reuploaddesc": "Torna a-o moddulo pe-o caregamento.",
"upload-tryagain": "Invia a descrission do file modificou",
"uploadnologin": "No t'ê introu",
+ "uploadnologintext": "Pe caregâ di file bezoeugna $1.",
+ "upload_directory_missing": "A directory de upload ($1) a no l'existe e a no poeu ese creâ da-o server web.",
+ "upload_directory_read_only": "O server web o no l'è in graddo de scrive inta directory de upload ($1).",
+ "uploaderror": "Errô into caregamento",
+ "upload-recreate-warning": "<strong>Attençion: un file con questo nomme o l'è stæto scassou o mesciou.</strong>\nO registro de scassatue e di stramui de questa pagina o l'è riportou chì pe comoditæ:",
+ "uploadtext": "Doeuviâ o modulo sottostante pe caregâ di noeuvi file. Pe visualizzâ ò çercâ i file za caregæ, consultâ o [[Special:FileList|log di file caregæ]]. Caregamenti de file e de noeuve verscioin de file son registræ into [[Special:Log/upload|log di upload]], e scassatue into [[Special:Log/delete|log de scassatue]].\n\nPe insei un file a l'interno de 'na pagina, fanni un collegamento de questo tipo:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' pe doeuviâ a verscion completa do file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' pe doeuviâ una verscion larga 200 pixel inseia inte 'n box, alliniâ a scinistra e con 'testo alternativo' comme didascalia\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pe generâ un collegamento diretto a-o file sença vixualizzâlo",
+ "upload-permitted": "{{PLURAL:$2|Tipo de file consentio|Tipi de file consentii}}: $1.",
+ "upload-preferred": "{{PLURAL:$2|Tipo de file consegiou|Tipi de file consegiæ}}: $1.",
+ "upload-prohibited": "{{PLURAL:$2|Tipo de file non consentio|Tipi de file non consentii}}: $1.",
"uploadlogpage": "Log di file caregæ",
+ "uploadlogpagetext": "De sotta gh'è una lista di urtimi file caregæ.\nConsultâ a [[Special:NewFiles|galleria di noeuvi file]] pe 'na vixon d'insemme.",
"filename": "Nomme do file",
"filedesc": "Detaggi",
+ "fileuploadsummary": "Detaggi do file:",
+ "filereuploadsummary": "Cangiamenti a-o file:",
+ "filestatus": "Informaçioin in sciô copyright:",
"filesource": "Reixe:",
+ "ignorewarning": "Ignora l'avviso e sarva comunque o file",
+ "ignorewarnings": "Ignora i messaggi de avvertimento do scistema",
+ "minlength1": "O nome do file o dev'ese a-o manco de una lettia.",
+ "illegalfilename": "O nomme \"$1\" o conten di caratteri non ammissi inti tittoli de paggine. Dagghe 'n atro nomme e proeuva torna a caregâlo.",
+ "filename-toolong": "I nommi di file no poeuan superâ i 240 byte.",
"badfilename": "O nomme do file o l'è stæto cangiòu in \"$1\".",
- "fileexists": "Un papê co sto nomme o existe de zà, pe piaxei da unn'euggiâ a <strong>[[:$1]]</strong> se non ti tei seguo de voleilo cangiâ.\n[[$1|thumb]]",
- "fileexists-forbidden": "Un papê co sto nomme o existe de zà, pe piaxei vanni in derrê e carega sto papê co un ätro nomme. [[File:$1|thumb|center|$1]]",
+ "filetype-mime-mismatch": "L'estenscion do file \".$1\" a no corrisponde a-o tipo MIME rilevou da-o file ($2).",
+ "filetype-badmime": "No l'è consentio de caregâ di file de tipo MIME \"$1\".",
+ "filetype-bad-ie-mime": "Imposcibile caregâ o file perché Internet Explorer o rilevieiva comme \"$1\", ch'o l'è un tipo de file non consentio e potençialmente peigoso.",
+ "filetype-unwanted-type": "Caregâ di file de tipo '''\".$1\"''' l'è sconsegiou. {{PLURAL:$3|O tipo de file consegiou o l'è|I tipi de file consegiæ son}} $2.",
+ "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|o no l'è un tipo de file consentio|no son di tipi de file consentii}}. {{PLURAL:$3|O tipo de file consentio o l'è|I tipi de file consentii son}} $2.",
+ "filetype-missing": "O file o no g'ha d'estenscion (pres. \".jpg\").",
+ "empty-file": "O file che t'hæ inviou o l'è voeuo.",
+ "file-too-large": "O file che t'hæ inviou o l'è troppo grande.",
+ "filename-tooshort": "O nomme do file o l'è troppo curto.",
+ "filetype-banned": "Questo tipo de file o l'è proibio.",
+ "verification-error": "Questo file o no l'ha superou a veriffica.",
+ "hookaborted": "A modiffica che t'hæ çercou de fâ a l'è stæta interrotta da un'estenscion.",
+ "illegal-filename": "O nomme do file o no l'è ammisso.",
+ "overwrite": "Soviascrive un file existente no l'è permisso.",
+ "unknown-error": "Gh'è stæto un aro sconosciuo.",
+ "tmp-create-error": "Imposcibbile creâ o file temporannio.",
+ "tmp-write-error": "Errô de scrittua do file temporannio.",
+ "large-file": "Se raccomanda de no superâ e dimenscioin de $1 pe ciascun file; questo file o l'è grande $2.",
+ "largefileserver": "O file o suppera e dimenscioin consentie da-a configuaçion do server.",
+ "emptyfile": "O file apen-a caregou pâ esee voeuo. Questo poriæ ese dovuo a un aro into nomme do file. Controlla se ti voeu davei caregâ sto file.",
+ "windows-nonascii-filename": "Questo wiki o no supporta di nommi de file con di caratteri speciali.",
+ "fileexists": "Un papê con sto nomme o l'existe za, pe piaxei danni 'n'euggiâ a <strong>[[:$1]]</strong> se no ti t'ê seguo de voeilo cangiâ.\n[[$1|thumb]]",
+ "filepageexists": "A pagina de descriçion de questo file aq l'è za stæta creâ a l'adreçço <strong>[[:$1]]</strong>, sciben che no ghe segge ancon un file con questo nomme. A descriçion de l'oggetto inseia in fase de caregamento a no l'appariâ in scia pagina de descriçion. Pe fâ scì che l'oggetto o comparisce in scia pagina de descriçion, saiâ necessaio modificala manualmente.\n[[$1|thumb]]",
+ "fileexists-extension": "Un file co-in nomme scimile a questo o l'esiste za: [[$2|thumb]]\n* Nomme do file caregou: <strong>[[:$1]]</strong>\n* Nomme do file existente: <strong>[[:$2]]</strong>\nTi voeu miga çerne un nomme ciu caratteristego?",
+ "fileexists-thumbnail-yes": "O file caregou o pâ ese una miniatua ''(thumbnail)''. [[$1|thumb]]\nVerifica, pe confronto, il file <strong>[[:$1]]</strong>.\nSe se tratta da mæxima inmaggine, inte dimenscioin originale, no l'è necessaio caregâne un'atra in miniatua.",
+ "file-thumbnail-no": "O nomme do file comença con <strong>$1</strong>; pâ ch'o segge un'inmaggine de dimenscioin redute ''(miniatua)''.\nSe ti dispon-i del'immaggine inta risoluçion originale, carreghila. Sedunque, pe piaxei, cangighe o nomme.",
+ "fileexists-forbidden": "Un file con questo nomme o l'existe za e o no poeu ese soviascrito. Se ti voeu caregâ o to file, torna inderê e dagghe un atro nomme. [[File:$1|thumb|center|$1]]",
+ "fileexists-shared-forbidden": "Un file con questo nomme o l'esiste za inte l'archivio de risorse multimediæ condivise. Se ti dexiddei ancon caregâ o file, torna inderê e modifica o nomme co-o quæ caregâ o file. [[File:$1|thumb|center|$1]]",
+ "file-exists-duplicate": "Questo file o l'è un dupricou {{PLURAL:$1|do seguente|di seguenti}} file:",
+ "file-deleted-duplicate": "Un file identico a questo ([[:$1]]) o l'è stæto scassou into passou. Verifica a cronologia de scassatue primma de caregâlo torna.",
+ "file-deleted-duplicate-notitle": "Un file identico a questo o l'è stæto scassou into passou, e o tittolo o l'è stæto soppresso. Domanda a quarcun ch'o g'ha a poscibilitæ de vedde i file soppresci de esaminâ a scituaçion primma de procede torna a-o caregamento.",
+ "uploadwarning": "Avviso de caregamento",
+ "uploadwarning-text": "Pe piaxei modifica chi de sotta a descriçion do file e proeuva torna.",
"savefile": "Sarva o file",
- "uploaddisabledtext": "In {{SITENAME}} non se peu caregâ de papê.",
+ "uploaddisabled": "O caregamento di file o l'è disabilitou.",
+ "copyuploaddisabled": "O caricamento tramite URL o l'è disabilitou.",
+ "uploaddisabledtext": "O caricamento di file o l'è disabilitou.",
+ "php-uploaddisabledtext": "O caregamento di file tramite PHP o l'è disabilitou. Controlla a configuaçion de file_uploads.",
+ "uploadscripted": "Questo file o conten un codiçe HTML ò de script, ch'o poriæ ese interpretou erroniamente da un browser web.",
+ "upload-scripted-pi-callback": "Imposcibile caregâ un file ch'o conten un'instruçion de elaboaçion in XML-stylesheet.",
+ "uploaded-script-svg": "Trovou elemento de script \"$1\" into file caregou in formato SVG.",
+ "uploaded-hostile-svg": "Trovou CSS no seguo inte l'elemento de stile do file in formato SVG caregou.",
+ "uploaded-event-handler-on-svg": "Impostâ i attributi de gestion di eventi <code>$1=\"$2\"</code> no l'è consentio inti file SGV",
+ "uploaded-href-attribute-svg": "i attributi href inti file SVG poeuan collegâse solo verso e destinaçioin http:// o https://, trovou <code><$1 $2=\"$3\"></code>.",
+ "uploaded-href-unsafe-target-svg": "Trovou href a dæti non segui: destinaçion URI <code><$1 $2=\"$3\"></code> caregou into file SVG",
+ "uploaded-animate-svg": "Trovou o tag \"animate\" ch'o poriæ cangiâ href, doeuviando l'attributo \"from\" <code><$1 $2=\"$3\"></code> into file SVG caregou.",
+ "uploaded-setting-event-handler-svg": "A configuaçion di attributi pe-o gestô di eventi a l'è bloccâ, trovou <code><$1 $2=\"$3\"></code> into file SVG caregou.",
+ "uploaded-setting-href-svg": "L'utilizzo do tag \"set\" pe azonze l'attributo \"href\" a l'elemento parentâ o l'è bloccou.",
+ "uploaded-wrong-setting-svg": "L'uso de l'elemento \"set\" pe azonze una destinaçion remote/data/script pe qua-se-sæ attributo o l'è bloccou. Trovou <code><set to=\"$1\"></code> into file SVG caregou.",
+ "uploaded-setting-handler-svg": "o SVG ch'o l'imposta l'attributo \"handler\" con remote/data/script o l'è bloccou. Trovou <code>$1=\"$2\"</code>into file SVG caregou.",
+ "uploaded-remote-url-svg": "o SVG ch'o l'imposta qua-se-sæ attributo de stile con di URL remoti o l'è bloccato. Trovou <code>$1=\"$2\"</code> into file SVG caregou.",
+ "uploaded-image-filter-svg": "Trovou filtro immaggine con URL: <code><$1 $2=\"$3\"></code> into file in formato SVG caregou.",
+ "uploadscriptednamespace": "Questo file SVG o conten un namespace '$1' non consentio",
+ "uploadinvalidxml": "O codiçe XML into file caregou o no poeu ese elaboou.",
"uploadvirus": "Questo file o conten un virus! Dettaggi: $1",
+ "uploadjava": "Questo file o l'è un file ZIP ch'o conten un file .class Java.\nCaregâ i file Java no l'è consentio, perché poeuan caosâ l'aggiamento de restriçioin de segueçça.",
+ "upload-source": "File de origine",
"sourcefilename": "Nomme do file d'origgine:",
+ "sourceurl": "URL de origine:",
"destfilename": "Nomme do file de destinassion:",
+ "upload-maxfilesize": "Dimenscion mascima do file: $1",
+ "upload-description": "Descriçion do file",
+ "upload-options": "Opçioin de caregamento",
+ "watchthisupload": "Metti sotta oservaçion",
+ "filewasdeleted": "Un file con questo nomme o l'è stæto za caregou e scassou into passou. Controlla $1 primma de caregâlo torna.",
+ "filename-thumb-name": "Sto chì o pâ un tittolo da miniatua. Pe piaxei no stanni a caregâ e miniatue in scia mæxima wiki. O dunque, corezi o nomme do file de moddo ch'o segge ciù scignificativo e o no l'agge o prefisso da miniatua.",
+ "filename-bad-prefix": "O nomme do file che t'ê aproeuvo a caregâ o comença con '''\"$1\"''', ch'o l'è un nomme generico scimile a quelli assegnæ aotomaticamente da-e fotocammie digitale. Pe piaxei çerni un nomme ciù descrittivo pe-o to file.",
+ "upload-proto-error": "Protocollo errou",
+ "upload-proto-error-text": "Pe l'upload remoto l'è necessaio speçificâ di URL che començan con <code>http://</code> oppû <code>ftp://</code>.",
"upload-file-error": "Errô interno",
+ "upload-file-error-text": "S'è veificou un errô interno durante a creaçion de 'n file temporannio in sciô server. Contatta un [[Special:ListUsers/sysop|amministratô]].",
+ "upload-misc-error": "Errô de caregamento sconosciuo",
+ "upload-misc-error-text": "S'è veificou un errô non identificou durante o caregamento do file. Controlla che a URL a segge corretta e accescibile e proeuva torna. Se o problema o persciste, contatta un [[Special:ListUsers/sysop|amministratô]].",
+ "upload-too-many-redirects": "L'URL o contegniva troppi redirect",
+ "upload-http-error": "S'è verificou un errô HTTP: $1",
+ "upload-copy-upload-invalid-domain": "No l'è consentio o caregamento de coppie da questo dominnio.",
+ "upload-foreign-cant-upload": "Questo wiki o no l'è configuou pe caregâ i file into repository de file esterno domandou.",
+ "upload-foreign-cant-load-config": "Imposcibbile caregâ a configuaçion pe-i upload de file inti file repository esterni.",
+ "upload-dialog-disabled": "O caregamento di file tramite questo barcon de dialogo o l'è disabilitou inte questo wiki.",
+ "upload-dialog-title": "Carrega file",
+ "upload-dialog-button-cancel": "Anulla",
+ "upload-dialog-button-done": "Fæto",
+ "upload-dialog-button-save": "Sarva",
+ "upload-dialog-button-upload": "Carrega",
+ "upload-form-label-infoform-title": "Detaggi",
+ "upload-form-label-infoform-name": "Nomme",
+ "upload-form-label-infoform-name-tooltip": "Un tittolo unnico e descritivo pe-o file, ch'o serviâ da nomme. Doeuviâ pure e toeu parolle e i spaççi. No stagh'a mette l'estenscion.",
+ "upload-form-label-infoform-description": "Descriçion",
+ "upload-form-label-infoform-description-tooltip": "Descrivi scinteticamente tutto quanto sæ degno de notta a propoxito de quest'oeuvia.\nPe-e foto, indica e cose prinçipæ che gh'en rappresentæ, l'öcaxon e/ò o posto.",
+ "upload-form-label-usage-title": "Utilizzo",
+ "upload-form-label-usage-filename": "Nomme do file",
+ "upload-form-label-own-work": "Questo o l'è travaggio mæ",
+ "upload-form-label-infoform-categories": "Categorie",
+ "upload-form-label-infoform-date": "Dæta",
+ "upload-form-label-own-work-message-generic-local": "Confermo che son aproeuvo a caregâ sto file segondo e condiçioin de serviçio e e polittiche in sce e liçençe de {{SITENAME}}.",
+ "upload-form-label-not-own-work-message-generic-local": "Se non t'ê in grou de caregâ o file segondo e politiche de {{SITENAME}}, særa sto barcon e proeuva un atro mettodo.",
+ "upload-form-label-not-own-work-local-generic-local": "Proeuva ascì a [[Special:Upload|pagina de caregamento predefinia]].",
+ "upload-form-label-own-work-message-generic-foreign": "Ho acapio che son aproeuvo a caregâ questo file inte 'n archivio condiviso. Confermo che-o façço segondo e so condiçioin de serviççio e-e so polittiche in sce e liçençe.",
+ "upload-form-label-not-own-work-message-generic-foreign": "Se non t'ê in grou de caregâ o file segondo e politiche de l'archivvio condiviso, særa sto barcon e proeuva un atro mettodo.",
+ "upload-form-label-not-own-work-local-generic-foreign": "Ti poeu provâ ascì a doeuviâ a [[Special:Upload|pagina de caregamento insce {{SITENAME}}]], se questo file o poeu ese caregou segondo e soeu politiche.",
+ "backend-fail-stream": "Imposcibile trasmette o file $1.",
+ "backend-fail-backup": "Imposcibile eseguî o backup do file $1 .",
+ "backend-fail-notexists": "O file $1 o no l'existe.",
+ "backend-fail-hashes": "Imposcibile ötegnî l'hash di file pe 'n confronto.",
+ "backend-fail-notsame": "Existe za un file non identico a \"$1\".",
+ "backend-fail-invalidpath": "$1 o no l'è un percorso de archiviaçion vallido.",
+ "backend-fail-delete": "Imposcibile scassâ o file $1.",
+ "backend-fail-describe": "Imposcibile modificâ i metadæti do file \"$1\".",
+ "backend-fail-alreadyexists": "O file $1 o l'existe za.",
+ "backend-fail-store": "Imposcibbile memorizzâ o file $1 in $2 .",
+ "backend-fail-copy": "Imposcibile copiâ o file $1 in $2 .",
+ "backend-fail-move": "Imposcibile messciâ o file $1 in $2 .",
+ "backend-fail-opentemp": "Imposcibbile arvî o file temporannio.",
+ "backend-fail-writetemp": "Imposcibbile scrive o file temporannio.",
+ "backend-fail-closetemp": "Imposcibbile serâ o file temporannio.",
+ "backend-fail-read": "Imposcibile leze o file $1 .",
+ "backend-fail-create": "Imposcibile scrive o file $1.",
+ "backend-fail-maxsize": "Imposcibile scrive o file $1 perché o l'è ciù grande de {{PLURAL:$2|un|$2}} byte.",
+ "backend-fail-readonly": "O backend de memoia \"$1\" o l'è attualmente de sola lettua. A raxon indicâ a l'è: <em>$2</em>",
+ "backend-fail-synced": "O file \"$1\" o l'è inte 'n stato non coerente inti backend de memoia interna.",
+ "backend-fail-connect": "Imposcibile connettise a-o backend de memoia \"$1\".",
+ "backend-fail-internal": "S'è verificou un errô sconosciuo into backend de memoia \"$1\".",
+ "backend-fail-contenttype": "Imposcibile determinâ a tipologia do file da archiviâ inte \"$1\".",
+ "backend-fail-batchsize": "O backend de memoia o l'ha programmou una serie de $1 {{PLURAL:$1|opiaçion|opiaçioin}} sciu file; o limmite o l'è de $2 {{PLURAL:$2|opiacion|opiacioin}}.",
+ "backend-fail-usable": "Imposcibile leze ò scrive o file \"$1\" a caosa de aetorizzaçioin insuffixenti ò directory/contegnitoî mancanti.",
+ "filejournal-fail-dbconnect": "Imposcibile connettise a-o database journal pe l'archiviaçion back-end \"$1\".",
+ "filejournal-fail-dbquery": "Imposcibile aggiornâ o database journal pe l'archiviaçion back-end \"$1\".",
+ "lockmanager-notlocked": "Imposcibile sbloccâ \"$1\"; o no l'è bloccou.",
+ "lockmanager-fail-closelock": "Imposcibbile serâ o file de blocco pe \"$1\".",
+ "lockmanager-fail-deletelock": "Imposcibile scassâ o file de blocco pe $1.",
+ "lockmanager-fail-acquirelock": "Imposcibbile aquixî o blocco pe $1.",
+ "lockmanager-fail-openlock": "Imposcibbile arvî o file de blocco pe \"$1\".",
+ "lockmanager-fail-releaselock": "Imposcibile revocâ o blocco pe $1.",
+ "lockmanager-fail-db-bucket": "Imposcibile contattâ i necessai database de blocco into bucket $1.",
+ "lockmanager-fail-db-release": "Imposcibile revocâ i blocchi in sciô database $1.",
+ "lockmanager-fail-svr-acquire": "Imposcibile acquixî i blocchi in sciô server $1.",
+ "lockmanager-fail-svr-release": "Imposcibile revocâ i blocchi in sciô server $1.",
+ "zip-file-open-error": "S'è verificou 'n errô durante l'avertua do file pe-i controlli ZIP.",
+ "zip-wrong-format": "O file specificou o no l'ea un file ZIP.",
+ "zip-bad": "O file o l'è un file ZIP corrotto ò atrimenti illezibbile.\nO no poeu ese controllou comme se dè pe-a segueçça.",
+ "zip-unsupported": "O file o l'è un file ZIP ch'o l'adoeuvia de caratteristeghe ZIP non supportæ da MediaWiki.\nO no poeu ese ben controllou pe-a segueçça.",
+ "uploadstash": "Carrega stash",
+ "uploadstash-summary": "Questa pagina a consente l'accesso a-i file che son stæti caregæ (o son in fase de caregamento) ma che n'en ancon stæti pubbricæ in sciô wiki. Questi file son vixibbili solo a l'utente ch'o i ha caregæ.",
+ "uploadstash-clear": "Elimmina i file in stash",
+ "uploadstash-nofiles": "No ti g'hæ de file into stash.",
+ "uploadstash-badtoken": "Esecuçion de l'açion non riuscia, foscia perché e to credençiale de modiffica son descheite. Proeuva ancon.",
+ "uploadstash-errclear": "O nettezzo di file o no l'è ariescio.",
+ "uploadstash-refresh": "Aggiorna l'elenco di file",
+ "uploadstash-thumbnail": "veddi miniatua",
+ "invalid-chunk-offset": "Offset d'a parte non vallido.",
+ "img-auth-accessdenied": "Accesso negou",
+ "img-auth-nopathinfo": "PATH_INFO mancante.\nO server o no l'è impostou pe passâ quest'informaçion.\nO poriæ ese basou insce CGI e o no poeu supportâ img_auth.\nAmia https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+ "img-auth-notindir": "O percorso domandou o no l'è inta directory de upload configuâ.",
+ "img-auth-badtitle": "Imposcibile construe un tittolo vallido da \"$1\".",
+ "img-auth-nologinnWL": "No t'ê introu e \"$1\" o no l'è inta whitelist.",
+ "img-auth-nofile": "O file \"$1\" o no l'existe.",
+ "img-auth-isdir": "Ti çerchi d'accede a 'na directory \"$1\".\nL'è consentio solo l'accesso a-i file.",
+ "img-auth-streaming": "\"$1\" in streaming.",
+ "img-auth-public": "La fonçion de img_auth.php a l'è de dâ in output di file da un scito wiki privou.\nQuesto scito o l'è configuou comme un wiki pubbrico.\nPe 'na segueçça ottimale, img_auth.php o l'è disattivou.",
+ "img-auth-noread": "L'utente o no g'ha accesso a-a lettua de \"$1\".",
+ "http-invalid-url": "URL non vallido: $1",
+ "http-invalid-scheme": "Di URL co-o prefisso \"$1\" no son supportæ.",
+ "http-request-error": "Recesta HTTP fallia a caosa de 'n aro sconosciuo.",
+ "http-read-error": "Errô de lettua HTTP.",
+ "http-timed-out": "Recesta HTTP descheita.",
+ "http-curl-error": "Errô durante o recuppero de l'URL: $1",
+ "http-bad-status": "S'è verificou un problema durante a recesta HTTP: $1 $2",
+ "upload-curl-error6": "URL no razonzibbile",
+ "upload-curl-error6-text": "Imposcibile razonze a URL specificâ. Verifica che a URL a sæ scrita correttamente e che o scito in question o sæ attivo.",
+ "upload-curl-error28": "Tempo descheito pe l'upload",
+ "upload-curl-error28-text": "O scito remoto o l'ha impiegou troppo tempo a risponde. Verifica che o sito o sæ attivo, attendi quarche menuto e proeuva torna, se mai inte 'n momento con meno traffego.",
"license": "Licensa:",
"license-header": "Licensa",
"nolicense": "Nisciûnn-a liçensa indicâa",
+ "licenses-edit": "Modiffica opçioin de liçença",
+ "license-nopreview": "(Anteprimma non disponibbile)",
+ "upload_source_url": "(un file da un URL vallido e accescibile pubbricamente)",
+ "upload_source_file": "(un file da-o to computer)",
+ "listfiles-delete": "scassa",
+ "listfiles-summary": "Questa pagina speciale a mostra tutti i file caregæ.",
"listfiles_search_for": "Çerca pe nomme de l'imàgine:",
+ "listfiles-userdoesnotexist": "L'utença \"$1\" a no l'è registrâ.",
"imgfile": "file",
- "listfiles": "Lista d'archivvi",
+ "listfiles": "Lista di file",
+ "listfiles_thumb": "Miniatua",
"listfiles_date": "Dæta",
+ "listfiles_name": "Nomme",
+ "listfiles_user": "Utente",
+ "listfiles_size": "Dimenscion",
+ "listfiles_description": "Descriçion",
+ "listfiles_count": "Verscioin",
+ "listfiles-show-all": "Includdi e vege verscioin de inmaggine",
+ "listfiles-latestversion": "Verscion corente",
+ "listfiles-latestversion-yes": "Sci",
+ "listfiles-latestversion-no": "No",
"file-anchor-link": "file",
"filehist": "Stöia do file",
"filehist-help": "Sciacca insce dæta/ôa pe amiâ o file comm'o s'apresentâva into momento indicòu.",
+ "filehist-deleteall": "scassa tutto",
+ "filehist-deleteone": "scassa",
"filehist-revert": "Ripristina",
"filehist-current": "Corrente",
"filehist-datetime": "Dæta/Ôa",
"filehist-thumb": "Miniatua",
"filehist-thumbtext": "Miniatua da versción de $1",
+ "filehist-nothumb": "Nisciun-a miniatua",
"filehist-user": "Utente",
"filehist-dimensions": "Dimenscioin",
- "filehist-filesize": "Dimension de l'archivvio",
+ "filehist-filesize": "Dimenscion do file",
"filehist-comment": "Coménti",
"imagelinks": "Ûzo do file",
"linkstoimage": "{{PLURAL:$1|A segoente pàgina a contegne|E segoenti $1 pàgine contegnan}} colegaménti a-o file:",
+ "linkstoimage-more": "Ciù de $1 {{PLURAL:$1|pagina aponta|pagine apontan}} a questo file.\nA seguente lista a mostra {{PLURAL:$1|a primma paggina ch'a l'aponta|e primme $1 paggine ch'apontan}} a sto file.\nL'è disponibile un [[Special:WhatLinksHere/$2|elenco completo]].",
"nolinkstoimage": "No gh'è nisciûnn-a pàgina collegâ con 'sto file.",
- "sharedupload": "'St'archivvio o l'è condiviso; sajeiva a dî c'o pêu ese dêuviòu da ciû progetti wiki.",
+ "morelinkstoimage": "Vixualizza [[Special:WhatLinksHere/$1|di atri inganci]] a questo file.",
+ "linkstoimage-redirect": "$1 (rendriççamento file) $2",
+ "duplicatesoffile": "{{PLURAL:$1|O seguente file o l'è un dupricou|I seguenti $1 file son di dupricæ}} de questo file ([[Special:FileDuplicateSearch/$2|urteioî detaggi]]):",
+ "sharedupload": "Questo file o proven da $1 e o poeu ese doeuviou da di atri progetti.",
+ "sharedupload-desc-there": "Questo file o proven da $1 e o poeu ese doeuviou da di atri progetti.\nConsurta a [$2 pagina de descriçion do file] pe di urteioî informaçioin.",
"sharedupload-desc-here": "Sto file o vegne da $1 e o peu êse dêuviòu inti âtri progetti.\nChì apreuvo ti peu védde a descriçión inta [$2 pàgina de descriçión do file].",
+ "sharedupload-desc-edit": "Questo file o proven da $1 e o poeu ese doeuviou da di atri progetti.\nFoscia ti voeu modificâ a descriçion presente inta [$2 pagina de descriçion do file].",
+ "sharedupload-desc-create": "Questo file o proven da $1 e o poeu ese doeuviou da di atri progetti.\nFoscia ti voeu modificâ a descriçion presente inta [$2 pagina de descriçion do file].",
+ "filepage-nofile": "No existe un file con sto nomme.",
+ "filepage-nofile-link": "No existe un file con sto nomme, ma l'è poscibile [$1 caregâlo].",
"uploadnewversion-linktext": "Carrega 'na neuva verscion de sto file",
+ "shared-repo-from": "da $1",
+ "shared-repo": "un archivio condiviso",
"upload-disallowed-here": "Imposcibbile sorvescrive sto file.",
+ "filerevert": "Ripristina $1",
+ "filerevert-legend": "Ripristina file",
+ "filerevert-intro": "Ti stæ pe ripristinâ o file '''[[Media:$1|$1]]''' a-a [$4 verscion do $2, $3].",
+ "filerevert-comment": "Raxon:",
+ "filerevert-defaultcomment": "Ripristinou a verscion do $2, $1 ($3)",
+ "filerevert-submit": "Ripristina",
+ "filerevert-success": "'''O file [[Media:$1|$1]]''' o l'è stæto ripristinou a-a [$4 verscion do $2, $3].",
+ "filerevert-badversion": "No gh'è de verscioin locali precedenti do file co-o timestamp provisto.",
+ "filedelete": "Scassa \"$1\"",
+ "filedelete-legend": "Scassa o file",
+ "filedelete-intro": "Ti stæ pe scassâ o file '''[[Media:$1|$1]]''' con tutta a so cronologia.",
+ "filedelete-intro-old": "T'ê aproeuvo a scassâ a vercsion de '''[[Media:$1|$1]]''' do [$4 $2, $3].",
+ "filedelete-comment": "Raxon:",
"filedelete-submit": "Scassa",
+ "filedelete-success": "O file '''$1''' o l'è stæto scassou.",
+ "filedelete-success-old": "A verscion do file '''[[Media:$1|$1]]''' do $2, $3 a l'è stæta scassaa.",
+ "filedelete-nofile": "'''$1''' o no l'existe.",
+ "filedelete-nofile-old": "Verscioin d'archivio de '''$1''' co-e caratteristeghe indicæ no ghe n'è.",
+ "filedelete-otherreason": "Atra motivaçion ò motivaçion azontiva:",
+ "filedelete-reason-otherlist": "Un'atra raxon",
+ "filedelete-reason-dropdown": "*Raxoin comun-e de scançellaçion\n** Violaçion do drito d'aotô\n** File dupricou",
+ "filedelete-edit-reasonlist": "Modiffica e raxoin da scassatua",
+ "filedelete-maintenance": "Scançellaçion e ricuppero di file temporaniamente disattivæ durante a manutençion.",
+ "filedelete-maintenance-title": "Imposcibbile eliminâ o file",
"mimesearch": "Çerca MIME",
+ "mimesearch-summary": "Questa pagina a consente de filtrâ i file in base a-o tipo MIME.\nInsei a stringa de riçerca inta forma tipo/sottotipo o tipo/*, pr'es. <code>image/jpeg</code>.",
+ "mimetype": "Tipo MIME:",
+ "download": "scarrega",
+ "unwatchedpages": "Paggine non öservæ",
"listredirects": "Lista de rindirissamenti",
- "unusedtemplates": "Template no ûtilissæ",
+ "listduplicatedfiles": "Lista di file doggi",
+ "listduplicatedfiles-summary": "Questo o l'è un elenco di file, donde a verscion ciù reçente de 'n file a l'è un dupricou da verscion ciù reçente de 'n atro file. Se piggia in conscideraçion solo che i file locali.",
+ "listduplicatedfiles-entry": "[[:File:$1|$1]] o g'ha [[$3|{{PLURAL:$2|un duplicou|$2 duplicæ}}]].",
+ "unusedtemplates": "Template no ûtilizæ",
+ "unusedtemplatestext": "Inte sta pagina l'è elencou e pagine do namespace {{ns:template}} che no son incluse inte nisciun-a pagina. Primma de scassâle l'è öportun veificâ che i scingoli template no g'aggian di atri collegamenti intranti.",
+ "unusedtemplateswlh": "atri collegamenti",
"randompage": "Pagina a brettìo",
- "randomredirect": "Ûn rindirissamento a brettîo",
+ "randompage-nopages": "Pagine {{PLURAL:$2|into seguente|inti seguenti}} namespace no ghe n'è: $1.",
+ "randomincategory": "Pagina a brettio inta categoria",
+ "randomincategory-invalidcategory": "\"$1\" o no l'è un nomme de categoria vallido.",
+ "randomincategory-nopages": "Paggine in [[:Category:$1]] no ghe n'è.",
+ "randomincategory-category": "Categoria:",
+ "randomincategory-legend": "Pagina a brettio inta categoria",
+ "randomincategory-submit": "Vanni",
+ "randomredirect": "Ûn rindirissamento a brettio",
+ "randomredirect-nopages": "Into namespace \"$1\" redirect no ghe n'è.",
"statistics": "Statistiche",
+ "statistics-header-pages": "Statistiche de pagine",
+ "statistics-header-edits": "Statistiche de modifiche",
+ "statistics-header-users": "Statistiche di utenti",
+ "statistics-header-hooks": "Atre statistiche",
+ "statistics-articles": "Paggine de contegnui",
+ "statistics-pages": "Paggine",
+ "statistics-pages-desc": "Tutte e paggine do scito, compreiso e paggine de discuscion, i redirect, etç.",
+ "statistics-files": "File caregæ",
+ "statistics-edits": "Modifiche a partî dal l'installaçion de {{SITENAME}}",
+ "statistics-edits-average": "Meddia de modiffiche pe paggina",
+ "statistics-users": "[[Special:ListUsers|Utenti]] registræ",
+ "statistics-users-active": "Utenti attivi",
+ "statistics-users-active-desc": "Utenti che han effettuou un'açion {{PLURAL:$1|inte l'urtimo giorno|inti urtimi $1 giorni}}",
+ "pageswithprop": "Paggine co-ina propietæ de paggina",
+ "pageswithprop-legend": "Paggine co-ina propietæ de paggina",
+ "pageswithprop-text": "Questa pagina a fa 'na lista de paggine ch'adoeuvian una particolâ propietæ de paggina.",
+ "pageswithprop-prop": "Nomme da propietæ:",
+ "pageswithprop-submit": "Vanni",
+ "pageswithprop-prophidden-long": "valô testoale longo da propietæ ascoso ($1)",
+ "pageswithprop-prophidden-binary": "valô binaio da propietæ ascoso ($1)",
"doubleredirects": "Rindirissamenti doggi",
+ "doubleredirectstext": "In questa pagina gh'è elencou e paggine che rendiriççan a di atre paggine de redirect.\nOgni riga a conten i collegamenti a-o primmo e a-o segondo redirect, oltre a-a primma riga de testo do segondo redirect che a l'uso o conten a paggina de destinaçion \"corretta\" a-a quæ doviæ puntâ o primmo redirect ascì.\nI redirect <del>scassæ</del> son stæti corretti.",
+ "double-redirect-fixed-move": "[[$1]] o l'è stæto mesciou.\nO l'è stato aggiornou aotomaticamente e oua o l'è un redirect a [[$2]].",
+ "double-redirect-fixed-maintenance": "Corretto aotomaticamente o redirect doggio da [[$1]] a [[$2]] into travaggio de manutençion.",
+ "double-redirect-fixer": "Correttô di redirect",
"brokenredirects": "Rindirissamenti sballiæ",
- "brokenredirectstext": "De sotta unn-a lista de reindirissi a pagine che non existàn:",
+ "brokenredirectstext": "I rendriççi chì de sotta colegan a de paggine inexistente:",
"brokenredirects-edit": "cangia",
"brokenredirects-delete": "scassa",
"withoutinterwiki": "Paggine sensa interwiki",
- "withoutinterwiki-summary": "'Ste paggine chì inzû no g'han nisciûn collegamento co-e verscioîn in âtre lengoe:",
- "fewestrevisions": "Voxi con meno revixoîn",
+ "withoutinterwiki-summary": "E paggine chì de sotta no g'han nisciûn collegamento a-e verscioin in âtre lengoe:",
+ "withoutinterwiki-legend": "Prefisso",
+ "withoutinterwiki-submit": "Mostra",
+ "fewestrevisions": "Pagine con meno revixoin",
"nbytes": "$1 {{PLURAL:$1|byte|byte}}",
+ "ncategories": "$1 {{PLURAL:$1|categoria|categorie}}",
+ "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
"nlinks": "$1 {{PLURAL:$1|collegamento|collegamenti}}",
"nmembers": "$1 {{PLURAL:$1|elemento|elementi}}",
+ "nmemberschanged": "$1 → $2 {{PLURAL:$2|elemento|elementi}}",
+ "nrevisions": "$1 {{PLURAL:$1|revixon|revixoin}}",
+ "nimagelinks": "Doeuviou inte $1 {{PLURAL:$1|paggina|paggine}}",
+ "ntransclusions": "Doeuviou inte $1 {{PLURAL:$1|paggina|paggine}}",
+ "specialpage-empty": "Questa paggina speciale a l'è attualmente voeua.",
"lonelypages": "Paggine orfane",
+ "lonelypagestext": "E seguente paggine no son incluse ni colegæ a di atre paggine de {{SITENAME}}.",
"uncategorizedpages": "Paggine sensa categorîa",
"uncategorizedcategories": "Categorîe sensa categorîa",
"uncategorizedimages": "Immaggini sensa categorîa",
"uncategorizedtemplates": "Template sensa categorîa",
- "unusedcategories": "Categorîe no ûtilissæ",
- "unusedimages": "Archivvi no ûtilissæ",
+ "unusedcategories": "Categorie voeue",
+ "unusedimages": "File inutilizæ",
"wantedcategories": "Categorîe domandæ",
"wantedpages": "Paggine domandæ",
+ "wantedpages-summary": "Lista de paggine inexistente co-o ciu gran nummero de collegamenti a lô, escludendo e pagine ch'han solo che i rendiriççi che-e collegan. Pe 'n elenco de pagine inexistente che g'han di rendriççi che-e collegan, amia [[{{#special:BrokenRedirects}}|a lista di rendriççi erræ]].",
+ "wantedpages-badtitle": "Tittolo invallido into groppo di risultæ: $1",
+ "wantedfiles": "File domandæ",
+ "wantedfiletext-cat": "I seguenti file son in doeuvia, ma no existan. I file ospitæ inte di repository esterni porieivan esighe elencæ sciben che existan. Questi fasci poxitivi saian <del>barræ</del>. E pagine che incòrpoan i file che no existan son elencæ in [[:$1]].",
+ "wantedfiletext-cat-noforeign": "I seguenti file son in doeuvia, ma no existan. Inoltre, e pagine che incòrpoan questi file son elencæ inta [[:$1]].",
+ "wantedfiletext-nocat": "I seguenti file son reciamæ da wikilink, ma no existan. I file ospitæ inte di repository esterni porieivan ese elencæ sciben existenti. Questi fasci poxitivi saian <del>barræ</del>.",
+ "wantedfiletext-nocat-noforeign": "I seguenti file son in doeuvia, ma no existan.",
+ "wantedtemplates": "Template domandæ",
"mostlinked": "Paggine ciû collegæ",
"mostlinkedcategories": "Categorîe ciû collegæ",
- "mostlinkedtemplates": "Template ciû dêuviæ",
- "mostcategories": "Voxi con ciû categorîe",
+ "mostlinkedtemplates": "Paggine ciu incluse",
+ "mostcategories": "Voxe con ciû categorîe",
"mostimages": "Immaggini con ciû collegamenti",
- "mostrevisions": "Voxi con ciû revixoîn",
+ "mostinterwikis": "Paggine con ciu interwiki",
+ "mostrevisions": "Voxe con ciû revixoin",
"prefixindex": "Indiçe arfabetico de voxe",
+ "prefixindex-namespace": "Tutte e paggine co-o prefisso do namespace $1",
+ "prefixindex-submit": "Mostra",
+ "prefixindex-strip": "Ascondi o prefisso inta lista",
"shortpages": "Paggine ciû cûrte",
"longpages": "Paggine ciû longhe",
"deadendpages": "Paggine sensa sciortîa",
+ "deadendpagestext": "E seguente paggine no son collegæ a di atre paggine de {{SITENAME}}.",
"protectedpages": "Paggine protette",
+ "protectedpages-indef": "Solo proteçioin indefinie",
+ "protectedpages-summary": "Questa paggina a l'elenca e paggine existente ch'en attoalmente protezue. Pe 'n elenco di tittoli protezui da-a creaçion, amia [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+ "protectedpages-cascade": "Solo proteçioin ricorscive",
+ "protectedpages-noredirect": "Ascondi redirect",
+ "protectedpagesempty": "Paggine protette con sti parametri pe-o momento no ghe n'è.",
+ "protectedpages-timestamp": "Dæta e oa",
+ "protectedpages-page": "Paggina",
+ "protectedpages-expiry": "Scadença",
+ "protectedpages-performer": "Protetta da l'utente",
+ "protectedpages-params": "Parammetri de proteçion",
+ "protectedpages-reason": "Raxon",
+ "protectedpages-submit": "Mostra paggine",
+ "protectedpages-unknown-timestamp": "Sconosciuo",
+ "protectedpages-unknown-performer": "Utente sconosciuo",
"protectedtitles": "Tittoli protezûi",
+ "protectedtitles-summary": "Questa pagina a l'elenca i titoli che son attualmente protetti da-a creaçion. Pe 'n elenco de pagine existente che son protette, amia [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+ "protectedtitlesempty": "Tittoli protezui con sti parammetri pe-o momento no ghe n'è.",
+ "protectedtitles-submit": "Mostra tittoli",
"listusers": "Lista d'ûtenti",
+ "listusers-editsonly": "Mostra solo i utenti con di contributi",
+ "listusers-creationsort": "Ordina pe dæta de creaçion",
+ "listusers-desc": "Ordina in senso decrescente",
+ "usereditcount": "$1 {{PLURAL:$1|contributo|contributi}}",
"usercreated": "{{GENDER:$3|Creòu/â}} o $1 a-a $2",
"newpages": "Pagine ciù reçenti",
+ "newpages-submit": "Mostra",
+ "newpages-username": "Nomme utente",
"ancientpages": "Paggine ciû vëgie",
"move": "Mescia",
"movethispage": "Mescia 'sta paggina",
+ "unusedimagestext": "I seguenti file existan ma no son doeuviæ inte nisciun-a paggina.\nNotta che di atri sciti web porieivan ese colegæ a 'n file co-in URL diretto, e coscì o poriæ ese inte sta lista sciuben ch'o segge in doeuvia.",
+ "unusedcategoriestext": "E seguente paggine de categoria existan, sciben che nisciun'atra paggina o categoria a-e doeuvie.",
+ "notargettitle": "Dæti mancanti",
+ "notargettext": "No t'hæ indicou una pagina o un utente con chi eseguî sta fonçion.",
+ "nopagetitle": "A pagina de destinaçion a no l'existe",
+ "nopagetext": "A pagina domandâ a no l'existe.",
"pager-newer-n": "{{PLURAL:$1|1 ciù nêuvo|$1 ciù nêuvi}}",
"pager-older-n": "{{PLURAL:$1|1 ciù vêgio|$1 ciù vêgi}}",
+ "suppress": "Soprimmi",
+ "querypage-disabled": "Questa pagina speciale a l'è disattivâ pe motivi de prestaçion.",
+ "apihelp": "Agiutto API",
+ "apihelp-no-such-module": "Moddulo \"$1\" non trovou.",
+ "apisandbox": "Paggina de proeuva API",
+ "apisandbox-jsonly": "Pe doeuviâ a paggina de proeuva API ghe voeu o JavaScript.",
+ "apisandbox-api-disabled": "E fonçionalitæ API son disabilitæ insce questo scito.",
+ "apisandbox-intro": "Doeuvia sta paggina pe fâ prattica co-e <strong>API web service MediaWiki</strong>.\nPe di urteioî detaggi de utilizzo de API, amia a [[mw:API:Main page|documentaçion API]]. Exempio: [https://www.mediawiki.org/wiki/API#A_simple_example ötegnî o contegnuo da paggina prinçipâ]. Seleçion-a un'açion pe vedde di atri exempi.\n\nNotta che, sciben che questa a segge 'na paggina pe-e proeuve, i açioin che ti esegui chì porieivan modificâ a wiki.",
+ "apisandbox-fullscreen": "Espandi pannello",
+ "apisandbox-fullscreen-tooltip": "Espandi o pannello sandbox pe impî o barcon do browser.",
+ "apisandbox-unfullscreen": "Mostra a pagina",
+ "apisandbox-unfullscreen-tooltip": "Reduxi o pannello sandbox, coscì che i collegamenti de navigaçion MediaWiki seggian disponibbili.",
+ "apisandbox-submit": "Inandia recesta",
+ "apisandbox-reset": "Nettezza",
+ "apisandbox-retry": "Ritenta",
+ "apisandbox-loading": "Caregamento de informaçioin pe-o moddulo API \"$1\"...",
+ "apisandbox-load-error": "S'è veificou un errô durante o caregamento de informaçioin pe-o moddulo API \"$1\": $2",
+ "apisandbox-no-parameters": "Questo modulo API o no g'ha de parammetri.",
+ "apisandbox-helpurls": "Collegamenti a-a guidda",
+ "apisandbox-examples": "Exempi",
+ "apisandbox-dynamic-parameters": "Parammetri azontivi",
+ "apisandbox-dynamic-parameters-add-label": "Azonzi parammetro:",
+ "apisandbox-dynamic-parameters-add-placeholder": "Nomme do parammetro",
+ "apisandbox-dynamic-error-exists": "Un parammetro denominou \"$1\" o l'existe za.",
+ "apisandbox-deprecated-parameters": "Parammetri sconsegiæ",
+ "apisandbox-fetch-token": "Aoto-compilla o token",
+ "apisandbox-submit-invalid-fields-title": "Gh'è di campi che n'en vallidi",
+ "apisandbox-submit-invalid-fields-message": "Correzi i campi evidençiæ e riproeuva.",
+ "apisandbox-results": "Risultæ",
+ "apisandbox-sending-request": "Invio recesta de API...",
+ "apisandbox-loading-results": "Riceçion di risultæ de API in corso...",
+ "apisandbox-results-error": "S'è veificou un errô durante o caregamento da risposta a l'interrogaçion API: $1",
+ "apisandbox-request-url-label": "URL de recesta:",
+ "apisandbox-request-time": "Tempo richiesto: {{PLURAL:$1|$1 ms}}",
+ "apisandbox-results-fixtoken": "Correzi token e reinvia",
+ "apisandbox-results-fixtoken-fail": "Imposcibile recuperâ o token \"$1\".",
+ "apisandbox-alert-page": "I campi insce questa pagina no son vallidi.",
+ "apisandbox-alert-field": "O valô de questo campo o no l'è vallido.",
"booksources": "Fonte libraie",
"booksources-search-legend": "Çerca e fonti",
"booksources-isbn": "Codice ISBN:",
"booksources-search": "Çerca",
- "booksources-text": "De sotta unn-a lista de inganci a di ätri sciti che vendan libbri neuvi e vegi e che porrieivan avei ciu informaçioin in scî libbri che ti te çerchi",
- "specialloguserlabel": "Ûtente:",
- "speciallogtitlelabel": "Tittolo:",
+ "booksources-text": "De sotta unn-a lista d'inganci a di ätri sciti che vendan libbri neuvi e vegi e che porrieivan avei ciu informaçioin in scî libbri che ti çerchi",
+ "booksources-invalid-isbn": "O ISBN inserio pâ no ese vallido; controlla che no ghe segge stæto di ari into copiâlo da-a fonte originale.",
+ "specialloguserlabel": "Açion effettuâ da:",
+ "speciallogtitlelabel": "Açion effettuâ sciu (tittolo da paggina ò {{ns:user}}:Nomme utente):",
"log": "Log",
- "all-logs-page": "Tûtti i registri",
- "alllogstext": "Presentaçion unega de tutti i registri do scito {{SITENAME}}.\nTi te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un utente o de pagina.",
+ "logeventslist-submit": "Mostra",
+ "all-logs-page": "Tutti i registri pubbrichi",
+ "alllogstext": "Presentaçion combinaa de tutti i registri de {{SITENAME}}.\nL'è poscibile restrenze i critei de riçerca seleçionando o tipo de registro, l'utente ch'o l'ha eseguio l'açion, e/ò a pagina interessâ (entrambi i campi son senscibbili a-o maiuscolo/minuscolo).",
+ "logempty": "O registro o no conten di elementi corespondenti a-a riçerca.",
+ "log-title-wildcard": "Riçerca di titoli che començan con",
+ "showhideselectedlogentries": "Mostra/ascondi e voxe de registro seleçionæ",
+ "log-edit-tags": "Modifica i etichette de voxe de registro seleçionæ",
+ "checkbox-select": "Seleçion-a: $1",
+ "checkbox-all": "Tutto",
+ "checkbox-none": "Nisciun",
+ "checkbox-invert": "Inverti",
"allpages": "Tûtte e paggine",
"nextpage": "Proscima paggina ($1)",
"prevpage": "Paggina preçedente ($1)",
"allpagesfrom": "Fanni vedde e paggine comensando da:",
+ "allpagesto": "Mostra e paggine scin a:",
"allarticles": "Tùtte e pàgine",
"allinnamespace": "Tutte e pagine ($1 namespace)",
"allpagessubmit": "Vanni",
"allpagesprefix": "Fanni vedde e paggine che inissian con:",
"allpagesbadtitle": "O tittolo dæto a-a paggina o non va ben, òpû o conten di prefissi inter-lengua o inter-wiki. O porriæ ascì contegnî un o ciù caratteri che inti tittoli no se peuan deuviâ.",
"allpages-bad-ns": "\"$1\" o no ghe in {{SITENAME}}.",
+ "allpages-hide-redirects": "Ascondi i redirect",
+ "cachedspecial-viewing-cached-ttl": "T'ê aproeuvo a 'miâ 'na verscion de sta paggina memorizzâ inta cache, ch'a poeu ese vegia de $1 a-o mascimo.",
+ "cachedspecial-viewing-cached-ts": "T'ê aproeuvo a 'miâ 'na verscion de sta paggina memorizzâ inta cache, ch'a poriæ no ese do tutto aggiornâ.",
+ "cachedspecial-refresh-now": "Mostra a ciù reçente.",
"categories": "Categorîe",
+ "categories-submit": "Mostra",
+ "categoriespagetext": "{{PLURAL:$1|A seguente categoria a conten|E seguente categorie contengnan}} de pagine o di file murtimediali.\nE [[Special:UnusedCategories|categorie voeue]] no son mostræ chì.\nAmia ascì e [[Special:WantedCategories|categorie richieste]].",
+ "categoriesfrom": "Mostra e categorie a partî da:",
+ "deletedcontributions": "Contributi utente scassæ",
+ "deletedcontributions-title": "Contributi utente scassæ",
+ "sp-deletedcontributions-contribs": "contribuçioin",
+ "linksearch": "Çerchia di inganci esterni",
+ "linksearch-pat": "Pattern de riçerca:",
+ "linksearch-ns": "Namespace:",
+ "linksearch-ok": "Çerca",
+ "linksearch-text": "L'è poscibbile doeuviâ di metacaratteri comme \"*.wikipedia.org\".\nL'è necessaio a-o manco un dominnio di primmo livello, presempio \"*.org\".<br />\n{{PLURAL:$2|Protocollo supportou|Protocolli supportæ}}: $1 (predefinio http:// se no l'è specificou nisciun protocollo).",
"linksearch-line": "$1 colegòu a-a pagina $2",
+ "linksearch-error": "I metacarattei poeuan ese usati solo a-o prinçippio de l'indiriçço.",
+ "listusersfrom": "Mostra i utenti a partî da:",
"listusers-submit": "Fanni vedde",
"listusers-noresult": "Utente non trovöo.",
+ "listusers-blocked": "(bloccou)",
+ "activeusers": "Lista di utenti attivi",
+ "activeusers-intro": "Questo o l'è un elenco di utenti ch'han avuo quarche tipo d'attivitæ da $1 {{PLURAL:$1|giorno|giorni}} a questa parte.",
+ "activeusers-count": "$1 {{PLURAL:$1|açione|açioin}} {{PLURAL:$3|inte l'urtimo giorno|inti urtimi $3 giorni}}",
+ "activeusers-from": "Mostra i utenti a partî da:",
+ "activeusers-hidebots": "Ascondi i bot",
+ "activeusers-hidesysops": "Ascondi i amministratoî",
+ "activeusers-noresult": "Nisciun utente o risponde a-i critei impostæ.",
+ "activeusers-submit": "Mostra utenti attivi",
+ "listgrouprights": "Driti do groppo utente",
+ "listgrouprights-summary": "De seguito l'è elencou i groppi utente definii pe questo scito, co-i so driti d'accesso associæ.\nPorieiva esighe di [[{{MediaWiki:Listgrouprights-helppage}}|urteioî informaçioin]] in scî driti individoali.",
+ "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Drito assegnou</span>\n* <span class=\"listgrouprights-revoked\">Drito revocou</span>",
+ "listgrouprights-group": "Groppo",
+ "listgrouprights-rights": "Driti",
+ "listgrouprights-helppage": "Help:Driti do groppo",
"listgrouprights-members": "(Elenco di membri)",
+ "listgrouprights-addgroup": "O poeu azonze {{PLURAL:$2|a-o groppo|a-i groppi}}: $1",
+ "listgrouprights-removegroup": "O poeu rimoeuve {{PLURAL:$2|da-o groppo|da-i groppi}}: $1",
+ "listgrouprights-addgroup-all": "O poeu azonze a tutti i groppi",
+ "listgrouprights-removegroup-all": "O poeu rimoeuve da tutti i groppi",
+ "listgrouprights-addgroup-self": "O poeu azonzise {{PLURAL:$2|a-o groppo|a-i groppi}}: $1",
+ "listgrouprights-removegroup-self": "O poeu rimoeuvise {{PLURAL:$2|da-o groppo|da-i groppi}}: $1",
+ "listgrouprights-addgroup-self-all": "O poeu azonzise a tutti i groppi",
+ "listgrouprights-removegroup-self-all": "O poeu rimoeuvise da tutti i groppi",
+ "listgrouprights-namespaceprotection-header": "Restriçioin pe namespace",
+ "listgrouprights-namespaceprotection-namespace": "Namespace",
+ "listgrouprights-namespaceprotection-restrictedto": "Drito ch'o consente a l'utente de modificâ",
+ "listgrants": "Assegnaçioin",
+ "listgrants-summary": "De seguito l'è riportou un elenco de concescioin, co-i so driti utente associæ. I utenti poeuan aotorizzâ e appricaçioin a doeuviâ a proppia utença, ma con di aotorizzaçioin limitæ in base a-e assegnaçioin che l'utente o l'ha dæto a l'appricaçion. Tuttavia, un'appricaçion ch'a l'agisce pe conto de 'n utente a no poeu effettivamente doeuviâ i driti di quæ l'utente o no dispon-e.\nGhe poriæ ese di [[{{MediaWiki:Listgrouprights-helppage}}|urteioî informaçioin]] in scî driti individoali.",
+ "listgrants-grant": "Assegnaçion",
+ "listgrants-rights": "Driti",
+ "trackingcategories": "Categorie de monitoraggio",
+ "trackingcategories-summary": "Questa pagina a l'elenca e categorie de monitoraggio che vegnan popolæ aotomaticamente da-o software MediaWiki. I so nommi poeuan ese cangiæ modificando i relativi messaggi de scistema into namespace {{ns:8}}.",
+ "trackingcategories-msg": "Categoria de monitoraggio",
+ "trackingcategories-name": "Nomme do messaggio",
+ "trackingcategories-desc": "Critei pe l'incluxon intaa categoria",
+ "restricted-displaytitle-ignored": "Pagine con di tittoli da vixualizzâ ignoræ",
+ "restricted-displaytitle-ignored-desc": "A pagina a g'ha un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignorou perché a no l'è equivalente a l'effettivo tittolo da pagina.",
+ "noindex-category-desc": "A pagina a no l'è indiçizzâ da-i robot perché a conten a paola magica <code><nowiki>__NOINDEX__</nowiki></code> e a s'atroeuva inte 'n namespace donde tâ flag a l'è consentia.",
+ "index-category-desc": "A pagina a conten <code><nowiki>__INDEX__</nowiki></code> (e a s'atroeuva inte 'n namespace donde tâ flag a l'è consentia) e quindi a l'è indiçizâ da-i robot, sci ben che normalmente a no-o saieiva.",
+ "post-expand-template-inclusion-category-desc": "A dimenscion da pagina a saiâ ciù grande de <code>$wgMaxArticleSize</code> doppo avei espanso tutti i template, e coscì çerti template no son stæti espansci.",
+ "post-expand-template-argument-category-desc": "A pagina a saiâ ciù grande de <code>$wgMaxArticleSize</code> doppo aver espanso o parametro de un template (quarcosa tra træ parentexi graffe, comme <code>{{{Foo}}}</code>).",
+ "expensive-parserfunction-category-desc": "A pagina a l'adoeuvia troppe fonçioin parser (come <code>#ifexist</code>). Amia [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+ "broken-file-category-desc": "A pagina a conten un collegamento interotto a un file (un collegamento pe incorpoâ un file quande questo o no l'existe).",
+ "hidden-category-category-desc": "Questa categoria a conten <code><nowiki>__HIDDENCAT__</nowiki></code> inta so pagina, o quæ o l'impedisce ch'a segge mostrâ, in moddo predefinio, into riquaddro di collegamenti a-e categorie de pagine.",
+ "trackingcategories-nodesc": "Nisciun-a descriçion disponibbile.",
+ "trackingcategories-disabled": "A categoria a l'è disabilitâ",
+ "mailnologin": "Nisciun adreçço a chi mandâ o messaggio",
+ "mailnologintext": "Pe inviâ di messaggi e-mail a di atri utenti l'è necessaio [[Special:UserLogin|accede a-o scito]] e avei registrou un adreçço vallido inte proppie [[Special:Preferences|preferençe]].",
"emailuser": "Invia 'na email a st'utente chi",
- "defemailsubject": "{{SITENAME}} posta elettronega",
- "noemailtitle": "Nisciûn conto e-mail",
- "emailfrom": "Da",
- "emailto": "A",
- "emailsubject": "Argumento",
- "emailmessage": "Comunicaçion",
+ "emailuser-title-target": "Invia un'email a questo {{GENDER:$1|utente}}",
+ "emailuser-title-notarget": "Invia una email a un utente",
+ "emailpagetext": "Doeuvia o moddulo sottostante pe inviâ un messaggio e-mail a l'{{GENDER:$1|utente}} indicou. L'adreçço speçificou inte [[Special:Preferences|preferençe]] do mittente o l'appariâ into campo \"Da:\" do messaggio pe consentî a-o destinataio de risponde direttamente.",
+ "defemailsubject": "Messaggio da {{SITENAME}} da l'utente \"$1\"",
+ "usermaildisabled": "e-mail utente disabilitâ",
+ "usermaildisabledtext": "No l'è poscibbile inviâ de e-mail a di atri utenti insce questo wiki",
+ "noemailtitle": "Nisciun adreççoo e-mail",
+ "noemailtext": "Questo utente o no l'ha indicou un adreçço e-mail vallido.",
+ "nowikiemailtext": "Questo utente o l'ha scerto de no riçeive messaggi de posta elettronica da-i atri utenti.",
+ "emailnotarget": "Nomme utente do destinataio inexistente o non vallido.",
+ "emailtarget": "Inseisci o nomme utente do destinataio",
+ "emailusername": "Nomme utente",
+ "emailusernamesubmit": "Invia",
+ "email-legend": "Invia un messaggio e-mail a un atro utente de {{SITENAME}}",
+ "emailfrom": "Da:",
+ "emailto": "A:",
+ "emailsubject": "Sogetto:",
+ "emailmessage": "Messaggio:",
"emailsend": "Spèdi",
"emailccme": "Mandame unn-a copia do messagio co unn-a lettìa elettronega.",
- "emailsent": "Lettìa elettronega spèdïa",
- "emailsenttext": "A teua lettìa elettronega a l'è stæta spèdïa.",
+ "emailccsubject": "Coppia do messaggio inviou a $1: $2",
+ "emailsent": "E-mail spedïa",
+ "emailsenttext": "A teu e-mail a l'è stæta spedïa.",
+ "emailuserfooter": "Questa email a l'è stæta {{GENDER:$1|inviâ}} da $1 a {{GENDER:$2|$2}} a traverso a fonçion \"{{int:emailuser}}\" insce {{SITENAME}}.",
+ "usermessage-summary": "Messaggio de scistema",
+ "usermessage-editor": "Messaggê de scistema",
"watchlist": "Sotta osservassion",
"mywatchlist": "Sotta oservaçion",
"watchlistfor2": "Pe $1 $2",
- "watchnologin": "Non ti t'æ entroö",
- "addedwatchtext": "A paggina \"[[:$1]]\" a l'è stæta azzonta a-a pròpia [[Special:Watchlist|lista in osservaçion]]. De chì in avanti, i cangiamenti fæti a-a paggina e a-a sêu discûxon sajàn missi in lista lì; o tittolo da paggina o sajà scrîo in '''grascietto''' inta paggina di [[Special:RecentChanges|ûrtimi cangiamenti]] coscì ti o veddi megio. Se ti vêu eliminâla da-a lista in osservaçion ciû târdi, sciacca \"no seguî\" inscia barra de d'âto.",
- "removedwatchtext": "A paggina \"[[:$1]]\" a l'è stæta scassâa da-a têu lista in osservaçion.",
+ "nowatchlist": "A lista di öservæ speciali a l'è voeua.",
+ "watchlistanontext": "Pe vixualizzâ e modificâ l'elenco di öservæ l'è necessaio eseguî l'accesso.",
+ "watchnologin": "Accesso non effettuou",
+ "addwatch": "Azonzi a-a lista sotta öservaçion",
+ "addedwatchtext": "\"[[:$1]]\" e a so paggina de discuscion son stæte azonte a-a proppia [[Special:Watchlist|lista di öservæ]].",
+ "addedwatchtext-short": "A pagina \"$1\" a l'è stæata azonta a-a proppia lista di öservæ.",
+ "removewatch": "Rimoeuvi da-i öservæ speciali",
+ "removedwatchtext": "\"[[:$1]]\" e a so paggina de discuscion son stæte rimosse da-a proppia [[Special:Watchlist|lista di öservæ]].",
+ "removedwatchtext-short": "A pagina \"$1\" a l'è stæata rimossa da-a proppia lista di öservæ.",
"watch": "Metti sotta oservaçion",
"watchthispage": "Vigilâ 'sta paggina",
"unwatch": "Leva da sott'oservaçion",
- "watchlist-details": "A lista d'oservaçión speçiâle a contegne {{PLURAL:$1|ina pàgina (co-a seu pàgina de discusción)|$1 de pàgine (co-e so pàgine de discusción)}}.",
- "wlshowlast": "Famme vedde e ûrtime $1 ôe $2 giorni",
+ "unwatchthispage": "Smetti de öservâ",
+ "notanarticle": "Questa paggina a no l'è una voxe",
+ "notvisiblerev": "L'urtima revixon a l'è stæta scassâ",
+ "watchlist-details": "A lista di öservæ speciali a conten {{PLURAL:$1|una pagina (e a rispettiva pagina de discuscion)|$1 pagine (e e rispettive pagine de discuscion)}}.",
+ "wlheader-enotif": "A notiffica via email a l'è attiva.",
+ "wlheader-showupdated": "E paggine che son stæte modificæ doppo l'urtima vixita son evidençiæ in '''grascetto'''.",
+ "wlnote": "De sotta {{PLURAL:$1|a l'è elencâ a modifica ciù reçente apportâ|son elencæ e <strong>$1</strong> modifiche ciù reçente apportæ}} {{PLURAL:$2|inte l'urtima oa|inti urtime <strong>$2</strong> oe}}; i dæti son aggiornæ a-e $4 do $3.",
+ "wlshowlast": "Mostra i urtime $1 oe $2 giorni",
+ "watchlist-hide": "Ascondi",
+ "watchlist-submit": "Mostra",
+ "wlshowtime": "Periodo de tempo da vixualizzâ:",
+ "wlshowhideminor": "cangiamenti menoî",
+ "wlshowhidebots": "Bot",
+ "wlshowhideliu": "utenti registræ",
+ "wlshowhideanons": "utenti anonnimi",
+ "wlshowhidepatr": "cangiaménti controllæ",
+ "wlshowhidemine": "e mæ modiffiche",
+ "wlshowhidecategorization": "categorizzaçion da paggina",
"watchlist-options": "Inpostaçioìn di oservæ speciâli",
"watching": "Inti osservæ speçiâli...",
"unwatching": "Scassâ da-i osservæ speçiâli",
+ "watcherrortext": "S'è veificou 'n errô durante a modifica di öservæ pe \"$1\".",
+ "enotif_reset": "Marca tutte-e paggine comme za vixitæ",
+ "enotif_impersonal_salutation": "Utente de {{SITENAME}}",
+ "enotif_subject_deleted": "A paggina $1 de {{SITENAME}} a l'è stæta scassâ da {{gender:$2|$2}}",
+ "enotif_subject_created": "A pagina $1 de {{SITENAME}} a l'è stæta creâ da {{gender:$2|$2}}",
+ "enotif_subject_moved": "A pagina $1 de {{SITENAME}} a l'è stæta mesciâ da {{gender:$2|$2}}",
+ "enotif_subject_restored": "A paggina $1 de {{SITENAME}} a l'è stæta ripristinâ da {{gender:$2|$2}}",
+ "enotif_subject_changed": "A pagina $1 de {{SITENAME}} a l'è stæta modificâ da {{gender:$2|$2}}",
+ "enotif_body_intro_deleted": "A pagina $1 de {{SITENAME}} a l'è stæta scassâ da {{gender:$2|$2}} o $PAGEEDITDATE (amia $3 pe-a verscion attoale).",
+ "enotif_body_intro_created": "A pagina $1 de {{SITENAME}} a l'è stæta creâ da {{gender:$2|$2}} o $PAGEEDITDATE, amia $3 pe-a verscion attoale.",
+ "enotif_body_intro_moved": "A pagina $1 de {{SITENAME}} a l'è stæta mesciâ da {{gender:$2|$2}} o $PAGEEDITDATE, amia $3 pe-a verscion attoale.",
+ "enotif_body_intro_restored": "A pagina $1 de {{SITENAME}} a l'è stæta ripristinâ da {{gender:$2|$2}} o $PAGEEDITDATE, amia $3 pe-a verscion attoale.",
+ "enotif_body_intro_changed": "A pagina $1 de {{SITENAME}} a l'è stæta modificâ da {{gender:$2|$2}} o $PAGEEDITDATE, amia $3 pe-a verscion attoale.",
+ "enotif_lastvisited": "Vixita $1 pe vedde tutte e modiffiche da l'urtima vixita.",
+ "enotif_lastdiff": "Vixita $1 pe vedde a modiffica.",
"enotif_anon_editor": "ûtente anònnimo $1",
+ "enotif_body": "Gentî $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nÖgetto de l'intervento, inseio da l'aotô: $PAGESUMMARY $PAGEMINOREDIT\n\nContatta l'aotô:\nvia posta eletronnica: $PAGEEDITOR_EMAIL\nin sciô scito: $PAGEEDITOR_WIKI\n\nNo saiâ mandou atre notiffiche in caxo de urteioî attivitæ, se no ti vixiti a pagina doppo avei effettuou l'accesso. Inoltre, l'è poscibbile modificâ e impostaçioin de notiffica pe tutte e paggine inta lista dei öservæ speciali.\n\nO scistema de notiffica de {{SITENAME}}, a-o to serviççio\n\n--\nPe modificâ e impostaçioin de notiffiche via posta elettronnica, vixita \n{{canonicalurl:{{#special:Preferences}}}}\n\nPe modificâ a lista di öservæ speciali, vixita \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPe rimoeuve a pagina da-a lista di öservæ speciali, vixita\n$UNWATCHURL\n\nPe commentâ e riçeive agiutto:\n$HELPPAGE",
"changed": "cangiâ",
"deletepage": "Scassa a paggina",
+ "confirm": "Conferma",
+ "excontent": "o contegnuo o l'ea: '$1'",
+ "excontentauthor": "o contegnuo o l'ea: '$1', e l'unnico contributô o l'ea \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|msg]])",
+ "exbeforeblank": "O contegnuo primma do svoeuamento o l'ea: '$1'",
"delete-confirm": "Scassa \"$1\"",
"delete-legend": "Scassa",
- "historywarning": "Attension: A paggina c'a se sta pe scassâ a g'ha 'na cronologîa:",
+ "historywarning": "'''Attençion:''' a paggina che ti stæ pe scassâ a g'ha una cronologia con $1 {{PLURAL:$1|verscion|verscioin}}:",
+ "historyaction-submit": "Mostra",
"confirmdeletetext": "Ti stæ pe scassâ pe sempre da-o database 'na paggina ò 'n'immaggine, assemme a tûtta a sêu cronologîa. Pe cortexia, conferma che davvei ti vêu andâ avanti con quella cancellassion, che ti capisci perfettamente e conseguense de 'st'assion e che a s'adatta a-e linnie guidda stabilîe in [[{{MediaWiki:Policy-url}}]].",
"actioncomplete": "Açion completâ",
"actionfailed": "Açión falîa",
"deletedtext": "A paggina \"$1\" a l'è stæta scassâ. Consultâ o $2 pe 'na lista de paggine scassæ de reçente.",
"dellogpage": "Registro de cose scassæ",
+ "dellogpagetext": "De sotta gh'è 'na lista co-e paggine scassæ ciu de reçente.",
+ "deletionlog": "registro de scassatue",
+ "reverted": "Ripristinou a verscion precedente",
"deletecomment": "Raxon:",
"deleteotherreason": "Ûn âtro motivo",
"deletereasonotherlist": "Ûnn'âtra raxon",
+ "deletereason-dropdown": "* Motivaçioin ciù comun-e pe-a scançellaçion\n** Spam\n** Vandalismo\n** Violaçion do drito d'aotô\n** Recesta de l'aotô\n** Redirect rotto",
+ "delete-edit-reasonlist": "Modiffica e raxoin do scassamento",
+ "delete-toobig": "A cronologia de questa pagina a l'è ben longa (oltre $1 {{PLURAL:$1|verscion|verscioin}}). A so scançellaçion a l'è stæta limitâ pe evitâ de creâ açidentalmente di problemi de fonçionamento a-o database de {{SITENAME}}.",
+ "delete-warning-toobig": "A cronologia de questa pagina a l'è ben longa (oltre $1 {{PLURAL:$1|verscion|verscioin}}). A so scançellaçion a poeu creâ di problemi de fonçionamento a-o database do {{SITENAME}}; procede con caotella.",
+ "deleteprotected": "No ti poeu scassâ questa paggina perché a l'è stæta protetta.",
+ "deleting-backlinks-warning": "<strong>Attençion:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|di atre pagine]] contengnan di collegamenti o de incluxoin a-a paggina che t'ê aproeuvo a scassâ.",
+ "rollback": "Annulla e modiffiche",
"rollbacklink": "rollback",
"rollbacklinkcount": "rollback de {{PLURAL:$1|una modiffica|$1 modiffiche}}",
+ "rollbacklinkcount-morethan": "rollback de ciù de {{PLURAL:$1|una modiffica|$1 modiffiche}}",
+ "rollbackfailed": "Rollback fallio",
+ "rollback-missingparam": "Parammetri obrigatoi mancanti inta recesta.",
"cantrollback": "No se peu tornâ inderê; l'utente ch'o l'ha fæto quelle modiffiche o l'è stæto l'unico contribuente.",
- "alreadyrolled": "O no se peû tornâ inderê a-i ûrtimi cangiamenti da pagina [[:$1]]\nda [[User:$2|$2]] ([[User talk:$2|Ciæti]]); quarche âtro\no l'à cangiâ ò o l'è zà tornòu inderê.\nL'ûrtimo cangiamento o ghe l'à fæto [[User:$3|$3]] ([[User talk:$3|Ciæti]]).",
- "revertpage": "E modificaçioin de [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciæti]]) son stæte eliminæ; riportæ a verscion de primma de [[User:$1|$1]]",
+ "alreadyrolled": "No l'è poscibbile annullâ e modiffiche apportæ a-a pagina [[:$1]] da parte de [[User:$2|$2]] ([[User talk:$2|discuscion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); un atro utente o l'ha zà modificou a pagina oppù o l'ha effettuou o rollback.\n\nA modifica ciù reçente a.a paggina a l'è stæta apportâ da [[User:$3|$3]] ([[User talk:$3|discuscion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+ "editcomment": "L'ogetto da modiffica o l'ea: <em>$1</em>.",
+ "revertpage": "Annullou e modiffiche de [[Special:Contributions/$2|$2]] ([[User talk:$2|discuscion]]), riportâ a-a verscion precedente de [[User:$1|$1]]",
+ "revertpage-nouser": "Annullou e modiffiche de un utente ascoso, riportâ a-a verscion precedente de {{GENDER:$1|[[User:$1|$1]]}}",
+ "rollback-success": "Annullou e modiffiche de $1; paggina riportâ a l'urtima verscion de $2.",
+ "rollback-success-notify": "Annullou e modiffiche de $1;\npaggina riportâ a l'urtima revixon de $2. [$3 Mostra e modiffiche]",
+ "sessionfailure-title": "Sescion fallia",
+ "sessionfailure": "S'è veificou un problema inta sescion ch'a l'identiffica l'accesso; o scistema o no l'ha eseguio o comando impartio pe precauçion. Torna a-a paggina precedente co-o tasto 'Inderê' do to browser, recarega a paggina e riproeuva.",
+ "changecontentmodel": "Cangia o modello de contegnuo de 'na paggina",
+ "changecontentmodel-legend": "Cangia o modello de contegnuo",
+ "changecontentmodel-title-label": "Tittolo da paggina",
+ "changecontentmodel-model-label": "Noeuvo modello de contegnuo",
+ "changecontentmodel-reason-label": "Raxon:",
+ "changecontentmodel-submit": "Cangia",
+ "changecontentmodel-success-title": "O modello de contegnuo o l'è stæto modificou",
+ "changecontentmodel-success-text": "O tipo de contegnuo de [[:$1]] o l'è stæto modificou.",
+ "changecontentmodel-cannot-convert": "O contegnuo de [[:$1]] o no poeu ese convertio inte 'n tipo de $2.",
+ "changecontentmodel-nodirectediting": "O modello de contegnuo $1 o no supporta a modiffica diretta",
+ "changecontentmodel-emptymodels-title": "Nisciun modello de contegnuo disponibbile",
+ "changecontentmodel-emptymodels-text": "O contegnuo de [[:$1]] o no poeu ese convertio inte nisciun tipo.",
+ "log-name-contentmodel": "Modiffiche do modello di contegnui",
+ "log-description-contentmodel": "Eventi relativi a-o modello de contegnuo de 'na paggina",
+ "logentry-contentmodel-new": "$1 {{GENDER:$2|l'ha creou}} a paggina $3 doeuviando un modello de contegnuo non predefinio \"$5\"",
+ "logentry-contentmodel-change": "$1 {{GENDER:$2|l'ha modificou}} o modello de contegnuo da paggina $3 da \"$4\" a \"$5\"",
+ "logentry-contentmodel-change-revertlink": "ripristina",
+ "logentry-contentmodel-change-revert": "ripristina",
"protectlogpage": "Protessioin",
+ "protectlogtext": "De sotta gh'è 'na lista di cangi a-e proteçioin de paggine.\nAmia a [[Special:ProtectedPages|lista de pagine protette]] pe l'elenco de proteçioin de pagina attoalmente attive.",
"protectedarticle": "o l'à protetto \"[[$1]]\"",
+ "modifiedarticleprotection": "ha modificou o livello de proteçion de \"[[$1]]\"",
+ "unprotectedarticle": "o l'ha sprotezuo \"[[$1]]\"",
+ "movedarticleprotection": "o l'ha mesciou a proteçion da \"[[$2]]\" a \"[[$1]]\"",
+ "protect-title": "Cangio do livello de proteçion pe \"$1\"",
+ "protect-title-notallowed": "Veddi o livello de proteçion de \" $1 \"",
"prot_1movedto2": "[[$1]] mesciòu a [[$2]]",
+ "protect-badnamespace-title": "Namespace non protezibbile",
+ "protect-badnamespace-text": "E pagine de questo namespace no poeuan ese protezue.",
+ "protect-norestrictiontypes-text": "Questa pagina a no poeu ese protetta perché non gh'è arcun tipo de restriçion disponibbile.",
+ "protect-norestrictiontypes-title": "Paggina non protezibbile",
"protect-legend": "Confermâ protession",
"protectcomment": "Raxon:",
"protectexpiry": "Scadensa:",
"protect_expiry_invalid": "Scadensa invalida.",
"protect_expiry_old": "Dæta de scadensa into passòu.",
+ "protect-unchain-permissions": "Desblocca di urteioî opçioin de proteçion",
"protect-text": "Chì o l'è poscibbile vedde e modificâ o livello de protession pe-a paggina '''$1'''.",
+ "protect-locked-blocked": "No ti poeu cangiâ i livelli de proteçion quande gh'è un blocco. E impostaçioin corrente pe-a pagina son '''$1''':",
+ "protect-locked-dblock": "Imposcibile modificâ i livelli de proteçion durante un blocco do database.\nE impostaçioin corrente pe-a paggina son '''$1''':",
"protect-locked-access": "No ti g'hæ permisso pe modificâ i livelli de protession da paggina.\nQueste son e impostassioîn correnti pe 'sta paggina ('''$1'''):",
- "protect-cascadeon": "Pe-o momento 'sta paggina chì a l'è bloccâa perché a l'è inclûsa {{PLURAL:$1|inta paggina indicâa apprêuvo, pe-a quæ|inte paggine indicæ apprêuvo, pe-e quæ}} a l'è attiva a protession recorsciva. O se pêu modificâ o livello de protession individuâle da paggina, ma l'impostassioîn derivanti da-a protession recorsciva no sajàn modificæ.",
- "protect-default": "(predefinîo)",
- "protect-fallback": "Besêugna avei permisso \"$1\"",
- "protect-level-autoconfirmed": "Solo ûtenti registræ",
- "protect-level-sysop": "Solo amministratoî",
+ "protect-cascadeon": "A-o momento questa pagina a l'è bloccâ perché inclusa {{PLURAL:$1|inta pagina indicâ de seguito, pe-a quæ|inte pagine indicæ de seguito, pe-e quæ}} l'è attiva a proteçion ricorsciva.\nE modifiche a-o livello de proteçion individoale da pagina, no avian effetto in sce-e impostaçioin derivante da-a proteçion ricorsciva.",
+ "protect-default": "Aotorizza tutti i utenti",
+ "protect-fallback": "Consentio solo a-i utenti con permisso \"$1\"",
+ "protect-level-autoconfirmed": "Consentio solo a-i utenti aotoconvalidæ",
+ "protect-level-sysop": "Consentio solo a-i amministratoî",
"protect-summary-cascade": "recorsciva",
"protect-expiring": "scadensa: $1 (UTC)",
+ "protect-expiring-local": "o descazze o $1",
+ "protect-expiry-indefinite": "indefinio",
"protect-cascade": "Protession recorsciva (estende a protession a tûtte e paggine inclûse in questa chì).",
"protect-cantedit": "Ti no ti pêu modificâ i livelli de protession pe-a paggina se no ti g'hæ i permissi pe modificâ a paggina mæxima.",
- "protect-expiry-options": "2 ôe:2 hours,1 giorno:1 day,3 giorni:3 days,1 settemann-a:1 week,2 settemann-e:2 weeks,1 meise:1 month,3 meixi:3 months,6 meixi:6 months,1 anno:1 year,infinîo:infinite",
+ "protect-othertime": "Duata non in elenco:",
+ "protect-othertime-op": "duata non in elenco",
+ "protect-existing-expiry": "Scadença attoale: $2, $3",
+ "protect-existing-expiry-infinity": "Scadença attoale: infinio",
+ "protect-otherreason": "Atri motivi/detaggi:",
+ "protect-otherreason-op": "Un'atra raxon",
+ "protect-dropdown": "*Motivi comun de proteçion\n** Reiteræ vandalismi\n** Reiteræ inseimenti de spam\n** Guæra de modiffiche contra-produxente\n** Paggina con ato traffego",
+ "protect-edit-reasonlist": "Modiffica e raxoin pe-a proteçion",
+ "protect-expiry-options": "1 oa:1 hour,1 giorno:1 day,1 setteman-a:1 week,2 setteman-e:2 weeks,1 meise:1 month,3 meixi:3 months,6 meixi:6 months,1 anno:1 year,infinio:infinite",
"restriction-type": "Permisso",
"restriction-level": "Livello de restrission",
+ "minimum-size": "Dimenscion minnima",
+ "maximum-size": "Dimenscion mascima:",
+ "pagesize": "(byte)",
"restriction-edit": "Cangia",
"restriction-move": "Mescia",
+ "restriction-create": "Crea",
+ "restriction-upload": "Carrega",
+ "restriction-level-sysop": "protetta",
+ "restriction-level-autoconfirmed": "semi-protezua",
"restriction-level-all": "Tutti i livelli",
"undelete": "Amîa e paggine scassæ",
+ "undeletepage": "Veddi e recuppera e pagine scançellæ",
+ "undeletepagetitle": "'''Quanto segue o l'è composto da de revixoin scassæ de [[:$1|$1]]'''.",
+ "viewdeletedpage": "Veddi e paggine scassæ",
+ "undeletepagetext": "{{PLURAL:$1|A seguente pagina a l'è stæta scassâ, ma a l'è ancon in archivio e pertanto a poeu ese recuperâ|Le seguente pagine son stæte scassæ, ma son ancon in archivio e pertanto poeuan ese recuperæ}}. L'archivio o poeu ese vuou periodicamente.",
+ "undelete-fieldset-title": "Ripristina revixoin",
+ "undeleteextrahelp": "Pe recuperâ l'intrega cronologia da pagina, lascia tutte e caselle deseleçionæ e fanni clic insce '''''{{int:undeletebtn}}'''''.\nPe effettuâ un ripristino selettivo, seleçion-a e caselle corrispondente a-e verscioin da ripristinâ e fanni clic insce '''''{{int:undeletebtn}}'''''.",
+ "undeleterevisions": "{{PLURAL:$1|Una revixon scassâ|$1 revixoin scassæ}}",
+ "undeletehistory": "Recuperando questa pagina, tutte e so verscioin saian ripristinæ inta relativa cronologia.\nSe doppo la scançellaçione l'è stato creou una noeuva pagina co-o mæximo tittolo, e verscioin recuperæ saian inseie inta cronologia precedente.",
+ "undeleterevdel": "O ripristino o no saiâ effettuou s'o determina a scançellaçion parçiâ da verscion attoale da pagina o do file interessou. In tâ caxo, l'è necessaio smarcâ o levâ l'oscuramento da-e verscioin scassæ ciù reçenti.",
+ "undeletehistorynoadmin": "Questa pagina a l'è stæta scassâ.\nO motivo da scassatua o l'è mostrou chì sotta, insemme a-i detaggi de l'utente ch'o l'ha modificou questa pagina primma da scassatua.\nO testo contegnuo inte verscioin scassæ o l'è disponibile solo a-i amministratoî.",
+ "undelete-revision": "Verscion scassâ da pagina $1, inseia o $4 a $5 da $3:",
+ "undeleterevision-missing": "Verscion errâ o mancante. O collegamento o l'è errou o dunque a verscion a l'è stæta zà ripristinâ ò eliminâ da l'archivvio.",
+ "undelete-nodiff": "No l'è stæto trovou nisciun-a verscion precedente.",
"undeletebtn": "Ristorâ",
"undeletelink": "fanni védde/repìggia",
"undeleteviewlink": "fanni védde",
- "cannotundelete": "O repiggio de i dæti o non l'è riuscïo (i peun ese za stæti repiggiæ da quarchedun ätro).",
+ "undeleteinvert": "Inverti a seleçion",
+ "undeletecomment": "Raxon:",
+ "undeletedrevisions": "{{PLURAL:$1|Una verscion recuperâ|$1 verscioin recuperæ}}",
+ "undeletedrevisions-files": "{{PLURAL:$1|Una verscion|$1 verscioin}} e $2 file recuperæ",
+ "undeletedfiles": "{{PLURAL:$1|Un file recuperou|$1 file recuperæ}}",
+ "cannotundelete": "Ripristino non riuscio:\n$1",
+ "undeletedpage": "'''A pagina $1 a l'è stæta recuperâ'''\n\nConsurta o [[Special:Log/delete|registro de scançellaçioin]] pe vedde e scançellaçioin e i recupperi ciù reçente.",
+ "undelete-header": "Consurta o [[Special:Log/delete|registro de scançellaçioin]] pe vedde e scassatue ciù reçente.",
+ "undelete-search-title": "Çerca inte pagine scassæ",
+ "undelete-search-box": "Çerca e paggine scassæ",
+ "undelete-search-prefix": "Mostra e paggine che començan con:",
+ "undelete-search-submit": "Çerca",
+ "undelete-no-results": "Nisciun-a pagina corrispondente inte l'archivio de scançellaçioin.",
+ "undelete-filename-mismatch": "Imposcibbile annullâ a scançellaçion da verscion do file con timestamp $1: nomme do file non corrispondente.",
"undelete-bad-store-key": "No se peu repiggiâ o file co-a dæta $1: o file o no gh'ea za ciu primma d'ese scassou.",
"undelete-cleanup-error": "Errô into scassâ o file d'archivio non utilizzòu \"$1\".",
+ "undelete-missing-filearchive": "Imposcibile ripristinâ l'ID $1 de l'archivio file in quanto o no l'è presente into database. O poriæ ese stæto za ripristinou.",
+ "undelete-error": "Errô into ripristino da pagina",
"undelete-error-short": "Errô repiggiando i dæti do file \"$1\".",
"undelete-error-long": "Gh'è stæto di erroî inte l'annullâ a cançellaçion do file:\n\n$1",
+ "undelete-show-file-confirm": "T'ê seguo de voei amiâ a verscion scassâ do file \"<nowiki>$1</nowiki>\" do $2 a $3?",
+ "undelete-show-file-submit": "Sci",
"namespace": "Namespace:",
"invert": "Invertî a seleçión",
"tooltip-invert": "Selession-a sta casella pe asconde e modiffiche a-e paggine a l'interno do namespace selessionou (e o namespace associou, se selessionou)",
+ "tooltip-whatlinkshere-invert": "Marca sta casella pe asconde i collegamenti da-e pagine a l'interno do namespace seleçionou",
"namespace_association": "Namespace associou",
"tooltip-namespace_association": "Selession-a sta casella pe includde ascì a paggina de discuscion ò l'oggetto do namespace associou co-o namespace selessionou",
"blanknamespace": "(Prinçipâ)",
"contributions-title": "Contribuçioìn de $1",
"mycontris": "Contribuçioin",
"anoncontribs": "Contribuçioin",
- "contribsub2": "Pe $1 ($2)",
- "uctop": "(ûrtima pe-a paggina)",
+ "contribsub2": "Pe {{GENDER:$3|$1}} ($2)",
+ "contributions-userdoesnotexist": "L'utença \"$1\" a no l'è registrâ.",
+ "nocontribs": "Cangi che soddisfan i critei de riçerca no se n'è atrovou.",
+ "uctop": "(attoale)",
"month": "Partindo da-o meize (e precedénti):",
"year": "Partindo da l'anno (e precedenti):",
"sp-contributions-newbies": "Fanni védde sôlo e contribuçioìn di nêuvi utenti",
"sp-contributions-newbies-sub": "Pe i nêuvi ûtenti",
+ "sp-contributions-newbies-title": "Contribuçioin di noeuvi utenti",
"sp-contributions-blocklog": "Blòcchi",
+ "sp-contributions-suppresslog": "contributi utente soppresci",
+ "sp-contributions-deleted": "contributi utente scassæ",
"sp-contributions-uploads": "caregaménti",
"sp-contributions-logs": "log",
"sp-contributions-talk": "Ciæti",
+ "sp-contributions-userrights": "manezzo di driti di utenti",
+ "sp-contributions-blocked-notice": "St'utente o l'è attualmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì de sotta pe rifeimento:",
+ "sp-contributions-blocked-notice-anon": "St'addreçço IP o l'è attoalmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì de sotta pe rifeimento:",
"sp-contributions-search": "Riçerca contribuçioìn",
"sp-contributions-username": "Indirìsso IP ò nómme utente:",
"sp-contributions-toponly": "Fanni védde sôlo i cangiaménti ch'en i ùrtime revixoìn da pàgina",
+ "sp-contributions-newonly": "Fanni védde sôlo i cangiaménti ch'en de creaçioin de pàgina",
+ "sp-contributions-hideminor": "Ascondi e modifiche menoî",
"sp-contributions-submit": "Çerca",
"whatlinkshere": "Cöse se colega chì",
"whatlinkshere-title": "Pàgine c'apontàn a $1",
"whatlinkshere-page": "Pàgina:",
"linkshere": "E pàgine segoenti apontan a '''[[:$1]]''':",
"nolinkshere": "Nisciùnn-a pàgina a se collega con '''[[:$1]]'''.",
+ "nolinkshere-ns": "Pagine ch'apontan a '''[[:$1]]''' into namespace seleçionou no ghe n'è.",
"isredirect": "Paggina de rindirissamento",
"istemplate": "Incluxon",
"isimage": "Colegamento a file",
"whatlinkshere-next": "{{PLURAL:$1|sûccescivo|sûccescivi $1}}",
"whatlinkshere-links": "← colegaménti",
"whatlinkshere-hideredirs": "$1 i rendirissamenti",
- "whatlinkshere-hidetrans": "$1 Incluxon",
+ "whatlinkshere-hidetrans": "$1 Incluxoin",
"whatlinkshere-hidelinks": "$1 colegaménti",
- "whatlinkshere-hideimages": "$1 colegaménti di file",
+ "whatlinkshere-hideimages": "$1 colegamenti da file",
"whatlinkshere-filters": "Filtri",
- "blockip": "Blocca l'ûtente",
+ "whatlinkshere-submit": "Vanni",
+ "autoblockid": "Aotobrocco #$1",
+ "block": "Blocca utente",
+ "unblock": "Desblocca utente",
+ "blockip": "Blocca {{GENDER:$1|utente}}",
+ "blockip-legend": "Blocca l'utente",
+ "blockiptext": "Doeuvia o moddulo sottostante pe bloccâ l'accesso in scrittua a un speciffico addreçço IP ò a un utente registrou.\nO blocco o dev'ese doeuviou pe prevegnî di atti de vandalismo e in streita öservança de [[{{MediaWiki:Policy-url}}|reggole de {{SITENAME}}]].\nIndica o motivo speçiffico pe-o quæ se procede a-o blocco (presempio, çitando i tittoli di eventuæ paggine ögetto de vandalismo).\nTi poeu bloccâ di ntervalli de IP doeuviando a scintasci [https://it.wikipedia.org/wiki/CIDR CIDR]; l'intervallo ciù ampio consentio o l'è /$1 pe IPv4 e /$2 pe IPv6.",
+ "ipaddressorusername": "Adreçço IP ò nómme utente:",
+ "ipbexpiry": "Scadença:",
"ipbreason": "Raxon:",
+ "ipbreason-dropdown": "*Motivaçioni ciù comun-e pe-i blocchi\n** Inseimento de informaçioin fase\n** Rimoçion di contegnti da-e paggine\n** Collegamenti promoçionæ a di sciti esterni\n** Inseimento di contegnui privi de senso\n** Comportamenti intimidatoi ò molestie\n** Uso indebbito de utençe murtiple\n** Nomme utente inaçettabbile",
+ "ipb-hardblock": "Impedisci a-i utenti registræ de contribuî da questo adreçço IP",
+ "ipbcreateaccount": "Impedisci a registraçion",
+ "ipbemailban": "Impedisci a l'utente l'invio di email",
+ "ipbenableautoblock": "Blocca aotomaticamente l'urtimo adreçço IP doeuviou da l'utente e i succescivi da-i quæ tentan e modiffiche",
+ "ipbsubmit": "Blocca st'utente",
+ "ipbother": "Duata non in elenco:",
"ipboptions": "2 ôe:2 hours,1 giorno:1 day,3 giorni:3 days,1 settemann-a:1 week,2 settemann-e:2 weeks,1 meise:1 month,3 meixi:3 months,6 meixi:6 months,1 anno:1 year,infinîo:infinite",
+ "ipbhidename": "Ascondi o nomme utente da-e modiffiche e da-i elenchi.",
+ "ipbwatchuser": "Controlla e pagine e-e discuscioin utente de questo utente",
+ "ipb-disableusertalk": "Impedisci a questo utente de modificâ a proppia paggina de discuscion dementre ch'o l'è bloccou",
+ "ipb-change-block": "Re-blocca l'utente con queste impostaçioin",
+ "ipb-confirm": "Conferma o blocco",
"badipaddress": "Indirisso IP non valido",
"blockipsuccesssub": "Blocco ariêscîo",
- "blockipsuccesstext": "[[Special:Contributions/$1|$1]] o l'è stæto bloccou.\n<br />Veddi [[Special:BlockList|Lista di addressi IP bloccæ]] pe vedde i blocchi attivi.",
+ "blockipsuccesstext": "[[Special:Contributions/$1|$1]] o l'è stæto bloccou.\n<br />Amia a [[Special:BlockList|lista di adreççi IP bloccæ]] pe vedde i blocchi attivi.",
+ "ipb-blockingself": "Ti stæ pe bloccâ ti mæximo! T'ê seguo die voeilo fâ?",
+ "ipb-confirmhideuser": "Ti stæ pe bloccâ un utente con l'opçion \"Ascondi utente\" abilitâ.\nDe sta mainea o nomme utente o saiâ sopresso da tutte le liste e-e voxe de registro.\nT'ê seguo de voeilo fâ?",
+ "ipb-confirmaction": "Se t'ê seguo de voeilo fâ davei, controlla o campo \"{{int:ipb-confirm}}\" in fondo.",
+ "ipb-edit-dropdown": "Modifica i motivi do blocco",
+ "ipb-unblock-addr": "Sblocca $1",
+ "ipb-unblock": "Sblocca un utente ò un adreçço IP",
+ "ipb-blocklist": "Elenca i blocchi attivi",
+ "ipb-blocklist-contribs": "Contribuçioin de {{GENDER:$1|$1}}",
+ "ipb-blocklist-duration-left": "$1 arestæ",
+ "unblockip": "Desblocca utente",
+ "unblockiptext": "Doeuvia o moddulo sottostante pe restituî l'accesso in scrittua a 'n utente ò adreçço IP bloccou.",
+ "ipusubmit": "Leva sto blocco",
+ "unblocked": "L'utente [[User:$1|$1]] o l'è stæto sbloccou",
+ "unblocked-range": "$1 o l'è stæto sbloccou",
+ "unblocked-id": "O blocco $1 o l'è stæto rimòsso",
+ "unblocked-ip": "[[Special:Contributions/$1|$1]] o l'è stæto sbloccou.",
+ "blocklist": "Utenti bloccæ",
"ipblocklist": "Utenti blocæ",
+ "ipblocklist-legend": "Çerca un utente bloccou",
+ "blocklist-userblocks": "Ascondi i blocchi di utenti registræ",
+ "blocklist-tempblocks": "Ascondi i blocchi temporannei",
+ "blocklist-addressblocks": "Ascondi i blocchi de un solo IP",
+ "blocklist-rangeblocks": "Ascondi i blocchi de range",
+ "blocklist-timestamp": "Dæta e oa",
+ "blocklist-target": "Destinaçion",
+ "blocklist-expiry": "O descazze",
+ "blocklist-by": "Amministratô ch'o l'ha misso o blocco",
+ "blocklist-params": "Parammetri de blocco",
+ "blocklist-reason": "Raxon",
+ "ipblocklist-submit": "Çerca",
+ "ipblocklist-localblock": "Blocco locale",
+ "ipblocklist-otherblocks": "{{PLURAL:$1|Atro blocco|Atri blocchi}}",
+ "infiniteblock": "infinio",
+ "expiringblock": "o descazze o $1 a $2",
"anononlyblock": "Solo anonnimi",
+ "noautoblockblock": "blocco aotomatico disabilitou",
+ "createaccountblock": "registraçion bloccâ",
"emailblock": "posta elettronega bloccâ",
+ "blocklist-nousertalk": "o no poeu modificâ a proppia pagina de discuscion",
"ipblocklist-empty": "A lista di blocchi a l'è veua.",
+ "ipblocklist-no-results": "L'adreçço IP ô o nomme utente domandou o no l'è bloccou.",
"blocklink": "Blocca",
"unblocklink": "sblòcca",
"change-blocklink": "càngia blòcco",
"contribslink": "Contribuçioìn",
- "autoblocker": "Affermoö automaticamente perchè o teu indirisso IP o l'è stæto usöo da \"[[User:$1|$1]]\" neuvamente. A razon dæta pe affermâ $1 a l'è stæta:\n\"$2\"",
+ "emaillink": "manda e-mail",
+ "autoblocker": "Bloccou aotomaticamente perché l'adreçço IP o l'è condiviso con l'utente \"[[User:$1|$1]]\".\nO blocco de l'utente $1 o l'è stæto imposto pe-o seguente motivo: \"$2\".",
"blocklogpage": "Blòcchi",
+ "blocklog-showlog": "Questo utente o l'è stæto bloccou in precedença. O registro di blocchi o l'è riportou de sotta pe rifeimento:",
+ "blocklog-showsuppresslog": "Questo utente o l'è stæto bloccou e nscoso in precedença. O registro de rimoçioin o l'è riportou de sotta pe rifeimento:",
"blocklogentry": "blocòu [[$1]] pe in periodo de $2 $3",
- "blocklogtext": "Sta chie a l'è unn-a lista de affermaçioin fæte e levæ.\nI indirissi IP affermæ automaticamente non son consideræ.\nVeddi a [[Special:BlockList|Lista de i indirissi IP affermæ]] pe e informaçioin neuve.",
- "block-log-flags-anononly": "Utenti anonimmi soö",
+ "reblock-logentry": "o l'ha cangiou e impostaçioin do blocco pe [[$1]] co-ina scadença de $2 $3",
+ "blocklogtext": "De sotta gh'è 'n registro di açioin de blocco e sblocco utenti.\nI adreççi IP bloccæ aotomaticamente no son elencæ.\nConsurta l'[[Special:BlockList|elenco di blocchi]] pe l'elenco di bandi o blocchi attoalmente opiativi.",
+ "unblocklogentry": "o l'ha sbloccou $1",
+ "block-log-flags-anononly": "solo utenti anonnimi",
"block-log-flags-nocreate": "Neuve registrascioin non son permisse",
"block-log-flags-noautoblock": "O blocco automatego o non l'è attïvo",
"block-log-flags-noemail": "A posta elettronega a non l'è attïva",
+ "block-log-flags-nousertalk": "o no poeu modificâ a proppia pagina de discuscion",
+ "block-log-flags-angry-autoblock": "blocco aotomatico avançou attivo",
+ "block-log-flags-hiddenname": "nomme utente ascoso",
+ "range_block_disabled": "O drito d'aministratô de bloccâ di intervalli d'adreççi IP o l'è disabilitou.",
+ "ipb_expiry_invalid": "Scadença non vallida.",
+ "ipb_expiry_old": "Scadença za trascorsa.",
+ "ipb_expiry_temp": "I blocchi di nommi utenti ascoxi devan ese permanenti.",
+ "ipb_hide_invalid": "Imposcibbile soprimme questa utença; a gha ciù de {{PLURAL:$1|'na modiffica|$1 modiffiche}}.",
+ "ipb_already_blocked": "L'utente \"$1\" o l'è za bloccou",
+ "ipb-needreblock": "L'utente $1 o l'è za bloccou. Ti voeu miga cangiâ e impostaçioin?",
+ "ipb-otherblocks-header": "{{PLURAL:$1|Atro blocco|Atri blocchi}}",
+ "unblock-hideuser": "No ti poeu sbloccâ questo utente, perché o so nomme utente o l'è stæto ascoso.",
+ "ipb_cant_unblock": "Errô: Imposcibbile trovâ o blocco con ID $1. O blocco o poriæ ese za stæto rimosso.",
+ "ipb_blocked_as_range": "Errô: L'adreçço IP $1 o no l'è soggetto a blocco individoale e o no poeu ese sbloccou. O blocco o l'è invece attivo a livello de l'intervallo $2, ch'o poeu ese sbloccou.",
+ "ip_range_invalid": "Intervallo d'adreççi IP non vallido.",
+ "ip_range_toolarge": "No l'è poscibbile bloccâ de range supeioî a-o /$1",
+ "proxyblocker": "Blocco di proxy averti",
+ "proxyblockreason": "Questo adreçço IP o l'è stæto bloccou perché o l'è un proxy averto. Se prega de contattâ o proppio fornitô d'accesso a Internet ò o supporto tecnico e informâli de questo grave problema de segueça.",
+ "sorbsreason": "Questo adreçço IP o l'è elencou comme proxy averto inta lista DNSBL doeuviâ da {{SITENAME}}.",
+ "sorbs_create_account_reason": "No l'è poscibbile creâ de noeuve utençe con questo adreçço IP perché o l'è elencou comme proxy averto inta lista DNSBL doeuviâ da {{SITENAME}}.",
+ "xffblockreason": "Un adreçço IP presente inte l'intestaçion X-Forwarded-For, toeu ò do server proxy che ti doeuvi, o l'è stæto bloccou. A raxon originâ do blocco a l'è: $1",
+ "cant-see-hidden-user": "L'utente che ti çerchi de bloccâ o l'è stæto za bloccou e ascoso. Scicomme no ti g'hæ o permisso \"hideuser\", no l'è poscibbile vixualizâ ò modificâ o blòcco de l'utente.",
+ "ipbblocked": "No ti poeu bloccâ ò sbloccâ di atri utenti, perché ti mæximo t'ê bloccou",
+ "ipbnounblockself": "No ti poeu sbloccâ ti mæximo",
+ "lockdb": "Blocca o database",
+ "unlockdb": "Sblocca o database",
+ "lockdbtext": "O blocco do database o comporta l'interruçion, pe tutti i utenti, da poscibilitæ de modificâ e paggine o de creâne de noeuve, de cangiâ e preferençe e modificâ e liste di öservæ speciali, e in generâ de tutte i opiaçioin pe-e quæ öcore de modiffiche a-o database. Pe cortexia, conferma che questo l'è proppio quello che t'intendi de fâ e che a-a fin da manutençion ti provediæ a-o sblocco do database.",
+ "unlockdbtext": "O sblocco do database o consente torna a tutti i utenti de modificâ e paggine o de creâne de noeuve, de cangiâ e preferençe e modificâ le liste di öservæ speciali, e in generâ de compî tutte i öpiaçioin pe-e quæ öcore de modiffiche a-o database. Pe cortexia, conferma che questo l'è proppio quello che t'intendi de fâ.",
+ "lockconfirm": "Scì, intendo effettivamente bloccâ o database.",
+ "unlockconfirm": "Scì, intendo effettivamente sbloccâ o database.",
+ "lockbtn": "Blocca o database",
+ "unlockbtn": "Sblocca o database",
+ "locknoconfirm": "No t'hæ marcou a casella de conferma.",
+ "lockdbsuccesssub": "Blocco do database eseguio",
+ "unlockdbsuccesssub": "Sblocco do database eseguio",
+ "lockdbsuccesstext": "O database o l'è stæto bloccou.<br />\nAregordite de [[Special:UnlockDB|levâ o blocco]] doppo d'avei terminou i opiaçioin de manutençion.",
+ "unlockdbsuccesstext": "O database o l'è stæto sbloccou.",
+ "lockfilenotwritable": "Imposcibbile scrive in sciô file de ''lock'' do database. Pe bloccâ e sbloccâ il database l'è necessaio l'accesso in scrittua a questo file da parte do server web .",
+ "databaselocked": "O database o l'è za bloccou.",
"databasenotlocked": "O database o no l'è bloccòu.",
+ "lockedbyandtime": "(da $1 o $2 a $3)",
+ "move-page": "Stramuo de $1",
"move-page-legend": "Mescia a paggina",
- "movepagetext": "Chì o se pêu dâ 'n nêuvo nomme a 'na paggina, stramûando tûtta a sêu cronologîa a-o nêuvo nomme.\nA paggina attuâle a fa outomaticamente 'n rindirissamento a-o nêuvo tittolo.\nI collegamenti escistenti no sajàn aggiornæ; veriffica che 'sto stramûo o no l'agge creòu doggi rindirissamenti ò rindirissamenti sballiæ.\nA responsabilitæ pe tegnî i collegamenti sempre donde deivan andâ a l'è têu.\n\nA paggina a '''no''' sajà stramûâa se ghe foisse zà ûnn-a co-o nêuvo nomme, a meno c'a no segge vêua ò fæta solo da 'n rindirissamento a-a vegia e a no l'agge verscioîn preçedenti.\nIn caso de stramûo sballiòu o se pêu tornâ sûbbito a-o vegio tittolo, e o no l'è poscibbile sorvescrive pe errô 'na paggina zà escistente.\n\n'''ATTENSION:'''\n'N cangiamento coscì grande o porieiva creâ di controtempi e problemmi, sorvetûtto pe-e paggine ciû viscitæ.\nPensa ben e conseguense de 'sto stramûo primma d'andâ avanti!",
+ "movepagetext": "Questo moddulo o consente de rinominâ una pagina, mesciando tutta a so cronologia a-o noeuvo nomme. A paggina attoale a vegniâ aotomaticamente un redirect a-o noeuvo tittolo. Controlla che o stramuo o no l'abbia creou di [[Special:DoubleRedirects|doggi redirect]] ò di [[Special:BrokenRedirects|redirect erræ]]. L'onere de garantî che i collegamenti a-a pagina arestan corretti o speta a chi a mescia.\n\nNotta che a pagina a <strong>no</strong> saiâ mesciaa se n'existe za un-a co-o noeuvo nomme, a meno che a no segge costituia solo che da un redirect e a segge priva de verscioin precedente. In caxo de stramuo errou se poeu tornâ subbito a-o vegio tittolo, e no l'è poscibbile soviascrive pe sballio una pagina za existente.\n\n<strong>Nota:</strong>\nUn cangiamento coscì drastego o poeu creâ di contrattempi e di problemi, soviatutto pe-e paggine ciù vixitæ. Asseguite d'avei valutou e conseguençe primma de procede.",
+ "movepagetext-noredirectfixer": "Questo moddulo o consente de rinominâ una pagina, mesciando tutta a so cronologia a-o noeuvo nomme. A paggina attoale a vegniâ aotomaticamente un redirect a-o noeuvo tittolo. Controlla che o stramuo o no l'abbia creou di [[Special:DoubleRedirects|doggi redirect]] ò di [[Special:BrokenRedirects|redirect erræ]]. L'onere de garantî che i collegamenti a-a pagina arestan corretti o speta a chi a mescia.\n\nNotta che a pagina a <strong>no</strong> saiâ mesciaa se n'existe za un-a co-o noeuvo nomme, a meno che a no segge costituia solo che da un redirect e a segge priva de verscioin precedente. In caxo de stramuo errou se poeu tornâ subbito a-o vegio tittolo, e no l'è poscibbile soviascrive pe sballio una pagina za existente.\n\n<strong>Nota:</strong>\nUn cangiamento coscì drastego o poeu creâ di contrattempi e di problemi, soviatutto pe-e paggine ciù vixitæ. Asseguite d'avei valutou e conseguençe do stramuo primma de procede.",
"movepagetalktext": "Se ti seleçion-i questa casella, a corispondente paggina de discuscion a saiâ mesciâ aotomaticamente a-o neuvo tittolo, a meno che existe zà una paggina de discuscion ch'a no segge veua.\n\nInte sti caxi, ti doviæ mesciâ o unî manoalmente a paggina, se proppio ti veu.",
- "newtitle": "Nêuvo tittolo:",
+ "moveuserpage-warning": "'''Attençione:''' Ti stæ pe mesciâ una pagina utente. Notta che solo a pagina a saiâ mesciâ. L'utente o ''no'' saiâ rinominou.",
+ "movecategorypage-warning": "<strong>Attençione:</strong> ti stæ pe mesciâ una categoria. Notta che solo sta paggina a saiâ mesciâ e tutte e pagine inta vegia categoria <em>no</em> saian inseie inta noeuva.",
+ "movenologintext": "O stramuo dee paggine o l'è consentio solo che a-i utenti registræ ch'han eseguio l'[[Special:UserLogin|accesso]] a-o scito.",
+ "movenotallowed": "No ti g'hæ o permisso pe mesciâ de paggine.",
+ "movenotallowedfile": "No ti g'hæ o permisso pe mesciâ di file.",
+ "cant-move-user-page": "No ti g'hæ o permisso pe mesciâ de pagine utente (escluse e sottopagine).",
+ "cant-move-to-user-page": "No ti g'hæ o permisso pe mesciâ a pagina insce 'na pagina utente (escluse e sottopagine utente).",
+ "cant-move-category-page": "No ti g'hæ o permisso pe mesciâ de categorie.",
+ "cant-move-to-category-page": "No ti g'hæ o permisso pe mesciâ a pagina insce 'na categoria.",
+ "newtitle": "Noeuvo tittolo:",
"move-watch": "Azzonze a li osservæ speçiâli",
"movepagebtn": "Stramûâ a paggina",
"pagemovedsub": "Remescio fæto",
- "articleexists": "Ghe n'æmmo zà 'na paggina con 'sto nomme, oppûre quello che ti g'hæ scelto o no l'è permisso. Cangia nomme.",
+ "movepage-moved": "'''\"$1\" a l'è stæta mesciâ a \"$2\"'''",
+ "movepage-moved-redirect": "L'è stæto creou un redirect.",
+ "movepage-moved-noredirect": "A creaçion de un redirect a l'è stæta sopressa.",
+ "articleexists": "Una paggina con sto nomme ghe l'emmo za, oppûre quello che t'hæ çernuo o no l'è vallido. Pe piaxei çerni 'n atro nomme.",
+ "cantmove-titleprotected": "O stramuo da paggina o no l'è poscibbile in quante o noeuvo tittolo o l'è stæto protezuo pe impedîne a creaçion.",
"movetalk": "Mescia a paggina de discuscion ascì.",
+ "move-subpages": "Mescia e sottopaggine (scin a $1)",
+ "move-talk-subpages": "Mescia e sottopaggine de discuscion (scin a $1)",
+ "movepage-page-exists": "A paggina $1 a l'existe za e a no poeu ese aotomaticamente soviascrita.",
+ "movepage-page-moved": "A paggina $1 a l'è stæta mesciaa a $2.",
+ "movepage-page-unmoved": "A paggina $1 a no poeu ese mesciâ a $2.",
+ "movepage-max-pages": "L'è stæto mesciou o nummero mascimo de $1 {{PLURAL:$1|paggina|paggine}}: aotomaticamente no ne saiâ mesciou ciu.",
"movelogpage": "Lista di stramûi",
+ "movelogpagetext": "De sotta una lista de tutti i stramui de paggina.",
+ "movesubpage": "{{PLURAL:$1|Sottopagina|Sottopagine}}",
+ "movesubpagetext": "Questa pagina a g'ha $1 {{PLURAL:$1|sottopagina mostrâ|sottopagine mostræ}} chì de sotta.",
+ "movenosubpage": "Questa pagina a no g'ha de sottopagine.",
"movereason": "Raxon",
"revertmove": "Ristorâ",
+ "delete_and_move_text": "A pagina specificâ comme destinaçion \"[[:$1]]\" a l'existe za. Ti voeu miga scassâla pe fâ röso pe-o stramuo?",
"delete_and_move_confirm": "Scì, scassa a pagina",
- "delete_and_move_reason": "Levoö pe fâ röso pe un remescio",
+ "delete_and_move_reason": "Scassâ pe fâ röso pe un stramuo da \"[[$1]]\"",
+ "selfmove": "O tittolo de destinaçion o l'è pægio de quello de proveniença, no l'è poscibbile mesciâ una paggina insce lê mæxima.",
+ "immobile-source-namespace": "No l'è poscibbile mesciâ de pagine do namespace \"$1\"",
+ "immobile-target-namespace": "No l'è poscibbile mesciâ de paggine into namespace \"$1\"",
+ "immobile-target-namespace-iw": "Un collegamento interwiki o no l'è una destinaçion vallida pe'n stramuo de paggina.",
+ "immobile-source-page": "Questa pagina a no poeu ese mesciâ.",
+ "immobile-target-page": "No l'è poscibbile fâ o stramuo inte quello tittolo de destinaçion.",
+ "bad-target-model": "A destinaçion dexidiâ a l'adoeuvia un modello de contegnui despægio. No l'è poscibbile convertî da $1 a $2.",
+ "imagenocrossnamespace": "No l'è poscibbile mesciâ un file foeua da-o relativo namespace.",
+ "nonfile-cannot-move-to-file": "No l'è poscibbile mesciâ un file foeua da-o relativo namespace.",
+ "imagetypemismatch": "A noeuva estenscion do file a no corisponde a-o so tipo.",
+ "imageinvalidfilename": "O nomme de l'immaggine o no l'è vallido",
+ "fix-double-redirects": "Aggiorna tutti i redirect ch'apontan a-o tittolo originâ",
+ "move-leave-redirect": "Lascighe derê un redirect",
+ "protectedpagemovewarning": "'''Attençion: questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificâla.'''\nL'urtimo elemento do registro o l'è riportou chì sotta pe referença:",
+ "semiprotectedpagemovewarning": "'''Notta:''' Questa paggina a l'è stæta bloccä de moddo che solo i utenti registræ possan mesciâla.\nL'urtimo elemento do registro o l'è riportou chì sotta pe referensa:",
+ "move-over-sharedrepo": "[[:$1]] a l'existe za inte 'n archivvio condiviso. O stramuo de 'n file a questo tittolo o comportiâ a soviascritua do file condiviso.",
+ "file-exists-sharedrepo": "O nomme che t'hæ çernuo pe-o file o l'è za in doeuvia.\nPe piaxei, çerni un atro nomme.",
"export": "Espòrta pàgine",
+ "exporttext": "L'è poscibbile esportâ o testo e a cronologia de modiffiche de una paggina ò de un groppo de pagine in formato XML pe importâle inte di atri sciti ch'adoeuvian o software MediaWiki, a traverso a [[Special:Import|paggina de importaçioin]].\n\nPe esportâ e paggine indica i tittoli inta casella de testo sottostante, un pe riga, e speciffica se ti dexiddei d'ötegnî l'urtima verscion e tutte e verscioin precedente, co-i dæti da cronologia da paggina, oppû soltanto l'urtima verscion e i dæti corispondenti a l'urtima modiffica.\n\nIn quest'urtimo caxo ti poeu doeuviâ ascì un collegamento, presempio [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pe esportâ \"[[{{MediaWiki:Mainpage}}]]\".",
+ "exportall": "Esporta tutte e pagine",
+ "exportcuronly": "Includdi solo a verscion attoâ, non l'intrega cronologia",
+ "exportnohistory": "----\n'''Notta:''' l'esportaçion de l'intrega cronologia de paggine a traverso questa interfaccia a l'è stæta disattivâ pe di motivi ligæ a-e prestaçioin do scistema.",
+ "exportlistauthors": "Inciodi l'elenco completo di contributoî pe ogni paggina",
+ "export-submit": "Esporta",
+ "export-addcattext": "Azonzi pagine da-a categoria:",
+ "export-addcat": "Azonzi",
+ "export-addnstext": "Azonzi paggine da-o namespace:",
+ "export-addns": "Azonzi",
+ "export-download": "Sarva comme file",
+ "export-templates": "Inciodi i template",
+ "export-pagelinks": "Includdi paggine colegæ scin a 'na profonditæ de:",
+ "export-manual": "Azonzi paggine manoalmente:",
"allmessages": "Messaggi do scistemma",
"allmessagesname": "Nomme",
"allmessagesdefault": "Testo predefinio",
"allmessagescurrent": "Testo corrente",
- "allmessagestext": "Sta chie a l'è unn-a lista de messaggi do scistema in ta MediaWiki.",
+ "allmessagestext": "Sta chie a l'è a lista de tutti i messaggi de scistema disponibili into namespace MediaWiki.\nVixita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [https://translatewiki.net translatewiki.net] se ti voeu contribuî a-a localizzaçion generrica de MediaWiki.",
"allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' o non ti te peu vedde, perchè '''$wgUseDatabaseMessages''' o non l'è attivo.",
+ "allmessages-filter-legend": "Filtro",
+ "allmessages-filter": "Filtra pe stato de modiffica:",
+ "allmessages-filter-unmodified": "Non modificæ",
+ "allmessages-filter-all": "Tutti",
+ "allmessages-filter-modified": "Modificæ",
+ "allmessages-prefix": "Filtra pe prefisso:",
"allmessages-language": "Lengua:",
+ "allmessages-filter-submit": "Vanni",
+ "allmessages-filter-translate": "Traduxi",
"thumbnail-more": "Ciù grande",
"filemissing": "O file o no gh'è!",
"thumbnail_error": "Errô inta creassion da miniatûa: $1",
- "thumbnail_invalid_params": "Parametri da a imàginetta non validi",
+ "thumbnail_error_remote": "Messaggio de errô da $1:\n$2",
+ "djvu_page_error": "Nummero de paggina DjVu errou",
+ "djvu_no_xml": "Imposcibbile ötegnî l'XML pe-o file DjVu",
+ "thumbnail-temp-create": "Imposcibbile creâ o file temporannio de miniatue",
+ "thumbnail-dest-create": "Imposcibbile sarvâ a miniatua inta destinaçion",
+ "thumbnail_invalid_params": "Parammetri da miniatua non vallidi",
+ "thumbnail_toobigimagearea": "File con de dimenscioin maggioe de $1",
+ "thumbnail_dest_directory": "Imposcibbile creâ a directory de destinaçion",
+ "thumbnail_image-type": "Tipo de immagine non supportou",
+ "thumbnail_gd-library": "Configuaçion incompleta da libraia GD: fonçion $1 mancante",
+ "thumbnail_image-missing": "Pâ ch'amanche o file: $1",
+ "thumbnail_image-failure-limit": "Gh'è stæto troppi tentativi reçenti fallii ($1 ò ciù) de generâ questa miniatua. Riproeuva ciù tardi.",
+ "import": "Importa pagine",
+ "importinterwiki": "Importaçion da un atro wiki",
+ "import-interwiki-text": "Seleçion-a un progetto wiki e o titolo da paggina da importâ.\nE dæte de pubbricaçion e i nommi di aotoî de varrie verscioin saian conservæ.\nTutte i opiaçioin de importaçion da di atri wiki son registræ into [[Special:Log/import|registro de importaçion]].",
+ "import-interwiki-sourcewiki": "Wiki de origgine:",
+ "import-interwiki-sourcepage": "Paggina d'origgine:",
+ "import-interwiki-history": "Coppia l'intrega cronologia de questa paggina",
+ "import-interwiki-templates": "Inciodi tutti i template",
+ "import-interwiki-submit": "Importa",
+ "import-mapping-default": "Importa inte destinaçioin predefinie",
+ "import-mapping-namespace": "Importa inte 'n namespace:",
+ "import-mapping-subpage": "Importa comme sottopaggine da paggina seguente:",
+ "import-upload-filename": "Nomme do file:",
+ "import-comment": "Coménti:",
+ "importtext": "Se prega de esportâ o file da-o scito wiki de origgine co-a [[Special:Export|fonçion de esportaçion]], sarvâlo in sciô proppio disco e dapoeu caregâlo chie.",
+ "importstart": "Importaçion de paggine in corso...",
+ "import-revision-count": "$1 {{PLURAL:$1|revixon|revixoin}}",
+ "importnopages": "Nisciun-a paggina da importâ.",
+ "imported-log-entries": "Importou $1 {{PLURAL:$1|voxe}} de registro.",
+ "importfailed": "Importaçion no ariescia: <nowiki>$1</nowiki>",
+ "importunknownsource": "Tipo de sorgente d'importaçion sconosciuo",
+ "importcantopen": "Imposcibbile arvî o file d'importaçion.",
+ "importbadinterwiki": "Collegamento inter-wiki errou",
+ "importsuccess": "Importaçion ariescia.",
+ "importnosources": "No l'è stæto definio una wiki da chi importâ e i uploads diretti da cronologia no son attivi.",
+ "importnofile": "No l'è stæto caregou nisciun file pe l'importaçion.",
+ "importuploaderrorsize": "Caregamento do file pe l'importaçion fallio. O file o suppera e dimenscioin mascime consentie pe l'upload.",
+ "importuploaderrorpartial": "Caregamento do file pe l'importaçion fallio. O file o l'è stæto caregou solo in parte.",
+ "importuploaderrortemp": "Caregamento do file pe l'importaçion fallio. Manca 'na cartella tempoannia.",
+ "import-parse-failure": "Errô d'anallixi inte l'importaçion XML",
+ "import-noarticle": "Paggine da importâ no ghe n'è!",
+ "import-nonewrevisions": "Nisciun-a verscion importâ (ean zà tutte presente, ò satæ pe via di erroî)",
+ "xml-error-string": "$1 a-a riga $2, colonna $3 (byte $4): $5",
+ "import-upload": "Carrega dæti XML",
+ "import-token-mismatch": "I dæti relativi a-a sescion son anæti persci. Riproeuva.\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon collegou e riproeuva</strong>.\nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettuâ un nuoeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+ "import-invalid-interwiki": "Imposcibbile importâ da-o progetto wiki indicou.",
+ "import-error-edit": "A paggina \"$1\" a no l'è stæta importâ perché no t'ê aotorizzou a modificâla.",
+ "import-error-create": "A paggina \"$1\" a no l'è stæta importâ perché no t'ê aotorizzou a creâla.",
+ "import-error-interwiki": "A paggina \"$1\" a no l'è stæta importâ perché o so nomme o l'è riservou pe-o collegamento esterno (interwiki).",
+ "import-error-special": "A pagina \"$1\" a no l'è stæta importâ perché a l'apparten a un namespace speciale ch'o no permette de pagine.",
+ "import-error-invalid": "A paggina \"$1\" a no l'è stæta importâ perché o nomme a-o quæ a saiæ stæta importâ o no l'è vallido insce questo wiki.",
+ "import-error-unserialize": "A verscion $2 da paggina \"$1\" a no poeu ese de-serializzâ. A verscion a l'è stæta segnalâ pe doeuviâ o modello de contegnuo $3 serializzou comme $4.",
+ "import-error-bad-location": "A verscion $2 a l'adoeuvia un modello de contegnuo $3 ch'o no poeu ese memorizzou in \"$1\" de questo wiki, da-o momento che a paggina a no suporta questo modello.",
+ "import-options-wrong": "{{PLURAL:$2|Opçion sbaliâ|Opçioin sbaliæ}}: <nowiki>$1</nowiki>",
+ "import-rootpage-invalid": "A paggina prinçipâ fornia a no l'è un tittolo vallido.",
+ "import-rootpage-nosubpage": "O namespace \"$1\" da paggina prinçipâ o no permette d'avei de sottopagine.",
"importlogpage": "Importassioîn",
- "tooltip-pt-userpage": "A teu pagina utilizatô",
- "tooltip-pt-mytalk": "E mæ discûscioîn",
- "tooltip-pt-preferences": "E mæ preferense",
+ "importlogpagetext": "Importaçioin aministrative de paggine da di atre wiki complete de cronologia.",
+ "import-logentry-upload-detail": "{{PLURAL:$1|una verscion importâ|$1 verscioin importæ}}",
+ "import-logentry-interwiki-detail": "{{PLURAL:$1|una verscion importâ|$1 verscioin importæ}} da $2",
+ "javascripttest": "Sperimentaçion JavaScript",
+ "javascripttest-pagetext-unknownaction": "Açion sconosciua \"$1\".",
+ "javascripttest-qunit-intro": "Amia insce mediawiki.org a [$1 documentaçion riguardante i test].",
+ "tooltip-pt-userpage": "A {{GENDER:|to}} pagina utente",
+ "tooltip-pt-anonuserpage": "A paggina utente de questo adreçço IP che t'ê aproeuvo a modificâ comme",
+ "tooltip-pt-mytalk": "A {{GENDER:|to}} paggina de discuscion",
+ "tooltip-pt-anontalk": "Discuscioin insce e modiffiche fæte da questo adreçço IP",
+ "tooltip-pt-preferences": "E {{GENDER:|to}} preferençe",
"tooltip-pt-watchlist": "A lista de pagine che ti g'hæ sotta osservaçion",
- "tooltip-pt-mycontris": "E mæ contribuçioìn",
+ "tooltip-pt-mycontris": "A lista de {{GENDER:|to}} contribuçioin",
+ "tooltip-pt-anoncontribs": "Un elenco de modiffiche fæte da questo adreçço IP",
"tooltip-pt-login": "Consegemmo a registraçión, ma a no l'è obrigatoia.",
"tooltip-pt-logout": "Sciorti",
"tooltip-pt-createaccount": "Se conseggia de registrase e de intrâ, sciben che no segge obligatoio",
"tooltip-ca-edit": "Modiffica sta paggina.",
"tooltip-ca-addsection": "Inça 'na seçión nêuva",
"tooltip-ca-viewsource": "'Sta pagina a l'è protetta, ma ti peu védde o sêu còdice sorgente.",
- "tooltip-ca-history": "Verscioìn précedenti da pàgina",
+ "tooltip-ca-history": "Verscioìn precedente da pàgina",
"tooltip-ca-protect": "Protezi 'sta paggina",
+ "tooltip-ca-unprotect": "Càngia a proteçión de sta paggina",
"tooltip-ca-delete": "Scancella sta pàgina",
+ "tooltip-ca-undelete": "Ripristina a paggina com'a l'ea primma da scancelaçion",
"tooltip-ca-move": "Mescia 'sta paggina (cangia tittolo)",
"tooltip-ca-watch": "Azónzi 'sta pagina a-a teu lista d'oservaçion",
"tooltip-ca-unwatch": "Leva sta pàgina da sott'oservaçion.",
"tooltip-search": "Çerca {{SITENAME}}",
"tooltip-search-go": "Vànni inte 'na pàgina con sto tìtolo, s'a l'existe",
- "tooltip-search-fulltext": "Çerca sto testo in scie pàgine",
+ "tooltip-search-fulltext": "Çerca sto testo in sce e pàgine",
"tooltip-p-logo": "Vìxita a pàgina prinçipâ",
"tooltip-n-mainpage": "Vìxita a pagina prinçipâ",
"tooltip-n-mainpage-description": "Vìxita a pàgina prinçipâ",
"tooltip-n-help": "Pagine d'agiùtto",
"tooltip-t-whatlinkshere": "Lista de tùtte e pagine che son colegæ a sta chì.",
"tooltip-t-recentchangeslinked": "Ùrtimi càngi de pàgine colegæ a quésta",
+ "tooltip-feed-rss": "Feed RSS pe questa paggina",
"tooltip-feed-atom": "Feed Atom pe sta pàgina",
- "tooltip-t-contributions": "Lista de contribûssioîn de quest'utente",
- "tooltip-t-emailuser": "Invia 'n messaggio e-mail a quest'utente",
+ "tooltip-t-contributions": "Lista de contribûssioin de {{GENDER:$1|questo|questa}} utente",
+ "tooltip-t-emailuser": "Invia un messaggio email a {{GENDER:$1|questo|questa}} utente",
+ "tooltip-t-info": "Urteioî informaçioin insce questa pagina",
"tooltip-t-upload": "Carrega di file murtimediali",
"tooltip-t-specialpages": "Lista de tùtte e pagine speçiâli",
- "tooltip-t-print": "Versción da stànpa pe sta pàgina",
+ "tooltip-t-print": "Verscion stanpabbile de sta paggina",
"tooltip-t-permalink": "Colegaménto fisso a sta revixión da pàgina",
"tooltip-ca-nstab-main": "Véddi a vôxe",
"tooltip-ca-nstab-user": "Veddi a pàgina d'utente",
+ "tooltip-ca-nstab-media": "Veddi a paggina do file murtimediâ",
"tooltip-ca-nstab-special": "Sta chi l'è 'na pàgina speciâle e a no peu êse cangiâ",
"tooltip-ca-nstab-project": "Veddi a paggina de servissio",
"tooltip-ca-nstab-image": "Veddi a paggina do file",
+ "tooltip-ca-nstab-mediawiki": "Veddi o messaggio de scistema",
"tooltip-ca-nstab-template": "Veddi o template",
"tooltip-ca-nstab-help": "Veddi a paggina d'agiûtto",
"tooltip-ca-nstab-category": "Veddi a paggina da categorîa",
"tooltip-minoredit": "Marchilo comme cangiaménto minô",
"tooltip-save": "Sarva i cangiaménti",
+ "tooltip-publish": "Pubbrica e to modiffiche",
"tooltip-preview": "Anteprimma de modiffiche (fannila, primma de sarvâ!)",
"tooltip-diff": "Ammîa e modiffiche che t'æ fæto a-o testo.",
"tooltip-compareselectedversions": "Amia e diferense tra e doê verscioìn seleçionæ de sta paggina chì.",
- "tooltip-watch": "Azónzi sta pàgina a-a têu lista d'osservæ speçiâli",
+ "tooltip-watch": "Azónzi sta pàgina a-a têu lista di öservæ speçiâli",
+ "tooltip-watchlistedit-normal-submit": "Leva i tittoli",
+ "tooltip-watchlistedit-raw-submit": "Aggiorna a lista di öservæ speciali",
+ "tooltip-recreate": "Ricrea a pagina sciben ch'a segge stæta scassâ",
+ "tooltip-upload": "Comença o caregamento",
"tooltip-rollback": "\"Rollback\" annulla e modiffiche a sta pagina de l'urtimo contributô co-in solo clic.",
"tooltip-undo": "\"Anùlla\" o permette de anulâ sto cangiaménto e o l'arve o modulo de cangiaménto inta modalitæ anteprìmma. Ti peu ascì métte a raxón inte l'ogetto do cangiaménto.",
+ "tooltip-preferences-save": "Sarva e preferençe",
"tooltip-summary": "Scrîvi 'na scintexi",
"common.css": "/** i stili css scriti chie se applicana tutte e skin */",
- "anonymous": "Utente anonimmo de {{SITENAME}}",
+ "anonymous": "{{PLURAL:$1|Utente anonnimo|Utenti anonnimi}} de {{SITENAME}}",
+ "siteuser": "$1, utente de {{SITENAME}}",
+ "anonuser": "$1, utente anonnimo de {{SITENAME}}",
"lastmodifiedatby": "Sta pagina a l'è stæta cangiâ l'urtima votta a e $2 do $1 da $3.",
+ "othercontribs": "O testo attoale o l'è basou in sciô travaggio de $1.",
+ "others": "atri",
+ "siteusers": "$1, {{PLURAL:$2|{{GENDER:$1|utente}}|utenti}} de {{SITENAME}}",
+ "anonusers": "$1, {{PLURAL:$2|utente anonnimo|utenti anonnimi}} de {{SITENAME}}",
+ "creditspage": "Aotoî da paggina",
+ "nocredits": "Nisciun-a informaçion in scî aotoî disponibbile pe questa paggina.",
+ "spamprotectiontitle": "Filtro anti-spam",
+ "spamprotectiontext": "A pagina che s'è tentou dr sarvâ a l'è stæta bloccâ da-o filtro anti-spam. Questo l'è probabilmente dovuo a-a presença de 'n collegamento a 'n scito esterno presente inta blacklist.",
+ "spamprotectionmatch": "O filtro anti-spam o l'è stæto attivou da-o seguente scrito: $1",
+ "spambot_username": "MediaWiki - scistema de netezzo do spam",
+ "spam_reverting": "Ripristinata l'urtima verscion priva de collegamenti a $1",
+ "spam_blanking": "Paggina svuâ, tutte e verscioin contegnivan di collegamenti a $1",
+ "spam_deleting": "Paggina scassâ, tutte e verscioin contegnivan di collegamenti a $1",
"simpleantispam-label": "Controllo anti-spam.\n<strong>NO</strong> impîlo!",
+ "pageinfo-title": "Informaçioin pe \"$1\"",
+ "pageinfo-not-current": "Spiaxente, ma l'è imposcibbile fornî quest'informaçion pe de vege verscioin.",
+ "pageinfo-header-basic": "Informaçion de base",
+ "pageinfo-header-edits": "Cronologia de modiffiche",
+ "pageinfo-header-restrictions": "Proteçion da paggina",
+ "pageinfo-header-properties": "Propietæ da paggina",
+ "pageinfo-display-title": "Tittolo vixualizzou",
+ "pageinfo-default-sort": "Criteio d'ordenamento predefinio",
+ "pageinfo-length": "Longheçça da paggina (in byte)",
+ "pageinfo-article-id": "ID da paggina",
"pageinfo-language": "Lengua do contegnuo da paggina",
+ "pageinfo-content-model": "Modello do contegnuo da paggina",
+ "pageinfo-robot-policy": "Indiçizzaçion pe-i robot",
+ "pageinfo-robot-index": "Consentio",
+ "pageinfo-robot-noindex": "Non consentio",
+ "pageinfo-watchers": "Nummero di utenti che g'han a paggina in öservaçion",
+ "pageinfo-visiting-watchers": "Nummero di öservatoî da paggina ch'han vixitou e modiffiche reçente",
+ "pageinfo-few-watchers": "Meno de $1 {{PLURAL:$1|öservatô|öservatoî}}",
+ "pageinfo-few-visiting-watchers": "Ghe poriæ ese ò meno di öservatoî ch'han vixitou e modiffiche reçente",
+ "pageinfo-redirects-name": "Nummero de redirect a questa paggina",
+ "pageinfo-subpages-name": "Sottopaggine de questa paggina",
+ "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect}}; $3 {{PLURAL:$3|non redirect}})",
+ "pageinfo-firstuser": "Creatô da paggina",
+ "pageinfo-firsttime": "Dæta de creaçion da paggina",
+ "pageinfo-lastuser": "Urtimo contributô",
+ "pageinfo-lasttime": "Dæta de l'urtima modiffica",
+ "pageinfo-edits": "Nummero totale de modiffiche",
+ "pageinfo-authors": "Nummero totale di aotoî distinti",
+ "pageinfo-recent-edits": "Nummero de modiffiche reçente (inti urtimi $1)",
+ "pageinfo-recent-authors": "Nummero di aotoî distinti reçenti",
+ "pageinfo-magic-words": "{{PLURAL:$1|Paola maggica|Paole maggiche}} ($1)",
+ "pageinfo-hidden-categories": "{{PLURAL:$1|Categoria ascosa|Categorie ascose}} ($1)",
+ "pageinfo-templates": "Template {{PLURAL:$1|incluso|incluxi}} ($1)",
+ "pageinfo-transclusions": "{{PLURAL:$1|Paggina inta|Paggine inte}} quæ l'è incluso ($1)",
"pageinfo-toolboxlink": "Informassioin in sciâ paggina",
+ "pageinfo-redirectsto": "Rendiriçça a",
+ "pageinfo-redirectsto-info": "info",
+ "pageinfo-contentpage": "Contezâ comme una paggina de contegnuo",
"pageinfo-contentpage-yes": "Sci",
+ "pageinfo-protect-cascading": "Proteçioin ricorscive da chie",
"pageinfo-protect-cascading-yes": "Sci",
+ "pageinfo-protect-cascading-from": "Proteçioin ricorscive ereditæ da",
+ "pageinfo-category-info": "Informaçion in sciâ categoria",
+ "pageinfo-category-total": "Nummero totale di membri",
+ "pageinfo-category-pages": "Nummero de paggine",
+ "pageinfo-category-subcats": "Nummio de sottacategorie",
+ "pageinfo-category-files": "Nummero di file",
+ "markaspatrolleddiff": "Marca comme controlâ",
+ "markaspatrolledtext": "Marca sta paggina comme controlâ",
+ "markaspatrolledtext-file": "Marca a verscion de sto file comme controlâ",
+ "markedaspatrolled": "Marcâ comme controlâ",
+ "markedaspatrolledtext": "A modiffica de [[:$1]] seleçionâ a l'è stæta marcâ comme veificâ.",
+ "rcpatroldisabled": "A verifica di urtime modiffiche a l'è disattivâ",
+ "rcpatroldisabledtext": "A fonçion de controllo di urtime cangiamenti pe-o momento a no l'è attiva.",
+ "markedaspatrollederror": "Imposcibbile marcâ a voxe comme controlâ",
+ "markedaspatrollederrortext": "Ocore specificâ una revixon da marcâ comme controlâ.",
+ "markedaspatrollederror-noautopatrol": "No ti poeu marcâ e toeu modiffiche comme controllæ.",
+ "markedaspatrollednotify": "A modifica a $1 a l'è stæta contrassegnâ comme veificâ.",
+ "markedaspatrollederrornotify": "Errô durante a veifica.",
+ "patrol-log-page": "Modiffiche controlæ",
+ "patrol-log-header": "Questo o l'è 'n registro de revixoin controlæ.",
+ "log-show-hide-patrol": "$1 registro di controlli",
+ "log-show-hide-tag": "$1 registro di etichette",
+ "deletedrevision": "Scassou a vegia verscion de $1.",
+ "filedeleteerror-short": "Errô inta scassatua do file: $1",
+ "filedeleteerror-long": "Gh'è stæto di erroî into tentativo de scassâ o file:\n\n$1",
+ "filedelete-missing": "Imposcibbile scassâ o file \"$1\" perchè o no l'existe.",
+ "filedelete-old-unregistered": "A verscion do file indicâ, \"$1\", a no l'è contegnua into database.",
+ "filedelete-current-unregistered": "O file specificou, \"$1\", o no l'è contegnuo into database.",
+ "filedelete-archive-read-only": "O server web o no l'è in graddo de scrive inta directory d'archivvio ($1).",
"previousdiff": "← Diferensa precedénte",
"nextdiff": "Pròscima diferensa →",
- "thumbsize": "Dimescion da a imàginetta:",
+ "mediawarning": "'''Attençione''': Questo file o poriæ contegnî un codiçe maligno. A so esecuçion a poriæ dannezzâ o to scistema.",
+ "imagemaxsize": "Dimenscion mascima de ibmaggine:<br />''(pe-e paggine de descriçion do file)''",
+ "thumbsize": "Dimescion de l'imaginetta:",
+ "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|paggina|paggine}}",
+ "file-info": "dimenscion do file: $1, tipo MIME: $2",
"file-info-size": "$1 × $2 pixel, dimenscioîn: $3, tippo MIME: $4",
- "file-nohires": "No ghe son verscioìn a rezoluçion ciù âta.",
+ "file-info-size-pages": "$1 × $2 pixel, dimenscion do file: $3, tipo MIME: $4, $5 {{PLURAL:$5|paggina|paggine}}",
+ "file-nohires": "Verscioìn co-a resoluçion ciù âta no ghe n'è.",
"svg-long-desc": "file in formato SVG, dimenscioìn nominâli $1 × $2 pixel, dimenscioin do file: $3",
+ "svg-long-desc-animated": "file in formato SVG animou, dimenscion nominale $1 × $2 pixel, dimenscion do file: $3",
+ "svg-long-error": "File SVG non vallido: $1",
"show-big-image": "File originâ",
"show-big-image-preview": "Dimenscioin de questa anteprimma: $1.",
+ "show-big-image-preview-differ": "Dimension de questa anteprimma $3 pe questo file $2: $1.",
"show-big-image-other": "{{PLURAL:$2|Atra risolussion|Atre risolussioin}}: $1.",
"show-big-image-size": "$1 × $2 pixel",
- "newimages": "Gallerîa de nêuvi archivvi",
+ "file-info-gif-looped": "cicclico",
+ "file-info-gif-frames": "$1 {{PLURAL:$1|frame}}",
+ "file-info-png-looped": "cicclico",
+ "file-info-png-repeat": "ripetuo $1 {{PLURAL:$1|votta|votte}}",
+ "file-info-png-frames": "$1 {{PLURAL:$1|frame}}",
+ "file-no-thumb-animation": "'''Notta: pe de limitaçioin tecniche, e miniatue de questo file no saian animæ.'''",
+ "file-no-thumb-animation-gif": "'''Notta: pe de limitaçioin tecniche, e miniatue de immaggine GIF a ata risoluçion comme questa no saian animæ.'''",
+ "newimages": "Galleria di nêuvi file",
+ "imagelisttext": "A lista presentâ chì de sotta, costituia da {{PLURAL:$1|un file|'''$1''' file}}, a l'è amerçâ $2.",
+ "newimages-summary": "Questa pagina speciale a mostra i urtimi file caregæ.",
+ "newimages-legend": "Filtro",
+ "newimages-label": "Nomme do file (o una parte de questo):",
+ "newimages-showbots": "Mostra i caregamenti fæti dai bot",
+ "newimages-hidepatrolled": "Ascondi i caregamenti controlæ",
+ "noimages": "No gh'è ninte da vedde.",
"ilsubmit": "Çerca",
"bydate": "pe dâta",
+ "sp-newimages-showfrom": "Mostra i file ciù reçenti a partî da-e oe $2 do $1",
+ "seconds": "{{PLURAL:$1|un segondo|$1 segondi}}",
+ "minutes": "{{PLURAL:$1|un menuto|$1 menuti}}",
+ "hours": "{{PLURAL:$1|un'oa|$1 oe}}",
+ "days": "{{PLURAL:$1|$1 giorno|$1 giorni}}",
+ "weeks": "{{PLURAL:$1|$1 setteman-a|$1 setteman-e}}",
+ "months": "{{PLURAL:$1|$1 meise|$1 meixi}}",
+ "years": "{{PLURAL:$1|$1 anno|$1 anni}}",
+ "ago": "$1 fa",
+ "just-now": "proppio oua",
+ "hours-ago": "$1 {{PLURAL:$1|oa|oe}} fa",
+ "minutes-ago": "$1 {{PLURAL:$1|menuto|menuti}} fa",
+ "seconds-ago": "$1 {{PLURAL:$1|segondo|segondi}} fa",
"monday-at": "Lunesdì a $1",
"tuesday-at": "Matesdì a $1",
"wednesday-at": "Mâcordì a $1",
"metadata-expand": "Fâ vedde dettaggi",
"metadata-collapse": "Asconde dettaggi",
"metadata-fields": "I cànpi relativi a-i metadæti EXIF elencæ inte 'sto messaggio saiàn in sciâ pàgina de l'inmàgine quande a tabella di metadæti a saiâ inta forma cùrta. Cómme predefinîo, i âtri cànpi saiàn ascoxi.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+ "exif-imagewidth": "Largheçça",
+ "exif-imagelength": "Ateçça",
+ "exif-bitspersample": "Bit pe campion",
+ "exif-compression": "Meccanismo de comprescion",
+ "exif-photometricinterpretation": "Struttua di pixel",
"exif-orientation": "Orientamento",
+ "exif-samplesperpixel": "Nummero di componenti",
+ "exif-planarconfiguration": "Dispoxiçion di dæti",
+ "exif-ycbcrsubsampling": "Rapporto de campionamento Y / C",
+ "exif-ycbcrpositioning": "Poxiçionamento di componenti Y e C",
"exif-xresolution": "Risoluçion orizzontâ",
"exif-yresolution": "Risoluçion verticâ",
+ "exif-stripoffsets": "Poxiçion di dæti de l'inmaggine",
+ "exif-rowsperstrip": "Nummero righe pe striscia",
+ "exif-stripbytecounts": "Nummero di byte pe striscia compressa",
+ "exif-jpeginterchangeformat": "Poxiçion byte SOI JPEG",
+ "exif-jpeginterchangeformatlength": "Nummero di byte di dæti JPEG",
+ "exif-whitepoint": "Coordinæ cromattiche do ponto de gianco",
+ "exif-primarychromaticities": "Coordinæ cromattiche di coî primai",
+ "exif-ycbcrcoefficients": "Coeffixenti de matrixe de transformaçion di spaççi de cô",
+ "exif-referenceblackwhite": "Cobbia di valoî de rifeimento (neigro e gianco)",
"exif-datetime": "Dæta e öa da modiffica do file",
+ "exif-imagedescription": "Tittolo de l'inmaggine",
"exif-make": "Produttô fotocamera",
"exif-model": "Modello fotocamera",
"exif-software": "Software",
"exif-artist": "Autô",
"exif-copyright": "Diritti d'autô de",
"exif-exifversion": "Verscion do formato Exif",
+ "exif-flashpixversion": "Verscion Flashpix supportâ",
"exif-colorspace": "Spassio di coî",
+ "exif-componentsconfiguration": "Scignificou de ogni componente",
+ "exif-compressedbitsperpixel": "Modalitæ de comprescion immaggine",
+ "exif-pixelxdimension": "Largheçça immaggine",
+ "exif-pixelydimension": "Ateçça immaggine",
+ "exif-usercomment": "Notte de l'utente",
+ "exif-relatedsoundfile": "File audio collegou",
"exif-datetimeoriginal": "Dæta e oa de creassion di dæti",
"exif-datetimedigitized": "Dæta e oa de digitalizzaçion",
+ "exif-subsectime": "Dæta e oa, fraçioin de segondo",
+ "exif-subsectimeoriginal": "Dæta e oa de creaçion, fraçioin de segondo",
+ "exif-subsectimedigitized": "Dæta e oa de digitalizzaçion, fraçioin dr segondo",
+ "exif-exposuretime": "Tempo de espoxiçion",
+ "exif-exposuretime-format": "$1 s ($2)",
+ "exif-fnumber": "Rapporto focâ",
+ "exif-exposureprogram": "Programma de espoxiçion",
+ "exif-spectralsensitivity": "Senscibilitæ spettrâ",
+ "exif-isospeedratings": "Senscibilitæ ISO",
+ "exif-shutterspeedvalue": "Veloçitæ de l'otturatô APEX",
+ "exif-aperturevalue": "Avertua APEX",
+ "exif-brightnessvalue": "Luminoxitæ APEX",
+ "exif-exposurebiasvalue": "Correçion espoxiçion",
+ "exif-maxaperturevalue": "Avertua mascima",
+ "exif-subjectdistance": "Distança do soggetto",
+ "exif-meteringmode": "Mettodo de mesuaçion",
+ "exif-lightsource": "Sorgente luminosa",
+ "exif-flash": "Caratteristeghe e stæto do flash",
+ "exif-focallength": "Distança focâ de l'obiettivo",
+ "exif-subjectarea": "Area inquadrante o soggetto",
+ "exif-flashenergy": "Potença do flash",
+ "exif-focalplanexresolution": "Risoluçion X in sciô cian focâ",
+ "exif-focalplaneyresolution": "Risoluçion Y in sciô cian focâ",
+ "exif-focalplaneresolutionunit": "Unitæ de mesua risoluçion in sciô cian focâ",
+ "exif-subjectlocation": "Poxiçion do soggetto",
+ "exif-exposureindex": "Senscibilitæ impostâ",
+ "exif-sensingmethod": "Mettodo de rilevaçion",
"exif-filesource": "Origgine do file",
+ "exif-scenetype": "Tipo de inquadratua",
+ "exif-customrendered": "Elaboaçion personalizzâ",
+ "exif-exposuremode": "Modalitæ d'espoxiçion",
+ "exif-whitebalance": "Bançamento do gianco",
+ "exif-digitalzoomratio": "Rapporto zoom digitale",
+ "exif-focallengthin35mmfilm": "Longheçça focâ sciu peliccola 35 mm",
+ "exif-scenecapturetype": "Tipo de aquixiçion da scena",
+ "exif-gaincontrol": "Controllo inquadratua",
+ "exif-contrast": "Controllo contrasto",
+ "exif-saturation": "Controllo saturaçion",
+ "exif-sharpness": "Controllo nitideçça",
+ "exif-devicesettingdescription": "Descriçion de impostaçioin do dispoxitivo",
+ "exif-subjectdistancerange": "Scaa distança soggetto",
+ "exif-imageuniqueid": "ID univvoco immaggine",
+ "exif-gpsversionid": "Verscion di tag GPS",
+ "exif-gpslatituderef": "Latituddine nord/sud",
+ "exif-gpslatitude": "Latituddine",
+ "exif-gpslongituderef": "Lonxituddine est/ovest",
+ "exif-gpslongitude": "Lonxituddine",
+ "exif-gpsaltituderef": "Rifeimento pe l'ærtituddine",
+ "exif-gpsaltitude": "Ærtituddine",
+ "exif-gpstimestamp": "Oa GPS (reloeuio atommico)",
+ "exif-gpssatellites": "Satelliti doeuviæ pe-a mesuaçion",
+ "exif-gpsstatus": "Stato do riçevitô",
+ "exif-gpsmeasuremode": "Modalitæ de mesuaçion",
+ "exif-gpsdop": "Precixone da mezuaçion",
+ "exif-gpsspeedref": "Unitæ de mesua da veloçitæ",
+ "exif-gpsspeed": "Veloçitæ do riçevitô GPS",
+ "exif-gpstrackref": "Rifeimento pe-a direçion de movimento",
+ "exif-gpstrack": "Direçion do movimento",
+ "exif-gpsimgdirectionref": "Rifeimento pe-a direçion de l'immaggine",
+ "exif-gpsimgdirection": "Direçion de l'immaggine",
+ "exif-gpsmapdatum": "Rilevamento geodetico doeuviou",
+ "exif-gpsdestlatituderef": "Rifeimento pe-a latituddine da destinaçion",
+ "exif-gpsdestlatitude": "Latituddine da destinaçion",
+ "exif-gpsdestlongituderef": "Rifeimento pe-a lonxituddine da destinaçion",
+ "exif-gpsdestlongitude": "Lonxituddine da destinaçion",
+ "exif-gpsdestbearingref": "Rifeimento pe-a direçion da destinaçion",
+ "exif-gpsdestbearing": "Direçion da destinaçion",
+ "exif-gpsdestdistanceref": "Rifeimento pe-a distança da destinaçion",
+ "exif-gpsdestdistance": "Distança da destinaçion",
+ "exif-gpsprocessingmethod": "Nomme do mettodo de elaboaçion GPS",
+ "exif-gpsareainformation": "Nomme da zona GPS",
+ "exif-gpsdatestamp": "Data GPS",
+ "exif-gpsdifferential": "Correçion differençiâ GPS",
+ "exif-jpegfilecomment": "Commento do file JPEG",
+ "exif-keywords": "Paole ciave",
+ "exif-worldregioncreated": "Region do mondo donde l'è stæto scattou l'immaggine",
+ "exif-countrycreated": "Paise dovve l'è stæto scattou a foto",
+ "exif-countrycodecreated": "Codiçe do paise dovve l'è stæto scattou a foto",
+ "exif-provinceorstatecreated": "Provincia o stato dovve l'è stæto scattou a foto",
+ "exif-citycreated": "Çittæ dovve l'è stæto scattou a foto",
+ "exif-sublocationcreated": "Parte da çittæ donde l'è stæto scattou a foto",
+ "exif-worldregiondest": "Region do mondo vixualizzâ",
+ "exif-countrydest": "Naçion vixualizzâ",
+ "exif-countrycodedest": "Codiçe pe-o paise indicou",
+ "exif-provinceorstatedest": "Provincia o stato vixualizzou",
+ "exif-citydest": "Çittæ mostrâ",
+ "exif-sublocationdest": "Parte da çittæ visualizzâ",
+ "exif-objectname": "Tittolo curto",
+ "exif-specialinstructions": "Instruçioin speciale",
+ "exif-headline": "Tittolo",
+ "exif-credit": "Credditi",
+ "exif-source": "Fonte",
+ "exif-editstatus": "Stato d'ediçion de l'inmaggine",
+ "exif-urgency": "Urgença",
+ "exif-fixtureidentifier": "Nomme do rifeimento",
+ "exif-locationdest": "Localitæ raffiguâ",
+ "exif-locationdestcode": "Coddiçe do loeugo raffiguou",
+ "exif-objectcycle": "Parte do giorno a-o quæ o medium o l'è destinou",
+ "exif-contact": "Contatti",
+ "exif-writer": "Chi l'ha scrito",
"exif-languagecode": "Lengua",
+ "exif-iimversion": "Verscion IIM",
+ "exif-iimcategory": "Categoria",
+ "exif-iimsupplementalcategory": "Categorie azontive",
+ "exif-datetimeexpires": "No doeuviâ doppo",
+ "exif-datetimereleased": "Pubricou o",
+ "exif-originaltransmissionref": "Coddiçe do loeugo de transmiscion originaia",
+ "exif-identifier": "Identificatô",
+ "exif-lens": "Obiettivo doeuviou",
+ "exif-serialnumber": "Nummero de serrie da fotocammia",
+ "exif-cameraownername": "Proprietaio da macchina fotograffica",
+ "exif-label": "Etichetta",
+ "exif-datetimemetadata": "Dæta inta quæ i metadata son stæti modificæ l'urtima votta",
+ "exif-nickname": "Nomme informale de l'immaggine",
+ "exif-rating": "Valutaçion (su 5)",
+ "exif-rightscertificate": "Çertificou de gestion di driti",
+ "exif-copyrighted": "Informaçioin in scî driti d'aotô:",
+ "exif-copyrightowner": "Detentô di driti d'aotô",
+ "exif-usageterms": "Termi d'utilizzo",
+ "exif-webstatement": "Deciaraçion online do copyright",
+ "exif-originaldocumentid": "ID univvoco do documento origin*a",
+ "exif-licenseurl": "URL pe-a liçença do copyright",
+ "exif-morepermissionsurl": "Informaçioin insce e liçençe alternative",
+ "exif-attributionurl": "Se quest'oeuvia ti l'adoeuvi torna, pe piaxei coleghite a",
+ "exif-preferredattributionname": "Se quest'oeuvia ti l'adoeuvi torna, pe piaxei attribuiscine a paternitæ a",
+ "exif-pngfilecomment": "Commento do file JPEG",
+ "exif-disclaimer": "Avertençe",
+ "exif-contentwarning": "Avviso in sciô contegnuo",
+ "exif-giffilecomment": "Commento do file GIF",
+ "exif-intellectualgenre": "Tipo d'elemento",
+ "exif-subjectnewscode": "Coddiçe de l'ögetto",
+ "exif-scenecode": "Coddiçe de scena IPTC",
+ "exif-event": "Evento raffiguou",
+ "exif-organisationinimage": "Organizzaçion raffiguâ",
+ "exif-personinimage": "Person-a raffiguâ",
+ "exif-originalimageheight": "Ateçça de l'inmaggine primma ch'a foise retagiâ",
+ "exif-originalimagewidth": "Largheçça de l'immaggine primma ch'a foise retagiâ",
+ "exif-compression-1": "Nisciun",
+ "exif-compression-2": "CCITT gruppo 3 monodimenscionâ - codifica run length di Huffman modificâ",
+ "exif-compression-3": "Codiffica fax CCITT Group 3",
+ "exif-compression-4": "Codiffica fax CCITT groppo 4",
+ "exif-copyrighted-true": "Protezuo da-o drito d'aotô",
+ "exif-copyrighted-false": "Stato do drito d'aotô non impostou",
+ "exif-photometricinterpretation-1": "Gianco e neigro (o neigro o l'è 0)",
+ "exif-unknowndate": "Dæta sconosciua",
"exif-orientation-1": "Normale",
+ "exif-orientation-2": "Imbösòu orizontalmente",
+ "exif-orientation-3": "Curlou de 180°",
+ "exif-orientation-4": "Imbösòu verticalmente",
+ "exif-orientation-5": "Curlou 90° in senso antiorario e imbösòu verticalmente",
+ "exif-orientation-6": "Curlou di 90° in senso antioraio",
+ "exif-orientation-7": "Curlou 90° in senso oraio e imbosou verticalmente",
+ "exif-orientation-8": "Curlou di 90° in senso oraio",
+ "exif-planarconfiguration-1": "formato a tocchi",
+ "exif-planarconfiguration-2": "formato planare",
+ "exif-colorspace-65535": "Non calibrou",
+ "exif-componentsconfiguration-0": "assente",
+ "exif-exposureprogram-0": "Non definio",
+ "exif-exposureprogram-1": "Manoale",
+ "exif-exposureprogram-2": "Programma normale",
+ "exif-exposureprogram-3": "Prioritæ a-o diaframma",
+ "exif-exposureprogram-4": "Prioritæ a l'espoxiçion",
+ "exif-exposureprogram-5": "Artistego (orientou a-a profonditæ de campo)",
+ "exif-exposureprogram-6": "Sportivo (orientou a-a veloçitæ de ripreisa)",
+ "exif-exposureprogram-7": "Ritræto (soggetti vexin con sfondo sfocou)",
+ "exif-exposureprogram-8": "Panoramma (soggetti lonten con sfondo a foeugo)",
+ "exif-subjectdistance-value": "$1 metri",
+ "exif-meteringmode-0": "Sconosciuo",
+ "exif-meteringmode-1": "Meddia",
+ "exif-meteringmode-2": "Meddia pesâ into centro",
+ "exif-meteringmode-3": "Spot",
+ "exif-meteringmode-4": "Murti-Spot",
+ "exif-meteringmode-5": "Pattern",
+ "exif-meteringmode-6": "Parçiâ",
+ "exif-meteringmode-255": "Atro",
+ "exif-lightsource-0": "Sconosciua",
+ "exif-lightsource-1": "Luxe diurna",
+ "exif-lightsource-2": "Lampa a fluorescença",
+ "exif-lightsource-3": "Lampa a-o tungsteno (a incandescença)",
+ "exif-lightsource-4": "Flash",
+ "exif-lightsource-9": "Tempo bello",
+ "exif-lightsource-10": "Nuvio",
+ "exif-lightsource-11": "Ombra",
+ "exif-lightsource-12": "Diurno fluorescente (D 5700 - 7100K)",
+ "exif-lightsource-13": "Giorno gianco fluorescente (N 4600 - 5400K)",
+ "exif-lightsource-14": "Gianco freido fluorescente (W 3900 - 4500K)",
+ "exif-lightsource-15": "Gianco fluorescente (WW 3200 - 3700K)",
+ "exif-lightsource-17": "Luxe standard A",
+ "exif-lightsource-18": "Luxe standard B",
+ "exif-lightsource-19": "Luxe standard C",
+ "exif-lightsource-24": "Lampa da studdio ISO a-o tungsten",
+ "exif-lightsource-255": "Atra sorgente luminosa",
+ "exif-flash-fired-0": "O flash o no l'è scattou",
+ "exif-flash-fired-1": "O flash o l'è scattou",
+ "exif-flash-return-0": "nisciun-a fonçion de individuaçion do ritorno da luxe stroboscoppica",
+ "exif-flash-return-2": "luxe stroboscoppica de ritorno non individoâ",
+ "exif-flash-return-3": "luxe stroboscoppica de ritorno individoâ",
+ "exif-flash-mode-1": "attivaçion forçâ do flash",
+ "exif-flash-mode-2": "rimoçion forçâ do flash",
+ "exif-flash-mode-3": "modalitæ aotomattica",
+ "exif-flash-function-1": "Disattiva o flash",
+ "exif-flash-redeye-1": "modalitæ riduçion oeuggi rosci",
+ "exif-focalplaneresolutionunit-2": "polliçi",
+ "exif-sensingmethod-1": "Non definio",
+ "exif-sensingmethod-2": "Sensô area cô a 1 chip",
+ "exif-sensingmethod-3": "Sensô area cô a 2 chip",
+ "exif-sensingmethod-4": "Sensô area colô a 3 chip",
+ "exif-sensingmethod-5": "Sensô area cô sequençiale",
+ "exif-sensingmethod-7": "Sensô triliniare",
+ "exif-sensingmethod-8": "Sensô liniare de cô sequençiale",
+ "exif-filesource-3": "Fotocammia digitâ",
+ "exif-scenetype-1": "Fotografia diretta",
+ "exif-customrendered-0": "Processo normale",
+ "exif-customrendered-1": "Processo personalizzou",
+ "exif-exposuremode-0": "Espoxiçion aotomattica",
+ "exif-exposuremode-1": "Espoxiçion manoâ",
+ "exif-exposuremode-2": "Bracketing aotomattico",
+ "exif-whitebalance-0": "Bançamento do gianco aotomattico",
+ "exif-whitebalance-1": "Bançamento do gianco manoâ",
+ "exif-scenecapturetype-0": "Standard",
+ "exif-scenecapturetype-1": "Panorama",
+ "exif-scenecapturetype-2": "Ritræto",
+ "exif-scenecapturetype-3": "Notturna",
+ "exif-gaincontrol-0": "Nisciun",
+ "exif-gaincontrol-1": "Enfaxi pe basso guaagno",
+ "exif-gaincontrol-2": "Enfaxi pe ato guaagno",
+ "exif-gaincontrol-3": "Deenfaxi pe basso guaagno",
+ "exif-gaincontrol-4": "Deenfaxi pe ato guaagno",
+ "exif-contrast-0": "Normale",
+ "exif-contrast-1": "Ato contrasto",
+ "exif-contrast-2": "Basso contrasto",
+ "exif-saturation-0": "Normale",
+ "exif-saturation-1": "Bassa saturaçion",
+ "exif-saturation-2": "Ata saturaçion",
+ "exif-sharpness-0": "Normale",
+ "exif-sharpness-1": "Minô nitideçça",
+ "exif-sharpness-2": "Maggiô nitideçça",
+ "exif-subjectdistancerange-0": "Sconosciua",
+ "exif-subjectdistancerange-1": "Macro",
+ "exif-subjectdistancerange-2": "Soggetto vexin",
+ "exif-subjectdistancerange-3": "Soggetto lontan",
+ "exif-gpslatitude-n": "Latituddine nord",
+ "exif-gpslatitude-s": "Latituddine sud",
+ "exif-gpslongitude-e": "Lonxituddine est",
+ "exif-gpslongitude-w": "Lonxituddine ovest",
+ "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|metro|metri}} in sciô livello do mâ",
+ "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|metro|metri}} sotta o livello do mâ",
+ "exif-gpsstatus-a": "Mezuaçion in corso",
+ "exif-gpsstatus-v": "Mesuaçion interopiabile",
+ "exif-gpsmeasuremode-2": "Mesuaçion bidimenscionâ",
+ "exif-gpsmeasuremode-3": "Mesuaçion tridimenscionâ",
+ "exif-gpsspeed-k": "Chilommetri orai",
+ "exif-gpsspeed-m": "Miggia oraie",
+ "exif-gpsspeed-n": "Noeui",
+ "exif-gpsdestdistance-k": "Chilommetri",
+ "exif-gpsdestdistance-m": "Miggia",
+ "exif-gpsdestdistance-n": "Miggia naotiche",
+ "exif-gpsdop-excellent": "Eccelente ($1)",
+ "exif-gpsdop-good": "Bon ($1)",
+ "exif-gpsdop-moderate": "Moderâ ($1)",
+ "exif-gpsdop-fair": "Discreto ($1)",
+ "exif-gpsdop-poor": "Scarso ($1)",
+ "exif-objectcycle-a": "Solo a-a mattin",
+ "exif-objectcycle-p": "Solo a-a seia",
+ "exif-objectcycle-b": "Mattin e seia",
+ "exif-gpsdirection-t": "Direçion reale",
+ "exif-gpsdirection-m": "Direçion magnettica",
+ "exif-ycbcrpositioning-1": "Centrou",
+ "exif-ycbcrpositioning-2": "Co-scituou",
+ "exif-dc-contributor": "contributoî",
+ "exif-dc-coverage": "Ambito spaçiâ o tempoâ di meddia",
+ "exif-dc-date": "Dæta (e)",
+ "exif-dc-publisher": "Editô",
+ "exif-dc-relation": "File correlæ",
+ "exif-dc-rights": "Driti",
+ "exif-dc-source": "Fonte do file",
+ "exif-dc-type": "Tipologia do file",
+ "exif-rating-rejected": "Refuou",
+ "exif-isospeedratings-overflow": "Maggiô de 65535",
+ "exif-iimcategory-ace": "Arte, coltua e spetaccolo",
+ "exif-iimcategory-clj": "Crimmine e lezze",
+ "exif-iimcategory-dis": "Disastri e açidenti",
+ "exif-iimcategory-fin": "Economia e affæ",
+ "exif-iimcategory-edu": "Instruçion",
+ "exif-iimcategory-evn": "Ambiente",
+ "exif-iimcategory-hth": "Salute",
+ "exif-iimcategory-hum": "Interesse uman",
+ "exif-iimcategory-lab": "Travaggio",
+ "exif-iimcategory-lif": "Stile di vitta e tempo libbero",
+ "exif-iimcategory-pol": "Polittica",
+ "exif-iimcategory-rel": "Religion e fe'",
+ "exif-iimcategory-sci": "Sciença e tecnologia",
+ "exif-iimcategory-soi": "Questioin sociale",
+ "exif-iimcategory-spo": "Sport",
+ "exif-iimcategory-war": "Guæra, confliti e disordini",
+ "exif-iimcategory-wea": "Meteo",
+ "exif-urgency-normal": "Normale ($1)",
+ "exif-urgency-low": "Bassa ($1)",
+ "exif-urgency-high": "Ata ($1)",
+ "exif-urgency-other": "Prioritæ definie da l'utente ($1)",
"namespacesall": "Tùtti",
"monthsall": "tutti",
+ "confirmemail": "Conferma l'adreçço e-mail",
+ "confirmemail_noemail": "No t'hæ indicou un adreçço e-mail vallido inte to [[Special:Preferences|preferençe]].",
+ "confirmemail_text": "{{SITENAME}} o domanda a convallida de l'adreçço e-mail primma de poei doeouviâ e relative fonçioin. Sciacca o pulsante chì de sotta pe inviâ una recesta de conferma a-o proppio addreçço; into messaggio gh'è un collegamento ch'o conten un coddiçe. Vixita o collegamento co-o to navegatô pe confermâ che l'adreçço e-mail o l'è vallido.",
+ "confirmemail_pending": "O coddiçe de conferma o l'è za stæto spedio via posta eletronnica; se l'account o l'è stæto\ncreou de reçente, se prega de attende l'arivo do coddiçe pe quarche menuto primma\nde tentâ de domandâne un noeuvo.",
+ "confirmemail_send": "Invia un coddiçe de conferma via email.",
+ "confirmemail_sent": "Messaggio e-mail de conferma inviou.",
+ "confirmemail_oncreate": "Un coddiçe de conferma o l'è stæto spedio a l'adreçço de posta elettronnica indicou. O coddiçe o no l'è necessaio pe accede a-o scito,\nma l'è necessaio fornîlo pe poei abilitâ tutte e fonçioin do scito ch'adoeuvian a posta elettronnica.",
+ "confirmemail_sendfailed": "{{SITENAME}} o no poeu inviâ o messaggio e-mail de conferma. Controlla che o to adrçço e-mail o no contegne di caratteri non vallidi.\n\nMessaggio de errô do mailer: $1",
+ "confirmemail_invalid": "Coddiçe de conferma non vallido. O codiçe o poriæ ese descheito.",
+ "confirmemail_needlogin": "L'è necessaio $1 confermâ o to adreçço e-mail.",
+ "confirmemail_success": "L'adreçço e-mail o l'è stæto confermou. Oua ti poeu [[Special:UserLogin|intrâ]] e gödîte a wiki.",
+ "confirmemail_loggedin": "L'adreçço e-mail o l'è stæto confermou.",
+ "confirmemail_subject": "{{SITENAME}}: recesta de conferma de l'adreççoo",
+ "confirmemail_body": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha registrou l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe *no* t'ê stæto ti a registrâ l'utença, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:\n\n$5\n\nQuesto coddiçe de conferma o descaziâ aotomaticamente a $4.",
+ "confirmemail_body_changed": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha modificou l'adreçço e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e riattivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:",
+ "confirmemail_body_set": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha impostcou l'adreçço e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:",
+ "confirmemail_invalidated": "Recesta de conferma adreçço e-mail annulâ",
+ "invalidateemail": "Annulla a recesta de conferma e-mail",
+ "notificationemail_subject_changed": "L'adreçço de posta elettronica registrou insce {{SITENAME}} o l'è stæto modificou",
+ "notificationemail_subject_removed": "L'adreçço de posta elettronica registrou insce {{SITENAME}} o l'è stæto rimosso",
+ "notificationemail_body_changed": "Quarcun, foscia ti, da l'adreçço IP $1,\no l'ha modificou l'adreçço de posta elettronica de l'utenza \"$2\" in \"$3\" insce {{SITENAME}}.\n\nSe no t'ê stæto ti, contatta subbito un amministratô do scito.",
+ "notificationemail_body_removed": "Quarcun, foscia ti, da l'adreçço IP $1,\no l'ha levou l'adreçço de posta elettronica de l'utenza \"$2\" insce {{SITENAME}}.\n\nSe no t'ê stæto ti, contatta subbito un amministratô do scito.",
+ "scarytranscludedisabled": "[L'incluxone de paggine tra di sciti wiki a no l'è attiva]",
+ "scarytranscludefailed": "[Errô: Imposcibbile ötegnî o template $1]",
+ "scarytranscludefailed-httpstatus": "[Errô: imposcibbile ötegnî o template $1: HTTP $2]",
+ "scarytranscludetoolong": "[Errô: URL troppo longa]",
+ "deletedwhileediting": "'''Attençion''': questa pagina a l'è stæta scassâ doppo che t'hæ començou a modificâla!",
+ "confirmrecreate": "L'utente [[User:$1|$1]] ([[User talk:$1|discuscioin]]) o l'ha scassou sta pagina doppo che t'hæ començou a modificâla, pe-o seguente motivo: ''$2''\nPe piaxei, conferma che ti voeu da vei ricreâ sta paggina.",
+ "confirmrecreate-noreason": "L'utente [[User:$1|$1]] ([[User talk:$1|discuscioin]]){{GENDER:$1|o|a}} l'ha scassou sta pagina doppo che t'hæ començou a modificâla.\nPe piaxei, conferma che ti voeu da vei ricreâ sta paggina.",
+ "recreate": "Ricrea",
+ "confirm_purge_button": "OK",
+ "confirm-purge-top": "Ti voeu netezâ a cache de questa pagina?",
+ "confirm-purge-bottom": "O netezzo da cache de una pagina o consente de mostrâ a so verscion ciù aggiornâ.",
+ "confirm-watch-button": "OK",
+ "confirm-watch-top": "Azónze sta pàgina a-a têu lista di öservæ speçiâli?",
+ "confirm-unwatch-button": "OK",
+ "confirm-unwatch-top": "Leva sta paggina da-a to lista sott'oservaçion.",
+ "confirm-rollback-button": "OK",
+ "confirm-rollback-top": "Ripristinâ e modiffiche de questa paggina?",
+ "quotation-marks": "«$1»",
"imgmultipageprev": "← Pagina de primma",
"imgmultipagenext": "Proscima pagina →",
"imgmultigo": "Vanni!",
+ "imgmultigoto": "Vanni a-a paggina $1",
+ "img-lang-default": "(lengua predefinia)",
+ "img-lang-info": "Converti questa immaggine in $1. $2",
+ "img-lang-go": "Vanni",
"ascending_abbrev": "cresc",
+ "descending_abbrev": "decresc",
"table_pager_next": "Proscima pagina",
"table_pager_prev": "Pagina de primma",
"table_pager_first": "Primma pagina",
"table_pager_last": "Urtima pagina",
- "table_pager_limit": "Fanni devve $1 elementi pe pagina",
+ "table_pager_limit": "Mostra $1 elementi pe paggina",
+ "table_pager_limit_label": "Elementi pe paggina:",
"table_pager_limit_submit": "Vanni",
"table_pager_empty": "Nisciun resultato",
"autosumm-blank": "Pagina svuâ",
"autosumm-replace": "Sostituçion da pagina con '$1'",
"autoredircomment": "Reindirissoö a [[$1]]",
"autosumm-new": "Paggina creâ con \"$1\"",
+ "autosumm-newblank": "Creou paggina voeua",
+ "lag-warn-normal": "E modifiche apportæ {{PLURAL:$1|inte l'urtimo segondo|inti urtimi $1 segondi}} porieivan no apparî inte questa lista.",
+ "lag-warn-high": "A caosa de un eccescivo ritardo inte l'aggiornamento do server de database, e modiffiche apportæ {{PLURAL:$1|inte l'urtimo segondo|inti urtimi $1 segondi}} porieivan no apparî inte questa lista.",
+ "watchlistedit-normal-title": "Modiffica a lista sotta oservaçion",
+ "watchlistedit-normal-legend": "Rimoeuvi di tittoli da-i öservæ speciali",
+ "watchlistedit-normal-explain": "De sotta l'è elencou tutte e pagine sott'öservaçion.\nPe levâ un-a o ciù paggine da-a lista, seleçion-a e caselle relative e clicca o pulsante \"{{int:Watchlistedit-normal-submit}}\" in fondo a l'elenco.\nTi poeu ascì [[Special:EditWatchlist/raw|modificâ a lista in formato testoâ]].",
+ "watchlistedit-normal-submit": "Leva di tittoli",
+ "watchlistedit-normal-done": "Da-a lista di öservæ speciali l'è stæto eliminou {{PLURAL:$1|una pagina|$1 pagine}}:",
+ "watchlistedit-raw-title": "Modiffica a lista sotta oservaçion in formato testo",
+ "watchlistedit-raw-legend": "Modiffica a lista sotta oservaçion in formato testo",
+ "watchlistedit-raw-explain": "De sotta l'è elencou tutte e pagine sott'öservaçion.\nPe cangiâ a lista, azonzi ò leva i rispetivi tittoli, un pe riga. Una votta terminou, clicca o pulsante \"{{int:Watchlistedit-raw-submit}}\" in fondo a l'elenco.\nTi poeu ascì [[Special:EditWatchlist|modificâ a lista co l'interfaccia standard]].",
+ "watchlistedit-raw-titles": "Tittoli:",
+ "watchlistedit-raw-submit": "Agiorna a lista di öservæ speciali",
+ "watchlistedit-raw-done": "A lista di öservæ speciali a l'è stæta aggiornâ.",
+ "watchlistedit-raw-added": "L'è stæto azonto {{PLURAL:$1|una paggina|$1 paggine}}:",
+ "watchlistedit-raw-removed": "L'è stæto eliminou {{PLURAL:$1|una paggina|$1 paggine}}:",
+ "watchlistedit-clear-title": "Svoeua a lista sott'öservaçion",
+ "watchlistedit-clear-legend": "Svoeua a lista sott'öservaçion",
+ "watchlistedit-clear-explain": "Tutti i tittoli saian rimossi da-i to öservæ speciali",
+ "watchlistedit-clear-titles": "Tittoli:",
+ "watchlistedit-clear-submit": "Svoeua a lista sott'öservaçion (Permanentemente!)",
+ "watchlistedit-clear-done": "A lista di öservæ speciali a l'è stæta svuâ.",
+ "watchlistedit-clear-removed": "L'è stæto eliminou {{PLURAL:$1|una paggina|$1 paggine}}:",
+ "watchlistedit-too-many": "Gh'è troppe paggine da visualizzâ chì.",
+ "watchlisttools-clear": "Svoeua a lista sott'öservaçion",
"watchlisttools-view": "Veddi e modiffiche pertinenti",
"watchlisttools-edit": "Veddi e modiffica a lista",
"watchlisttools-raw": "Modiffica a lista in formato testo",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discuscioin]])",
+ "timezone-local": "Locale",
"duplicate-defaultsort": "Atençión: a ciâve de ordinaménto predefinîa \"$2\" a sostitoisce quella de primma \"$1\".",
+ "duplicate-displaytitle": "<strong>Attençion:</strong> o tittolo visualizzou \"$2\" o sostituisce o precedente tittolo \"$1\".",
+ "restricted-displaytitle": "<strong>Attençion:</strong> o titolo visualizzou \"$1\" o l'è stæto ignorou perché non equivalente a-o tittolo attoâ da paggina.",
+ "invalid-indicator-name": "<strong>Errô:</strong> l'attributo <code>name</code> di indicatoî do stato da paggina o no poeu ese voeuo.",
"version": "Verscion",
+ "version-extensions": "Estenscioin installæ",
+ "version-skins": "Temi installæ",
+ "version-specialpages": "Paggine speciale",
+ "version-parserhooks": "Hook do parser",
+ "version-variables": "Variabbile",
+ "version-antispam": "Prevençion do spam",
+ "version-other": "Atro",
+ "version-mediahandlers": "Gestoî di contegnui murtimediæ",
+ "version-hooks": "Hook",
+ "version-parser-extensiontags": "Tag riconosciui da-o parser introduti da di estenscioin",
+ "version-parser-function-hooks": "Hook pe de fonçioin do parser",
+ "version-hook-name": "Nomme de l'hook",
+ "version-hook-subscribedby": "Sottoscriçioin",
+ "version-no-ext-name": "[sença nomme]",
+ "version-license": "Liçença MediaWiki",
+ "version-ext-license": "Liçença",
+ "version-ext-colheader-name": "Estenscion",
+ "version-skin-colheader-name": "Tema",
+ "version-ext-colheader-version": "Verscion",
+ "version-ext-colheader-license": "Liçença",
+ "version-ext-colheader-description": "Descriçion",
+ "version-ext-colheader-credits": "Aotoî",
+ "version-license-title": "Liçença pe $1",
+ "version-license-not-found": "Pe st'estenscion no l'è stæto atrovou arcun-a informaçion dettagiâ in sciâ liçença.",
+ "version-credits-title": "Credditi pe $1",
+ "version-credits-not-found": "Pe st'estenscion no l'è stæto atrovou arcun-a informaçion dettagiâ in scî credditi.",
+ "version-poweredby-credits": "Questo wiki o l'è realizou con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+ "version-poweredby-others": "atri",
+ "version-poweredby-translators": "tradutoî de translatewiki.net",
+ "version-credits-summary": "A nostra riconoscença a-e seguente person-e pe avei contribuio a [[Special:Version|MediaWiki]].",
+ "version-license-info": "MediaWiki o l'è un software libbero; ti poeu redistribuîlo e/ò modificâlo segondo i termi da GNU General Public License, comme pubbricâ da-a Free Software Foundation; ò a verscion 2 da Liçença ò (a proppia scelta) qualunque verscion succesciva.\n\nMediaWiki o l'è distribuio inta spiança ch'a segge uttile, ma SENÇA ARCUN-A GARANÇIA; sença manco a garantia impliççita de NEGOÇIABILITÆ ò de APPRICABILITÆ PE 'N SCOPO PARTICOLÂ. Amia a GNU General Public License pe maggioî detaggi.\n\nQuesto programma o dev'ese distribuio assemme a [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na coppia da GNU General Public License]; in caxo contraio, se ne poeu ötegnî un-a scrivendo a-a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppû [http://www.softwarelibero.it/gnudoc/gpl.it.txt lezila in sciâ re'].",
+ "version-software": "Software instalou",
+ "version-software-product": "Produto",
+ "version-software-version": "Verscion",
+ "version-entrypoints": "URL d'accesso",
+ "version-entrypoints-header-entrypoint": "Ponti d'accesso",
+ "version-entrypoints-header-url": "URL",
+ "version-libraries": "Libraie instalæ",
+ "version-libraries-library": "Libraia",
+ "version-libraries-version": "Verscion",
+ "version-libraries-license": "Liçença",
+ "version-libraries-description": "Descriçion",
+ "version-libraries-authors": "Aotoî",
+ "redirect": "Rendriçamento da file, utente, paggina, verscion ò ID registro",
+ "redirect-summary": "Questa pagina speciale a rendriçça a un file (specificando o nome do file), a una pagina (specificando un ID de verscion ò un ID pagina), a un utente (specificando un ID utente numerrico) ò a 'n elemento do registro (specificando l'ID registro).\nEsempi: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/logid/186]].",
+ "redirect-submit": "Vanni",
+ "redirect-lookup": "Riçerca:",
+ "redirect-value": "Valô:",
+ "redirect-user": "ID utente",
+ "redirect-page": "ID da paggina",
+ "redirect-revision": "Verscion da paggina",
+ "redirect-file": "Nomme do file",
+ "redirect-logid": "ID registro",
+ "redirect-not-exists": "Valô non trovou",
+ "fileduplicatesearch": "Riçerca di file dupricæ",
+ "fileduplicatesearch-summary": "Riçerca di eventuali dupricæ do file in base a-o valô de ''hash''.",
+ "fileduplicatesearch-filename": "Nomme do file:",
+ "fileduplicatesearch-submit": "Çerca",
+ "fileduplicatesearch-info": "$1 × $2 pixel<br />Dimenscion do file: $3<br />Tipo MIME: $4",
+ "fileduplicatesearch-result-1": "Dupricæ identichi a-o file \"$1\" no ghe n'è.",
+ "fileduplicatesearch-result-n": "Existe {{PLURAL:$2|un dupricou identico|$2 dupricæ identichi}} a-o file \"$1\".",
+ "fileduplicatesearch-noresults": "Nisciun file de nomme \"$1\" trovou.",
"specialpages": "Pagine speçiâli",
+ "specialpages-note-top": "Legenda",
+ "specialpages-note": "* Pagine speciali non riservæ.\n* <span class=\"mw-specialpagerestricted\">Pagine speciali riservæ a çerte categorie d'utenti.</span>",
+ "specialpages-group-maintenance": "Raporti de manutençion",
+ "specialpages-group-other": "Atre paggine speciale",
+ "specialpages-group-login": "Intra / Registrite",
+ "specialpages-group-changes": "Urtime modiffiche e registri",
+ "specialpages-group-media": "File murtimediæ - caregamento e reisoconti",
+ "specialpages-group-users": "Utenti e driti",
+ "specialpages-group-highuse": "Paggine a ato utilizzo",
+ "specialpages-group-pages": "Elenchi de paggine",
+ "specialpages-group-pagetools": "Strumenti pe-e paggine",
+ "specialpages-group-wiki": "Dæti e strumenti",
+ "specialpages-group-redirects": "Paggine speciale de rendriççamento",
+ "specialpages-group-spam": "Strumenti contra o spam",
+ "specialpages-group-developer": "Strumenti pe-i sviluppatoî",
+ "blankpage": "Paggina voeua",
+ "intentionallyblankpage": "Questa paggina a l'è stæta lasciâ voeua aposta.",
"external_image_whitelist": " #Lascia sta riga comm'a l'é<pre>\n#Inseisci i pessi de esprescioìn regolari (sôlo a pàrte ch'a va fra e //) chì sotta\n#Ste chi saiàn misse a confronto co-i indirìssi URL de inmàgini esterne (hotlinked)\n#E corispondense saiàn mostræ cómme inmàgini, donca saiâ mostròu sôlo in colegaménto\n#E righe che començan con # son conscideræ coménti\n#A diferensa tra maioscole e minoscole a no l'è scignificatîva\n\n#Inseisci sovia sta rîga tùtti i frammenti de regex. Lascia sta rîga ezattamente comm'a l'é</pre>",
+ "tags": "Etichette de modiffiche vallide",
"tag-filter": "Filtra pe [[Special:Tags|etichetta]]:",
+ "tag-filter-submit": "Filtro",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etichetta|Etichette}}]]: $2)",
+ "tags-title": "Etichette",
+ "tags-intro": "Questa pagina a l'elenca i etichette che o software o poriæ associâ a 'na modiffica e o so scignificou.",
+ "tags-tag": "Nomme de l'etichetta",
+ "tags-display-header": "Aspetto inta lista de modiffiche",
+ "tags-description-header": "Descriçion completa do scignificou",
+ "tags-source-header": "Sorgente",
+ "tags-active-header": "Attivo?",
+ "tags-hitcount-header": "Modiffiche co l'etichetta",
+ "tags-actions-header": "Açioin",
+ "tags-active-yes": "Sci",
+ "tags-active-no": "No",
+ "tags-source-extension": "Definio da 'n'estenscion",
+ "tags-source-manual": "Appricou manoalmente da utenti e bot",
+ "tags-source-none": "No ciù in doeuvia",
+ "tags-edit": "cangia",
+ "tags-delete": "scassa",
+ "tags-activate": "attiva",
+ "tags-deactivate": "disattiva",
+ "tags-hitcount": "$1 {{PLURAL:$1|modiffica|modiffiche}}",
+ "tags-manage-no-permission": "No ti g'hæ a permiscion pe manezâ i cangi d'etichetta.",
+ "tags-manage-blocked": "No ti poeu manezâ i cangi d'etichetta dementre che t'ê blocou.",
+ "tags-create-heading": "Crea un noeuvo tag",
+ "tags-create-explanation": "Pe impostaçion predefinia, i tag apen-a creæ saian disponibbili pe l'utilizzo di utenti e di bot.",
+ "tags-create-tag-name": "Nomme de l'etichetta:",
+ "tags-create-reason": "Raxon:",
+ "tags-create-submit": "Crea",
+ "tags-create-no-name": "L'è necessaio specificâ un nomme d'etichetta.",
+ "tags-create-invalid-chars": "I nommi di etichette no devan contegnî de virgole (<code>,</code>) ò de bare (<code>/</code>).",
+ "tags-create-invalid-title-chars": "I nommi di etichette no devan contegnî di caratteri che no poeuan ese doeuviæ inti tirtoli de paggine.",
+ "tags-create-already-exists": "L'etichetta $1 a l'existe za.",
+ "tags-create-warnings-above": "L'è stæto rilevou {{PLURAl:$2|o seguente peigo|i seguenti peighi}} mentre se tentava de creâ l'etichetta \"$1\":",
+ "tags-create-warnings-below": "Ti dexiddei continoâ a creâ l'etichetta?",
+ "tags-delete-title": "Scassa l'etichetta",
+ "tags-delete-explanation-initial": "Ti stæ pe eliminâ o tag \"$1\" da-o database.",
+ "tags-delete-explanation-in-use": "A saiâ rimossa da {{PLURAL:$2|$2 verscioin ò voxe de registro| tutte e $2 verscioin e/ò voxe de registro}} dovv'a se troeuva oua.",
+ "tags-delete-explanation-warning": "Questa açion a l'è <strong>ireverscibbile</strong> e a <strong>no poeu ese annullâ</strong>, manco da di amministratoî de database. Asegûite che quest'o segge da vei o tag che t'intendi eliminâ.",
+ "tags-delete-explanation-active": "<strong> L'etichetta \"$1\" a l'è ancon attiva, e a-o restiâ in futuo. </strong> Pe disattivâla, vanni a fâlo da-e voxe de registro dovve l'etichetta a l'è in doeuvia.",
+ "tags-delete-reason": "Raxon:",
+ "tags-delete-submit": "Elimmina irreverscibilmente questo tag",
+ "tags-delete-not-allowed": "I tag definii da 'n'estenscion no poeuan ese eliminæ a meno che questo no segge specificamente permisso da l'estenscion.",
+ "tags-delete-not-found": "O tag \"$1\" o no l'existe.",
+ "tags-delete-too-many-uses": "O tag \"$1\" o l'è applicou a ciù de $2 {{PLURAL:$2|revixon|revixion}}, saieiv'a dî, ch'o no poeu ese eliminou.",
+ "tags-delete-warnings-after-delete": "L'etichetta \"$1\" a l'è stæta scassâ, ma fanni attençion {{PLURAL:$2|a-o seguente avviso|a-i seguenti avvixi}}:",
+ "tags-delete-no-permission": "No ti g'hæ a permiscion pe scassâ i cangi d'etichetta.",
+ "tags-activate-title": "Attiva tag",
+ "tags-activate-question": "Ti stæ pe attivâ o tag \"$1\".",
+ "tags-activate-reason": "Raxon:",
+ "tags-activate-not-allowed": "No l'è poscibbile attivâ o tag \"$1\".",
+ "tags-activate-not-found": "O tag \"$1\" o no l'existe.",
+ "tags-activate-submit": "attiva",
+ "tags-deactivate-title": "Disattiva o tag",
+ "tags-deactivate-question": "Ti stæ pe disattivâ o tag \"$1\".",
+ "tags-deactivate-reason": "Raxon:",
+ "tags-deactivate-not-allowed": "No l'è poscibbile disattivâ o tag \"$1\".",
+ "tags-deactivate-submit": "disattiva",
+ "tags-apply-no-permission": "No ti dispon-i de l'aotorizzaçion pe appricâ a modiffica di tag insemme a-e to modiffiche.",
+ "tags-apply-blocked": "No ti poeu appricâ i etichette a-e modiffiche mentre t'ê bloccou.",
+ "tags-apply-not-allowed-one": "L'etichetta \"$1\" a no poeu ese appricâ manoalmente.",
+ "tags-apply-not-allowed-multi": "{{PLURAL:$2|A seguente etichetta a no poeu ese appricâ|E seguente etichette no poeuan ese appricæ}} manoalmente: $1",
+ "tags-update-no-permission": "Non ti dispon-i de permiscioin necessaie pe azonze ò rimoeuve i etichette de modiffica da-e scingole verscioin ò voxe de registro.",
+ "tags-update-blocked": "No ti poeu rimoeuve i cangi d'etichetta dementre che t'ê blocou.",
+ "tags-update-add-not-allowed-one": "L'etichetta \"$1\" a no poeu ese azonta manoalmente.",
+ "tags-update-add-not-allowed-multi": "{{PLURAL:$2|A seguente etichetta a no poeu ese azonta|E seguente etichette no poeuan ese azonte}} manoalmente: $1",
+ "tags-update-remove-not-allowed-one": "L'etichetta \"$1\" a no poeu ese rimossa.",
+ "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|A seguente etichetta a no poeu ese rimossa|E seguente etichette no poeuan ese rimosse}} manoalmente: $1",
+ "tags-edit-title": "Modiffica etichette",
+ "tags-edit-manage-link": "Gestisci etichette",
+ "tags-edit-revision-selected": "{{PLURAL:$1|Verscion seleçionâ|Verscioin seleçionæ}} de [[:$2]]:",
+ "tags-edit-logentry-selected": "{{PLURAL:$1|Evento do registro seleçionou|Eventi do registro seleçionæ}}:",
+ "tags-edit-revision-legend": "Azonzi ò rimoeuvi i etichette da {{PLURAL:$1|questa verscion|tutte $1 e verscioin}}",
+ "tags-edit-logentry-legend": "Azonzi ò rimoeuvi o etichette da {{PLURAL:$1|questa voxe de registro|tutte $1 e voxe de registro}}",
+ "tags-edit-existing-tags": "Etichette existente:",
+ "tags-edit-existing-tags-none": "<em>Nisciun-a</em>",
+ "tags-edit-new-tags": "Noeuve etichette:",
+ "tags-edit-add": "Azonzi queste etichette:",
+ "tags-edit-remove": "Rimoeuvi queste etichette:",
+ "tags-edit-remove-all-tags": "(leva tutti i tag)",
+ "tags-edit-chosen-placeholder": "Seleçion-a arcun-e etichette",
+ "tags-edit-chosen-no-results": "Nisciun tag corrispondente trovou",
+ "tags-edit-reason": "Raxon:",
+ "tags-edit-revision-submit": "Apprica e modiffiche a {{PLURAL:$1|questa verscion|$1 verscioin}}",
+ "tags-edit-logentry-submit": "Apprica e modiffiche a {{PLURAL:$1|questa voxe de registro|$1 voxe de registro}}",
+ "tags-edit-success": "E modifiche son stæte appricæ.",
+ "tags-edit-failure": "No l'è stæto poscibbile effettoâ e seguente modiffiche:\n$1",
+ "tags-edit-nooldid-title": "Verscion specificâ non vallida",
+ "tags-edit-nooldid-text": "No t'hæ specificou arcun-a verscion da paggina in sciâ quæ exeguî questa fonçion, oppû a verscion specificâ a no l'existe.",
+ "tags-edit-none-selected": "Pe piaxei, seleçion-a a-o manco un tag da azonzge ò da levâ.",
+ "comparepages": "Confronta e paggine",
+ "compare-page1": "Pagina 1",
+ "compare-page2": "Pagina 2",
+ "compare-rev1": "Verscion 1",
+ "compare-rev2": "Verscion 2",
+ "compare-submit": "Confronta",
+ "compare-invalid-title": "O tittolo che t'hæ specificou o no l'è vallido.",
+ "compare-title-not-exists": "O tittolo specificou o no l'existe.",
+ "compare-revision-not-exists": "A verscion che t'hæ specificou a no l'existe.",
+ "dberr-problems": "Spiaxenti! Questo scito o g'ha di problemi tecnichi.",
+ "dberr-again": "Proeuva a aspêtâ quarche menuto e recarrega.",
+ "dberr-info": "(Imposcibbile accede a-o database: $1)",
+ "dberr-info-hidden": "(Imposcibbile accede a-o database)",
+ "dberr-usegoogle": "Ti poeu provâ a çercâ insce Google into fratempo.",
+ "dberr-outofdate": "Notta che a so indiçizaçion di nostri contegnui a poriæ no ese agiornâ.",
+ "dberr-cachederror": "Questa a l'è una coppia cache dea paggina domandâ, e a poriæ no ese agiornâ.",
+ "htmlform-invalid-input": "Gh'è di problemi co-i dæti inseii.",
+ "htmlform-select-badoption": "O valô specificou a no l'è un'opçion vallida.",
+ "htmlform-int-invalid": "O valô specificou o no l'è un intrego.",
+ "htmlform-float-invalid": "O valô specificou o no l'è un nummero.",
+ "htmlform-int-toolow": "O valô specificou o l'è infeiô a-o minnimo de $1",
+ "htmlform-int-toohigh": "O valô specificou o l'è supeiô a-o mascimo de $1",
+ "htmlform-required": "Questo valô o l'è öbrigatoio.",
+ "htmlform-submit": "Invia",
+ "htmlform-reset": "Anulla e modiffiche",
+ "htmlform-selectorother-other": "Atro",
+ "htmlform-no": "No",
+ "htmlform-yes": "Sci",
+ "htmlform-chosen-placeholder": "Seleçion-a un'opçion",
+ "htmlform-cloner-create": "Azonzi de l'atro",
+ "htmlform-cloner-delete": "Leva",
+ "htmlform-cloner-required": "Ghe voeu a-o manco un valô.",
+ "htmlform-title-badnamespace": "[[:$1]] a no se troeuva into namespace \"{{ns:$2}}\".",
+ "htmlform-title-not-creatable": "\"$1\" o l'è o tittolo de una paggina non creabile",
+ "htmlform-title-not-exists": "$1 a no l'existe.",
+ "htmlform-user-not-exists": "'''$1''' o no l'existe.",
+ "htmlform-user-not-valid": "<strong>$1</strong> o no l'è un nomme utente vallido.",
+ "sqlite-has-fts": "$1 co-a poscibilitæ de riçerca completa into testo",
+ "sqlite-no-fts": "$1 sença a poscibilitæ de riçerca completa into testo",
"logentry-delete-delete": "$1 {{GENDER:$2|o l'ha scassou}} a paggina $3",
+ "logentry-delete-restore": "$1 {{GENDER:$2|o|a}} l'ha ripristinou a paggina $3",
+ "logentry-delete-event": "$1 {{GENDER:$2|o|a}} l'ha modificou a vixibilitæ de {{PLURAL:$5|un'açion do registro|$5 açioin do registro}} de \"$3\": $4",
+ "logentry-delete-revision": "$1 {{GENDER:$2|o l'ha modificou}} a vixibilitæ pe {{PLURAL:$5|una verscion|$5 verscioin}} da paggina $3: $4",
+ "logentry-delete-event-legacy": "$1 {{GENDER:$2|o l'ha modificou}} a vixibilitæ de quarche açion do registro de $3",
+ "logentry-delete-revision-legacy": "$1 {{GENDER:$2|o l'ha modificou}} a vixibilitæ pe-e verscioin da paggina $3",
+ "logentry-suppress-delete": "$1 {{GENDER:$2|o l'ha soppresso}} a paggina $3",
+ "logentry-suppress-event": "$1 {{GENDER:$2|o l'ha segretamente modificou}} a vixibilitæ de {{PLURAL:$5|un'açion do registro|$5 açioin do registro}} de $3: $4",
+ "logentry-suppress-revision": "$1 {{GENDER:$2|o l'ha segretamente modificou}} a vixibilitæ de {{PLURAL:$5|una verscion|$5 verscioin}} da paggina $3: $4",
+ "logentry-suppress-event-legacy": "$1 {{GENDER:$2|o l'ha segretamente modificou}} a vixibilitæ de quarche açion do registro de $3",
+ "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|o l'ha segretamente modificou}} a vixibilitæ de quarche verscion da pagina $3",
+ "revdelete-content-hid": "contegnuo ascoso",
+ "revdelete-summary-hid": "ögetto da modiffica ascoso",
+ "revdelete-uname-hid": "nomme utente ascoso",
+ "revdelete-content-unhid": "contegnuo ripristinou",
+ "revdelete-summary-unhid": "ögetto da modiffica ripristinou",
+ "revdelete-uname-unhid": "nomme utente ripristinou",
+ "revdelete-restricted": "limitaçioin a-i soli amministratoî attivæ",
+ "revdelete-unrestricted": "limitaçioin a-i soli amministratoî rimosse",
+ "logentry-block-block": "$1 {{GENDER:$2|o l'ha bloccou}} {{GENDER:$4|$3}} co-ina scadença de $5 $6",
+ "logentry-block-unblock": "$1 {{GENDER:$2|o l'ha sbroccou}} {{GENDER:$4|$3}}",
+ "logentry-block-reblock": "$1 {{GENDER:$2|o l'ha modificou}} e impostaçioin do blocco pe {{GENDER:$4|$3}} co-ina scadença de $5 $6",
+ "logentry-suppress-block": "$1 {{GENDER:$2|o l'ha bloccou}} {{GENDER:$4|$3}} co-ina scadença de $5 $6",
+ "logentry-suppress-reblock": "$1 {{GENDER:$2|o l'ha modificou}} e impostaçioin do blocco pe {{GENDER:$4|$3}} co-ina scadença de $5 $6",
+ "logentry-import-upload": "$1 {{GENDER:$2|o l'ha importou}} $3 trammite caregamento",
+ "logentry-import-upload-details": "$1 {{GENDER:$2|o l'ha importou}} $3 trammite caregamento de file ($4 {{PLURAL:$4|verscion|verscioin}})",
+ "logentry-import-interwiki": "$1 {{GENDER:$2|o l'ha importou}} $3 da un'atra wiki",
+ "logentry-import-interwiki-details": "$1 {{GENDER:$2|o l'ha importou}} $3 da $5 ($4 {{PLURAL:$4|verscione|verscioin}})",
+ "logentry-merge-merge": "$1 {{GENDER:$2|o l'ha unio}} $3 in $4 (verscioin scin a-o $5)",
"logentry-move-move": "$1 {{GENDER:$2|o l'ha mesciou}} a paggina $3 a $4",
+ "logentry-move-move-noredirect": "$1 {{GENDER:$2|o l'ha mescioiu}} a paggina $3 a $4 sença lasciâ de redirect",
+ "logentry-move-move_redir": "$1 {{GENDER:$2|o l'ha mesciou}} a paggina $3 a $4 trammite redirect",
+ "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|o l'ha mesciou}} a paggina $3 a $4 a-o posto de 'n redirect sença lasciâ de redirect",
+ "logentry-patrol-patrol": "$1 {{GENDER:$2|o l'ha marcou}} a verscion $4 da paggina $3 comme controlâ",
+ "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|o l'ha marcou}} aotomaticamente a verscion $4 da paggina $3 comme controlâ",
+ "logentry-newusers-newusers": "L'utensa $1 a l'è stæta {{GENDER:$2|creâ}}",
"logentry-newusers-create": "L'utensa $1 a l'è stæta {{GENDER:$2|creâ}}",
+ "logentry-newusers-create2": "L'utença $3 a l'è stæta {{GENDER:$2|creâ}} da $1",
+ "logentry-newusers-byemail": "L'utença $3 a l'è stæta {{GENDER:$2|creâ}} da $1 e a password a l'è stæta inviâ via e-mail",
+ "logentry-newusers-autocreate": "L'utença $1 a l'è stæta {{GENDER:$2|creâ}} aotomaticamente",
+ "logentry-protect-move_prot": "$1 {{GENDER:$2|o l'ha mesciou}} e impostaçioin de proteçion da $4 a $3",
+ "logentry-protect-unprotect": "$1 {{GENDER:$2|o l'ha rimosso}} a proteçion da $3",
+ "logentry-protect-protect": "$1 {{GENDER:$2|o l'ha protezuo}} $3 $4",
+ "logentry-protect-protect-cascade": "$1 {{GENDER:$2|o l'ha protezuo}} $3 $4 [ricorsciva]",
+ "logentry-protect-modify": "$1 {{GENDER:$2|o l'ha modificou}} o livello de proteçion pe $3 $4",
+ "logentry-protect-modify-cascade": "$1 {{GENDER:$2|o l'ha modificou}} o livello de proteçion pe $3 $4 [ricorsciva]",
+ "logentry-rights-rights": "$1 {{GENDER:$2|o l'ha modificou}} l'appartenença de {{GENDER:$6|$3}} da-o groppo $4 a-o groppo $5",
+ "logentry-rights-rights-legacy": "$1 {{GENDER:$2|o l'ha modificou}} l'appartenença a di groppi de $3",
+ "logentry-rights-autopromote": "$1 o l'è {{GENDER:$2|stæto promosso|stæta promossa|stato/a promosso/a}} aotomaticamente da $4 a $5",
"logentry-upload-upload": "$1 {{GENDER:$2|o l'ha caregou}} $3",
- "searchsuggest-search": "Çerca"
+ "logentry-upload-overwrite": "$1 {{GENDER:$2|o l'ha caregou}} una noeuva verscion de $3.",
+ "logentry-upload-revert": "$1 {{GENDER:$2|o l'ha caregou}} $3",
+ "log-name-managetags": "Gestion etichette",
+ "log-description-managetags": "Questa paggina a l'elenca i açioin de gestion relative a-i [[Special:Tags|etichette]]. O registro o conten solo e açioin effettuæ manoalmente da 'n amministratoô; i etichette porieivan ese creæ ò scassæ da-o programma wiki sença che 'na voxe a segge registrâ chie.",
+ "logentry-managetags-create": "$1 {{GENERE:$2|o l'ha creou}}o tag \"$4\"",
+ "logentry-managetags-delete": "$1 {{GENDER:$2|o l'ha rimosso}} l'etichetta \"$4\" (da $5 {{PLURAL:$5|verscione ò voxe de registro|verscioin ò voxe de registro}})",
+ "logentry-managetags-activate": "$1 {{GENDER:$2|o l'ha inseio}} l'etichetta \"$4\" pe l'uso da parte d'utenti e bot",
+ "logentry-managetags-deactivate": "$1 {{GENDER:$2|o l'ha disattivou}} l'etichetta \"$4\" pe l'uso da parte d'utenti e bot",
+ "log-name-tag": "Etichette",
+ "log-description-tag": "Questa pagina a mostra quande i utenti han azonto ò rimosso di [[Special:Tags|etichette]] da de scingole verscioin ò voxe do registro. O registro o no l'elenca o etichettatue che avegnan co-ina modiffica, una cançelaçione ò un'atra açion scimmile.",
+ "logentry-tag-update-add-revision": "$1 {{GENDER:$2|o l'ha azonto}} {{PLURAL:$7|l'etichetta|i etichette}} $6 a-a verscion $4 da paggina $3",
+ "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|o l'ha azonto}} {{PLURAL:$7|l'etichetta|i etichette}} $6 a-a voxe de registro $5 da paggina $3",
+ "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|o l'ha rimosso}} {{PLURAL:$9|l'etichetta|i etichette}} $8 da-a verscion $4 da paggina $3",
+ "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|o l'ha rimosso}} {{PLURAL:$9|l'etichetta|i etichette}} $8 da-a voxe de registro $5 da paggina $3",
+ "logentry-tag-update-revision": "$1 {{GENDER:$2|o l'ha aggiornou}} i etichette da verscion $4 da paggina $3 ({{PLURAL:$7|azonta|azonte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
+ "logentry-tag-update-logentry": "$1 {{GENDER:$2|o l'ha aggiornou}} i etichette da voxe de registro $5 de paggina $3 ({{PLURAL:$7|azonta|azonte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
+ "rightsnone": "(nisciun)",
+ "revdelete-summary": "ögetto da modiffica",
+ "feedback-adding": "Inseimento do feedback inta paggina...",
+ "feedback-back": "Inderê",
+ "feedback-bugcheck": "Ottimo! Controlla solo ch'o no segge za fra-i [$1 bug conosciui].",
+ "feedback-bugnew": "Controllo effettuou. Segnalla un noeuvo bug",
+ "feedback-bugornote": "Se t'ê pronto a descrive o problema tecnico riscontrou de maibea precisa, [$1 segnalla o bug]. In alternativa, ti poeu doeuviâ o moddulo semplificou sottostante. O to commento inseio o saiâ azonto a-a paggina \"[$3 $2]\", insemme a-o to nomme utente.",
+ "feedback-cancel": "Anulla",
+ "feedback-close": "Fæto",
+ "feedback-external-bug-report-button": "Documenta un problema tecnico",
+ "feedback-dialog-title": "Invia un feedback",
+ "feedback-dialog-intro": "Doeuvia o moddulo sottostante pe inviâ o to feedback. O to commento o l'appariâ inta paggina \"$1\", assemme a-o to nomme utente.",
+ "feedback-error-title": "Errô",
+ "feedback-error1": "Errô: Da-a API l'è arrivou un risultou non riconosciuo",
+ "feedback-error2": "Errô: No l'è stæto poscibbile eseguî a modiffica",
+ "feedback-error3": "Errô: Nisciun-a risposta da-a API",
+ "feedback-error4": "Errô: imposcibbile inviâ o feedback a-o tittolo indicou",
+ "feedback-message": "Messaggio:",
+ "feedback-subject": "Sogetto:",
+ "feedback-submit": "Invia",
+ "feedback-terms": "Acapiscio che e mæ informaçioin insce l'user agent includdan de informaçioin in sciô mæ esatto navegatô e verscion do scistema operativo, che saian condivise pubricamente, assemme a-o mæ feedback.",
+ "feedback-termsofuse": "Accetto de fornî di feedback conformemente a-e Condiçioin d'Uso.",
+ "feedback-thanks": "Graççie! O to feedback o l'è stæto pubricou a-a paggina \"[$2 $1]\".",
+ "feedback-thanks-title": "Graççie!",
+ "feedback-useragent": "Agente utente:",
+ "searchsuggest-search": "Çerca",
+ "searchsuggest-containing": "ch'o conten...",
+ "api-error-autoblocked": "O to adreçço IP o l'è stæto bloccou aotomaticamente, perché o l'è stæto doeuviou da un utente bloccou.",
+ "api-error-badaccess-groups": "No t'ê aotorizzou a caregâ di file insce questa wiki.",
+ "api-error-badtoken": "Errô interno: token errou.",
+ "api-error-blocked": "T'ê stæto bloccou, no ti poeu fâ modiffiche.",
+ "api-error-copyuploaddisabled": "O caregamento trammite URL o l'è disabilitou insce questo server.",
+ "api-error-duplicate": "Gh'è za {{PLURAL:$1|un atro file|di atri files}} into scito co-o mæximo contegnuo.",
+ "api-error-duplicate-archive": "Gh'ea za {{PLURAL:$1|un atro file|di ltri file}} into scito co-o mæximo contegnuo, ma {{PLURAL:$1|o l'è stæto scassou|son stæti scassæ}}.",
+ "api-error-empty-file": "O file che t'hæ inviou o l'è voeuo.",
+ "api-error-emptypage": "A creaçion de noeuve pagine voeue a no l'è consentia.",
+ "api-error-fetchfileerror": "Errô interno: s'è verificou un problema durante o recuppero do file.",
+ "api-error-fileexists-forbidden": "Un file de nomme \"$1\" o l'existe za e o no poeu ese sorvescrito.",
+ "api-error-fileexists-shared-forbidden": "Un file de nomme \"$1\" o l'existe za into repository condiviso e o no poeu ese sorvescrito.",
+ "api-error-file-too-large": "O file che t'hæ inviou o l'ea troppo grande.",
+ "api-error-filename-tooshort": "O nomme do file o l'è troppo curto.",
+ "api-error-filetype-banned": "Questo tipo de file o l'è proibio.",
+ "api-error-filetype-banned-type": "\"$1\" {{PLURAL:$4|o no l'è un tipo de file consentio|no son di tipi de file consentii}}. {{PLURAL:$3|O tipo de file consentio o l'è|I tipi de file consentii son}} $2.",
+ "api-error-filetype-missing": "A-o file gh'amanca l'estenscion.",
+ "api-error-hookaborted": "A modiffica che t'hæ çercou de fâ a l'è stæta interrotta da un'estenscion.",
+ "api-error-http": "Errô interno: imposcibbile connettise a-o server.",
+ "api-error-illegal-filename": "O nomme do file o no l'è ammisso.",
+ "api-error-internal-error": "Errô interno: quarcosa o l'è anæto storto con l'elaboaçion do to caregamento in sciâ wiki.",
+ "api-error-invalid-file-key": "Errô interno: file non presente inta cartella di file temporannei.",
+ "api-error-missingparam": "Errô interno: parammetri da recesta mancanti.",
+ "api-error-missingresult": "Errô interno: imposcibbile determinâ se a coppia a l'è ariescîa.",
+ "api-error-mustbeloggedin": "Pe caregâ di file ti devi primma intrâ.",
+ "api-error-mustbeposted": "Errô interno: a recesta a richiede HTTP POST.",
+ "api-error-noimageinfo": "O caregamento o l'è ariescio, ma o server o no n'ha dæto arcun-a informaçion in sciô file.",
+ "api-error-nomodule": "Errô interno: no l'è stæto impostou o moddulo de caregamento.",
+ "api-error-ok-but-empty": "Errô interno: nisciun-a risposta da-o server.",
+ "api-error-overwrite": "No l'è permisso soviascrive un file existente.",
+ "api-error-ratelimited": "Ti çerchi de caregâ ciù file in meno tempo de quante questo wiki o permette.\nRiproeuva tra pochi menuti.",
+ "api-error-stashfailed": "Errô interno: o server o no l'è ariescio a memorizzâ o documento temporannio.",
+ "api-error-publishfailed": "Errô interno: o server o no l'è ariescio a pubbricâ o documento temporannio.",
+ "api-error-stasherror": "S'è veificou un errô durante o caregamento do file inta stash.",
+ "api-error-stashedfilenotfound": "O file inta stash o no l'è stæto trovou durante o tentativo de caregâ da-a stash.",
+ "api-error-stashpathinvalid": "O percorso ch'o l'aviæ dovuo portâ a-o file inta stash o no l'ea vallido.",
+ "api-error-stashfilestorage": "S'è veificou un errô durante a memorizzaçion do file inta stash.",
+ "api-error-stashzerolength": "O server o no poeu insei o file inta stash, perché o g'ha longheçça zero.",
+ "api-error-stashnotloggedin": "Pe poei sarvâ di file inta stash de caregamento ti devi primma intrâ.",
+ "api-error-stashwrongowner": "O file a-o quæ ti çercavi d'accede inta stash o no t'apparten.",
+ "api-error-stashnosuchfilekey": "A ciave do file a-a quæ ti çercavi d'accede inta stash a no l'existe.",
+ "api-error-timeout": "O server o no l'ha risposto entro o tempo previsto.",
+ "api-error-unclassified": "Gh'è stæto un aro sconosciuo.",
+ "api-error-unknown-code": "Errô sconosciuo: \"$1\"",
+ "api-error-unknown-error": "Errô interno: quarcosa l'è anæto storto provando a caregâ o file.",
+ "api-error-unknown-warning": "Avviso sconosciuo: $1",
+ "api-error-unknownerror": "Errô sconosciuo: \"$1\"",
+ "api-error-uploaddisabled": "O caregamento o l'è disabilitou insce questa wiki.",
+ "api-error-verification-error": "Questo file o poriæ ese dannezou, o aveighe l'estenscion sbaliâ.",
+ "api-error-was-deleted": "Un file co-o mæximo nomme o l'è stæto precedentemente caregou e succescivamente eliminou.",
+ "duration-seconds": "$1 {{PLURAL:$1|segondo|segondi}}",
+ "duration-minutes": "$1 {{PLURAL:$1|menuto|menuti}}",
+ "duration-hours": "$1 {{PLURAL:$1|oa|oe}}",
+ "duration-days": "$1 {{PLURAL:$1|giorno|giorni}}",
+ "duration-weeks": "$1 {{PLURAL:$1|setteman-a|setteman-e}}",
+ "duration-years": "$1 {{PLURAL:$1|anno|anni}}",
+ "duration-decades": "$1 {{PLURAL:$1|deccade}}",
+ "duration-centuries": "$1 {{PLURAL:$1|seccolo|seccoli}}",
+ "duration-millennia": "$1 {{PLURAL:$1|milennio|milenni}}",
+ "rotate-comment": "Immaggine curlâ de $1 {{PLURAL:$1|grao|groei}} in senso oraio",
+ "limitreport-title": "Dæti de profî do parser:",
+ "limitreport-cputime": "Tempo de utilizzo CPU",
+ "limitreport-cputime-value": "$1 {{PLURAL:$1|segondo|segondi}}",
+ "limitreport-walltime": "Tempo de utilizzo reale",
+ "limitreport-walltime-value": "$1 {{PLURAL:$1|segondo|segondi}}",
+ "limitreport-ppvisitednodes": "Nummero di noeui do preprocessô vixitæ",
+ "limitreport-ppgeneratednodes": "Nummero di noeui do preprocessô generæ",
+ "limitreport-postexpandincludesize": "Dimenscion de incluxoin post-espanscion",
+ "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte}}",
+ "limitreport-templateargumentsize": "Dimenscion di parammetri do template",
+ "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte}}",
+ "limitreport-expansiondepth": "Mascima profonditæ d'espanscion",
+ "limitreport-expensivefunctioncount": "Nummero de fonçioin do parser dispendiose",
+ "expandtemplates": "Espanscion di template",
+ "expand_templates_intro": "Questa pagina speciale a l'elabboa un testo espandendo tutti i template presenti.\nA carcoa ascì o risultou de fonçioon supportæ da-o parser comme\n<code><nowiki>{{</nowiki>#language:…}}</code> e de variabbile de scistema quæ\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>,\nsaiv'a dî inta prattica tutto 'lo che s'attroeuva tra parentexi graffe dogge.",
+ "expand_templates_title": "Contesto (pe {{FULLPAGENAME}} eçç.):",
+ "expand_templates_input": "Testo da espande:",
+ "expand_templates_output": "Risultou",
+ "expand_templates_xml_output": "Output in formato XML",
+ "expand_templates_html_output": "Risultou HTML",
+ "expand_templates_ok": "OK",
+ "expand_templates_remove_comments": "Rimoeuvi i commenti",
+ "expand_templates_remove_nowiki": "Elimmina o tag <nowiki> into risultou",
+ "expand_templates_generate_xml": "Mostra l'ærbo scintattico XML",
+ "expand_templates_generate_rawhtml": "Mostra l'HTML sgroeuzzo",
+ "expand_templates_preview": "Anteprimma",
+ "expand_templates_preview_fail_html": "<em>Scicomme {{SITENAME}} o g'ha de l'HTML sgroeuzzo attivou e gh'è stæto una perdia di dæti da sescion, l'anteprimma a l'è ascosa comme precaoçion contra i attacchi JavaScript.</em>\n\n<strong>Se se tratta de 'n normale tentativo d'anteprimma, riproeuva.</strong> \nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettoâ un noeuvo accesso, controllando che o to navegatô o l'açette i bescoeutti da questo scito.",
+ "expand_templates_preview_fail_html_anon": "<em>Scicomme {{SITENAME}} o g'ha de l'HTML sgroeuzzo attivou e ti no t'ê introu, l'anteprimma a l'è ascosa comme precaoçion contra i attacchi JavaScript.</em>\n\n<strong>Se se tratta de 'n normale tentativo d'anteprimma [[Special:UserLogin|intra]] e proeuvighe torna.</strong>",
+ "expand_templates_input_missing": "Quarcosa ti ghe-o devi scrive.",
+ "pagelanguage": "Cangia a lengua da paggina",
+ "pagelang-name": "Paggina",
+ "pagelang-language": "Lengua",
+ "pagelang-use-default": "Adoeuvia a lengua predefinia",
+ "pagelang-select-lang": "Seleçion-a a lengua",
+ "pagelang-submit": "Invia",
+ "right-pagelang": "Cangia a lengua da paggina",
+ "action-pagelang": "cangiâ a lengua da paggina",
+ "log-name-pagelang": "Registro di cangi de lengua",
+ "log-description-pagelang": "Questo o l'è un registro di cangiamenti de lengua de paggine.",
+ "logentry-pagelang-pagelang": "$1 {{GENDER:$2|o l'ha modificou}} a lengua de $3 da $4 a $5",
+ "default-skin-not-found": "Oops! O tema predefinio pe-o to wiki, definio in <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, o no l'è disponibbile.\n\nA to installaçion a pariæ includde {{PLURAL:$4|o seguente tema|i seguenti temi}}. Amia [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configuaçion do tema] pe de informaçioin insce comme {{PLURAL:$4|abilitâlo|abilitâli}} e çerne quello predefinio.\n\n$2\n\n; Se t'hæ appen-a installou MediaWiki:\n: Foscia ti l'hæ installou da git, o direttamente da-o codiçe sorgente doeuviando quarch'atro mettodo. Questo o l'ea previsto. Proeuva a installâ di temi da-a [https://www.mediawiki.org/wiki/Category:All_skins directory insce mediawiki.org], de ste mainee chì:\n:* Scaregando o [https://www.mediawiki.org/wiki/Download programma de installaçion tarball], ch'o l'è fornio con diversci temi e estenscioin. Ti poeu fâ o coppia e incolla da directory <code dir=\"ltr\">skins/</code> da lì.\n:* Scaregando di tarball di scingoli temi da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Doeuviando Git pe scaregâ i temi].\n: In questo moddo no doviæ interfei co-o to repository git se t'ê un sviluppatô MediaWiki.\n\n; Se t'hæ appen-a aggiornou MediaWiki:\n: MediaWiki 1.24 e verscioin succescive no abillitan ciù aotomaticamente i temi installæ (amia [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manoale: rilevamento aotomattico di temi]). Ti poeu copiâ {{PLURAL:$5|a seguente linnia|e seguente linne}} into <code>LocalSettings.php</code> pe abilitâ {{PLURAL:$5|o tema installou|tutti i temi installæ}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se t'hæ appen-a modificou <code>LocalSettings.php</code>:\n: Ricontrolla i nommi di temi pe di ari de battitua.",
+ "default-skin-not-found-no-skins": "Oops! O tema predefinio pe-o to wiki, definio in <code>$wgDefaultSkin</code> comme <code>$1</code>, o no l'è disponibbile.\n\nTemi installæ no ti ghe n'hæ.\n\n; Se t'hæ appen-a installou ò aggiornou MediaWiki:\n: Foscia ti l'hæ installou da git, ò direttamente da-o coddiçe sorgente doeuviando quarch'atro mettodo. Questo o l'ea previsto. MediaWiki 1.24 e e verscioin succescive no includdan arcun tema into repository prinçipâ. Proeuva a installâ di temi da-a [https://www.mediawiki.org/wiki/Category:All_skins directory insce mediawiki.org], inte sti moddi:\n:* Scaregando o [https://www.mediawiki.org/wiki/Download programma de instalaçion tarball], ch'o l'è fornio con diversci temi e estenscioin. Ti poeu fâ o coppia e incolla da directory <code>skins/</code> da lì.\n:* Scaregando tarball di scingoli temi da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Doeuviando Git pe scaregâ i temi].\n: Sto moddo o no doviæ interfei co-o to repository git se t'ê un sviluppatô MediaWiki. Amia [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manoale: configuaçion di temi] pe informaçioin insce comme abilitâle e scellie quello predefinio.",
+ "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (abilitâ)",
+ "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>disabilitâ</strong>)",
+ "mediastatistics": "Statistiche relative a-i file murtimediæ",
+ "mediastatistics-summary": "Statistiche in scî tipi de file caregæ. L'è incluso solo che a verscion ciù reçente de 'n file. E verscioin vege ò scassæ di file son escluse.",
+ "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
+ "mediastatistics-bytespertype": "Dimenscione totâ di file pe questa seçion: {{PLURAL:$1|$1 byte}} ($2; $3%).",
+ "mediastatistics-allbytes": "Dimenscion totâ de tutti i file: {{PLURAL:$1|$1 byte}} ($2).",
+ "mediastatistics-table-mimetype": "Tipo MIME",
+ "mediastatistics-table-extensions": "Poscibbile estenscioin",
+ "mediastatistics-table-count": "Nummero di file",
+ "mediastatistics-table-totalbytes": "Dimenscion combinâ",
+ "mediastatistics-header-unknown": "Sconosciuo",
+ "mediastatistics-header-bitmap": "Immaggine bitmap",
+ "mediastatistics-header-drawing": "Disegni (immaggine vettoiæ)",
+ "mediastatistics-header-audio": "Audio",
+ "mediastatistics-header-video": "Video",
+ "mediastatistics-header-multimedia": "Contegnui murtimediæ",
+ "mediastatistics-header-office": "Öfiççio",
+ "mediastatistics-header-text": "Testoale",
+ "mediastatistics-header-executable": "File exeguibbili",
+ "mediastatistics-header-archive": "Formati compresci",
+ "mediastatistics-header-total": "Tutti i file",
+ "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgola finâ a l'è stæta rimossa|virgole finæ son stæte rimosse}} da-o JSON",
+ "json-error-unknown": "Gh'è stæto un problema co-o JSON. Errô: $1",
+ "json-error-depth": "A profonditæ mascima do stack a l'è stæta superâ",
+ "json-error-state-mismatch": "JSON non vallido ò mäformou",
+ "json-error-ctrl-char": "Errô into carattere de controllo, poscibbile codiffica errâ",
+ "json-error-syntax": "Errô de scintasci",
+ "json-error-utf8": "Caratteri UTF-8 non vallidi, poscibbile codiffica errâ",
+ "json-error-recursion": "Un o ciù rifeimenti ricorscivi into valô da codificâ",
+ "json-error-inf-or-nan": "Un ò ciu valoî NAN o INF into valô da codificâ",
+ "json-error-unsupported-type": "L'è stæto fornio un valô de un tipo ch'o no poeu ese codificou",
+ "headline-anchor-title": "Colegamento a questa seçion",
+ "special-characters-group-latin": "Latin",
+ "special-characters-group-latinextended": "Latin esteiso",
+ "special-characters-group-ipa": "IPA",
+ "special-characters-group-symbols": "Scimboli",
+ "special-characters-group-greek": "Grego",
+ "special-characters-group-greekextended": "Grego esteiso",
+ "special-characters-group-cyrillic": "Çirillico",
+ "special-characters-group-arabic": "Arrabo",
+ "special-characters-group-arabicextended": "Arrabo esteiso",
+ "special-characters-group-persian": "Perscian",
+ "special-characters-group-hebrew": "Ebraico",
+ "special-characters-group-bangla": "Bengaleise",
+ "special-characters-group-tamil": "Tamil",
+ "special-characters-group-telugu": "Telugu",
+ "special-characters-group-sinhala": "Scingaleise",
+ "special-characters-group-gujarati": "Gujarati",
+ "special-characters-group-devanagari": "Devanagari",
+ "special-characters-group-thai": "Thailandeise",
+ "special-characters-group-lao": "Laotian",
+ "special-characters-group-khmer": "Khmer",
+ "special-characters-title-endash": "linieta enne",
+ "special-characters-title-emdash": "linieta emme",
+ "special-characters-title-minus": "segno meno",
+ "mw-widgets-dateinput-no-date": "Niscun-a dæta seleçionâ",
+ "mw-widgets-titleinput-description-new-page": "questa paggina o no l'existe ancon",
+ "mw-widgets-titleinput-description-redirect": "rendriçamento a $1",
+ "sessionmanager-tie": "No l'è poscibbile combinâ ciù tipi de receste de aotenticaçion: $1.",
+ "sessionprovider-generic": "sescioin $1",
+ "sessionprovider-mediawiki-session-cookiesessionprovider": "sescioin basæ in scî cookie",
+ "sessionprovider-nocookies": "I cookie poeuan ese disattivæ. Assegûite d'aveighe i cookie abilitæ e ricomença.",
+ "randomrootpage": "Paggina reixe a brettio",
+ "log-action-filter-block": "Tipo de blocco:",
+ "log-action-filter-contentmodel": "Tipo de modiffica do modello de contegnuo:",
+ "log-action-filter-delete": "Tipo de scassatua:",
+ "log-action-filter-import": "Tipo de importaçion:",
+ "log-action-filter-managetags": "Tipo d'açion de gestion d'etichetta:",
+ "log-action-filter-move": "Tipo de stramuo:",
+ "log-action-filter-newusers": "Tipo de creaçion d'utença:",
+ "log-action-filter-patrol": "Tipo de controllo:",
+ "log-action-filter-protect": "Tipo de proteçion:",
+ "log-action-filter-rights": "Tipo de modiffica di driti:",
+ "log-action-filter-suppress": "Tipo de soprescion:",
+ "log-action-filter-upload": "Tipo de caregamento:",
+ "log-action-filter-all": "Tutto",
+ "log-action-filter-block-block": "Blocco",
+ "log-action-filter-block-reblock": "Modiffica do blocco",
+ "log-action-filter-block-unblock": "Sblocco",
+ "log-action-filter-contentmodel-change": "Modiffica do modello do contegnuo",
+ "log-action-filter-contentmodel-new": "Creaçion de paggina con modello de contenuto non standard",
+ "log-action-filter-delete-delete": "Scancellaçion paggina",
+ "log-action-filter-delete-restore": "Ripristino paggina",
+ "log-action-filter-delete-event": "Scancellaçion registro",
+ "log-action-filter-delete-revision": "Scancellaçion verscion",
+ "log-action-filter-import-interwiki": "Importaçion transwiki",
+ "log-action-filter-import-upload": "Importaçion da XML caregou",
+ "log-action-filter-managetags-create": "Creaçion etichetta",
+ "log-action-filter-managetags-delete": "Scancellaçion etichetta",
+ "log-action-filter-managetags-activate": "Attivaçion etichetta",
+ "log-action-filter-managetags-deactivate": "Disattivaçion etichetta",
+ "log-action-filter-move-move": "Stramuo sença soviascrive di rendriçamenti",
+ "log-action-filter-move-move_redir": "Stramuo con soviascritua di rendriçamenti",
+ "log-action-filter-newusers-create": "Creaçion da utente anonnimo",
+ "log-action-filter-newusers-create2": "Creaçion da utente registrou",
+ "log-action-filter-newusers-autocreate": "Creaçion aotomattica",
+ "log-action-filter-newusers-byemail": "Creaçion con password inviâ via e-mail",
+ "log-action-filter-patrol-patrol": "Controllo manoâ",
+ "log-action-filter-patrol-autopatrol": "Cotrollo aotomattico",
+ "log-action-filter-protect-protect": "Proteçion",
+ "log-action-filter-protect-modify": "Modiffica proteçion",
+ "log-action-filter-protect-unprotect": "Desproteçion",
+ "log-action-filter-protect-move_prot": "Proteçion mesciâ",
+ "log-action-filter-rights-rights": "Modiffica manoâ",
+ "log-action-filter-rights-autopromote": "Modiffica aotomattica",
+ "log-action-filter-suppress-event": "Sopprescion de registro",
+ "log-action-filter-suppress-revision": "Sopprescion de verscion",
+ "log-action-filter-suppress-delete": "Sopprescion de paggina",
+ "log-action-filter-suppress-block": "Sopprescion utente da blocco",
+ "log-action-filter-suppress-reblock": "Sopprescion utente da re-blocco",
+ "log-action-filter-upload-upload": "Noeuvo caregamento",
+ "log-action-filter-upload-overwrite": "Ricaregamento",
+ "authmanager-authn-not-in-progress": "L'aotenticaçion a no l'è in corso ò i dæti da sescion son anæti persci. Se prega de recomençâ da cavo.",
+ "authmanager-authn-no-primary": "E credençiæ fornie no poeuan ese aotenticæ.",
+ "authmanager-authn-no-local-user": "E credençiæ fornie no son associæ a nisciun utente de questo wiki.",
+ "authmanager-authn-no-local-user-link": "E credençiæ fornie son vallide ma no son associæ a nisciun utente de questa wiki. Accedi inte 'n atro moddo ò crea un noeuvo utente, e ti gh'aviæ 'n'opçion pe collegâ e to credençiæ precedente a quell'utença.",
+ "authmanager-authn-autocreate-failed": "Creaçion aotomattica de 'n'utença locale fallia: $1",
+ "authmanager-change-not-supported": "E credençiæ fornie no poeuan ese modificæ, dæto che no saieivan doeuviæ da ninte.",
+ "authmanager-create-disabled": "A creaçion di utençe a l'è disabilitâ.",
+ "authmanager-create-from-login": "Pe creâ a to utença, completa i campi chì de sotta.",
+ "authmanager-create-not-in-progress": "A creaçion de un'utença a no l'è in corso ò i dæti da sescion son anæti perdui. Se prega de recomençâ da cavo.",
+ "authmanager-create-no-primary": "E credençiæ fornie no poeuan ese doeuviæ pe-a creaçion de l'utença.",
+ "authmanager-link-no-primary": "E credençiæ fornie no poeuan ese doeuviæ pe-o colegamento de l'utença.",
+ "authmanager-link-not-in-progress": "O colegamento de l'utença o no procede ò i dæti da sescion so-anæti perdui. Se prega de recomençâ da cavo.",
+ "authmanager-authplugin-setpass-failed-title": "Modiffica da password fallia",
+ "authmanager-authplugin-setpass-failed-message": "O plugin d'aotenticaçion o l'ha impedio a modiffica da password.",
+ "authmanager-authplugin-create-fail": "O plugin d'aotenticaçion o l'ha impedio a creaçion de l'utença.",
+ "authmanager-authplugin-setpass-denied": "O plugin d'aotenticaçion o no consente de cangiâ e password.",
+ "authmanager-authplugin-setpass-bad-domain": "Dominnio non vallido.",
+ "authmanager-autocreate-noperm": "A creaçion aotomattica del'utença a no l'è permissa.",
+ "authmanager-autocreate-exception": "A creaçion aotomattica di utençe a l'è temporaniamente disabilitâ a caosa di erroî precedenti.",
+ "authmanager-userdoesnotexist": "L'utença \"$1\" a no l'è registrâ.",
+ "authmanager-userlogin-remembermypassword-help": "Se a password a dev'ese aregordâ ciù a longo rispetto a-a duata da sescion.",
+ "authmanager-username-help": "Nome utente pe l'aotenticaçion.",
+ "authmanager-password-help": "Password pe l'aotenticaçion.",
+ "authmanager-domain-help": "Dominnio pe l'aotenticaçion esterna.",
+ "authmanager-retype-help": "Conferma torna a password.",
+ "authmanager-email-label": "E-mail",
+ "authmanager-email-help": "Addreçço e-mail:",
+ "authmanager-realname-label": "Nomme vêo:",
+ "authmanager-realname-help": "Nomme reale de l'utente",
+ "authmanager-provider-password": "Aotenticaçion basâ in sciâ password",
+ "authmanager-provider-password-domain": "Aotenticaçion con password ò con dominnio",
+ "authmanager-provider-temporarypassword": "Password temporannia",
+ "authprovider-confirmlink-message": "Basandose insce di reçenti tentativi d'accesso, e seguente utençe poeuan ese collegæ a-o to account wiki. Collegandole ti poeu effettuâ l'accesso con quelle ascì. Se prega de seleçionâ quelle che devan ese collegæ.",
+ "authprovider-confirmlink-request-label": "Utençe che dovieivan ese collegæ",
+ "authprovider-confirmlink-success-line": "$1: collegou correttamente.",
+ "authprovider-confirmlink-failed": "O collegamento de l'utença o no l'è pin-amente ariescio: $1",
+ "authprovider-confirmlink-ok-help": "Continnoa doppo a visualizzaçion di messaggi de errô de collegamento.",
+ "authprovider-resetpass-skip-label": "Sata",
+ "authprovider-resetpass-skip-help": "Sata a rempostaçion da password.",
+ "authform-nosession-login": "L'aotenticaçion a l'ha avuo successo, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê collegou.\n\n$1",
+ "authform-nosession-signup": "L'utença a l'è stæta creâ, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê collegou.\n$1",
+ "authform-newtoken": "Token mancante. $1",
+ "authform-notoken": "Token mancante",
+ "authform-wrongtoken": "Token errou",
+ "specialpage-securitylevel-not-allowed-title": "Non consentio",
+ "specialpage-securitylevel-not-allowed": "Spiaxenti, no t'ê aotorizzou a doeuviâ questa paggina perché a to identitæ a no poeu ese veificâ.",
+ "authpage-cannot-login": "Imposcibbile començâ co l'accesso.",
+ "authpage-cannot-login-continue": "Imposcibbile continoâ co l'accesso. L'è probabbile che a to sescion a segge descheita.",
+ "authpage-cannot-create": "Imposcibbile comença a creaçion de l'utença.",
+ "authpage-cannot-create-continue": "Imposcibbile continoâ co-a creaçion de l'utença. L'è probabbile che a to sescion a segge descheita.",
+ "authpage-cannot-link": "Imposcibbile inandiâ o collegamento de l'utença.",
+ "authpage-cannot-link-continue": "Imposcibbile continoâ co-o collegamento de l'utença. L'è probabbile che a to sescion a segge descheita.",
+ "cannotauth-not-allowed-title": "Permisso negou",
+ "cannotauth-not-allowed": "No t'ê aotorizou a doeuviâ questa paggina",
+ "changecredentials": "Modiffica credençiæ",
+ "changecredentials-submit": "Modiffica credençiæ",
+ "changecredentials-invalidsubpage": "$1 o no l'è 'na tipologia de credençiale vallida.",
+ "changecredentials-success": "E to credençiale son stæte modificæ.",
+ "removecredentials": "Rimoeuvi credençiæ",
+ "removecredentials-submit": "Rimoeuvi credençiæ",
+ "removecredentials-invalidsubpage": "$1 o no l'è 'na tipologia de credençiale vallida.",
+ "removecredentials-success": "E to credençiale son stæte rimosse.",
+ "credentialsform-provider": "Tipo de credençiale:",
+ "credentialsform-account": "Nomme utença:",
+ "cannotlink-no-provider-title": "Utençe collegabbile no ghe n'è",
+ "cannotlink-no-provider": "Utençe colegabbile no ghe n'è.",
+ "linkaccounts": "Collega utençe",
+ "linkaccounts-success-text": "L'utença a l'è stæta colegâ.",
+ "linkaccounts-submit": "Collega utençe",
+ "unlinkaccounts": "Scollega utençe",
+ "unlinkaccounts-success": "L'utença a l'è stæta scollegâ.",
+ "authenticationdatachange-ignored": "O cangiamento da dæta d'aotenticaçion o no l'è passou. Foscia che no gh'ea un provider configuou?"
}
"Mjbmr",
"Macofe",
"Huji",
- "Miladrahimi"
+ "Miladrahimi",
+ "Ebraminio"
]
},
"tog-underline": "کڕ(خط)کیشائن ژێر پیوندەل:",
"tagline": "دۀربارۀ {{SITENAME}}",
"help": "یاری کردن",
"search": "مِنِی کِردِن(گێردین)",
+ "search-ignored-headings": "#<!-- این صفحه را درست همانطور که هست رها کنید --> <pre>\n#سرفصلهایی که توسط تحقیق نادیده گرفته خواهندشد.\n#به محض اینکه صفحه با سرفصل، فهرست شدهاست،تغییرات متاثر میشود.\n#شما میتوانید با انجام یک ویرایش پوچ صفحه را وادار به دوباره فهرست کردن کنید.\n#نحو به شرح زیر است:\n# *همه چیز از یک خصیصهٔ \"#\" گرفته تا آخر خط، یک نظر است\n# *هر خط بدون فاصله، عنوان دقیق برای نادیده گرفتن،موضوع و همه چیز منابع است\nاتصالات خارجی\nهمچنین مشاهده کنید\n#</pre> <!-- leave this line exactly as it is -->",
"searchbutton": "مِنِی کِردِن(گێردین)",
"go": "بِچۆ",
"searcharticle": "بِچۆ",
"passwordreset-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
"passwordreset-emailsentemail": "اگر نشانی پست الکترونیکی که وارد کردید برای حساب کاربریتان ثبت شده باشد، یک نامهٔ بازنشانی گذرواژه به آن فرستاده میشود.",
"passwordreset-emailsentusername": "اگر نشانی پست الکترونیکی مرتبطی موجود باشد، یک نامه برای بازنشانی گذرواژه به آن ارسال خواهد شد.",
- "passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
- "passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیتآمیز نبود: $1",
"changeemail": "تغییر یا حذف نشانی ایمیل",
"changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
- "changeemail-passwordrequired": "برای تائید این تغییر باید گذرواژهتان را وارد کنید.",
"changeemail-no-info": ".برای دسترسی مستقیم به این صفحه شما باید به سیستم وارد شده باشید",
"changeemail-oldemail": ":نشانی ایمیل ایسة هؤمة",
"changeemail-newemail": ":نشانی ایمیل تازة",
"undo-nochange": "به نظر میرسد ویرایش از پیش واگردانی شده است.",
"undo-summary": "خنثیسازی ویرایش $1 توسط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])",
"undo-summary-username-hidden": "خنثیسازی نسخهٔ $1 به دست یک کاربر پنهانشده",
- "cantcreateaccounttitle": "نمیتوان حساب باز کرد",
"cantcreateaccount-text": "امكان ساختن حساب کاربری از این این نشانی آیپی ('''$1''') توسط [[User:$3|$3]] سلب شده است.\n\nدلیل ارائه شده توسط $3 چنین است: $2",
"cantcreateaccount-range-text": "ایجاد حساب از آدرس آیپی در مجموعهی <strong>$1</strong>، که شامل آدرس آیپی شما (<strong>$4</strong>) است، توسط [[User:$3|$3]] متوقف شدهاست.\nدلیل ارائه شده توسط $3، $2 است.",
"viewpagelogs": "نمایش سیاهههای این صفحه",
"tog-watchdefault": "Pridėti puslapius, kuriuos aš redaguoju, į stebimų sąrašą",
"tog-watchmoves": "Pridėti puslapius, kuriuos aš perkeliu, į stebimų sąrašą",
"tog-watchdeletion": "Pridėti puslapius, kuriuos aš ištrinu, į stebimų sąrašą",
+ "tog-watchuploads": "Pridėti naujus failus, kurios aš įkeliu, į mano stebimųjų sąrašą",
"tog-watchrollback": "Pridėti puslapius, kuriuose aš atlikau atmetimus į mano stebėjimo sąrašą",
"tog-minordefault": "Pagal nutylėjimą pažymėti redagavimus kaip smulkius",
"tog-previewontop": "Rodyti peržiūrą virš redagavimo lauko",
"tagline": "Iš {{SITENAME}}.",
"help": "Pagalba",
"search": "Paieška",
+ "search-ignored-headings": " #<!-- palikite šią eilutę tiksliai tokią, kokia ji yra --> <pre>\n# Antraštės, kurios bus ignoruojamos paieškų.\n# Pakeitimai įsigalios iš karto, kai bus suindeksuota puslapio antraštė.\n# Galite priversti perindeksuoti puslapį atlikdami tuščią pakeitimą.\n# Sintaksė tokia:\n# * Viskas nuo simbolio \"#\" iki eilutės pabaigos yra komentaras.\n# * Kiekviena netuščia eilutė yra tikslus pavadinimas, kurį reikia ignoruoti, tipas ir visa kita.\nNuorodos\nIšorinės nuorodos\nTaip pat žr.\n #</pre> <!-- palikite šią eilutę tiksliai tokią, kokia ji yra -->",
"searchbutton": "Paieška",
"go": "Rodyti",
"searcharticle": "Rodyti",
"password-change-forbidden": "Jus negalite keisti slaptažodžių šioje wiki.",
"externaldberror": "Yra arba išorinė autorizacijos duomenų bazės klaida arba jums neleidžiama atnaujinti jūsų išorinės paskyros.",
"login": "Prisijungti",
+ "login-security": "Patvirtinkite savo tapatybę",
"nav-login-createaccount": "Prisijungti / sukurti paskyrą",
"userlogin": "Prisijungti / sukurti paskyrą",
"userloginnocreate": "Prisijungti",
"userlogin-resetpassword-link": "Pamiršote savo slaptažodį?",
"userlogin-helplink2": "Padėti prisijungti",
"userlogin-loggedin": "Jūs jau prisijungęs kaip {{GENDER:$1|$1}}.\nNaudokite žemiau pateiktą pavidalą, kad prisijungtumėte kaip kitas naudotojas.",
+ "userlogin-reauth": "Turite vėl prisijungti patvirtinimui, kad esate {{GENDER:$1|$1}}.",
"userlogin-createanother": "Sukurti kitą paskyrą",
"createacct-emailrequired": "Elektroninio pašto adresas",
"createacct-emailoptional": "Elektroninio pašto adresas (neprivaloma)",
"createacct-email-ph": "Įveskite savo elektroninio pašto adresą",
"createacct-another-email-ph": "Įveskite elektroninio pašto adresą",
"createaccountmail": "Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.",
+ "createaccountmail-help": "Gali būti naudojamas paskyros sukūrimui kitam asmeniui, neatskleidžiant slaptažodžio.",
"createacct-realname": "Vardas (neprivaloma)",
"createaccountreason": "Priežastis:",
"createacct-reason": "Priežastis",
"createacct-reason-ph": "Kodėl kuriate kitą paskyrą",
+ "createacct-reason-help": "Pranešimas rodomas paskyros sukūrimo žurnale",
"createacct-submit": "Sukurkite savo paskyrą",
"createacct-another-submit": "Sukurti paskyrą",
+ "createacct-continue-submit": "Tęsti paskyros kūrimą",
+ "createacct-another-continue-submit": "Tęsti paskyros kūrimą",
"createacct-benefit-heading": "{{SITENAME}} sukurtas žmonių kaip jūs.",
"createacct-benefit-body1": "{{PLURAL:$1|keitimas|keitimai|keitimų}}",
"createacct-benefit-body2": "{{PLURAL:$1|puslapis|puslapiai}}",
"nocookiesnew": "Naudotojo paskyra buvo sukurta, bet jūs nesate prisijungęs. {{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos, tada prisijunkite su savo naujuoju naudotojo vardu ir slaptažodžiu.",
"nocookieslogin": "{{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos ir pamėginkite vėl.",
"nocookiesfornew": "Paskyra nebuvo sukurta, nes mums nepavyko nustatyti jos šaltinio.\nĮsitikinkite, kad įjungti slapukai (angl. cookies) ir tada bandykite dar kartą.",
+ "createacct-loginerror": "Paskyra buvo sėkmingai sukurta, bet nepavyko jūsų automatiškai prijungti. Prašome tęsti [[Special:UserLogin|prisijungiant rankiniu būdu]].",
"noname": "Jūs nesate nurodęs teisingo naudotojo vardo.",
"loginsuccesstitle": "Sėkmingai prisijungėte",
"loginsuccess": "'''Dabar jūs prisijungęs prie {{SITENAME}} kaip „$1“.'''",
"noemail": "Nėra jokio el. pašto adreso įvesto naudotojui „$1“.",
"noemailcreate": "Jūs turite nurodyti veikiantį el. pašto adresą",
"passwordsent": "Naujas slaptažodis buvo nusiųstas į el. pašto adresą,\nužregistruotą naudotojo „$1“.\nPrašome prisijungti vėl, kai jūs jį gausite.",
- "blocked-mailpassword": "Jūsų IP adresas yra užblokuotas nuo redagavimo, taigi neleidžiama naudoti slaptažodžio priminimo funkcijos, kad apsisaugotume nuo piktnaudžiavimo.",
+ "blocked-mailpassword": "Jūsų IP adresas yra užblokuotas nuo redagavimo. Kad užkirstume kelią piktnaudžiavimui neleidžiama naudoti slaptažodžio priminimo funkcijos iš šio IP adreso.",
"eauthentsent": "Patvirtinimo laiškas buvo nusiųstas į paskirtąjį el. pašto adresą.\nPrieš išsiunčiant kitą laišką į jūsų dėžutę, jūs turite vykdyti nurodymus laiške, kad patvirtintumėte, kad dėžutė tikrai yra jūsų.",
"throttled-mailpassword": "Slaptažodžio priminimas jau buvo išsiųstas, per {{PLURAL:$1|$1 paskutinę valandą|$1 paskutines valandas|$1 paskutinių valandų}}.\n\nNorint apsisaugoti nuo piktnaudžiavimo, slaptažodžio priminimas gali būti išsiųstas tik kas {{PLURAL:$1|$1 valandą|$1 valandas|$1 valandų}}.",
"mailerror": "Klaida siunčiant laišką: $1",
"createaccount-title": "{{SITENAME}} paskyros kūrimas",
"createaccount-text": "Projekte {{SITENAME}} ($4) kažkas sukūrė paskyrą „$2“ su slaptažodžiu „$3“ panaudodamas jūsų el. pašto adresą.\nJūs turėtumėte prisijungti ir pasikeisti savo slaptažodį.\n\nJūs galite nekreipti dėmesio į laišką, jei ši paskyra buvo sukurta per klaidą.",
"login-throttled": "Jūs pernelyg daug kartų bandėte prisijungti.\nPalaukite $1 prieš bandant vėl.",
- "login-abort-generic": "Jūsų prisijungimas buvo nesėkmingas - Nutraukta",
+ "login-abort-generic": "Jūsų prisijungimas nepavyko - Nutraukta",
"login-migrated-generic": "Jūsų paskyra buvo perkelta ir jūsų naudotojo vardo šioje wiki daugiau nebėra.",
"loginlanguagelabel": "Kalba: $1",
"suspicious-userlogout": "Jūsų prašymas atsijungti buvo atmestas, nes, atrodo, jį klaidingai išsiuntė naršyklė arba spartinantysis tarpinis serveris.",
"createacct-another-realname-tip": "Tikrojo vardo nurodyti nebūtina.\nJei pasirinksite jį nurodyti, jis bus naudojamas parodymui, kas atliko straipsnio papildymus.",
"pt-login": "Prisijungti",
"pt-login-button": "Prisijungti",
+ "pt-login-continue-button": "Tęsti prisijungimą",
"pt-createaccount": "Sukurti paskyrą",
"pt-userlogout": "Atsijungti",
"php-mail-error-unknown": "Nežinoma klaida PHP mail() funkcijoje",
"newpassword": "Naujas slaptažodis:",
"retypenew": "Pakartokite naują slaptažodį:",
"resetpass_submit": "Nustatyti slaptažodį ir prisijungti",
- "changepassword-success": "Jūsų slaptažodis pakeistas sėkmingai!",
+ "changepassword-success": "Jūsų slaptažodis buvo pakeistas!",
"changepassword-throttled": "Jūs pastaruoju metu atlikote pernelyg daug bandymų prisijungti. Prašome luktelėti $1 prieš bandant iš naujo.",
"botpasswords": "Boto slaptažodžiai",
"botpasswords-summary": "<em>Boto slaptažodžiai</em> leidžia pasiekti naudotojo paskyrą per API, nenaudojant paskyros pagrindinio prisijungimo įgaliojimų. Naudotojo teisės prieinamos būnant prisijungus su boto slaptažodžiu gali būti apribotos.\n\nJeigu nežinote kodėl galite norėti tai daryti, jūs tikriausiai neturėtumėte to daryti. Niekas jūsų neturėtų prašyti sugeneruoti vieno ir perduoti jiems.",
"botpasswords-invalid-name": "Nurodytame naudotojo varde nėra boto slaptažodžio skirtuko (\"$1\").",
"botpasswords-not-exist": "Naudotojas \"$1\" neturi boto \"$2\" slaptažodžio.",
"resetpass_forbidden": "Slaptažodžiai negali būti pakeisti",
+ "resetpass_forbidden-reason": "Slaptažodžiai negali būti pakeisti: $1",
"resetpass-no-info": "Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.",
"resetpass-submit-loggedin": "Keisti slaptažodį",
"resetpass-submit-cancel": "Atšaukti",
- "resetpass-wrong-oldpass": "Klaidingas laikinas ar esamas slaptažodis.\nJūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikiną slaptažodį.",
+ "resetpass-wrong-oldpass": "Klaidingas laikinas ar esamas slaptažodis.\nJūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar jau prašėte naujo laikino slaptažodžio.",
"resetpass-recycled": "Atkurkite savo slaptažodį kitokiu, nei buvo prieš tai.",
"resetpass-temp-emailed": "Jūs prisijungęs laikinu slaptažodžiu, gautu per elektroninį paštą. Kad baigtumėte jungtis, čia turite nustatyti naują slaptažodį:",
"resetpass-temp-password": "Laikinas slaptažodis:",
"passwordreset-emailelement": "Naudotojo vardas: \n$1\n\nLaikinas slaptažodis: \n$2",
"passwordreset-emailsentemail": "Jeigu šis el. pašto adresas yra susietas su jūsų paskyra, tada slaptažodžio atkūrimo laiškas bus išsiųstas.",
"passwordreset-emailsentusername": "Jeigu buvo el. paštas susietas su šiuo naudotojo vardu, tai slaptažodžio atkūrimo el. laiškas bus išsiųstas.",
- "passwordreset-emailsent-capture": "Slaptažodžio priminimo laiškas bus išsiųstas, toks koks parodytas.",
- "passwordreset-emailerror-capture": "Priminimo elektroninis laiškas buvo sukurtas, toks, koks parodytas žemiau, bet pasiuntimas naudotojui buvo nesėkmingas: $1",
+ "passwordreset-emailsent-capture2": "Slaptažodžio keitimo {{PLURAL:$1|el. laiškas buvo išsiųstas|el. laiškai buvo išsiųsti}}. {{PLURAL:$1|vartotojo vardas ir slaptažodis rodomi|vartotojų vardų ir slaptažodžių sąrašas rodomas}} žemiau.",
+ "passwordreset-emailerror-capture2": "El. laiško siuntimas {{GENDER:$2|vartotojui}} nepavyko: $1 {{PLURAL:$3|vartotojo vardas ir slaptažodis rodomi|vartotojų vardų ir slaptažodžių sąrašas rodomas}} žemiau.",
+ "passwordreset-nocaller": "Skambinantysis turi būti nurodytas",
+ "passwordreset-nosuchcaller": "Skambinantysis neegzistuoja: $1",
+ "passwordreset-invalideamil": "Neteisingas el. pašto adresas",
+ "passwordreset-nodata": "Vartotojo vardas ir el. paštas buvo nepateikti",
"changeemail": "Pakeisti ar pašalinti el. pašto adresą",
"changeemail-header": "Užpildykite šią formą, kad pakeistumėte savo el. pašto adresą. Jeigu norite pašalinti bet kurio el. pašto adreso susiejimą su savo paskyra, palikite naujojo el. pašto adreso lauką tuščią, kai pateiksite formą.",
- "changeemail-passwordrequired": "Jums reikės įvesti savo slaptažodį, kad patvirtintumėte šį pakeitimą.",
"changeemail-no-info": "Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.",
"changeemail-oldemail": "Dabartinis el. pašto adresas:",
"changeemail-newemail": "Naujas el. pašto adresas:",
"minoredit": "Tai smulkus pataisymas",
"watchthis": "Stebėti šį puslapį",
"savearticle": "Išsaugoti puslapį",
+ "savechanges": "Išsaugoti pakeitimus",
"publishpage": "Skelbti puslapį",
+ "publishchanges": "Skelbti pakeitimus",
"preview": "Peržiūra",
"showpreview": "Rodyti peržiūrą",
"showdiff": "Rodyti skirtumus",
"undo-nochange": "Panašu, kad keitimas jau buvo atšauktas.",
"undo-summary": "Atšauktas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) keitimas ($1 versija)",
"undo-summary-username-hidden": "Atmesti versiją $1, atliktą paslėpto naudotojo",
- "cantcreateaccounttitle": "Paskyrų kūrimas negalimas",
"cantcreateaccount-text": "Paskyrų kūrimą iš šio IP adreso ('''$1''') užblokavo [[User:$3|$3]].\n\n$3 nurodyta priežastis yra ''$2''",
"cantcreateaccount-range-text": "Naudotojas [[User:$3|$3]] nustatė draudimą kurti paskyras iš IP adresų plotmės <strong>$1</strong>, į kurią patenka ir jūsiškis IP adresas (<strong>$4</strong>).",
"viewpagelogs": "Rodyti šio puslapio specialiuosius veiksmus",
"mergehistory-empty": "Versijos negali būti sujungtos",
"mergehistory-done": "$3 $1 {{PLURAL:$3|versija|versijos|versijų}} sėkmingai {{PLURAL:$3|sujungta|sujungtos|sujungta}} su [[:$2]].",
"mergehistory-fail": "Nepavyksta atlikti istorijų sujungimo, prašome patikrinti puslapio ir laiko parametrus.",
+ "mergehistory-fail-bad-timestamp": "Laiko nuoroda negalima.",
+ "mergehistory-fail-invalid-source": "Šaltinio puslapis negalima.",
"mergehistory-fail-invalid-dest": "Paskirties puslapis yra neteisingas.",
+ "mergehistory-fail-permission": "Nepakanka teisių istorijai sujungti.",
+ "mergehistory-fail-self-merge": "Šaltinio ir tikslo puslapiai yra vienodi",
"mergehistory-fail-toobig": "Nepavyksta sulieti istorijos, nes būtina pernešti daugiau, nei leidžia $1 riba, {{PLURAL:$1|versijos|versijų}}.",
"mergehistory-no-source": "Šaltinio puslapis $1 neegzistuoja.",
"mergehistory-no-destination": "Rezultato puslapis $1 neegzistuoja.",
"userrights-changeable-col": "Grupės, kurias galite keisti",
"userrights-unchangeable-col": "Grupės, kurių negalite keisti",
"userrights-conflict": "Naudotojo teisių konfliktas! Prašome dar kartą taikyti savo keitimus.",
- "userrights-removed-self": "Jūs sėkmingai panaikinote savo paties teises. Taigi, daugiau nebegalite pasiekti šio puslapio.",
+ "userrights-removed-self": "Jūs pašalinote savo paties teises. Taigi, nebegalite pasiekti šio puslapio.",
"group": "Grupė:",
"group-user": "Naudotojai",
"group-autoconfirmed": "Automatiškai patvirtinti naudotojai",
"right-override-export-depth": "Eksportuoti puslapius įtraukiant susietus puslapius iki 5 lygio gylio",
"right-sendemail": "Siųsti el. laišką kitiems naudotojams",
"right-passwordreset": "Peržiūrėti slaptažodžio pakeitimo e-mail laiškus",
- "right-managechangetags": "Kurti ir ištrinti [[Special:Tags|žymes]] iš duomenų bazės",
+ "right-managechangetags": "Kurti ir (de)aktyvuoti [[Special:Tags|žymes]]",
"right-applychangetags": "Taikyti [[Special:Tags|žymes]] kartu su pokyčiais",
"right-changetags": "Pridėti ir ištrinti savavališkus [[Special:Tags|žymes]] individualiuose pakeitimuose ir žurnalo įrašuose",
+ "right-deletechangetags": "Ištrinti [[Special:Tags|žymes]] iš duomenų bazės",
"grant-generic": "\"$1\" teisių rinkinys",
"grant-group-page-interaction": "Sąveikauti su puslapiais",
"grant-group-file-interaction": "Sąveikauti su medija",
"rightslogtext": "Pateikiamas naudotojų teisių pakeitimų sąrašas.",
"action-read": "skaityti šį puslapį",
"action-edit": "keisti šį puslapį",
- "action-createpage": "kurti puslapius",
- "action-createtalk": "kurti aptarimų puslapius",
+ "action-createpage": "kurti šį puslapį",
+ "action-createtalk": "sukurti šį diskusijų puslapį",
"action-createaccount": "kurti šią naudotojo paskyrą",
"action-autocreateaccount": "Automatiškai sukurti šią išorinę naudotojo paskyrą",
"action-history": "peržiūrėti šio puslapio istoriją",
"action-viewmyprivateinfo": "peržiūrėti jūsų privačią informaciją",
"action-editmyprivateinfo": "redaguoti savo privačią informaciją",
"action-editcontentmodel": "redaguoti puslapio turinio modelį",
- "action-managechangetags": "sukurti ir ištrinti žymes duomenų bazėje",
+ "action-managechangetags": "kurti ir (de)aktyvuoti žymes",
"action-applychangetags": "taikyti žymes kartu su savo pokeitymais",
"action-changetags": "pridėti ir ištrinti savavališkas žymes individualiuose pakeitimuose ir žurnalo įrašuose",
+ "action-deletechangetags": "trinti žymes iš duomenų bazės",
"nchanges": "$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|nuo paskutinio apsilankymo}}",
"enhancedrc-history": "istorija",
"apisandbox-dynamic-parameters-add-placeholder": "Parametro pavadinimas",
"apisandbox-dynamic-error-exists": "Parametras, pavadinimu „$1“ jau yra.",
"apisandbox-deprecated-parameters": "Nebenaudojami parametrai",
+ "apisandbox-fetch-token": "Automatiškai užpildyti žetoną",
"apisandbox-submit-invalid-fields-title": "Kai kurie laukai yra neteisingi",
+ "apisandbox-submit-invalid-fields-message": "Prašome pataisyti pažymėtus laukus ir bandyti dar kartą.",
"apisandbox-results": "Rezultatai",
+ "apisandbox-sending-request": "API prašymas siunčiamas...",
+ "apisandbox-loading-results": "API rezultatai gaunami...",
"apisandbox-request-url-label": "Prašyti URL:",
- "apisandbox-request-time": "Užklausos laikas: $1",
+ "apisandbox-request-time": "Užklausos laikas: {{PLURAL:$1|$1 ms}}",
+ "apisandbox-results-fixtoken": "Pataisykite žetoną ir pateikite iš naujo",
+ "apisandbox-results-fixtoken-fail": "Nepavyko gauti „$1“ žetono.",
+ "apisandbox-alert-page": "Laukai šiame puslapyje yra negalimi.",
"apisandbox-alert-field": "Šio lauko reikšmė yra neteisinga.",
"booksources": "Knygų šaltiniai",
"booksources-search-legend": "Knygų šaltinių paieška",
"log-edit-tags": "Redaguoti žymes pasirinktuose žurnalo įrašuose",
"checkbox-select": "Pasirinkti: $1",
"checkbox-all": "Visi",
- "checkbox-none": "Nieko",
- "checkbox-invert": "Invertuoti",
+ "checkbox-none": "Nieka",
+ "checkbox-invert": "Apmainītė vėituom",
"allpages": "Visi puslapiai",
"nextpage": "Kitas puslapis ($1)",
"prevpage": "Ankstesnis puslapis ($1)",
"changecontentmodel-success-text": "Turinys, kurio tipas [[:$1]], buvo atnaujintas.",
"changecontentmodel-cannot-convert": "Turinys [[:$1]] negali būti konvertuotas į $2 tipą.",
"changecontentmodel-nodirectediting": "$1 turinio modelis nepalaiko tiesioginio redagavimo",
+ "changecontentmodel-emptymodels-title": "Nėra prieinamų turinio modelių",
"log-name-contentmodel": "Turinio modelio kaitos istorija",
"log-description-contentmodel": "Įvykiai susiję su puslapio turinio modeliu",
"logentry-contentmodel-change": "$1 {{GENDER:$2|atnaujino}} puslapio $3 turinio modelį iš $4 į $5",
"sp-contributions-username": "IP adresas arba naudotojo vardas:",
"sp-contributions-toponly": "Rodyti tik paskutinius keitimus",
"sp-contributions-newonly": "Rodyti tik tuos keitimus, kuriais sukurti nauji straipsniai",
+ "sp-contributions-hideminor": "Slėpti nedidelius pakeitimus",
"sp-contributions-submit": "Ieškoti",
"whatlinkshere": "Susiję puslapiai",
"whatlinkshere-title": "Puslapiai, kurie nurodo į „$1“",
"lockdbsuccesstext": "Duomenų bazė buvo užrakinta.\n<br />Nepamirškite [[Special:UnlockDB|pašalinti užraktą]], kai techninė profilaktika bus baigta.",
"unlockdbsuccesstext": "Duomenų bazė buvo atrakinta.",
"lockfilenotwritable": "Duomenų bazės užrakto failas nėra įrašomas. Norint užrakinti ar atrakinti duomenų bazę, tinklapio serveris privalo turėti įrašymo teises šiam failui.",
+ "databaselocked": "Duomenų bazėje jau yra užrakinta.",
"databasenotlocked": "Duomenų bazė neužrakinta.",
"lockedbyandtime": "(užrakino {{GENDER:$1|$1}}, diena $2, laikas $3)",
"move-page": "Pervadinti $1",
"confirmemail_body_set": "Kažkas (tikriausiai jūs) iš IP adreso $1,\nnustatė svetainės {{SITENAME}} paskyros „$2“ elektroninio pašto adresą į jūsiškį.\n\nKad patvirtintumėte, kad ši paskyra tikrai priklauso jums ir tokiu būdu aktyvuotumėte\nelektroninio pašto galimybes svetainėje {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:\n\n$3\n\nJei paskyra jums *nepriklauso*, spauskite šią nuorodą,\nkad atšauktumėte elektroninio pašto adreso patvirtinimą:\n\n$5\n\nŠis patvirtinimo kodas baigs galioti $4.",
"confirmemail_invalidated": "El. pašto adreso patvirtinimas atšauktas",
"invalidateemail": "El. pašto patvirtinimo atšaukimas",
+ "notificationemail_subject_changed": "{{SITENAME}} užregistruotas el. pašto adresas buvo pakeistas",
+ "notificationemail_subject_removed": "{{SITENAME}} užregistruotas el. pašto adresas buvo pašalintas",
"scarytranscludedisabled": "[Tarpprojektinis įterpimas yra išjungtas]",
"scarytranscludefailed": "[Šablono gavimas iš $1 nepavyko]",
"scarytranscludefailed-httpstatus": "[Šablono iškviesti nepavyko $1: HTTP $2]",
"confirm-watch-top": "Pridėti šį puslapį į stebimųjų sąrašą?",
"confirm-unwatch-button": "Gerai",
"confirm-unwatch-top": "Pašalinti šį puslapį iš jūsų stebimųjų sąrašo?",
+ "confirm-rollback-button": "Gerai",
"quotation-marks": "„$1“",
"imgmultipageprev": "← ankstesnis puslapis",
"imgmultipagenext": "kitas puslapis →",
"mw-widgets-dateinput-no-date": "Nepasirinkta data",
"mw-widgets-titleinput-description-new-page": "puslapis dar neegzistuoja",
"mw-widgets-titleinput-description-redirect": "nukreipti į $1",
- "api-error-blacklisted": "Prašome pasirinkti kitą, aprašomąją antraštę.",
"sessionmanager-tie": "Negalima kombinuoti kelių užklausų autentikacijos tipų: $1.",
"sessionprovider-generic": "$1 sesijos",
"sessionprovider-mediawiki-session-cookiesessionprovider": "sesijos su slapukais",
"sessionprovider-nocookies": "Slapukai gali būti neaktyvuoti. Įsitikinkite, kad slapukai yra aktyvuoti ir pradėkite vėl.",
"randomrootpage": "Atsitiktinis šakninis puslapis",
+ "log-action-filter-block": "Blokavimo tipas:",
+ "log-action-filter-delete": "Trynimo tipas:",
+ "log-action-filter-import": "Importo tipas:",
+ "log-action-filter-managetags": "Žymės tvarkymo veiksmo tipas:",
+ "log-action-filter-move": "Kėlimo tipas:",
+ "log-action-filter-newusers": "Paskyros kūrimo tipas:",
+ "log-action-filter-protect": "Apsaugos tipas:",
+ "log-action-filter-rights": "Teisių tipo keitimas:",
+ "log-action-filter-upload": "Įkėlimo tipas:",
"log-action-filter-all": "Visi",
+ "log-action-filter-block-block": "Blokas",
+ "log-action-filter-block-reblock": "Blokavimo pakeitimas",
+ "log-action-filter-block-unblock": "Atblokuoti",
+ "log-action-filter-delete-delete": "Puslapio trynimas",
+ "log-action-filter-delete-restore": "Puslapio trynimo atšaukimas",
+ "log-action-filter-delete-event": "Žurnalo trynimas",
+ "log-action-filter-delete-revision": "Peržiūros trynimas",
+ "log-action-filter-managetags-create": "Žymės kūrimas",
+ "log-action-filter-managetags-delete": "Žymės trynimas",
+ "log-action-filter-managetags-activate": "Žymės aktyvavimas",
+ "log-action-filter-managetags-deactivate": "Žymės deaktyvavimas",
"log-action-filter-newusers-autocreate": "Automatinis kūrimas",
- "log-action-filter-protect-protect": "Apsauga"
+ "log-action-filter-protect-protect": "Apsauga",
+ "log-action-filter-upload-upload": "Naujas įkėlimas",
+ "log-action-filter-upload-overwrite": "Kelti iš naujo",
+ "authmanager-authplugin-setpass-bad-domain": "Negalimas domenas.",
+ "authmanager-autocreate-noperm": "Automatinis paskyros kūrimas neleidžiamas.",
+ "authmanager-autocreate-exception": "Automatinis paskyros kūrimas laikinai neleidžiamas dėl ankstesnių klaidų.",
+ "authmanager-userdoesnotexist": "Vartotojo paskyrą „$1“ nėra registruota.",
+ "authmanager-userlogin-remembermypassword-help": "Ar slaptažodis turėtų būti išsaugotas ilgesniam laikui nei ši sesija.",
+ "authmanager-username-help": "Vartotojo vardas dėl autentikacijos.",
+ "authmanager-password-help": "Slaptažodis dėl autentikacijos.",
+ "authmanager-domain-help": "Domenas dėl išorinės autentikacijos.",
+ "authmanager-retype-help": "Slaptažodį dar kartą, kad patvirtintumėte.",
+ "authmanager-email-label": "El. paštas",
+ "authmanager-email-help": "El. pašto adresas",
+ "authmanager-realname-label": "Tikras vardas",
+ "authmanager-realname-help": "Tikras vartotojo vardas",
+ "authmanager-provider-password": "Autentifikacija slaptažodžiu",
+ "authmanager-provider-password-domain": "Autentifikavimas slaptažodžiu ir domenu",
+ "authmanager-provider-temporarypassword": "Laikinas slaptažodis",
+ "authprovider-confirmlink-request-label": "Paskyros, kurios turėtų būti susietos",
+ "authprovider-confirmlink-success-line": "$1: Susieta sėkmingai.",
+ "authprovider-confirmlink-failed": "Paskyros susiejimas nebuvo visiškai sėkmingas: $1",
+ "authprovider-confirmlink-ok-help": "Tęsti po susiejimo klaidos žinutės parodymo.",
+ "authprovider-resetpass-skip-label": "Praleisti",
+ "authprovider-resetpass-skip-help": "Praleisti slaptažodžio perstatymą.",
+ "specialpage-securitylevel-not-allowed-title": "Neleidžiama",
+ "cannotauth-not-allowed-title": "Teisė nesuteikta",
+ "cannotauth-not-allowed": "Jūs negalite naudotis šiuo puslapiu",
+ "linkaccounts": "Susieti paskyras",
+ "linkaccounts-success-text": "Paskyra buvo susieta.",
+ "linkaccounts-submit": "Susieti paskyras",
+ "unlinkaccounts": "Atsieti paskyras",
+ "unlinkaccounts-success": "Paskyra buvo atsieta."
}
"tagline": "No ''{{grammar:ģenitīvs|{{SITENAME}}}}''",
"help": "Palīdzība",
"search": "Meklēt",
+ "search-ignored-headings": " #<!-- atstāt šo rindiņu tādu, kāda tā ir --> <pre>\n#Virsraksti, kas tiks ignorēti meklējot.\n#Izmaiņas stāsies spēkā, kad lapa ar virsrakstiem ir indeksēta.\n#Jūs varat piespiest lapai tikt indeksētai vēlreiz ar nulles labojumu.\n#Sintakse:\n# * Jebkas no \"#\" zīmes līdz rindiņas beigām ir komentārs.\n# * Katra līnija ir precīzs ignorējamais virsraksts, ieskaitot lielos / mazos burtus.\nAtsauces\nĀrējās saites\nSkatīt arī\n #</pre> <!-- atstāt šo rindiņu tādu, kāda tā ir -->",
"searchbutton": "Meklēt",
"go": "Aiziet!",
"searcharticle": "Aiziet!",
"resetpass_submit": "Uzstādīt paroli un ieiet",
"changepassword-success": "Tava parole tika nomainīta!",
"botpasswords": "Botu paroles",
+ "botpasswords-disabled": "Botu paroles ir atspējotas.",
"botpasswords-existing": "Esošās botu paroles",
"botpasswords-createnew": "Izveidot jaunu bota paroli",
"botpasswords-editexisting": "Rediģētu esošu bota paroli",
"passwordreset-emailtitle": "Konta informācija {{SITENAME}}",
"passwordreset-emailelement": "Lietotājvārds: \n$1\n\nPagaidu parole: \n$2",
"passwordreset-emailsentemail": "Paroles atiestatīšanas e-pasts ir nosūtīts.",
- "passwordreset-emailsent-capture": "Atgādinājuma e-pasta ziņojums ir nosūtīts, tas parādīts zemāk.",
- "passwordreset-emailerror-capture": "Atgādinājuma e-pasta ziņojums tika izveidots, tas parādīts zemāk, bet nosūtīšana lietotājam neizdevās: $1",
"passwordreset-nosuchcaller": "Izsaucējs nepastāv: $1",
"passwordreset-invalideamil": "Nederīga e-pasta adrese",
"changeemail": "Mainīt e-pasta adresi",
"minoredit": "Maznozīmīgs labojums",
"watchthis": "Uzraudzīt šo lapu",
"savearticle": "Saglabāt lapu",
+ "savechanges": "Saglabāt izmaiņas",
"publishpage": "Saglabāt lapu",
"publishchanges": "Publicēt izmaiņas",
"preview": "Pirmskats",
"undo-failure": "Šo labojumu nevar atcelt, jo ir veikti nozīmīgi labojumi vēl pēc šī labojuma izdarīšanas.",
"undo-norev": "Šo izmaiņu nevar atcelt, jo tādas nav vai tā ir izdzēsta.",
"undo-summary": "Atcēlu [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusija]]) izdarīto izmaiņu $1",
- "cantcreateaccounttitle": "Nevar izveidot dalībnieku",
"cantcreateaccount-text": "[[Lietotājs:$3|$3]] ir bloķējis lietotāja izveidošanu no šīs IP adreses ('''$1''').\n\n$3 norādītais iemesls ir ''$2''",
"viewpagelogs": "Apskatīt ar šo lapu saistītos reģistru ierakstus",
"nohistory": "Šai lapai nav pieejama versiju hronoloģija.",
"grant-group-email": "Sūtīt e-pastu",
"grant-createaccount": "Izveidot kontu",
"grant-editmywatchlist": "Labot uzraugāmo rakstu sarakstu",
+ "grant-editpage": "Labot esošās lapas",
+ "grant-editprotected": "Labot aizsargātās lapas",
+ "grant-basic": "Pamattiesības",
+ "grant-viewdeleted": "Skatīt dzēstos failus un lapas",
"newuserlogpage": "Jauno dalībnieku reģistrs",
"newuserlogpagetext": "Jauno lietotājvārdu reģistrs.",
"rightslog": "Dalībnieku tiesību reģistrs",
"action-read": "lasīt šo lapu",
"action-edit": "labot šo lapu",
"action-createpage": "izveidot šo lapu",
- "action-createtalk": "izveidot diskusiju lapas",
+ "action-createtalk": "izveidot šo diskusiju lapu",
"action-createaccount": "izveidot šo dalībnieka kontu",
"action-history": "apskatīt šīs lapas vēsturi",
"action-minoredit": "atzīmēt šo labojumu kā maznozīmīgu",
"rcshowhidemine": "$1 manus",
"rcshowhidemine-show": "Rādīt",
"rcshowhidemine-hide": "Slēpt",
+ "rcshowhidecategorization": "$1 lapu kategorizēšanu",
"rcshowhidecategorization-show": "Rādīt",
"rcshowhidecategorization-hide": "Paslēpt",
"rclinks": "Parādīt pēdējās $1 izmaiņas pēdējās $2 dienās.<br />$3",
"upload-dialog-button-save": "Saglabāt",
"upload-dialog-button-upload": "Augšupielādēt",
"upload-form-label-infoform-title": "Papildinformācija",
+ "upload-form-label-infoform-name": "Nosaukums",
"upload-form-label-infoform-description": "Apraksts",
"upload-form-label-usage-title": "Pielietojums",
"upload-form-label-usage-filename": "Faila nosaukums",
+ "upload-form-label-own-work": "Šis ir manis paša darbs",
"upload-form-label-infoform-categories": "Kategorijas",
"upload-form-label-infoform-date": "Datums",
"backend-fail-stream": "Nevar straumēt failu $1.",
"backend-fail-read": "Nevar lasīt failu $1.",
"backend-fail-create": "Nevar izveidot failu $1.",
"zip-wrong-format": "Norādītais fails nebija ZIP fails.",
- "uploadstash-errclear": "Failu tīrīšana bija neveiksmīga.",
+ "uploadstash-errclear": "Failu tīrīšana neizdevās.",
"uploadstash-refresh": "Atsvaidzināt failu sarakstu",
"img-auth-accessdenied": "Pieeja liegta",
"img-auth-nopathinfo": "Trūkst PATH_INFO.\nJūsu serveris nav konfigurēts nodot šo informāciju.\nTas var būt bāzēts uz CGI un neatbalstīt img_auth.\nSkatīt https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
"alllogstext": "Visi pieejamie {{grammar:akuzatīvs{{SITENAME}}}} reģistri.\nTu vari sašaurināt aplūkojamo reģistru, izvēloties reģistra veidu, lietotāja vārdu vai reģistrēto lapu. Visi teksta lauki izšķir lielos un mazos burtus.",
"logempty": "Reģistrā nav atbilstošu ierakstu.",
"log-title-wildcard": "Meklēt virsrakstus, kas sākas ar šo tekstu",
+ "checkbox-select": "Izvēlēties: $1",
+ "checkbox-all": "Visus",
+ "checkbox-none": "Nevienu",
+ "checkbox-invert": "Otrādi",
"allpages": "Visas lapas",
"nextpage": "Nākamā lapa ($1)",
"prevpage": "Iepriekšējā lapa ($1)",
"mailnologin": "Nav adreses, uz kuru sūtīt",
"mailnologintext": "Tev jābūt [[Special:UserLogin|iegājušam]], kā arī tev jābūt [[Special:Preferences|norādītai]] derīgai e-pasta adresei, lai sūtītu e-pastu citiem lietotājiem.",
"emailuser": "Sūtīt e-pastu šim lietotājam",
- "emailuser-title-target": "Nosūtīt e-pastu {{GENDER:$1|šim lietotājam|šai lietotājai}}",
+ "emailuser-title-target": "Nosūtīt e-pastu {{GENDER:$1|šim dalībniekam|šai dalībniecei}}",
"emailuser-title-notarget": "Sūtīt e-pastu lietotājam",
"emailpagetext": "Ar šo veidni ir iespējams nosūtīt e-pastu šim {{GENDER:$1|lietotājam}}.\nTā e-pasta adrese, kuru tu esi norādījis [[Special:Preferences|savā izvēļu lapā]], parādīsies e-pasta \"From\" lauciņā, tādejādi saņēmējs varēs tev atbildēt.",
"defemailsubject": "{{SITENAME}} e-pasts no lietotāja \"$1\"",
"wlheader-enotif": "E-pasta paziņojumi ir ieslēgti.",
"wlheader-showupdated": "Lapas, kuras ir tikušas izmainītas, kopš tu tās pēdējoreiz apskatījies, te rādās ar '''pustrekniem''' burtiem",
"wlshowlast": "Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī .",
+ "watchlist-hide": "Slēpt",
+ "watchlist-submit": "Rādīt",
"wlshowhidebots": "boti",
"wlshowhideliu": "reģistrēti lietotāji",
"wlshowhideanons": "anonīmi lietotāji",
"rollback-success": "Novērsu izmaiņas, ko izdarīja $1;\natjaunoju versiju, ko saglabāja $2.",
"sessionfailure-title": "sesijas kļūda",
"sessionfailure": "Ir radusies problēma ar sesijas autentifikāciju;\nšī darbība ir atcelta, lai novērstu lietotājvārda iespējami ļaunprātīgu izmantošanu.\nLūdzu, spied \"''back''\" un atjaunini iepriekšējo lapu. Tad mēģini vēlreiz.",
+ "changecontentmodel-title-label": "Lapas nosaukums",
"changecontentmodel-reason-label": "Iemesls:",
"changecontentmodel-submit": "Mainīt",
"protectlogpage": "Aizsargāšanas reģistrs",
"飞舞回堂前",
"Macofe",
"Bowleerin",
- "SolidBlock"
+ "SolidBlock",
+ "Suchichi02"
]
},
"tog-underline": "鏈墊線:",
"editthispage": "纂",
"create-this-page": "立",
"delete": "刪",
- "deletethispage": "刪",
+ "deletethispage": "刪是頁",
"undeletethispage": "反刪此頁",
"undelete_short": "還$1已刪",
"viewdeleted_short": "察$1已刪",
"edit-conflict": "纂突。",
"edit-no-change": "爾之纂已略,由字無改也。",
"postedit-confirmation-created": "其頁已建。",
- "postedit-confirmation-saved": "汝之纂已成",
+ "postedit-confirmation-saved": "汝之纂已成。",
"edit-already-exists": "不建新頁。\n已存也。",
"defaultmessagetext": "慣話文",
"content-model-text": "純文本",
"rcshowhidemine": "$1吾纂",
"rcshowhidemine-show": "示",
"rcshowhidemine-hide": "藏",
+ "rcshowhidecategorization-show": "示",
+ "rcshowhidecategorization-hide": "藏",
"rclinks": "$2日內$1近易。<br />$3",
"diff": "辨",
"hist": "誌",
"rc_categories_any": "任",
"rc-change-size-new": "既纂,本文有$1字節",
"newsectionsummary": "/* $1 */ 新節",
- "rc-enhanced-expand": "示細(要 JavaScript)",
+ "rc-enhanced-expand": "示細",
"rc-enhanced-hide": "藏細",
"recentchangeslinked": "援引",
"recentchangeslinked-feed": "援引",
"contributions": "功績",
"contributions-title": "$1之功績",
"mycontris": "吾績",
+ "anoncontribs": "績",
"contribsub2": "$1勛($2)",
"nocontribs": "無勛及也。",
"uctop": "(至頂)",
"whatlinkshere-prev": "前$1",
"whatlinkshere-next": "次$1",
"whatlinkshere-links": "←佐",
- "whatlinkshere-hideredirs": "$1轉",
+ "whatlinkshere-hideredirs": "$1渡",
"whatlinkshere-hidetrans": "$1含",
"whatlinkshere-hidelinks": "$1佐",
"whatlinkshere-hideimages": "$1檔佐",
"intentionallyblankpage": "此頁為白也,試速之用",
"external_image_whitelist": " #同留<pre>\n#下(中之//)乃正表式\n#乃外(連)圖配之\n#配乃成像,非配則成連\n#有 # 之為注\n#無為大小之異也\n\n#入正表式。同留</pre>",
"tag-filter": "[[Special:Tags|標]] 之濾:",
- "tag-list-wrapper": "([[Special:Tags|簽]]: $2)",
+ "tag-list-wrapper": "([[Special:Tags|$1簽]]: $2)",
"tags-title": "標",
"tags-tag": "標名",
"tags-source-header": "源",
"sqlite-no-fts": "$1 不含全文之尋",
"revdelete-restricted": "應限至有秩",
"revdelete-unrestricted": "除限自有秩",
+ "logentry-newusers-create": "簿$1已{{GENDER:$2|增}}。",
"rightsnone": "(凡)",
"revdelete-summary": "摘",
"searchsuggest-search": "尋",
"सरोज कुमार ढकाल",
"Bijay chaurasia",
"Tulsi Bhagat",
- "Macofe"
+ "Macofe",
+ "राम प्रसाद जोशी"
]
},
"tog-underline": "लिङ्कके रेखाङ्कित करी:",
"passwordreset-emailtext-user": "प्रयोक्ता $1 {{अन्तर्जाल}} पर अहाँक खाता विवरणक {{SITENAME}} लेल फेरसँ ($4) आग्रह केने छथि। ई प्रयोक्ता {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ऐ ई-पत्र संकेतसँ जुड़ल: $2\n{{PLURAL:$3| ई अस्थायी कूटशब्द|ई सभ अस्थायी कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द आब चुनू। जँ कियो दोसर ई आग्रह केने छथि, वा जँ अहाँकेँ अपन मूल कूटशब्द मोन पड़ि गेल अछि, आ अहाँ आब ओइ कूटशब्दकेँ नै बदलऽ चाहै छी, अहाँ ऐ संदेशकेँ बिसरि सकै छी आ अपन पुरान कूटशब्दक प्रयोग जारी राखि सकै छी।",
"passwordreset-emailelement": "प्रयोक्ता: \n$1\n\nअस्थायी कूटशब्द: \n$2",
"passwordreset-emailsentemail": "एकटा ई-पत्र मोन पाड़बा लेल पठाओल गेल अछि।",
- "passwordreset-emailsent-capture": "एकटा स्मरण ई-पत्र पठाएल गेल अछि, जे नीचाँ देखाएल अछि।",
- "passwordreset-emailerror-capture": "एकटा स्मरण ई-पत्र बनाएल गेल अछि, जे नीचाँ देखाएल अछि, मुदा प्र्योक्ताकेँ एकरा पठेबाक प्रयास विफल भेल: $1",
"changeemail": "ई-मेल पता परिवर्तित करी",
"changeemail-header": "अपन ईमेल पता परिवर्तन हेतु एकरा पुरा करी। यदि अहाँ अपन वर्तमान ईमेल पता हटाबैलेल चाहैत छी, तँ एकरा खाली छोडि दी आ एकरा भेजी।",
"changeemail-no-info": "अहाँक ई पन्नाक सोझे प्रयोग करबालेल सम्प्रवेशित हुअए पडत।",
"undo-nochange": "ऐना लगया की ई सम्पादन कें पहील से पूर्ववत करई देन अछि।",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|वार्ता]])द्वारा कएल अन्तर $1 के पूर्ववत कएलक",
"undo-summary-username-hidden": "नुकाएल गेल प्रयोक्ताद्वारा केल गेल परिवर्तन $1 के पूर्ववत केल गेल",
- "cantcreateaccounttitle": "खाता नै बना सकल",
"cantcreateaccount-text": "(<strong>$1</strong>) अनिकेत पतासँ खाता निर्माण प्रतिबन्धित कएल गेल [[User:$3|$3]]।\n$3 द्वारा देल कारण अछि ''$2''",
"cantcreateaccount-range-text": "<strong>$1</strong> के श्रेणी में आबई वाला आई॰पी पता सऽ, जएमें आहाँ कें आई॰पी पता (<strong>$4</strong>) शामिल अछि, नया खाता के रचना [[User:$3|$3]] द्वारा अवरोधित केल गेल अछि। \n\n$3 द्वारा देल गेल कारण अछि: \"$2\"",
"viewpagelogs": "ई पन्नाक वृत्तलेखसभ देखी",
"sqlite-has-fts": "$1 पूर्ण-पाठ खोज सहायता युक्त",
"sqlite-no-fts": "$1 बिन पूर्ण-पाठ खोज सहायताक",
"logentry-delete-delete": "$1 पृष्ठ $3 {{GENDER:$2|मेटौलक}}",
- "logentry-delete-restore": "$1 {{लिंग:$2|restored}} page $3",
+ "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
"logentry-delete-event": "$1 {{लिंग:$2|changed}} एकर दृश्य{{PLURAL:$5| एकटा वृत्तलेख|$5 वृत्तलेख}} $3: $4 केँ",
"logentry-delete-revision": "$1 {{लिंग:$2|changed}} एकर दृश्य{{PLURAL:$5| एकटा संशोधन|$5 संशोधन}} पन्ना $3: $4 पर",
- "logentry-delete-event-legacy": "$1 {{लिंग:$2|changed}} $3 पर वृत्तलेख दृश्य",
- "logentry-delete-revision-legacy": "$1 {{लिंग:$2|changed}} $3 पर वृत्तलेख संशोधन",
+ "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} $3 पर वृत्तलेख दृश्य",
+ "logentry-delete-revision-legacy": "$1 {{GENDER:$2|changed}} $3 पर वृत्तलेख संशोधन",
"logentry-suppress-delete": "$1 {{लिंग:$2|दबाएल}} page $3",
"logentry-suppress-event": "$1 चोरिसँ {{लिंग:$2|changed}} एकर दृश्य{{PLURAL:$5| एकटा वृत्तलेख|$5 वृत्तलेख}} $3: $4 पर",
"logentry-suppress-revision": "$1 चोरिसँ {{लिंग:$2|changed}} एकर दृश्य{{PLURAL:$5| एकटा संशोधन|$5 संशोधन}} $3: $4 पर",
- "logentry-suppress-event-legacy": "$1 नुका कऽ {{लिंग:$2|changed}} $3 पर वृत्तलेख दृश्य",
- "logentry-suppress-revision-legacy": "$1 नुका कऽ {{लिंग:$2|changed}} $3 पर संशोधन दृश्य",
+ "logentry-suppress-event-legacy": "$1 नुका क {{GENDER:$2|परिवर्तन}} $3 पर वृत्तलेख दृश्य",
+ "logentry-suppress-revision-legacy": "$1 नुका कऽ {{GENDER:$2|changed}} $3 पर संशोधन दृश्य",
"revdelete-content-hid": "सामिग्री नुकाएल",
"revdelete-summary-hid": "नुकाएल सारांश सम्पादन",
"revdelete-uname-hid": "प्रयोक्तानाम नुकाएल",
"logentry-import-interwiki": "$1 {{GENDER:$2|आयात केल गेल}} $3 कोनो और विकि सँ",
"logentry-merge-merge": "$1 {{GENDER:$2|विलय केल गेल}} $3 के $4 में (संशोधन $5 धरि)",
"logentry-move-move": "$1 हटाएल पन्ना $3 सँ $4",
- "logentry-move-move-noredirect": "$1 {{लिंग:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआकेँ बिना छोड़ने",
- "logentry-move-move_redir": "$1 {{लिंग:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआक अतिरिक्त",
+ "logentry-move-move-noredirect": "$1 {{GENDER:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआकेँ बिना छोड़ने",
+ "logentry-move-move_redir": "$1 {{GENDER:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआक अतिरिक्त",
"logentry-move-move_redir-noredirect": "$1 {{लिंग:$2|हटाएल}} पन्ना $3 सँ $4 घुमौआक अतितिक्त घुमौआकेँ बिना छोड़ने",
"logentry-patrol-patrol": "$1 {{GENDER:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित",
"logentry-patrol-patrol-auto": "$1 स्वतः {{GENDER:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित",
- "logentry-newusers-newusers": "$1 {{लिंग:$2|बनाएल}} एकटा प्रयोक्ता खाता",
+ "logentry-newusers-newusers": "$1 {{GENDER:$2|बनाएल}} एकटा प्रयोक्ता खाता",
"logentry-newusers-create": "प्रयोगकर्ता खाता $1 {{GENDER:$2|बनाएल}} गेल",
- "logentry-newusers-create2": "$1 {{लिंग:$2|बनाएल}} {{लिंग:$4|एकटा प्रयोक्ता खाता}} $3",
+ "logentry-newusers-create2": "$1 {{GENDER:$2|बनाएल}} {{GENDER:$4|एकटा प्रयोक्ता खाता}} $3",
"logentry-newusers-byemail": "$1 द्वारा प्रयोक्ता खाता $3 {{GENDER:$2|बनाओल}} गेल आ कूटशब्द ई-पत्र द्वारा भेजल गेल",
- "logentry-newusers-autocreate": "खाता $1 छल {{लिंग:$2|बनाएल}} स्वतः",
+ "logentry-newusers-autocreate": "खाता $1 छल {{GENDER:$2|बनाएल}} स्वतः",
"logentry-upload-upload": "$1 {{GENDER:$2|ए}} $3 अपलोड केलक",
"log-name-tag": "ट्याग लग",
"rightsnone": "(कोनो नै)",
"passwordreset-emailtext-user": "Sasaurang (mungkin Sanak, dari alamaik IP $1) mamintak parubahan kato sandi untuak {{SITENAME}} ($4).\n{{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel ko:\n\n$2\n\n{{PLURAL:$3|Sandi samantaro}} barikuik akan habih masonyo dalam {{PLURAL:$5|$5 ari}}.\nSanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan ko atau jikok Sanak ingek sandi awal dan indak nio maubahnyo, Sanak dapek mangacuahkan pasan ko dan taruih manggunoan kato sandi lamo.",
"passwordreset-emailelement": "Namo pangguno: \n$1\n\nSandi samantaro: \n$2",
"passwordreset-emailsentemail": "Surel parubahan kato sandi alah dikirim.",
- "passwordreset-emailsent-capture": "Surel parubahan kato sandi alah dikirim, nan nampak di bawah ko.",
- "passwordreset-emailerror-capture": "Surel parubahan kato sandi nan ditampilan di bawah, alah dibuek, tapi pangirimannyo ka {{GENDER:$2|pangguno}} gagal: $1",
"changeemail": "Tuka alamaik surel.",
"changeemail-header": "Ganti alamaik surel.",
"changeemail-no-info": "Sanak harus masuak log untuak mangakses laman ko.",
"minoredit": "Suntiangan ketek",
"watchthis": "Pantau laman ko",
"savearticle": "Simpan",
+ "publishpage": "Tabikan laman",
+ "publishchanges": "Tabikan parubahan",
"preview": "Caliak",
"showpreview": "Pratonton",
"showdiff": "Parubahan",
"undo-failure": "Suntiangan ko indak dapek dibatalan dek konflik panyuntiangan antaro.",
"undo-norev": "Suntiangan ko indak dapek dibatalan dek laman indak ditamukan atau lah dihapuih.",
"undo-summary": "Mambatalan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|maota]])",
- "cantcreateaccounttitle": "Indak dapek mambuek akun",
"cantcreateaccount-text": "Mambuek akun dari alamat IP ko ('''$1''') alah diblok jo [[User:$3|$3]].\n\nAlasan nan diagiah jo $3 adolah ''$2''",
"viewpagelogs": "Caliak log untuak laman ko",
"nohistory": "Indak ado sajarah panyuntiangan untuak laman ko",
"tagline": "Од {{SITENAME}}",
"help": "Помош",
"search": "Пребарај",
+ "search-ignored-headings": " #<!-- не менувајте ништо во овој ред --> <pre>\n# Заглавија што ќе се занемарат при пребарувањето.\n# Измените во ова ќе стапат на сила штом ќе се индексира страницата со заглавието.\n# Можете да наметнете преиндексирање на страницата ако извршите празно уредување.\n# Синтаксата е следнава:\n# * Сето она што од знакот „#“ до крајот на редот е коментар\n# * Секој непразен ред е точниот наслов што треба да се занемари, разликувајќи големи од мали букви и сето останато\nНаводи\nНадворешни врски\nПоврзано\n #</pre> <!-- не менувајте ништо во овој ред -->",
"searchbutton": "Пребарај",
"go": "Дај",
"searcharticle": "Дај",
"badarticleerror": "Ова дејство не може да се спроведе на оваа страница.",
"cannotdelete": "Страницата или податотеката „$1“ не можеше да се избрише.\nМожеби некој друг веќе ја избришал.",
"cannotdelete-title": "Не можам да ја избришам страницата „$1“",
- "delete-hook-aborted": "Ð\91Ñ\80иÑ\88еÑ\9aеÑ\82о е пÑ\80екинаÑ\82о Ñ\81о кÑ\83ка.\nНе е дадено никакво образложение.",
+ "delete-hook-aborted": "Ð\91Ñ\80иÑ\88еÑ\9aеÑ\82о е пÑ\80екинаÑ\82о Ñ\81о пÑ\80еÑ\81Ñ\80еÑ\82ник.\nНе е дадено никакво образложение.",
"no-null-revision": "Не можев да направам нова ништовна преработка на страницата „$1“",
"badtitle": "Неисправен наслов",
"badtitletext": "Бараниот наслов е грешен, празен или неисправно поврзан меѓујазичен или меѓупроектен наслов. \nМоже да содржи недопуштени знаци.",
"title-invalid-magic-tilde": "Побараниот наслов содржи низа неважечки тилди (<nowiki>~~~</nowiki>).",
"title-invalid-too-long": "Бараниот наслов е предолг. Не смее да биде поголем од $1 {{PLURAL:$1|бајт|бајти}} шифриран според UTF-8.",
"title-invalid-leading-colon": "Бараниот наслов содржи неважечки две точки на почетокот.",
- "perfcached": "Следните податоци се меѓускладирани и може да не се тековни. Во меѓускладот {{PLURAL:$1|е достапен највеќе еден резултат|се достапни највеќе $1 резултати}}.",
- "perfcachedts": "Следните податоци се меѓускладирани, последен пат подновени на $1. Во меѓускладот {{PLURAL:$4|е достапен највеќе еден резултат|се достапни највеќе $4 резултати}}.",
+ "perfcached": "Следните податоци се меѓускладирани и може да не се тековни. Во меѓускладот {{PLURAL:$1|е достапен највеќе еден запис|се достапни највеќе $1 записи}}.",
+ "perfcachedts": "Следните податоци се меѓускладирани, последен пат подновени на $1. Во меѓускладот {{PLURAL:$4|е достапен највеќе еден запис|се достапни највеќе $4 записи}}.",
"querypage-no-updates": "Подновите на оваа страница моментално се оневозможени.\nПодатоците овде во моментов нема да се подновуваат.",
"viewsource": "Преглед",
"viewsource-title": "Преглед на кодот на $1",
"passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
"passwordreset-emailsentemail": "Ако ова е регистрираната е-пошта поврзана со вашата сметка, тогаш ќе ви биде испратено писмо за задавање на нова лозинка.",
"passwordreset-emailsentusername": "Ако има соодветна регистрирана е-пошта поврзана со ова корисничко име, тогаш ќе ви биде испратена порака за промена на лозинката.",
- "passwordreset-emailsent-capture": "Испратено е писмо за измена на лозинката (прикажано подолу).",
- "passwordreset-emailerror-capture": "Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|Е-поштата за задавање на нова лозинка|Е-поштата за задавање на нови лозинки}} е испратена. Подолу е {{PLURAL:$1|е прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
"passwordreset-emailerror-capture2": "Испраќањето е-пошта на {{GENDER:$2|корисникот}} не успеа: $1 Подолу е {{PLURAL:$3|прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
"passwordreset-nocaller": "Мора да се укаже повикувач",
"passwordreset-nodata": "Немате укажано ни корисничко име, ни е-пошта.",
"changeemail": "Смени или отстрани е-пошта",
"changeemail-header": "Пополнете го образецов за да ја смените е-поштата. Ако сакате да ја отстраните адресата од вашата сметка, оставете го празно полето за нова е-пошта.",
- "changeemail-passwordrequired": "Ќе треба да ја внесете лозинката за да ја потврдите измената.",
"changeemail-no-info": "Мора да бидете најавени ако сакате да имате директен пристап до оваа страница.",
"changeemail-oldemail": "Тековна е-пошта:",
"changeemail-newemail": "Нова е-пошта:",
"savearticle": "Зачувај",
"savechanges": "Зачувај промени",
"publishpage": "Објави ја страницата",
- "publishchanges": "Ð\9eбÑ\98ави пÑ\80омени",
+ "publishchanges": "Ð\9eбÑ\98ави ги пÑ\80омениÑ\82е",
"preview": "Преглед",
"showpreview": "Преглед",
"showdiff": "Прикажи промени",
"moveddeleted-notice": "Оваа страница била претходно бришена.\nДневникот на бришења и преместувања за оваа страница е прикажан подолу за ваше дополнително информирање.",
"moveddeleted-notice-recent": "За жал, страницава беше неодамна избришана (во последниве 24 часа).\nПодолу можете да го погледате дневникот на бришење и преместување.",
"log-fulllog": "Преглед на целиот дневник",
- "edit-hook-aborted": "УÑ\80едÑ\83ваÑ\9aеÑ\82о е пÑ\80екинаÑ\82о Ñ\81о кÑ\83ка.\nНе е дадено никакво образложение.",
+ "edit-hook-aborted": "УÑ\80едÑ\83ваÑ\9aеÑ\82о е пÑ\80екинаÑ\82о Ñ\81о пÑ\80еÑ\81Ñ\80еÑ\82ник.\nНе е дадено никакво образложение.",
"edit-gone-missing": "Не можев да ја подновам страницата.\nВеројатно е избришана.",
"edit-conflict": "Спротиставеност во уредувањето.",
"edit-no-change": "Вашите уредувања беа игнорирани, бидејќи не се направени промени врз текстот.",
"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-адреси во опсегот <strong>$1</strong> каде спаѓа вашата IP-адреса (<strong>$4</strong>) е блокирано од корисникот [[User:$3|$3]].\n\n$3 ја наведе следнава причина: <em>$2</em>",
"viewpagelogs": "Преглед на дневници за оваа страница",
"prefs-skin": "Руво",
"skin-preview": "Преглед",
"datedefault": "Небитно",
- "prefs-labs": "Ð\95кÑ\81пеÑ\80именÑ\82ални можности",
+ "prefs-labs": "Ð\9fÑ\80обни можности",
"prefs-user-pages": "Кориснички страници",
"prefs-personal": "Кориснички профил",
"prefs-rc": "Скорешни промени",
"right-applychangetags": "Задавање на [[Special:Tags|ознаки]] заедно со направените измени",
"right-changetags": "Додавате и отстранување на произволни [[Special:Tags|ознаки]] во поединечни преработки и дневнички записи",
"right-deletechangetags": "Бришење [[Special:Tags|ознаки]] од базата",
- "grant-generic": "Ð\93Ñ\80Ñ\83па права „$1“",
+ "grant-generic": "Ð\97биÑ\80 права „$1“",
"grant-group-page-interaction": "Опходување со страници",
"grant-group-file-interaction": "Опходување со слики и снимки",
"grant-group-watchlist-interaction": "Опходување со набљудуваните",
"action-applychangetags": "ставање на ознаки заедно со напревените промени",
"action-changetags": "додавање и отстранување на произволни ознаки во поединечни преработки и дневнички записи",
"action-deletechangetags": "бришење ознаки од базата",
+ "action-purge": "превчитување на оваа страница",
"nchanges": "$1 {{PLURAL:$1|промена|промени}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|од последната посаета}}",
"enhancedrc-history": "историја",
"filename-tooshort": "Името на податотеката е прекратко.",
"filetype-banned": "Овој тип на податотека е забранет.",
"verification-error": "Оваа податотека не ја помина потврдата успешно.",
- "hookaborted": "Ð\98змениÑ\82е Ñ\88Ñ\82о Ñ\81акаÑ\82е да ги напÑ\80авиÑ\82е Ñ\81е оÑ\82кажани од кÑ\83ка на додатокот.",
+ "hookaborted": "Ð\98змениÑ\82е Ñ\88Ñ\82о Ñ\81акаÑ\82е да ги напÑ\80авиÑ\82е Ñ\81е оÑ\82кажани од пÑ\80еÑ\81Ñ\80еÑ\82ник на додатокот.",
"illegal-filename": "Такво име за податотеката на е дозволено.",
"overwrite": "Не е дозволено запишување врз постоечка податотека.",
"unknown-error": "Се појави непозната грешка.",
"watchnologin": "Не сте најавени",
"addwatch": "Додај во набљудувани",
"addedwatchtext": "„[[:$1]]“ и нејзината страница за разговор се додадени во вашите [[Special:Watchlist|набљудувања]].",
+ "addedwatchtext-talk": "„[[:$1]]“ и нејзината поврзана страница се додадени во вашите [[Special:Watchlist|набљудувања]].",
"addedwatchtext-short": "Страницата „$1“ е додадена во вашите набљудувања.",
"removewatch": "Отстрани набљудуваните",
"removedwatchtext": "„[[:$1]]“ и нејзината страница за разговор се отстранети од вашите [[Special:Watchlist|набљудувања]].",
+ "removedwatchtext-talk": "„[[:$1]]“ и нејзината поврзана страница се отстранети од вашите [[Special:Watchlist|набљудувања]].",
"removedwatchtext-short": "Страницата „$1“ е отстранета од вашите набљудувања.",
"watch": "Набљудувај",
"watchthispage": "Набљудувај ја страницава",
"version-extensions": "Воспоставени додатоци",
"version-skins": "Воспоставени рува",
"version-specialpages": "Службени страници",
- "version-parserhooks": "РаÑ\81Ñ\87ленÑ\83ваÑ\87ки кÑ\83ки",
+ "version-parserhooks": "РаÑ\81Ñ\87ленÑ\83ваÑ\87ки пÑ\80еÑ\81Ñ\80еÑ\82ниÑ\86и",
"version-variables": "Променливи",
"version-antispam": "Спречување на спам",
"version-api": "Извршници",
"version-other": "Друго",
"version-mediahandlers": "Ракувачи со мултимедијални содржини",
- "version-hooks": "Ð\9aÑ\83ки",
+ "version-hooks": "Ð\9fÑ\80еÑ\81Ñ\80еÑ\82ник",
"version-parser-extensiontags": "Ознаки за расчленувачки додатоци",
- "version-parser-function-hooks": "Ð\9aÑ\83ки на расчленувачки функции",
- "version-hook-name": "Ð\98ме на кÑ\83ка",
+ "version-parser-function-hooks": "Ð\9fÑ\80еÑ\81Ñ\80еÑ\82ниÑ\86и на расчленувачки функции",
+ "version-hook-name": "Ð\9dазив на пÑ\80еÑ\81Ñ\80еÑ\82никоÑ\82",
"version-hook-subscribedby": "Претплатено од",
"version-version": "($1)",
"version-no-ext-name": "[нема име]",
"api-error-filetype-banned": "Овој тип на податотека е забранет.",
"api-error-filetype-banned-type": "$1 не {{PLURAL:$4|е допуштен тип на податотека|се допуштени типови на податотека}}. {{PLURAL:$3|Допуштен е|Допуштени се}} $2.",
"api-error-filetype-missing": "На податотеката ѝ недостасува наставка.",
- "api-error-hookaborted": "Ð\98зменаÑ\82а Ñ\88Ñ\82о Ñ\81е обидовÑ\82е да Ñ\98а напÑ\80авиÑ\82е е оÑ\82кажана од кÑ\83ка за наставки.",
+ "api-error-hookaborted": "Ð\98зменаÑ\82а Ñ\88Ñ\82о Ñ\81е обидовÑ\82е да Ñ\98а напÑ\80авиÑ\82е е оÑ\82кажана од пÑ\80еÑ\81Ñ\80еÑ\82ник за наставки.",
"api-error-http": "Внатрешна грешка: не можам да се поврзам со опслужувачот.",
"api-error-illegal-filename": "Податотеката има недозволено име.",
"api-error-internal-error": "Внатрешна грешка: нешто тргна наопаку при обработката на она што го подигате на викито.",
"tagline": "{{SITENAME}} സംരംഭത്തിൽ നിന്ന്",
"help": "സഹായം",
"search": "തിരയൂ",
+ "search-ignored-headings": " #<!-- ഈ വരി ഇതേ പോലെ വിടുക --> <pre>\n# തിരച്ചിലിൽ അവഗണിക്കപ്പെടുന്ന തലക്കെട്ടുകൾ.\n# താളിന്റെ തലക്കെട്ടുകളുടെ സൂചികവത്കരണം നടന്നാലുടൻ ഇവിടെ വരുത്തുന്ന മാറ്റങ്ങൾ ഫലത്തിൽ വരുന്നതാണ്.\n# ശൂന്യമായ തിരുത്ത് ചെയ്ത് താൾ വീണ്ടും സൂചികാവത്കരിക്കാവുന്നതാണ്.\n# എഴുത്തുരീതി ഇനി കൊടുക്കുന്നു:\n# * \"#\" അക്ഷരത്തിൽ തുടങ്ങി വരിയുടെ അവസാനം വരെയുള്ള എന്തും സൂചനാക്കുറിപ്പ് ആയിരിക്കും.\n# * ശൂന്യമല്ലാത്ത ഓരോ വരിയും അക്ഷരവ്യത്യാസമില്ലാതെ അവഗണിക്കപ്പെടാനുള്ള തലക്കെട്ടായിരിക്കും\nഅവലംബം\nപുറത്തേക്കുള്ള കണ്ണികൾ\nഇതും കാണുക\n #</pre> <!-- ഈ വരി ഇതേ പോലെ വിടുക-->",
"searchbutton": "തിരയൂ",
"go": "പോകൂ",
"searcharticle": "പോകൂ",
"passwordreset-emailelement": "ഉപയോക്തൃനാമം: \n$1\n\nതാത്കാലിക രഹസ്യവാക്ക്: \n$2",
"passwordreset-emailsentemail": "താങ്കളുടെ അംഗത്വത്തിന് നൽകിയിട്ടുള്ള ഇമെയിൽ വിലാസം ഇതാണെങ്കിൽ, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
"passwordreset-emailsentusername": "ഈ ഉപയോക്തൃനാമത്തിന് ഒരു ഇമെയിൽ വിലാസം ചേർത്തിട്ടുണ്ടെങ്കിൽ, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
- "passwordreset-emailsent-capture": "രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.",
- "passwordreset-emailerror-capture": "താഴെക്കൊടുത്തിരിക്കുന്ന, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ സൃഷ്ടിക്കാനായെങ്കിലും, അത് {{GENDER:$2|ഉപയോക്താവിന്}} അയയ്ക്കുന്നത് പരാജയപ്പെട്ടു: $1",
"changeemail": "ഇമെയിൽ വിലാസം മാറ്റുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
"changeemail-header": "താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക.താങ്കളുടെ അംഗത്വവുമായി ഏതെങ്കിലുമൊരു ഇമെയിൽ വിലാസത്തിനുള്ള ബന്ധം ഒഴിവാക്കാൻ ഫോം പൂരിപ്പിക്കുമ്പോൾ പുതിയ ഇമെയിൽ വിലാസത്തിനുള്ള ഭാഗം ഒഴിച്ചിടുക.",
- "changeemail-passwordrequired": "ഈ മാറ്റം സ്ഥിരീകരിക്കാൻ താങ്കളുടെ രഹസ്യവാക്ക് നൽകുക.",
"changeemail-no-info": "ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
"changeemail-oldemail": "ഇപ്പോഴത്തെ ഇമെയിൽ വിലാസം:",
"changeemail-newemail": "പുതിയ ഇമെയിൽ വിലാസം:",
"undo-nochange": "തിരുത്ത് മുമ്പേ തന്നെ ഒഴിവാക്കിയതായി കാണുന്നു.",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|സംവാദം]]) ചെയ്ത നാൾപ്പതിപ്പ് $1 നീക്കം ചെയ്യുന്നു",
"undo-summary-username-hidden": "മറയ്ക്കപ്പെട്ട ഉപയോക്താവ് ചെയ്ത നാൾപ്പതിപ്പ് $1 തിരസ്കരിക്കുക",
- "cantcreateaccounttitle": "അംഗത്വം സൃഷ്ടിക്കാൻ സാധിച്ചില്ല",
"cantcreateaccount-text": "ഈ ഐ.പി. ('''$1''') വിലാസത്തിൽ നിന്നു അംഗത്വം സൃഷ്ടിക്കുന്നത് [[User:$3|$3]] നിരോധിച്ചിരിക്കുന്നു.\n\n$3 അതിനു കാണിച്ചിരിക്കുന്ന കാരണം ''$2'' ആണ്.",
"cantcreateaccount-range-text": "താങ്കളുടെ ഐ.പി. വിലാസം (<strong>$4</strong>) ഉൾപ്പെടുന്ന <strong>$1</strong> എന്ന പരിധിയിലെ ഐ.പി. വിലാസങ്ങളിൽ നിന്ന് അംഗത്വമെടുക്കുന്നത് [[User:$3|$3]] തടഞ്ഞിരിക്കുകയാണ്.\n\n$3 നൽകിയിരിക്കുന്ന കാരണം <em>$2</em> എന്നാണ്",
"viewpagelogs": "ഈ താളുമായി ബന്ധപ്പെട്ട രേഖകൾ കാണുക",
"mw-widgets-dateinput-no-date": "തീയതി ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല",
"mw-widgets-titleinput-description-new-page": "താൾ ഇപ്പോൾ നിലവിലില്ല",
"mw-widgets-titleinput-description-redirect": "$1 എന്ന താളിലേക്കുള്ള തിരിച്ചുവിടൽ",
- "api-error-blacklisted": "ദയവായി മറ്റൊരു വിവരണാത്മകമായ തലക്കെട്ട് തിരഞ്ഞെടുക്കുക.",
"sessionmanager-tie": "വ്യത്യസ്ത തരത്തിലുള്ള അനുമതി നൽകൽ തരങ്ങൾ സംയോജിപ്പിക്കാനാവില്ല: $1.",
"sessionprovider-generic": "$1 സെഷനുകൾ",
"sessionprovider-mediawiki-session-cookiesessionprovider": "കൂക്കി-അധിഷ്ഠിത സെഷനുകൾ",
"tog-watchdefault": "मी संपादित केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
"tog-watchmoves": "मी स्थानांतर केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
"tog-watchdeletion": "मी वगळलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
+ "tog-watchuploads": "मी अपभारीलेल्या नविन संचिका माझ्या निरीक्षणसूचीत जोडा",
"tog-watchrollback": "यात ज्या पानात मी माझ्या निरीक्षणसूचीत पुनर्परतीची (रोलबॅक) क्रिया केलेली आहे.",
"tog-minordefault": "सर्व संपादने 'छोटा बदल' म्हणून आपोआप जतन करा.",
"tog-previewontop": "झलक संपादन खिडकीच्या आधी दाखवा",
"prefs-email": "विपत्र पर्याय",
"prefs-rendering": "देखावा",
"saveprefs": "जतन करा",
- "restoreprefs": "सरà¥\8dव डिफà¥\89लà¥\8dà¤\9f मांडणी पूर्ववत करा (सर्व विभागात)",
+ "restoreprefs": "सरà¥\8dव à¤\85विà¤\9aल(डिफà¥\89लà¥\8dà¤\9f) मांडणी पूर्ववत करा (सर्व विभागात)",
"prefs-editing": "संपादन",
"rows": "ओळी:",
"columns": "स्तंभ:",
"tagline": "Daripada {{SITENAME}}.",
"help": "Bantuan",
"search": "Cari",
+ "search-ignored-headings": " #<!-- jangan usik baris ini --> <pre>\n# Tajuk yang akan diabaikan oleh pencarian.\n# Suntingannya diperlakukan sebaik sahaja laman yang bertajuk ini diindekskan.\n# Anda boleh memaksakan pengindeksan semula laman dengan melakukan suntingan nol (null edit).\n# Sintaks adalah seperti berikut:\n# * Semuanya dari aksara \"#\" ke hujung baris dikira komen.\n# * Setiap baris tak kosong adalah tajuk yang setepatnya untuk diabaikan.\nRujukan\nPautan luar\nLihat juga\n #</pre> <!-- jangan usik baris ini -->",
"searchbutton": "Cari",
"go": "Pergi",
"searcharticle": "Pergi",
"passwordreset-emailtext-user": "Pengguna $1 telah memohon supaya kata laluan diset semula untuk {{SITENAME}} anda ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut\ndikaitkan dengan alamat e-mel ini:\n\n$2\n\n{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa $5 hari. Anda harus log masuk dan membuat kata laluan yang baru sekarang. Jika permohonan ini dibuat oleh orang lain, atau jika anda teringat kembali kata laluan asal anda dan anda tidak lagi berhasrat untuk mengubahnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.",
"passwordreset-emailelement": "Nama pengguna: \n$1\n\nKata laluan sementara: \n$2",
"passwordreset-emailsentemail": "Jika ini ialah alamat e-mel yang terdaftar untuk akaun anda, maka e-mel set semula kata laluan akan dihantar.",
- "passwordreset-emailsent-capture": "E-mel set semula kata laluan telah dihantar, seperti yang dipaparkan di bawah.",
- "passwordreset-emailerror-capture": "E-mel set semula kata laluan telah dihasilkan, seperti yang dipaparkan di bawah, tetapi tidak berjaya dihantar kepada {{GENDER:$2|pengguna}} berkenaan: $1",
"changeemail": "Tukar atau padamkan alamat e-mel",
"changeemail-header": "Lengkapkan borang ini untuk menukar alamat e-mel anda. Jika anda ingin memutuskan sebarang hubungan alamat e-mel daripada akaun anda, biarkan ruangan alamat e-mel kosong ketika menghantar borang.",
- "changeemail-passwordrequired": "Anda akan dikehendaki memasukkan kata laluan untuk mengesahkan perubahan ini.",
"changeemail-no-info": "Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.",
"changeemail-oldemail": "Alamat e-mel sekarang:",
"changeemail-newemail": "Alamat e-mel baru:",
"minoredit": "Ini adalah suntingan kecil",
"watchthis": "Pantau laman ini",
"savearticle": "Simpan",
+ "publishpage": "Terbitkan",
+ "publishchanges": "Terbit perubahan",
"preview": "Pralihat",
"showpreview": "Paparkan pralihat",
"showdiff": "Lihat perubahan",
"undo-nochange": "Suntingan itu nampaknya sudah dibatalkan.",
"undo-summary": "Membatalkan semakan $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|Perbincangan]])",
"undo-summary-username-hidden": "Buat asal semakan $1 oleh pengguna tersembunyi",
- "cantcreateaccounttitle": "Akaun tidak dapat dibuka",
"cantcreateaccount-text": "Pembukaan akaun daripada alamat IP ini (<b>$1</b>) telah disekat oleh [[User:$3|$3]].\n\nSebab yang diberikan oleh $3 ialah ''$2''",
"cantcreateaccount-range-text": "Pembukaan akaun dari alamat-alamat IP dalam julat <strong>$1</strong>, termasuk alamat IP anda (<strong>$4</strong>), telah disekat oleh [[User:$3|$3]].\n\nSebab yang diberikan oleh $3 ialah <em>$2</em>",
"viewpagelogs": "Lihat log bagi laman ini",
"mw-widgets-dateinput-no-date": "Tarik belum dipilih",
"mw-widgets-titleinput-description-new-page": "laman belum wujud",
"mw-widgets-titleinput-description-redirect": "melencong ke $1",
- "api-error-blacklisted": "Sila pilih tajuk yang berbeza dan deskriptif.",
"randomrootpage": "Laman akar rawak"
}
"minoredit": "အရေးမကြီးသော ပြင်ဆင်မှု ဖြစ်သည်",
"watchthis": "ဤစာမျက်နှာကို စောင့်ကြည့်ရန်",
"savearticle": "ဤစာမျက်နှာကို သိမ်းရန်",
+ "publishpage": "စာမျက်နှာကို လွှင့်တင်ရန်",
+ "publishchanges": "ပြောင်းလဲမှုများကို လွှင့်တင်ရန်",
"preview": "နမူနာ",
"showpreview": "နမူနာပြရန်",
"showdiff": "ပြင်ဆင်ထားသည်များကို ပြရန်",
"thursday": "Īcmācuīlilhuitl",
"friday": "Īcchicuacemilhuitl",
"saturday": "Īcchicōmilhuitl",
- "sun": "1 ilhui",
- "mon": "2 ilhui",
- "tue": "3 ilhui",
- "wed": "4 ilhui",
- "thu": "5 ilhui",
+ "sun": "Cemilhui",
+ "mon": "Ōmilhui",
+ "tue": "Ēyilhui",
+ "wed": "Nāuhilhui",
+ "thu": "Mācuililhui",
"fri": "6 ilhui",
"sat": "7 ilhui",
- "january": "Īccēmētztli",
- "february": "Īcōmēmētztli",
- "march": "Īcyēyimētztli",
- "april": "Īcnāuhtetlmētztli",
- "may_long": "Īcmācuīllimētztli",
- "june": "Īcchicuacemmētztli",
- "july": "Īcchicōmemētztli",
- "august": "Īcchicuēyimētztli",
- "september": "Īcchiucnāhuimētztli",
- "october": "Īcmahtlāctlimētztli",
- "november": "Īcmahtlāctlioncēmētztli",
- "december": "Īcmahtlāctliomōmemētztli",
- "january-gen": "Īccēmētztli",
+ "january": "Ic cē mētztli",
+ "february": "Ic ōmemētztli",
+ "march": "Ic ēyi mētztli",
+ "april": "Ic nāuhtetl mētztli",
+ "may_long": "Ic mācuīlli mētztli",
+ "june": "Ic chicuacē mētztli",
+ "july": "Ic chicōme mētztli",
+ "august": "Ic chicuēyi mētztli",
+ "september": "Ic chiucnāhui mētztli",
+ "october": "Ic mahtlāctli mētztli",
+ "november": "Ic mahtlāctli oncē mētztli",
+ "december": "Ic mahtlāctli omōme mētztli",
+ "january-gen": "Ic cē mētztli",
"february-gen": "Īcōmemētztli",
"march-gen": "Īcyēyimētztli",
- "april-gen": "Īcnāuhtetlmētztli",
+ "april-gen": "Ic nāuhtetl mētztli",
"may-gen": "Īcmācuīllimētztli",
- "june-gen": "Īcchicuacemmētztli",
- "july-gen": "Īcchicōmemētztli",
+ "june-gen": "Ic chicuacemmētztli",
+ "july-gen": "Ic chicōme mētztli",
"august-gen": "Īcchicuēyimētztli",
"september-gen": "Īcchiucnāhuimētztli",
"october-gen": "Īcmahtlāctetlmētztli",
"november-gen": "Īcmahtlāctetloncēmētztli",
"december-gen": "Īcmahtlāctetlomōmemētztli",
- "jan": "1 Mētz",
- "feb": "2 Mētz",
- "mar": "3 Mētz",
- "apr": "4 Mētz",
- "may": "5 Mētz",
- "jun": "6 Mētz",
- "jul": "7 Mētz",
- "aug": "8 Mētz",
- "sep": "9 Mētz",
- "oct": "10 Mētz",
- "nov": "11 Mētz",
- "dec": "12 Mētz",
+ "jan": "Ic cē",
+ "feb": "Ic ōme",
+ "mar": "Ic ēyi",
+ "apr": "Nāhui",
+ "may": "Mācuilli",
+ "jun": "Chicuacē",
+ "jul": "Chicōme",
+ "aug": "Chicuēyi",
+ "sep": "Chiucnāhui",
+ "oct": "Mahtlāctli",
+ "nov": "Mahtlāctlioncē",
+ "dec": "Mahtlāctliomōme",
"january-date": "Īccēmētztli $1",
"february-date": "Īcōmemētztli $1",
"march-date": "Īquēyimētztli $1",
"moredotdotdot": "Huehca ōmpa...",
"mypage": "Noāmauh",
"mytalk": "Nozānīl",
- "anontalk": "Inīn IP ītēixnāmiquiliz",
+ "anontalk": "Tēixnāmiquiliztli",
"navigation": "Nēnemōhualiztli",
"and": " īhuān",
"qbfind": "Xicahci",
"tagline": "Īhuīcpa {{SITENAME}}",
"help": "Tēpalēhuiliztli",
"search": "Mà motèmo",
- "searchbutton": "Xictēmo",
+ "searchbutton": "Tictēmōz",
"go": "Xiyauh",
"searcharticle": "Xiyauh",
"history": "Tlaīxtli ītlahtōllo",
"viewsource": "Xiquitta mēyalli",
"viewsource-title": "Xiquitta in $1 īmēyal",
"actionthrottled": "Tlachīhualiztli ōmotzacuili",
- "viewsourcetext": "Tihuelīti tiquitta auh ticcopīna inīn zāzanilli ītlahtōlcaquiliztilōni:",
+ "viewsourcetext": "Tihuelīti tiquittaz auh ticcopīnaz inīn zāzanilli īmachiyōnecaquilizmēyal.",
"namespaceprotected": "Ahmo tiquihuelīti tiquimpatla zāzaniltin īpan '''$1'''.",
"ns-specialprotected": "In nònkuâkìskàtlaìxtlapaltìn awel ìmpan nemàtilòs mokinyèktlàlis.",
"titleprotected": "Inīn zāzanilli ōmoquīxti ic tlachīhualiztli ic [[User:$1|$1]].\nŌquihto: <em>$2</em>",
"userexists": "In tlatequitiltilīltōcāitl in ōquipehpen ye ia.\nTimitztlātlauhtiah xicpehpena occē.",
"loginerror": "Ahcuallōtl tlacalaquiliztechcopa",
"noname": "Ahmo ōtiquihto cualli tlatequitiltilīlli tōcāitl.",
- "loginsuccesstitle": "Cualli calaquiliztli",
+ "loginsuccesstitle": "Ōticalac",
"loginsuccess": "'''Ōticalac {{SITENAME}} quemeh \"$1\".'''",
- "nosuchuser": "Ayāc tlatequitiltilīlli motōcāitia \"$1\".\nIn tlatequitiltilīltōcāitl quimati in huēyimachiyōtlahtōliztli.\nXiquitta in yēquihcuilōlli, ahnozo [[Special:CreateAccount|xicchīhua yancuīc cuenta]].",
+ "nosuchuser": "Ayāc tlatequitiltilīlli motōcāitīlo «$1».\nn tlatequitiltilīltōcāitl quimati in huēyimachiyōtlahtōliztli.\nXiquitta moyēquihcuilōl, ahnozo [[Special:CreateAccount|xicchīhua yancuīc cuentah]].",
"nosuchusershort": "Ayāc tlatequitiltilīlli motōcāitia \"$1\". Xiquitta in tlein ōtitlahcuiloh melāhuacā cah.\nXiquitta moyēquihcuilōl.",
"nouserspecified": "Mohuīquilia tiquihtoa cualli tlatequitiltilīltōcāitl.",
"wrongpassword": "Ahcualli motlahtōlichtacāyo.\nTimitztlātlauhtia xicchīhua occeppa.",
"newpassword": "Yancuīc motlahtōlichtacayo:",
"retypenew": "Occeppa xiquihcuiloa yancuīc motlahtōlichtacayo:",
"resetpass_submit": "Xicpatlāz motlahtōlichtacāyo auh xicalaquīz",
- "changepassword-success": "Mochtacātlahtōl cualli ōtlapatlalo.",
+ "changepassword-success": "Moichtacātlahtōl ōmopatlac.",
"resetpass_forbidden": "Tlahtōlichtacayōtl ahmo mohuelītih mopatlah",
"resetpass-submit-loggedin": "Ticpatlāz motlahtōlichtacāyo",
"resetpass-submit-cancel": "Xiccāhua",
"sig_tip": "Motōcā īca cāhuitl",
"hr_tip": "Pāntli",
"summary": "Mopatlaliz:",
- "subject": "Tōcāitl/Āmoxmachiyōtl:",
+ "subject": "Ītechpa:",
"minoredit": "Ca tepitōn inīn tlapatlaliztli",
"watchthis": "Xicpiya inīn tlaīxtli",
"savearticle": "Xicpiya tlaīxtli",
"accmailtext": "Ōquiyōcox zāzochtacātlahtōlli in [[User talk:$1|$1]] auh ōmoquitītlan īhuīc $2. Tihueliti ticpatlaz īpan ''[[Special:ChangePassword|Ticpatlaz in ]]'' in ōticalaco achtopa.",
"newarticle": "(Yancuic)",
"newarticletext": "Ōtictocac cētiliztli cē zāzanilhuīc oc ahmo ia. Intlā quiēlēhuia quichīhua, xitlahcuiloa niman (nō xiquitta [$1 tēpalēhuiliztli zāzanilli] huehca ōmpa tlapatlaliztli). Intlā ahmo, yāuh achtopa zāzanilli.",
- "noarticletext": "In āxcān, ahmō onca tlahcuilōlli inīn zāzanilpan.\nTihuelīti [[Special:Search/{{PAGENAME}}|tictēmoa inīn zāzaniltōcācopa]] occequīntīn zāzanilpan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} machiyōmacalpan], ahnozo [{{fullurl:{{FULLPAGENAME}}|action=edit}} ticpatla inīn zāzanilli]</span>.",
+ "noarticletext": "In āxcān, ahmō onca tlahcuilōlli inīn zāzanilpan.\nTihuelīti [[Special:Search/{{PAGENAME}}|tictēmōz inīn zāzanilli ītōca]] occequīntīn zāzanilpan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xictēmoa īpan in tlapōhualāmatechpa],\nahnozo [{{fullurl:{{FULLPAGENAME}}|action=edit}} xichīhua inīn zāzanilli]</span>.",
"userpage-userdoesnotexist": "Ahmo ia cuentah \"<nowiki>$1</nowiki>\" ītōca. Timitztlātlauhtiah xitēchquinōtza intlā ticchīhuāz intlā nozo ticpatlāz inīn zāzanilli.",
"usercsspreview": "'''Ca inīn moachtochīhualiz ītechcopa moCSS.'''\n'''¡Ahmo ōmochīuh nozan!'''",
"userjspreview": "'''Ca inīn moachtochīhualiz ītechcopa moJavaScript.'''\n'''¡Ahmo ōmochīuh nozan!'''",
"edit-conflict": "Tlapatlaliztli yāōyōtōn",
"edit-already-exists": "Ahmo mohuelīti mochīhua yancuīc zāzanilli.\nYe ia.",
"content-model-javascript": "JavaScript",
- "cantcreateaccounttitle": "Ahmo huelītih mochīhua cuentah",
"cantcreateaccount-text": "[[User:$3|$3]] ōcquīxti cuentah tlachīhualiztli īpal inīn IP ('''$1''').\n\nĪxtlamatiliztli īpal $3 cah ''$2''",
"viewpagelogs": "Tiquinttāz tlahcuilōlloh inīn zāzaniltechcopa",
"nohistory": "Nicān ahmō oncah tlaīxtlapatlaliztlahtōllōtl.",
"currentrev": "Āxcān tlapatlaliztli",
"currentrev-asof": "Āxcān tlachiyaliztli īpan $1",
"revisionasof": "Tlachiyaliztli īpan $1",
- "revision-info": "Tlachiyaliztli īpan $1; $2",
+ "revision-info": "Tlachiyaliztli īpan $1 īpal {{GENDER:$6|$2}}$7",
"previousrevision": "← Huēhueh tlapatlaliztli",
"nextrevision": "Yancuīc tlapatlaliztli →",
"currentrevisionlink": "Āxcān tlapatlaliztli",
"shown-title": "Quinēxiltīz $1 {{PLURAL:$1|mochīhualiztli}} cece āmac",
"viewprevnext": "Xiquintta ($1 {{int:pipe-separator}} $2) ($3).",
"searchmenu-exists": "'''Ye ia zāzanilli ītōca \"[[$1]]\" inīn huiquipan'''",
- "searchmenu-new": "'''Tihuelīti ticchīhuāz zāzanilli ītōca \"[[:$1]]\" inīn huiquipan'''",
+ "searchmenu-new": "<strong>Ticchīhuāz in zāzanilli «[[:$1]]» inīn huiquipan.</strong> {{PLURAL:$2|0=|Nō xiquitta in tlanāmiquiliztli in mochīhualiztli.}}",
"searchprofile-articles": "Tlapiyaliztli zāzanilli",
"searchprofile-images": "Nepapan media",
"searchprofile-everything": "Mochi",
"gender-male": "Oquichtli",
"gender-female": "Cihuātl",
"email": "E-mail",
- "prefs-help-realname": "Melāhuac motōca.\nIntlā ticnequi, tlācah quimatīzqueh motequi.",
+ "prefs-help-realname": "In melāhuac tōcāitl mopehpenaliztli.\nIntlā ticmaca, momitztlaīxcoyantīz in motequi.",
"prefs-help-email-required": "Tihuīquilia quihcuiloa mo e-mailcān.",
"prefs-signature": "Motōcā",
"userrights-user-editname": "Xihcuiloa cē tlatequitiltilīltōcāitl:",
- "editusergroup": "Tiquimpatlāz tlatequitiltilīlli olōlli",
+ "editusergroup": "Tiquimpatlāz {{GENDER:$1|tlatequitiltilīlli}} īolōl",
"userrights-editusergroup": "Tiquimpatlāz tlatequitiltilīlli olōlli",
- "saveusergroups": "Tiquimpiyāz tlatequitiltilīlli olōlli",
+ "saveusergroups": "Tiquimpiyāz {{GENDER:$1|tlatequitiltilīlli}} īolōl",
"userrights-groupsmember": "Olōlco:",
"userrights-reason": "Īxtlamatiliztli:",
"userrights-no-interwiki": "Ahmo tihuelīti ticpatla tlatequitiltilīlli huelītiliztli occequīntīn huiquipan.",
"rightslog": "Tlatequitiltilīlli huelītiliztli tlahcuilōlloh",
"action-read": "xāmapōhua inīn tlaīxtli",
"action-edit": "xicpatla inīn tlaīxtli",
- "action-createpage": "xicchīhua tlaīxtli",
- "action-createtalk": "tiquinchīhuāz tēixnāmiquiliztli zāzaniltin",
+ "action-createpage": "xicchīhua inīn āmatl",
+ "action-createtalk": "xicchīhuā inīn tēixnāmiquiliztli zāzaniltin",
"action-createaccount": "ticchīhuaz inīn tlatequitiltilīlli īcuentah",
"action-move": "ticpatlāz inīn zāzanilli",
"action-move-subpages": "tiquimpatlāz inīn zāzanilli īhuān zāzaniltōn",
"newpageletter": "Y",
"boteditletter": "T",
"number_of_watching_users_pageview": "[$1 tlatequitiltilīlli {{PLURAL:$1|tlachiya|tlachiyah}}]",
- "rc_categories_any": "Zāzo",
+ "rc_categories_any": "Zāzo in tlaihittalli",
"newsectionsummary": "Yancuīc tlahtōltzintli: /* $1 */",
"recentchangeslinked": "Tlapatlaliztli tzonhuilizpan",
"recentchangeslinked-feed": "Tlapatlaliztli tzonhuilizpan",
"whatlinkshere-next": "{{PLURAL:$1|niman|$1 niman}}",
"whatlinkshere-links": "← tzòwilistìn",
"whatlinkshere-hideredirs": "$1 tlacuepaliztli",
- "whatlinkshere-hidelinks": "$1 tzòwilistìn",
+ "whatlinkshere-hidelinks": "$1 tzonhuiliztli",
"whatlinkshere-hideimages": "$1 tlahcuilōltzonhuīliztli",
"whatlinkshere-filters": "Tlatzetzelōni",
"blockip": "Tiquitzacuilīz tlatequitiltilīlli",
"importbadinterwiki": "Ahcualli interhuiqui tzonhuiliztli",
"import-upload": "Tiquinquetzāz XML tlahcuilōlli",
"importlogpage": "Tiquincōhuāz tlahcuilōlloh",
- "tooltip-pt-userpage": "Notlatequitiltilīlzāzanil",
- "tooltip-pt-mytalk": "Mozānīl",
- "tooltip-pt-preferences": "Mopanitlatlālīl",
+ "tooltip-pt-userpage": "{{GENDER:|Motlatequitiltilīlzāzanil}}",
+ "tooltip-pt-mytalk": "{{GENDER:|Motēīxnāmiquiliztli}}",
+ "tooltip-pt-preferences": "{{GENDER:|Motlaēlēhuiliz}}",
"tooltip-pt-watchlist": "Zāzaniltin tiquintlachiya ic tlapatlaliztli",
- "tooltip-pt-mycontris": "Notlahcuilōl",
+ "tooltip-pt-mycontris": "{{GENDER:|Motlahcuilōl}}",
"tooltip-pt-login": "Tihuelīti timocalaqui, tēl ahmo tihuīquilia.",
"tooltip-pt-logout": "Tiquīzāz",
"tooltip-ca-talk": "Inīn tlahcuilōlli zānīllī ītechcopa",
"tooltip-t-recentchangeslinked": "Yancuic tlapatlaliztli inīn zāzanilhuīcpa moquintzonhuilia",
"tooltip-feed-rss": "RSS tlachicāhualiztli inīn zāzaniltechcopa",
"tooltip-feed-atom": "Atom tlachicāhualiztli inīn zāzaniltechcopa",
- "tooltip-t-contributions": "Xiquitta inīn tlatequitiltilīlli ītlahcuilōl",
+ "tooltip-t-contributions": "Tlapōhualmatl ītechpa {{GENDER:$1|inīn tlatequitiltilīlli}} ītlahcuilōl",
"tooltip-t-emailuser": "Tiquihcuilōz inīn tlatequitiltililhuīc",
"tooltip-t-upload": "Tiquinquetzāz tlahcuilōlli",
"tooltip-t-specialpages": "Ìntlapòpòwaltekpànal mochtìn in nònkuâkìskàtlaìxtlapaltìn",
"tooltip-t-print": "Tepoztlahcuilōlli",
"tooltip-ca-nstab-main": "Xiquitta in tlamantlaīxtli",
"tooltip-ca-nstab-user": "Xiquitta tlatequitiltilīlli īzāzanil",
- "tooltip-ca-nstab-special": "Inìn sè nònkuâkìskàtlaìxtlapalli, yêìka awel nemàtilòs moyêyèktlàlis in tlaìxtlapalli",
+ "tooltip-ca-nstab-special": "Inīn nōncuahquīzqui āmatl, auh ahmohuelitizpatla",
"tooltip-ca-nstab-project": "Xiquitta in tlatequipanōllaīxtli",
"tooltip-ca-nstab-image": "Xiquittāz īxipzāzanilli",
"tooltip-ca-nstab-mediawiki": "Xiquitta in tlahcuilōltzin",
"tagline": "'A {{SITENAME}}.",
"help": "Ajùto",
"search": "Truova",
+ "search-ignored-headings": " #<!-- lassa sta linea comme sta --> <pre>\n# Testate ca se sarranno gnurate int' 'a ricerca.\n# Cagnamiente a chesto addeventarranno affettive quanno 'a paggena sarrà innecizzata.\n# Vuje putite forzà 'a reinnecezzazzione d' 'a paggena facenno nu cagnamiento abbacante.\n# 'A sintasse è 'a seguente:\n# * Ogneccosa 'a 'o carattere \"#\" 'nzegna 'a fine d' 'a linea è 'nu cummanno\n# * Ogne linea chiena è 'o titolo esatto 'a gnurà, case e tutteccose\nRiferimente\nJonte 'e fore\nVide pure\n #</pre> <!-- lassa sta linea comme sta -->",
"searchbutton": "Truova",
"go": "Vàje",
"searcharticle": "Vàje",
"passwordreset-emailelement": "Nomme utente: \n$1\n\nPassword temporanea: \n$2",
"passwordreset-emailsentemail": "Si chesto fosse nu cunto e-mail suoccio a 'o cunto vuost, allora buò dicere ca se mannarrà na mmasciata e-mail pe' riabbià 'a password.",
"passwordreset-emailsentusername": "Si esistesse nu cunto e-mail suòccio a stu nomme utente, allora se mannarrà na mmasciata pe' riabbià 'a password.",
- "passwordreset-emailsent-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, chista mmasciata 'a putite vedé ccà abbascio.",
- "passwordreset-emailerror-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, 'a putite vedé ccà abbascio, ma aita sapé ca nun s'è mannata a {{GENDER:$2|l'utente}} pecché c'è stato cocch'errore: $1",
"passwordreset-emailsent-capture2": "L'email 'e reimpostazione d' 'a password {{PLURAL:$1|è stata mannata|so' state mannate}}. {{PLURAL:$1|'O nomme|L'elenco 'e nomme}} utente e password è mmustato ccà.",
"passwordreset-emailerror-capture2": "'O mannà 'email {{GENDER:$2|a ll'utente}} guastaje: $1. {{PLURAL:$3|'O nomme|L'elenco 'e nomme}} utente e password se ffà vedé ccà.",
"passwordreset-nocaller": "Nu chiammate s'avess'a dà",
"passwordreset-nodata": "Nun è stato fornito né nomme utente né indirizzo 'e posta email",
"changeemail": "Cagna o lèva l'indirizzo e-mail",
"changeemail-header": "Ghienchete stu modulo pe' puté cagnà 'o indirizzo e-mail d' 'o vuosto. Si vuje vulite luvà e 'o scucchià l'associazione 'e cocche cunto mail d' 'o cunto vuosto, lassate 'o cunto e-mail nuovo abbacante quanno mannarrate stu modulo.",
- "changeemail-passwordrequired": "Avit'a miette 'a password vuosto pe' dà a cunferma 'e stu cagnamiento.",
"changeemail-no-info": "Avite 'a trasì ('o login) pe ffà l'acciesso a sta paggena direttamente.",
"changeemail-oldemail": "Indirizzo email 'e mmò:",
"changeemail-newemail": "Indirizzo e-mail nuovo:",
"content-model-css": "CSS",
"content-json-empty-object": "Oggetto abbacante",
"content-json-empty-array": "Array abbacante",
+ "deprecated-self-close-category": "Paggene ausanno nu tag HTML auto-nchiuse nun valido",
"duplicate-args-warning": "<strong>Attenziò:</strong> [[:$1]] sta chiammanno [[:$2]] cu cchiù 'e nu volore p' 'o parametro \"$3\". Surtanto ll'urdemo valore s'auserrà.",
"duplicate-args-category": "Paggene c'ausano argomiente dupprecate dint' 'e chiammate a 'e mudelle",
"duplicate-args-category-desc": "'A paggena tene chiammate a mudelle c'ausassero argomiente dupprecate, comme p'esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Pare c' 'o cagnamiento s'è già fatto turnà arreto.",
"undo-summary": "Canciella 'o cagnamiento $1 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|Chiàcchiera]])",
"undo-summary-username-hidden": "Annullato 'o cagnamiento $1 pe n'utente annascunnuto",
- "cantcreateaccounttitle": "Nun se può crià cunto",
"cantcreateaccount-text": "'A riggistraziona è stata bloccata 'a l'utente [[User:$3|$3]] 'a st'innerizzo IP ('''$1''').\n\n'O mutivo dato 'a $3 è chistu ccà: ''$2''",
"cantcreateaccount-range-text": "'A criazione 'e cunte 'a ll'indirizze int'o ntervallo <strong>$1</strong>, che cummiglia 'o vuosto (<strong>$4</strong>), è stata bloccata 'a l'utente [[User:$3|$3]].\n\n'O mutivo dato 'a $3 è chistu ccà: <em>$2</em>",
"viewpagelogs": "Vide 'e log azzeccate a sta paggena",
"log-action-filter-patrol": "Tipo 'e verifica:",
"log-action-filter-protect": "Tipo 'e protezione:",
"log-action-filter-rights": "Tipo 'e cagnamiento 'e deritte",
- "log-action-filter-suppress": "Tipo 'e suppressione",
+ "log-action-filter-suppress": "Tipo 'e suppressione:",
"log-action-filter-upload": "Tipo 'e carreca:",
"log-action-filter-all": "Tutte",
"log-action-filter-block-block": "Blocco",
"authprovider-confirmlink-message": "Verenno 'e tentative d'acciesso mò, l'utente ccà putessero avé nu cullegamento c' 'o cunto wiki d' 'o vuosto. A ffà cullegamento premmettesse appiccià 'o sistema 'e trasuta pe' bbìa 'e sti cunte. Pe' piacere sciglite 'e cunte addò vulite fà cullegamento.",
"authprovider-confirmlink-request-label": "Cunte ca s'avesser'a cullegà",
"authprovider-confirmlink-success-line": "$1: cullegato e apposto.",
- "authprovider-confirmlink-failed": "'O cullegamento 'e ll'utenza nun è ngarrato sano sano: $1"
+ "authprovider-confirmlink-failed": "'O cullegamento 'e ll'utenza nun è ngarrato sano sano: $1",
+ "authprovider-confirmlink-ok-help": "Cuntinuà aropp'a fà veré 'e mmasciate 'errore 'e cullegamento.",
+ "authprovider-resetpass-skip-label": "Passa 'a vacca",
+ "authprovider-resetpass-skip-help": "Passa 'a vacca 'mpustazion' 'e password.",
+ "authform-nosession-login": "'O prucesso 'autenticazione iette buono, ma 'o navigatóre d' 'o tuojo nun \"s'arricuorda\" si site trasuto/a.",
+ "authform-nosession-signup": "'O cunto è stato criato buono, ma 'o navigatóre d' 'o tuojo nun \"s'arricuorda\" si site trasuto/a.",
+ "authform-newtoken": "Token mancante. $1",
+ "authform-notoken": "Token mancante",
+ "authform-wrongtoken": "Token errato",
+ "specialpage-securitylevel-not-allowed-title": "Nun permesso",
+ "authpage-cannot-login": "Nun se pò accummencià a trasì.",
+ "authpage-cannot-login-continue": "Nun se pò cuntinuà a trasì. 'A sessione vosta fosse scaduta.",
+ "authpage-cannot-create": "Nun se pò accummencià 'a criazione 'utenza."
}
"Tarjeimo",
"Matma Rex",
"SuperPotato",
- "Nemo bis"
+ "Nemo bis",
+ "Telaneo"
]
},
"tog-underline": "Strek under lenker:",
"moredotdotdot": "Mer …",
"morenotlisted": "Denne lista er ufullstendig.",
"mypage": "Min brukerside",
- "mytalk": "Min diskusjonsside",
+ "mytalk": "Diskusjon",
"anontalk": "Brukerdiskusjon",
"navigation": "Navigasjon",
"and": " og",
"passwordreset-emailelement": "Brukernavn: \n$1\n\nMidlertidig passord: \n$2",
"passwordreset-emailsentemail": "Hvis denne epostadressen er koblet til din konto, så vil det bli sendt en epost om tilbakestilling av passord.",
"passwordreset-emailsentusername": "Hvis det finnes en epostadresse knyttet til dette brukernavnet, vil en epost med informasjon om tilbakestilling av passord bli sendt.",
- "passwordreset-emailsent-capture": "Passordtilbakestillingseposten vist under har blitt sendt ut.",
- "passwordreset-emailerror-capture": "En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til {{GENDER:$2|brukeren}}: $1",
"changeemail": "Endre eller fjerne epostadresse",
"changeemail-header": "Fyll ut dette skjemaet for å bytte din epost-adresse. Hvis du vil fjerne epostadressen fra din konto, kan du la ny epostadresse-feltet være tomt når.",
- "changeemail-passwordrequired": "Du må skrive inn passordet ditt for å bekrefte denne endringen.",
"changeemail-no-info": "Du må være innlogget for å få direkte tilgang til denne siden.",
"changeemail-oldemail": "Nåværende e-postadresse:",
"changeemail-newemail": "Ny e-postadresse:",
"minoredit": "Dette er en mindre endring",
"watchthis": "Overvåk denne siden",
"savearticle": "Lagre siden",
+ "publishpage": "Publiser siden",
+ "publishchanges": "Publiser endringene",
"preview": "Forhåndsvisning",
"showpreview": "Forhåndsvisning",
"showdiff": "Vis endringer",
"undo-nochange": "Det ser ut til at redigeringen allerede er tilbakestilt.",
"undo-summary": "Fjerner revisjon $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])",
"undo-summary-username-hidden": "Fjern revisjon $1 av en skjult bruker",
- "cantcreateaccounttitle": "Kan ikke opprette konto",
"cantcreateaccount-text": "Kontooppretting fra denne IP-adressen ('''$1''') har blitt blokkert av [[User:$3|$3]].\n\nGrunnen som ble oppgitt av $3 er ''$2''",
"cantcreateaccount-range-text": "Opprettelsen av en brukerkonto fra IP-adresser i intervallet <strong>$1</strong>, som inneholder din IP-adresse (<strong>$4</strong>), er blitt blokkert av [[User:$3|$3]].\n\nÅrsaken angitt av $3 er <em>$2</em>",
"viewpagelogs": "Vis logger for denne siden",
"minoredit": "Blots lütte Ännern",
"watchthis": "Op disse Siet oppassen",
"savearticle": "Siet spiekern",
+ "publishpage": "Siet nee afspiekern",
+ "publishchanges": "ännerte Siet afspiekern",
"preview": "Vörschau",
"showpreview": "Vörschau wiesen",
"showdiff": "Ünnerscheed wiesen",
"undo-failure": "Kunn de Siet nich op de vörige Version trüchdreihn. De Afsnitt is twischendör al wedder ännert worrn.",
"undo-norev": "De Ännern kunn nich trüchdreiht warrn, de gifft dat nich oder is wegsmeten worrn.",
"undo-summary": "Ännern $1 vun [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschoon]]) trüchdreiht.",
- "cantcreateaccounttitle": "Brukerkonto kann nich anleggt warrn",
"cantcreateaccount-text": "Dat Opstellen vun Brukerkonten vun de IP-Adress '''$1''' ut is vun [[User:$3|$3]] sperrt worrn.\n\nDe Grund weer: ''$2''",
"viewpagelogs": "Logbook för disse Siet",
"nohistory": "Disse Siet hett keen Vörgeschicht.",
"passwordreset-emailtext-user": "{{SITENAME}} को $1 प्रयोगकर्ताले {{SITENAME}} ($4)को लागि खाता विवरणको निम्ति एउटा अनुस्मारकको अनुरोध गरेको छ। निम्न प्रयोगकर्ता {{PLURAL:$3|खाता यस इमेल ठेगानासित सम्बन्धित छ|खाताहरू यस इमेल ठेगानासित सम्बन्धित छन्}}:\n\n$2\n\n{{PLURAL:$3|यो अस्थाई पासवर्डको|यी अस्थाई पासवर्डहरूको}} समय {{PLURAL:$5|एक दिन|$5 दिन}}मा सकिनेछ।\nतपाईंले प्रवेश गरेर अहिले नैं नयाँ पासवर्ड छान्नुहोस्। यदि अरु कसैले अनुरोध गरेको भए अथवा यदि तपाईंलाई मूल पासवर्ड याद भए अनि यसलाई परिवर्तन गर्न चाहनुहुन्न भनें, तपाईंले यस सन्देशलाई अनदेखा गर्नुहोस् र पुरानै पासवर्डलाई चालू राख्नुहोस्।",
"passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
"passwordreset-emailsentemail": "पासवर्ड परिवर्तनको लागि इमेल पठाइएको छ।",
- "passwordreset-emailsent-capture": "पासवर्ड परिवर्तनको लागि इमेल पठाइयो, जुन तल देखाइएकोछ।",
- "passwordreset-emailerror-capture": "पासवर्ड रिसेट इमेल जारि गरिएको छ, जुन तल देखाइएको छ, तर यसलाई {{GENDER:$2|प्रयोगकर्ता}}मा पठाउन विफल भयो: $1",
"changeemail": "इमेल ठेगाना परिवर्तन गर्नुहोस",
"changeemail-header": "खाताको इमेल ठेगाना परिवर्तन गर्नुहोस",
"changeemail-no-info": "यस पृष्ठमा सिधै जानको लागि प्रवेश गर्नु पर्ने हुन्छ ।",
"undo-nochange": "सम्पादन पहिला नै विफल गरिएको छ ।",
"undo-summary": " $1द्वारा पुनरावलोकन [[Special:Contributions/$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": "<strong>$1</strong> को श्रेणीमा आउने आइपि ठेगानाबाट, जसमा तपाईंको आइपि ठेगाना (<strong>$4</strong>) सामेल छ, नयाँ खाता सृजना [[User:$3|$3]]द्वारा अवरोधित गरिएको छ। \n\n$3 द्वारा दिइएको कारण: \"$2\"",
"viewpagelogs": "यस पृष्ठका लगहरू हेर्नुहोस्",
"listgrouprights-group": "समूह",
"listgrouprights-rights": "अधिकारहरु",
"listgrouprights-helppage": "Help:सामूहिक अधिकारहरु",
- "listgrouprights-members": "(सदसà¥\8dयहरà¥\81को सूची)",
+ "listgrouprights-members": "(सदसà¥\8dयहरà¥\82को सूची)",
"listgrouprights-addgroup": "{{PLURAL:$2|समूह|समूहहरु}}: $1 थप्ने",
"listgrouprights-removegroup": "{{PLURAL:$2|समूह|समूहहरु}}: $1 हटाउने",
"listgrouprights-addgroup-all": "सबै समूह थप्ने",
"contributions": "{{GENDER:$1|प्रयोगकर्ता}}का योगदानहरू",
"contributions-title": "$1को प्रयोगकर्ता योगदानहरू",
"mycontris": "योगदानहरू",
+ "anoncontribs": "योगदानहरू",
"contribsub2": " {{GENDER:$3|$1}} ($2)को लागि",
"contributions-userdoesnotexist": "प्रयोगकर्ता \"$1\" दर्ता गरिएको छैन् ।",
"nocontribs": "यस मापदण्ड अनुसार परिवर्त पाइएन।",
"tooltip-t-recentchangeslinked": "यस पृष्ठमा जोडिएका पृष्ठहरूमा हालैको परिवर्तन",
"tooltip-feed-rss": "यो पृष्ठको लागि RSS फिड",
"tooltip-feed-atom": "यो पृष्ठको लागि एटम फिड",
- "tooltip-t-contributions": "यस प्रयोगकर्ताका योगदानहरूको सूची हेर्नुहोस्",
+ "tooltip-t-contributions": "{{GENDER:$1|यस प्रयोगकर्ता}}का योगदानहरूको सूची हेर्नुहोस्",
"tooltip-t-emailuser": "यो प्रयोगकर्तालाई इमेल पठाउनुहोस्",
"tooltip-t-info": "यस पृष्ठको बारेमा थप जानकारी",
"tooltip-t-upload": "फाइल अपलोड गर्ने",
"special-characters-title-emdash": "इएम ड्यास",
"special-characters-title-minus": "घटाउने चिन्ह",
"mw-widgets-titleinput-description-new-page": "हालसम्म पृष्ठ उपलब्ध छैन्",
- "mw-widgets-titleinput-description-redirect": "$1 मा जाने",
- "api-error-blacklisted": "एउटा फरक वर्णनात्मक शीर्षक चयन गर्नुहोस् ।"
+ "mw-widgets-titleinput-description-redirect": "$1 मा जाने"
}
"Lemondoge",
"Dinosaur918",
"Jdforrester",
- "Jeleniccz"
+ "Jeleniccz",
+ "MrLeopold"
]
},
"tog-underline": "Koppelingen onderstrepen:",
"tagline": "Uit {{SITENAME}}",
"help": "Hulp",
"search": "Zoeken",
+ "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Koppen die worden genegeerd tijdens het zoeken.\n# Wijzigingen worden van kracht als een kop wordt geïndexeerd.\n# U kunt opnieuw indexeren afdwingen door het uitvoeren van een nullbewerking.\n# De syntaxis is al volgt:\n# * All tekst vanaf het teken \"#\" tot het einde van de regel wordt gezien als een opmerking;\n# * Iedere niet-lege regel is de precieze te negeren kop, inclusief hoofdlettergebruik en degelijke.\nReferenties\nExterne koppelingen\nZie ook\n #</pre> <!-- leave this line exactly as it is -->",
"searchbutton": "Zoeken",
"go": "OK",
"searcharticle": "OK",
"passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTijdelijk wachtwoord: \n$2",
"passwordreset-emailsentemail": "Als dit e-mailadres aan uw account gekoppeld is, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
"passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
- "passwordreset-emailsent-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.",
- "passwordreset-emailerror-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1",
"passwordreset-invalideamil": "Ongeldig e-mailadres",
"changeemail": "E-mailadres wijzigen of verwijderen",
"changeemail-header": "Vul dit formulier in om uw e-mailadres te wijzigen. Als u het e-mailadres wilt ontkoppelen van uw account, laat het e-mailadres dan leeg als u het formulier opslaat.",
- "changeemail-passwordrequired": "U moet uw wachtwoord invoeren om deze wijziging te bevestigen.",
"changeemail-no-info": "U moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.",
"changeemail-oldemail": "Huidig e-mailadres:",
"changeemail-newemail": "Nieuw e-mailadres:",
"content-model-css": "CSS",
"content-json-empty-object": "Leeg object",
"content-json-empty-array": "Lege reeks",
+ "deprecated-self-close-category": "Pagina's met ongeldige zelfsluitende HTML-tags",
"duplicate-args-warning": "<strong>Waarschuwing:</strong> [[:$1]] roept [[:$2]] aan met meer dan één waarde voor de parameter \"$3\". Alleen de laatste waarde wordt gebruikt.",
"duplicate-args-category": "Pagina's met dubbele sjabloonparameters",
"duplicate-args-category-desc": "De pagina bevat aanroepen van sjablonen waarin hetzelfde argument meerdere keren wordt gebruikt, bijvoorbeeld <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> of <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "De bewerking lijkt al ongedaan gemaakt te zijn.",
"undo-summary": "Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) ongedaan gemaakt",
"undo-summary-username-hidden": "Versie $1 door een verborgen gebruiker ongedaan gemaakt",
- "cantcreateaccounttitle": "Registreren is mislukt.",
"cantcreateaccount-text": "Registreren vanaf dit IP-adres ('''$1''') is geblokkeerd door [[User:$3|$3]].\n\nDe door $3 opgegeven reden is ''$2''",
"cantcreateaccount-range-text": "Het aanmaken van gebruikers vanaf IP-adressen in de range <strong>$1</strong> is niet mogelijk doordat dit is ingesteld door [[User:$3|$3]]. Uw IP-adres $4 bevindt zich in deze range.\n\nDe reden voor de blokkade is <em>$2</em>",
"viewpagelogs": "Logboek voor deze pagina bekijken",
"action-managechangetags": "labels aan te maken en te verwijderen",
"action-applychangetags": "labels aan uw bewerkingen toe te voegen",
"action-changetags": "willekeurige labels toe te voegen aan en te verwijderen van versies en logboekregels",
+ "action-purge": "Schoon deze pagina op",
"nchanges": "$1 {{PLURAL:$1|bewerking|bewerkingen}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sinds uw laatste bezoek}}",
"enhancedrc-history": "geschiedenis",
"Macofe",
"Chameleon222",
"Matma Rex",
- "Mortensson"
+ "Mortensson",
+ "Danmichaelo"
]
},
"tog-underline": "Strek under lenkjer:",
"nstab-category": "Kategori",
"mainpage-nstab": "Hovudside",
"nosuchaction": "Funksjonen finst ikkje",
- "nosuchactiontext": "Handlinga som er oppgjeven i adressa er ugyldig.\nDu har kanskje stava adressa feil, eller følgt ei feil lenkja.\nDette kan òg skuldast ein feil i programvara som er nytta av {{SITENAME}}.",
+ "nosuchactiontext": "Handlinga som er oppgjeven i adressa er ugyldig.\nDu har kanskje stava adressa feil, eller følgt ei feil lenkje.\nDette kan òg skuldast ein feil i programvara som er nytta av {{SITENAME}}.",
"nosuchspecialpage": "Det finst inga slik spesialside",
"nospecialpagetext": "Du har bede om ei spesialside som ikkje finst. Lista over spesialsider finn du [[Special:SpecialPages|her]].",
"error": "Feil",
"passwordreset-emailtext-user": "Brukaren $1 på {{SITENAME}} bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
"passwordreset-emailelement": "↓Brukarnamn: \n$1\n\nMellombels passord: \n$2",
"passwordreset-emailsentemail": "Ein e-post for attendestilling av passord er vorten send",
- "passwordreset-emailsent-capture": "Ein e-post om attendestilling av passord - vist under - er vorten send",
- "passwordreset-emailerror-capture": "Ein e-post om attendestilling av passord vart oppretta, og er vist nedanfor; men det lukkast ikkje å senda han til {{GENDER:$2|brukaren}}: $1",
"changeemail": "↓Endre e-postadresse",
"changeemail-header": "↓Endre kontoen si e-postadresse",
"changeemail-no-info": "↓Du må vera pålogga for å få tilgang direkte til denne sida.",
"minoredit": "Småplukk",
"watchthis": "Overvak sida",
"savearticle": "Lagra sida",
+ "publishpage": "Publiser sida",
+ "publishchanges": "Publiser endringar",
"preview": "Førehandsvising",
"showpreview": "Førehandsvis",
"showdiff": "Sjå skilnader",
"sectioneditnotsupported-text": "Endring av bolkar er ikkje støtta på denne sida.",
"permissionserrors": "Løyvefeil",
"permissionserrorstext": "Du har ikkje tilgang til å gjere dette, {{PLURAL:$1|grunnen|grunnane}} til det finn du her:",
- "permissionserrorstext-withaction": "Du har ikkje løyve til å $2 {{PLURAL:$1|på grunn av|av desse grunnane}}:",
+ "permissionserrorstext-withaction": "Du har ikkje løyve til å $2 {{PLURAL:$1|av di|av desse grunnane}}:",
"recreate-moveddeleted-warn": "'''Åtvaring: Du attopprettar ei side som tidlegare har vorte sletta.'''\n\nDu bør tenkje over om det er høveleg å halde fram med å endre denne sida.\nSletteloggen for sida finn du her:",
"moveddeleted-notice": "Sida er vorten sletta. Sletteloggen og flytteloggen er viste nedanfor for referanse.",
"log-fulllog": "Sjå full loggføring",
"undo-failure": "Endringa kunne ikkje attenderullast grunna konflikt med endringar som er gjorde i mellomtida.",
"undo-norev": "Endringa kunne ikkje fjernast fordi han ikkje finst eller vart sletta",
"undo-summary": "Rullar attende versjon $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])",
- "cantcreateaccounttitle": "Kan ikkje opprette brukarkonto",
"cantcreateaccount-text": "Kontooppretting frå denne IP-adressa ('''$1''') er blokkert av [[User:$3|$3]].\n\nGrunnen som vart gjeven av $3 er ''$2''",
"viewpagelogs": "Vis loggane for sida",
"nohistory": "Det finst ikkje nokon historikk for denne sida.",
"search-relatedarticle": "Relatert",
"searchrelated": "relatert",
"searchall": "alle",
- "showingresults": "Nedanfor er opp til {{PLURAL:$1|'''eitt'''|'''$1'''}} resultat som byrjar med nummer '''$2''' vist{{PLURAL:$1||e}}.",
+ "showingresults": "Nedanfor er opp til {{PLURAL:$1|<strong>eitt</strong>|<strong>$1</strong>}} resultat som byrjar med nummer <strong>$2</strong> vist{{PLURAL:$1||e}}.",
"search-showingresults": "Resultat <strong>{{PLURAL:$4|$1|$1–$2}}</strong> av <strong>$3</strong>",
"search-nonefound": "Ingen resultat svarte til førespurnaden.",
"search-nonefound-thiswiki": "Det var ingen resultat som passa til spørjinga på denne nettstaden.",
"protect-otherreason": "Anna/ytterlegare årsak:",
"protect-otherreason-op": "Anna årsak",
"protect-dropdown": "*Vanlege verneårsaker\n** Gjenteke hærverk\n** Gjenteke spam\n** Endringskrig\n** Side med mange vitjande",
- "protect-edit-reasonlist": "Endrar verneårsaker",
+ "protect-edit-reasonlist": "Endra verneårsaker",
"protect-expiry-options": "1 time:1 hour,1 dag:1 day,1 veke:1 week,2 veker:2 weeks,1 månad:1 month,3 månader:3 months,6 månader:6 months,1 år:1 year,endelaus:infinite",
"restriction-type": "Tilgang:",
"restriction-level": "Avgrensingsnivå:",
"duration-centuries": "$1 {{PLURAL:$1|hundreår|hundreår}}",
"duration-millennia": "$1 {{PLURAL:$1|tusenår|tusenår}}",
"rotate-comment": "Biletet vart dreitt $1{{PLURAL:$1|°}} med klokka",
- "limitreport-title": "Profildata for analysatoren:",
+ "limitreport-title": "Profildata for parseren:",
"limitreport-cputime": "CPU-tidsbruk",
"limitreport-cputime-value": "{{PLURAL:$1|eitt sekund|$1 sekund}}",
"limitreport-walltime-value": "{{PLURAL:$1|eitt sekund|$1 sekund}}",
"wlheader-showupdated": "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
"wlnote": "Çaijós {{PLURAL:$1|figura la darrièra modificacion efectuada|figuran las <strong>$1</strong> darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las <strong>$2</strong> darrièras oras}}, dempuèi $3, $4.",
"wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns",
+ "wlshowhideminor": "cambiaments menors",
"watchlist-options": "Opcions de la lista de seguiment",
"watching": "Seguit...",
"unwatching": "Fin del seguit...",
"isredirect": "pagina de redireccion",
"istemplate": "inclusion",
"isimage": "ligam cap al fichièr",
- "whatlinkshere-prev": "{{PLURAL:$1|precedent|$1 precedents}}",
+ "whatlinkshere-prev": "{{PLURAL:$1|precedenta|$1 precedentas}}",
"whatlinkshere-next": "{{PLURAL:$1|seguent|$1 seguents}}",
"whatlinkshere-links": "← ligams",
"whatlinkshere-hideredirs": "$1 las redireccions",
"table_pager_limit": "Far veire $1 elements per pagina",
"table_pager_limit_label": "Resultats per pagina :",
"table_pager_limit_submit": "Accedir",
- "table_pager_empty": "Cap de resultat",
+ "table_pager_empty": "Pas cap de resultat",
"autosumm-blank": "Blanquiment de la pagina",
"autosumm-replace": "Resumit automatic : contengut remplaçat per « $1 ».",
"autoredircomment": "Redireccion cap a [[$1]]",
"noname": "ଆପଣ ଗୋଟିଏ ବୈଧ ଇଉଜର ନାମ ଦେଇନାହାନ୍ତି ।",
"loginsuccesstitle": "ଠିକଭାବେ ଲଗ-ଇନ ହେଲା",
"loginsuccess": "'''ଆପଣ {{SITENAME}}ରେ \"$1\" ନାମରେ ଲଗ-ଇନ କରିଛନ୍ତି ।'''",
- "nosuchuser": "\"$1\" ନାମରà\87 à¬\95à\87ହି à¬\9cଣà\87 ବି ସà¬à\8dà\9f ନାହାନà\8dତି ।\nà¬\87à¬\89à¬\9cର ନାମ à¬\87à¬\82ରାà¬\9cà\80 à¬\9bà\8bà¬\9f à¬\93 ବଡ଼ à¬\85à¬\95à\8dଷର ପà\8dରତି ସମà\8dବà\87ଦନଶà\80ଳ ।\nà¬\86ପଣ ନିà¬\9cର ବନାନ ପରà¬\96ି ନିà¬\85ନà\8dତà\81, à¬\85ଥବା [[Special:CreateAccount|ନà\82à¬\86 à¬\96ାତାà¬\9fିà¬\8f ତିà¬\86ରି à¬\95ରନà\8dତà\81]] ।",
+ "nosuchuser": "\"$1\" ନାମରେ କେହି ଜଣେ ବି ସଭ୍ୟ ନାହାନ୍ତି ।\nଇଉଜର ନାମ ଇଂରାଜୀ ଛୋଟ ଓ ବଡ଼ ଅକ୍ଷର ପ୍ରତି ସମ୍ବେଦନଶୀଳ ।\nବନାନ ପରଖି ନିଅନ୍ତୁ, ଅଥବା [[Special:CreateAccount|ନୂଆ ଖାତାଟିଏ ତିଆରି କରନ୍ତୁ]] ।",
"nosuchusershort": "\"$1\" ନାମରେ କେହି ଜଣେ ବି ସଭ୍ୟ ନାହାନ୍ତି ।\nଆପଣ ବନାନ ପରଖି ନିଅନ୍ତୁ ।",
"nouserspecified": "ଆପଣଙ୍କୁ ଇଉଜର ନାମଟିଏ ଦେବାକୁ ପଡ଼ିବ ।",
"login-userblocked": "ଏହି ସଭ୍ୟଙ୍କୁ ଅଟକାଯାଇଛି । ଲଗ ଇନ କରିବାକୁ ଅନୁମତି ନାହିଁ ।",
"special-characters-title-endash": "en ଡ୍ୟାସ",
"special-characters-title-emdash": "em dash",
"special-characters-title-minus": "ମେନୁଗୁଡିକର ଚିହ୍ନ",
- "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ",
- "api-error-blacklisted": "ଦୟାକରି ଏକ ଅଲଗା, ବିବରଣୀ ଶିରୋନାମାରେ ରଖିବେ ।"
+ "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ"
}
"october-date": "$1 ਅਕਤੂਬਰ",
"november-date": "$1 ਨਵੰਬਰ",
"december-date": "$1 ਦਸੰਬਰ",
+ "period-am": "ਏਐਮ",
+ "period-pm": "ਪੀਐਮ",
"pagecategories": "{{PLURAL:$1|ਸ਼੍ਰੇਣੀ|ਸ਼੍ਰੇਣੀਆਂ}}",
"category_header": "ਸ਼੍ਰੇਣੀ \"$1\" ਵਿੱਚ ਲੇਖ",
"subcategories": "ਉਪਸ਼੍ਰੇਣੀਆਂ",
"mypage": "ਸਫ਼ਾ",
"mytalk": "ਗੱਲ-ਬਾਤ",
"anontalk": "ਗੱਲ-ਬਾਤ",
- "navigation": "ਫà©\87ਰà©\80 ਪਾà¨\93",
+ "navigation": "ਨà©\87ਵà©\80à¨\97à©\87ਸ਼ਨ",
"and": " ਅਤੇ",
"qbfind": "ਖੋਜ",
"qbbrowse": "ਝਲਕ",
"yourdomainname": "ਤੁਹਾਡਾ ਡੋਮੇਨ:",
"password-change-forbidden": "ਇਸ ਵਿਕੀ ਤੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।",
"externaldberror": "ਜਾਂ ਤਾਂ ਪ੍ਰਮਾਣਕੀ ਡਾਟਾਬੇਸ ਦੋਸ਼ ਆਇਆ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣੇ ਬਾਹਰੀ ਖਾਤੇ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
- "login": "ਲਾà¨\97à¨\87ਨ",
+ "login": "ਦਾà¨\96ਲ",
"login-security": "ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੜਤਾਲ ਕਰਵਾਉ",
"nav-login-createaccount": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
"userlogin": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
"createaccount-title": "{{SITENAME}} ਲਈ ਅਕਾਊਂਟ ਬਣਾਉਣਾ",
"createaccount-text": "ਕਿਸੇ ਨੇ \"$2\" ਮੈਂਬਰ-ਨਾਮ ਅਤੇ \"$3\" ਪਾਸਵਰਡ ਨਾਲ਼ {{SITENAME}} ($4) ਤੇ, ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਵਰਤਦੇ ਹੋਏ, ਖਾਤਾ ਬਣਾਇਆ ਹੈ।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣਾ ਚਾਹੀਦਾ ਹੈ।\n\nਜੇ ਇਹ ਖਾਤਾ ਗ਼ਲਤੀ ਨਾਲ਼ ਬਣ ਗਿਆ ਹੈ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਸਕਦੇ ਹੋ।",
"login-throttled": "ਤੁਸੀਂ ਬਹੁਤ ਸਾਰੀਆਂ ਤਾਜ਼ਾ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।\nਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ $1 ਉਡੀਕ ਕਰੋ ਜੀ।",
- "login-abort-generic": "ਤà©\81ਹਾਡਾ ਦਾà¨\96਼ਲਾ ਨਾà¨\95ਾਮ ਸੀ - ਅਧੂਰਾ ਛੱਡਿਆ",
+ "login-abort-generic": "ਤà©\81ਹਾਡਾ ਦਾà¨\96਼ਲਾ à¨\85ਸਫਲ ਸੀ - ਅਧੂਰਾ ਛੱਡਿਆ",
"login-migrated-generic": "ਤੁਹਾਡੇ ਖਾਤੇ ਦੀ ਥਾਂ ਬਦਲ ਦਿੱਤੀ ਗਈ ਹੈ ਅਤੇ ਤੁਹਾਡਾ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਹੁਣ ਇਸ ਵਿਕੀ 'ਤੇ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
"loginlanguagelabel": "ਭਾਸ਼ਾ: $1",
"suspicious-userlogout": "ਤੁਹਾਡੀ ਵਿਦਾਇਗੀ ਦੀ ਬੇਨਤੀ ਨਕਾਰ ਦਿੱਤੀ ਗਈ ਕਿਉਂਕਿ ਲੱਗਦਾ ਹੈ ਕਿ ਇਹ ਕਿਸੇ ਟੁੱਟੇ ਹੋਏ ਬਰਾਊਜ਼ਰ ਜਾਂ ਕੈਸ਼ ਹੋਈ ਪ੍ਰਾਕਸੀ ਤੋਂ ਭੇਜੀ ਗਈ ਸੀ।",
"createacct-another-realname-tip": "ਅਸਲੀ ਨਾਂ ਚੋਣਵਾਂ ਹੈ।\nਜੇਕਰ ਤੁਸੀਂ ਇਹ ਦਿੱਤਾ ਹੈ ਤਾਂ ਤੁਹਾਡੇ ਕੰਮ ਵਾਸਤੇ ਗੁਣ ਦੇ ਤੌਰ ਉੱਤੇ ਵਰਤਿਆ ਜਾਵੇਗਾ।",
- "pt-login": "ਲਾà¨\97 à¨\87ਨ",
- "pt-login-button": "ਲਾà¨\97 à¨\87ਨ",
+ "pt-login": "ਦਾà¨\96ਲ",
+ "pt-login-button": "ਦਾà¨\96ਲ",
"pt-createaccount": "ਖਾਤਾ ਬਣਾਓ",
"pt-userlogout": "ਬਾਹਰ ਆਉ",
"php-mail-error-unknown": "PHP ਦੇ ਮੇਲ() ਕਰਜ ਵਿੱਚ ਅਣਜਾਣ ਦੋਸ਼",
"resetpass_submit": "ਪਾਸਵਰਡ ਸੈੱਟ ਕਰੋ ਅਤੇ ਲਾਗਇਨ ਕਰੋ",
"changepassword-success": "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲਿਆ ਜਾ ਚੁੱਕਾ ਹੈ!",
"changepassword-throttled": "ਤੁਸੀਂ ਦਾਖ਼ਲ ਹੋਣ ਦੀਆਂ ਬਹੁਤ ਸਾਰੀਆਂ ਤਾਜ਼ਾ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।\nਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ $1 ਉਡੀਕ ਕਰੋ ਜੀ।",
+ "botpasswords": "ਬੌਟ ਪਾਸਵਰਡ",
+ "botpasswords-label-appid": "ਬੌਟਾ ਨਾੰ:",
+ "botpasswords-label-create": "ਬਣਾਓ",
+ "botpasswords-label-update": "ਨਵਿਆਉ",
+ "botpasswords-label-cancel": "ਰੱਦ ਕਰੋ",
+ "botpasswords-label-delete": "ਮਿਟਾਓ",
+ "botpasswords-label-resetpassword": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
"resetpass_forbidden": "ਪਾਸਵਰਡ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ",
"resetpass-no-info": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।",
"resetpass-submit-loggedin": "ਪਛਾਣ-ਸ਼ਬਦ ਬਦਲੋ",
"passwordreset-emailtext-user": "{{SITENAME}} 'ਤੇ User $1 ਨੇ ਤੁਹਾਡੇ {{SITENAME}} ($4) ਉਤਲੇ ਪਛਾਣ-ਸ਼ਬਦ ਨੂੰ ਮੁੜ-ਬਣਾਉਣ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਸ ਈਮੇਲ ਪਤੇ ਨਾਲ਼ ਹੇਠ ਲਿਖੇ {{PLURAL:$3|ਖਾਤੇ|ਖਾਤਿਆਂ}} ਦਾ ਵਾਸਤਾ ਹੈ:\n\n$2\n\n{{PLURAL:$3|ਇਸ ਆਰਜ਼ੀ ਪਛਾਣ-ਸ਼ਬਦ|ਇਹਨਾਂ ਆਰਜ਼ੀ ਪਛਾਣ-ਸ਼ਬਦਾਂ}} ਦੀ ਮਿਆਦ {{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} 'ਚ ਮੁੱਕ ਜਾਵੇਗੀ।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਦਾਖ਼ਲ ਹੋ ਕੇ ਕੋਈ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਬਣਾ ਲੈਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇਕਰ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਹਿਲਾ ਪਛਾਣ-ਸ਼ਬਦ ਯਾਦ ਆ ਗਿਆ ਹੈ ਅਤੇ ਹੁਣ ਤੁਸੀਂ ਉਹਨੂੰ ਬਦਲ਼ਨਾ ਨਹੀਂ ਲੋਚਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਅਣਡਿੱਠਾ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਛਾਣ-ਸ਼ਬਦ ਵਰਤਦੇ ਰਹਿ ਸਕਦੇ ਹੋ।",
"passwordreset-emailelement": "ਯੂਜ਼ਰ-ਨਾਂ: \n$1\n\nਆਰਜ਼ੀ ਪਾਸਵਰਡ: \n$2",
"passwordreset-emailsentemail": "ਇੱਕ ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।",
- "passwordreset-emailsent-capture": "ਇੱਕ ਯਾਦ-ਦਹਾਨੀ ਈ-ਮੇਲ, ਜਿਹੜੀ ਕਿ ਹੇਠਾਂ ਦਿੱਸ ਰਹੀ ਹੈ, ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।",
- "passwordreset-emailerror-capture": "ਪਛਾਣ-ਸ਼ਬਦ ਮੁੜ ਬਣਾਉਣ ਵਾਸਤੇ ਈਮੇਲ ਤਿਆਰ ਹੋ ਗਈ ਸੀ, ਜੋ ਹੇਠਾਂ ਵਿਖਾਈ ਗਈ ਹੈ, ਪਰ ਇਹਨੂੰ {{GENDER:$2|ਵਰਤੋਂਕਾਰ}} ਵੱਲ ਨਹੀਂ ਘੱਲਿਆ ਜਾ ਸਕਿਆ: $1",
- "changeemail": "ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ",
+ "passwordreset-invalideamil": "ਗ਼ਲਤ ਈਮੇਲ ਪਤਾ",
+ "changeemail": "ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ ਜਾੰ ਹਟਾਓ",
"changeemail-header": "ਖਾਤੇ ਵਾਲਾ ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ",
"changeemail-no-info": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।",
"changeemail-oldemail": "ਮੌਜੂਦਾ ਈਮੇਲ ਸਿਰਨਾਵਾਂ:",
"minoredit": "ਇਹ ਇੱਕ ਛੋਟੀ ਸੋਧ ਹੈ",
"watchthis": "ਇਸ ਸਫ਼ੇ ’ਤੇ ਨਜ਼ਰ ਰੱਖੋ",
"savearticle": "ਸਫ਼ਾ ਸਾਂਭੋ",
+ "savechanges": "ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ",
"preview": "ਝਲਕ",
"showpreview": "ਝਲਕ ਵਿਖਾਓ",
"showdiff": "ਤਬਦੀਲੀਆਂ ਵਿਖਾਉ",
"missingsummary": "'''ਯਾਦ-ਦਹਾਨੀ:''' ਤੁਸੀਂ ਸੋਧ ਸਾਰ ਮੁਹੱਈਆ ਨਹੀਂ ਕਰਵਾਇਆ। ਜੇ ਤੁਸੀਂ \"{{int:savearticle}}\" ਤੇ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕੀਤਾ ਤਾਂ ਤੁਹਾਡਾ ਸਫ਼ਾ ਇਸਦੇ ਬਿਨਾਂ ਹੀ ਸਾਂਭਿਆ ਜਾਵੇਗਾ।",
"missingcommenttext": "ਹੇਠਾਂ ਇੱਕ ਟਿੱਪਣੀ ਦਿਓ।",
"summary-preview": "ਸੋਧ ਸਾਰ ਦੀ ਝਲਕ:",
- "subject-preview": "ਵਿਸ਼ੇ/ਸਿਰਨਾਵੇਂ ਦੀ ਝਲਕ:",
+ "subject-preview": "ਵਿਸ਼ੇ ਦੀ ਝਲਕ:",
"previewerrortext": "ਤੁਹਾਡੀਆਂ ਤਬਦੀਲੀਆਂ ਦੀ ਝਲਕ ਵਿਖਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਗ਼ਲਤੀ ਆ ਗਈ।",
"blockedtitle": "ਵਰਤੋਂਕਾਰ ਉੱਤੇ ਪਾਬੰਦੀ ਲੱਗੀ ਹੋਈ ਹੈ",
"blockedtext": "'''ਤੁਹਾਡੇ ਮੌਮਬਰ ਨਾਮ ਜਾਂ IP ਪਤੇ ’ਤੇ ਪਾਬੰਦੀ ਲੱਗ ਚੁੱਕੀ ਹੈ।'''\n\nਪਾਬੰਦੀ $1 ਨੇ ਲਾਈ ਹੈ।\nਦਿੱਤਾ ਗਿਆ ਕਾਰਨ ਇਹ ਹੈ, ''$2''।\n\n* ਪਾਬੰਦੀ ਸ਼ੁਰੂ: $8\n* ਪਾਬੰਦੀ ਖਤਮ: $6\n* ਪਾਬੰਦੀ ਲਾਉਣ ਵਾਲੇ ਦਾ ਇਰਾਦਾ: $7\n\nਪਾਬੰਦੀ ਬਾਰੇ ਚਰਚਾ ਕਰਨ ਲਈ ਤੁਸੀਂ $1 ਜਾਂ ਕਿਸੇ ਹੋਰ\n[[{{MediaWiki:Grouppage-\nsysop}}|administrator]] ਨਾਲ ਰਾਬਤਾ ਕਰ ਸਕਦੇ ਹੋ।\nਤੁਸੀਂ 'ਇਸ ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ' ਸਹੂਲਤ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਸਕਦੇ ਜੇ ਤੁਹਾਡੀਆਂ [[Special:Preferences|ਖਾਤਾ ਪਸੰਦਾਂ]] ਵਿੱਚ ਇੱਕ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਨਹੀਂ ਦਿੱਤਾ ਗਿਆ ਜਾਂ ਜੇ ਤੁਹਾਡੇ ਇਸਨੂੰ ਵਰਤਣ ਤੇ ਪਾਬੰਦੀ ਹੈ।\nਤੁਹਾਡਾ ਚਾਲੂ IP ਪਤਾ $3 ਹੈ,\nਅਤੇ ਪਾਬੰਦੀ ਪਤਾ #$5 ਹੈ।\nਮਿਹਰਬਾਨੀ ਕਰਕੇ ਆਪਣੇ ਕਿਸੇ ਵੀ ਸਵਾਲ ਜਾਂ ਪੁੱਛ-ਗਿੱਛ ਵਿਚ ਇਹ ਉੱਪਰਲੀ ਤਫ਼ਸੀਲ ਜ਼ਰੂਰ ਸ਼ਾਮਲ ਕਰੋ।",
"nosuchsectiontitle": "ਭਾਗ ਲੱਭ ਨਹੀਂ ਰਿਹਾ",
"nosuchsectiontext": "ਤੁਸੀਂ ਨਾ-ਮੌਜੂਦ ਭਾਗ ਨੂੰ ਸੋਧਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਹੈ।\nਸ਼ਾਇਦ ਤੁਹਾਡੇ ਸਫ਼ੇ ਨੂੰ ਵੇਖਣ ਦੇ ਦੌਰਾਨ ਇਹ ਮਿਟਾਇਆ ਜਾਂ ਇਸਦਾ ਸਿਰਲੇਖ ਬਦਲਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।",
"loginreqtitle": "ਲਾਗਇਨ ਚਾਹੀਦਾ ਹੈ",
- "loginreqlink": "ਲਾà¨\97à¨\87ਨ",
+ "loginreqlink": "ਦਾà¨\96ਲ",
"loginreqpagetext": "ਹੋਰ ਸਫ਼ੇ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ $1 ਕਰਨਾ ਪਵੇਗਾ।",
"accmailtitle": "ਪਾਸਵਰਡ ਭੇਜਿਆ।",
"accmailtext": "[[User talk:$1|$1]] ਲਈ ਰਲ਼ਵੇਂ ਤੌਰ ’ਤੇ ਬਣਿਆ ਪਾਸਵਰਡ $2 ਨੂੰ ਭੇਜਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।\nਇਸ ਨਵੇਂ ਖਾਤੇ ਲਈ ਲਾਗਇਨ ਕਰਨ ਤੋਂ ਬਾਅਦ ''[[Special:ChangePassword|ਪਾਸਵਰਡ ਬਦਲੋ]]'' ’ਤੇ ਜਾ ਕੇ ਪਾਸਵਰਡ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।",
"undo-nochange": "ਲਗਦਾ ਹੈ ਕਿ ਿਹ ਸੋਧ ਪਹਿਲਾਂ ਹੀ ਮੋੜ ਦਿੱਤੀ ਗਈ ਹੈ।",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ਗੱਲ-ਬਾਤ]]) ਦੀ ਸੋਧ $1 ਨਕਾਰੀ",
"undo-summary-username-hidden": "ਗੁਪਤ ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਕੀਤੀ $1 ਸੋਧ ਰੱਦ ਕਰੋ",
- "cantcreateaccounttitle": "ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ",
"cantcreateaccount-text": "[[User:$3|$3]] ਨੇ ਇਸ IP ਪਤੇ ('''$1''') ਤੋਂ ਖਾਤਾ ਬਣਾਉਣ ਤੇ ਪਾਬੰਦੀ ਲਾਈ ਹੈ।\n\n$3 ਨੇ ਕਾਰਨ ਇਹ ਦੱਸਿਆ ਹੈ, ''$2''",
"viewpagelogs": "ਇਹ ਸਫ਼ੇ ਲਈ ਇੰਦਰਾਜ ਵੇਖੋ",
"nohistory": "ਇਸ ਸਫ਼ੇ ਲਈ ਕੋਈ ਸੋਧ ਅਤੀਤ ਨਹੀਂ ਹੈ।",
"history-feed-empty": "ਦਰਖ਼ਾਸਤਸ਼ੁਦਾ ਸਫ਼ਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।\nਸ਼ਾਇਦ ਇਸਨੂੰ ਵਿਕੀ ਤੋਂ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ ਜਾਂ ਨਾਮ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਹੈ।\nਵਿਕੀ ਦੇ ਨਵੇਂ ਮੁਨਾਸਿਬ ਸਫ਼ਿਆਂ ਵਿਚ [[Special:Search|ਲੱਭਣ]] ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
"rev-deleted-comment": "(ਸੋਧ ਸਾਰ ਹਟਾਇਆ)",
"rev-deleted-user": "(ਵਰਤੋਂਕਾਰ ਨਾਂ ਹਟਾਇਆ)",
- "rev-deleted-event": "(ਲਾà¨\97 à¨\95ਾਰਵਾà¨\88 ਹà¨\9fਾà¨\88 à¨\97à¨\88)",
+ "rev-deleted-event": "(ਲਾà¨\97 ਵà©\87ਰਵਾ ਹà¨\9fਾà¨\87à¨\86 à¨\97ਿà¨\86)",
"rev-deleted-user-contribs": "[ਮੈਂਬਰ-ਨਾਂ ਜਾਂ IP ਪਤਾ ਹਟਾਇਆ - ਸੋਧ ਯੋਗਦਾਨਾਂ ਵਿਚੋਂ ਓਹਲੇ ਕੀਤੀ]",
"rev-deleted-text-permission": "ਸਫ਼ੇ ਦੀ ਇਹ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।\nਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|\npage={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।",
"rev-deleted-text-unhide": "ਸਫ਼ੇ ਦੀ ਇਹ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।\nਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|\npage={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।\nਜੇ ਤੁਸੀਂ ਅੱਗੇ ਵਧਣਾ ਚਾਹੋ ਤਾਂ ਹਾਲੇ ਵੀ [$1 ਇਹ ਰੀਵਿਜ਼ਨ ਵੇਖ] ਸਕਦੇ ਹੋ।",
"mergehistory-submit": "ਰੀਵਿਜ਼ਨਾਂ ਰਲ਼ਾਓ",
"mergehistory-empty": "ਕੋਈ ਰੀਵਿਜ਼ਨ ਰਲ਼ਾਈ ਨਹੀ ਜਾ ਸਕਦੀ।",
"mergehistory-done": "$1 {{PLURAL:|ਦੀ|ਦੀਆਂ}} $3 {{PLURAL:$3|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}} ਕਾਮਯਾਬੀ ਨਾਲ਼ [[:$2]] ਵਿਚ {{PLURAL:$3|ਰਲ਼ਾਈ|ਰਲ਼ਾਈਆਂ}}।",
+ "mergehistory-fail-bad-timestamp": "ਸਮਾੰਮੋਹਰ ਗਲਤ ਹੈ।",
+ "mergehistory-fail-invalid-source": "ਸਰੋਤ ਸਫ਼ਾ ਗਲਤ ਹੈ।",
"mergehistory-no-source": "ਸਰੋਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
"mergehistory-no-destination": "ਨੀਯਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
"mergehistory-invalid-source": "ਸਰੋਤ ਸਫ਼ਾ ਇੱਕ ਸਹੀ ਸਿਰਲੇਖ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
"prefs-rc": "ਹਾਲੀਆ ਤਬਦੀਲੀਆਂ",
"prefs-watchlist": "ਨਿਗਰਾਨ-ਸੂਚੀ",
"prefs-editwatchlist": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ",
+ "prefs-editwatchlist-clear": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸਾਫ ਕਰੋ",
"prefs-watchlist-days": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਦਿਨ:",
"prefs-watchlist-days-max": "ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}",
"prefs-watchlist-edits": "ਵਧਾਈ ਹੋਈ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ ਤਬਦੀਲੀਆਂ:",
"prefs-watchlist-token": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਟੋਕਨ:",
"prefs-misc": "ਫੁਟਕਲ",
"prefs-resetpass": "ਪਛਾਣ-ਸ਼ਬਦ ਬਦਲੋ",
- "prefs-changeemail": "ਈ-ਮੇਲ ਪਤਾ ਬਦਲੋ",
+ "prefs-changeemail": "ਈ-ਮੇਲ ਪਤਾ ਬਦਲੋ ਜਾੰ ਹਟਾਓ",
"prefs-setemail": "ਈ-ਮੇਲ ਪਤਾ ਸੈੱਟ ਕਰੋ",
"prefs-email": "ਈਮੇਲ ਚੋਣਾਂ",
"prefs-rendering": "ਦਿੱਖ",
"right-upload_by_url": "URL ਤੋਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ",
"right-autoconfirmed": "ਨੀਮ-ਸੁਰੱਖਿਅਤ ਸਫ਼ਿਆਂ ਨੂੰ ਸੋਧਣਾ",
"right-bot": "ਇੱਕ ਸਵੈ-ਚਾਲਤ ਅਮਲ ਵਜੋਂ ਗਿਣਿਆ ਜਾਣਾ",
- "right-writeapi": "à¨\8fਪà©\80à¨\86à¨\88(API) ਦà©\80 ਵਰਤà©\8bà¨\82",
+ "right-writeapi": "ਲਿà¨\96ਾà¨\88 à¨\8fਪà©\80à¨\86à¨\88 ਦà©\80 ਵਰਤà©\8bà©°",
"right-delete": "ਸਫ਼ੇ ਹਟਾਓ",
"right-bigdelete": "ਵੱਡੇ ਅਤੀਤ ਵਾਲੇ ਪੰਨੇ ਮਿਟਾਉਣੇ",
"right-browsearchive": "ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ",
"right-siteadmin": "ਡੈਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਉਣਾ ਤੇ ਖੋਲ੍ਹਣਾ",
"right-sendemail": "ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣਾ",
"right-passwordreset": "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈਮੇਲ ਵੇਖੋ",
+ "grant-group-email": "ਈ-ਮੇਲ ਭੇਜੋ",
+ "grant-group-customization": "ਅਨੁਕੂਲਨ ਅਤੇ ਪਸੰਦਾੰ",
+ "grant-createaccount": "ਖਾਤੇ ਬਣਾਓ",
+ "grant-createeditmovepage": "ਸਫ਼ੇ ਬਣਾਓ, ਸੋਧ, ਅਤੇ ਹਿੱਲਾਓ",
+ "grant-editmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ",
+ "grant-editprotected": "ਸੁਰੱਖਿਅਤ ਸਫ਼ੇ ਸੋਧ",
+ "grant-uploadfile": "ਨਵੀਆੰ ਫਾਈਲਾੰ ਅੱਪਲੋਡ ਕਰੋ",
+ "grant-basic": "ਬੁਨਿਆਦੀ ਹੱਕ",
+ "grant-viewmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵੇਖੋ",
"newuserlogpage": "ਬਣਾਏ ਖਾਤਿਆਂ ਦਾ ਚਿੱਠਾ",
"newuserlogpagetext": "ਇਹ ਬਣੇ ਮੈਂਬਰਾਂ ਦਾ ਚਿੱਠਾ ਹੈ।",
"rightslog": "ਵਰਤੋਂਕਾਰ ਹੱਕਾਂ ਦਾ ਚਿੱਠਾ",
"rightslogtext": "ਇਹ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਦਾ ਚਿੱਠਾ ਹੈ।",
"action-read": "ਇਹ ਸਫ਼ਾ ਪੜ੍ਹੋ",
"action-edit": "ਇਹ ਸਫ਼ਾ ਸੋਧੋ",
- "action-createpage": "ਸਫ਼à©\87 ਬਣਾਓ",
- "action-createtalk": "à¨\9aਰà¨\9aਾ ਸਫ਼à©\87 ਬਣਾਉਣ",
+ "action-createpage": "à¨\87ਹ ਸਫ਼ਾ ਬਣਾਓ",
+ "action-createtalk": "à¨\87ਹ à¨\9aਰà¨\9aਾ ਸਫ਼ਾ ਬਣਾਉਣ",
"action-createaccount": "ਇਹ ਵਰਤੋਂਕਾਰ ਖਾਤਾ ਬਣਾਓ",
"action-history": "ਇਸ ਸਫ਼ੇ ਦਾ ਅਤੀਤ ਵੇਖੋ",
"action-minoredit": "ਇਹ ਸੋਧ ਨੂੰ ਛੋਟੀ ਤੌਰ ਉੱਤੇ ਮੰਨੋ",
"action-block": "ਇਸ ਮੈਂਬਰ ਦੇ ਸੋਧ ਕਰਨ ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
"action-protect": "ਇਸ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ",
"action-import": "ਹੋਰ ਵਿਕੀ ਤੋਂ ਇਹ ਸਫ਼ਾ ਲਵੋ",
- "action-importupload": "ਫ਼ਾà¨\88ਲ à¨\85ੱਪਲà©\8bਡ ਤà©\8bà¨\82 à¨\87ਹ ਸਫ਼ਾ ਮੰਗਾਓ",
+ "action-importupload": "ਫ਼ਾà¨\88ਲ à¨\85ੱਪਲà©\8bਡ ਤà©\8bà¨\82 ਸਫà©\87 ਮੰਗਾਓ",
"action-unwatchedpages": "ਨਜ਼ਰ ਨਾ ਰੱਖੇ ਜਾ ਰਹੇ ਸਫ਼ਿਆਂ ਦੀ ਸੂਚੀ ਵੇਖੋ",
"action-mergehistory": "ਇਸ ਸਫ਼ੇ ਦੇ ਅਤੀਤ ਨੂੰ ਰਲ਼ਾਉਣ",
"action-userrights": "ਵਰਤੋਂਕਾਰ ਦੇ ਸਾਰੇ ਹੱਕ ਸੋਧਣ",
"recentchanges-feed-description": "ਇਸ ਵਿਕੀ ’ਤੇ ਹਾਲ ‘ਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।",
"recentchanges-label-newpage": "ਇਸ ਸੋਧ ਨਾਲ਼ ਨਵਾਂ ਸਫ਼ਾ ਬਣਿਆ ਹੈ",
"recentchanges-label-minor": "ਇਹ ਇੱਕ ਛੋਟੀ ਸੋਧ ਹੈ",
- "recentchanges-label-bot": "à¨\87ਹ ਸà©\8bਧ à¨\87ੱà¨\95 ਬà©\8bਟ ਦੁਆਰਾ ਕੀਤੀ ਗਈ ਸੀ",
+ "recentchanges-label-bot": "à¨\87ਹ ਸà©\8bਧ à¨\87ੱà¨\95 ਬà©\8cਟ ਦੁਆਰਾ ਕੀਤੀ ਗਈ ਸੀ",
"recentchanges-label-unpatrolled": "ਇਹ ਫੇਰ-ਬਦਲ ਹਾਲੇ ਵੇਖਿਆ ਨਹੀਂ ਗਿਆ",
"recentchanges-label-plusminus": "ਸਫ਼ੇ ਵਿੱਚ ਇੰਨੀਆਂ ਬਾਈਟਾਂ ਦੀ ਤਬਦੀਲੀ ਹੋਈ",
"recentchanges-legend-heading": "<strong>ਟੀਕਾ:</strong>",
"rcshowhidemine": "ਮੇਰੀਆਂ ਤਬਦੀਲੀਆਂ $1",
"rcshowhidemine-show": "ਵੇਖੋ",
"rcshowhidemine-hide": "ਓਹਲੇ",
+ "rcshowhidecategorization-show": "ਦਿਖਾਓ",
+ "rcshowhidecategorization-hide": "ਲੁਕਾਉ",
"rclinks": "ਪਿਛਲੇ $2 ਦਿਨਾਂ ਵਿੱਚ ਹੋਈਆਂ $1 ਤਬਦੀਲੀਆਂ ਵਖਾਓ<br /> $3",
"diff": "ਫ਼ਰਕ",
"hist": "ਅਤੀਤ",
"upload-file-error": "ਅੰਦਰੂਨੀ ਗਲਤੀ",
"upload-misc-error": "ਅਣਪਛਾਤੀ ਅੱਪਲੋਡ ਗਲਤੀ",
"upload-http-error": "ਇੱਕ HTTP ਗ਼ਲਤੀ ਹੋਈ: $1",
+ "upload-dialog-title": "ਫ਼ਾਈਲ ਅਪਲੋਡ ਕਰੋ",
+ "upload-dialog-button-cancel": "ਰੱਦ ਕਰੋ",
+ "upload-dialog-button-done": "ਮੁਕੰਮਲ",
+ "upload-dialog-button-save": "ਸਾਂਭੋ",
+ "upload-dialog-button-upload": "ਅੱਪਲੋਡ",
+ "upload-form-label-infoform-title": "ਵੇਰਵਾ",
+ "upload-form-label-infoform-name": "ਨਾਂ",
+ "upload-form-label-infoform-description": "ਵਰਨਣ",
+ "upload-form-label-usage-title": "ਉਪਯੋਗਤਾ",
+ "upload-form-label-usage-filename": "ਫ਼ਾਈਲ ਦਾ ਨਾਂ",
+ "upload-form-label-own-work": "ਇਹ ਮੇਰਾ ਆਪਣਾ ਕੰਮ ਹੈ",
+ "upload-form-label-infoform-categories": "ਸ਼੍ਰੇਣੀਆਂ",
"upload-form-label-infoform-date": "ਤਾਰੀਖ਼",
"backend-fail-notexists": "ਫ਼ਾਈਲ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
"backend-fail-delete": "ਫ਼ਾਈਲ \"$1\" ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
"backend-fail-create": "\"$1\" ਫ਼ਾਈਲ ਲਿਖੀ ਨਾ ਜਾ ਸਕੀ।",
"zip-wrong-format": "ਦੱਸੀ ਗਈ ਫ਼ਾਈਲ ਜ਼ਿੱਪ ਫ਼ਾਈਲ ਨਹੀਂ ਸੀ।",
"uploadstash-refresh": "ਫ਼ਾਈਲਾਂ ਦੀ ਲਿਸਟ ਨੂੰ ਤਾਜ਼ਾ ਕਰੋ",
+ "uploadstash-thumbnail": "ਥੰਮਨੇਲ ਵੇਖੋ",
"img-auth-accessdenied": "ਪਹੁੰਚ ਨਕਾਰੀ ਗਈ",
"img-auth-nofile": "ਫ਼ਾਈਲ \"$1\" ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
+ "http-invalid-url": "ਗਲਤ URL: $1",
"upload-curl-error6": "URL ’ਤੇ ਪਹੁੰਚਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।",
"upload-curl-error6-text": "ਦਿੱਤੇ ਹੋਏ URL ’ਤੇ ਪਹੁੰਚਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।\nਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ ਕਿ URL ਸਹੀ ਹੈ ਅਤੇ ਸਾਈਟ ਉਪਲੱਬਧ ਹੈ।",
"upload-curl-error28": "ਅੱਪਲੋਡ ਟਾਈਮ-ਆਉਟ",
"uploadnewversion-linktext": "ਇਸ ਫਾਇਲ ਦਾ ਇੱਕ ਨਵਾਂ ਵਰਜਨ ਅੱਪਲੋਡ ਕਰੋ",
"shared-repo-from": "$1 ਤੋਂ",
"shared-repo": "ਕੋਈ ਸਾਂਝਾ ਕੀਤਾ ਭੰਡਾਰ",
- "upload-disallowed-here": "ਤà©\81ਸà©\80à¨\82 à¨\87ਸ ਫ਼ਾà¨\88ਲ à¨\89ੱਤà©\87 ਨਹà©\80à¨\82 ਨਹà©\80à¨\82 ਲਿà¨\96 ਸà¨\95ਦà©\87।",
+ "upload-disallowed-here": "ਤੁਸੀਂ ਇਸ ਫ਼ਾਈਲ ਉੱਤੇ ਨਹੀਂ ਲਿਖ ਸਕਦੇ।",
"filerevert": "$1 ਰੀਵਰਟ",
"filerevert-legend": "ਫਾਇਲ ਰੀਵਰਟ",
"filerevert-comment": "ਕਾਰਨ:",
"randomincategory-nopages": "[[:Category:$1|$1]] ਸ਼੍ਰੇਣੀ ਵਿਚ ਕੋਈ ਸਫ਼ਾ ਨਹੀਂ ਹੈ।",
"randomincategory-category": "ਵਰਗ:",
"randomincategory-legend": "ਵਰਗ ਵਿਚਲਾ ਰਲ਼ਵਾਂ ਸਫ਼ਾ",
+ "randomincategory-submit": "ਜਾਓ",
"randomredirect": "ਰਲ਼ਵਾਂ ਰੀਡਿਰੈਕਟ",
"statistics": "ਅੰਕੜੇ",
"statistics-header-pages": "ਸਫ਼ਾ ਅੰਕੜੇ",
"pager-newer-n": "{{PLURAL:$1|1 ਨਵਾਂ|$1 ਨਵੇਂ}}",
"pager-older-n": "{{PLURAL:$1|1 ਪੁਰਾਣਾ|$1 ਪੁਰਾਣੇ}}",
"suppress": "ਨਿਗਰਾਨ",
+ "apihelp": "API ਮਦਦ",
+ "apihelp-no-such-module": "ਮੌਡੂਲ \"$1\" ਨਹੀਂ ਲੱਭਾ।",
+ "apisandbox-unfullscreen": "ਸਫ਼ਾ ਵੇਖਾਓ",
+ "apisandbox-reset": "ਸਾਫ਼ ਕਰੋ",
+ "apisandbox-retry": "ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ",
+ "apisandbox-helpurls": "ਮਦਦ ਜੋੜ",
+ "apisandbox-examples": "ਮਿਸਾਲਾਂ",
+ "apisandbox-results": "ਨਤੀਜੇ",
"booksources": "ਪੁਸਤਕਾਂ ਦੇ ਸਰੋਤ",
"booksources-search-legend": "ਕਿਤਾਬਾਂ ਦੇ ਸਰੋਤ ਖੋਜੋ",
"booksources-search": "ਭਾਲ਼",
"listgrouprights-removegroup-self-all": "ਆਪਣੇ ਖਾਤੇ ਤੋਂ ਸਾਰੇ ਸਮੂਹ ਹਟਾਓ",
"listgrouprights-namespaceprotection-header": "ਨਾਂ-ਥਾਂ ਦੀਆਂ ਬੰਧੇਜਾਂ",
"listgrouprights-namespaceprotection-namespace": "ਨਾਂ-ਥਾਂ",
+ "listgrants-rights": "ਹੱਕ",
"trackingcategories": "ਵਰਗਾਂ ਦੀ ਪੈੜ",
"trackingcategories-msg": "ਵਰਗ ਦੀ ਪੈੜ",
"trackingcategories-name": "ਸੁਨੇਹੇ ਦਾ ਨਾਂ",
"watchlist-details": "ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵਿਚ{{PLURAL:$1|$1 ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।",
"wlheader-enotif": "ਈਮੇਲ ਸੂਚਨਾ ਚਾਲੂ ਹੈ।",
"wlnote": "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|'''$2''' ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:\n$1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ}}, ਹੇਠਾਂ ਵੇਖੋ।",
- "wlshowlast": "ਪਿਛਲੇ $1 ਘੰਟੇ $2 ਦਿਨ ਵਖਾਓ",
+ "wlshowlast": "ਪਿਛਲੇ $1 ਘੰਟੇ $2 ਦਿਨ ਵਖਾਓ",
+ "watchlist-hide": "ਲੁਕਾਓ",
"watchlist-submit": "ਦਿਖਾਓ",
+ "wlshowhideminor": "ਨਿੱਕੀਆਂ ਸੋਧਾਂ",
+ "wlshowhidebots": "ਬੌਟ",
+ "wlshowhideanons": "ਗੁਮਨਾਮ ਵਰਤੋਂਕਾਰ",
+ "wlshowhidepatr": "ਜਾਂਚੀਆਂ ਸੋਧਾੰ",
+ "wlshowhidemine": "ਮੇਰੀਆਂ ਸੋਧਾਂ",
"watchlist-options": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਦੀਆਂ ਚੋਣਾਂ",
"watching": "ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...",
"unwatching": "ਨਿਗ੍ਹਾ ਰੱਖਣੀ (ਵਾਚ) ਬੰਦ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..",
"sessionfailure-title": "ਇਜਲਾਸ ਫੇਲ੍ਹ",
"changecontentmodel-title-label": "ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ",
"changecontentmodel-reason-label": "ਕਾਰਨ:",
+ "changecontentmodel-submit": "ਬਦਲੋ",
"protectlogpage": "ਸੁਰੱਖਿਆ ਚਿੱਠਾ",
"protectedarticle": "\"[[$1]]\" ਸੁਰੱਖਿਅਤ ਕੀਤਾ",
"modifiedarticleprotection": "\"[[$1]]\" ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੀ",
"sp-contributions-username": "IP ਪਤਾ ਜਾਂ ਵਰਤੋਂਕਾਰਨਾਮ:",
"sp-contributions-toponly": "ਸਿਰਫ ਉਹ ਸੋਧਾਂ ਵਿਖਾਓ ਜੋ ਸਭ ਤੋਂ ਤਾਜ਼ੀਆਂ ਰਿਵੀਜਨਾਂ ਹਨ",
"sp-contributions-newonly": "ਸਿਰਫ਼ ਉਹ ਸੋਧਾਂ ਵਿਖਾਉ ਜਿਹਨਾਂ ਨਾਲ਼ ਨਵੇਂ ਸਫ਼ੇ ਬਣੇ ਹਨ",
+ "sp-contributions-hideminor": "ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ ਲੁਕਾਓ",
"sp-contributions-submit": "ਖੋਜ",
"whatlinkshere": "ਇੱਥੇ ਕੀ ਆ ਕੇ ਜੁੜਦਾ ਹੈ",
"whatlinkshere-title": "$1 ਨਾਲ ਜੋੜਨ ਵਾਲੇ ਸਫ਼ੇ",
"tooltip-pt-mycontris": "ਤੁਹਾਡੇ ਯੋਗਦਾਨਾਂ ਦੀ ਸੂਚੀ",
"tooltip-pt-login": "ਤੁਹਾਨੂੰ ਦਾਖ਼ਲ ਹੋਣ ਲਈ ਪ੍ਰੇਰਿਆ ਜਾਂਦਾ ਹੈ; ਪਰ ਇਹ ਕੋਈ ਲਾਜ਼ਮੀ ਨਹੀਂ",
"tooltip-pt-logout": "ਸਾਈਟ ਤੋਂ ਬਾਹਰ ਆਉ",
- "tooltip-pt-createaccount": "ਤà©\81ਹਾਨà©\82à©° à¨\96ਾਤਾ ਬਣਾà¨\89ਣ ਤà©\8bà¨\82 ਬਾà¨\85ਦ ਲਾà¨\97 à¨\87ਨ ਕਰਨ ਦੀ ਸਲਾਹ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ; ਹਾਲਾਂਕਿ ਇਹ ਲਾਜ਼ਮੀ ਨਹੀਂ",
+ "tooltip-pt-createaccount": "ਤà©\81ਹਾਨà©\82à©° à¨\96ਾਤਾ ਬਣਾà¨\89ਣ ਤà©\8bà¨\82 ਬਾà¨\85ਦ ਦਾà¨\96ਲ ਕਰਨ ਦੀ ਸਲਾਹ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ; ਹਾਲਾਂਕਿ ਇਹ ਲਾਜ਼ਮੀ ਨਹੀਂ",
"tooltip-ca-talk": "ਸਮਗੱਰੀ ਸਫ਼ੇ ਬਾਰੇ ਚਰਚਾ",
"tooltip-ca-edit": "ਇਹ ਸਫ਼ਾ ਸੋਧੋ",
"tooltip-ca-addsection": "ਨਵਾਂ ਭਾਗ ਸ਼ੁਰੂ ਕਰੋ",
"tooltip-ca-unprotect": "ਇਸ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ",
"tooltip-ca-delete": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਹਟਾਓ",
"tooltip-ca-move": "ਇਹ ਸਫ਼ਾ ਭੇਜੋ",
- "tooltip-ca-watch": "à¨\87ਸ ਸਫ਼à©\87 ਨà©\82à©° à¨\86ਪਣà©\80 ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f ਵਿਚ ਜੋੜੋ",
+ "tooltip-ca-watch": "à¨\87ਸ ਸਫ਼à©\87 ਨà©\82à©° à¨\86ਪਣà©\80 ਨਿà¨\97ਰਾਨà©\80-ਸà©\82à¨\9aà©\80 ਵਿਚ ਜੋੜੋ",
"tooltip-ca-unwatch": "ਇਹ ਸਫ਼ਾ ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ’ਚੋਂ ਹਟਾਓ",
"tooltip-search": "{{SITENAME}} ’ਤੇ ਖੋਜੋ",
"tooltip-search-go": "ਠੀਕ ਇਸ ਨਾਮ ਵਾਲੇ ਪੰਨੇ ’ਤੇ ਜਾਉ, ਜੇ ਮੌਜੂਦ ਹੈ ਤਾਂ",
"tooltip-n-mainpage-description": "ਮੁੱਖ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ",
"tooltip-n-portal": "ਪ੍ਰੋਜੈਕਟ ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭਣਾ ਹੈ",
"tooltip-n-currentevents": "ਹਾਲ ਦੀਆਂ ਘਟਨਾਵਾਂ ਬਾਰੇ ਪਿਛੋਕੜੀ ਜਾਣਕਾਰੀ ਲੱਭੋ",
- "tooltip-n-recentchanges": "ਵਿਕੀ ਵਿਚ ਹਾਲ ਵਿੱਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਦੀ ਸੂਚੀ",
+ "tooltip-n-recentchanges": "ਵਿà¨\95à©\80 ਵਿੱà¨\9a ਹਾਲ ਵਿੱà¨\9a ਹà©\8bà¨\88à¨\86à¨\82 ਤਬਦà©\80ਲà©\80à¨\86à¨\82 ਦà©\80 ਸà©\82à¨\9aà©\80",
"tooltip-n-randompage": "ਇੱਕ ਰਲ਼ਵਾਂ ਸਫ਼ਾ ਲੋਡ ਕਰੋ",
"tooltip-n-help": "ਖੋਜਣ ਲਈ ਥਾਂ",
"tooltip-t-whatlinkshere": "ਵਿਕੀ ਦੇ ਸਾਰੇ ਸਫ਼ਿਆ ਦੀ ਸੂਚੀ, ਜੋ ਇੱਥੇ ਜੋੜਦੇ ਹਨ",
"pageinfo-length": "ਸਫ਼ੇ ਦੀ ਲੰਬਾਈ (ਬਾਈਟਾਂ ਵਿਚ)",
"pageinfo-article-id": "ਸਫ਼ੇ ਦੀ ਸ਼ਨਾਖ਼ਤ",
"pageinfo-language": "ਸਫ਼ੇ ਦੀ ਸਮੱਗਰੀ ਦੀ ਭਾਸ਼ਾ",
- "pageinfo-robot-policy": "à¨\87à©°à¨\9cਨ ਦà©\80 ਹਾਲਤ à¨\96à©\8bà¨\9cà©\8b",
+ "pageinfo-robot-policy": "ਰà©\8bਬà©\8bà¨\9f ਦà©\81à¨\86ਰਾ à¨\87ੰਡà©\88à¨\95ਸਿੰà¨\97",
"pageinfo-robot-index": "ਮਨਜ਼ੂਰ ਹੈ",
"pageinfo-robot-noindex": "ਨਾ-ਮਨਜ਼ੂਰ",
"pageinfo-watchers": "ਸਫ਼ੇ ’ਤੇ ਨਜ਼ਰ ਰੱਖਣ ਵਾਲਿਆਂ ਦੀ ਗਿਣਤੀ",
"watchlistedit-raw-done": "ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਅੱਪਡੇਟ ਹੋ ਗਈ ਹੈ।",
"watchlistedit-raw-added": "{{PLURAL:$1|1 ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕੀਤਾ|$1 ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕੀਤੇ}}:",
"watchlistedit-raw-removed": "{{PLURAL:$1|1 ਸਿਰਲੇਖ ਹਟਾਇਆ|$1 ਸਿਰਲੇਖ ਹਟਾਏ}}:",
+ "watchlistedit-clear-title": "ਨਿਗਰਾਨ-ਸੂਚੀ ਸਾਫ਼ ਕਰੋ",
+ "watchlistedit-clear-legend": "ਨਿਗਰਾਨ-ਸੂਚੀ ਸਾਫ਼ ਕਰੋ",
"watchlistedit-clear-titles": "ਸਿਰਲੇਖ:",
"watchlistedit-clear-submit": "ਨਿਗਰਾਨ-ਸੂਚੀ ਸਾਫ਼ ਕਰੋ (ਇਹ ਪੱਕੇ ਤੌਰ 'ਤੇ ਹੈ!)",
"watchlistedit-clear-done": "ਤੁਹਾਡੀ ਨਿਗਰਾਨ-ਸੂਚੀ ਸਾਫ਼ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ।",
"watchlisttools-edit": "ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵੇਖੋ ’ਤੇ ਸੋਧੋ",
"watchlisttools-raw": "ਕੱਚੀ ਨਿਗਰਾਨ-ਸੂਚੀ ਸੋਧੋ",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ਗੱਲ-ਬਾਤ]])",
+ "timezone-local": "ਸਥਾਨਕ",
"duplicate-defaultsort": "ਪੁਰਾਣੀ ਮੂਲ ਕਰਮਾਂਕਨ ਕੁੰਜੀ $1 ਦੇ ਬਜਾਏ ਹੁਣ ਮੂਲ ਕਰਮਾਂਕਨ ਕੁੰਜੀ $2 ਹੋਵੇਗੀ।",
"version": "ਵਰਜਨ",
"version-skins": "ਥਾਪੀਆਂ ਖੱਲਾਂ",
"version-software-version": "ਵਰਜਨ",
"version-entrypoints-header-entrypoint": "ਦਾਖ਼ਲਾ ਬਿੰਦੂ",
"version-entrypoints-header-url": "ਯੂ.ਆਰ.ਐੱਲ",
+ "version-libraries-library": "ਪੁਸਤਕਾਲਾ",
+ "version-libraries-version": "ਵਰਜਨ",
+ "version-libraries-license": "ਲਸੰਸ",
+ "version-libraries-description": "ਵੇਰਵਾ",
+ "version-libraries-authors": "ਲੇਖਕ",
"redirect-submit": "ਜਾਓ",
"redirect-lookup": "ਲੱਭੋ:",
"redirect-value": "ਮੁੱਲ:",
"specialpages-group-wiki": "ਸਮੱਗਰੀ ਅਤੇ ਸੰਦ",
"specialpages-group-redirects": "ਖ਼ਾਸ ਸਫ਼ੇ ਰੀਡਿਰੈਕਟ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ",
"specialpages-group-spam": "ਸਪੈਮ ਦੇ ਸੰਦ",
+ "specialpages-group-developer": "ਡਿਵੈਲਪਰ ਸੰਦ",
"blankpage": "ਖ਼ਾਲੀ ਸਫ਼ਾ",
"intentionallyblankpage": "ਇਹ ਸਫ਼ਾ ਜਾਣ-ਬੁੱਝ ਕੇ ਖ਼ਾਲੀ ਛੱਡਿਆ ਗਿਆ ਹੈ।",
"external_image_whitelist": " #ਇਸ ਲਾਈਨ ਨੂੰ ਇੰਝ ਹੀ ਰਹਿਣ ਦਿਓ <pre>\n#ਹੇਠਾਂ ਓਹੀ ਐਕਸਪ੍ਰੈਸ਼ਨ ਪਾਓ (ਜਿਹੜਾ ਹਿੱਸਾ // ਦੇ ਵਿਚਾਲੇ ਹੈ)\n#ਇਹ ਬਾਹਰੀ ਤਸਵੀਰਾਂ ਦੇ URLs (ਹੌਟਲਿੰਕਡ) ਨਾਲ ਮਿਲਣਗੀਆਂ\n#ਜਿਹੜੀਆਂ ਮਿਲਣਗੀਆਂ ਓਹ ਬਤੌਰ ਤਸਵੀਰਾਂ ਦਿੱਸਣਗੀਆਂ ਨਹੀਂ ਤਾਂ ਤਸਵੀਰ ਦਾ ਸਿਰਫ਼ ਲਿੰਕ ਨਜ਼ਰ ਆਵੇਗਾ\n#'#' ਨਾਲ਼ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੀਆਂ ਲਾਈਨਾਂ ਟਿੱਪਣੀਆਂ ਵਾਂਗ ਲਈਆਂ ਜਾਂਦੀਆਂ ਹਨ\n#ਇਹ ਕੇਸ-ਇਨਸੈਂਸਟਿਵ ਹੈ\n\n#ਸਾਰੇ ਰੈਜੈਕਸ ਫ਼ਰੈਗਮੈਂਟ ਇਸ ਲਾਈਨ ਤੋਂ ਉੱਪਰ ਪਾਓ। ਇਸ ਲਾਈਨ ਨੂੰ ਇੰਝ ਹੀ ਰਹਿਣ ਦਿਓ </pre>",
"tags-title": "ਟੈਗ",
"tags-tag": "ਟੈਗ ਦਾ ਨਾਮ",
"tags-description-header": "ਅਰਥ ਦਾ ਪੂਰਾ ਬਿਓਰਾ",
+ "tags-source-header": "ਸਰੋਤ",
"tags-active-header": "ਸਰਗਰਮ?",
"tags-hitcount-header": "ਨਿਸ਼ਾਨਦੇਹ ਤਬਦੀਲੀਆਂ",
+ "tags-actions-header": "ਕਾਰਵਾਈਆਂ",
"tags-active-yes": "ਹਾਂ",
"tags-active-no": "ਨਹੀਂ",
"tags-edit": "ਸੋਧੋ",
+ "tags-delete": "ਮਿਟਾਉ",
+ "tags-activate": "ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ",
"tags-hitcount": "$1 {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}",
+ "tags-create-reason": "ਕਾਰਨ:",
+ "tags-create-submit": "ਬਣਾਓ",
+ "tags-delete-reason": "ਕਾਰਨ:",
+ "tags-activate-reason": "ਕਾਰਨ:",
+ "tags-activate-submit": "ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ",
+ "tags-deactivate-reason": "ਕਾਰਨ:",
+ "tags-edit-title": "ਟੈਗ ਸੋਧੋ",
+ "tags-edit-remove-all-tags": "(ਸਾਰੇ ਟੈਗ ਹਟਾਓ)",
+ "tags-edit-reason": "ਕਾਰਨ:",
"comparepages": "ਸਫ਼ੇ ਮਿਲਾਓ",
"compare-page1": "ਸਫ਼ਾ ੧",
"compare-page2": "ਸਫ਼ਾ ੨",
"rightsnone": "(ਕੋਈ ਨਹੀਂ)",
"revdelete-summary": "ਸੰਖੇਪ ਸੋਧ",
"feedback-adding": "ਸਫ਼ੇ ਨਾਲ਼ ਵਿਚਾਰ ਜੁੜ ਰਹੇ ਹਨ...",
+ "feedback-back": "ਪਿੱਛੇ",
"feedback-bugnew": "ਮੈਂ ਚੈੱਕ ਕੀਤਾ। ਇੱਕ ਨਵੇਂ ਦੋਸ਼ ਦੀ ਰਿਪੋਰਟ ਕਰੋ",
"feedback-cancel": "ਰੱਦ ਕਰੋ",
"feedback-close": "ਹੋ ਗਿਆ",
+ "feedback-error-title": "ਗ਼ਲਤੀ",
"feedback-error2": "ਦੋਸ਼:ਸੋਧ ਫੇਲ੍ਹ ਹੋਈ",
"feedback-error3": "ਦੋਸ਼:API ਵੱਲੋਂ ਕੋਈ ਜੁਆਬ ਨਹੀਂ",
"feedback-message": "ਸੁਨੇਹਾ:",
"feedback-subject": "ਵਿਸ਼ਾ:",
"feedback-submit": "ਹਵਾਲੇ ਕਰੋ",
+ "feedback-thanks-title": "ਧੰਨਵਾਦ!",
+ "feedback-useragent": "ਉਪਭੋਗੀ ਏਜੰਟ:",
"searchsuggest-search": "ਖੋਜ",
"api-error-badaccess-groups": "ਤੁਹਾਨੂੰ ਇਸ ਵਿਕੀ ਉੱਤੇ ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
"api-error-badtoken": "ਅੰਦਰੂਨੀ ਦੋਸ਼: ਗ਼ਲਤ ਟੋਕਨ",
"limitreport-walltime": "ਹਕੀਕੀ ਸਮੇਂ ਦੀ ਵਰਤੋਂ",
"limitreport-walltime-value": "$1 {{PLURAL:$1|ਸਕਿੰਟ|ਸਕਿੰਟ}}",
"limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|ਬਾਈਟ|ਬਾਈਟ}}",
+ "expand_templates_input": "ਇੰਪੁੱਟ ਪਾਠ:",
"expand_templates_output": "ਨਤੀਜਾ",
"expand_templates_ok": "ਠੀਕ ਹੈ",
"expand_templates_remove_comments": "ਟਿੱਪਣੀਆਂ ਹਟਾਓ",
"pagelang-language": "ਭਾਸ਼ਾ",
"pagelang-use-default": "ਮੂਲ ਭਾਸ਼ਾ ਵਰਤੋਂ",
"pagelang-select-lang": "ਭਾਸ਼ਾ ਚੁਣੋ",
+ "pagelang-submit": "ਭੇਜੋ",
"right-pagelang": "ਸਫ਼ੇ ਦੀ ਭਾਸ਼ਾ ਬਦਲੋ",
"action-pagelang": "ਸਫ਼ੇ ਦੀ ਭਾਸ਼ਾ ਬਦਲੋ",
+ "mediastatistics": "ਮੀਡੀਆ ਅੰਕੜੇ",
+ "mediastatistics-table-mimetype": "MIME ਕਿਸਮ:",
"mediastatistics-table-count": "ਫ਼ਾਈਲਾਂ ਦੀ ਗਿਣਤੀ",
"mediastatistics-table-totalbytes": "ਮਿਲ਼ਵਾਂ ਅਕਾਰ",
"mediastatistics-header-unknown": "ਅਣਪਛਾਤਾ",
"mediastatistics-header-video": "ਵੀਡੀਓਆਂ",
"mediastatistics-header-office": "ਦਫ਼ਤਰ",
"mediastatistics-header-text": "ਲਿਖਤੀ",
+ "mediastatistics-header-total": "ਸਾਰੀਆੰ ਫਾਈਲਾੰ",
"json-error-syntax": "ਵਾਕ-ਵਿਉਂਤ 'ਚ ਦੋਸ਼",
"special-characters-group-latin": "ਲਾਤੀਨੀ",
"special-characters-group-latinextended": "ਲਾਤੀਨੀ ਤੋਂ ਛੁੱਟ",
"special-characters-title-endash": "ਅੰਗਰੇਜ਼ੀ ਡੈਸ਼",
"special-characters-title-emdash": "em ਡੈਸ਼",
"special-characters-title-minus": "ਘਟਾਓ ਦਾ ਨਿਸ਼ਾਨ",
+ "mw-widgets-dateinput-no-date": "ਕੋਈ ਮਿਤੀ ਨਹੀਂ ਚੁਣੀ",
+ "mw-widgets-titleinput-description-new-page": "ਸਫ਼ਾ ਹਜੇ ਮੌਜੂਦ ਨਹੀਂ ਹੈ",
+ "log-action-filter-all": "ਸਾਰੇ",
+ "log-action-filter-block-block": "ਪਾਬੰਦੀ",
+ "log-action-filter-block-unblock": "ਪਾਬੰਦੀ ਹਟਾਈ",
+ "authmanager-authplugin-setpass-bad-domain": "ਗਲਤ ਡੋਮੇਨ",
"authmanager-password-help": "ਪ੍ਰਮਾਣਿਕਤਾ ਲਈ ਪਛਾਣ-ਸ਼ਬਦ।",
"authmanager-email-label": "ਈਮੇਲ",
"authmanager-email-help": "ਈਮੇਲ ਪਤਾ",
"authmanager-realname-label": "ਅਸਲੀ ਨਾਂ",
+ "authmanager-realname-help": "ਇਸ ਉਪਭੋਗੀ ਦਾ ਅਸਲ ਨਾਮ",
+ "authmanager-provider-temporarypassword": "ਆਰਜ਼ੀ ਪਾਸਵਰਡ",
"authprovider-resetpass-skip-label": "ਛੱਡ ਦਿਉ",
+ "authform-wrongtoken": "ਗਲਤ ਟੋਕਨ",
"specialpage-securitylevel-not-allowed-title": "ਇਜਾਜ਼ਤ ਨਹੀਂ",
"cannotauth-not-allowed-title": "ਪ੍ਰਵਾਨਗੀ ਨਹੀਂ ਮਿਲੀ",
"credentialsform-account": "ਖਾਤੇ ਦਾ ਨਾਂ:"
"tagline": "Z {{GRAMMAR:D.lp|{{SITENAME}}}}",
"help": "Pomoc",
"search": "Szukaj",
+ "search-ignored-headings": " #<!-- ten wiersz zostaw bez zmian --> <pre>\n# Umieszczone tutaj nagłówki będą ignorowane podczas wyszukiwania.\n# Zmiany wprowadzone tutaj zostaną zastosowane, gdy strona wykorzystująca odpowiedni nagłówek zostanie zindeksowana.\n# Można wymusić ponowne zindeksowanie strony wykonując na niej null edit.\n# Składnia jest następująca:\n# * Wszystko począwszy od znaku „#” aż do końca wiersza jest komentarzem.\n# * Każdy niepusty wiersz wprowadza dokładną treść nagłówka, który należy zignorować, wielkość liter ma znaczenie.\nLinki zewnętrzne\nZobacz też\n #</pre> <!-- ten wiersz zostaw bez zmian -->",
"searchbutton": "Szukaj",
"go": "Przejdź",
"searcharticle": "Przejdź",
"botpasswords-label-restrictions": "Ograniczenia użytkowania:",
"botpasswords-label-grants-column": "Przyznane",
"botpasswords-bad-appid": "Nazwa bota \"$1\" nie jest prawidłowa.",
+ "botpasswords-insert-failed": "Nie udało się dodać robota o nazwie \"$1\". Czy był już wcześniej dodany?",
+ "botpasswords-update-failed": "Nie udało się zmienić robota o nazwie \"$1\". Czy został usunięty?",
"botpasswords-created-title": "Hasło bota stworzone",
"botpasswords-created-body": "Hasło bota \"$1\" użytkownika \"$2\" zostało utworzone.",
"botpasswords-updated-title": "Hasło bota zaktualizowane",
"botpasswords-updated-body": "Hasło bota \"$1\" użytkownika \"$2\" zostało zaktualizowane.",
"botpasswords-deleted-title": "Hasło bota usunięte",
"botpasswords-deleted-body": "Hasło bota \"$1\" użytkownika \"$2\" zostało usunięte.",
+ "botpasswords-newpassword": "Nowe hasło do zalogowania przez <strong>$1</strong> to <strong>$2</strong>. <em>Proszę je zapisać w celu wykorzystania w przyszłości.</em>",
"botpasswords-no-provider": "BotPasswordsSessionProvider nie jest dostępne.",
"botpasswords-restriction-failed": "Logowanie nie powiodło się z powodu ograniczeń na hasło bota.",
+ "botpasswords-invalid-name": "Określona nazwa użytkownika nie zawiera separatora hasła bota (\"$1\").",
"botpasswords-not-exist": "Użytkownik \"$1\" nie ma hasła dla bota o nazwie \"$2\".",
"resetpass_forbidden": "Hasła nie mogą zostać zmienione",
"resetpass_forbidden-reason": "Hasła nie mogą zostać zmienione: $1",
"passwordreset-emailelement": "Nazwa użytkownika: \n$1\n\nTymczasowe hasło: \n$2",
"passwordreset-emailsentemail": "Jeśli ten adres e‐mail jest przypisany do Twojego konta, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
"passwordreset-emailsentusername": "Jeśli z tym kontem powiązany jest adres e‐mail, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
- "passwordreset-emailsent-capture": "Wyświetlony poniżej e‐mail pozwalający na zresetowanie hasła został wysłany.",
- "passwordreset-emailerror-capture": "Poniżej wyświetlony e‐mail pozwalający na zresetowanie hasła został wygenerowany, ale nie udało się wysłać go do {{GENDER:$2|użytkownika|użytkowniczki}}: $1",
+ "passwordreset-emailsent-capture2": "{{PLURAL:$1|Został wysłany e-mail|Zostały wysłane e-mail}} z informacjami o resetowaniu hasła. {{PLURAL:$1|Użytkownik i hasło jest pokazany|Lista użytkowników i haseł jest pokazana}} poniżej.",
+ "passwordreset-emailerror-capture2": "Wysyłanie e-maila do {{GENDER:$2|użytkownika|użytkowniczki}} nie powiodło się: $1 {{PLURAL:$3|Użytkownik i hasło jest pokazany|Lista użytkowników i haseł jest pokazana}} poniżej.",
+ "passwordreset-nocaller": "Musi być podany wywołujący",
+ "passwordreset-nosuchcaller": "Wywołujący nie istnieje: $1",
"passwordreset-invalideamil": "Nieprawidłowy adres e-mail",
"passwordreset-nodata": "Nie podano ani nazwy użytkownika, ani adresu e-mail",
"changeemail": "Zmiana lub usunięcie adresu e‐mail",
"changeemail-header": "Wypełnij ten formularz, aby zmienić swój adres e-mail. Jeśli chcesz usunąć swój adres e-mail, to przy wypełnianiu formularza pozostaw puste pole nowego adresu e-mail.",
- "changeemail-passwordrequired": "Musisz podać swoje hasło, aby potwierdzić tę zmianę.",
"changeemail-no-info": "Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.",
"changeemail-oldemail": "Obecny adres e‐mail:",
"changeemail-newemail": "Nowy adres e-mail:",
"content-model-css": "CSS",
"content-json-empty-object": "Pusty obiekt",
"content-json-empty-array": "Pusta tablica",
+ "deprecated-self-close-category": "Strony zawierające nieprawidłowe samozamykające się znaczniki HTML",
+ "deprecated-self-close-category-desc": "Strona zawiera samozamykające się znaczniki HTML, takie jak <code><b/></code> lub <code><span/></code>. Ich zachowanie zmieni się na dostosowane do specyfikacji HTML5, więc ich użycie w wikikodzie jest zdeprecjonowane.",
"duplicate-args-warning": "<strong>Ostrzeżenie:</strong> [[:$1]] wywołuje [[:$2]] z więcej niż jedną wartością dla parametru \"$3\". Tylko ostatnia podana wartość zostanie użyta.",
"duplicate-args-category": "Strony zawierające wywołania szablonów z parametrami o takich samych nazwach",
"duplicate-args-category-desc": "Strona zawiera szablony, które używają duplikatów argumentów, jak <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> lub <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Wygląda na to, że edycja została już anulowana.",
"undo-summary": "Anulowanie wersji $1 autora [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]])",
"undo-summary-username-hidden": "Anulowanie wersji $1 autorstwa ukrytego użytkownika",
- "cantcreateaccounttitle": "Nie można utworzyć konta",
"cantcreateaccount-text": "Tworzenie konta z tego adresu IP ('''$1''') zostało zablokowane przez [[User:$3|$3]].\n\nPodany przez $3 powód to ''$2''",
"cantcreateaccount-range-text": "Tworzenie konta z adresów IP w zakresie <strong>$1</strong>, zawierającego twój adres IP (<strong>$4</strong>), zostało zablokowane przez [[User:$3|$3]].\n\nPodany przez $3 powód to <em>$2</em>",
"viewpagelogs": "Zobacz rejestry operacji dla tej strony",
"listgrants": "Uprawnienia",
"listgrants-grant": "Uprawnienie",
"listgrants-rights": "Uprawnienie",
- "trackingcategories": "Śledzenie kategorii",
+ "trackingcategories": "Kategorie śledzące",
"trackingcategories-summary": "Ta strona zawiera listę kategorii monitorujących wypełnianych automatycznie przez oprogramowanie MediaWiki. Nazwy kategorii można zmienić edytując odpowiednie komunikaty systemowe znajdujące się w przestrzeni nazw {{ns:8}}.",
"trackingcategories-msg": "Śledzenie kategorii",
"trackingcategories-name": "Nazwa komunikatu",
"watchnologin": "Nie jesteś zalogowany",
"addwatch": "Dodaj do listy obserwowanych",
"addedwatchtext": "Strona „[[:$1|$1]]” wraz ze swoją stroną dyskusji została dodana do Twojej [[Special:Watchlist|listy obserwowanych]].",
+ "addedwatchtext-talk": "Strona „[[:$1]]” i strony z nią związane zostały dodane do Twojej [[Special:Watchlist|listy obserwowanych]].",
"addedwatchtext-short": "Strona „$1” została dodana do twojej listy obserwowanych.",
"removewatch": "Usuń z listy obserwowanych",
"removedwatchtext": "Strona „[[:$1|$1]]” wraz ze swoją stroną dyskusji została usunięta z Twojej [[Special:Watchlist|listy obserwowanych]].",
+ "removedwatchtext-talk": "Strona „[[:$1]]” i strony z nią związane zostały usunięte z Twojej [[Special:Watchlist|listy obserwowanych]].",
"removedwatchtext-short": "Strona „$1” została usunięta z twojej listy obserwowanych.",
"watch": "Obserwuj",
"watchthispage": "Obserwuj",
"confirm-unwatch-button": "OK",
"confirm-unwatch-top": "Usunąć tę stronę z listy obserwowanych?",
"confirm-rollback-button": "OK",
+ "confirm-rollback-top": "Wycofać edycje tej strony?",
"percent": "$1%",
"quotation-marks": "„$1”",
"imgmultipageprev": "← poprzednia strona",
"timezone-local": "Czas lokalny",
"duplicate-defaultsort": "Uwaga: Domyślnym kluczem sortowania będzie „$2” i zastąpi on wcześniej wykorzystywany klucz „$1”.",
"duplicate-displaytitle": "<strong>Uwaga:</strong> Wyświetlenie tytułu „$2” powoduje nadpisanie wcześniej wyświetlanego tytułu „$1”.",
+ "restricted-displaytitle": "<strong>Ostrzeżenie:</strong> Tytuł do wyświetlania \"$1\" został zignorowany, ponieważ nie jest odpowiednikiem aktualnego tytułu tej strony.",
"invalid-indicator-name": "<strong>Błąd:</strong> Atrybut stanu strony <code>name</code> nie może być pusty.",
"version": "Wersja oprogramowania",
"version-extensions": "Zainstalowane rozszerzenia",
"tags-deactivate": "dezaktywuj",
"tags-hitcount": "$1 {{PLURAL:$1|zmiana|zmiany|zmian}}",
"tags-manage-no-permission": "Nie masz uprawnień do zarządzania znacznikami.",
+ "tags-manage-blocked": "Nie możesz zarządzać znacznikami zmian, kiedy jesteś zablokowany.",
"tags-create-heading": "Utwórz nowy znacznik",
"tags-create-explanation": "Nowe znaczniki będą dostępne domyślnie dla użytkowników i botów.",
"tags-create-tag-name": "Nazwa znacznika:",
"tags-delete-not-found": "Znacznik „$1” nie istnieje.",
"tags-delete-too-many-uses": "Znacznik „$1” jest stosowany w więcej niż {{PLURAL:$2|jednej wersji|$2 wersjach}}, co oznacza, że nie może być usunięty.",
"tags-delete-warnings-after-delete": "Znacznik „$1” został usunięty, ale {{PLURAL:$2|otrzymano następujące ostrzeżenie|otrzymano następujące ostrzeżenia}}:",
+ "tags-delete-no-permission": "Nie masz uprawnień do usuwania znaczników zmian.",
"tags-activate-title": "Aktywacja znacznika",
"tags-activate-question": "Zamierzasz aktywować znacznik „$1”.",
"tags-activate-reason": "Powód:",
"tags-deactivate-not-allowed": "Nie można dezaktywować znacznika „$1”.",
"tags-deactivate-submit": "Dezaktywuj",
"tags-apply-no-permission": "Nie masz uprawnień do wprowadzania znaczników wraz z własnymi zmianami.",
+ "tags-apply-blocked": "Nie możesz stosować znaczników do swoich zmian, gdy jesteś zablokowany.",
"tags-apply-not-allowed-one": "Znacznik „$1” nie może zostać wprowadzony ręcznie.",
"tags-apply-not-allowed-multi": "{{PLURAL:$2|Następujący znacznik nie może zostać wprowadzony ręcznie|Następujące znaczniki nie mogą zostać wprowadzone ręcznie}}: $1",
"tags-update-no-permission": "Nie masz uprawnień do dodawania lub usuwania znaczników z poszczególnych wersji lub wpisów w rejestrze.",
+ "tags-update-blocked": "Nie możesz dodawać i usuwać znaczników zmian, kiedy jesteś zablokowany.",
"tags-update-add-not-allowed-one": "Znacznik „$1” nie może zostać dodany ręcznie.",
"tags-update-add-not-allowed-multi": "{{PLURAL:$2|Następujący znacznik nie może zostać dodany ręcznie|Następujące znaczniki nie mogą zostać dodane ręcznie}}: $1",
"tags-update-remove-not-allowed-one": "Znacznika „$1” nie można usunąć.",
"api-error-nomodule": "Błąd wewnętrzny – nie określono modułu przesyłania plików.",
"api-error-ok-but-empty": "Błąd wewnętrzny – brak odpowiedzi od serwera.",
"api-error-overwrite": "Nadpisanie istniejącego pliku nie jest dopuszczalne.",
+ "api-error-ratelimited": "Próbujesz przesłać więcej plików w krótszym odstępie czasowym, niż ta wiki na to pozwala.\nSpróbuj jeszcze raz za kilka minut.",
"api-error-stashfailed": "Błąd wewnętrzny – serwer nie mógł zapisać pliku tymczasowego.",
"api-error-publishfailed": "Błąd wewnętrzny: serwer nie mógł zapisać pliku tymczasowego.",
"api-error-stasherror": "Wystąpił błąd podczas przesyłania pliku.",
"mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje",
"mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
"sessionmanager-tie": "Nie można łączyć kilku rodzajów uwierzytelniania dla zapytania: $1.",
+ "sessionprovider-generic": "sesje $1",
"sessionprovider-mediawiki-session-cookiesessionprovider": "sesje na podstawie cookie",
"sessionprovider-nocookies": "Być może cookies są wyłączone. Upewnij się, że masz włączone cookies i zacznij od nowa.",
"randomrootpage": "Losowa strona (bez podstron)",
"tagline": "Da {{SITENAME}}.",
"help": "Agiut",
"search": "Sërché",
+ "search-ignored-headings": " #<!-- lassé costa linia 'me ch'a l'é --> <pre>\n# Antestassion ch'a saran ignorà da l'arserca.\n# Le modìfiche a sòn a l'han efet pen-a che la pàgina con l'antestassion a l'é indicisà.\n# A peul forsé la riandesassion ëd la pàgina an fasend na modìfica veuida.\n# La sintassi a l'é costa-sì:\n# * Tut a parte da 'n caràter «#» a l'é un coment.\n# * Tuta linia nen veuida a l'é ël tìtol precis da ignoré, caràter majùscoj o minùscoj comprèis.\nArferiment\nLiure esterne\nVëdde ëdcò\n #</pre> <!-- lassé costa linia 'me ch'a l'é -->",
"searchbutton": "Sërché",
"go": "Andé",
"searcharticle": "Andé",
"passwordreset-emailtext-user": "L'utent $1 ansima a {{SITENAME}} a l'ha ciamà na riampostassion ëd soa ciav për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}} associà a st'adrëssa ëd pòsta eletrònica:\n\n$2\n\n{{PLURAL:$3|Costa ciav provisòria|Coste ciav provisòrie}} a scadran da-sì {{PLURAL:$5|un di|$5 di}}.\nA dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr a l'ha fàit costa arcesta, o s'a l'é arcordasse soa ciav original, e a veul pa pi cangela, a peul ignoré ës mëssagi e continué a dovré soa veja ciav.",
"passwordreset-emailelement": "Stranòm: \n$1\n\nCiav provisòria: \n$2",
"passwordreset-emailsentemail": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit spedì.",
- "passwordreset-emailsent-capture": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit mandà, e a l'é mostrà sì-sota.",
- "passwordreset-emailerror-capture": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a {{GENDER:$2|l'utent}} a l'é falìa: $1",
"changeemail": "Cangé l'adrëssa ëd pòsta eletrònica",
"changeemail-header": "Cangé l'adrëssa ëd pòsta eletrònica dël cont",
"changeemail-no-info": "A dev esse intrà ant ël sistema për andé diretament a costa pàgina.",
"undo-nochange": "A smija che la modìfica a sia già stàita anulà.",
"undo-summary": "Gavà la revision $1 fàita da [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciaciarade]])",
"undo-summary-username-hidden": "Anulé la revision $1 ëd n'utent ëstërmà",
- "cantcreateaccounttitle": "As peul pa registresse d'utent",
"cantcreateaccount-text": "La cression ëd cont neuv a parte da st'adrëssa IP-sì ('''$1''') a l'é stàita blocà da [[User:$3|$3]].\n\nLa rason butà da $3 për ël blocagi a l'é stàita: ''$2''",
"cantcreateaccount-range-text": "La creassion ëd cont da l'adrëssa IP ant l'antërval <strong>$1</strong>, ch'a comprend soa adrëssa IP (<strong>$4</strong>), a l'é stàita blocà da [[User:$3|$3]].\n\nLa rason dàita da $3 a l'é <em>$2</em>",
"viewpagelogs": "Smon ij registr dë sta pàgina-sì",
"special-characters-title-minus": "segn meno",
"mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
- "api-error-blacklisted": "Për piasì sern un tìtol diferent, descritiv.",
"randomrootpage": "Pàgina root a cas"
}
"tagline": "De {{SITENAME}}",
"help": "Ajuda",
"search": "Pesquisa",
+ "search-ignored-headings": " #<!-- deixe esta linha exatamente como está --> <pre>\n# Subtítulos que serão ignorados pela busca.\n# Mudanças feitas aqui têm efeito quando a página com o subtítulo é indexada.\n# Você pode forçar a reindexação realizando uma edição nula.\n# A sintaxe é a seguinte:\n# * Tudo a partir do caractere \"#\" até o final da linha é um comentário\n# * Cada linha não vazia é o título exato a ser ignorado, inclusive no uso de maiúsculas\nReferências\nLigações externas\nVer também\n #</pre> <!-- deixe esta linha exatamente como está -->",
"searchbutton": "Pesquisar",
"go": "Ir",
"searcharticle": "Ir",
"databaseerror-query": "Consulta: $1",
"databaseerror-function": "Função: $1",
"databaseerror-error": "Erro: $1",
- "transaction-duration-limit-exceeded": "Para evitar a criação de lag replicação alta, esta operação foi abortada porque a duração de gravação ($1) excedeu o $2 {{PLURAL:$2|second|seconds}} limite.Se você está mudando muitos itens de uma vez, tente fazer várias operações menores em vez.",
+ "transaction-duration-limit-exceeded": "Para evitar a criação de lag replicação alta, esta operação foi abortada porque a duração de gravação ($1) excedeu o limite de $2 {{PLURAL:$2|segundo|segundos}}. Se você está mudando muitos itens de uma vez, tente fazer várias operações menores em vez disso.",
"laggedslavemode": "Aviso: a página poderá não conter atualizações recentes.",
"readonly": "Banco de dados disponível no modo \"somente leitura\"",
"enterlockreason": "Entre com um motivo para trancá-lo, incluindo uma estimativa de quando poderá novamente ser destrancado",
"password-change-forbidden": "Você não pode alterar senhas nessa wiki.",
"externaldberror": "Ocorreu ou um erro no banco de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.",
"login": "Autenticar-se",
+ "login-security": "Verificar sua identidade",
"nav-login-createaccount": "Entrar / criar conta",
"userlogin": "Entrar / criar conta",
"userloginnocreate": "Entrar",
"passwordreset-emailelement": "Usuário: \n$1\n\nSenha temporária: \n$2",
"passwordreset-emailsentemail": "Se este é um endereço de e-mail registrado para a sua conta, em seguida, um e-mail de redefinição de senha será enviada.",
"passwordreset-emailsentusername": "Se houver um endereço de email associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua senha.",
- "passwordreset-emailsent-capture": "Foi enviado um e-mail de lembrete, que é mostrado abaixo.",
- "passwordreset-emailerror-capture": "Foi gerado um e-mail de recuperação da senha, conforme mostrado abaixo, mas o envio {{GENDER:$2|ao usuário|à usuária}} falhou. $1",
"passwordreset-emailsent-capture2": "A redefinição da senha {{PLURAL:$1|do e-mail|dos e-mails}} foi enviada. {{PLURAL:$1|O nome de usuário e senha|A lista de nomes de usuário e senhas}} encontram-se a seguir.",
"changeemail": "Alterar ou remover endereço de email",
"changeemail-header": "Preencha este formulário para alterar seu endereço de e-mail. Se você gostaria de remover a associação de qualquer endereço de e-mail da sua conta, deixe o novo endereço de email em branco quando enviar o formulário.",
- "changeemail-passwordrequired": "Você terá que digitar sua senha para confirmar esta mudança.",
"changeemail-no-info": "Para acessar diretamente esta página você tem de estar autenticado.",
"changeemail-oldemail": "Endereço de e-mail atual:",
"changeemail-newemail": "Novo endereço de e-mail:",
"minoredit": "Marcar como edição menor",
"watchthis": "Vigiar esta página",
"savearticle": "Salvar página",
+ "publishpage": "Publicar página",
+ "publishchanges": "Publicar alterações",
"preview": "Pré-visualização",
"showpreview": "Mostrar previsão",
"showdiff": "Mostrar alterações",
"undo-nochange": "Parece que a edição já foi desfeita.",
"undo-summary": "Desfeita a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])",
"undo-summary-username-hidden": "Desfazer a revisão $1 de um usuário oculto",
- "cantcreateaccounttitle": "Não é possível criar uma conta",
"cantcreateaccount-text": "Este IP ('''$1''') foi bloqueado de criar novas contas por [[User:$3|$3]].\n\nA justificativa apresentada por $3 foi ''$2''",
"cantcreateaccount-range-text": "A criação de conta a partir dos endereços IP no intervalo <strong>$1</strong>, que inclui o seu endereço IP (<strong>$4</strong>), foi bloqueada por [[User:$3|$3]].\n\nA razão dada por $3 é <em>$2</em>",
"viewpagelogs": "Ver registros para esta página",
"changecontentmodel-reason-label": "Motivo:",
"changecontentmodel-success-title": "O modelo de conteúdo foi alterado",
"changecontentmodel-success-text": "O tipo de conteúdo de [[:$1]] foi alterado.",
- "log-name-contentmodel": "Log de alterações modelo de conteúdo",
+ "log-name-contentmodel": "Log de alterações do modelo de conteúdo",
"logentry-contentmodel-change-revertlink": "reverter",
"logentry-contentmodel-change-revert": "reverter",
"protectlogpage": "Registro de proteção",
"feedback-thanks-title": "Obrigado!",
"feedback-useragent": "Agente de usuário:",
"searchsuggest-search": "Pesquisa",
- "searchsuggest-containing": "contendo...",
+ "searchsuggest-containing": "páginas contendo…",
"api-error-badaccess-groups": "Você não tem permissão para enviar arquivos para este wiki.",
"api-error-badtoken": "Erro interno: token inválido.",
"api-error-copyuploaddisabled": "O upload por URL está desativado neste servidor.",
"tagline": "De {{SITENAME}}",
"help": "Ajuda",
"search": "Pesquisa",
+ "search-ignored-headings": " #<!-- deixe esta linha exatamente como ela está --> <pre>\n# Títulos de página que serão ignorados pela pesquisa.\n# Mudanças a esta lista terão efeito quando a página com o título referido for indexada.\n# Pode forçar a indexação de uma página realizando uma edição nula nessa página.\n# A sintaxe é a seguinte:\n# * Tudo desde um símbolo de cardinal (#) até ao fim da linha é um comentário\n# * Cada linha não vazia é o título exato a ignorar, respeitando o uso de maiúsculas\nReferências\nLinks externos\nVer também\n #</pre> <!-- deixe esta linha exatamente como ela está -->",
"searchbutton": "Pesquisar",
"go": "Ir",
"searcharticle": "Ir",
"databaseerror-query": "Consulta: $1",
"databaseerror-function": "Função: $1",
"databaseerror-error": "Erro: $1",
+ "transaction-duration-limit-exceeded": "Para evitar a criação de lag replicação alta, esta operação foi abortada porque a duração de gravação ($1) excedeu o limite de $2 {{PLURAL:$2|segundo|segundos}}. Se está a mudar muitos itens de uma vez, tente fazer várias operações menores em vez disso.",
"laggedslavemode": "'''Aviso:''' A página pode não conter as atualizações mais recentes.",
"readonly": "Base de dados bloqueada (limitada a leituras)",
"enterlockreason": "Introduza um motivo para bloquear, incluindo uma estimativa de quando será desbloqueada",
"title-invalid-interwiki": "O título da página solicitada contém uma ligação interlíngua que não pode ser utilizada em títulos.",
"title-invalid-talk-namespace": "O título da página solicitada refere-se a uma página de discussão que não existe.",
"title-invalid-characters": "O título da página solicitada contém carateres inválidos: \"$1\".",
+ "title-invalid-relative": "O título contém um caminho relativo. Os títulos relativos (./, ../) são inválidos porque estarão inacessíveis muitas vezes ao serem carregados pelo navegador do utilizador.",
"title-invalid-magic-tilde": "O título da página solicitada possui uma sequência de tis inválida (<nowiki>~~~</nowiki>).",
"title-invalid-too-long": "O título da página solicitada é demasiado longo. Não deverá ser maior que $1 {{PLURAL:$1|byte|bytes}} na codificação UTF-8.",
"title-invalid-leading-colon": "O título da página solicitada contém um erro de pontuação (:) no início.",
"createaccountreason": "Motivo:",
"createacct-reason": "Motivo",
"createacct-reason-ph": "Porque está a criar outra conta",
+ "createacct-reason-help": "Mensagem mostrada no registo de criação de contas",
"createacct-submit": "Crie a sua conta",
"createacct-another-submit": "Criar conta",
"createacct-continue-submit": "Continuar criação de conta",
"nocookiesnew": "A conta de utilizador foi criada, mas neste momento não tem sessão iniciada.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e inicie sessão com o seu nome de utilizador e a sua palavra-passe, por favor.",
"nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e tente novamente, por favor.",
"nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os ''cookies'' ativados, recarregue esta página e tente novamente.",
+ "createacct-loginerror": "A conta foi criada com êxito, mas não pôde ser autenticado automaticamente. Por favor, faça o [[Special:UserLogin|início de sessão manualmente]].",
"noname": "Não especificou um nome de utilizador válido.",
"loginsuccesstitle": "Autenticação bem sucedida",
"loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
"passwordreset-emailelement": "{{GENDER:$1|Utilizador|Utilizadora}}: \n$1\n\nPalavra-passe temporária: \n$2",
"passwordreset-emailsentemail": "Se este é o endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma palavra-passe de reposição.",
"passwordreset-emailsentusername": "Se houver um endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua palavra-passe.",
- "passwordreset-emailsent-capture": "Foi enviado um correio eletrónico para recuperação da palavra-passe, que é mostrado abaixo.",
- "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-passe, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
"passwordreset-invalideamil": "Correio eletrónico inválido",
"passwordreset-nodata": "Não foram fornecidos nome de utilizador(a) nem endereço de correio eletrónico",
"changeemail": "Alterar ou remover o endereço de correio eletrónico",
"changeemail-header": "Complete este formulário para alterar o seu endereço de correio eletrónico. Se quer eliminar a associação de qualquer endereço de correio eletrónico com a sua conta, deixe em branco o novo endereço de correio eletrónico ao submeter o formulário.",
- "changeemail-passwordrequired": "Necessita de introduzir a sua palavra-passe para confirmar esta alteração.",
"changeemail-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
"changeemail-oldemail": "Correio eletrónico atual:",
"changeemail-newemail": "Novo endereço de correio eletrónico:",
"undo-nochange": "A edição parece já ter sido desfeita.",
"undo-summary": "Desfez a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])",
"undo-summary-username-hidden": "Desfez a edição $1 de um utilizador oculto",
- "cantcreateaccounttitle": "Não é possível criar uma conta",
"cantcreateaccount-text": "A criação de contas a partir deste endereço IP ('''$1''') foi bloqueada por [[User:$3|$3]].\n\nO motivo apresentado por $3 foi ''$2''",
"cantcreateaccount-range-text": "A criação de conta a partir dos endereços IP no intervalo <strong>$1</strong>, que inclui o seu endereço IP (<strong>$4</strong>), foi bloqueada por [[User:$3|$3]].\n\nA razão dada por $3 é <em>$2</em>",
"viewpagelogs": "Ver registos para esta página",
"action-managechangetags": "criar e (des)ativar etiquetas",
"action-applychangetags": "aplicar etiquetas juntamente com as suas alterações",
"action-changetags": "adicionar e remover etiquetas arbitrárias em revisões e entradas de registo individuais",
+ "action-purge": "recarregar esta página",
"nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
"enhancedrc-history": "histórico",
"apisandbox-submit-invalid-fields-title": "Alguns campos são inválidos",
"apisandbox-submit-invalid-fields-message": "Por favor, corrija os campos marcados e tente novamente.",
"apisandbox-results": "Resultados",
+ "apisandbox-sending-request": "A enviar solicitação de API...",
+ "apisandbox-loading-results": "A receber resultados da API...",
"apisandbox-request-url-label": "URL do pedido:",
"apisandbox-request-time": "Tempo de processamento: {{PLURAL:$1|$1 ms}}",
"apisandbox-alert-field": "O valor deste campo não é válido.",
"watchnologin": "Não está autenticado(a)",
"addwatch": "Adicionar às páginas vigiadas",
"addedwatchtext": "\"[[:$1]]\" e a sua página de discussão foram adicionadas à sua [[Special:Watchlist|lista de páginas vigiadas]].",
+ "addedwatchtext-talk": "\"[[:$1]]\" e a sua página associada foram adicionadas à sua lista de [[Special:Watchlist|páginas vigiadas]].",
"addedwatchtext-short": "A página \"$1\" foi adicionada à sua lista de vigiadas.",
"removewatch": "Remover das páginas vigiadas",
"removedwatchtext": "\"[[:$1]]\" e a sua página de discussão foram removidas da sua lista de [[Special:Watchlist|páginas vigiadas]].",
+ "removedwatchtext-talk": "\"[[:$1]]\" e a sua página associada foram removidas da sua lista de [[Special:Watchlist|páginas vigiadas]].",
"removedwatchtext-short": "A página \"$1\" foi removida da sua lista de vigiadas.",
"watch": "Vigiar",
"watchthispage": "Vigiar esta página",
"changecontentmodel-success-text": "O tipo de conteúdo de [[:$1]] foi alterado.",
"changecontentmodel-cannot-convert": "O conteúdo em [[:$1]] não pode ser convertido para um tipo de $2.",
"changecontentmodel-nodirectediting": "O modelo de conteúdo $1 não suporta edição direta",
+ "changecontentmodel-emptymodels-title": "Não há modelos de conteúdo disponíveis",
+ "changecontentmodel-emptymodels-text": "O conteúdo em [[:$1]] não pode ser convertido para qualquer tipo.",
"log-name-contentmodel": "Registo de alteração de modelo de conteúdo",
"log-description-contentmodel": "Eventos relacionados com os modelos de conteúdo de uma página",
"logentry-contentmodel-new": "$1 {{GENDER:$2|criou}} a página $3 com o modelo de conteúdo desconhecido \"$5\"",
"lockdbsuccesstext": "A base de dados da {{SITENAME}} foi bloqueada.<br />\nLembre-se de [[Special:UnlockDB|remover o bloqueio]] após a manutenção.",
"unlockdbsuccesstext": "A base de dados foi desbloqueada.",
"lockfilenotwritable": "O ficheiro de bloqueio da base de dados não pode ser escrito.\nPara bloquear ou desbloquear a base de dados, este precisa de poder ser escrito pelo servidor de internet.",
+ "databaselocked": "A base de dados já está bloqueada.",
"databasenotlocked": "A base de dados não está bloqueada.",
"lockedbyandtime": "(por {{GENDER:$1|$1}} em $2 às $3)",
"move-page": "Mover $1",
"timezone-local": "Local",
"duplicate-defaultsort": "<strong>Aviso:</strong> A chave de ordenação padrão \"$2\" sobrepõe-se à anterior \"$1\".",
"duplicate-displaytitle": "<strong>Aviso:</strong> O título em exibição \"$2\" anula o título anteriormente em exibição \"$1\".",
+ "restricted-displaytitle": "<strong>Aviso</strong>: A apresentação do título \"$1\" foi ignorada porque não é equivalente ao título atual da página.",
"invalid-indicator-name": "<strong>Erro:</strong> O atributo <code>name</code>, da página de estados, não deve estar em branco.",
"version": "Versão",
"version-extensions": "Extensões instaladas",
"version-license-not-found": "Não foi encontrada informação detalhada da licença para esta extensão.",
"version-credits-title": "Créditos de autoria da extensão $1",
"version-credits-not-found": "Não foi encontrada informação detalhada dos créditos para esta extensão.",
- "version-poweredby-credits": "Esta wiki é potenciada por <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+ "version-poweredby-credits": "Este é um wiki <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
"version-poweredby-others": "outros",
"version-poweredby-translators": "os tradutores da translatewiki.net",
"version-credits-summary": "Gostaríamos de reconhecer as seguintes pessoas pela sua contribuição para o [[Special:Version|MediaWiki]].",
"tags-deactivate": "desativar",
"tags-hitcount": "$1 {{PLURAL:$1|modificação|modificações}}",
"tags-manage-no-permission": "Não possui permissão para gerir alterações de etiquetas.",
+ "tags-manage-blocked": "Não pode gerir alterações de etiquetas enquanto estiver bloqueado.",
"tags-create-heading": "Criar nova etiqueta",
"tags-create-explanation": "Por definição, etiquetas recém-criadas estarão disponíveis para utilização por utilizadores e robôs.",
"tags-create-tag-name": "Nome da etiqueta:",
"log-action-filter-managetags-delete": "Eliminação de etiqueta",
"log-action-filter-managetags-activate": "Ativação de etiqueta",
"log-action-filter-managetags-deactivate": "Desativação de etiqueta",
+ "log-action-filter-move-move": "Mover sem a substituição de páginas de redirecionamento",
+ "log-action-filter-move-move_redir": "Mover com a substituição de páginas de redirecionamento",
"log-action-filter-newusers-create": "Criação por utilizador anónimo",
"log-action-filter-newusers-create2": "Criação por utilizador registado",
"log-action-filter-newusers-autocreate": "Criação automática",
"log-action-filter-rights-rights": "Alteração manual",
"log-action-filter-rights-autopromote": "Alteração automática",
"log-action-filter-suppress-event": "Supressão de registo",
+ "log-action-filter-suppress-revision": "Supressão de revisões",
"log-action-filter-suppress-delete": "Supressão de página",
+ "log-action-filter-suppress-block": "Supressão de utilizadores por bloqueio",
"log-action-filter-upload-upload": "Novo carregamento",
"log-action-filter-upload-overwrite": "Recarregar",
"authmanager-create-disabled": "A criação de contas está desativada.",
"authmanager-create-from-login": "Para criar a sua conta, por favor, preencha os campos abaixo.",
+ "authmanager-authplugin-setpass-failed-title": "A alteração de palavra-passe falhou",
+ "authmanager-authplugin-setpass-failed-message": "O plugin de autenticação negou a alteração de palavra-passe.",
+ "authmanager-authplugin-create-fail": "O plugin de autenticação negou a criação de conta.",
+ "authmanager-authplugin-setpass-denied": "O plugin de autenticação não permite a alteração de palavras-passe.",
"authmanager-authplugin-setpass-bad-domain": "Domínio inválido.",
+ "authmanager-autocreate-noperm": "A criação automática de contas não é permitida.",
+ "authmanager-autocreate-exception": "A criação automática de contas foi temporariamente desativada devido a erros prévios.",
"authmanager-userdoesnotexist": "A conta de utilizador(a) \"$1\" não está registada.",
"authmanager-username-help": "Nome de utilizador(a) para autenticação.",
"authmanager-password-help": "Palavra-passe para autenticação.",
"authmanager-email-help": "Endereço de correio eletrónico",
"authmanager-realname-label": "Nome verdadeiro",
"authmanager-realname-help": "Nome verdadeiro do(a) utilizador(a)",
+ "authmanager-provider-password": "Autenticação baseada em palavra-passe",
+ "authmanager-provider-password-domain": "Autenticação baseada em palavra-passe e domínio",
+ "authmanager-provider-temporarypassword": "Palavra-passe temporária",
+ "authprovider-confirmlink-message": "Com base nas tuas últimas tentativas para iniciar sessão, as seguintes contas podem ser ligadas à tua conta wiki. Vinculá-las permite que inicie sessão através das mesmas. Selecione quais pretende vincular.",
+ "authprovider-confirmlink-success-line": "$1: Ligado com êxito.",
"authprovider-resetpass-skip-label": "Ignorar",
+ "authprovider-resetpass-skip-help": "Ignorar redefinição de palavra-passe",
+ "authform-newtoken": "Chave em falta. $1",
+ "authform-notoken": "Chave em falta",
+ "authform-wrongtoken": "Chave errada",
+ "specialpage-securitylevel-not-allowed-title": "Não permitido",
+ "specialpage-securitylevel-not-allowed": "Desculpe, não tem permissão para utilizar esta página porque a sua identidade não pôde ser verificada.",
"authpage-cannot-login": "Não é possível iniciar sessão.",
"authpage-cannot-login-continue": "Não é possível continuar a iniciar sessão. A sua sessão pode ter expirado.",
"authpage-cannot-create": "Não é possível iniciar a criação da conta.",
"Psychoslave",
"Guycn2",
"2axterix2",
- "Ата"
+ "Ата",
+ "Matěj Suchánek",
+ "Chaduvari"
]
},
"sidebar": "{{notranslate}}",
"noindex-category": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behavior switch are listed.\n\nFor description of this behavior switch see [[mw:Special:MyLanguage/Help:Magic_words#Behavior_switches|MediaWiki]].\n\nSee also:\n* {{msg-mw|Noindex-category-desc}}",
"broken-file-category": "Name of [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that embed files that do not exist (\"broken images\") are listed.\n\nSee also:\n* {{msg-mw|Broken-file-category-desc}}",
"categoryviewer-pagedlinks": "{{Optional}}\nThe pagination links in category viewer. Parameters:\n* $1 - the previous link, uses {{msg-mw|Prevn}}\n* $2 - the next link, uses {{msg-mw|Nextn}}",
+ "category-header-numerals": "{{Optional}}\nA header for all pages whose titles start with a number. This is used on category pages. This should only be translated if your language uses a different method to indicate a range of numbers (other than a dash).\n* $1 – 0 (or localized equivalent)\n* $2 – 9 (or localized equivalent)",
"about": "{{Identical|About}}",
"article": "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}",
"newwindow": "Below the edit form, next to \"{{msg-mw|Edithelp}}\".",
"tagline": "{{doc-important|Do not change <code><nowiki>{{SITENAME}}</nowiki></code>.}}\nUsed to identify the source of copied information.",
"help": "General text (noun) used in the sidebar (by default).\n\nSee also {{msg-mw|Helppage}} and {{msg-mw|Edithelp}}.\n\nSee also:\n* {{msg-mw|Help}}\n* {{msg-mw|Accesskey-n-help}}\n* {{msg-mw|Tooltip-n-help}}\n{{Identical|Help}}",
"search": "{{doc-special|Search}}\nNoun. Text of menu section shown on every page of the wiki above the search form.\n\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search}}\n* {{msg-mw|Tooltip-search}}\n{{Identical|Search}}",
+ "search-ignored-headings": "Headings that will be ignored by search. You can translate the text, including \"Leave this line exactly as it is\". Some lines of this messages have one (1) leading space.",
"searchbutton": "The button you can see in the sidebar, below the search input box. The \"Go\" button is {{msg-mw|Searcharticle}}.\n{{Identical|Search}}",
"go": "See also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}\n{{Identical|Go}}",
"searcharticle": "Button description in the search menu displayed on every page. The \"Search\" button is {{msg-mw|Searchbutton}}.\n{{Identical|Go}}",
"resetpass-abort-generic": "Generic error message shown on [[Special:ChangePassword]] when an extension aborts a password change from a hook.",
"resetpass-expired": "Generic error message shown on [[Special:ChangePassword]] when a user's password is expired",
"resetpass-expired-soft": "Generic warning message shown on [[Special:ChangePassword]] when a user needs to reset their password, but they are not prevented from logging in at this time",
- "resetpass-validity-soft": "Warning message shown on [[Special:ChangePassword]] when a user needs to reset their password, because their password is not valid.\n\nRefers to {{msg-mw|Resetpass-submit-cancel}}.\n\nParameters:\n* $1 - error message",
+ "resetpass-validity-soft": "Warning message shown on [[Special:ChangePassword]] when a user needs to reset their password, because their password is not valid.\n\nRefers to {{msg-mw|authprovider-resetpass-skip-label}}.\n\nParameters:\n* $1 - error message",
"passwordreset": "Title of [[Special:PasswordReset]].\n{{Identical|Reset password}}",
"passwordreset-text-one": "Text on [[Special:PasswordReset]] that appears when there is only one way of resetting the password.\n\n{{msg-mw|Passwordreset-text-many}} will be used, when there are multiple ways of resetting the password.",
"passwordreset-text-many": "Text on [[Special:PasswordReset]] that appears when there are multiple ways of resetting the password.\n\nParameters:\n* $1 - the number of password reset routes\n\n{{msg-mw|Passwordreset-text-one}} will be used, when there is only one way of resetting the password.",
"passwordreset-emailelement": "This is a body of a password reset email to allow them into the system with a new password. Parameters:\n* $1 - the user's login name. This parameter can be used for GENDER.\n* $2 - the temporary password given by the system",
"passwordreset-emailsentemail": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
"passwordreset-emailsentusername": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
- "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
- "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
- "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
+ "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
"passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
"passwordreset-nocaller": "Shown when a password reset was requested but the caller was not provided. This is an internal error.",
"passwordreset-nosuchcaller": "Shown when a password reset was requested but the username of the caller could not be resolved to a user. This is an internal error.\n\nParameters:\n* $1 - username of the caller",
"changeemail": "Title of [[Special:ChangeEmail|special page]]. This page also allows removing the user's email address.",
"changeemail-summary": "{{ignored}}",
"changeemail-header": "Text of [[Special:ChangeEmail]].",
- "changeemail-passwordrequired": "Shown on [[Special:ChangeEmail]] if users are required to enter their password to change their email address..",
"changeemail-no-info": "Error message for [[Special:ChangeEmail]].\n\nParameters:\n* $1 (unused) - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
"changeemail-oldemail": "Label for e-mail address field in [[Special:ChangeEmail]].",
"changeemail-newemail": "Label for e-mail address field in [[Special:ChangeEmail]]. See also {{msg-mw|changeemail-newemail-help}}",
"undo-nochange": "Message appears if an attempt to revert an edit by clicking the \"undo\" link results in an edit making no change to the current version of the page.\n\nSee also:\n* {{msg-mw|Undo-failure}}\n* {{msg-mw|Undo-norev}}",
"undo-summary": "Edit summary for an undo action. Parameters:\n* $1 - revision ID\n* $2 - username\n{{Identical|Undo}}",
"undo-summary-username-hidden": "Edit summary for an undo action where the username of the old revision is hidden.\n\nParameters:\n* $1 - the revision ID being undone\nSee also:\n* {{msg-mw|Undo-summary}}",
- "cantcreateaccounttitle": "Used as title of the error message {{msg-mw|Cantcreateaccount-text}}.",
- "cantcreateaccount-text": "Used as error message, with the title {{msg-mw|Cantcreateaccounttitle}}.\n* $1 - target IP address\n* $2 - reason or {{msg-mw|Blockednoreason}}\n* $3 - username\nSee also:\n* {{msg-mw|Cantcreateaccount-range-text}}",
+ "cantcreateaccount-text": "Used as error message when account creation is prevented by an IP block.\n* $1 - target IP address\n* $2 - reason or {{msg-mw|Blockednoreason}}\n* $3 - username\nSee also:\n* {{msg-mw|Cantcreateaccount-range-text}}",
"cantcreateaccount-range-text": "Used instead of the {{msg-mw|Cantcreateaccount-text}} when the block is a range block.\n* $1 - target IP address range\n* $2 - reason or {{msg-mw|Blockednoreason}}\n* $3 - username\n* $4 - current user's IP address",
"createaccount-hook-aborted": "Placeholder message to return with API errors on account create; passes through the message from a hook {{notranslate}}",
"viewpagelogs": "Link displayed in history of pages",
"action-applychangetags": "{{doc-action|applychangetags}}",
"action-changetags": "{{doc-action|changetags}}",
"action-deletechangetags": "{{doc-action|deletechangetags}}",
+ "action-purge": "{{doc-action|purge}}",
"nchanges": "Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to a diff of the changes.\n\nParameters:\n* $1 - the number of changes on that day (2 or more)\nThree messages are shown side-by-side: ({{msg-mw|Nchanges}} | {{msg-mw|Enhancedrc-since-last-visit}} | {{msg-mw|Enhancedrc-history}}).",
"enhancedrc-since-last-visit": "Appears on enhanced watchlist and recent changes when page has more than one change on given date and at least one that the user hasn't seen yet, linking to a diff of the unviewed changes.\n\nParameters:\n* $1 - the number of unviewed changes (1 or more)\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).",
"enhancedrc-history": "Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to its history.\n\nThis is the same as {{msg-mw|hist}}, but not abbreviated.\n\nThree messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).\n{{Identical|History}}",
"apisandbox-jsonly": "Displayed as an error message if the browser does not have JavaScript enabled.",
"apisandbox-api-disabled": "Displayed as an error message if the API is disabled on this site.",
"apisandbox-intro": "Displayed (from JavaScript) as a header on [[Special:ApiSandbox]].",
- "apisandbox-fullscreen": "JavaScript button label for enabling full-page mode.",
+ "apisandbox-fullscreen": "JavaScript button label for enabling full-page mode.\n\nSee https://phabricator.wikimedia.org/T129632#2465838 for details.",
"apisandbox-fullscreen-tooltip": "Tooltip for the {{msg-mw|apisandbox-fullscreen}} button.",
- "apisandbox-unfullscreen": "JavaScript button label for disabling full-page mode.",
+ "apisandbox-unfullscreen": "JavaScript button label for disabling full-page mode.\n\nSee https://phabricator.wikimedia.org/T129632#2465838 for details.",
"apisandbox-unfullscreen-tooltip": "Tooltip for the {{msg-mw|apisandbox-unfullscreen}} button.",
"apisandbox-submit": "JavaScript button label for submitting the request.",
"apisandbox-reset": "JavaScript button label for clearing the form.\n{{Identical|Clear}}",
"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}}",
+ "addedwatchtext": "Message shown after clicking on the {{msg-mw|Watch}} tab in a content namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Removedwatchtext}}\n* {{msg-mw|Addedwatchtext-talk}}",
+ "addedwatchtext-talk": "Message shown after clicking on the {{msg-mw|Watch}} tab in a talk namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Removedwatchtext-talk}}\n* {{msg-mw|Addedwatchtext}}",
"addedwatchtext-short": "Explanation shown when watching item from [[Special:UnwatchedPages]].\n\nSee also:\n* {{msg-mw|Removedwatchtext-short}}\n* {{msg-mw|Addedwatchtext}}",
"removewatch": "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|Addwatch}}",
- "removedwatchtext": "After a page has been removed from a user's watchlist by clicking the {{msg-mw|Unwatch}} tab at the top of an article, this message appears just below the title of the article.\n\nParameters:\n* $1 - the title of the article\nSee also:\n* {{msg-mw|Removedwatch}}\n* {{msg-mw|Addedwatchtext}}",
+ "removedwatchtext": "Message shown after clicking on the {{msg-mw|Unwatch}} tab in a content namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatchtext}}\n* {{msg-mw|Removedwatchtext-talk}}",
+ "removedwatchtext-talk": "Message shown after clicking on the {{msg-mw|Unwatch}} tab in a talk namespace page. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatchtext-talk}}\n* {{msg-mw|Removedwatchtext}}",
"removedwatchtext-short": "Explanation shown when unwatching item from [[Special:UnwatchedPages]].\n\nSee also:\n* {{msg-mw|Addedwatchtext-short}}.\n* {{msg-mw|Removedwatchtext}}.",
"watch": "{{doc-actionlink}}\nName of the Watch tab. Should be in the imperative mood.\n\nSee also:\n* {{msg-mw|Watch}}\n* {{msg-mw|Accesskey-ca-watch}}\n* {{msg-mw|Tooltip-ca-watch}}",
"watchthispage": "Used as link text.\n\nSee also:\n* {{msg-mw|Unwatchthispage|link text}}\n* {{msg-mw|Notanarticle|error message}}\n{{Identical|Watch this page}}",
"rollbacklinkcount": "{{doc-actionlink}}\nText of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nParameters:\n* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.\n\nThe rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}",
"rollbacklinkcount-morethan": "{{doc-actionlink}}\nText of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nWhen the number of edits rolled back is smaller than [[mw:Special:MyLanguage/Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.\n\nParameters:\n* $1 - number of edits",
"rollbackfailed": "{{Identical|Rollback}}",
- "rollback-missingparam": "Used as error message rollback is accessed without the required parameters\n\nSee also:\n* {{msg-mw|Rollbackfailed}}",
+ "rollback-missingparam": "Used as error message that rollback is accessed without the required parameters\n\nSee also:\n* {{msg-mw|Rollbackfailed}}",
"cantrollback": "Used as error message when rollback fails due to there not being a valid revision to revert back to.\n\nSee also:\n* {{msg-mw|Notvisiblerev}}\n{{Identical|Revert}}\n{{Identical|Rollback}}",
"alreadyrolled": "Appear when there's rollback and/or edit collision.\n\nRefers to:\n* {{msg-mw|Pipe-separator}}\n* {{msg-mw|Contribslink}}\nParameters:\n* $1 - the page to be rolled back\n* $2 - the editor to be rolled-back of that page\n* $3 - the editor that cause collision\n{{Identical|Rollback}}",
"editcomment": "Only shown if there is an edit {{msg-mw|Summary}}. Parameters:\n* $1 - the edit summary",
"revertpage": "Parameters:\n* $1 - username 1\n* $2 - username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from\nSee also:\n* {{msg-mw|Revertpage-nouser}}\n{{Identical|Revert}}",
"revertpage-nouser": "This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.\n\nIn other cases the message {{msg-mw|Revertpage}} is used.\n\nParameters:\n* $1 - username 1, can be used for GENDER\n* $2 - (Optional) username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from",
"rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.\n{{Identical|Revert}}\n{{Identical|Rollback}}",
- "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{Identical|rollback-success}}\n{{Format|jquerymsg}}",
+ "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{related|rollback-success}}\n{{Format|jquerymsg}}",
"sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.",
"sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.",
"changecontentmodel": "Title of the change content model special page",
"metadata-fields": "{{doc-important|Do not translate list items, only translate the text! So leave \"<code>* make</code>\" and the other items exactly as they are.}}\nThe sentences are for explanation only and are not shown to the user.",
"metadata-langitem": "{{optional}}\nThis is used for constructing the list of translations when a metadata property is translated into multiple languages.\n\nParameters:\n* $1 - the value of the property (in one language)\n* $2 - the language name that this translation is for (or language code if language name cannot be determined)\n* $3 - (Unused) the language code",
"metadata-langitem-default": "{{optional}}\nSimilar to \"metadata-langitem\" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.",
- "exif-imagewidth": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Width}}",
- "exif-imagelength": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Height}}",
+ "exif-imagewidth": "{{exif-qqq}}\n{{Identical|Width}}",
+ "exif-imagelength": "{{exif-qqq}}\n{{Identical|Height}}",
"exif-bitspersample": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
- "exif-compression": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis field labels what the compression of the image is. It is commonly seen in Tiff images. It uses messages like {{msg-mw|exif-compression-1}} for the value. [[w:TIFF#TIFF_Compression_Tag]] has information about this field.\n{{Related|Exif-compression}}",
+ "exif-compression": "{{exif-qqq}}\n\nThis field labels what the compression of the image is. It is commonly seen in Tiff images. It uses messages like {{msg-mw|exif-compression-1}} for the value. [[w:TIFF#TIFF Compression Tag]] has information about this field.\n\n{{Related|Exif-compression}}",
"exif-photometricinterpretation": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
- "exif-orientation": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nFor specific information on the orientation tag, see http://sylvana.net/jpegcrop/exif_orientation.html\n{{Related|Exif-orientation}}",
+ "exif-orientation": "{{exif-qqq}}\n\nFor specific information on the orientation tag, see http://sylvana.net/jpegcrop/exif_orientation.html\n\n{{Related|Exif-orientation}}",
"exif-samplesperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
- "exif-planarconfiguration": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
+ "exif-planarconfiguration": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
"exif-ycbcrsubsampling": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
- "exif-ycbcrpositioning": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-ycbcrpositioning}}",
- "exif-xresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis is the horizontal resolution in either dots/inch or dots/cm.",
- "exif-yresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis is the vertical resolution in either dots/inch or dots/cm.",
+ "exif-ycbcrpositioning": "{{exif-qqq}}\n{{Related|Exif-ycbcrpositioning}}",
+ "exif-xresolution": "{{exif-qqq}}\n\nThis is the horizontal resolution in either dots/inch or dots/cm.",
+ "exif-yresolution": "{{exif-qqq}}\n\nThis is the vertical resolution in either dots/inch or dots/cm.",
"exif-stripoffsets": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
"exif-rowsperstrip": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
"exif-stripbytecounts": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
"exif-primarychromaticities": "The chromaticity of the three primary colours of the image. Normally this tag is not necessary, since colour space is specified in the colour space information tag. This should probably be translated it as \"Chromaticity of primary colours\".\n\nExif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
"exif-ycbcrcoefficients": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
"exif-referenceblackwhite": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
- "exif-datetime": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nNote, this message is also used for the XMP:ModifyDate property in XMP metadata. See page 35 of http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf\n\nDatetime is the time that the digital file was last changed.",
- "exif-imagedescription": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis property is the description or caption of the image. It is used for the exif ImageDescription property, the dc:description property in XMP (see http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), and the iptc-iim 2:120 caption/abstract property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n\nWhen an image has multiple differing descriptions, mediawiki follows the MWG guidelines when deciding which to show (Which typically means Exif takes precedence).",
- "exif-make": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe Manufacturer of the digital camera (or scanner) that took the photo.",
- "exif-model": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe model of camera (or scanner) used to take the picture.",
- "exif-software": "Short for \"The software which was used to create or modify this image\".\n\nThe property can come from the Exif Software tag, PNG software chunk, iptc-iim 2:65 Software field, or XMP's xmp:CreatorTool field.\n\nExif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
- "exif-artist": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis message labels the author or artist of the work. Usually this means who took the photograph, or who drew the picture. The corresponding value field most commonly contains a single author, however it can contain an ordered (or unordered depending on which metadata standard is used to store the information) list of authors. Sometimes the persons position is prefixed before their name such as \"Photographer, John Smith\". The exif standard recommends multiple authors be specified by \"position, Author 1; position for author 2, Author 2's name\" however this doesn't seem to happen in practice very often. If multiple authors are specified using a non-exif standard, then a billeted (or numbered) list is used.\n\nThis property can be specified by exif Artist tag, XMP's tiff:Artist, XMP's dc:creator, iptc-iim's 2:80 byline, PNG's author textual chunk, PNG's (unofficial) artist textual chunk. XMP's photoshop:AuthorsPosition and iptc 2:85 byline-title can also affect display of this property.\n{{Identical|Author}}",
+ "exif-datetime": "{{exif-qqq}}\n\nNote: this message is also used for the XMP:ModifyDate property in XMP metadata. See page 35 of http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf\n\nDatetime is the time that the digital file was last changed.",
+ "exif-imagedescription": "{{exif-qqq}}\n\nThis property is the description or caption of the image. It is used for the exif ImageDescription property, the dc:description property in XMP (see http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), and the iptc-iim 2:120 caption/abstract property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n\nWhen an image has multiple differing descriptions, mediawiki follows the MWG guidelines when deciding which to show (Which typically means Exif takes precedence).",
+ "exif-make": "{{exif-qqq}}\n\nThe Manufacturer of the digital camera (or scanner) that took the photo.",
+ "exif-model": "{{exif-qqq}}\n\nThis tag specifies the model of camera (or scanner) used to take the picture.",
+ "exif-software": "{{exif-qqq}}\n\nThis tag is short for \"The software which was used to create or modify this image\".\n\nThe property can come from the Exif Software tag, PNG software chunk, iptc-iim 2:65 Software field, or XMP's xmp:CreatorTool field.",
+ "exif-artist": "{{exif-qqq}}\n\nThis message labels the author or artist of the work. Usually this means who took the photograph, or who drew the picture. The corresponding value field most commonly contains a single author, however it can contain an ordered (or unordered depending on which metadata standard is used to store the information) list of authors. Sometimes the persons position is prefixed before their name such as \"Photographer, John Smith\". The exif standard recommends multiple authors be specified by \"position, Author 1; position for author 2, Author 2's name\" however this doesn't seem to happen in practice very often. If multiple authors are specified using a non-exif standard, then a billeted (or numbered) list is used.\n\nThis property can be specified by exif Artist tag, XMP's tiff:Artist, XMP's dc:creator, iptc-iim's 2:80 byline, PNG's author textual chunk, PNG's (unofficial) artist textual chunk. XMP's photoshop:AuthorsPosition and iptc 2:85 byline-title can also affect display of this property.\n\n{{Identical|Author}}",
"exif-copyright": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nLabel for information contained in exif Copyright tag, XMP dc:rights, IPTC-iim 2:116, or PNG copyright textual chunk.\n\nTypically the copyright statement for the photograph/drawing/video (such as ''(c) 2010 John Smith. Released under GFDL''). Sometimes contains license information. See also {{msg-mw|exif-copyrightowner}}",
- "exif-exifversion": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nVersion of exif standard photo uses. Typically this is 2.22",
+ "exif-exifversion": "{{exif-qqq}}\n\nVersion of exif standard photo uses. Typically this is 2.22",
"exif-flashpixversion": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nVersion of flashpix used. Flashpix is a format used for storing some types of metadata in image. It is not as commonly used as EXIF, and mediawiki currently cannot read Flashpix data.",
- "exif-colorspace": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe colorspace of the photo. This tells the computer how to make the colours in the photo be more true to the original photo. Typical values for this are sRGB or uncalibrated. This only gives information on colour information given in the exif-colorspace property. However, colour information is often stored elsewhere in the photo.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
- "exif-componentsconfiguration": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.\n{{Related|Exif-componentsconfiguration}}",
+ "exif-colorspace": "{{exif-qqq}}\n\nThe colorspace of the photo. This tells the computer how to make the colours in the photo be more true to the original photo. Typical values for this are sRGB or uncalibrated. This only gives information on colour information given in the exif-colorspace property. However, colour information is often stored elsewhere in the photo.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
+ "exif-componentsconfiguration": "{{exif-qqq}}\n\nThis contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.\n\n{{Related|Exif-componentsconfiguration}}",
"exif-compressedbitsperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
- "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image width}}",
+ "exif-pixelxdimension": "{{exif-qqq}}\n{{Identical|Image width}}",
"exif-pixelydimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image height}}",
- "exif-usercomment": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practice utf-8 is used in ImageDescription, so this field isn't used too much.)",
+ "exif-usercomment": "{{exif-qqq}}\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practice utf-8 is used in ImageDescription, so this field isn't used too much.)",
"exif-relatedsoundfile": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSome cameras offer the option to record an audio \"memo\" for the photo they just took. If the user did that, the name of the file is labelled with this message.",
"exif-datetimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the original image data was generated. For example if it was a painting from 1773, scanned in to a computer in 2007, the datetimeoriginal would be 1773 and {{msg-mw|exif-datetimedigitized}} would have the 2007 date.",
"exif-datetimedigitized": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the image was stored as digital data.",
- "exif-subsectime": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\n'DateTime subseconds' shows the detail of the fraction of a second (1/100s) at which the file was changed, when the tag {{msg-mw|Exif-datetime}} is recorded to the whole second.",
- "exif-subsectimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file data was originally generated, when the tag {{msg-mw|Exif-datetimeoriginal}} is recorded to the whole second.",
- "exif-subsectimedigitized": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file was stored as digital data, when the tag {{msg-mw|Exif-datetimedigitized}} is recorded to the whole second.",
- "exif-exposuretime": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe exposure time. Number of (or fraction of) seconds the film was exposed to light. The value for this property is formatted using {{msg-mw|exif-exposuretime-format}}",
- "exif-exposuretime-format": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nParameters:\n* $1 - the exposure time written as a fraction of a second, for example 1/640 of a second\n* $2 - the exposure time written as a decimal, for example 0.0015625\n\n'sec' is the abbreviation used in English for the unit of time 'second'.",
- "exif-fnumber": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe [[w:F_number|F number]] is the relative aperture of the camera.",
+ "exif-subsectime": "{{exif-qqq}}\n\n'DateTime subseconds' shows the detail of the fraction of a second (1/100s) at which the file was changed, when the tag {{msg-mw|Exif-datetime}} is recorded to the whole second.",
+ "exif-subsectimeoriginal": "{{exif-qqq}}\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file data was originally generated, when the tag {{msg-mw|Exif-datetimeoriginal}} is recorded to the whole second.",
+ "exif-subsectimedigitized": "{{exif-qqq}}\n\nThis tag shows the detail of the fraction of a second (1/100s) at which the file was stored as digital data, when the tag {{msg-mw|Exif-datetimedigitized}} is recorded to the whole second.",
+ "exif-exposuretime": "{{exif-qqq}}\n\nThe exposure time. Number of (or fraction of) seconds the film was exposed to light. The value for this property is formatted using {{msg-mw|exif-exposuretime-format}}",
+ "exif-exposuretime-format": "{{exif-qqq}}\n\nParameters:\n* $1 - the exposure time written as a fraction of a second, for example 1/640 of a second\n* $2 - the exposure time written as a decimal, for example 0.0015625\n\n'sec' is the abbreviation used in English for the unit of time 'second'.",
+ "exif-fnumber": "{{exif-qqq}}\n\nThe [[w:F number|F number]] is the relative aperture of the camera.",
"exif-fnumber-format": "{{optional}}\nExif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nParameters:\n* $1 - a number\nNote:\n* f is the abbreviation used in English for \"f-number\".",
- "exif-exposureprogram": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow the camera figured out what exposure to use. (If it was manually set, if its optimizing for fast shutter speed, etc).\n{{Related|Exif-exposureprogram}}",
+ "exif-exposureprogram": "{{exif-qqq}}\n\nHow the camera figured out what exposure to use. (If it was manually set, if its optimizing for fast shutter speed, etc).\n\n{{Related|Exif-exposureprogram}}",
"exif-spectralsensitivity": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow sensitive each channel (colour) of the photo is to light. This tag is almost never used.",
"exif-isospeedratings": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe iso speed of the film used in the camera. This is basically a measure of how sensitive the film in the camera is to light.",
"exif-shutterspeedvalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\n[[w:Shutter_speed|Shutter speed]] is the time that the camera shutter is open.\n\nThis is the shutter speed measured in APEX units (negative base 2 log of shutter speed in seconds). See {{msg-mw|exif-exposuretime}} for this property in more traditional units of seconds.",
- "exif-aperturevalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe [[w:Aperture|aperture]] of a camera is the hole through which light shines. This message can be translated 'Aperture width'. Note, this is measured in APEX units which is 2*log<sub>2</sub>(f-number) . See {{msg-mw|exif-fnumber}} for this value in more traditional units.",
+ "exif-aperturevalue": "{{exif-qqq}}\n\nThe [[w:Aperture|aperture]] of a camera is the hole through which light shines. This message can be translated 'Aperture width'. Note, this is measured in APEX units which is 2*log<sub>2</sub>(f-number) . See {{msg-mw|exif-fnumber}} for this value in more traditional units.",
"exif-brightnessvalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow intense the illumination of the scene photographed is. Measured in APEX brightness units. See Annex C of Exif standard for details on the measurement system in use.",
"exif-exposurebiasvalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nAnother term for [[w:Exposure_bias|'exposure bias']] is 'exposure compensation'.",
"exif-maxaperturevalue": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe 'land' in a camera refers possibly to the inner surface of the barrel of the lens. An alternative phrasing for this message could perhaps be 'maximum width of the land aperture'.",
"exif-subjectdistance": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe subject of a photograph is the person or thing on which the camera focuses. 'Subject distance' is the distance to the subject given in meters.",
- "exif-meteringmode": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee [[w:Metering_mode|Wikipedia article]] on metering mode.\n{{Related|Exif-meteringmode}}",
- "exif-lightsource": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-lightsource}}",
- "exif-flash": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee this [[w:en:Flash_(photography)|Wikipedia article]] for an explanation of the term.\n{{Related|Exif-flash}}\n{{Identical|Flash}}",
+ "exif-meteringmode": "{{exif-qqq}}\n\nSee [[w:Metering mode|Wikipedia article]] on metering mode.\n\n{{Related|Exif-meteringmode}}",
+ "exif-lightsource": "{{exif-qqq}}\n\n{{Related|Exif-lightsource}}",
+ "exif-flash": "{{exif-qqq}}\n\nSee this [[w:en:Flash (photography)|Wikipedia article]] for an explanation of the term.\n\n{{Related|Exif-flash}}\n{{Identical|Flash}}",
"exif-focallength": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee this [[w:en:Focal_length_(photography)|Wikipedia article]] for an explanation of the term.",
"exif-focallength-format": "{{optional}}\nExif is a format for storing metadata in image files. See this [http://en.wikipedia.org/wiki/Exchangeable_image_file_format Wikipedia article] and the example at the bottom of [http://commons.wikimedia.org/wiki/File:Phalacrocorax-auritus-020.jpg this page on Commons]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nParameters:\n* $1 - a number\nNote:\n* mm is the abbreviation used in English for the unit of measurement of length \"millimeter\".",
- "exif-subjectarea": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis exif property contains the position of the main subject. The first two numbers is the position of the subject in the picture in pixels from the upper left corner. If a third number is specified, it is a circle centred at the first two numbers. If four numbers are specified, the first two are coordinates of the centre of the subject as before, the third is the width of the rectangle, and the fourth is the height of the rectangle. It is rare for a photo to use this tag.",
+ "exif-subjectarea": "{{exif-qqq}}\n\nThis exif property contains the position of the main subject. The first two numbers is the position of the subject in the picture in pixels from the upper left corner. If a third number is specified, it is a circle centred at the first two numbers. If four numbers are specified, the first two are coordinates of the centre of the subject as before, the third is the width of the rectangle, and the fourth is the height of the rectangle. It is rare for a photo to use this tag.",
"exif-flashenergy": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nHow bright the flash is in beam candle power seconds.",
"exif-focalplanexresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nIndicates the number of pixels in the image width (X) direction per FocalPlaneResolutionUnit on the camera focal plane.",
"exif-focalplaneyresolution": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
- "exif-focalplaneresolutionunit": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also:\n* {{msg-mw|Exif-focalplaneresolutionunit-2}}",
+ "exif-focalplaneresolutionunit": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-focalplaneresolutionunit-2}}",
"exif-subjectlocation": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSame as {{msg-mw|exif-subjectarea}} but only ever has two numbers as a value.",
"exif-exposureindex": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
- "exif-sensingmethod": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-sensingmethod}}",
+ "exif-sensingmethod": "{{exif-qqq}}\n{{Related|Exif-sensingmethod}}",
"exif-filesource": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nDetermines if the image was recorded by a digital camera adhering to DSC standard (which is almost all digital cameras).",
- "exif-scenetype": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nIf the image is directly photographed (taken by a digital camera).\n\nSee also:\n* {{msg-mw|Exif-scenetype}}\n* {{msg-mw|Exif-scenetype-1}}",
- "exif-customrendered": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Image_processing|image processing]].\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
- "exif-exposuremode": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:en:Exposure_(photography)|exposure in photography]]. This tag shows if the photo's exposure was manually set or automatically determined.\n{{Related|Exif-exposuremode}}",
- "exif-whitebalance": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Color_balance|color balance]].\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
+ "exif-scenetype": "{{exif-qqq}}\n\nThis tag indicates whether the image is directly photographed (taken by a digital camera).\n\nSee also:\n* {{msg-mw|Exif-scenetype}}\n* {{msg-mw|Exif-scenetype-1}}",
+ "exif-customrendered": "{{exif-qqq}}\n\nSee also the Wikipedia article on [[w:Image processing|image processing]].\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
+ "exif-exposuremode": "{{exif-qqq}}\n\nThis tag shows if the photo's exposure was manually set or automatically determined. See the Wikipedia article on [[w:en:Exposure (photography)|exposure in photography]] for more details.\n\n{{Related|Exif-exposuremode}}",
+ "exif-whitebalance": "{{exif-qqq}}\n\nSee also the Wikipedia article on [[w:Color balance|color balance]].\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
"exif-digitalzoomratio": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Digital_zoom|digital zoom]].",
"exif-focallengthin35mmfilm": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSee also Wikipedia on [[w:Focal_length#In_photography|focal length]].",
- "exif-scenecapturetype": "{{Related|Exif-scenecapturetype}}",
- "exif-gaincontrol": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
- "exif-contrast": "{{Related|Exif-contrast}}",
- "exif-saturation": "{{Related|Exif-saturation}}",
- "exif-sharpness": "{{Related|Exif-sharpness}}",
+ "exif-scenecapturetype": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
+ "exif-gaincontrol": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
+ "exif-contrast": "{{exif-qqq}}\n{{Related|Exif-contrast}}",
+ "exif-saturation": "{{exif-qqq}}\n{{Related|Exif-saturation}}",
+ "exif-sharpness": "{{exif-qqq}}\n{{Related|Exif-sharpness}}",
"exif-devicesettingdescription": "The section header shown above device settings extracted from a file's EXIF data on the file's page.",
- "exif-subjectdistancerange": "{{Related|Exif-subjectdistancerange}}",
+ "exif-subjectdistancerange": "{{exif-qqq}}\n{{Related|Exif-subjectdistancerange}}",
"exif-imageuniqueid": "A unique identifier for the image in the form of a 128-bit hexadecimal string. See http://www.exif.org/Exif2-2.PDF for details on exif properties.",
"exif-gpsversionid": "Version of the GPS IFD used to store location information. This is usually 2.2.0.0",
- "exif-gpslatituderef": "In older versions of mediawiki this referred to if the latitude was North or South. This is no longer used in modern versions of mediawiki except for when using a foreign image repository that is using an older version of mediawiki since the information is now contained in {{msg-mw|exif-gpslatitude}}.\n{{Related|Exif-gpslatitude}}",
- "exif-gpslatitude": "The latitude of the location from where the picture was taken from.\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
- "exif-gpslongituderef": "Same as {{msg-mw|exif-gpslatituderef}} but for longitude.\n\n{{Related|Exif-gpslatitude}}",
- "exif-gpslongitude": "The longitude of the location from where the picture was taken from.\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
+ "exif-gpslatituderef": "{{exif-qqq}}\n\nIn older versions of mediawiki this referred to if the latitude was North or South. This is no longer used in modern versions of mediawiki except for when using a foreign image repository that is using an older version of mediawiki since the information is now contained in {{msg-mw|exif-gpslatitude}}.\n\n{{Related|Exif-gpslatitude}}",
+ "exif-gpslatitude": "{{exif-qqq}}\n\nThe latitude of the location from where the picture was taken from.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
+ "exif-gpslongituderef": "{{exif-qqq}}\n\nSame as {{msg-mw|exif-gpslatituderef}} but for longitude.\n\n{{Related|Exif-gpslatitude}}",
+ "exif-gpslongitude": "{{exif-qqq}}\n\nThe longitude of the location from where the picture was taken from.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
"exif-gpsaltituderef": "No longer used except for when using foreign image repository with old version of mediawiki. 0 for above sea level, 1 for below sea level.",
"exif-gpsaltitude": "Altitude in meters that the image was taken at.",
"exif-gpstimestamp": "Time (does not include date) that GPS measurement was taken, in UTC. Since often this is at the same time as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
"exif-gpssatellites": "Label for EXIF information. Indicates the GPS satellites used for measurements.",
- "exif-gpsstatus": "See also:\n* {{msg-mw|Exif-gpsstatus-a}}\n* {{msg-mw|Exif-gpsstatus-v}}",
- "exif-gpsmeasuremode": "Is the measurement 2D (latitude and longitude) or 3D (latitude, longitude, and altitude).\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode-2}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
- "exif-gpsdop": "How accurate the GPS information is. See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
- "exif-gpsspeedref": "{{Related|Exif-gpsspeed}}",
- "exif-gpsspeed": "{{Related|Exif-gpsspeed}}",
- "exif-gpstrackref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
- "exif-gpstrack": "See also:\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
- "exif-gpsimgdirectionref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
- "exif-gpsimgdirection": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+ "exif-gpsstatus": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsstatus-a}}\n* {{msg-mw|Exif-gpsstatus-v}}",
+ "exif-gpsmeasuremode": "{{exif-qqq}}\n\nThis tag indicates whether the measurement 2D (latitude and longitude) or 3D (latitude, longitude, and altitude).\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode-2}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
+ "exif-gpsdop": "{{exif-qqq}}\n\nHow accurate the GPS information is. See [[wikipedia:Dilution of precision (GPS)]].\n\n{{Related|Exif-gpsdop}}",
+ "exif-gpsspeedref": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
+ "exif-gpsspeed": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
+ "exif-gpstrackref": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+ "exif-gpstrack": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+ "exif-gpsimgdirectionref": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+ "exif-gpsimgdirection": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
"exif-gpsmapdatum": "Label for EXIF information. Indicates the geodetic survey data used by the GPS receiver.",
- "exif-gpsdestlatituderef": "{{Related|Exif-gpslatitude}}",
- "exif-gpsdestlatitude": "The latitude of the location shown in the picture, if it is different from latitude of the camera location. See {{msg-mw|exif-gpslatitude}}.\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
- "exif-gpsdestlongituderef": "{{Related|Exif-gpslatitude}}",
- "exif-gpsdestlongitude": "The longitude of the location shown in the picture, if it is different from longitude of the camera location. See {{msg-mw|exif-gpslongitude}}.\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
- "exif-gpsdestbearingref": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}",
- "exif-gpsdestbearing": "See also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
- "exif-gpsdestdistanceref": "I think \"reference\" stands for \"unit\". See {{msg-mw|Exif-gpsspeedref}}\n{{Related|Exif-gpsdestdistance}}",
- "exif-gpsdestdistance": "{{Related|Exif-gpsdestdistance}}",
+ "exif-gpsdestlatituderef": "{{exif-qqq}}\n{{Related|Exif-gpslatitude}}",
+ "exif-gpsdestlatitude": "{{exif-qqq}}\n\nThe latitude of the location shown in the picture, if it is different from latitude of the camera location. See {{msg-mw|exif-gpslatitude}}.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Latitude}}",
+ "exif-gpsdestlongituderef": "{{exif-qqq}}\n{{Related|Exif-gpslatitude}}",
+ "exif-gpsdestlongitude": "{{exif-qqq}}\n\nThe longitude of the location shown in the picture, if it is different from longitude of the camera location. See {{msg-mw|exif-gpslongitude}}.\n\n{{Related|Exif-gpslatitude}}\n{{Identical|Longitude}}",
+ "exif-gpsdestbearingref": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearing}}",
+ "exif-gpsdestbearing": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpstrack}}\n* {{msg-mw|Exif-gpstrackref}}\n* {{msg-mw|Exif-gpsimgdirection}}\n* {{msg-mw|Exif-gpsimgdirectionref}}\n* {{msg-mw|Exif-gpsdestbearingref}}",
+ "exif-gpsdestdistanceref": "{{exif-qqq}}\n\nIndicates the unit used to express the distance to the destination point. Values are typically \"K\", \"M\" or \"N\", standing for kilometers, miles and nautical miles, respectively. See also {{msg-mw|Exif-gpsspeedref}}.\n\n{{Related|Exif-gpsdestdistance}}",
+ "exif-gpsdestdistance": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
"exif-gpsprocessingmethod": "Label for EXIF information. A character string recording the name of the method used for location finding.",
"exif-gpsareainformation": "Label for EXIF information. Contains a character string recording the name of the GPS area.",
- "exif-gpsdatestamp": "Date (does not generally include time unless recorded in XMP) that GPS measurement was taken, in UTC. Since often this is at the same date as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
+ "exif-gpsdatestamp": "{{exif-qqq}}\n\nDate (does not generally include time unless recorded in XMP) that GPS measurement was taken, in UTC. Since often this is at the same date as photo was taken, this is sometimes more reliable than {{msg-mw|exif-datetimeoriginal}}.",
"exif-gpsdifferential": "Label for EXIF information. Indicates whether differential correction is applied to the GPS receiver.",
"exif-coordinate-format": "{{optional}}\nFor formatting GPS latitude coordinates. Parameters:\n* $1 - degrees\n* $2 - minutes\n* $3 - seconds (up to two decimal places)\n* $4 - direction (N, S, W, or E)\n* $5 - (Unused) coordinate as a single positive or negative real number",
"exif-jpegfilecomment": "This is not a true exif tag, but the contents of the JPEG COM segment. This often contains a file source, but can potentially contain any comment about the file. This is similar to {{msg-mw|exif-usercomment}}, {{msg-mw|exif-pngfilecomment}}, and {{msg-mw|exif-giffilecomment}}.",
- "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.\n{{Identical|Keyword}}",
+ "exif-keywords": "{{exif-qqq}}\n\nList of keywords for the photograph (or other media). This can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.\n\n{{Identical|Keyword}}",
"exif-worldregioncreated": "The world region (generally that means continent, but could also include 'World' as a whole) where the media was created.",
- "exif-countrycreated": "Country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
+ "exif-countrycreated": "{{exif-qqq}}\n\nCountry that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
"exif-countrycodecreated": "ISO Code for the country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
"exif-provinceorstatecreated": "Province, state, territory, or other secondary political division (bigger than a city, smaller then a country) where that the picture was taken in. Note this is where it was taken, not what province/state is depicted in the picture.",
"exif-citycreated": "City that the picture was taken in. Note this is where it was taken, not what city is depicted in the picture. This is generally only used if different from the city depicted in photo.",
"exif-provinceorstatedest": "Province, state, territory, or other secondary political division shown.",
"exif-citydest": "City shown",
"exif-sublocationdest": "Sub-location of city shown. This could be an address, a street, an area of town, etc.",
- "exif-objectname": "This is a short name for the image or other media. (As compared to {{msg-mw|exif-imagedescription}} which is a long description of the image).\n\nThis is sometimes an ID number used to identify the photo, or a (short) title of the photo.\n\nThis property is extracted based on XMP's dc:title property ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ), PNG's title keyword ( http://www.w3.org/TR/PNG/#11keywords ), or IPTC-iim 2:05 Object name property ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).",
+ "exif-objectname": "{{exif-qqq}}\n\nThis is a short name for the image or other media. (As compared to {{msg-mw|exif-imagedescription}} which is a long description of the image).\n\nThis is sometimes an ID number used to identify the photo, or a (short) title of the photo.\n\nThis property is extracted based on XMP's [http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf dc:title property], PNG's [http://www.w3.org/TR/PNG/#11keywords title keyword], or IPTC-iim 2:05 [http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf Object name property].",
"exif-specialinstructions": "Special instructions for how to use the image/media. This might include embargo notices, or other warnings.\n\nThis is IPTC-iim property 2:40. See http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf for details.",
- "exif-headline": "A short version of the image caption. The IPTC4XMP standard is clear that \"this is not the same thing as title [ {{msg-mw|exif-objectname}} ]\".\n\nThis is extracted from XMP's photoshop:headline ( http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf ) and IPTC-iim: 2:105 Headline tag ( http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf ).\n{{Identical|Headline}}",
+ "exif-headline": "{{exif-qqq}}\n\nA short version of the image caption. The IPTC4XMP standard is clear that \"this is not the same thing as title [ {{msg-mw|exif-objectname}} ]\".\n\nThis is extracted from [http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf XMP's photoshop:headline] and [http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf IPTC-iim: 2:105 Headline tag].\n\n{{Identical|Headline}}",
"exif-credit": "Provider/credit.\n\nWho gave us the image. This might be different from the creator of the image. This is IPTC-iim property 2:110",
- "exif-source": "See IPTC-iim standard 2:115 - http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf.\n\nThis is who originally owned the image (a person, stock photo agency, etc). This does not refer to the image this image is based on.\n{{Identical|Source}}",
+ "exif-source": "{{exif-qqq}}\n\nSee [http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf IPTC-iim standard 2:115].\n\nThis is who originally owned the image (a person, stock photo agency, etc). This does not refer to the image this image is based on.\n\n{{Identical|Source}}",
"exif-editstatus": "Editorial status of image. This is more intended for use with people making news papers. This denotes whether the image is on the main page, is part of a correction, etc. See 2:07 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
- "exif-urgency": "Urgency. How urgent this image is. 1 is very urgent, 5 is normal, 8 is very low priority.\n{{Related|Exif-urgency}}",
+ "exif-urgency": "{{exif-qqq}}\n\nUrgency. How urgent this image is. 1 is very urgent, 5 is normal, 8 is very low priority.\n\n{{Related|Exif-urgency}}",
"exif-fixtureidentifier": "Fixture name. Identifies frequently occurring object data, for example a regular column in a news paper.",
"exif-locationdest": "Full printable name of location.",
"exif-locationdestcode": "Code of location depicted. Typically this is an ISO country code, but the IPTC-iim standard also defines other codes like XSP for outer space. See appendix D (and tag 2:100) of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
"exif-objectcycle": "Time of day that media is intended for. Either morning only, evening only, or all day. Typically only used for news related things that might only be broadcast at a specific time of day.\n\nSee also:\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-p}}\n* {{msg-mw|Exif-objectcycle-b}}",
"exif-contact": "Contact information of the person responsible for the image.",
"exif-writer": "The person who wrote the caption of the image. See Description Writer on page 18 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf\n{{Identical|Writer}}",
- "exif-languagecode": "Language of image/media.\n\nThis is taken from IPTC-iim 2:135 and XMP's dc:language.\n{{Identical|Language}}",
+ "exif-languagecode": "{{exif-qqq}}\n\nLanguage of image/media. This is taken from IPTC-iim 2:135 and XMP's dc:language.\n\n{{Identical|Language}}",
"exif-iimversion": "IIM version number. Version of information interchange 2:xx records. 4 is current version. 2 is often seen as well. This is the value stored 2:00 field (Note, iptc-iim also stores a model version in 1:00. This version field displays the 2:00 record only)",
- "exif-iimcategory": "Primary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.\n{{Identical|Category}}",
+ "exif-iimcategory": "{{exif-qqq}}\n\nPrimary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.\n\n{{Identical|Category}}",
"exif-iimsupplementalcategory": "Supplemental categories. Like {{msg-mw|exif-iimcategory}} but for categories beyond the main one.",
- "exif-datetimeexpires": "Date after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.",
- "exif-datetimereleased": "Earliest date the image (media) can be used.\n\nSee 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
+ "exif-datetimeexpires": "{{exif-qqq}}\n\nDate after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.",
+ "exif-datetimereleased": "{{exif-qqq}}\n\nEarliest date the image (media) can be used.\n\nSee 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
"exif-originaltransmissionref": "This is basically a job ID. This could help an individual keep track of for what reason the image was created.\n\nSee Job Id on page 19 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf",
- "exif-identifier": "A formal identifier for the image. Often this is a URL.\n{{Identical|Identifier}}",
+ "exif-identifier": "{{exif-qqq}}\nA formal identifier for the image. Often this is a URL.\n{{Identical|Identifier}}",
"exif-lens": "Description of lens used. This is taken from aux:Lens XMP property. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
"exif-serialnumber": "Serial number of camera. See aux:SerialNumber in http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
"exif-cameraownername": "Who owns the camera.",
- "exif-label": "Label given to the image for organizational purposes. This is very similar to {{msg-mw|exif-keywords}}. Label is more used by a person to organize their media, where keywords are used to describe the photo contents itself.\n\nThis property can come from xmp:Label in XMP ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ) or the label textual chunk in PNG.\n{{Identical|Label}}",
- "exif-datetimemetadata": "Date metadata was last modified. Typically this refers to XMP metadata.",
+ "exif-label": "{{exif-qqq}}\n\nLabel given to the image for organizational purposes. This is very similar to {{msg-mw|exif-keywords}}. Label is more used by a person to organize their media, where keywords are used to describe the photo contents itself.\n\nThis property can come from xmp:Label in XMP ( http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf ) or the label textual chunk in PNG.\n\n{{Identical|Label}}",
+ "exif-datetimemetadata": "{{exif-qqq}}\n\nDate metadata was last modified. Typically this refers to XMP metadata.",
"exif-nickname": "Short informal name of image. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
"exif-rating": "This is a rating for how good the image is. The range is between 1 to 5 (5 highest), with an additional option of \"reject\".",
"exif-rightscertificate": "URL of Rights management certificate. This comes from XMPRights:Certificate property. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart1.pdf",
"exif-copyrighted": "Copyright status. This is a true or false field showing either Copyrighted or Public Domain. It should be noted that Copyrighted includes freely-licensed works.",
- "exif-copyrightowner": "Copyright owner. Can have more than one person or entity.",
+ "exif-copyrightowner": "{{exif-qqq}}\n\nCopyright owner. Can have more than one person or entity.",
"exif-usageterms": "Terms under which you're allowed to use the image/media.",
- "exif-webstatement": "URL detailing the copyright status of the image, and how you're allowed to use the image. Often this is a link to a creative commons license, however the creative commons people recommend using a page that generally contains specific information about the image, and recommend using {{msg-mw|exif-licenseurl}} for linking to the license. See http://wiki.creativecommons.org/XMP",
+ "exif-webstatement": "{{exif-qqq}}\n\nURL detailing the copyright status of the image, and how you're allowed to use the image. Often this is a link to a creative commons license, however the creative commons people recommend using a page that generally contains specific information about the image, and recommend using {{msg-mw|exif-licenseurl}} for linking to the license. See http://wiki.creativecommons.org/XMP",
"exif-originaldocumentid": "A unique ID of the original document (image) that this document (image) is based on.",
- "exif-licenseurl": "URL for copyright license. This is almost always a creative commons license since this information comes from the creative commons namespace of XMP (but could be a link to any type of license). See also {{msg-mw|exif-webstatement}}",
+ "exif-licenseurl": "{{exif-qqq}}\n\nURL for copyright license. This is almost always a creative commons license since this information comes from the creative commons namespace of XMP (but could be a link to any type of license). See also {{msg-mw|exif-webstatement}}",
"exif-morepermissionsurl": "A URL where you can \"buy\" (or otherwise negotiate) to get more rights for the image.",
"exif-attributionurl": "A URL that you're supposed to use when re-using the image.",
"exif-preferredattributionname": "The preferred name to give credit to when re-using this image.",
- "exif-pngfilecomment": "See also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
- "exif-disclaimer": "Disclaimer for the image.\n{{Identical|Disclaimer}}",
+ "exif-pngfilecomment": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
+ "exif-disclaimer": "{{exif-qqq}}\n\nDisclaimer for the image.\n\n{{Identical|Disclaimer}}",
"exif-contentwarning": "Content warning for the image. For example if the image/media contains violent, sexual or otherwise offensive content.\n\nThis comes from the png warning textual chunk. See http://www.w3.org/TR/PNG/#11keywords",
- "exif-giffilecomment": "See also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
+ "exif-giffilecomment": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-pngfilecomment}}\n* {{msg-mw|Exif-giffilecomment}}",
"exif-intellectualgenre": "The \"intellectual genre\" of the image/media item. This typically means the type of item it is, ignoring the actual content of the item. See http://cv.iptc.org/newscodes/genre/ for some examples of the types of values this field might have.",
"exif-subjectnewscode": "A (or multiple) codes describing the content of the image/media. The code is an 8 digit number representing some sort of category. The code is hierarchical , with the first two digits being a broad category (this broad category is shown to the user. See {{msg-mw|exif-subjectnewscode-value}} for how the value this field labels is shown to user). See http://cv.iptc.org/newscodes/subjectcode for the full list of codes.",
"exif-scenecode": "IPTC (numeric) scene code. Contains information on what type of scene it is (like panoramic scene, close-up, etc). See http://cv.iptc.org/newscodes/scene/",
"exif-software-value": "{{notranslate}}\nParameters:\n* $1 - software name",
"exif-software-version-value": "{{notranslate}}\nParameters:\n* $1 - software name\n* $2 - version number",
"exif-contact-value": "{{optional}}\nParameters:\n* $1 - email\n* $2 - URL of website\n* $3 - street address\n* $4 - city\n* $5 - region\n* $6 - postal code\n* $7 - country\n* $8 - telephone number\nNote, not all fields are guaranteed to be present, some may be empty strings.",
- "exif-subjectnewscode-value": "{{Optional}}\nParameters:\n* $1 - numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )\n* $2 - one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|Exif-iimcategory-spo}} for $2.",
- "exif-compression-1": "{{Related|Exif-compression}}",
+ "exif-subjectnewscode-value": "{{Optional}}\n\n{{exif-qqq}}\n\nParameters:\n* $1 - numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )\n* $2 - one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|Exif-iimcategory-spo}} for $2.",
+ "exif-compression-1": "{{exif-qqq}}\n{{Related|Exif-compression}}",
"exif-compression-2": "{{Related|Exif-compression}}",
"exif-compression-3": "{{Related|Exif-compression}}",
"exif-compression-4": "{{Related|Exif-compression}}",
"exif-photometricinterpretation-10": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
"exif-photometricinterpretation-32803": "Used mostly by DNG images. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
"exif-photometricinterpretation-34892": "Used mostly by DNG images. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
- "exif-unknowndate": "Used if the Exif date and time is \"<code>0000:00:00 00:00:00</code>\".\n\nRelated Exif attributes:\n* {{msg-mw|Exif-datetime}}\n* {{msg-mw|Exif-datetimeoriginal}}\n* {{msg-mw|Exif-datetimedigitized}}\n* {{msg-mw|Exif-datetimereleased}}\n* {{msg-mw|Exif-datetimeexpires}}\n* {{msg-mw|Exif-gpsdatestamp}}\n* {{msg-mw|Exif-dc-date}}\n* {{msg-mw|Exif-datetimemetadata}}",
+ "exif-unknowndate": "{{exif-qqq}}\n\nUsed if the Exif date and time is \"<code>0000:00:00 00:00:00</code>\".\n\nRelated Exif attributes:\n* {{msg-mw|Exif-datetime}}\n* {{msg-mw|Exif-datetimeoriginal}}\n* {{msg-mw|Exif-datetimedigitized}}\n* {{msg-mw|Exif-datetimereleased}}\n* {{msg-mw|Exif-datetimeexpires}}\n* {{msg-mw|Exif-gpsdatestamp}}\n* {{msg-mw|Exif-dc-date}}\n* {{msg-mw|Exif-datetimemetadata}}",
"exif-orientation-1": "0th row: top; 0th column: left\n{{Related|Exif-orientation}}\n{{Identical|Normal}}",
- "exif-orientation-2": "0th row: top; 0th column: right\n{{Related|Exif-orientation}}",
- "exif-orientation-3": "0th row: bottom; 0th column: right\n{{Related|Exif-orientation}}",
- "exif-orientation-4": "0th row: bottom; 0th column: left\n{{Related|Exif-orientation}}",
+ "exif-orientation-2": "{{exif-qqq}}\n\n0th row: top; 0th column: right\n\n{{Related|Exif-orientation}}",
+ "exif-orientation-3": "{{exif-qqq}}\n\n0th row: bottom; 0th column: right\n\n{{Related|Exif-orientation}}",
+ "exif-orientation-4": "{{exif-qqq}}\n\n0th row: bottom; 0th column: left\n\n{{Related|Exif-orientation}}",
"exif-orientation-5": "0th row: left; 0th column: top\n\nCCW is an abbreviation for counter-clockwise\n{{Related|Exif-orientation}}",
- "exif-orientation-6": "0th row: right; 0th column: top\n\nCCW is an abbreviation for counter-clockwise.\n{{Related|Exif-orientation}}",
+ "exif-orientation-6": "{{exif-qqq}}\n\n0th row: right; 0th column: top\n\nCCW is an abbreviation for counter-clockwise.\n\n{{Related|Exif-orientation}}",
"exif-orientation-7": "0th row: right; 0th column: bottom\n\nCW is an abbreviation for clockwise\n{{Related|Exif-orientation}}",
- "exif-orientation-8": "0th row: left; 0th column: bottom\n\nCW is an abbreviation for clockwise.\n{{Related|Exif-orientation}}",
- "exif-planarconfiguration-1": "See also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
- "exif-planarconfiguration-2": "See also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
+ "exif-orientation-8": "{{exif-qqq}}\n\n0th row: left; 0th column: bottom\n\nCW is an abbreviation for clockwise.\n\n{{Related|Exif-orientation}}",
+ "exif-planarconfiguration-1": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
+ "exif-planarconfiguration-2": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-planarconfiguration}}\n* {{msg-mw|Exif-planarconfiguration-1}}\n* {{msg-mw|Exif-planarconfiguration-2}}",
"exif-xyresolution-i": "{{Optional}}\nUsed to format {{msg-mw|Exif-xresolution}} and {{msg-mw|Exif-yresolution}} if the unit is dots per inch.\n\nParameters:\n* $1 - the number of dots/in",
"exif-xyresolution-c": "{{Optional}}\nUsed to format {{msg-mw|Exif-xresolution}} and {{msg-mw|Exif-yresolution}} if the unit is dots per centimeter.\n\nParameters:\n* $1 - the number of dots/cm",
- "exif-colorspace-1": "{{Optional}}\nIf it uses the standard sRGB colour space.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
- "exif-colorspace-65535": "The photograph is not colour calibrated.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
- "exif-componentsconfiguration-0": "{{Related|Exif-componentsconfiguration}}",
- "exif-componentsconfiguration-1": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
- "exif-componentsconfiguration-2": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
- "exif-componentsconfiguration-3": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
- "exif-componentsconfiguration-4": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
- "exif-componentsconfiguration-5": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
- "exif-componentsconfiguration-6": "{{optional}}\n{{Related|Exif-componentsconfiguration}}",
- "exif-exposureprogram-0": "{{Related|Exif-exposureprogram}}",
+ "exif-colorspace-1": "{{Optional}}\n{{exif-qqq}}\n\nThis value indicates that the image uses the standard sRGB colour space.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
+ "exif-colorspace-65535": "{{exif-qqq}}\n\nThis value indicates that the photograph is not colour-calibrated.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
+ "exif-componentsconfiguration-0": "{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+ "exif-componentsconfiguration-1": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+ "exif-componentsconfiguration-2": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+ "exif-componentsconfiguration-3": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+ "exif-componentsconfiguration-4": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+ "exif-componentsconfiguration-5": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+ "exif-componentsconfiguration-6": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-componentsconfiguration}}",
+ "exif-exposureprogram-0": "{{exif-qqq}}\n{{Related|Exif-exposureprogram}}",
"exif-exposureprogram-1": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}\n{{Identical|Manual}}",
- "exif-exposureprogram-2": "One of the exposure program types in the table of metadata on image description pages.\n{{Related|Exif-exposureprogram}}",
- "exif-exposureprogram-3": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Aperture_priority|aperture priority]].\n{{Related|Exif-exposureprogram}}",
- "exif-exposureprogram-4": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Shutter_priority|shutter priority]].\n{{Related|Exif-exposureprogram}}",
+ "exif-exposureprogram-2": "{{exif-qqq}}\n\nOne of the exposure program types in the table of metadata on image description pages.\n\n{{Related|Exif-exposureprogram}}",
+ "exif-exposureprogram-3": "{{exif-qqq}}\n\nOne of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Aperture_priority|aperture priority]].\n\n{{Related|Exif-exposureprogram}}",
+ "exif-exposureprogram-4": "{{exif-qqq}}\n\nOne of the exposure program types in the table of metadata on image description pages. See the Wikipedia article for a definition of the term [[w:Shutter_priority|shutter priority]].\n\n{{Related|Exif-exposureprogram}}",
"exif-exposureprogram-5": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
"exif-exposureprogram-6": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
"exif-exposureprogram-7": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
"exif-subjectdistance-value": "Parameters:\n* $1 - a distance measured in meters. The value can, and usually does, include decimal places.",
"exif-meteringmode-0": "{{Related|Exif-meteringmode}}\n{{Identical|Unknown}}",
"exif-meteringmode-1": "{{Related|Exif-meteringmode}}\n{{Identical|Average}}",
- "exif-meteringmode-2": "{{Related|Exif-meteringmode}}",
- "exif-meteringmode-3": "{{Related|Exif-meteringmode}}",
- "exif-meteringmode-4": "{{Related|Exif-meteringmode}}",
- "exif-meteringmode-5": "{{Related|Exif-meteringmode}}\n{{Identical|Pattern}}",
- "exif-meteringmode-6": "{{Related|Exif-meteringmode}}",
+ "exif-meteringmode-2": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
+ "exif-meteringmode-3": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
+ "exif-meteringmode-4": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
+ "exif-meteringmode-5": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}\n{{Identical|Pattern}}",
+ "exif-meteringmode-6": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
"exif-meteringmode-255": "{{Identical|Other}}",
"exif-lightsource-0": "{{Identical|Unknown}}\n{{Related|Exif-lightsource}}",
- "exif-lightsource-1": "{{Related|Exif-lightsource}}",
- "exif-lightsource-2": "{{Related|Exif-lightsource}}",
- "exif-lightsource-3": "{{Related|Exif-lightsource}}",
- "exif-lightsource-4": "{{Identical|Flash}}\n{{Related|Exif-lightsource}}",
- "exif-lightsource-9": "{{Related|Exif-lightsource}}",
- "exif-lightsource-10": "{{Related|Exif-lightsource}}",
- "exif-lightsource-11": "{{Related|Exif-lightsource}}",
- "exif-lightsource-12": "{{Related|Exif-lightsource}}",
- "exif-lightsource-13": "{{Related|Exif-lightsource}}",
- "exif-lightsource-14": "{{Related|Exif-lightsource}}",
- "exif-lightsource-15": "{{Related|Exif-lightsource}}",
- "exif-lightsource-17": "{{Related|Exif-lightsource}}",
- "exif-lightsource-18": "{{Related|Exif-lightsource}}",
- "exif-lightsource-19": "{{Related|Exif-lightsource}}",
- "exif-lightsource-20": "{{optional}}\n{{Related|Exif-lightsource}}",
- "exif-lightsource-21": "{{optional}}\n{{Related|Exif-lightsource}}",
- "exif-lightsource-22": "{{optional}}\n{{Related|Exif-lightsource}}",
- "exif-lightsource-23": "{{optional}}\n{{Related|Exif-lightsource}}",
- "exif-lightsource-24": "{{Related|Exif-lightsource}}",
- "exif-lightsource-255": "{{Related|Exif-lightsource}}",
+ "exif-lightsource-1": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-2": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-3": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-4": "{{exif-qqq}}\n{{Identical|Flash}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-9": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-10": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-11": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-12": "{{exif-qqq}}\n\nThe \"D\" stands for \"daylight\", as defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-13": "{{exif-qqq}}\n\nThe \"N\" symbol is defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-14": "{{exif-qqq}}\n\nThe \"W\" stands for \"white\", as defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-15": "{{exif-qqq}}\n\nThe \"WW\" stands for \"warm white\", as defined in the JIS Z 9112:2012 standard.\n\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-17": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-18": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-19": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-20": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-21": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-22": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-23": "{{optional}}\n{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-24": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
+ "exif-lightsource-255": "{{exif-qqq}}\n{{Related|Exif-lightsource}}",
"exif-flash-fired-0": "{{Related|Exif-flash}}",
"exif-flash-fired-1": "{{Related|Exif-flash}}",
"exif-flash-return-0": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\n\"Strobe\" and \"flash\" mean the same here.\n{{Related|Exif-flash}}",
"exif-flash-mode-3": "{{Related|Exif-flash}}",
"exif-flash-function-1": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-flash}}",
"exif-flash-redeye-1": "{{Related|Exif-flash}}",
- "exif-focalplaneresolutionunit-2": "See also:\n* {{msg-mw|Exif-focalplaneresolutionunit}}",
+ "exif-focalplaneresolutionunit-2": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-focalplaneresolutionunit}}",
"exif-sensingmethod-1": "{{Related|Exif-sensingmethod}}\n{{Identical|Undefined}}",
"exif-sensingmethod-2": "{{Related|Exif-sensingmethod}}",
"exif-sensingmethod-3": "{{Related|Exif-sensingmethod}}",
"exif-sensingmethod-4": "{{Related|Exif-sensingmethod}}",
"exif-sensingmethod-5": "''Color sequential'' means, that the three base colors are measured one after another (i.e. the sensor is first measuring red, than green, than blue).\n{{Related|Exif-sensingmethod}}",
- "exif-sensingmethod-7": "{{Related|Exif-sensingmethod}}",
+ "exif-sensingmethod-7": "{{exif-qqq}}\n{{Related|Exif-sensingmethod}}",
"exif-sensingmethod-8": "''Color sequential'' means, that the three base colors are measured one after another (i.e. the sensor is first measuring red, than green, than blue).\n{{Related|Exif-sensingmethod}}",
"exif-filesource-3": "{{optional}}",
"exif-scenetype-1": "See also:\n* {{msg-mw|Exif-scenetype}}\n* {{msg-mw|Exif-scenetype-1}}",
- "exif-customrendered-0": "See also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
- "exif-customrendered-1": "See also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
- "exif-exposuremode-0": "{{Related|Exif-exposuremode}}",
- "exif-exposuremode-1": "{{Related|Exif-exposuremode}}",
- "exif-exposuremode-2": "A type of exposure mode shown as part of the metadata on image description pages. The Wikipedia article on [[w:Bracketing#Exposure_bracketing|bracketing]] says that 'auto bracket' is a camera exposure setting which automatically takes a series of pictures at slightly different light exposures.\n{{Related|Exif-exposuremode}}",
- "exif-whitebalance-0": "See also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
- "exif-whitebalance-1": "See also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
+ "exif-customrendered-0": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
+ "exif-customrendered-1": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-customrendered}}\n* {{msg-mw|Exif-customrendered-0}}\n* {{msg-mw|Exif-customrendered-1}}",
+ "exif-exposuremode-0": "{{exif-qqq}}\n{{Related|Exif-exposuremode}}",
+ "exif-exposuremode-1": "{{exif-qqq}}\n{{Related|Exif-exposuremode}}",
+ "exif-exposuremode-2": "{{exif-qqq}}\n\nA type of exposure mode shown as part of the metadata on image description pages. The Wikipedia article on [[w:Bracketing#Exposure_bracketing|bracketing]] says that 'auto bracket' is a camera exposure setting which automatically takes a series of pictures at slightly different light exposures.\n\n{{Related|Exif-exposuremode}}",
+ "exif-whitebalance-0": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
+ "exif-whitebalance-1": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-whitebalance}}\n* {{msg-mw|Exif-whitebalance-0}}\n* {{msg-mw|Exif-whitebalance-1}}",
"exif-scenecapturetype-0": "{{Related|Exif-scenecapturetype}}\n{{Identical|Standard}}",
- "exif-scenecapturetype-1": "{{Related|Exif-scenecapturetype}}",
- "exif-scenecapturetype-2": "{{Related|Exif-scenecapturetype}}",
- "exif-scenecapturetype-3": "{{Related|Exif-scenecapturetype}}",
+ "exif-scenecapturetype-1": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
+ "exif-scenecapturetype-2": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
+ "exif-scenecapturetype-3": "{{exif-qqq}}\n{{Related|Exif-scenecapturetype}}",
"exif-gaincontrol-0": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}\n{{Identical|None}}",
- "exif-gaincontrol-1": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
- "exif-gaincontrol-2": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
- "exif-gaincontrol-3": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
- "exif-gaincontrol-4": "Gain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n{{Related|Exif-gaincontrol}}",
+ "exif-gaincontrol-1": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
+ "exif-gaincontrol-2": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
+ "exif-gaincontrol-3": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
+ "exif-gaincontrol-4": "{{exif-qqq}}\n\nGain amplifies the signal off of the image sensor. Gain turns the brightness level up or down.\n\n{{Related|Exif-gaincontrol}}",
"exif-contrast-0": "{{Related|Exif-contrast}}\n{{Identical|Normal}}",
- "exif-contrast-1": "{{Related|Exif-contrast}}\n{{Identical|Soft}}",
- "exif-contrast-2": "{{Related|Exif-contrast}}\n{{Identical|Hard}}",
+ "exif-contrast-1": "{{exif-qqq}}\n{{Related|Exif-contrast}}\n{{Identical|Soft}}",
+ "exif-contrast-2": "{{exif-qqq}}\n{{Related|Exif-contrast}}\n{{Identical|Hard}}",
"exif-saturation-0": "{{Related|Exif-saturation}}\n{{Identical|Normal}}",
- "exif-saturation-1": "{{Related|Exif-saturation}}",
- "exif-saturation-2": "Color saturation in picture EXIF data\n{{Related|Exif-saturation}}",
+ "exif-saturation-1": "{{exif-qqq}}\n{{Related|Exif-saturation}}",
+ "exif-saturation-2": "{{exif-qqq}}\n\nColor saturation in picture EXIF data\n\n{{Related|Exif-saturation}}",
"exif-sharpness-0": "{{Related|Exif-sharpness}}\n{{Identical|Normal}}",
- "exif-sharpness-1": "{{Related|Exif-sharpness}}\n{{Identical|Soft}}",
- "exif-sharpness-2": "{{Related|Exif-sharpness}}\n{{Identical|Hard}}",
+ "exif-sharpness-1": "{{exif-qqq}}\n{{Related|Exif-sharpness}}\n{{Identical|Soft}}",
+ "exif-sharpness-2": "{{exif-qqq}}\n{{Related|Exif-sharpness}}\n{{Identical|Hard}}",
"exif-subjectdistancerange-0": "{{Related|Exif-subjectdistancerange}}\n{{Identical|Unknown}}",
- "exif-subjectdistancerange-1": "Macro view is close-up photography. See [[w:Macro_photography|Wikipedia]].\n{{Identical|Macro}}\n{{Related|Exif-subjectdistancerange}}",
- "exif-subjectdistancerange-2": "{{Related|Exif-subjectdistancerange}}",
- "exif-subjectdistancerange-3": "{{Related|Exif-subjectdistancerange}}",
- "exif-gpslatitude-n": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
- "exif-gpslatitude-s": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
- "exif-gpslongitude-e": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
- "exif-gpslongitude-w": "Very rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n{{Related|Exif-gpslatitude}}",
+ "exif-subjectdistancerange-1": "{{exif-qqq}}\n\nMacro view is close-up photography. See [[w:Macro photography|Wikipedia]].\n\n{{Identical|Macro}}\n{{Related|Exif-subjectdistancerange}}",
+ "exif-subjectdistancerange-2": "{{exif-qqq}}\n{{Related|Exif-subjectdistancerange}}",
+ "exif-subjectdistancerange-3": "{{exif-qqq}}\n{{Related|Exif-subjectdistancerange}}",
+ "exif-gpslatitude-n": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
+ "exif-gpslatitude-s": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
+ "exif-gpslongitude-e": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
+ "exif-gpslongitude-w": "{{exif-qqq}}\n\nVery rarely used. Only used when using an old version of Mediawiki as a foreign image repo.\n\n{{Related|Exif-gpslatitude}}",
"exif-gpsaltitude-above-sealevel": "Used as GPS Altitude in Exif data. Parameters:\n* $1 - altitude above sea level (in meters)\nSee also:\n* {{msg-mw|Exif-gpsaltitude-below-sealevel}}",
"exif-gpsaltitude-below-sealevel": "Used as GPS Altitude in Exif data. Parameters:\n* $1 - altitude below sea level (in meters)\nSee also:\n* {{msg-mw|Exif-gpsaltitude-above-sealevel}}",
- "exif-gpsstatus-a": "See also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-v}}",
- "exif-gpsstatus-v": "See also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-a}}",
- "exif-gpsmeasuremode-2": "Only latitude and longitude recorded, no altitude.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
- "exif-gpsmeasuremode-3": "Latitude, longitude, and altitude recorded.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-2}}",
- "exif-gpsspeed-k": "{{Related|Exif-gpsspeed}}",
- "exif-gpsspeed-m": "{{Related|Exif-gpsspeed}}",
- "exif-gpsspeed-n": "Knots: ''Knot'' is a unit of speed on water used for ships, etc., equal to one nautical mile per hour.\n{{Related|Exif-gpsspeed}}",
- "exif-gpsdestdistance-k": "{{Related|Exif-gpsdestdistance}}",
- "exif-gpsdestdistance-m": "{{Related|Exif-gpsdestdistance}}",
- "exif-gpsdestdistance-n": "{{Related|Exif-gpsdestdistance}}",
+ "exif-gpsstatus-a": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-v}}",
+ "exif-gpsstatus-v": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsstatus}}\n* {{msg-mw|Exif-gpsstatus-a}}",
+ "exif-gpsmeasuremode-2": "{{exif-qqq}}\n\nOnly latitude and longitude recorded, no altitude.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-3}}",
+ "exif-gpsmeasuremode-3": "{{exif-qqq}}\n\nLatitude, longitude, and altitude recorded.\n\nSee also:\n* {{msg-mw|Exif-gpsmeasuremode}}\n* {{msg-mw|Exif-gpsmeasuremode-2}}",
+ "exif-gpsspeed-k": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
+ "exif-gpsspeed-m": "{{exif-qqq}}\n{{Related|Exif-gpsspeed}}",
+ "exif-gpsspeed-n": "{{exif-qqq}}\n\n''Knot'' is a unit of speed on water used for ships, etc., equal to one nautical mile per hour.\n\n{{Related|Exif-gpsspeed}}",
+ "exif-gpsdestdistance-k": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
+ "exif-gpsdestdistance-m": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
+ "exif-gpsdestdistance-n": "{{exif-qqq}}\n{{Related|Exif-gpsdestdistance}}",
"exif-gpsdop-excellent": "Parameters:\n* $1 - the actual HDOP/PDOP value (less than or equal to 2 for excellent). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
"exif-gpsdop-good": "Parameters:\n* $1 - the actual HDOP/PDOP value (2-5 for good). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
"exif-gpsdop-moderate": "Parameters:\n* $1 - the actual HDOP/PDOP value (5-10 for moderate). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}\n{{Identical|Moderate}}",
- "exif-gpsdop-fair": "Parameters:\n* $1 - the actual HDOP/PDOP value (10-20 for fair). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
+ "exif-gpsdop-fair": "{{exif-qqq}}\n\nParameters:\n* $1 - the actual HDOP/PDOP value (10-20 for fair). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n\n{{Related|Exif-gpsdop}}",
"exif-gpsdop-poor": "Parameters:\n* $1 - the actual HDOP/PDOP value (greater than 20 for poor). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)\n{{Related|Exif-gpsdop}}",
"exif-objectcycle-a": "Morning only (a is for AM).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-p}}\n* {{msg-mw|Exif-objectcycle-b}}",
- "exif-objectcycle-p": "Evening only (p is for PM).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-b}}",
+ "exif-objectcycle-p": "{{exif-qqq}}\n\nEvening only (p is for PM).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-b}}",
"exif-objectcycle-b": "Both morning and evening (b is for both).\n\nSee also:\n* {{msg-mw|Exif-objectcycle}}\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-p}}",
- "exif-gpsdirection-t": "See also:\n* {{msg-mw|Exif-gpsdirection-m}}",
- "exif-gpsdirection-m": "See also:\n* {{msg-mw|Exif-gpsdirection-t}}",
- "exif-ycbcrpositioning-1": "If the Chrominance samples are centered with respect to the Luminance samples.\n{{Related|Exif-ycbcrpositioning}}",
+ "exif-gpsdirection-t": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsdirection-m}}",
+ "exif-gpsdirection-m": "{{exif-qqq}}\n\nSee also:\n* {{msg-mw|Exif-gpsdirection-t}}",
+ "exif-ycbcrpositioning-1": "{{exif-qqq}}\n\nThis tag indicates that the Chrominance samples are centered with respect to the Luminance samples.\n\n{{Related|Exif-ycbcrpositioning}}",
"exif-ycbcrpositioning-2": "If the Chrominance samples are on top of to the Luminance samples.\nSee: http://www.awaresystems.be/imaging/tiff/tifftags/ycbcrpositioning.html\n{{Related|Exif-ycbcrpositioning}}",
"exif-dc-contributor": "People who helped make the resource, but are secondary in contribution to the author.\n{{Identical|Contributor}}",
"exif-dc-coverage": "\"The extent or scope of the resource\" see dc:coverage in http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf",
"exif-iimcategory-evn": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
"exif-iimcategory-hth": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
"exif-iimcategory-hum": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
- "exif-iimcategory-lab": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}\n\n\"Labor\" here refers to all news on labor issues; employment; unemployment; work relations; labor disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)",
+ "exif-iimcategory-lab": "{{exif-qqq}}\n\nDisplayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}\n\n\"Labor\" here refers to all news on labor issues; employment; unemployment; work relations; labor disputes; strikes; legislation; unions; job related issues; government policy. (at least, according to Reuters.)",
"exif-iimcategory-lif": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
"exif-iimcategory-pol": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
"exif-iimcategory-rel": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
"exif-iimcategory-spo": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}.\n{{Identical|Sport}}",
"exif-iimcategory-war": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
"exif-iimcategory-wea": "Displayed as part of the iimcategory field if the 3 letter code is recognized, or as part {{msg-mw|exif-subjectnewscode-value}}",
- "exif-urgency-normal": "Parameters:\n* $1 - numeric priority (aka 5 for normal)\n{{Related|Exif-urgency}}",
- "exif-urgency-low": "Parameters:\n* $1 - numeric priority (6-8 for low)\n{{Related|Exif-urgency}}",
+ "exif-urgency-normal": "{{exif-qqq}}\n\nParameters:\n* $1 - numeric priority (aka 5 for normal)\n\n{{Related|Exif-urgency}}",
+ "exif-urgency-low": "{{exif-qqq}}\n\nParameters:\n* $1 - numeric priority (6-8 for low)\n\n{{Related|Exif-urgency}}",
"exif-urgency-high": "Parameters:\n* $1 - numeric priority (1-4 for high)\n{{Related|Exif-urgency}}",
"exif-urgency-other": "Parameters:\n* $1 - numeric priority. Most specs define 0 and 9 to either be reserved or not allowed. However the exiftool documentation defines 0 to be reserved and 9 to be user-defined priority.\n{{Related|Exif-urgency}}",
"namespacesall": "In special page [[Special:WhatLinksHere]]. Drop-down box option for namespace.\n\n{{Identical|All}}",
"confirmemail_body_set": "This is used in a confirmation email sent when a contact email address is set.\n\nSee also [[MediaWiki:Confirmemail body changed]].\n\nParameters:\n* $1 - the IP address of the user that set the email address\n* $2 - the name of the user\n* $3 - a URL to [[Special:ConfirmEmail]]\n* $4 - a time and date (duplicated by $6 and $7)\n* $5 - a URL to [[Special:InvalidateEmail]]\n* $6 - (Optional) a date\n* $7 - (Optional) a time\n{{Related|Confirmemail body}}",
"confirmemail_invalidated": "This is the text of the special page [[Special:InvalidateEmail|InvalidateEmail]] (with the title in {{msg-mw|Invalidateemail}}) where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
"invalidateemail": "This is the '''name of the special page''' where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
- "notificationemail_subject_changed": "Subject of the email sent on the previously registered email address notifying them about the change in the registered email address.",
- "notificationemail_subject_removed": "Subject of the email sent on the previously registered email address notifying them about the removal of the registered email address.",
+ "notificationemail_subject_changed": "Subject of the email sent to the previously registered email address notifying them about the change in the registered email address.",
+ "notificationemail_subject_removed": "Subject of the email sent to the previously registered email address notifying them about the removal of the registered email address.",
"notificationemail_body_changed": "Body of the email sent on the previously registered email address notifying them about the change in the registered email address.",
"notificationemail_body_removed": "Body of the email sent on the previously registered email address notifying them about the removal of the registered email address.",
"scarytranscludedisabled": "Shown when scary transclusion is disabled.",
"ImGelu",
"Wintereu",
"Rsocol",
- "Nemo bis"
+ "Nemo bis",
+ "Turbojet"
]
},
"tog-underline": "Sublinierea legăturilor:",
"tagline": "De la {{SITENAME}}",
"help": "Ajutor",
"search": "Căutare",
+ "search-ignored-headings": " #<!-- nu modificați acest rând --> <pre>\n# Titluri de secțiuni care vor fi ignorate de motorul de căutare.\n# Modificările efectuate aici își vor face efectul de îndată ce pagina care conține titlul de secțiune va fi indexată.\n# Puteți forța reindexarea paginii efectuând o modificare vidă.\n# Sintaxa este următoarea:\n# * Orice rând precedat de caracterul „#” reprezintă un comentariu.\n# * Orice rând nevid reprezintă exact titlu de secțiune de ignorat.\nReferințe\nLegături externe\nVezi și\n #</pre> <!-- nu modificați acest rând -->",
"searchbutton": "Căutare",
"go": "Salt",
"searcharticle": "Du-te",
"passwordreset-emailelement": "Nume de utilizator: \n$1\n\nParolă temporară: \n$2",
"passwordreset-emailsentemail": "Dacă această adresă de e-mail este asociată contului dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
"passwordreset-emailsentusername": "Dacă există o adresă de e-mail asociată acestui nume de utilizator, atunci se va trimite un e-mail de resetare a parolei.",
- "passwordreset-emailsent-capture": "Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.",
- "passwordreset-emailerror-capture": "Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1",
"passwordreset-invalideamil": "Adresă de e-mail nevalidă",
"passwordreset-nodata": "Nu au fost furnizate un nume de utilizator sau o adresă de e-mail",
"changeemail": "Modificare sau înlăturare adresă de e-mail",
"changeemail-header": "Completați acest formular pentru a vă schimba adresa de e-mail. Dacă doriți să înlăturați orice asociere a unei adrese de e-mail cu contul dumneavoastră, lăsați necompletat câmpul pentru introducerea unei noi adrese de e-mail atunci când trimiteți formularul.",
- "changeemail-passwordrequired": "Va trebui să introduceți parola pentru a confirma această schimbare.",
"changeemail-no-info": "Trebuie să fiți autentificat pentru a accesa această pagină direct.",
"changeemail-oldemail": "Adresa de e-mail actuală:",
"changeemail-newemail": "Noua adresă de e-mail:",
"watchthis": "Urmărește această pagină",
"savearticle": "Salvare pagină",
"publishpage": "Publică pagina",
+ "publishchanges": "Publică modificările",
"preview": "Previzualizare",
"showpreview": "Previzualizare",
"showdiff": "Afișare diferențe",
"undo-nochange": "Se pare că această modificare a fost deja anulată.",
"undo-summary": "Anularea modificării $1 făcute de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discuție]])",
"undo-summary-username-hidden": "Anularea versiunii $1 a unui utilizator ascuns",
- "cantcreateaccounttitle": "Crearea contului nu poate fi realizată",
"cantcreateaccount-text": "Crearea de conturi de la această adresă IP ('''$1''') a fost blocată de [[User:$3|$3]].\n\nMotivul invocat de $3 este ''$2''",
"cantcreateaccount-range-text": "Crearea de conturi de la adresele IP din gama <strong>$1</strong>, care o include și pe a dumneavoastră (<strong>$4</strong>), a fost blocată de [[User:$3|$3]].\n\nMotivul invocat de $3 este <em>$2</em>",
"viewpagelogs": "Afișează jurnalele paginii",
"mw-widgets-dateinput-placeholder-month": "AAAA-LL",
"mw-widgets-titleinput-description-new-page": "pagina nu există încă",
"mw-widgets-titleinput-description-redirect": "redirecționare către $1",
- "api-error-blacklisted": "Vă rugăm să alegeți un alt titlu, mai descriptiv.",
"sessionmanager-tie": "Nu se pot combina multiple tipuri de cereri de autentificare: $1.",
"sessionprovider-generic": "sesiuni $1",
"sessionprovider-mediawiki-session-cookiesessionprovider": "sesiuni pe bază de module cookie.",
"tagline": "Da {{SITENAME}}",
"help": "Ajute",
"search": "Cirche",
+ "search-ignored-headings": " #<!-- lasse sta linèe accume ste --> <pre>\n# Testate ca avène scettate jndr'à le ricerche.\n# Le cangiaminde devendane effettive quanne 'a pàgene avène indicizzate.\n# Tu puè forzà 'a reindicizzazzione d'a pàgene facenne 'nu cangiamende vecande.\n# 'A sindasse jè 'a seguende:\n# * Ogneccose da 'u carattere \"#\" 'nzigne a fine d'a linèe jè 'nu commende\n# * Ogne linèa chiene jè 'u titole esatte da ignorà, case e ogneccose\nRefereminde\nCollegaminde de fore\n'Ndruche pure\n #</pre> <!-- lasse sta linèe accume ste -->",
"searchbutton": "Cirche",
"go": "Véje",
"searcharticle": "Véje",
"passwordreset-emailtext-user": "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}\n($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}} 'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
"passwordreset-emailelement": "Nome utende: \n$1\n\nPassuord temboranèe: \n$2",
"passwordreset-emailsentemail": "Ce quiste jè 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
- "passwordreset-emailsent-capture": "'Na e-mail pe azzeramende d'a passuord ha state mannate, ca jè fatte vedè aqquà sotte.",
- "passwordreset-emailerror-capture": "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a {{GENDER:$2|l'utende}} ha fallite: $1",
"changeemail": "Cange o live 'u 'ndirizze e-mail",
"changeemail-header": "Comblete stu module pe cangià 'u 'ndirizze email. Ce tu vuè ccu live l'associazione cu ogne indirizze email da 'u cunde tune, lasse 'u 'ndirizze email vacande quanne conferme 'u module.",
"changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
"undo-nochange": "'U cangiamende pare ca ha state già annullate.",
"undo-summary": "Repristine 'a revisione $1 da [[Special:Contributions/$2|$2]] ([[User talk:$2|'Ngazzaminde]])",
"undo-summary-username-hidden": "Annulle 'a revisione $1 da 'n'utende scunnute",
- "cantcreateaccounttitle": "Non ge puè ccrejà 'nu cunde utende",
"cantcreateaccount-text": "'A creazione d'u cunde utende da stu 'ndirizze IP ('''$1''') ha state blocchete da [[User:$3|$3]].\n\n'U mutive dete da $3 jè ''$2''",
"cantcreateaccount-range-text": "'A crejazzione d'u cunde da l'indirizze IP jndr'à l'indervalle \"$1\", 'u quale 'nglude 'u 'ndirizze IP tune (<strong>$4</strong>), ha state bloccate da [[User:$3|$2]].",
"viewpagelogs": "Vide l'archivie pe sta pàgene",
"mw-widgets-dateinput-no-date": "Nisciune date scacchiate",
"mw-widgets-titleinput-description-new-page": "'a pàgene non g'esiste angore",
"mw-widgets-titleinput-description-redirect": "redirezionate sus a $1",
- "api-error-blacklisted": "Pe piacere scacchie 'nu titole diverse, descrittive.",
"randomrootpage": "Pàgene prengepàle a uecchije"
}
"SamGold",
"Jdforrester",
"Jack who built the house",
- "Cat1987"
+ "Cat1987",
+ "SergeyButkov"
]
},
"tog-underline": "Подчёркивание ссылок:",
"tagline": "Материал из {{grammar:genitive|{{SITENAME}}}}",
"help": "Справка",
"search": "Поиск",
+ "search-ignored-headings": " #<!-- оставьте эту строку как есть --> <pre>\n# Заголовки, которые будут игнорироваться поиском.\n# Изменения вступают в силу, как только страница с заголовком индексируется.\n# Вы можете принудить переиндексировать страницу с помощью нулевой правки.\n# Синтаксис выглядит следующим образом:\n# * Всё, начинающееся на символ «#» и до конца строки представляет собой комментарий.\n# * Каждая непустая строка — точное название того, что будет игнорироваться, включая регистр и пр.\nПримечания\nСсылки\nСм. также\n #</pre> <!-- оставьте эту строку как есть -->",
"searchbutton": "Найти",
"go": "Перейти",
"searcharticle": "Перейти",
"site-atom-feed": "$1 — Atom-лента",
"page-rss-feed": "«$1» — RSS-лента",
"page-atom-feed": "«$1» — Atom-лента",
- "feed-atom": "Атом",
+ "feed-atom": "Atom",
"red-link-title": "$1 (страница не существует)",
"sort-descending": "Упорядочить по убыванию",
"sort-ascending": "Упорядочить по возрастанию",
"passwordreset-emailelement": "Имя участника: \n$1\n\nВременный пароль: \n$2",
"passwordreset-emailsentemail": "Если это адрес электронной почты связан с вашей учётной записью, вам будет отправлено письмо для сброса пароля.",
"passwordreset-emailsentusername": "Если есть адрес электронной почты, связанный с этим именем участника, то будет отправлено письмо для восстановления пароля.",
- "passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
- "passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|Письмо|Письма}} для сброса пароля {{PLURAL:$1|было отправлено|были отправлены}}. {{PLURAL:$1|Логин и пароль показаны|Список логинов и паролей показан}} ниже.",
"passwordreset-emailerror-capture2": "Отправка {{GENDER:$2|участнику}} письма по электронной почте не удалась: $1 В {{PLURAL:$3|логин и пароль показаны|список логинов и паролей показан}} ниже.",
+ "passwordreset-nocaller": "Должен быть предоставлен источник вызова",
+ "passwordreset-nosuchcaller": "Источник вызова не существует: $1",
+ "passwordreset-ignored": "Сброс пароля не был обработан. Может быть, не был настроен ни один провайдер?",
"passwordreset-invalideamil": "Недопустимый адрес электронной почты",
"passwordreset-nodata": "Ни имя участника, ни адрес электронной почты не были предоставлены",
"changeemail": "Изменить или удалить адрес электронной почты",
"changeemail-header": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Если вы хотите отвязать свой адрес электронной почты от учётной записи, то при заполнении формы оставьте пустым поле нового адреса электронной почты.",
- "changeemail-passwordrequired": "Чтобы подтвердить это изменение, вам нужно будет ввести свой пароль.",
"changeemail-no-info": "Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.",
"changeemail-oldemail": "Текущий адрес электронной почты:",
"changeemail-newemail": "Новый адрес электронной почты:",
"watchthis": "Следить за этой страницей",
"savearticle": "Записать страницу",
"savechanges": "Сохранить изменения",
- "publishpage": "издавать страницу",
- "publishchanges": "Ð\9eпÑ\83бликоваÑ\82Ñ\8c изменениÑ\8f",
+ "publishpage": "Создать страницу",
+ "publishchanges": "Ð\97апиÑ\81аÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83",
"preview": "Предпросмотр",
"showpreview": "Предварительный просмотр",
"showdiff": "Внесённые изменения",
"content-model-css": "CSS",
"content-json-empty-object": "Пустой объект",
"content-json-empty-array": "Пустой массив",
+ "deprecated-self-close-category": "Страницы, использующие недопустимые самозакрывающеся HTML-теги",
+ "deprecated-self-close-category-desc": "Страница содержит недопустимые самозакрывающиеся HTML-теги, такие как <code><b/></code> или <code><span/></code>. В скором времени их действие изменится, чтобы соответствовать спецификации HTML5, так что использование этих устаревших тегов в вики-тексте нежелательно.",
"duplicate-args-warning": "<strong>Внимание:</strong> [[:$1]] вызывает [[:$2]] с более чем одним значением параметра «$3». Будет использовано только последнее указанное значение.",
"duplicate-args-category": "Страницы, использующие повторяющиеся аргументы в вызовах шаблонов",
"duplicate-args-category-desc": "Страницы, содержащие вызовы шаблонов, использующие повторяющиеся аргументы, такие как <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=bar}}</nowiki></code>.",
"undo-nochange": "Правка, похоже, уже была отменена.",
"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''.",
"cantcreateaccount-range-text": "{{GENDER:$3|Участник|Участница}} [[User:$3|$3]] {{GENDER:$3|установил|установила}} запрет на создание учётных записей из диапазона IP-адресов <strong>$1</strong>, включающего ваш IP-адрес (<strong>$4</strong>). \n\nБыла указана следующая причина: $2.",
"viewpagelogs": "Показать журналы для этой страницы",
"mergehistory-from": "Исходная страница:",
"mergehistory-into": "Целевая страница:",
"mergehistory-list": "Объединяемая история правок",
- "mergehistory-merge": "СледÑ\83Ñ\8eÑ\89ие веÑ\80Ñ\81ии [[:$1]] могÑ\83Ñ\82 бÑ\8bÑ\82Ñ\8c обÑ\8aединенÑ\8b в [[:$2]]. Ð\98Ñ\81полÑ\8cзÑ\83йÑ\82е пеÑ\80еклÑ\8eÑ\87аÑ\82ели длÑ\8f Ñ\82ого, чтобы объединить только выбранный диапазон правок. Учтите, что использование навигационных ссылок сбросит эту колонку.",
+ "mergehistory-merge": "СледÑ\83Ñ\8eÑ\89ие веÑ\80Ñ\81ии [[:$1]] могÑ\83Ñ\82 бÑ\8bÑ\82Ñ\8c пеÑ\80енеÑ\81енÑ\8b в [[:$2]]. Ð\98Ñ\81полÑ\8cзÑ\83йÑ\82е пеÑ\80еклÑ\8eÑ\87аÑ\82ели, чтобы объединить только выбранный диапазон правок. Учтите, что использование навигационных ссылок сбросит эту колонку.",
"mergehistory-go": "Показать объединяемые правки",
"mergehistory-submit": "Объединить правки",
"mergehistory-empty": "Не найдены правки для объединения.",
"action-applychangetags": " применять теги наряду с Вашими изменениями",
"action-changetags": "Добавлять и удалять произвольные теги на отдельных изменениях и записях в журнале",
"action-deletechangetags": "удаление меток из базы данных",
+ "action-purge": "очистку кэша этой страницы",
"nchanges": "$1 {{PLURAL:$1|изменение|изменения|изменений}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|с последнего посещения}}",
"enhancedrc-history": "история",
"trackingcategories-name": "Имя сообщения",
"trackingcategories-desc": "Критерий включения в категорию",
"restricted-displaytitle-ignored": "Страницы с игнорируемыми отображаемыми названиями",
+ "restricted-displaytitle-ignored-desc": "На странице есть игнорируемый <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, поскольку он не соответствует реальному названию страницы.",
"noindex-category-desc": "Страница не индексируются поисковыми роботами, потому что на ней имеется «волшебное слово» <code><nowiki>__NOINDEX__</nowiki></code>, и она находится в пространстве имён, где разрешён этот флаг).",
"index-category-desc": "На странице имеется «волшебное слово» <nowiki>__INDEX__</nowiki> (и страница находится в пространстве имён, где разрешён этот флаг), поэтому она индексируются поисковыми роботами в тех случаях, когда этого обычно не происходит.",
"post-expand-template-inclusion-category-desc": "Размер страницы станет больше <code>$wgMaxArticleSize</code> после показа всех шаблонов, поэтому некоторые из них не были показаны полностью.",
"notvisiblerev": "Версия была удалена",
"watchlist-details": "В вашем списке наблюдения $1 {{PLURAL:$1|страница|страницы|страниц}}, не считая страниц обсуждений.",
"wlheader-enotif": "Уведомления по эл. почте включены.",
- "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
+ "wlheader-showupdated": "СÑ\82Ñ\80аниÑ\86Ñ\8b, изменивÑ\88иеÑ\81Ñ\8f Ñ\81 ваÑ\88его поÑ\81леднего иÑ\85 поÑ\81еÑ\89ениÑ\8f, вÑ\8bделенÑ\8b '''полÑ\83жиÑ\80нÑ\8bм''' Ñ\88Ñ\80иÑ\84Ñ\82ом.",
"wlnote": "Ниже {{PLURAL:$1|показано последнее изменение|показаны <strong>$1</strong> последние изменения|показаны <strong>$1</strong> последних изменений}} за {{PLURAL:$2|последний час|последние <strong>$2</strong> часа|последние <strong>$2</strong> часов}}, по состоянию на $3 $4.",
"wlshowlast": "Показать за последние $1 часов $2 дней",
"watchlist-hide": "Скрыть",
"log-action-filter-suppress-reblock": "Сокрытие пользователя через повторное блокирование",
"log-action-filter-upload-upload": "Новая загрузка",
"log-action-filter-upload-overwrite": "Повторно загрузить",
+ "authmanager-authn-not-in-progress": "Проверка подлинности не выполняется или данные сессии были утеряны. Пожалуйста, начните снова с самого начала.",
"authmanager-authn-no-primary": "Предоставленные учётные данные не могут быть проверены на подлинность.",
"authmanager-authn-no-local-user": "Предоставленные учётные данные не связаны ни с одним участником этой вики.",
"authmanager-authn-no-local-user-link": "Предоставленные учётные данные корректны, но не связаны ни с одни участником этой вики. Войдите с помощью какого-то другого способа или создайте новую учётную запись, и у вас появится возможность привязать свои предыдущие учётные данные к этой учетной записи.",
"authmanager-authn-autocreate-failed": "Автоматическое создание локальной учётной записи не удалось: $1",
+ "authmanager-change-not-supported": "Предоставленные учётные данные не могут быть изменены, так как они не будут использованы.",
"authmanager-create-disabled": "Создание учётных записей отключено.",
"authmanager-create-from-login": "Чтобы создать учётную запись, пожалуйста, заполните приведённые ниже поля.",
"authmanager-create-not-in-progress": "Создание учётной записи не выполняется или данные сессии были утеряны. Пожалуйста, начните снова с самого начала.",
"authmanager-autocreate-noperm": "Автоматическое создание учётных записей не разрешено.",
"authmanager-autocreate-exception": "Автоматическое создание учётной записи временно отключено из-за предыдущих ошибок.",
"authmanager-userdoesnotexist": "Не зарегистрировано учётной записи «$1».",
+ "authmanager-userlogin-remembermypassword-help": "Будет ли пароль запоминаться на время большее, чем продолжительность сессии.",
"authmanager-username-help": "Имя участника для проверки подлинности.",
"authmanager-password-help": "Пароль для проверки подлинности.",
"authmanager-domain-help": "Домен для внешней аутентификации.",
"authmanager-provider-password": "Аутентификация на основе пароля",
"authmanager-provider-password-domain": "Проверка подлинности на основе пароля и домена",
"authmanager-provider-temporarypassword": "Временный пароль",
+ "authprovider-confirmlink-message": "На основании ваших последних попыткок входа, учётные записи могут быть связаны с вашей учётной записью в вики. Их связывание даёт возможность входа через эти учётные записи. Пожалуйста, выберите, какие из них должны быть связаны между собой.",
"authprovider-confirmlink-option": "$1 ($2)",
"authprovider-confirmlink-request-label": "Учётные записи, которые должны быть связаны",
"authprovider-confirmlink-success-line": "$1: успешно связан.",
"authprovider-confirmlink-ok-help": "Продолжать после вывода сообщений об ошибках связывания.",
"authprovider-resetpass-skip-label": "Пропустить",
"authprovider-resetpass-skip-help": "Пропустить сброс пароля.",
+ "authform-nosession-login": "Проверка подлинности прошла успешно, но ваш браузер не сможет «запомнить», что вы вошли.\n\n$1",
"authform-nosession-signup": "Учётная запись была создана, но ваш браузер не сможет «запомнить», что вы вошли.\n\n$1",
"authform-newtoken": "Отсутствует токен. $1",
"authform-notoken": "Отсутствует токен",
"linkaccounts-success-text": "Учетная запись была связана.",
"linkaccounts-submit": "Связать учётные записи",
"unlinkaccounts": "Отвязать учётные записи",
- "unlinkaccounts-success": "Учетная запись была отвязан."
+ "unlinkaccounts-success": "Учетная запись была отвязан.",
+ "authenticationdatachange-ignored": "Изменение данных для проверки подлинности не было обработано. Может быть, не был настроен ни один провайдер?"
}
"passwordreset-emailtext-user": "$1 सदस्यः {{SITENAME}}($4) जालस्थानस्य कृते कूटशब्दपरिवर्तनस्य विनतिम् अकरोत् । निम्न{{PLURAL:$3|सदस्यः|सदस्याः}} अनेन वि-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विज्ञप्तिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
"passwordreset-emailelement": "सदस्यनाम : \n$1\n\nअल्पकालीनकूटशब्दः : \n$2",
"passwordreset-emailsentemail": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति ।",
- "passwordreset-emailsent-capture": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति । तत् अधः द्रष्टुं शक्यते ।",
- "passwordreset-emailerror-capture": "परिवर्तितकूटशब्दस्य वि-पत्रं निर्मितम् अस्ति । तत् अधः द्रष्टुं शक्यते । परन्तु {{GENDER:$2|योजकाय}} प्रेषणकाले तत् निरस्तम् अभवत् : $1",
"changeemail": "वि-पत्रसङ्केतः परिवर्त्यताम्",
"changeemail-header": "प्रयोक्तृनाम्नः ई-पत्रसङ्केतः परिवर्त्यताम्",
"changeemail-no-info": "एतत् पृष्ठं सम्पादयितुं प्रवेशः अनिवार्यः ।",
"minoredit": "इदं लघु सम्पादनम्",
"watchthis": "इदं पृष्ठं निरीक्षताम्",
"savearticle": "पृष्ठं रक्ष्यताम्",
+ "publishpage": "पृष्ठं प्रकाश्यताम्",
+ "publishchanges": "परिवर्तनानि प्रकाश्यन्ताम्",
"preview": "प्राग्दृश्यम्",
"showpreview": "प्राग्दृश्यं दृश्यताम्",
"showdiff": "परिवर्तनानि दृश्यन्ताम्",
"undo-nochange": "पूर्वमेव एतत् सम्पादनं पूर्ववत् कृतं स्यात् ।",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) द्वारा कृता $1 पूर्ववत्-प्रक्रिया निरस्तीक्रियताम् ।",
"undo-summary-username-hidden": "निगूहितयोजकद्वारा कृता $1 पूर्ववत्-प्रक्रिया निरस्तीक्रियताम् ।",
- "cantcreateaccounttitle": "सदस्यता प्राप्तुं न शक्यते",
"cantcreateaccount-text": "(<strong>$1</strong>) इत्यस्य संविदः (IP) कृते सदस्यता प्राप्तुं न शक्यते । कारणं [[User:$3|$3]] द्वारा सा संवित्सङ्ख्या प्रतिबन्धिता अस्ति । \n\n$3 इत्यनेन कारणं दत्तं यत्, <em>$2</em>",
"cantcreateaccount-range-text": "सदस्यताप्राप्तेः सीमा-आक्रान्तृषु <strong>$1</strong> अन्तर्जालसंवित्सु (IP) भवतः/भवत्याः अन्तर्जालसंवद् (<strong>$4</strong>) अन्तर्भवति । अतः [[User:$3|$3]] द्वारा भवतः/भवत्याः अन्तर्जालसंविद् प्रतिबन्धिता ।\n\n$3 इत्यनेन कारणं दत्तं यत्, <em>$2</em>",
"viewpagelogs": "अस्य पृष्ठस्य संरक्षिताऽऽवलिः (logs) दृश्यताम्",
"tooltip-ca-nstab-category": "वर्गाणां पृष्ठं दृश्यताम्",
"tooltip-minoredit": "लघुसम्पादनत्वेन इदं सम्पादनम् अङ्क्यताम्",
"tooltip-save": "परिवर्तनानि रक्ष्यन्ताम्",
+ "tooltip-publish": "स्वपरिवर्तनानि प्रकश्यन्ताम्",
"tooltip-preview": "भवता/भवत्या कृतानां परिवर्तनानां प्राग्दृश्यं दृश्यताम्, रक्षणात्पूर्वं कृपया इदम् उपयुज्यताम्।",
"tooltip-diff": "भवता/भवत्या कृतानि परिवर्तनानि अत्र द्रष्टुं शक्यते",
"tooltip-compareselectedversions": "पृष्ठस्य द्वयोः चितयोः आवृत्त्योः भेदः दृश्यताम्",
"special-characters-title-endash": "en dash",
"special-characters-title-emdash": "em dash",
"special-characters-title-minus": "minus sign",
- "mw-widgets-titleinput-description-new-page": "पृष्ठं न विद्यते",
- "api-error-blacklisted": "कृपया भिन्नं विवरणपूर्वकं शीर्षकं चीयताम् ।"
+ "mw-widgets-titleinput-description-new-page": "पृष्ठं न विद्यते"
}
"otherlanguages": "Eṭagak pạrsi",
"redirectedfrom": "$1 khon ạcur heć akana",
"redirectpagesub": "Bań sojhe sakam",
+ "redirectto": "Ar hõ udugoḱakana:",
"lastmodifiedat": "Noa sakam do sạjao hoena $1, $2 te",
"viewcount": "Noa sakamdo {{PLURAL:$1 dhom $1 dhom}} udug hoena.",
"protectedpage": "Rukhíạ sakamko",
"mainpage": "Mukhiạ Sakam",
"mainpage-description": "Mukhiạ sakam",
"policy-url": "Project:Ritiniti",
- "portal": "Hoṛko boloḱ hor",
- "portal-url": "Projeṭ:Hoṛko bolon hor",
+ "portal": "Gusṭi bolon hor",
+ "portal-url": "Projeṭ: Gusṭ bolon hor",
"privacy": "Oku eḱtear",
"privacypage": "Project: Nijaḱ eḱteạr",
"badaccess": "Ektiạr vul",
"minoreditletter": "m",
"newpageletter": "N",
"boteditletter": "b",
- "rc-change-size-new": "Bodol tayomte",
+ "rc-change-size-new": "$1 {{PLURAL:$1|bayiṭ|bayiṭ}} Bodol tayomte",
"rc-enhanced-expand": "Purạote uduḱ",
"rc-enhanced-hide": "Purạo cuku",
"recentchangeslinked": "Sãotenaḱ bodolko",
"exif-imagewidth": "Ganḍe",
"exif-imagelength": "Usul",
"exif-datetime": "Rẽt bodol reaḱ tạrikh ar okte",
+ "exif-make": "Kemera tearić",
+ "exif-model": "Kemera model",
+ "exif-software": "Beoharen Software",
"exif-artist": "Onoliạ",
+ "exif-exifversion": "Exif bharson",
+ "exif-colorspace": "Roṅcoṅ dhạrti",
"namespacesall": "sanam",
"monthsall": "Sanamak",
"watchlisttools-view": "Jońgṛao bodolaḱko ńel",
"watchlisttools-edit": "Ńelok tạlika ńel ar joṛao",
"watchlisttools-raw": "Baṇ purạo akan ńelok tạlika purạomẽ",
- "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_galmarao}}:$1|talk]])",
+ "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|galmarao]])",
"duplicate-defaultsort": "'''Sontoroḱmẽ:''' ḍifolṭ sajao reaḱ cạbi: $2 lahare ḍifolṭ sajao reaḱ sakam: ''$1'' e bae luturaḱ kana.",
"specialpages": "Osokayteaḱ sakamko",
"external_image_whitelist": "#Noa sakam do cet leka menaḱa oṅkage dohoemẽ\n#Sanam okte re jạhiren kuṭrạ latar re (khạli hạtiń //talare) bạisạomẽ\n#Noako do bahre reaḱ (hotlinked) chubi reaḱ URL saõte milạo hoyoḱa\n#Okako milạḱa, onako do chubi lekate udugoḱa, baṅkhan do khali chubi joṛao udugoḱa\n#Noa layen reaḱ ehoṕre # menaḱa ona layenko menko hisapte beohar hoyoḱka\n#Noa do kas-baṅ rimjhạoaḱge\n#Noa dag cetanre regex kuṭrạ bạsạomẽ. Noa layen cetleka menaḱa oṅkage dohoemẽ</pre>",
"tagline": "Fae {{SITENAME}}",
"help": "Help",
"search": "Rake",
+ "search-ignored-headings": " #<!-- lea this line exactly aes it is --> <pre>\n# Heidins that will be ignored bi rake.\n# Chynges til this tak effect aes suin aes the page wi the heiding is index't.\n# Ye can force page reindexin bi daeing ae null edit.\n# Syntax is aes follaes:\n# * Awthin fae ae \"#\" chairacter til the end o the line is ae comment\n# * Ilka no-blank line is the exact title tae ignore, case an awthin\nReferences\nExternal links\nSee ava\n #</pre> <!-- leave this line exactly as it is -->",
"searchbutton": "Rake",
"go": "Gang",
"searcharticle": "Gang",
"passwordreset-emailtext-user": "Uiser $1 oan {{SITENAME}} requested ae reset o yer passwaird fer {{SITENAME}}\n($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}} associated wi this wab-mail address:\n\n$2\n\n{{PLURAL:$3|This temperie passwaird|Thir temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.\nYe shid log in n chuise ae new password nou. Gif some ither bodie haes makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
"passwordreset-emailelement": "Uisername: \n$1\n\nTemperie passwaird: \n$2",
"passwordreset-emailsentemail": "Ae passwaird reset wab-mail haes been sent.",
- "passwordreset-emailsent-capture": "Ae passwaird reset wab-mail haas been sent, this is shawn ablow.",
- "passwordreset-emailerror-capture": "Ae passwaird reset wab-mail wis generated, (this is shawn ablow), but sendin it til the {{GENDER:$2|uiser}} failed: $1",
"changeemail": "Chynge wab-mail address",
"changeemail-header": "Chynge accoont wab-mail address",
"changeemail-no-info": "Ye maun be loggit in tae access this page directly.",
"undo-nochange": "The edit appears tae hae awready been ondone.",
"undo-summary": "Ondae reveesion $1 bi [[Special:Contributions/$2|$2]] ([[User talk:$2|Tauk]])",
"undo-summary-username-hidden": "Ondae reveesion $1 bi ae skauk't uiser",
- "cantcreateaccounttitle": "Canna creaut accoont",
"cantcreateaccount-text": "Accoont cræftin fae this IP address ('''$1''') haes been blockit bi [[User:$3|$3]].\n\nThe raison fer this, gien bi $3 is ''$2''",
"cantcreateaccount-range-text": "Accoont cræftin fae IP addresses in the range <strong>$1</strong>, that inclædes yer IP address (<strong>$4</strong>), haes been blockit bi [[User:$3|$3]].\n\nThe raison gien bi $3 is <em>$2</em>",
"viewpagelogs": "Leuk at logs fer this page",
"nocookiesnew": "يُوزر کاتو کلي چڪو، پر توهان لاگ اِن نہ ٿيا آهيو. يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
"nocookieslogin": "يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
"noname": "توهان جو ڄاڻايل يُوزرنانءُ ناقابل ڪار آهي.",
- "loginsuccesstitle": "لاگ اِن ڪامياب",
+ "loginsuccesstitle": "لاگ اِن ٿيل",
"loginsuccess": "'''هاڻي توهان {{SITENAME}} تي بطور \"$1\" لاگ اِن ٿيل آهيو.'''",
- "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي. \"$1\".\n ننڍن وڏن اکرن ۾ امتياز ڪرڻ لازمي آهي. \nهِجي چڪاسيو،يا [[Special:CreateAccount|نئون کاتو تخليق ڪريو]]",
+ "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي.\nننڍن وڏن اکرن ۾ امتياز ڪرڻ لازمي آهي. \nهِجي چڪاسيو، يا [[Special:CreateAccount|نئون کاتو تخليق ڪريو]]",
"nosuchusershort": "\"$1\" نالي ڪو بہ يُوزر ناهي.\nهِجي جي پڪ ڪندا.",
"nouserspecified": "توهان کي ڪو يوزرنانءُ ڄاڻائڻو پوندو.",
"login-userblocked": "هيءُ يُوزر بندشيل آهي. لاگ اِن جي اجازت نہ ٿي ڏجي.",
"newpassword": "نئون ڳجھو لفظ:",
"retypenew": "نئون ڳجھو لفظ ٻيهر ٽائيپ ڪندا:",
"resetpass_submit": "ڳجھو لفظ طَي ڪريو ۽ لاگ اِن ٿيو",
- "changepassword-success": "توهان جو ڳجھو لفظ ڪاميابيءَ سان بدلايو ويو!",
+ "changepassword-success": "توهان جو ڳجھولفظ بدلايو ويو آھي!",
"changepassword-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
"botpasswords-label-create": "سرجيو",
"botpasswords-label-update": "تجديد",
"resetpass-no-info": "هيءُ صفحو پڙهڻ لاءِ لاگ اِن ٿيڻ ضروري آهي.",
"resetpass-submit-loggedin": "ڳجھو لفظ بدلايو",
"resetpass-submit-cancel": "رد",
- "resetpass-wrong-oldpass": "ناقابل ڪار هاڻوڪو يا عارضي ڳجھو لفظ. \nتوهان پنهنجو ڳجھو لفظ اڳ ۾ ئي بدلائي چڪا آهيو يا نئين ڳجھي لفظ لاءِ درخواست ڏئي چڪا آهيو.",
+ "resetpass-wrong-oldpass": "ناقابل ڪار هاڻوڪو يا عارضي ڳجھولفظ. \nتوهان پنهنجو ڳجھو لفظ اڳ ۾ ئي بدلائي چڪا آهيو يا نئين ڳجھي لفظ لاءِ درخواست ڏئي چڪا آهيو.",
"resetpass-recycled": "مهرباني ڪري پنهنجي هاڻوڪي ڳجھي لفظ کان ڪو مختلف ڳجھو لفظ چونڊيو.",
"resetpass-temp-emailed": "توهان برق ٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان لاگ اِن ٿيا آهيو. لاگ اِن کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھو لفظ طَي ڪرڻو ئي پوندو:",
"resetpass-temp-password": "عارضي ڳجھو لفظ:",
"userrights": "يُوزر حقن جو بندوبست",
"userrights-lookup-user": "يوزر گروپَ سنڀاليو",
"userrights-user-editname": "يُوزرنانءُ ڄاڻايو:",
- "editusergroup": "يوزر گروپَ سنواريو",
+ "editusergroup": "{{GENDER:$1|يوزر}} گروھ ترميميو",
"userrights-editusergroup": "يوزر گروپَ سنواريو",
- "saveusergroups": "يوزر گروپَ سنڀاليو",
+ "saveusergroups": "{{GENDER:$1|يوزر}} گروھ سانڍيو",
"userrights-groupsmember": "برڪن:",
"userrights-groupsmember-auto": "رڪن واجبي:",
"userrights-reason": "سبب:",
"rightslog": "يُوزر حق لاگ",
"action-read": "هي صفحو پڙهو",
"action-edit": "هن صفحي کي سسنواريو",
- "action-createpage": "صفحا تخليق ڪريو",
- "action-createtalk": "مباحثي صفحا تخليق ڪريو",
+ "action-createpage": "ھي صفحو تخليق ڪريو",
+ "action-createtalk": "ھي مباحثي صفحو تخليق ڪريو",
"action-createaccount": "هي يوزر کاتو تخليق ڪريو",
"action-history": "هن صفحي جي سوانح ڏسو",
"action-minoredit": "هن ترميم کي معمولي طور نشان لڳايو",
"tooltip-t-recentchangeslinked": "ويجھڙائيءَ ۾ صفحن ۾ ٿيل تبديليون هن صفحي سان ڳنڍيل آهن",
"tooltip-feed-atom": "هن صفحي لاءِ ايٽم فيڊ",
"tooltip-t-contributions": "{{GENDER:$1|ھن يوزر}} جي ڀاڱيدارين جي فھرست",
- "tooltip-t-emailuser": "هن يُوزر کي برق ٽپال اماڻيو",
+ "tooltip-t-emailuser": "{{GENDER:$1|ھن يوزر}} ڏانھن ايميل موڪليو",
"tooltip-t-upload": "فائيل چاڙهيو",
"tooltip-t-specialpages": "سڀني خاص صفحن جي فهرست",
"tooltip-t-print": "هن صفحي جو ڇاپائتو پرت",
"tags-activate-submit": "فعاليو",
"tags-deactivate-title": "ٽيگ کي غير فعال ڪريو",
"tags-deactivate-reason": "سبب:",
- "tags-edit-existing-tags-none": "\"ڪو بہ نہ\"",
+ "tags-edit-existing-tags-none": "<em>ڪو بہ نہ</em>",
"tags-edit-new-tags": "نوان ٽيگس:",
"tags-edit-reason": "سبب:",
"compare-page1": "صفحو 1",
"special-characters-group-thai": "ٿائي",
"mw-widgets-dateinput-no-date": "ڪا بہ تاريخ نہ چونڊيل",
"mw-widgets-titleinput-description-new-page": "اڃا اهو صفحو وجود نہ ٿو رکي",
- "mw-widgets-titleinput-description-redirect": "$1 ڏانهن چوريل",
- "api-error-blacklisted": "براءِ مهرباني ڪو مختلف، تشريحي عنوان چونڊيو."
+ "mw-widgets-titleinput-description-redirect": "$1 ڏانهن چوريل"
}
"newwindow": "(īr atverams naujam longė)",
"cancel": "Pabengtė",
"moredotdotdot": "Daugiau...",
- "morenotlisted": "Tas sārošos ožbengts nie.",
+ "morenotlisted": "Tas sārašos ožbėngts nie.",
"mypage": "Poslapis",
"mytalk": "Aptarėms",
"anontalk": "Aptarėms",
"media_tip": "Nūruoda abruozdielin",
"sig_tip": "Tamstas parašos ė čiesos",
"hr_tip": "Golos briežis (nenauduokat ba rēkala)",
- "summary": "Pāiškėnėms:",
+ "summary": "Keitėma paāškėnėms:",
"subject": "Tema/ontraštė:",
"minoredit": "Mažos pakeitėms",
"watchthis": "Keravuotė ton poslapė",
- "savearticle": "Ėšsauguotė poslapė",
+ "savearticle": "Ėšsauguotė poslapi",
+ "publishpage": "Padėrbtė ton poslapi",
+ "publishchanges": "Ožrašītė poslapė pamainīmus",
"preview": "Parveiza",
"showpreview": "Ruodītė parveiza",
"showdiff": "Ruodītė skėrtomus",
"protectedpagewarning": "'''DIEMESĖ: Šėts poslapis īr ožrakints ėr anū redagoutė gal tėk admėnėstratuorė teises torėntīs prietelē.'''",
"semiprotectedpagewarning": "'''Pastebiejėms:''' Šėts poslapis bova ožrakėnts ėr anuo gal redagoutė tėk regėstroutė nauduotojā.",
"titleprotectedwarning": "'''DIEMESĖ: Tas poslapis bova ožrakėnts tēp, ka tėktās kāpkatrė nauduotuojē galietu ana sokortė.'''",
- "templatesused": "{{PLURAL:$1|Šabluons, katros|Šabluonā, katrėi}}, īr nauduojamė tamė poslapi:",
+ "templatesused": "{{PLURAL:$1|Šabluons, katros|Šabluonā, katrėi}}, īr nauduojamė tamė poslapie:",
"templatesusedpreview": "{{PLURAL:$1|Šabluons|Šabluonā}}, nauduotė šėtuo parvaizuo:",
"templatesusedsection": "Šabluonā, nauduotė šėtom skėrsnelī:",
"template-protected": "(apsergiets)",
"permissionserrorstext": "Tamsta netorėt teisiu šėta darītė diel {{PLURAL:$1|tuos prīžastėis|tū prīžastiū}}:",
"permissionserrorstext-withaction": "Tamsta natorėt leidėma $2 dielē {{PLURAL:$1|tuokės dingstėis|tuokiū dingstiū}}:",
"recreate-moveddeleted-warn": "'''Parspiejėms: Tamsta ikeliat faila, katros onkstiau bova ėštrėnts.'''\n\nTamsta torietomiet nusprēstė, a īr naudėnga tuoliau ikeldinietė ta faila.\nTuo faila pašalinėma istuorėjė īr pateikta dielē patuogoma:",
- "moveddeleted-notice": "Tas poslapis bova ėštrints.\nĖštrinta poslapė atmainū sārošos īr douts paveiziejėmō apatiuo.",
+ "moveddeleted-notice": "Tas poslapis bova ėštrints.\nĖštrinta poslapė atmainū sārašos īr douts paveiziejėmō apatiuo.",
"log-fulllog": "Veizietė vėskon",
"edit-conflict": "Do keitėmo nesotink.",
"postedit-confirmation-created": "Poslapis padėrbts.",
"undo-success": "Keitėms gal būtė atšaukts. Prašuom patėkrėntė palīgėnėma, asonti žemiau, kū patvėrtėntomiet, kū Tamsta šėta ė nuorėt padarītė, ė tumet ėšsauguokit pakeitėmos, asontios žemiau, kū ožbėngtomiet keitėma atšaukėma.",
"undo-failure": "Keitėms nagal būt atšaukts diel konflėktounantiu tarpėniu pakeitėmu.",
"undo-summary": "Pargrōžėnams pakeitėms $1, padėrbts nauduotuojė [[Special:Contributions/$2|$2]] ([[User talk:$2|aptarėms]])",
- "cantcreateaccounttitle": "Nie galam padėrbtė nauduotuojė",
"cantcreateaccount-text": "Paskīrū kūrėma ėš šėta IP adresa ('''$1''') ožbluokava [[User:$3|$3]].\n\n$3 nuruodīta prīžastis īr ''$2''",
"cantcreateaccount-range-text": "Nauduotuoju dėrbėms nug IP adresū <strong>$1</strong>, terp katrū prėgol ė Tamstas IP adresos (<strong>$4</strong>), bova ožgints nauduotuojė [[User:$3|$3]].\n\n$3 ožrašė tuokė dingstiː <em>$2</em>",
"viewpagelogs": "Ruodītė ton poslapė īpatingus notėkėmus",
"difference-title-multipage": "Skėrtoms terp poslapiu „$1“ ė „$2“",
"difference-multipage": "(Skėtroms terp poslapiu)",
"lineno": "Eilotė $1:",
- "compareselectedversions": "Pamieruotė pasėrinktus atmainus",
+ "compareselectedversions": "Pamieruotė pasirinktus atmainus",
+ "showhideselectedversions": "Ruodītė/kavuotė atmainus, katrūs pasirinkuot",
"editundo": "atgrōžintė",
"diff-empty": "(Nie skėrtoma)",
"diff-multi-sameuser": "({{PLURAL:$1|Vėins tarpėnis pakeitėms|$1 tarpėnē pakeitėmā|$1 tarpėniu pakeitėmu}}, padėrbtū tuo patė nauduotuojė, nie ruoduoma)",
"prevn-title": "{{PLURAL:$1|Onkstesnis $1 rezoltats|Onkstesnio $1 rezoltato|Onkstesni $1 rezoltatā}}",
"nextn-title": "{{PLURAL:$1|Kėts $1 gavėms|Kėtė $1 gavėmā|Kėtū $1 gavėmu}}",
"shown-title": "Ruodītė $1 {{PLURAL:$1|gavėni|gavėnius|gavėniū}} ont poslapė",
- "viewprevnext": "Veizėtė ($1 {{int:pipe-separator}} $2) ($3).",
+ "viewprevnext": "Veizietė ($1 {{int:pipe-separator}} $2) ($3).",
"searchmenu-exists": "'''Poslapis pavadėnts „[[$1]]“ šėtuo wiki'''",
"searchmenu-new": "<strong>Padėrbtė poslapi, katros vadėntos „[[:$1]]“</strong> {{PLURAL:$2|0=|Dā veiziekat paėiškuo rasta straipsni|Dā veiziekat paėiškuos gavėnius.}}",
"searchprofile-articles": "Torėnė poslapē",
"right-delete": "Trintė poslapius",
"right-browsearchive": "Ėiškuotė ėštrintū poslapiu",
"right-undelete": "Tou poslapi padėrbtė apent",
- "newuserlogpage": "Nauduotuojė kūrėma sārošos",
+ "newuserlogpage": "Nauduotuojė kūrėma sārašos",
"rightslog": "Nauduotuoju teisiu istuorėjė",
"rightslogtext": "Pateikiams nauduotuoju teisiu pakeitėmu sārašos.",
"action-read": "skaitītė ton poslapi",
"enhancedrc-history": "istuorėjė",
"recentchanges": "Vielībė̄jė pakeitėmā",
"recentchanges-legend": "Vielībūju pakeitėmu pasėrinkėmā",
- "recentchanges-summary": "Keravuokat patius vielībuosius wiki pakeitėmus tamė poslapi.",
+ "recentchanges-summary": "Keravuokat patius vielībuosius wiki pakeitėmus tamė poslapie.",
"recentchanges-feed-description": "Keravuokėt patius vielībiausius pakeitėmus pruojektō tamė šaltėnī.",
"recentchanges-label-newpage": "Šėtuo keitėmuo padėrbts naus poslapis",
"recentchanges-label-minor": "Tas īr mažos pataisīms",
"rcshowhidemine": "$1 mona pakeitėmus",
"rcshowhidemine-show": "Ruodītė",
"rcshowhidemine-hide": "Kavuotė",
+ "rcshowhidecategorization": "$1, kap poslapiam doud kateguorėjės",
"rclinks": "Ruodītė vielībus $1 pakeitėmu par paskuojės $2 dėinas<br />$3",
"diff": "skėrt",
"hist": "ist",
"uploadlogpage": "Ožkruovėmu istuorėjė",
"uploadlogpagetext": "Žemiau pateikiam paskotėniu failu ikielima istuorėjė.",
"filename": "Abruozdėlė vards",
- "filedesc": "Pāiškėnėms",
- "fileuploadsummary": "Pāiškėnėms:",
+ "filedesc": "Paāškėnėms",
+ "fileuploadsummary": "Tromps aprašīms:",
"filereuploadsummary": "Abruozdielė pakeitėmāː",
"filestatus": "Derbieju teisėsː",
"filesource": "Šaltėnis:",
"filehist-user": "Nauduotuos",
"filehist-dimensions": "Mierā",
"filehist-filesize": "Abruozdielė dėdloms",
- "filehist-comment": "Pāiškėnėms",
+ "filehist-comment": "Paāškėnėms",
"imagelinks": "Abruozdieliu nauduojėms",
"linkstoimage": "{{PLURAL:$1|Ons poslapis|Anėi poslapē}} ruod ton abruozdielin:",
"nolinkstoimage": "Abruozdielėp neruod anėjuoks poslapis.",
"filerevert": "Sogrōžėntė $1",
"filerevert-legend": "Faila sogrōžinėms",
"filerevert-intro": "<span class=\"plainlinks\">Tamsta grōžėnat '''[[Media:$1|$1]]''' i versėje $4 ($2, $3).</span>",
- "filerevert-comment": "Pāiškėnėms:",
+ "filerevert-comment": "Dingstės:",
"filerevert-submit": "Grōžėntė",
"filedelete": "Trintė $1",
"filedelete-legend": "Trintė faila",
"statistics-users": "Ožsėregėstravosiu [[Special:ListUsers|nauduotuoju]]",
"statistics-users-active": "Aktīviu nauduotuoju",
"statistics-users-active-desc": "Nauduotuojē, katrėi par {{PLURAL:$1|paskiausė dėina|paskiausė 2 dėinė|paskiausės $1 dėinas|paskiausiu $1 dėinū}} padėrba keitėmu",
+ "pageswithprop": "Poslapē so apībriežtuom savībėm",
+ "pageswithprop-legend": "Poslapē so apībriežtuom savībėm",
"pageswithprop-submit": "Ēk",
"doubleredirects": "Dvėgobė nusokėmā",
"doubleredirectstext": "Tėi paradresavėmā ruod i kėtus paradresavėma poslapius. Kuožnuo eilotē pamėnavuots pėrmasā ėr ontrasā paradresavėmā, tēpuogi ontrojė paradresavėma paskėrtis, katra paprastā ė paruod i tėkraji poslapi, i katra pėrmasā paradresavėms ė torietu ruodītė.",
"protectedpages-unknown-performer": "Nežėnuoms nauduotuos",
"protectedtitles": "Apsauguotė pavadinėmā",
"protectedtitlesempty": "Šėtou čieso nier anėjuokė pavadinėma, katros apsauguots tās parametrās.",
- "listusers": "Sārošos nauduotuoju",
+ "listusers": "Sārašos nauduotuoju",
"listusers-editsonly": "Ruodītė tėktās nauduotuojus katrėi īr atlėkė pakeitėmus",
"usereditcount": "{{PLURAL:$1|pataisīms|pataisīmā|pataisīmu}}",
"usercreated": "{{GENDER:$3|Padėrba paskīra}} $1 $2",
"logempty": "Istuorėjuo nier anėjuokiū atitinkontiu atsėtėkimu.",
"log-title-wildcard": "Ėiškuotė pavadinėmu, katrė prasėded šėtuo teksto",
"showhideselectedlogentries": "Ruodītė/kavuotė sāraša ponktus, katrūs pasėrėnkot",
+ "checkbox-select": "Rinktėis: $1",
+ "checkbox-all": "Viskos",
"allpages": "Vėsė straipsnē",
"nextpage": "Kėts poslapis ($1)",
"prevpage": "Onkstesnis poslapis ($1)",
"listgrouprights": "Nauduotuoju gropiu teisės",
"listgrouprights-group": "Gropė",
"listgrouprights-rights": "Teisės",
- "listgrouprights-members": "(nariū sārošos)",
+ "listgrouprights-members": "(nariū sārašos)",
+ "trackingcategories": "Pruogramėnės keravuojėma kateguorėjės",
"mailnologin": "Nier adresa",
"mailnologintext": "Tamstā reik būtė [[Special:UserLogin|prisėjongosiam]]\nė tor būtė ivests teisings el. pašta adresos Tamstas [[Special:Preferences|nustatīmuos]],\nkū siōstomiet el. gruomatas kėtėm nauduotuojam.",
"emailuser": "Rašītė gruomata šėtam nauduotuojō",
"actioncomplete": "Vēksmos padėrbts īr",
"actionfailed": "Vēksmos atšaukts īr",
"deletedtext": "„$1“ ėštrints īr.\nVielībūju trīnėmu istuorėjė - $2.",
- "dellogpage": "Ėštrīnėmu sārošos",
+ "dellogpage": "Ėštrīnėmu sārašos",
"dellogpagetext": "Apatiuo gol patīs vielībė̄jė ėštrīnėmā.",
- "deletionlog": "ėštrīnėmu sārošos",
+ "deletionlog": "ėštrīnėmu sārašos",
"reverted": "Grōžinta tāp, kāp ėšruodė pėrmiou",
"deletecomment": "Dingstės:",
"deleteotherreason": "Kėta/papėlduoma dingstės:",
"rollbackfailed": "Atmetėms nasėgava",
"cantrollback": "Negalėma atmestė redagavėma; paskotinis keitės nauduotuos īr tuo poslapė autorius.",
"alreadyrolled": "Nė̄šēn otgrōžintė pakeitėma, [[:$1]] katra padėrba [[User:$2|$2]] ([[User talk:$2|aptarėms]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nkažkas ton jau padėrba pėrmiou.\n\nVielībiausā ton poslapė pakeitėms padėrbts [[User:$3|$3]] ([[User talk:$3|aptarėms]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) īr.",
- "editcomment": "Padėrbėma pāiškėnėms bova: <em>$1</em>.",
+ "editcomment": "Padėrbėma paāškėnėms bova: <em>$1</em>.",
"revertpage": "Atmests [[Special:Contributions/$2|$2]] ([[User talk:$2|aptarėms]]) pakeitėms; sogrōžints atmains, katron padėrba nauduotuos [[User:$1|$1]]",
"rollback-success": "Atmestė $1 padėrbtė keitėmā; grōžints $2 padėrbts atmains.",
"sessionfailure": "Atruod ka īr biedū so Tamstas prėsėjongėmo; tas vēksmos bova grōžints kāp atsargoma prėimonė nu sesėjės vuogėma.\nPrašoum mīgtė „atgal“ ėr parkrautė poslapi ėš katruo atiejėt, ė pamieginkėt apent.",
"undeleteextrahelp": "Nuoriedamė atkortė vėsa poslapi, palikit vėsas varnales napažīmietas ėr\nspauskėt '''''Atkortė'''''. Nuoriedamiė atlėktė pasirėnktini atstatīma, pažīmiekit varnales šėtū versėju, katras nuorietomiet atstatītė, ėr spauskėt '''''Atkortė'''''. Paspaudus\n'''''Ėš naujė''''' bos ėšvalītuos vėsos varnalės ėr kuomentara lauks.",
"undeleterevisions": "$1 {{PLURAL:$1|versėjė|versėjės|versėju}} soarkīvouta",
"undeletehistory": "Jē atstatīsėt straipsni, istuorėjuo bos atstatītuos vėsos versėjės.\nJē puo ėštrīnima bova sokuots straipsnis tuokiuo patio pavadėnėmo,\natstatītuos versėjės atsiras onkstesnie istuorėjuo, o dabartėnė\nversėjė lėks napakeista. Atkoriant īr prarondamė apribuojimā failu versėjuom.",
- "undeleterevdel": "Atkorėms nebus ivīkdīts, jē šėtā nulems paskotėnės poslapė versėjės dalini ėštrīnima.\nTuokēs atvejās, Tamstā rēk atžīmietė a atkavuotė naujausēs ėštrintas versėjės.\nFailu versėjės, katrū netorėt teisiu veizėtė, nebus atkortas.",
+ "undeleterevdel": "Poslapė atstatīms nabūs padarīts, jēb dielē ton ėšsitrintom vielībė̄jė poslapė pakeitėmā.\nTūdie Tamstā rēk atžīmietė aba atkavuotė vielībuosius ėštrintus atmainus.",
"undeletehistorynoadmin": "Šėts straipsnis bova ėštrints. Trīnima prižastis\nruodoma žemiau, teipuogi kas redagava poslapi\nlėgė trīnima. Ėštrintū poslapiu tekstos īr galėmas tėk admėnėstratuoriam.",
"undelete-revision": "Ėštrėnta $1 versėjė, katra $4 d. $5 padėrba $3:",
"undeleterevision-missing": "Neteisėnga a dėngosė versėjė. Tamsta mažo torėt bluoga nūruoda, a versėjė bova atkorta a pašalėnta ėš arkīva.",
"undeletebtn": "Grōžintė",
"undeletelink": "veizietė/grōžintė",
"undeleteviewlink": "veizietė",
- "undeleteinvert": "Žīmietė prīšėngā",
+ "undeleteinvert": "Žīmietė atvėrkštē",
"undeletecomment": "Dingstės:",
"undeletedrevisions": "$1 {{PLURAL:$1|pakeitėms sogrōžints|pakeitėmā sogrōžintė|pakeitėmu sogrōžintu}} īr",
"undeletedrevisions-files": "sogrōžintaː $1 {{PLURAL:$1|pakeitėms|pakeitėmā|pakeitėmu}} ėr $2 {{PLURAL:$2|abruozdielis|abruozdielē|abruozdieliu}}",
"undelete-show-file-confirm": "A ėš tėkrā nuorėt parveizietė ėštrėnta faila „<nowiki>$1</nowiki>“ $2 $3 versėjė?",
"undelete-show-file-submit": "Tēp",
"namespace": "Vardū srėtės:",
- "invert": "Žīmietė prīšėngā",
+ "invert": "Žīmietė atvėrkštē",
"tooltip-invert": "Pažīmiekat ton varnalė, ka pakavuotomiet pakeitėmus pasėrinktūs poslapiūs (ė prėgolontės vardū srėtis)",
"namespace_association": "Prėgolontė vardū srėtės",
"tooltip-namespace_association": "Pažīmiekat ton varnalė, ka prėgoldītomat aptarėmus, katrėi ī sosėjė so parinkta vardū srėtim",
"uctop": " (vielībs)",
"month": "Nug mienėsė (ėr onkstiau):",
"year": "Nug metu (ėr onkstiau):",
- "sp-contributions-newbies": "Ruodītė tėk naujū prieteliu duovios",
+ "sp-contributions-newbies": "Ruodītė tėktās naujū prieteliu duovius",
"sp-contributions-newbies-sub": "Naujuoms paskīruoms",
"sp-contributions-newbies-title": "Nauduotuoju keitėmā naujuoms paskīruoms",
"sp-contributions-blocklog": "Bluokavėmu istuorėjė",
"contribslink": "duovis",
"emaillink": "siōstė pašta",
"autoblocker": "Autuomatėnis ožbluokavėms, nes dalėnaties IP adreso so nauduotuojo \"$1\". Prīžastės - \"$2\".",
- "blocklogpage": "Ožgīnėmu sārošos",
+ "blocklogpage": "Ožgīnėmu sārašos",
"blocklog-showlog": "Nauduotuos jau bova ožgints pėrmiou.\nApatiuo veiziekat kas ė kāpː",
"blocklogentry": "ožgīnė [[$1]] nug dėrbėma, tas vēk ton čiesa - $2 $3",
"reblock-logentry": "pakeistė [[$1]] bluokavėma nustatīmā, naus bluokavėma čiesos īr $2 $3",
"tooltip-pt-anonuserpage": "Nauduotuojė poslapis Tamstas IP adresō",
"tooltip-pt-mytalk": "Tamstas aptarėma poslapis",
"tooltip-pt-preferences": "Mona nustatīmā",
- "tooltip-pt-watchlist": "Poslapiu, katrūs Tamsta pasėrėnkuot keravuotė, sārošos.",
+ "tooltip-pt-watchlist": "Poslapiu, katrūs Tamsta pasirinkuot keravuotė, sārašos.",
"tooltip-pt-mycontris": "Tamstas dėrbtū keitėmu sārašos",
"tooltip-pt-login": "Kvėitam prėsėjongtė, nuors tas ė nie būtėna.",
"tooltip-pt-logout": "Atsėjongtė",
"tooltip-save": "Ėšsauguotė pakeitėmus",
"tooltip-preview": "Ta īr pakeitėmu parveiza. Prašuom parveizat prīš ėšsaugont!",
"tooltip-diff": "Ruod, kū parkeitiet straipsni.",
- "tooltip-compareselectedversions": "Veizėtė abodvėju pasėrėnktū poslapė versėju skėrtomos.",
+ "tooltip-compareselectedversions": "Veizietė abodvėju pasirinktū poslapė atmainu skėrtomus.",
"tooltip-watch": "Pridietė šėta poslapi i keravuojamu sāraša",
"tooltip-recreate": "Atkortė poslapi napaisant šėto, kū ans bova ėštrints",
"tooltip-rollback": "Sogrōžintė poslapi tāp, kāp ons bova prīš vielībūs ton nauduotuojė pardėrbėmus",
"watchlistedit-raw-explain": "Žemiau ruodomė poslapē Tamstas keravuojamu sārašė, ė gal būtė pridietė i a pašalėntė ėš sāraša; vėins poslapis eilotie. Bėngė paspauskėt „Atnaujėntė keravuojamu sāraša“. Tamsta tēpuogi galėt [[Special:EditWatchlist|nauduotė standartėni radaktuoriu]].",
"watchlistedit-raw-titles": "Poslapē:",
"watchlistedit-raw-submit": "Atnaujėntė keravuojamu sāraša",
- "watchlistedit-raw-done": "Tamstas keravuojamu sārošos bova atnaujėnts.",
+ "watchlistedit-raw-done": "Tamstas keravuojamu poslapiu sārašos bova atnaujints.",
"watchlistedit-raw-added": "$1 {{PLURAL:$1|poslapis bova pridiets|poslapē bova pridietė|poslapiu bova pridieta}}:",
"watchlistedit-raw-removed": "$1 {{PLURAL:$1|poslapis bova pašalėnts|poslapē bova pašalėntė|poslapiu bova pašalėnta}}:",
"watchlisttools-view": "Veizietė sosėjosius pakeitėmus",
"logentry-upload-overwrite": "$1 {{GENDER:$2|ožkruovė}} naujė $3 atmaina",
"logentry-upload-revert": "$1 {{GENDER:$2|ožkruovė}} $3",
"rightsnone": "(juokiū)",
- "revdelete-summary": "keitėma pāiškėnėms",
+ "revdelete-summary": "keitėma paāškėnėms",
"feedback-close": "Padėrbt",
"searchsuggest-search": "Ėiškuotė",
"searchsuggest-containing": "katrėi tor...",
"passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio resetiranje vaše lozinke/zaporke za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše originalne lozinke, a ne želite je više promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
"passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
"passwordreset-emailsentemail": "Ako je ovo adresa e-pošte s kojom ste registrirali ovaj račun, podsjetnik šifre/lozinke/zaporke će vam biti poslan na vašu adresu e-pošte.",
- "passwordreset-emailsent-capture": "E-mail za resetiranje lozinke/zaporke je poslan (prikazan dolje).",
- "passwordreset-emailerror-capture": "E-mail za resetiranje lozinke/zaporke, prikazan dolje, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici|korisniku}} nije uspjelo: $1",
"changeemail": "Promeni ili ukloni e-adresu",
"changeemail-header": "Ispunite sljedeći formular da biste promijenili adresu e-pošte. Ako želite ukloniti postojeću adresu e-pošte s vašeg korisničkog računa, pri ispunjavanju formulara, polje nove adrese e-pošte ostavite prazno.",
- "changeemail-passwordrequired": "Morat ćete unijeti vašu lozinku/zaporku da potvrdite ovu promjenu.",
"changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
"changeemail-oldemail": "Trenutna e-mail adresa:",
"changeemail-newemail": "Nova e-mail adresa:",
"minoredit": "Ovo je manje uređenje",
"watchthis": "Prati ovu stranicu",
"savearticle": "Spremi stranicu",
+ "publishpage": "Objavi stranicu",
+ "publishchanges": "Objavi izmjene",
"preview": "Pregled",
"showpreview": "Prikaži pregled",
"showdiff": "Prikaži izmjene",
"undo-nochange": "Ovo je uređivanje izgleda već bilo poništeno.",
"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''",
"cantcreateaccount-range-text": "Stvaranje računa od IP adresa iz pojasa<strong>$1</strong>, koji uključuje vašu IP adresu (<strong>$4</strong>), je blokirao/la [[User:$3|$3]].\n\nRazlog koji je dao/la $3 je <em>$2</em>",
"viewpagelogs": "Pogledaj protokole ove stranice",
"tooltip-ca-nstab-category": "Pogledajte stranicu kategorije",
"tooltip-minoredit": "Označi ovo kao manje uređenje",
"tooltip-save": "Spremite svoje izmjene",
+ "tooltip-publish": "Objavi svoje izmjene",
"tooltip-preview": "Pregledajte svoje izmjene. Molimo vas da ovo koristite prije spremanja.",
"tooltip-diff": "Prikaz izmjena koje ste napravili u tekstu",
"tooltip-compareselectedversions": "Pogledajte pazlike između dvije selektovane verzije ove stranice.",
"resetpass_submit": "Nastaviť heslo a prihlásiť sa",
"changepassword-success": "Vaše heslo bolo úspešne zmenené!",
"changepassword-throttled": "Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie. Prosím, počkajte $1 predtým, než to skúsite znova.",
+ "botpasswords-label-appid": "Názov bota:",
+ "botpasswords-label-create": "Vytvoriť",
+ "botpasswords-label-update": "Aktualizovať",
+ "botpasswords-label-cancel": "Zrušiť",
+ "botpasswords-label-delete": "Vymazať",
+ "botpasswords-label-resetpassword": "Obnoviť heslo",
"resetpass_forbidden": "Heslá nie je možné zmeniť",
"resetpass-no-info": "Aby ste mohli priamo pristupovať k tejto stránke, musíte sa prihlásiť.",
"resetpass-submit-loggedin": "Zmeniť heslo",
"sig_tip": "Váš podpis s dátumom a časom",
"hr_tip": "Vodorovná čiara (radšej ju nepoužívajte)",
"summary": "Zhrnutie úprav:",
- "subject": "Téma/nadpis:",
+ "subject": "Predmet:",
"minoredit": "Toto je drobná úprava",
"watchthis": "Sledovať úpravy tejto stránky",
"savearticle": "Uložiť stránku",
+ "savechanges": "Uložiť zmeny",
+ "publishpage": "Publikovať stránku",
+ "publishchanges": "Publikovať zmeny",
"preview": "Náhľad",
"showpreview": "Zobraziť náhľad",
"showdiff": "Zobraziť rozdiely",
"mw-widgets-dateinput-placeholder-month": "RRRR-MM",
"mw-widgets-titleinput-description-new-page": "stránka zatiaľ neexistuje",
"mw-widgets-titleinput-description-redirect": "presmerovanie na $1",
- "api-error-blacklisted": "Prosím, zvoľte iný, opisný názov.",
"randomrootpage": "Náhodná koreňová stránka"
}
"tagline": "Iz {{GRAMMAR:rodilnik|{{SITENAME}}}}",
"help": "Pomoč",
"search": "Iskanje",
+ "search-ignored-headings": " #<!-- te vrstice ne spreminjajte --> <pre>\n# Poglavja, ki bodo prezrta pri iskanju.\n# Spremembe bodo začele veljati takoj, ko bo stran s poglavjem indeksirana.\n# Reindeksacijo strani lahko vsilite z ničelnim urejanjem.\n# Skladnja je sledeča:\n# * Vse od znaka »#« do konca vrstice je pripomba.\n# * Vsaka neprazna vrstica je natančen naslov, ki ga bomo prezrli, upoštevajoč velikost črk in ostalo.\nOpombe\nOpombe in sklici\nViri\nZunanje povezave\nGlej tudi\n #</pre> <!-- te vrstice ne spreminjajte -->",
"searchbutton": "Iskanje",
"go": "Pojdi na",
"searcharticle": "Pojdi na",
"passwordreset-emailelement": "Uporabniško ime: \n$1\n\nZačasno geslo: \n$2",
"passwordreset-emailsentemail": "Če je e-poštni naslov povezan z vašim računom, vam bomo poslali e-pošto za postavitev gesla.",
"passwordreset-emailsentusername": "Če obstaja e-poštni naslov, povezan s tem uporabniškim imenom, vam bomo poslali e-pošto za postavitev gesla.",
- "passwordreset-emailsent-capture": "Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.",
- "passwordreset-emailerror-capture": "Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje {{GENDER:$2|uporabniku|uporabnici}} ni uspelo: $1",
"passwordreset-emailsent-capture2": "Poslali smo {{PLURAL:$1|e-pošto|e-pošti|e-pošte}} za ponastavitev gesla. {{PLURAL:$1|Uporabniško ime in geslo sta navedena spodaj.|Seznam uporabniških imen in gesel je naveden spodaj.}}",
"passwordreset-emailerror-capture2": "Pošiljanje e-pošte {{GENDER:$2|uporabniku|uporabnici}} je spodletelo: $1 {{PLURAL:$3|Uporabniško ime in geslo sta navedena spodaj.|Seznam uporabniških imen in gesel je naveden spodaj.}}",
"passwordreset-nocaller": "Podati morate klicatelja",
"passwordreset-nodata": "Navedli niste ne uporabniškega imena ne e-poštnega naslova",
"changeemail": "Sprememba ali odstranitev e-poštnega naslova",
"changeemail-header": "Izpolnite obrazec za spremembo vašega e-poštnega naslova. Če želite s svojega računa odstraniti povezavo s katerim koli e-poštnim naslovom, pustite polje za nov e-poštni naslov med potrjevanje obrazca prazno.",
- "changeemail-passwordrequired": "Za potrditev spremembe boste morali vnesti svoje geslo.",
"changeemail-no-info": "Za neposredni dostop do strani morate biti prijavljeni.",
"changeemail-oldemail": "Trenutni e-poštni naslov:",
"changeemail-newemail": "Novi e-poštni naslov:",
"undo-nochange": "Zdi se, da je urejanje nekdo že razveljavil.",
"undo-summary": "Redakcija $1 uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) razveljavljena",
"undo-summary-username-hidden": "Razveljavi redakcijo $1 skritega uporabnika",
- "cantcreateaccounttitle": "Računa ni moč ustvariti",
"cantcreateaccount-text": "Registracije z IP-naslova ('''$1''') je administrator(ka) [[User:$3|$3]] blokiral(a).\n\nRazlog, ki ga je $3 podal(a), je ''$2''.",
"cantcreateaccount-range-text": "Ustvarjanje računov z IP-naslovov v območju <strong>$1</strong>, ki vključuje vaš IP-naslov (<strong>$4</strong>), je blokiral(-a) [[User:$3|$3]].\n\nRazlog, ki ga je podal(-a) $3, je <em>$2</em>.",
"viewpagelogs": "Poglej dnevniške zapise o strani",
"action-applychangetags": "uveljavitev oznak skupaj z vašimi spremembami",
"action-changetags": "dodajanje in odstranjevanje poljubnih oznak na posameznih redakcijah in dnevniških vnosih",
"action-deletechangetags": "izbris oznak iz zbirke podatkov",
+ "action-purge": "počiščenje strani",
"nchanges": "$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|od zadnjega obiska}}",
"enhancedrc-history": "zgodovina",
"watchnologin": "Niste prijavljeni",
"addwatch": "Dodaj na spisek nadzorov",
"addedwatchtext": "»[[:$1]]« in pripadajočo pogovorno stran smo dodali na vaš [[Special:Watchlist|spisek nadzorov]].",
+ "addedwatchtext-talk": "»[[:$1]]« in pripadajočo stran smo dodali na vaš [[Special:Watchlist|spisek nadzorov]].",
"addedwatchtext-short": "Stran »$1« smo dodali na vaš spisek nadzorov.",
"removewatch": "Odstrani s spiska nadzorov",
"removedwatchtext": "»[[:$1]]« in pripadajočo pogovorno stran smo odstranili z vašega [[Special:Watchlist|spiska nadzorov]].",
+ "removedwatchtext-talk": "»[[:$1]]« in pripadajočo stran smo odstranili z vašega [[Special:Watchlist|spiska nadzorov]].",
"removedwatchtext-short": "Stran »$1« smo odstranili z vašega spiska nadzorov.",
"watch": "Opazuj",
"watchthispage": "Opazuj stran",
"tagline": "Ka {{SITENAME}}",
"help": "Caawinaad",
"search": "Raadi",
+ "search-ignored-headings": " #<!-- Udaa sadarkaan sida uu yahay --> <pre>\n# Waxaa dhacaysa in la iska iloowo madaxqorkiisa inta lagu gudajiro raadinta.\n# Isbedeleda waxay aadi doonaan halkii loogu talo galay ee hordhaca bogga uu ku jiro madaxqorkiisa.\n# Waxaa kuu suurtagal ah inaad howl hordhac ah usameeyso bogga adigoo bedela bogga banaan.\n# Weeraynta waa sidaan soo socota:\n# * wax kasta oo gadaasheeda lagu qoro \"#\" sadarka dhammaadkiis waxaa loo qaadanaa faallo\n# * Sadarkasta ee banaan wuxuu qaadanayaa ciwaankii laga tagay, isagii iyo wax kabedelan\nReferences\nLinkiyada dibadda\nSidoo kale eeg\n #</pre> <!-- leave this line exactly as it is -->",
"searchbutton": "Raadi",
"go": "Soco",
"searcharticle": "Soco",
"passwordreset-emailtext-ip": "(Qof laga yaabo in ee tahay adi, oo ka socdo ciwaanka IP'ka $1) ayaa codsaday xasuus faah faahin akoonkaada {{SITENAME}}\n($4). Isticmaaladaan soo socota {{PLURAL:$3|akoonkooda waxee|akoonkooda waxee}} la xiriiraan ciwaankaan e-mailka ah:\n\n$2\n\n{{PLURAL:$3|eraysirkaan kumeel gaarka ah|Eraysiryadaan kumeel gaarka ah}} waxay dhacaayaan {{PLURAL:$5|hal maalin|$5 maalmood}}.\nWaa in aad gudaha gashaa oo e-mail cusub doorataa hadda. Hadii ee qof kale codsigaan sameysay, ama hadii aad soo xasuusatay eraysirkaagii hore, oo aadna u baahneen in aad badashid, iska ilaaw fariintaan siina isticmaal eraysirkaagii duqi ahaa.",
"passwordreset-emailtext-user": "Isticmaale $1 ee {{SITENAME}} wuxuu codsaday xasuus faah faahin akoonkaada {{SITENAME}}\n($4). Isticmaaladaan soo socota {{PLURAL:$3|akoonkooda waxee|akoonkooda waxee}} la xiriiraan ciwaankaan e-mailka ah:\n\n$2\n\n{{PLURAL:$3|eraysirkaan kumeel gaarka ah|Eraysiryadaan kumeel gaarka ah}} waxay dhacaayaan {{PLURAL:$5|hal maalin|$5 maalmood}}.\nWaa in aad gudaha gashaa oo e-mail cusub doorataa hadda. Hadii ee qof kale codsigaan sameysay, ama hadii aad soo xasuusatay eraysirkaagii hore, oo aadna u baahneen in aad badashid, iska ilaaw fariintaan siina isticmaal eraysirkaagii duqi ahaa.",
"passwordreset-emailelement": "Magaca gudagalka: \n$1\n\nEreysirka kumeelgaarka ah: \n$2",
- "passwordreset-emailerror-capture": "E-mail xasuus ah ayaa la sameeyay, oo ka arki kartid hoosta,laakiin wuxuu ku guul dareestay in isticmaalaha loo diro: $1",
"changeemail": "Bedel ciwaanka E-mailka",
"changeemail-header": "Bedel ciwaanka e-mailka akoonka",
"changeemail-oldemail": "Ciwaanka e-mailka hadda jiro:",
"post-expand-template-inclusion-category": "Boggaga ku xad gudbay weyninka tusmo'da",
"post-expand-template-argument-warning": "'''Digniin:'''Boggaan waxaa ku jira ugu yaraan hal iyo wixii ka badan oo template ah, waxaana ku xiran kuwa kale.",
"undo-summary": "Noqay bedelaadka $1 ee sameeyay [[Special:Contributions/$2|$2]] ([[User talk:$2|hadal]])",
- "cantcreateaccounttitle": "Ma' sameynkaro gudagal (akoon)",
"cantcreateaccount-text": "Akoon'ka sameeyaha leh ciwaankaan IP:ka ('''$1''') waxaa mamnuucay [[User:$3|$3]].\n\nSababta uu qoray $3 waa ''$2''",
"viewpagelogs": "Fiiri guadagalayaasha boggaan",
"nohistory": "Boggaan malahan taariikhda bedelaadka",
},
"tog-underline": "Nënvizimi i lidhjes:",
"tog-hideminor": "Fshih redaktimet e vogla nga ndryshimet e fundit",
- "tog-hidepatrolled": "Fshih redaktimet e paturlluara nga ndryshimet e fundit",
- "tog-newpageshidepatrolled": "Fshih faqet e patrulluara nga lista e faqeve të reja",
+ "tog-hidepatrolled": "Fshih redaktimet e kontrolluara nga ndryshimet e fundit",
+ "tog-newpageshidepatrolled": "Fshih faqet e kontrolluara nga lista e faqeve të reja",
"tog-hidecategorization": "Fshih kategorizimin e faqeve",
- "tog-extendwatchlist": "Zgjero listën e faqeve të vëzhguara që t'i tregojë të gjitha ndryshimet, jo vetëm më të fundit.",
- "tog-usenewrc": "Grupo ndryshimet sipas faqeve në ndryshime së fundmi dhe listën mbikqyrëse (kërkon JavaScript)",
- "tog-numberheadings": "Numëro automatikish titujt",
+ "tog-extendwatchlist": "Zgjero listën e të gjitha faqeve të vëzhguara në mënyrë që t'i tregojë të gjitha ndryshimet, jo vetëm më të fundit.",
+ "tog-usenewrc": "Grupo ndryshimet sipas faqes në ndryshimet më të fundit dhe listën e vëzhgimit (kërkon JavaScript)",
+ "tog-numberheadings": "Numërim automatik i titujve",
"tog-showtoolbar": "Shfaq shiritin e veglave të redaktorit",
"tog-editondblclick": "Redakto faqe në klikim të dyfishtë",
"tog-editsectiononrightclick": "Aktivizo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit",
"tog-watchrollback": "Shto faqet ku unë kam kryer një rikthim tek lista ime mbikqyrëse",
"tog-minordefault": "Shëno të gjitha redaktimet si të vogla automatikisht",
"tog-previewontop": "Vendose kutinë e bocetit sipër kutisë së redaktimeve",
- "tog-previewonfirst": "Tregoje bocetin në redaktimin e parë",
- "tog-enotifwatchlistpages": "Më njofto me e-mail kur ndryshohet një faqe apo skedarë nga lista ime e faqeve nën mbikqyrje",
+ "tog-previewonfirst": "Trego se si do të duket faqja pos ta filloj redaktimin",
+ "tog-enotifwatchlistpages": "Më njofto me email kur ndryshohet një faqe apo skedë nga lista ime e faqeve nën mbikqyrje",
"tog-enotifusertalkpages": "Kur faqja ime e diskutimeve e përdoruesit ndryshohet, më dërgo email",
"tog-enotifminoredits": "Më njofto me e-mail edhe kur ka redaktime të vogla në faqe dhe skedave",
"tog-enotifrevealaddr": "Tregoje adresën time të e-mail-it në e-mail-et njoftuese",
"tog-ccmeonemails": "Më dërgo kopje të mesazheve që u dërgoj të tjerëve",
"tog-diffonly": "Mos trego përmbajtjen e faqes nën diff-e",
"tog-showhiddencats": "Trego kategoritë e fshehura",
- "tog-norollbackdiff": "Ndryshimi pas rikthimit do të fshihet",
+ "tog-norollbackdiff": "Mos trego ndrysh pas kryerjes së një rikthkimi",
"tog-useeditwarning": "Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura",
"tog-prefershttps": "Gjithmonë përdorni një lidhje të sigurt kur të kyçur",
"underline-always": "Gjithmonë",
"underline-default": "Parapërcaktuar nga shfletuesi",
"editfont-style": "Zgjidh stilin e gërmave të hapsirës:",
"editfont-default": "Sipas rregullit në shfletues",
- "editfont-monospace": "Gërma monospace",
+ "editfont-monospace": "Germa me hapësirë të barabartë",
"editfont-sansserif": "Germa Sans-serif",
"editfont-serif": "Gërma serif",
"sunday": "E diel",
"listingcontinuesabbrev": "vazh.",
"index-category": "Faqe të indeksuara",
"noindex-category": "Faqe jo të indeksuara",
- "broken-file-category": "Faqet me lidhjet file thyer",
- "about": "Rreth",
+ "broken-file-category": "Faqet me lidhje të parregullta",
+ "about": "Për",
"article": "Faqja e përmbajtjes",
"newwindow": "(hapet në një dritare të re)",
"cancel": "Anulo",
"createacct-another-realname-tip": "* Emri i vërtetë nuk është i domosdoshëm: Nëse e jepni do të përmendeni si kontribues për punën që ke bërë.",
"pt-login": "Hyni",
"pt-login-button": "Hyni",
+ "pt-login-continue-button": "Vazhdoidntifikohu",
"pt-createaccount": "Krijo llogari",
"pt-userlogout": "Dil",
"php-mail-error-unknown": "Gabim i panjohur në funksionin e postës PHP ()",
"newpassword": "I riu",
"retypenew": "I riu përsëri",
"resetpass_submit": "Ndrysho fjalëkalimin dhe hyni brenda",
- "changepassword-success": "Fjalëkalimin juaj ka ndryshuar me sukses!",
+ "changepassword-success": "Fjalëkalimi yt është ndryshuar.",
"changepassword-throttled": "Keni bërë shumë tentime të njëpasnjëshme në fjalëkalimin e kësaj llogarie. Ju lutemi prisni para se te tentoni përsëri.",
+ "botpasswords": "Bot fjalëkalimet",
+ "botpasswords-label-create": "Krijo",
+ "botpasswords-label-update": "Përditëso",
+ "botpasswords-label-cancel": "Anulo",
+ "botpasswords-label-delete": "Fshi",
+ "botpasswords-label-resetpassword": "Rivendos fjalëkalimin",
+ "botpasswords-update-failed": "Dështoi për të përditësuar emrin e bot \"$1\". Ishte fshirë?",
"resetpass_forbidden": "Fjalëkalimet nuk mund të ndryshohen",
"resetpass-no-info": "Duhet të jeni i kyçur që të keni qasje direkte në këtë faqe.",
"resetpass-submit-loggedin": "Ndrysho fjalëkalimin",
"watchthis": "Vëzhgoje këtë faqe",
"savearticle": "Kryej ndryshimet",
"publishpage": "Publiko faqen",
+ "publishchanges": "Publiko ndryshimet",
"preview": "Shqyrto",
"showpreview": "Shfaq për shqyrtim",
"showdiff": "Trego ndryshimet",
"special-characters-group-lao": "Lao",
"special-characters-group-khmer": "Khmer",
"mw-widgets-dateinput-placeholder-day": "VVVV-MM-DD",
- "mw-widgets-dateinput-placeholder-month": "VVVV-MM",
- "api-error-blacklisted": "Ju lutemi zgjidhni një titull të ndryshëm, përshkrues."
+ "mw-widgets-dateinput-placeholder-month": "VVVV-MM"
}
"passwordreset-emailtext-ip": "Неко (вероватно Ви, са ИП адресе $1) је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
"passwordreset-emailtext-user": "{{GENDER:$1|Корисник је затражио|Корисница је затражила}} подсетник о подацима за пријаву на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
"passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
- "passwordreset-emailsentemail": "Ако је ово имејл адреса регистована на Вашем налогу, подсетник о лозинци ће бити послат на имејл.",
+ "passwordreset-emailsentemail": "Ако је ово имејл адреса повезана са Вашим налогом, подсетник о лозинци ће бити послат на имејл.",
"passwordreset-emailsentusername": "Ако сте навели имејл адресу приликом регистрације, биће послат имејл за ресетовање лозинке.",
"passwordreset-emailsent-capture": "Послат је подсетник преко имејла, који је приказан доле.",
"passwordreset-emailerror-capture": "Имејл за ресетовање лозинке, приказан испод је послат, али слање {{GENDER:$2|кориснику|корисници}} није успело: $1",
"minoredit": "мања измена",
"watchthis": "надгледај ову страницу",
"savearticle": "Сачувај страницу",
+ "savechanges": "Сачувај измене",
+ "publishpage": "Објави страницу",
+ "publishchanges": "Објави измене",
"preview": "Претпреглед",
"showpreview": "Прикажи претпреглед",
"showdiff": "Прикажи измене",
"userpage-userdoesnotexist": "Кориснички налог „<nowiki>$1</nowiki>“ није отворен.\nРазмислите да ли заиста желите да направите/уредите ову страницу.",
"userpage-userdoesnotexist-view": "Кориснички налог „$1“ није отворен.",
"blocked-notice-logextract": "Овај корисник је тренутно блокиран.\nИзвештај о последњем блокирању можете погледати испод:",
- "clearyourcache": "'''Напомена:''' након чувања, можда ћете морати да очистите кеш прегледача.\n*'''Фајерфокс и Сафари:''' држите ''Shift'' и кликните на ''Освежи'', или притисните ''Ctrl-F5'' или Ctrl-R (''⌘-R'' на Макинтошу)\n*'''Гугл кроум:''' притисните ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Макинтошу)\n*'''Интернет експлорер: '''држите ''Ctrl'' и кликните на ''Освежи'', или притисните ''Ctrl-F5''\n*'''Опера:''' очистите привремену меморију преко менија ''Алатке → Поставке''.",
+ "clearyourcache": "<strong>Напомена:</strong> након чувања, можда ћете морати да очистите кеш прегледача како бисте видели промене.\n* <strong>Фајерфокс / Сафари:</strong> држите <em>Shift</em> и кликните на <em>Освежи</em>, или притисните <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>⌘-R</em> на Меку)\n* <strong>Гугл кроум:</strong> притисните <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Меку)\n* <strong>Интернет експлорер:</strong> држите <em>Ctrl</em> и кликните на <em>Освежи</em> или притисните <em>Ctrl-F5</em>\n* <strong>Опера:</strong> идите на <em>Алатке → Подешавања</em> (<em>Опера → Поставке</em> на Меку) и затим <em>Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке</em>.",
"usercssyoucanpreview": "'''Савет:''' кориситите дугме „{{int:showpreview}}“ да испробате свој нови CSS пре него што га сачувате.",
"userjsyoucanpreview": "'''Савет:''' кориситите дугме „{{int:showpreview}}“ да испробате свој нови јаваскрипт пре него што га сачувате.",
"usercsspreview": "'''Ово је само преглед CSS-а.'''\n'''Страница још није сачувана!'''",
"previewnote": "<strong>Ово је претпреглед.</strong>\nВаше измене још нису сачуване!",
"continue-editing": "Иди на уређивачки оквир",
"previewconflict": "Овај преглед осликава како ће текст у текстуалном оквиру изгледати.",
- "session_fail_preview": "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''\nПокушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите.",
- "session_fail_preview_html": "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''\n\n''Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.''\n\n'''Ако сте покушали да направите праву измену, покушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите.'''",
+ "session_fail_preview": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\nМожда сте одјављени. <strong>Проверите да ли сте пријављен и покушајте поново</strong>.\n\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли су на Вашем претраживачу дозвољени колачићи са овог сајта.",
+ "session_fail_preview_html": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\n<em>Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.</em>\n\n<strong>Ако сте покушали да направите праву измену, покушајте поново.<strong>\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли Ваш претраживач дозвољава колачиће са овог сајта.",
"token_suffix_mismatch": "'''Ваша измена је одбачена јер је ваш прегледач убацио знакове интерпункције у новчић уређивања.\nТо се понекад догађа када се користи неисправан посредник.'''",
"edit_form_incomplete": "<strong>Неки делови обрасца за уређивање нису стигли до сервера. Проверите да ли су ваше измене непромењене и покушајте поново.</strong>",
"editing": "Уређујете $1",
"userrights-unchangeable-col": "Групе које не можете да промените",
"userrights-irreversible-marker": "$1*",
"userrights-conflict": "Сукоб промена корисничких права! Молимо проверите ваше измене.",
- "userrights-removed-self": "УÑ\81пеÑ\88но Ñ\81Ñ\82е Ñ\81еби Ñ\81кинÑ\83ли пÑ\80ава. Ð\97бог Ñ\82ога ниÑ\98е вам дозвољен приступ овој страници.",
+ "userrights-removed-self": "СкинÑ\83ли Ñ\81Ñ\82е Ñ\81еби пÑ\80ава. Ð\97бог Ñ\82ога Ð\92ам ниÑ\98е дозвољен приступ овој страници.",
"group": "Група:",
"group-user": "Корисници",
"group-autoconfirmed": "Аутоматски потврђени корисници",
"grant-createeditmovepage": "Прављење, уређивање и премештање страница",
"grant-delete": "Брисање страница, измена и уноса у дневницима",
"grant-editinterface": "Уређивање Медијавики именског простора и корисничких CSS/JavaScript страница",
+ "grant-editmycssjs": "Уређивање вашег CSS/JavaScript-а",
"grant-editmyoptions": "Уређивање ваших подешавања",
"grant-editmywatchlist": "Уређивање вашег списка надгледања",
"grant-editpage": "Уређивање постојећих страница",
"grant-editprotected": "Уређивање заштићених страница",
+ "grant-patrol": "Патролирање измена",
"grant-protect": "Закључавање и откључавање страница",
"grant-rollback": "Враћање измена",
+ "grant-sendemail": "Слање имејлова другим корисницима",
"grant-uploadeditmovefile": "Отпремање, замена и премештање датотека",
"grant-uploadfile": "Слање нових датотека",
"grant-basic": "Основна права",
"rightslogtext": "Ово је дневник измена корисничких права.",
"action-read": "читање ове странице",
"action-edit": "уређивање ове странице",
- "action-createpage": "напÑ\80ави овÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83",
+ "action-createpage": "пÑ\80авÑ\99еÑ\9aе Ñ\81Ñ\82Ñ\80аниÑ\86а",
"action-createtalk": "прављење страница за разговор",
"action-createaccount": "отварање овог корисничког налога",
"action-history": "гледање историје ове странице",
"uploadstash-summary": "Ова страница пружа приступ датотекама које су послате (или се шаљу), али још нису објављене. Ове датотеке су видљиве само кориснику који га је послао.",
"uploadstash-clear": "Очисти сакривене датотеке",
"uploadstash-nofiles": "Немате сакривене датотеке.",
- "uploadstash-badtoken": "Извршавање дате радње није успело. Разлог томе може бити истек времена за уређивање. Покушајте поново.",
+ "uploadstash-badtoken": "Извршавање дате радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
"uploadstash-errclear": "Чишћење датотека није успело.",
"uploadstash-refresh": "Освежи списак датотека",
"invalid-chunk-offset": "Неисправна полазна тачка",
"listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
"listgrants-rights": "Права",
"trackingcategories": "Медијавики категорије",
- "trackingcategories-summary": "Ð\9eва поÑ\81ебна Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ñ\81пиÑ\81ак каÑ\82егоÑ\80иÑ\98а коÑ\98е Ñ\81Ñ\83 део Ð\9cедиÑ\98авикиÑ\98а, оне Ñ\81е аÑ\83Ñ\82омаÑ\82Ñ\81ки ажÑ\83Ñ\80иÑ\80аÑ\98Ñ\83 и Ñ\9aиÑ\85ови називи Ñ\81е могÑ\83 меÑ\9aаÑ\9aаÑ\82и Ñ\83Ñ\80еÑ\92иваÑ\9aем Ñ\81иÑ\81Ñ\82емÑ\81киÑ\85 поÑ\80Ñ\83ка Ñ\83 именÑ\81ком пÑ\80оÑ\81Ñ\82оÑ\80Ñ\83 {{ns:8}}.",
+ "trackingcategories-summary": "Ова посебна страница је списак категорија које су део Медијавикија, оне се аутоматски ажурирају и њихови називи се могу мењати уређивањем системских порука у именском простору {{ns:8}}.",
"trackingcategories-name": "Име поруке",
"trackingcategories-desc": "Које странице се налазе у категорији",
"noindex-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__NOINDEX__</nowiki></code>.",
"tooltip-ca-nstab-category": "Погледајте страницу категорија",
"tooltip-minoredit": "Означите измену као мању",
"tooltip-save": "Сачувајте измене које сте направили",
+ "tooltip-publish": "Објави своје измене",
"tooltip-preview": "Прегледајте своје измене. Пожељно је да користите ово дугме пре чувања",
"tooltip-diff": "Погледајте све измене које сте направили на тексту",
"tooltip-compareselectedversions": "Погледаjте разлике између две изабране измене ове странице.",
"previousdiff": "← Старија измена",
"nextdiff": "Новија измена →",
"mediawarning": "<strong>Упозорење:</strong> ова врста датотеке може садржати штетан код.\nАко га покренете, Ваш рачунар може бити угрожен.",
- "imagemaxsize": "Ограничење величине слике:<br />''(на страницама за опис датотека)''",
+ "imagemaxsize": "Ограничење величине слике:<br /><em>(на страницама за опис датотека)</em>",
"thumbsize": "Величина минијатуре:",
"widthheight": "$1 × $2",
"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|страница|странице|страница}}",
"version-libraries-license": "Лиценца",
"version-libraries-description": "Опис",
"version-libraries-authors": "Аутори",
- "redirect": "Преусмерење на датотеку, корисника, страницу или измену",
+ "redirect": "Преусмерење на датотеку, корисника, страницу, измену или дневник",
"redirect-submit": "Иди",
"redirect-lookup": "Тип вредности:",
"redirect-value": "Вредност:",
"minoredit": "manja izmena",
"watchthis": "nadgledaj ovu stranicu",
"savearticle": "Sačuvaj stranicu",
+ "savechanges": "Sačuvaj izmene",
+ "publishpage": "Objavi stranicu",
+ "publishchanges": "Objavi izmene",
"preview": "Pretpregled",
"showpreview": "Prikaži pretpregled",
"showdiff": "Prikaži izmene",
"userpage-userdoesnotexist": "Korisnički nalog „<nowiki>$1</nowiki>“ nije otvoren.\nRazmislite da li zaista želite da napravite/uredite ovu stranicu.",
"userpage-userdoesnotexist-view": "Korisnički nalog „$1“ nije otvoren.",
"blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nIzveštaj o poslednjem blokiranju možete pogledati ispod:",
- "clearyourcache": "'''Napomena:''' nakon čuvanja, možda ćete morati da očistite keš pregledača.\n*'''Fajerfoks i Safari:''' držite ''Shift'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5'' ili Ctrl-R (''⌘-R'' na Makintošu)\n*'''Gugl kroum:''' pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Makintošu)\n*'''Internet eksplorer: '''držite ''Ctrl'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5''\n*'''Opera:''' očistite privremenu memoriju preko menija ''Alatke → Postavke''.",
+ "clearyourcache": "<strong>Napomena:</strong> nakon čuvanja, možda ćete morati da očistite keš pregledača kako biste videli promene.\n* <strong>Fajerfoks / Safari:</strong> držite <em>Shift</em> i kliknite na <em>Osveži</em>, ili pritisnite <em>Ctrl-F5</em> ili <em>Ctrl-R</em> (<em>⌘-R</em> na Meku)\n* <strong>Gugl kroum:</strong> pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na Meku)\n* <strong>Internet eksplorer:</strong> držite <em>Ctrl</em> i kliknite na <em>Osveži</em> ili pritisnite <em>Ctrl-F5</em>\n* <strong>Opera:</strong> idite na <em>Alatke → Podešavanja</em> (<em>Opera → Postavke</em> na Meku) i zatim <em>Privatnost i bezbednost → Očistite podatke o pregledima → Keširane slike i datoteke</em>.",
"usercssyoucanpreview": "'''Savet:''' korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi CSS pre nego što ga sačuvate.",
"userjsyoucanpreview": "'''Savet:''' korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi javaskript pre nego što ga sačuvate.",
"usercsspreview": "'''Ovo je samo pregled CSS-a.'''\n'''Stranica još nije sačuvana!'''",
"listgrouprights-namespaceprotection-restrictedto": "Prava potrebna za uređivanje",
"listgrants-rights": "Prava",
"trackingcategories": "Medijaviki kategorije",
- "trackingcategories-summary": "Ova posebna stranica je spisak kategorija koje su deo Medijavikija, one se automatski ažuriraju i njihovi nazivi se mogu menjanjati uređivanjem sistemskih poruka u imenskom prostoru {{ns:8}}.",
+ "trackingcategories-summary": "Ova posebna stranica je spisak kategorija koje su deo Medijavikija, one se automatski ažuriraju i njihovi nazivi se mogu menjati uređivanjem sistemskih poruka u imenskom prostoru {{ns:8}}.",
"trackingcategories-name": "Ime poruke",
"trackingcategories-desc": "Koje stranice se nalaze u kategoriji",
"noindex-category-desc": "Stranice koje u sebi imaju magičnu reč <code><nowiki>__NOINDEX__</nowiki></code>.",
"tooltip-ca-nstab-category": "Pogledajte stranicu kategorija",
"tooltip-minoredit": "Označite izmenu kao manju",
"tooltip-save": "Sačuvajte izmene koje ste napravili",
+ "tooltip-publish": "Objavi svoje izmene",
"tooltip-preview": "Pregledajte svoje izmene. Poželjno je da koristite ovo dugme pre čuvanja",
"tooltip-diff": "Pogledajte sve izmene koje ste napravili na tekstu",
"tooltip-compareselectedversions": "Pogledajte razlike između dve izabrane izmene ove stranice.",
"previousdiff": "← Starija izmena",
"nextdiff": "Novija izmena →",
"mediawarning": "<strong>Upozorenje:</strong> ova vrsta datoteke može sadržati štetan kod.\nAko ga pokrenete, Vaš računar može biti ugrožen.",
- "imagemaxsize": "Ograničenje veličine slike:<br />''(na stranicama za opis datoteka)''",
+ "imagemaxsize": "Ograničenje veličine slike:<br /><em>(na stranicama za opis datoteka)</em>",
"thumbsize": "Veličina minijature:",
"widthheight": "$1 × $2",
"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|stranica|stranice|stranica}}",
"Dammråtta",
"Mgr",
"Matma Rex",
- "McDutchie"
+ "McDutchie",
+ "Larske"
]
},
"tog-underline": "Stryk under länkar:",
"tagline": "Från {{SITENAME}}",
"help": "Hjälp",
"search": "Sök",
+ "search-ignored-headings": "#<!-- lämna denna rad precis som den är --> <pre>\n# Rubriker som kommer att ignoreras av sökningen.\n# Ändringar till detta kommer att gälla så fort sidan med rubriken är indexerad.\n# Du kan tvinga sidan att indexeras om genom att göra en null-redigering.\n# Syntaxen är som följer:\n# * Allt från ett \"#\" tecken till slutet av raden är en kommentar.\n# * Varje icke-tom rad är den exakta titeln som ska ignoreras, shiftläge och allt.\nReferenser\nKällor\nExterna länkar\nSe även\n #</pre> <!-- lämna denna rad precis som den är -->",
"searchbutton": "Sök",
"go": "Gå till",
"searcharticle": "Gå till",
"passwordreset-emailelement": "Användarnamn: \n$1\n\nTillfälligt lösenord: \n$2",
"passwordreset-emailsentemail": "Om denna e-postadress är associerad med ditt konto kommer en lösenordsåterställning skickas via e-post.",
"passwordreset-emailsentusername": "Om det finns en e-postadress som associeras med detta användarnamn kommer en lösenordsåterställning skickas via e-post.",
- "passwordreset-emailsent-capture": "En lösenordsåterställning via e-post har skickats, som visas nedan.",
- "passwordreset-emailerror-capture": "En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till {{GENDER:$2|användaren}}: $1",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|E-postmeddelande|E-postmeddelanden}} för återställning av lösenord har skickats. {{PLURAL:$1|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} visas nedan.",
"passwordreset-emailerror-capture2": "Kunde inte skicka e-post till {{GENDER:$2|användaren}}: $1 {{PLURAL:$3|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} listas nedan.",
"passwordreset-nocaller": "En användare måste anges",
"passwordreset-nodata": "Varken ett användarnamn eller en e-postadress angavs",
"changeemail": "Ändra eller ta bort e-postadress",
"changeemail-header": "Fyll i detta formulär för att ändra din e-postadress. Lämna fältet för ny e-postadress tomt när du skickar in formuläret om du vill ta bort en associerad e-postadress från ditt konto.",
- "changeemail-passwordrequired": "Du måste ange ditt lösenord för att bekräfta denna ändring.",
"changeemail-no-info": "Du måste vara inloggad för att komma åt den här sidan direkt.",
"changeemail-oldemail": "Nuvarande e-postadress:",
"changeemail-newemail": "Ny e-postadress:",
"content-model-css": "CSS",
"content-json-empty-object": "Tomt objekt",
"content-json-empty-array": "Tomt fält",
- "deprecated-self-close-category": "Sidan använder ogiltiga självstängda HTML-taggar",
+ "deprecated-self-close-category": "Sidor som använder ogiltiga självstängda HTML-taggar",
"deprecated-self-close-category-desc": "Sidan använder ogiltiga självstängda HTML-taggar, som <code><b/></code> eller <code><span/></code>. Beteendet för dessa kommer snart att ändras för att bli konsistent med HTML5-specifikationen, så dessa anses vara för föråldrade för att använda i wikitext.",
"duplicate-args-warning": "<strong>Varning:</strong> [[:$1]] anropar [[:$2]] med mer än ett värde för parametern \"$3\". Endast det sista värdet kommer att användas.",
"duplicate-args-category": "Sidor som använder upprepade argument i mallanrop",
"undo-nochange": "Det verkar som att redigeringen redan har blivit ogjord.",
"undo-summary": "Gör version $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]]) ogjord",
"undo-summary-username-hidden": "Gör version $1 av en dold användare ogjord",
- "cantcreateaccounttitle": "Kan inte skapa konto",
"cantcreateaccount-text": "[[User:$3|$3]] har blockerat den här IP-adressen ('''$1''') från att registrera konton.\n\nAnledningen till blockeringen var \"$2\".",
"cantcreateaccount-range-text": "IP-adresserna i intervallet <strong>$1</strong>, som inkluderar din IP-adress (<strong>$4</strong>), har blockerats från att skapa konton av [[User:$3|$3]].\n\nAnledningen enligt $3 var <em>$2</em>",
"viewpagelogs": "Visa loggar för denna sida",
"action-applychangetags": "tillämpa märken tillsammans med dina ändringar",
"action-changetags": "lägg till och ta bort godtyckliga märken på individuella sidversioner och loggposter",
"action-deletechangetags": "radera märken från databasen",
+ "action-purge": "rensa denna sida",
"nchanges": "$1 {{PLURAL:$1|ändring|ändringar}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sedan senaste besöket}}",
"enhancedrc-history": "historik",
"Tchoř",
"Timpul",
"아라",
- "Macofe"
+ "Macofe",
+ "Uostofchuodnego"
]
},
"tog-underline": "Podsztrychńyńcy linkůw:",
"listingcontinuesabbrev": "ć.d.",
"index-category": "Indeksowane zajty",
"noindex-category": "Ńyindeksowane zajty",
- "broken-file-category": "Zajty ze linkomi lo ńyistniejących ůobrozkůw",
+ "broken-file-category": "Zajty z linkami do niyôbecnych zbiorōw",
"about": "Uo serwiśe",
"article": "zajta",
"newwindow": "(uodwjyro śe we nowym uokńe)",
"unprotectthispage": "Uodymkńij ta zajta",
"newpage": "Nowy artikel",
"talkpage": "Godej uo tym artiklu",
- "talkpagelinktext": "Dyskusyjo",
+ "talkpagelinktext": "dyskusyjŏ",
"specialpage": "Szpecyjolno zajta",
"personaltools": "Perzōnŏlne",
"articlepage": "Zajta artikla",
"disclaimers": "Prawne informacyje",
"disclaimerpage": "Project:Prawne informacyje",
"edithelp": "Půmoc we půmjyńańy",
- "mainpage": "Przodńo zajta",
+ "mainpage": "Przodniŏ zajta",
"mainpage-description": "Przodńo zajta",
"policy-url": "Project:Prawidła",
"portal": "Portal używoczůw",
"newmessageslinkplural": "{{PLURAL:$1|jedno nowina|999=nowiny}}",
"newmessagesdifflinkplural": "{{PLURAL:$1|uostatńe sprowjyńe|999=uostatńe sprowjyńa}}",
"youhavenewmessagesmulti": "Mosz nowe powjadůmjyńa: $1",
- "editsection": "Sprowjej",
+ "editsection": "edytuj",
"editold": "sprowjej",
"viewsourceold": "pokoż zdrzůdło",
"editlink": "sprowjej",
"viewsourcelink": "zdrzůdłowy tekst",
- "editsectionhint": "Sprowjej tajla: $1",
+ "editsectionhint": "Edytuj tajlã: $1",
"toc": "Treść",
"showtoc": "uobejrzij",
"hidetoc": "schrůń",
"nstab-template": "Muster",
"nstab-help": "Zajta půmocy",
"nstab-category": "Kategoryjo",
+ "mainpage-nstab": "Przodniŏ zajta",
"nosuchaction": "Ńy mo takij uoperacyji",
"nosuchactiontext": "Uoprogramowańy ńy rozpoznowo uoperacyji takij kej podano w URL.",
"nosuchspecialpage": "Ńy mo takij szpecyjolnyj zajty",
"resetpass-abort-generic": "Půmjyńańe hasła uostoła zatrzimane bez rozszyrzyńe.",
"passwordreset": "Wyczyść hasło",
"passwordreset-disabled": "No tyj wiki zamkńynto resytowańy hasył.",
- "passwordreset-username": "Mjano używacza:",
+ "passwordreset-username": "Miano ôd używŏcza:",
"passwordreset-domain": "Domyna:",
"passwordreset-capture": "Pokozać treść e-brifa?",
"passwordreset-capture-help": "Eli zaznaczysz to pole, uobejrzisz wjadůmość e-brifa ze hasłym.",
"passwordreset-emailtext-ip": "Ftoś (cheba Ty, s IP $1)\npado, aże chce informacyji lo konta do {{GRAMMAR:MS.lp{{SITENAME}}}} ($4).\nZe tym ausdrukym sům powjůnzane kůnta:\n$2\n\n{{PLURAL:$3|Tymczasowygo hasła|Tymczasowych hasył}} możno użyć we {{PLURAL:$5|jedyn dźyń|$5 dńi}}.\n\nJak chćołżeś gynał to zrobjyć, to zaloguj śe terozki a podej swoje hasło.\n\nJak ftoś inkszy chćoł nowe hasło abo jak Ci śe przipůmńoło stare a ńy chcysz nowygo, to zignoruj to a używej starygo hasła.",
"passwordreset-emailelement": "Mjano sprowjorza: \n$1\n\nTymczasowe hasło: \n$2",
"passwordreset-emailsentemail": "E-brif posłany.",
- "passwordreset-emailsent-capture": "E-brif posłony, kerego widać niżej.",
- "passwordreset-emailerror-capture": "Ńy udoło śe posłać wjadomości lo {{GENDER:$2|używocza|używoczki}}: $1",
"changeemail": "Pomjyno ausdruka e-mail",
"changeemail-header": "Pomjyno ausduku e-mail",
"changeemail-no-info": "Muśisz być zalogowany, coby uzyskać bezpostrzedńi dostymp do tyj zajty.",
"undo-failure": "Sprowjyńo ńy idźe wycofać skuli kůnflikta ze wersyjůma postrzedńimi.",
"undo-norev": "Sprowjyńo ńy idźe cofnůńć skuli tego, co ńy istńije abo uostoło wyćepane.",
"undo-summary": "Wycůfańy wersyji $1 naszkryflanej bez [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]])",
- "cantcreateaccounttitle": "Ńy do śe utworzić kůnta",
"cantcreateaccount-text": "Tworzyńy kůnta s tygo adresu IP ('''$1''') uostoło zawarte bez użytkowńika [[User:$3|$3]].\n\nSkuli: ''$2''",
"viewpagelogs": "Uobocz rejery uoperacyji lo tyj zajty",
"nohistory": "Ta zajta ńy mo swojij historyje sprowjyń.",
"skin-preview": "podglůnd",
"datedefault": "Důmyślny",
"prefs-labs": "Funkcyje \"labs\"",
- "prefs-user-pages": "Zajty używaczy",
+ "prefs-user-pages": "Zajty ôd używŏczōw",
"prefs-personal": "Dane używocza",
"prefs-rc": "Ńydowno pomjyńane",
"prefs-watchlist": "Pozůrlista",
"userrights-changeable-col": "Grupy, kere moges wybrać",
"userrights-unchangeable-col": "Grupy, kerych ńy moges wybrać",
"group": "Grupa:",
- "group-user": "Używacze",
- "group-autoconfirmed": "AutůmatyczÅ\84y zatwjerdzůne używacze",
+ "group-user": "Używŏcze",
+ "group-autoconfirmed": "AutÅ\8dmatycznie przituplowani używÅ\8fcze",
"group-bot": "Boty",
"group-sysop": "Admińi",
"group-bureaucrat": "Bjurokraty",
"group-suppress": "Rewizorze",
"group-all": "(wszyjscy)",
- "group-user-member": "{{GENDER:$1|używacz}}",
- "group-autoconfirmed-member": "AutůmatyczÅ\84y zatwjerdzůny używacz",
+ "group-user-member": "{{GENDER:$1|używŏcz|używŏczka}}",
+ "group-autoconfirmed-member": "AutÅ\8dmatycznie {{GENDER:$1|przituplowany używÅ\8fcz|przituplowanÅ\8f używÅ\8fczka}}",
"group-bot-member": "{{GENDER:$1|bot}}",
"group-sysop-member": "{{GENDER:$1|admin}}",
"group-bureaucrat-member": "{{GENDER:$1|bjurokrata}}",
"group-suppress-member": "{{GENDER:$1|rewizůr}}",
- "grouppage-user": "{{ns:project}}:Używacze",
- "grouppage-autoconfirmed": "{{ns:project}}:AutůmatyczÅ\84y zatwjerdzyÅ\84i używacze",
+ "grouppage-user": "{{ns:project}}:Używŏcze",
+ "grouppage-autoconfirmed": "{{ns:project}}:AutÅ\8dmatycznie przituplowani używÅ\8fcze",
"grouppage-bot": "{{ns:project}}:Boty",
"grouppage-sysop": "{{ns:project}}:Admińistratory",
"grouppage-bureaucrat": "{{ns:project}}:Bjurokraty",
"nopagetitle": "Ńy ma sam zajty docelowyj",
"nopagetext": "Wybrano zajta docelowo ńy istńeje.",
"pager-newer-n": "{{PLURAL:$1|1 nowšy|$1 nowše|$1 nowšych}}",
- "pager-older-n": "{{PLURAL:$1|1 staršy|$1 starše|$1 staršych}}",
+ "pager-older-n": "{{PLURAL:$1|1 starszy|$1 starsze|$1 starszych}}",
"suppress": "Oversight",
"booksources": "Kśůnžki",
"booksources-search-legend": "Sznupej za zdrzůdłůma kśůnżkowymi",
"listusers-noresult": "Ńy znejdźůno žodnygo užytkowńika.",
"activeusers-hidebots": "Schrůń boty",
"activeusers-hidesysops": "Schrůń adminy",
- "activeusers-noresult": "Ńy sům używacze.",
+ "activeusers-noresult": "Niy szło znŏjść żŏdnych używŏczōw",
"listgrouprights": "Uprawńyńo grup użytkowńikůw",
"listgrouprights-summary": "Půńiży znojdowo śe spis grup użytkowńikůw zdefińjowanych na tyj wiki, s wyszczygůlńyńym przidźelůnych im prow dostympu.\nSprowdź zajta [[{{MediaWiki:Listgrouprights-helppage}}|s dodatkowymi informacjami]] uo uprowńyńach użytkowńikůw.",
"listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dane uprawńyńy</span>\n* <span class=\"listgrouprights-revoked\">Uodebrane uprawńyńy</span>",
"mailnologintext": "Muśyš śe [[Special:UserLogin|zalůgować]] i mjeć wpisany aktualny adres e-brif w swojich [[Special:Preferences|preferyncyjach]], coby můc wysuać e-brif do inkšygo užytkowńika.",
"emailuser": "Poślij tymu używoczowi e-brif",
"emailpagetext": "Możesz użyć půńiższygo formularza, coby wysłać wjadůmość e-brif do tygo użytkowńika.\nAdres e-brifa, kery zostoł bez Ćebje wkludzůny we [[Special:Preferences|Twojich sztalowańach]], pojawi śe we polu „Uod”, bez cůż uodbjorca bydźe můg Ći uodpedźeć.",
- "defemailsubject": "{{SITENAME}} - e-brif uod używacza \"$1\"",
- "usermaildisabled": "E-brif używacza ńy załůnczony",
+ "defemailsubject": "{{SITENAME}} - e-mail ôd używŏcza \"$1\"",
+ "usermaildisabled": "E-mail ôd używŏcza je zastŏwiōny",
"noemailtitle": "Brak adresu e-brif",
- "noemailtext": "Tyn używacz ńy podoł dobrygo e-brifa, abo zadecydowoł, co ńy chce uotrzimywać wjadůmośći e-brif uod inkszych używaczy.",
- "nowikiemailtext": "Tyn sprowjorz ńy chcy e-brifůw uod inkszych używaczy.",
+ "noemailtext": "Tyn używŏcz niy podoł nŏleżnyj adresy email.",
+ "nowikiemailtext": "Tyn używŏcz niy chce dostŏwać emaili ôd inkszych.",
"emailtarget": "Podej adresata",
- "emailusername": "Mjano używacza:",
+ "emailusername": "Miano ôd używŏcza:",
"emailusernamesubmit": "Poślij",
"email-legend": "Wyślij e-brif ku inkszymu użytkowńikowi {{GRAMMAR:MS.lp|{{SITENAME}}}}",
"emailfrom": "Uod:",
"delete-confirm": "Wyćep „$1”",
"delete-legend": "Wyćep",
"historywarning": "Pozor! Ta zajta kerům chceš wyćepnůńć mo historjo:",
- "confirmdeletetext": "Chceš wyćepnůńć trwale artikel abo plik s bazy danych s historią. Pokož, aže wjyš co robdza, i to aže to je tak jak godojům [[{{MediaWiki:Policy-url}}|zasady]].",
+ "confirmdeletetext": "Zarŏz wyciepniesz artikel i cołkõ ôd niygo historyjõ. Przitupluj, iże na isto chcesz to zrobić, miarkujesz kōnsekwyncyje, i co robisz to podle [[{{MediaWiki:Policy-url}}|prawideł]].",
"actioncomplete": "Fertig",
"actionfailed": "Ńy udało sie.",
"deletedtext": "Wyćepano \"$1\". Rejer uostatnio zrobiůnych wyćepań možeš uobejžyć tukej: $2.",
"contribsub2": "Lo {{GENDER:$3|używocza|używoczki}} $1 ($2)",
"nocontribs": "Brak pomjyńań uodpowjadajůncych tym kryterjům.",
"uctop": "(teroźńo)",
- "month": "Uod mjeśůnca (i downiyjše):",
- "year": "Uod roku (i dowńijše):",
+ "month": "Do miesiōnca:",
+ "year": "Do roku:",
"sp-contributions-newbies": "Pokoż ajnzac ino uod nowych użytkowńikůw",
"sp-contributions-newbies-sub": "Dlo nowych užytkowńikůw",
"sp-contributions-newbies-title": "Wkłod nowych użytkowńików",
"tooltip-pt-logout": "Uodloguj śe ze wiki",
"tooltip-pt-createaccount": "Namawjůmy do stworzyńo kůnta a zalogůwańo śa, atoli niy je to uobowjůnzkowe",
"tooltip-ca-talk": "Dyskusyjo uo tym artiklu",
- "tooltip-ca-edit": "Mogesz sprowjać ta zajta. Podwjela spamjyntosz půmjyńańo, klikńij we knefel \"Uobźyrej\".",
+ "tooltip-ca-edit": "Edytuj tã zajtã",
"tooltip-ca-addsection": "Przidej nowy temat",
"tooltip-ca-viewsource": "Ta zajta je zawrzito. Mogesz uobźyrać zdrzůdłowy tekst.",
"tooltip-ca-history": "Storsze wersyje tyj zajty",
"tooltip-ca-nstab-main": "Uobźyrej zajta artikla",
"tooltip-ca-nstab-user": "Ukoż perzůnalno zajta używocza",
"tooltip-ca-nstab-media": "Uobejřij zajta artikla",
- "tooltip-ca-nstab-special": "To je ekstra zajta. Ńy moges jej sprowjać.",
+ "tooltip-ca-nstab-special": "To je ekstra zajta i niy idzie jij edytować",
"tooltip-ca-nstab-project": "Uobejřij zajta projektu",
"tooltip-ca-nstab-image": "Ukoż zajta grafiki",
"tooltip-ca-nstab-mediawiki": "Zoboč komunikat systymowy",
"tooltip-ca-nstab-template": "Uobźyrej muster",
- "tooltip-ca-nstab-help": "Pokož zajte s půmocą",
+ "tooltip-ca-nstab-help": "Pokŏż zajtã pōmocy",
"tooltip-ca-nstab-category": "Ukoż zajta kategoryje",
"tooltip-minoredit": "Uoznacz ta zmjana za drobno",
"tooltip-save": "Naszkryflej půmjyńańa",
"exif-exposureprogram-5": "kreatywny (duža guymbja uostrośći)",
"exif-exposureprogram-6": "aktywny (dužo gibkość migawki)",
"exif-exposureprogram-7": "tryb portretowy (do zdjyńć s bliska, s ńyuostrym tuym)",
- "exif-exposureprogram-8": "tryb krajobrazowy (dla zdjęć wykůnywanych s dužej uodlyguośći s uostrośćům ustavjůnům na tuo)",
+ "exif-exposureprogram-8": "tryb landszaftu (dlŏ bildōw ze ôstrościōm nasztalowanōm na zadek)",
"exif-subjectdistance-value": "$1 metrůw",
"exif-meteringmode-0": "ńyuokryślůny",
"exif-meteringmode-1": "średńo",
"exif-gpsdirection-t": "kerůnek geůgrafičny",
"exif-gpsdirection-m": "kerůnek magnetyčny",
"namespacesall": "wszyjske",
- "monthsall": "wšyskie",
+ "monthsall": "wszyjske",
"confirmemail": "Potwjerdź adres e-brif",
"confirmemail_noemail": "Ńy podoužeś prawiduowygo adresa e-brifa we [[Special:Preferences|preferencyjach]].",
"confirmemail_text": "Projekt {{SITENAME}} wymago weryfikacyji adresa e-brif před užyćym fůnkcyji kořistajůncych s počty.\nWćiś knefel půńižy coby wysúać na swůj adres list s linkym do zajty WWW.\nList bydźe zawjeroú link do zajty, w kerym zakodowany bydźe idyntyfikator.\nUodymkńij tyn link we přyglůndarce, čym potwjerdźiš, co ježeś užytkowńikym tygo adresa e-brif.",
"mainpage-description": "ಮುಖ್ಯ ಪುಟ",
"policy-url": "Project:ನಿಯಮಾವಳಿ",
"portal": "ಸಮುದಾಯೊ ಪುಟೊ",
- "portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
+ "portal-url": "Project:ಸಮುದಾಯ ಪುಟೊ",
"privacy": "ಕಾಸಗಿ ಕಾರ್ಯೊನೀತಿ",
"privacypage": "Project:ಕಾಸಗಿ ಕಾರ್ಯೊನೀತಿ",
"badaccess": "ಅನುಮತಿ ದೋಷ",
"createacct-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
"createacct-another-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
"createacct-benefit-heading": "{{SITENAME}}ನಿಕ್ಲೆನಂಚಿತ್ತಿನ ಜನೊಕ್ಲೆಡ್ದ್ ಉಂಡಾಪುಂಡು.",
- "createacct-benefit-body1": "{{PLURAL:$1|ಸà²\82ಪದನà³\86|ಸà²\82ಪದನೆಲು}}",
+ "createacct-benefit-body1": "{{PLURAL:$1|ಸà²\82ಪà³\8aದನà³\86|ಸà²\82ಪದà³\8aನೆಲು}}",
"createacct-benefit-body2": "{{PLURAL:$1|ಪುಟೊ|ಪುಟೊಕ್ಕುಲು}}",
"createacct-benefit-body3": "{{PLURAL:$1|ಇನಾಮು|ಇನಾಮುಲು}}",
"badretype": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
"minoredit": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
"watchthis": "ಈ ಪುಟೊನು ತೂಲೆ",
"savearticle": "ಪುಟೊನು ಒರಿಪಾಲೆ",
- "savechanges": "ಬದಲಾವಣà³\86ನà³\8d à²\92ರಿಪಾಲà³\87",
+ "savechanges": "ಬದಲಾವನà³\86ನà³\8d à²\92ರಿಪಾಲà³\86",
"publishpage": "ಪುಟೋನು ಪ್ರಕಟಿಸಲೇ",
- "publishchanges": "ಬದಲಾವಣà³\86ನà³\8d ತà³\8bà²\9cಾಲà³\87",
+ "publishchanges": "ಬದಲಾವನà³\86ನà³\8d ತà³\8bà²\9cಾಲà³\86",
"preview": "ಮುನ್ನೋಟ",
"showpreview": "ಮುನ್ನೋಟೊ ತೋಜಾವು",
"showdiff": "ಬದಲಾವಣೆಲೆನ್ ತೋಜಾವ್",
"template-protected": "(ಸಂರಕ್ಷಿತೊ)",
"template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತೊ)",
"hiddencategories": "ಈ ಪುಟೊ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗೊಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್ನ್ಡ್:",
+ "permissionserrors": "ಅನುಮತಿ ದೋಷ",
"permissionserrorstext-withaction": "$2 ಗ್ ಇರೆಗ್ ಅನುಮತಿ ಇದ್ದಿ, ಅಯಿಕ್ {{PLURAL:$1|ಕಾರಣೊ|ಕಾರಣೊಲು}}:",
"moveddeleted-notice": "ಈ ಪುಟೊ ಅಸ್ತಿತ್ವೊಡ್ ಇದ್ದಿ.\nಪುಟೊದ ಡಿಲೀಶನ್ ಅತ್ತ್ಂಡ್ ಕಡಪ್ಪುಡುನೆ ಲಾಗ್ನ್ ತೂಯರೆ ತಿರ್ತ್ ಕೊರ್ತ್ಂಡ್.",
+ "content-model-wikitext": "ವಿಕಿ ಪಠ್ಯ",
"viewpagelogs": "ಈ ಪುಟೊತ ದಾಕಲೆಲೆನ್ ತೂಲೆ",
"nohistory": "ಈ ಪುಟಕ್ ಬದಲಾವಣೆದ ಇತಿಹಾಸ ಇಜ್ಜಿ",
"currentrev": "ಇತ್ತೆದ ಆವೃತ್ತಿ",
"mergehistory-reason": "ಕಾರಣ:",
"revertmerge": "ಅನ್-ಮರ್ಜ್ ಮಲ್ಪುಲೆ",
"history-title": "\"$1\" ಪುಟೊತ ಆವೃತ್ತಿ ಇತಿಹಾಸೊ",
- "difference-title": "ಪಿರ ಪರಿಸà³\80ಲನà³\86ದ ನಡà³\81ತ ವà³\8dಯತà³\8dವಾಸೊ \"$1\"",
+ "difference-title": "ಪಿರ ಪರಿಸà³\80ಲನà³\86ದ ನಡà³\81ತ ವà³\8dಯತà³\8dಯಾಸೊ \"$1\"",
"lineno": "$1ನೇ ಸಾಲ್:",
"compareselectedversions": "ಆಯ್ಕೆ ಮಲ್ತಿನ ಆವೃತ್ತಿಲೆನ್ ಹೊಂದಾಣಿಕೆ ಮಲ್ತ್ ತೂಲೆ",
"editundo": "ದುಂಬುದಲೆಕೊ",
"notextmatches": "ವಾ ಪುಟೊತ ಪಠ್ಯೊಡುಲಾ ಹೋಲಿಕೆ ಇಜ್ಜಿ",
"prevn": "ದುಂಬು {{PLURAL:$1|$1}}",
"nextn": "ಬೊಕ್ಕೊ {{PLURAL:$1|$1}}",
+ "prev-page": "ದುಂಬುತ ಪುಟೊ",
+ "next-page": "ನನತಾ ಪುಟ",
"nextn-title": "ದುಂಬುದ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊಲು}}",
"shown-title": "ಪ್ರತಿ ಪುಟೊಡುಲಾ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊ}} ತೋಜಿಪಾವು",
"viewprevnext": "ತೂಲೆ($1 {{int:pipe-separator}} $2) ($3)",
"prefs-skin": "ಸ್ಕಿನ್",
"skin-preview": "ಮುನ್ನೋಟೊ",
"datedefault": "ಒವ್ವೇ ಪ್ರಾಸಸ್ತ್ಯೊ ಇದ್ದಿ",
+ "prefs-user-pages": "ಸದಸ್ಯೆರೆನ ಪುಟೊ",
"prefs-rc": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
+ "prefs-watchlist": "ವೀಕ್ಷಣಾಪಟ್ಟಿ",
"prefs-resetpass": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
"prefs-changeemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ ಅತ್ತಂಡ ದೆಪ್ಪುಲೆ",
"prefs-setemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಸ್ತಾಪನೆ ಮಲ್ಪು",
"prefs-tokenwatchlist": "ಟೊಕನ್",
"userrights-lookup-user": "ಬಳಕೆದಾರೆರೆ ಗುಂಪುಲೆನ್ ನಿರ್ವಹಿಸಲ",
"userrights-user-editname": "ಒಂಜಿ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
+ "userrights-reason": "ಕಾರಣೊ:",
"group": "ಗುಂಪುಲು:",
"group-user": "ಬಳಕೆದಾರೆರ್",
"group-sysop": "ನಿರ್ವಾಹಕೆರ್",
"right-writeapi": "ಬರೆಯಿನ ಎಪಿಐದ ಬಳಕೆ",
"right-delete": "ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ",
"right-undelete": "ಪುಟೊನ್ ಮಾಜಾವಡೆ",
+ "grant-group-email": "ಇ-ಅಂಚೆ ಕಡಪುಡುಲೆ",
"newuserlogpage": "ಸದಸ್ಯೆರೆ ಸ್ರಿಸ್ಟಿದ ದಾಕಲೆ",
"rightslog": "ಸದಸ್ಯೆರ್ನ ಹಕ್ಕು ದಾಖಲೆ",
"action-read": "ಈ ಪುಟೊನು ಓದುಲೆ",
"recentchanges-label-plusminus": "ಬೈಟ್ಸ್ದ ಲೆಕ್ಕೊಡು ಈ ಪಾಲೆದ ಗಾತ್ರೊ ಬದಲಾತ್ಂಡ್",
"recentchanges-legend-heading": "<strong>ಲೆಜೆಂಡ್:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
+ "recentchanges-submit": "ತೋಜಾಲೆ",
"rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
"rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
"rcshowhideminor-show": "ತೋಜಾಲೆ",
"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": "ಅಡೆಂಗಾವು",
+ "rcshowhidecategorization-show": "ತೋಜಾಲೆ",
+ "rcshowhidecategorization-hide": "ಅಡೆಂಗಾವು",
"rclinks": "ದುಂಬುದ $2 ದಿನೊಲೆಡ್ ಮಲ್ತಿನ $1 ಪಿರವುದ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ <br />$3",
"diff": "ವ್ಯತ್ಯಾಸೊ",
"hist": "ಇತಿಹಾಸೊ",
"uploadlogpage": "ಅಪ್ಲೋಡ್ ದಾಖಲೆ",
"filename": "ಕಡತದ ಪುದರ್",
"filedesc": "ಸಾರಾಂಸೊ",
+ "fileuploadsummary": "ಸಾರಾಂಸೊ:",
"filesource": "ಮೂಲ",
"savefile": "ಕಡತನ್ ಒರಿಪಾಲೆ",
"upload-source": "ಮೂಲ ಕಡತ",
+ "upload-file-error": "ಆ೦ತರಿಕ ದೋಷ",
+ "upload-dialog-button-cancel": "ವಜಾ ಮಲ್ಪುಲೆ",
+ "upload-dialog-button-done": "ಆಂಡ್",
+ "upload-dialog-button-save": "ಒರಿಪಾಲೆ",
+ "upload-dialog-button-upload": "ಅಪ್ಲೊಡ್",
+ "upload-form-label-infoform-title": "ವಿವರೊ",
+ "upload-form-label-infoform-name": "ಪುದರ್",
+ "upload-form-label-infoform-description": "ವಿವರಣೆ",
+ "upload-form-label-usage-filename": "ಕಡತದ ಪುದರ್",
+ "upload-form-label-infoform-categories": "ವರ್ಗೊಲು",
+ "upload-form-label-infoform-date": "ದಿನೊ",
+ "license": "ಪರವಾನಗಿ:",
"license-header": "ಪರವಾನಿಗೆ",
+ "listfiles-delete": "ಮಾಜಾಲೆ",
"imgfile": "ಫೈಲ್",
+ "listfiles_thumb": "ಎಲ್ಯಚಿತ್ರೊ",
+ "listfiles_date": "ದಿನೊ",
+ "listfiles_name": "ಪುದರ್",
+ "listfiles_user": "ಬಳಕೆದಾರೆರ್",
+ "listfiles_size": "ಗಾತ್ರೊ",
+ "listfiles_description": "ವಿವರಣೆ",
+ "listfiles_count": "ಆವೃತ್ತಿಲು",
+ "listfiles-latestversion-yes": "ಅಂದ್",
+ "listfiles-latestversion-no": "ಅತ್ತ್",
"file-anchor-link": "ಫೈಲ್",
"filehist": "ಫೈಲ್ದ ಇತಿಹಾಸೊ",
"filehist-help": "ದಿನೊ/ಪೊರ್ತುದ ಮಿತ್ತ್ ಒತ್ತ್ಂಡ ಈ ಫೈಲ್ದ ನಿಜೊಸ್ತಿತಿ ತೋಜುಂಡು.",
"filehist-deleteall": "ಮಾತಾ ಮಾಜಾಲೆ",
"filehist-deleteone": "ಮಾಜಾಲೆ",
+ "filehist-revert": "ದುಂಬುದ ಲೆಕ ಮಲ್ಪುಲೆ",
"filehist-current": "ಇತ್ತೆದ",
"filehist-datetime": "ದಿನೊ/ಪೊರ್ತು",
"filehist-thumb": "ಎಲ್ಯಚಿತ್ರೊ",
"sharedupload": "ಈ ಫೈಲ್’ನ್ ಮಸ್ತ್ ಜನ ಪಟ್ಟ್’ದುಲ್ಲೆರ್ ಅಂಚೆನೆ ಉಂದು ಮಸ್ತ್ ಪ್ರೊಜೆಕ್ಟ್’ಲೆಡ್ ಉಪಯೋಗಡುಪ್ಪು.",
"sharedupload-desc-here": "ಈ ಪುಟೊ $1ಡ್ದ್ ಬೊಕ್ಕ ಬೇತೆ ಯೋಜನೆಡ್ದ್ ಗಳಸೊಲಿ.\nಈ ಪುಟೊತ ವಿವರೊ [$2 ಪುಟೊತ ವಿವರೊ] ತಿರ್ತ ಸಾಲ್ಡ್ ತೋಜಾದ್ಂಡ್",
"upload-disallowed-here": "ಈರ್ ಈ ಫೈಲ್ನ್ ಕುಡೊರೊ ಬರೆವರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
+ "filerevert-comment": "ಕಾರಣ:",
+ "filerevert-submit": "ದುಂಬುದ ಲೆಕ ಮಲ್ಪುಲೆ",
"filedelete-comment": "ಕಾರಣ",
"filedelete-submit": "ಮಾಜಾಲೆ",
+ "filedelete-reason-otherlist": "ಬೇತೆ ಕಾರಣ",
+ "download": "ಡೌನ್ಲೋಡ್",
"randompage": "ಯಾದೃಚ್ಛಿಕ ಪುಟೊ",
+ "randomincategory-submit": "ಪೋಲೆ",
"statistics": "ಅಂಕಿ ಅಂಶೊಲು",
"statistics-header-pages": "ಪುಟೊತ ಅಂಕಿ ಅಂಶಲು",
+ "statistics-pages": "ಪುಟಕುಲು",
+ "pageswithprop-submit": "ಪೋಲೆ",
+ "brokenredirects-edit": "ಸಂಪೊಲಿಪುಲೆ",
+ "brokenredirects-delete": "ಮಾಜಾಲೆ",
+ "withoutinterwiki-submit": "ತೋಜಾಲೆ",
"nbytes": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್ಲು}}",
"nmembers": "$1 {{PLURAL:$1|ಸದಸ್ಯೆ|ಸದಸ್ಯೆರ್}}",
"wantedfiles": "ಬೋಡಾಯಿನ ಕಡತೊಲು",
"prefixindex": "ಪೂರ್ವನಾಮೊಲ್ದ ಸೂಚಿಕೆ",
+ "prefixindex-submit": "ತೋಜಾಲೆ",
+ "protectedpages-page": "ಪುಟೊ",
+ "protectedpages-reason": "ಕಾರಣೊ",
+ "protectedpages-unknown-timestamp": "ಗೊತ್ತಿಜ್ಜಾಂದಿನ",
"listusers": "ಬಳಕೆದಾರರೆನ ತಖ್ತೆ",
"newpages": "ಪೊಸ ಪುಟೊಲು",
+ "newpages-submit": "ತೋಜಾಲೆ",
"newpages-username": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
"move": "ಮೂವ್(ಸ್ಥಳಾಂತರ) ಮಲ್ಪುಲೆ",
"movethispage": "ಈ ಪುಟೊನು ಮೂವ್ ಮಲ್ಪುಲೆ",
"pager-newer-n": "{{PLURAL:$1|ಪೊಸ ೧|ಪೊಸ $1}}",
"pager-older-n": "{{PLURAL:$1|ಪರತ್ತ್ ೧|ಪರತ್ತ್ $1}}",
+ "apisandbox-reset": "ಮಾಜಲೇ",
+ "apisandbox-retry": "ನನೊರ ಪ್ರಯತ್ನ ಮಾನ್ಪುಲೇ",
+ "apisandbox-examples": "ಉದಾಹರಣೆಲು",
+ "apisandbox-results": "ಪಲಿತಾಂಸೊ",
"booksources": "ಬೂಕುದ ಮೂಲೊ",
"booksources-search-legend": "ಬೂಕುದ ಮೂಲೊನು ನಾಡ್ಲೆ",
"booksources-search": "ನಾಡ್ಲೆ",
"log": "ದಾಕಲೆಲು",
+ "logeventslist-submit": "ತೋಜಾಲೆ",
+ "checkbox-all": "ಮಾತಾ",
+ "checkbox-none": "ಒವ್ವುಲಾ ಇಜ್ಜಿ",
"allpages": "ಪೂರಾ ಪೂಟೊಲು",
"allpagesfrom": "ಇಂದೆರ್ದ್ ಶುರುವಾಪುನ ಪುಟೊಲೆನ್ ತೊಜ್ಪಾವು:",
"allpagesto": "ಇಂದೆರ್ದ್ ಅಂತ್ಯ ಆಪುನ ಪುಟೊಲೆನ್ ತೊಜ್ಪಾವು:",
"allarticles": "ಮಾತ ಪುಟೊಲು",
"allpagessubmit": "ಪೋಲೆ",
"categories": "ವರ್ಗೊಲು",
+ "categories-submit": "ತೋಜಾಲೆ",
+ "sp-deletedcontributions-contribs": "ಕಾನಿಕೆಲು",
+ "linksearch-ok": "ನಾಡ್ಲೆ",
+ "listusers-submit": "ತೋಜಾಲೆ",
+ "listgrouprights-group": "ಗುಂಪು",
"listgrouprights-members": "(ಸದಸ್ಯೆರ್ನ ಪಟ್ಟಿ)",
+ "listgrants-rights": "ಹಕ್ಕುಗಳು",
"emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೈಲ್ ಕಡಪುಡ್ಲೆ",
+ "emailusername": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
+ "emailusernamesubmit": "ಒಪ್ಪಿಸಾಲೆ",
+ "emailsubject": "ವಿಷಯ:",
+ "emailmessage": "ಸಂದೇಶಲು:",
+ "emailsend": "ಕಡಪುಡುಲೆ",
"watchlist": "ವೀಕ್ಷಣಾ ಪಟ್ಟಿ",
"mywatchlist": "ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿ",
"watch": "ತೂಲೆ",
"watchthispage": "ಈ ಪುಟೊನು ತೂಲೆ",
"unwatch": "ವೀಕ್ಷಣಾಪಟ್ಟಿರ್ದ್ ದೆಪ್ಪು",
+ "watchlist-hide": "ಅಡೆಂಗಾವು",
+ "watchlist-submit": "ತೋಜಾವು",
+ "wlshowhideminor": "ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
"watchlist-options": "ವೀಕ್ಷಣಾಪಟ್ಟಿ ಆಯ್ಕೆಲು",
"watching": "ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾವೊಂದುಂಡು...",
"unwatching": "ವೀಕ್ಷಣಾಪಟ್ಟಿರ್ದ್ ದೆತ್ತೊಂದುಂಡು...",
+ "confirm": "ಗಟ್ಟಿಮಲ್ಪುಲೆ",
+ "delete-legend": "ಮಾಜಾಲೆ",
+ "historyaction-submit": "ತೋಜಾಲೆ",
"actioncomplete": "ಕಾರ್ಯ ಸಂಪೂರ್ಣ",
"dellogpage": "ಡಿಲೀಟ್ ಮಲ್ತಿನ ಫೈಲ್ದ ದಾಕಲೆ",
+ "deletecomment": "ಕಾರಣ:",
+ "deletereasonotherlist": "ಬೇತೆ ಕಾರಣ",
"rollbacklink": "ಪುಡತ್ತ್ ಪಾಡ್",
"rollbacklinkcount": "ಪಿರ ದೆತೊನ್ಲೆ $1 {{PLURAL:$1|edit|ಸಂಪದನೆಲು}}",
+ "changecontentmodel-reason-label": "ಕಾರಣ:",
+ "changecontentmodel-submit": "ಬದಲಾವಣೆ",
+ "logentry-contentmodel-change-revertlink": "ದುಂಬುದ ಲೆಕ ಮಲ್ಪುಲೆ",
+ "logentry-contentmodel-change-revert": "ದುಂಬುದ ಲೆಕ ಮಲ್ಪುಲೆ",
"protectlogpage": "ಸೇರಾಯಿನ ದಾಕಲೆ",
"protectedarticle": "\"[[$1]]\" ಸಂರಕ್ಷಿತವಾದುಂಡು.",
"modifiedarticleprotection": "\"[[$1]]\" ಪುಟೊತ ಸಂರಕ್ಷಣೆ ಮಟ್ಟ ಬದಲಾಂಡ್",
+ "protectcomment": "ಕಾರಣೊ:",
+ "protect-otherreason-op": "ಬೇತೆ ಕಾರಣ",
+ "restriction-type": "ಒಪ್ಪುಗೆ:",
+ "restriction-edit": "ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
+ "restriction-move": "ಸ್ಥಳಾಂತರ ಮಲ್ಪುಲೆ",
+ "restriction-create": "ಸೃಷ್ಟಿಸಾಲೆ",
+ "restriction-upload": "ಅಪ್ಲೊಡ್",
"undeletelink": "ದುಂಬುದ ಆವೃತ್ತಿಗ್ ಪೋಲೆ",
"undeleteviewlink": "ತೂಲೆ",
+ "undeletecomment": "ಕಾರಣೊ:",
+ "undelete-search-submit": "ನಾಡ್ಲೆ",
+ "undelete-show-file-submit": "ಅಂದ್",
"namespace": "ಪುದರ್ದ ಬಗೆ:",
"invert": "ಆಯ್ಕೆನ್ ತಿರ್ಗಾಲೆ",
"tooltip-invert": "ಈ ಚೌಕೊದುಲಯಿಡ್ ಅಡೆಂಗಿನ ಪುದರ್ನ್ ಈ ಚೌಕೊಡೆ ಪರೀಕ್ಷಿಸಲೆಲೆ(ಬೊಕ್ಕೊ ಒಟ್ಟುಗಿತ್ತಿನ ಪುದರ್ನ್ಲಾ ಪರೀಕ್ಷಿಸವೊಲಿ)",
"whatlinkshere-hidetrans": "$1 ಸೇರಾವುನವು",
"whatlinkshere-hidelinks": "$1 ಕೊಂಡಿಕುಲು",
"whatlinkshere-filters": "ಅರಿಪೆಲು",
+ "whatlinkshere-submit": "ಪೋಲೆ",
"blockip": "ಈ ಸದಸ್ಯೆರೆನ್ ಬ್ಲಾಕ್ ಮಲ್ಪುಲೆ",
+ "ipbreason": "ಕಾರಣೊ:",
"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",
"ipblocklist": "ತಡೆಪತ್ತ್’ದಿನ ಐ.ಪಿ ವಿಳಾಸೊಲು ಅಂಚೆನೆ ಬಳಕೆದ ಪುದರ್’ಲು",
"blocklink": "ಅಡ್ಡ ಪತ್ತ್ಲೆ",
"tog-ccmeonemails": "నేను ఇతర వాడుకరులకు పంపించే ఈ-మెయిళ్ల కాపీలను నాకు కూడా పంపు",
"tog-diffonly": "తేడాల కింద, పేజీలోని సమాచారాన్ని చూపించొద్దు",
"tog-showhiddencats": "దాచిన వర్గాలను చూపించు",
- "tog-norollbackdiff": "à°°à°¦à±\8dà°¦à±\81 చేసాక తేడాలు చూపించవద్దు",
+ "tog-norollbackdiff": "à°°à±\8bà°²à±\8dâ\80\8cà°¬à±\8dయాà°\95à±\8d చేసాక తేడాలు చూపించవద్దు",
"tog-useeditwarning": "ఏదైనా పేజీని నేను వదిలివెళ్తున్నప్పుడు దానిలో భద్రపరచని మార్పులు ఉంటే నన్ను హెచ్చరించు",
"tog-prefershttps": "లాగిన్ అయి ఉన్నప్పుడెల్లా భద్ర కనెక్షనునే వాడు",
"underline-always": "ఎల్లప్పుడూ",
"october-date": "అక్టోబరు $1",
"november-date": "నవంబరు $1",
"december-date": "డిసెంబరు $1",
+ "period-am": "ఉద",
+ "period-pm": "సాయం",
"pagecategories": "{{PLURAL:$1|వర్గం|వర్గాలు}}",
"category_header": "\"$1\" వర్గంలోని పుటలు",
"subcategories": "ఉపవర్గాలు",
"tagline": "{{SITENAME}} నుండి",
"help": "సహాయం",
"search": "వెతుకు",
+ "search-ignored-headings": " #<!-- ఈ లైనును ఉన్నది ఉన్నట్లుగా వదిలేయండి --> <pre>\n# వెతుకులాటలో పరిగణింపబడని శీర్షికలు.\n# శీర్షికతో సహా పేజీ ఇండెక్స్ కాగానే మార్పులు వర్తిస్తాయి.\n# ఉత్తుత్తి సవరణ చేయడం ద్వారా బలవంతంగా రీయిండెక్సింగ్ చేయించవచ్చు.\n# వ్యాకరణం ఇలా ఉంటుంది:\n# * \"#\" కారెక్టరు నుండి లైను చివరి వరకూ ఉన్నదంతా వ్యాఖ్య అవుతుంది\n# * ఖాళీగా లేని ప్రతీ లైను వెతుకులాటలో పట్టించుకోనక్కర్లేని శీర్షికగా పరిగణింపబడుతుంది.\nమూలాలు\nబయటి లింకులు\nఇవి కూడా చూడండి\n #</pre> <!-- ఈ లైనును ఉన్నది ఉన్నట్లుగా వదిలేయండి -->",
"searchbutton": "వెతుకు",
"go": "వెళ్లు",
"searcharticle": "వెళ్లు",
"laggedslavemode": "<strong>హెచ్చరిక:</strong> పేజీలో ఇటీవల జరిగిన మార్పులు ఉండకపోవచ్చు.",
"readonly": "డేటాబేసు లాక్చెయ్యబడింది",
"enterlockreason": "డేటాబేసుకు వేయబోతున్న లాకుకు కారణం తెలుపండి, దానితోపాటే ఎంతసమయం తరువాత ఆ లాకు తీసేస్తారో కూడా తెలుపండి",
- "readonlytext": "à°¡à±\87à°\9fాబà±\87à°¸à±\81 à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 లాà°\95à±\81 à°\9aà±\87యబడిà°\82ది. మారà±\8dà°ªà±\81à°²à±\81, à°\9aà±\87à°°à±\8dà°ªà±\81à°²à±\81 à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°\9aà±\86à°¯à±\8dయలà±\87à°°à±\81. మామà±\82à°²à±\81à°\97à°¾ à°\9cà°°à°¿à°\97à±\87 నిరà±\8dవహణ à°\95à±\8aà°°à°\95à±\81 à°\87ది à°\9cà°°à°¿à°\97à°¿ à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81; అది పూర్తి కాగానే తిరిగి మామూలుగా పనిచేస్తుంది.\n\nదీనిని లాకు చేసిన నిర్వాహకుడు ఇలా తెలియజేస్తున్నాడు: $1",
+ "readonlytext": "à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°\95à±\8aà°¤à±\8dà°¤ à°\8eà°\82à°\9fà±\8dà°°à±\80à°²à±\81, మారà±\8dà°ªà±\81à°\9aà±\87à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\86à°¯à±\8dà°¯à°\95à±\81à°\82à°¡à°¾ à°¡à±\87à°\9fాబà±\87à°¸à±\81 లాà°\95à±\81 à°\9aà±\87యబడిà°\82ది. మామà±\82à°²à±\81à°\97à°¾ à°\9cà°°à°¿à°\97à±\87 నిరà±\8dవహణ à°\95à±\8aà°°à°\95à±\81 à°\87ది à°\9cà°°à°¿à°\97à°¿ à°\89à°\82à°¡à°µà°\9aà±\8dà°\9aà±\81. అది పూర్తి కాగానే తిరిగి మామూలుగా పనిచేస్తుంది.\n\nదీనిని లాకు చేసిన నిర్వాహకుడు ఇలా తెలియజేస్తున్నాడు: $1",
"missing-article": "\"$1\" $2 అనే పేజీ యొక్క పాఠ్యం డేటాబేసులో దొరకలేదు.\n\nకాలం చెల్లిన తేడా కోసం చూసినపుడుగానీ, తొలగించిన పేజీ చరితం కోసం చూసినపుడుగానీ ఇది సాధారణంగా జరుగుతుంది.\n\nఒకవేళ అలా కాకపోతే, మీరో బగ్ను కనుక్కున్నట్టే.\nఈ URLను సూచిస్తూ, దీన్ని ఓ [[Special:ListUsers/sysop|నిర్వాహకునికి]] తెలియజేయండి.",
"missingarticle-rev": "(కూర్పు#: $1)",
"missingarticle-diff": "(తేడా: $1, $2)",
"badtitletext": "మీరు కోరిన పేజీ యొక్క పేరు చెల్లనిది, ఖాళీగా ఉంది, లేదా తప్పు లింకుతో కూడిన అంతర్వికీ లేదా అంతర-భాషా శీర్షిక అయివుండాలి.\nశీర్షికలలో ఉపయోగించకూడని అక్షరాలు దానిలో ఉండివుండొచ్చు.",
"title-invalid-empty": "కోరబడిన పేజీ శీర్షిక ఖాళీగా ఉంది లేదా కేవలం పేరుబరి పేరు కలిగి ఉంది.",
"title-invalid-utf8": "కోరబడిన పేజీ శీర్షికలో చెల్లని UTF-8 అక్షరాలున్నాయి.",
- "title-invalid-interwiki": "à°¶à±\80à°°à±\8dà°·à°¿à°\95 పాఠà±\8dà°¯à°\82à°²à±\8b à°\85à°\82తరవిà°\95à±\80 à°²à°\82à°\95à±\86 à°\89à°\82ది",
+ "title-invalid-interwiki": "à°®à±\80à°°à°¡à°¿à°\97à°¿à°¨ à°ªà±\87à°\9cà±\80 à°¶à±\80à°°à±\8dà°·à°¿à°\95à°²à±\8b à°\85à°\82తర విà°\95à±\80 à°²à°\82à°\95à±\86 à°\89à°\82ది, à°\95ానà±\80 à°\85ది నిషిదà±\8dà°§à°\82.",
"title-invalid-talk-namespace": "మీరడిగిన పేజీ శీర్షిక అసలు సృష్టించే వీలే లేని చర్చా పేజీకి చెందినది.",
"title-invalid-characters": "కోరబడిన పేజీ శీర్షికలో చెల్లని అక్షరాలున్నాయి : \"$1\".",
"title-invalid-relative": "శీర్షికలో లంకె పాఠ్యం సాపేక్షంగా ఉంది - పూర్తిగా లేదు. సాపేక్ష పేజీ చిరునామాలు (./, ../) గల పేజీ శీర్షికలు ఎక్కువశాతం అందుబాటులో ఉండవు కనుక అవి చెల్లవు.",
"title-invalid-magic-tilde": "కోరబడిన పేజీ శీర్షిక పాఠ్యం లో చెల్లని మ్యాజిక్ టిల్డా పదాలున్నాయి (<nowiki>~~~</nowiki>).",
- "title-invalid-too-long": "à°\95à±\8bరబడిన à°ªà±\87à°\9cà±\80 à°¶à±\80à°°à±\8dà°·à°¿à°\95 పాఠà±\8dà°¯à°\82 మరà±\80 à°ªà±\8aà°¡à°µà±\81à°\97à°¾ à°\89à°\82ది. à°\87ది UTF-8 పదà±\8dధతిలà±\8b $1 à°¬à±\88à°\9fà±\8dà°²కు మించి ఉండరాదు.",
+ "title-invalid-too-long": "à°®à±\80à°°à°¡à°¿à°\97à°¿à°¨ à°ªà±\87à°\9cà±\80 à°¶à±\80à°°à±\8dà°·à°¿à°\95 మరà±\80 à°ªà±\8aà°¡à°µà±\81à°\97à°¾ à°\89à°\82ది. à°\87ది UTF-8 పదà±\8dధతిలà±\8b $1 {{PLURAL:$1|à°¬à±\88à°\9fà±\8dâ\80\8c|à°¬à±\88à°\9fà±\8dà°²}}కు మించి ఉండరాదు.",
"title-invalid-leading-colon": "కోరబడిన పేజీ శీర్షిక పాఠ్యం మొదట్లో చెల్లని కొలొన్ చిహ్నం (:) ఉంది.",
"perfcached": "కింది డేటా ముందే సేకరించి పెట్టుకున్నది. కాబట్టి తాజా డేటాతో పోలిస్తే తేడాలుండవచ్చు. ఈ కాషెలో గరిష్టంగా {{PLURAL:$1|ఒక్క ఫలితం ఉంది|$1 ఫలితాలు ఉన్నాయి}}.",
"perfcachedts": "కింది సమాచారం ముందే సేకరించి పెట్టుకున్నది. దీన్ని $1న చివరిసారిగా తాజాకరించారు. ఈ కాషెలో గరిష్టంగా {{PLURAL:$4|ఒక్క ఫలితం ఉంది|$4 ఫలితాలు ఉన్నాయి}}.",
"viewsource": "మూలాన్ని చూపించు",
"viewsource-title": "$1 యొక్క సోర్సు చూడండి",
"actionthrottled": "కార్యాన్ని ఆపేసారు",
- "actionthrottledtext": "à°¸à±\8dపామà±\81à°¨à±\81 నిరà±\8bధిà°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°\97ానà±\81, à°¤à°\95à±\8dà°\95à±\81à°µ సమయà°\82à°²à±\8b మరà±\80 à°\8eà°\95à±\8dà°\95à±\81à°µ సారà±\8dà°²à±\81 à°\88 పని à°\9aà±\87à°¯à°\95à±\81à°\82à°¡à°¾ పరిమితి విధిà°\82à°\9aà°¾à°\82. à°®à±\80à°°à±\81 దానà±\8dని à°\85ధిà°\97మిà°\82à°\9aారà±\81. à°\95à±\8aà°¨à±\8dà°¨ి నిమిషాలు ఆగి మరలా ప్రయత్నించండి.",
+ "actionthrottledtext": "à°¦à±\81à°¶à±\8dà°\9aà°°à±\8dయనà±\81 నిరà±\8bధిà°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°\97ానà±\81, à°¤à°\95à±\8dà°\95à±\81à°µ సమయà°\82à°²à±\8b మరà±\80 à°\8eà°\95à±\8dà°\95à±\81à°µ సారà±\8dà°²à±\81 à°\88 పని à°\9aà±\87à°¯à°\95à±\81à°\82à°¡à°¾ పరిమితి విధిà°\82à°\9aà°¾à°\82. à°®à±\80à°°à±\81 దానà±\8dని à°\85ధిà°\97మిà°\82à°\9aారà±\81. à°\95à±\8aà°¦à±\8dà°¦ి నిమిషాలు ఆగి మరలా ప్రయత్నించండి.",
"protectedpagetext": "ఈ పేజీలో మార్పులు వగైరాలు చెయ్యకుండా ఉండేందుకు గాను, సంరక్షించబడింది.",
- "viewsourcetext": "మీరీ పేజీ సోర్సును చూడవచ్చు, కాపీ చేసుకోవచ్చు:",
- "viewyourtext": "ఈ పేజీలోని <strong>మీ మార్పుల</strong> యొక్క మూలాన్ని చూడవచ్చు, కాపీచేసుకోవచ్చు:",
+ "viewsourcetext": "మీరీ పేజీ సోర్సును చూడవచ్చు, కాపీ చేసుకోవచ్చు.",
+ "viewyourtext": "ఈ పేజీలో <strong>మీరు చేసిన మార్పుల</strong> యొక్క మూలాన్ని చూడవచ్చు, కాపీచేసుకోవచ్చు.",
"protectedinterface": "ఈ పేజీ, ఈ వికీ యొక్క సాఫ్టువేరు ఇంటరుఫేసుకు చెందిన టెక్స్టును అందిస్తుంది. దుశ్చర్యల నివారణ కోసమై దీన్ని సంరక్షించాం. వికీలన్నిటిలోను అనువాదాలను చేర్చాలన్నా, మార్చాలన్నా మీడియావికీ స్థానికీకరణ ప్రాజెక్టైన [https://translatewiki.net/ translatewiki.net] ను వాడండి.",
"editinginterface": "<strong>హెచ్చరిక:</strong> సాఫ్టువేరుకు ఇంటరుఫేసు టెక్స్టును అందించేందుకు పనికొచ్చే పేజీని మీరు సరిదిద్దుతున్నారు.\nఈ పేజీలో చేసే మార్పుల వల్ల ఇతర వాడుకరులకు ఇంటరుఫేసు కనబడే విధానంలో తేడావస్తుంది.",
"translateinterface": "అన్ని వికీలలో కనిపించేలా అనువాదాలు చేర్చాలన్నా, మార్చాలన్నా, దయచేసి [https://translatewiki.net/ translatewiki.net] ను వాడండి. ఇది మీడియావికీ స్థానికీకరణ ప్రాజెక్టు.",
"passwordreset-emailtext-user": "{{SITENAME}} లోని వాడుకరి $1, {{SITENAME}} ($4) లోని మీ సంకేతపదాన్ని మార్చమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}\nఈ ఈమెయిలు అడ్రసుతో అనుసంధింపబడి ఉన్నాయి:\n\n$2\n\n{{PLURAL:$3|ఈ తాత్కాలిక సంకేతపదానికి|ఈ తాత్కాలిక సంకేతపదాలకు}} {{PLURAL:$5|ఒక్క రోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.\nఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి దాన్ని మార్చాల్సిన అవసరం లేదని అనుకున్నా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుకోవచ్చు.",
"passwordreset-emailelement": "వాడుకరిపేరు: \n$1\n\nతాత్కాలిక సంకేతపదం: \n$2",
"passwordreset-emailsentemail": "సంకేతపదం మార్పు ఈమెయిలును పంపించాం.",
- "passwordreset-emailsent-capture": "క్రింద చూపిన సంకేతపదం మార్పు ఈమెయిలును పంపించాం.",
- "passwordreset-emailerror-capture": "కింద చూపిన సంకేతపదం మార్పు ఈమెయిలును తయారుచేసాం. కానీ దాన్ని {{GENDER:$2|వాడుకరికి}} పంపడం విఫలమైంది: $1",
"changeemail": "ఈ-మెయిలు చిరునామా మార్పు",
"changeemail-header": "ఖాతా ఈ-మెయిల్ చిరునామాని మార్చండి",
"changeemail-no-info": "ఈ పేజీని నేరుగా చూడటానికి మీరు లాగినయి వుండాలి.",
"undo-nochange": "ఆ మార్పును ఈసరికే రద్దు చేసినట్లుగా కనిపిస్తోంది.",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) యొక్క కూర్పు $1 ను రద్దుచెయ్యి",
"undo-summary-username-hidden": "దాచబడిన వాడుకరి చేసిన కూర్పు $1 ని వెనక్కి తిప్పండి",
- "cantcreateaccounttitle": "ఈ ఖాతా తెరవలేము",
"cantcreateaccount-text": "ఈ ఐపీ అడ్రసు ('''$1''') నుండి ఖాతా సృష్టించడాన్ని [[User:$3|$3]] నిరోధించారు.\n\n$3 చెప్పిన కారణం: ''$2''",
"cantcreateaccount-range-text": "<strong>$1</strong> శ్రేణిలోని IP చిరునామాల నుండి ఖాతా సృష్టించడాన్ని [[User:$3|$3]] నిషేధించారు. మీ IP చిరునామా (<strong>$4</strong>) ఈ శ్రేణిలోనే ఉంది.\n\n$3 ఇచ్చిన కారణం: <em>$2</em>",
"viewpagelogs": "ఈ పేజీకి సంబంధించిన లాగ్లను చూడండి",
"special-characters-title-emdash": "ఎమ్ డాష్",
"special-characters-title-minus": "మైనస్ గుర్తు",
"mw-widgets-dateinput-no-date": "ఏ తేదీనీ ఎంచుకోలేదు",
- "mw-widgets-titleinput-description-new-page": "పేజీ ఇంకా లేదు",
- "api-error-blacklisted": "వేరే వివరమైన శీర్షకను ఎంచుకోండి"
+ "mw-widgets-titleinput-description-new-page": "పేజీ ఇంకా లేదు"
}
"Pphongpan355",
"Macofe",
"Pilarbini",
- "Matma Rex"
+ "Matma Rex",
+ "B20180"
]
},
"tog-underline": "การขีดเส้นใต้ลิงก์:",
"laggedslavemode": "<strong>คำเตือน:</strong> หน้านี้อาจไม่มีการปรับล่าสุด",
"readonly": "ฐานข้อมูลถูกล็อก",
"enterlockreason": "ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก",
- "readonlytext": "à¸\82à¸\93ะà¸\99ีà¹\89à¸\90าà¸\99à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\96ูà¸\81ลà¹\87à¸à¸\81มิà¹\83หà¹\89รัà¸\9aà¸\82à¹\89à¸à¸¡à¸¹à¸¥ใหม่และการแก้ไขเพิ่มเติมอื่น อาจเป็นเพราะการบำรุงรักษาฐานข้อมูลรูทีน หลังแล้วเสร็จจะกลับมาใช้งานได้ตามปกติ\n\nผู้ดูแลระบบที่ล็อกได้ให้คำอธิบายดังนี้: $1",
+ "readonlytext": "à¸\82à¸\93ะà¸\99ีà¹\89à¸\90าà¸\99à¸\82à¹\89à¸à¸¡à¸¹à¸¥à¸\96ูà¸\81ลà¹\87à¸à¸\81รายà¸\81ารใหม่และการแก้ไขเพิ่มเติมอื่น อาจเป็นเพราะการบำรุงรักษาฐานข้อมูลรูทีน หลังแล้วเสร็จจะกลับมาใช้งานได้ตามปกติ\n\nผู้ดูแลระบบที่ล็อกได้ให้คำอธิบายดังนี้: $1",
"missing-article": "ฐานข้อมูลไม่พบข้อความของหน้าที่ควรมี ชื่อ \"$1\" $2\n\nสาเหตุมักเกิดจากผลต่างที่ล้าสมัย หรือการเชื่อมโยงประวัติไปยังหน้านั้นถูกลบแล้ว\n\nหากไม่ใช่กรณีดังกล่าว คุณอาจพบจุดบกพร่องในซอฟต์แวร์ กรุณารายงานต่อ[[Special:ListUsers/sysop|ผู้ดูแลระบบ]] พร้อมระบุยูอาร์แอล",
"missingarticle-rev": "(รุ่นปรับปรุง#: $1)",
"missingarticle-diff": "(ต่าง: $1, $2)",
"protectedinterface": "หน้านี้เป็นข้อความส่วนต่อประสานสำหรับซอฟต์แวร์บนวิกินี้ และถูกล็อกเพื่อป้องกันการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [https://translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
"editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
"translateinterface": "ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [https://translatewiki.net/ translatewiki.net] โครงการแปลเป็นภาษาถิ่นของมีเดียวิกิ",
- "cascadeprotected": "หน้านี้ถูกป้องกันมิให้แก้ไข เพราะถูกรวมอยู่ในหน้าต่อไปนี้ซึ่งถูกล็อกโดยเปิดตัวเลือก \"ต่อเรียง\":\n$2",
+ "cascadeprotected": "หน้านี้ถูกป้องกันมิให้แก้ไข เพราะถูกรวมอยู่ใน{{PLURAL:$1|page, which is|หน้าต่อไปนี้}} ซึ่งถูกล็อกโดยเปิดตัวเลือก \"ต่อเรียง\":\n$2",
"namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
"customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
"customjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เพราะหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
"passwordreset-emailelement": "ชื่อผู้ใช้: \n$1\n\nรหัสผ่านชั่วคราว: \n$2",
"passwordreset-emailsentemail": "หากที่อยู่อีเมลนี้สัมพันธ์กับบัญชีของคุณ เช่นนั้นจะส่งอีเมลตั้งรหัสผ่านใหม่",
"passwordreset-emailsentusername": "หากมีที่อยู่อีเมลที่ลงทะเบียนไว้ด้วยกับชื่อผู้ใช้นี้ เช่นนั้นจะส่งอีเมลตั้งรหัสผ่านใหม่",
- "passwordreset-emailsent-capture": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง",
- "passwordreset-emailerror-capture": "อีเมลตั้งรหัสผ่านใหม่ถูกสร้างขึ้นแล้ว ซึ่งแสดงด้านล่าง แต่ไม่สามารถส่งไปยัง{{GENDER:$2|ผู้ใช้}}: $1",
"changeemail": "เปลี่ยนหรือลบที่อยู่อีเมล",
"changeemail-header": "กรอกแบบนี้เพื่อเปลี่ยนที่อยู่อีเมลของคุณ หากคุณต้องการลบการเชื่อมโยงของที่อยู่อีเมลใด ๆ จากบัญชีของคุณ ให้เว้นที่อยู่อีเมลใหม่ว่างเมื่อส่งแบบ",
- "changeemail-passwordrequired": "คุณจะต้องกรอกรหัสผ่านใหม่เพื่อยืนยันการเปลี่ยนแปลงนี้",
"changeemail-no-info": "คุณจำต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง",
"changeemail-oldemail": "ที่อยู่อีเมลปัจจุบัน:",
"changeemail-newemail": "ที่อยู่อีเมลใหม่:",
"undo-nochange": "ดูเหมือนว่าการแก้ไขดังกล่าวถูกย้อนกลับแล้ว",
"undo-summary": "ทำกลับรุ่นแก้ไข $1 โดย [[Special:Contributions/$2|$2]] ([[User talk:$2|พูดคุย]])",
"undo-summary-username-hidden": "ทำกลับรุ่นแก้ไข $1 โดยผู้ใช้ไม่ระบุชื่อ",
- "cantcreateaccounttitle": "ไม่สามารถสร้างบัญชีได้",
"cantcreateaccount-text": "การสร้างบัญชีใหม่จากที่อยู่ไอพีนี้ ('''$1''') ถูกระงับโดย [[User:$3|$3]]\n\nเหตุผลที่ $3 ให้ไว้ คือ ''$2''",
"cantcreateaccount-range-text": "การสร้างบัญชีจากเลขที่อยู่ไอพีในช่วง <strong>$1</strong> ซึ่งรวมเลขที่อยู่ไอพีของคุณ (<strong>$4</strong>) ถูกบล็อกโดย [[User:$3|$3]] \n\nเหตุผลที่ $3 ชี้แจง คือ <em>$2</em>",
"viewpagelogs": "ดูปูมของหน้านี้",
"special-characters-group-bangla": "บังคลา",
"special-characters-group-telugu": "เตลูกู",
"special-characters-group-sinhala": "สิงหล",
- "special-characters-group-gujarati": "คุชราต",
- "api-error-blacklisted": "โปรดใช้ชื่ออื่นที่สื่อความหมาย"
+ "special-characters-group-gujarati": "คุชราต"
}
"tagline": "{{SITENAME}} sitesinden",
"help": "Yardım",
"search": "Ara",
+ "search-ignored-headings": " #<!-- bu satırı olduğu gibi bırakın --> <pre>\n# Başlıklar aramada göz ardı edilecektir.\n# Bu değişiklikler başlık ve sayfa endeksli şekilde en kısa sürede yürürlüğe girecektir.\n# Boş bir düzenleme yaparak, yeniden dizin oluşturulmasını zorlayabilirsiniz.\n# Sözdizimi aşağıdaki gibidir:\n# * \"#\" karakteri ile başlayan her satır, satır sonuna kadar bir yorumdur.\n# * Boş olmayan her türlü satırın tam başlığı her durumda görmezden gelinir.\nKaynaklar\nDış bağlantılar\nAyrıca bakınız\n #</pre> <!-- bu satırları olduğu gibi bırakın-->",
"searchbutton": "Ara",
"go": "Git",
"searcharticle": "Git",
"passwordreset-emailelement": "Kullanıcı adı: \n$1\n\nGeçici şifre: \n$2",
"passwordreset-emailsentemail": "Eğer bu e-posta adresi hesabınızın bağlı olduğu adres ise, bir parola sıfırlama e-postası gönderilecektir.",
"passwordreset-emailsentusername": "Eğer bu e-posta adresi hesabınızın bağlı olduğu adres ise, bir parola sıfırlama e-postası gönderilecektir.",
- "passwordreset-emailsent-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.",
- "passwordreset-emailerror-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1",
"passwordreset-invalideamil": "Geçersiz e-posta adresi",
"passwordreset-nodata": "Ne bir kullanıcı adı ne de bir e-posta adresi verildi.",
"changeemail": "E-posta adresini değiştir veya çıkar",
"changeemail-header": "E-posta adresinizi değiştirmek için bu formu doldurun. Eğer e-posta adresini hesabınızdan kaldırmak istiyorsanız formu gönderirken e-posta adresi bölümünü boş bırakın.",
- "changeemail-passwordrequired": "Bu değişikliği onaylamak için şifrenizi girmeniz gerekir.",
"changeemail-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
"changeemail-oldemail": "Mevcut E-posta adresi:",
"changeemail-newemail": "Yeni E-posta adresi:",
"undo-nochange": "Düzeltme zaten geri alınmış.",
"undo-summary": "$1 değişikliği [[Special:Contributions/$2|$2]] ([[User talk:$2|mesaj]]) tarafından geri alındı.",
"undo-summary-username-hidden": "Gizli bir kullanıcı tarafından $1 sürümü geri alınıyor",
- "cantcreateaccounttitle": "Hesap açılamıyor",
"cantcreateaccount-text": "Bu IP adresinden ('''$1''') kullanıcı hesabı oluşturulması [[User:$3|$3]] tarafından engellenmiştir.\n\n$3 tarafından verilen sebep ''$2''",
"cantcreateaccount-range-text": "<strong>$1</strong> aralığındaki IP'ler için hesap oluşturma [[User:$3|$3]] tarafından engellendi, bu sizin IP adresinizi de (<strong>$4</strong>) içeriyor.\n\n$3 tarafından verilen gerekçe <em>$2</em>",
"viewpagelogs": "Bu sayfa ile ilgili kayıtları göster",
"passwordreset-emailtext-user": "{{SITENAME}} проектыннан $1 кулланучысы {{SITENAME}} ($4) проектында сезнең серсүзне искә төшерүне сорады.\n{{PLURAL:$3|1=Түбәндәге хисап язмасы|Түбәндәге хисап язмалары}} бу электрон әрҗә адресы белән бәйле:\n\n$2\n\n{{PLURAL:$3|1=Бу вакытлы серсүз|Бу вакытлы серсүзләр}} {{PLURAL:$5|$5 көн}} дәвамында эшлиячәкләр.\nСез системага керергә һәм яңа серсүз сайларга тиешсез.\nӘгәр сез серсүз сорамаган булсагыз яки элеккеге серсүзегезне искә төшерсәгез \nһәм аны үзгәртергә теләмәсәгез, бу хатка җавап бирмәгез\nһәм элеккеге серсүзегезне кулланыгыз.",
"passwordreset-emailelement": "Кулланучы исеме: \n$1\n\nВакытлыча серсүз: \n$2",
"passwordreset-emailsentemail": "Әгәрдә бу электрон әрҗәгез сезнең хисап язмагыз белән бәйләнгән булса,сезгә серсүзне яңарту өчен хат җибәреләчәк.",
- "passwordreset-emailsent-capture": "Серсүзне яңарту турындагы мәгълүмәт электрон хат белән сезгә җибәрелде, аның текстын түбәндә карарга мөмкин.",
- "passwordreset-emailerror-capture": "Серсүзне яңарту турында хәбәр итече хат ясалды, ләкин аны {{GENDER:$2|кулланучыга}} түбәндәге сәбәп аркасында җибәре булмады: $1",
"changeemail": "Электрон әрҗә адресын үзгәртү яисә бетерү",
"changeemail-header": "Электрон әрҗә адресын үзгәртү өчен әлеге форманы тутырыгыз. Әгәрдә сез электрон әрҗәгезне хисап язмагыздан өзәсегез килмәсә, форманы тутырганда яңа адрес урынын буш калдырыгыз.",
- "changeemail-passwordrequired": "Әлеге үзгәрешләрне раслау өчен, Сезгә кулланылучы серсүзне язарга кирәк.",
"changeemail-no-info": "Бу сәхифәгә турыдан-туры мөрәҗәгать итәр өчен, сез системага керергә тиешсез",
"changeemail-oldemail": "Хәзерге электрон әрҗә адресы:",
"changeemail-newemail": "Яңа электрон почта адресы:",
"undo-failure": "Аралыктагы үзгәртүләр туры килмәү сәбәпле, үзгәртүдән баш тартып булмый.",
"undo-norev": "Үзгәртү юк яисә ул бетерелгән, шуңа аннан баш тартып булмый.",
"undo-summary": "[[Special:Contributions/$2|$2]] кулланучысының ([[User talk:$2|бәхәс]]) $1 үзгәртүеннән баш тарту",
- "cantcreateaccounttitle": "Хисап язмасын төзеп булмый",
"cantcreateaccount-text": "Бу IP адресыннан (<b>$1</b>) хисап язмалары төзү тыела. Тыючы: [[User:$3|$3]].\n\n$3 күрсәткән сәбәп: ''$2''",
"viewpagelogs": "Бу битнең көндәлекләрен карау",
"nohistory": "Бу битнең үзгәртүләр тарихы юк.",
"prefs-namespaces": "Исемнәр мәйданы",
"default": "килешү буенча",
"prefs-files": "Файллар",
- "prefs-custom-css": "Үземнең CSS",
- "prefs-custom-js": "Үземнең JS",
+ "prefs-custom-css": "Шәхси CSS",
+ "prefs-custom-js": "Шәхси JS",
"prefs-common-css-js": "Барлык бизәлешләр өчен гомуми CSS/JS:",
"prefs-reset-intro": "Бу бит сезнең көйләнмәләрегезне бетерү өчен кулланыла. Бу эшне башкару нәтиҗәсендә сез яңадан үз көйләнмәләрне яңадан кайтара алмыйсыз.",
"prefs-emailconfirm-label": "E-mail раслау",
"databaseerror": "Медээ шыгжамыры алдаг",
"laggedslavemode": "'''Оваарымчалыг:''' Бо арында чаартыышкыннар чок болуп болур.",
"readonly": "шоочалаарынга медээ шыгжамыры",
- "missing-article": "Данныйлар базазында тывар ужурлуг «$1» $2 деп арынның негеттинип турар сөзүглели тывылбаан.\n\nНургулайында ындыг байдал эрги шөлүг-биле казыттынган арынның өскерилге төөгүзүнче дамчып оралдажырга тыптыр.\n\nА шынында ындыг эвес болза, Силер программа хандырылгазының алдаанга душканыңар хөңнү.\n\nОоң дугайында кайы-бир [[Special:ListUsers/sysop|удуртукчуларга]], мүн URL-ин айытпышаан, дамчыдыңарам.",
+ "missing-article": "«$1» $2 деп арында дилеп турганың сөстер медээ үндезининден тывылбады.\n\nБаладып каапкан арынның төөгүзүн, эрги айтыг таварыштыр киргеш көөр болзуңза ындыг чүвеге таваржып болур сен.\n\nБир эвес хамыктың ужуру ындыг эвес боор болза, сен программаның шын эвес ажылдааныга душканыңар ол болур. \nОоң дугайында бээр [[Special:ListUsers/sysop|удуртукчуларга]] бижипкеш, шын эвес ажылдаан арынның URL адрезин база албан айып каар сен.",
"missingarticle-rev": "(үндүрериниң саны: $1)",
"missingarticle-diff": "(Ылгал: $1, $2)",
"internalerror": "Иштики алдаг",
"createaccountreason": "Чылдагаан:",
"badretype": "Силерниң парлаан чажыт сөзүңер таарышпас.",
"userexists": "Силерниң парлаан адыңар амгы үеде ажыглаттынып турар.\nӨске аттан шилип алыңар.",
- "loginerror": "Ð\9aиÑ\80им алдаа (ЧазÑ\8bглÑ\8bг киÑ\80им)",
+ "loginerror": "Ð\9aиÑ\80ип Ñ\88Ñ\8bдавадÑ\8bÒ£, Ñ\81ени Ñ\82анÑ\8bваан бооÑ\80",
"loginsuccesstitle": "Чедимчелиг кирери",
"login-userblocked": "Бо ажыглакчы blocked. Кирери хоржок.",
"password-login-forbidden": "Бо ажыглакчының ады болгаш чажыт сөс хоржок.",
"searchmenu-new": "Бо вики-төлевилелге «[[:$1]]» деп арынны кылыр.{{PLURAL:$2|0=|Ол ышкаш дилээшкиниңерниң түңнелинде тывылган арынны база көрүңер.|Ол ышкаш дилээшкиниңерниң түңнелдерин база көрүңер.}}",
"searchprofile-articles": "үндезин арыннар",
"searchprofile-images": "Мультимедиа",
- "searchprofile-everything": "каяа-даа",
+ "searchprofile-everything": "Ð\9aаяа-даа",
"searchprofile-advanced": "Делгереңгей",
"searchprofile-articles-tooltip": "$1 иштинден дилээри",
"searchprofile-images-tooltip": "Файлдар дилээри",
"allmessages-language": "Дыл:",
"allmessages-filter-submit": "Күүcедири",
"thumbnail-more": "Улгаттыр",
- "thumbnail_error": "Биче чурумал (миниатюра) чаяарының алдаа: $1",
+ "thumbnail_error": "Бичежек чурук болдунмады: $1",
"import-comment": "Тайылбыр:",
"import-logentry-upload-detail": "$1 {{PLURAL:$1|үндүрери}}",
"tooltip-pt-userpage": "Силерниң ажыглакчы арыныңнар",
"specialpages-group-pages": "Арыннарның даңзызы",
"specialpages-group-pagetools": "Арын херекселдери",
"blankpage": "Куруг арын",
- "external_image_whitelist": " #Ð\91о одÑ\83Ñ\80Ñ\83гнÑ\83 ол-ла Ñ\85евÑ\8dÑ\8dÑ\80 аÑ\80Ñ\82Ñ\82Ñ\8bÑ\80Ñ\8bңаÑ\80<pre>\n#ТÑ\83Ñ\80Ñ\83м илеÑ\80едиглеÑ\80 (Ñ\80егÑ\83лÑ\8fÑ\80нÑ\8bе вÑ\8bÑ\80ажениÑ\8f) Ñ\84Ñ\80агменÑ\82илеÑ\80ин маңаа Ñ\81алÑ\8bңаÑ\80 (// аÑ\80азÑ\8bнга Ñ\82Ñ\83Ñ\80аÑ\80 кезÑ\8dÑ\8dн)\n#Ð\94аÑ\88Ñ\82Ñ\8bкÑ\8b Ñ\87Ñ\83Ñ\80Ñ\83малдаÑ\80 URL-биле олаÑ\80 Ñ\85олбааÑ\88кан болÑ\83Ñ\80.\n#Ð\94Ñ\83жа беÑ\80геннеÑ\80и Ñ\87Ñ\83Ñ\80Ñ\83малдаÑ\80 кÑ\8bлдÑ\8bÑ\80 көÑ\81Ñ\82үп келиÑ\80, аÑ\80Ñ\82каннаÑ\80Ñ\8b Ñ\87Ñ\83Ñ\80Ñ\83малдаÑ\80же Ñ\88өлүг кÑ\8bлдÑ\8bÑ\80 көÑ\81Ñ\82Ò¯Ñ\80.\n# \"#\" деп демдекÑ\82ен Ñ\8dгелÑ\8dÑ\8dн одÑ\83Ñ\80Ñ\83глаÑ\80нÑ\8b Ñ\81аналдаÑ\80 кÑ\8bлдÑ\8bÑ\80 билдинеÑ\80.\n#Ð\9eдÑ\83Ñ\80Ñ\83глаÑ\80 Ñ\80егиÑ\81Ñ\82Ñ\80ге кÑ\83нÑ\83к Ñ\8dвеÑ\81 (билинмеÑ\81)\n\n#ТÑ\83Ñ\80Ñ\83м илеÑ\80едиглеÑ\80 Ñ\84Ñ\80агменÑ\82илеÑ\80ин бо одÑ\83Ñ\80Ñ\83гнÑ\83Ò£ кÑ\8bÑ\80Ñ\8bнга Ñ\81алÑ\8bңаÑ\80. Ð\90 бо одÑ\83Ñ\80Ñ\83гнÑ\83 олÑ\87аан Ñ\85евÑ\8dÑ\8dÑ\80 аÑ\80Ñ\82тырыңар</pre>",
+ "external_image_whitelist": " #Ð\91о одÑ\83Ñ\80Ñ\83гнÑ\83 ол-ла Ñ\85евÑ\8dÑ\8dÑ\80 аÑ\80Ñ\82Ñ\8bÑ\80Ñ\8bңаÑ\80<pre>\n#ТÑ\83Ñ\80Ñ\83м илеÑ\80едигниң (Ñ\80егÑ\83лÑ\8fÑ\80нÑ\8bе вÑ\8bÑ\80ажениÑ\8f) үзүкÑ\82еÑ\80ин маңаа бижипÑ\82иңеÑ\80 (// деп демдек аÑ\80азÑ\8bнда Ñ\82Ñ\83Ñ\80аÑ\80 кезÑ\8dÑ\8d) даÑ\80аазÑ\8bнда болза\n#олаÑ\80 Ó©Ñ\81ке URL адÑ\80еÑ\81Ñ\82е Ñ\82Ñ\83Ñ\80аÑ\80 Ñ\87Ñ\83Ñ\80Ñ\83кÑ\82аÑ\80-биле Ñ\85аÑ\80Ñ\8bлзаа Ñ\82Ñ\83дÑ\83п Ñ\82Ñ\83Ñ\80аÑ\80.\n#ТааÑ\80Ñ\8bÑ\88кан Ñ\87Ñ\83Ñ\80Ñ\83кÑ\82аÑ\80, Ñ\87Ñ\83Ñ\80Ñ\83к бооп ол-ла Ñ\85евÑ\8dÑ\8dÑ\80 көÑ\81Ñ\82үп келиÑ\80, аÑ\80Ñ\82аннаÑ\80Ñ\8b Ñ\87Ñ\83Ñ\80Ñ\83кÑ\82аÑ\80же айÑ\8bÑ\82кан айÑ\82Ñ\8bг бооп аÑ\80Ñ\82Ñ\8bп кааÑ\80.\n# \"#\" деп демдекÑ\82ен Ñ\8dгелÑ\8dÑ\8dн одÑ\83Ñ\80Ñ\83глаÑ\80 болза, бижикÑ\82иң Ñ\82Ñ\83Ñ\81кай Ñ\82айÑ\8bлбÑ\8bÑ\80 Ñ\82Ñ\83Ñ\80аÑ\80 кезÑ\8dÑ\8d-диÑ\80.\n#Ð\9eдÑ\83Ñ\80Ñ\83гга Ñ\83лÑ\83г-даа, биÑ\87ии-даа үжүкÑ\82еÑ\80 бижип болÑ\83Ñ\80.\n\n#ТÑ\83Ñ\80Ñ\83м илеÑ\80едигниң кезекÑ\82еÑ\80ин бо одÑ\83Ñ\80Ñ\83гнÑ\83Ò£ кÑ\8bÑ\80Ñ\8bнга бижип Ñ\81алÑ\8bÑ\80 Ñ\81илеÑ\80. Ð\91о одÑ\83Ñ\80Ñ\83гнÑ\83 олÑ\87аан, Ñ\85евÑ\8dÑ\8dÑ\80 аÑ\80тырыңар</pre>",
"tag-filter": "[[Special:Tags|демдек]] шүүрү:",
"tag-filter-submit": "Шүүрү",
"tags-title": "Демдеглелдер",
"tagline": "Матеріал з {{grammar:genitive|{{SITENAME}}}}",
"help": "Довідка",
"search": "Пошук",
+ "search-ignored-headings": " #<!-- залиште цей рядок точно таким, яким він є --> <pre>\n# Заголовки, які будуть ігноруватися при пошуці.\n# Зміни, які набирають сили при індексуванні сторінки з заголовком.\n# Ви можете примусити переіндексувати сторінку з нульовим редагуванням.\n# Синтаксис наступний:\n# * Усе, що починається з символу \"#\" до кінця рядка, є коментарем\n# * Кожний непорожній рядок є точним заголовком для ігнорування\nПосилання\nЗовнішні посилання\nДив. також\n #</pre> <!-- залиште цей рядок точно таким, яким він є -->",
"searchbutton": "Пошук",
"go": "Перейти",
"searcharticle": "Перейти",
"passwordreset-emailelement": "Ім'я користувача: \n$1\n\nТимчасовий пароль: \n$2",
"passwordreset-emailsentemail": "Якщо ця електронна адреса асоційована з вашим обліковим записом, то лист для відновлення пароля буде відправлено на неї.",
"passwordreset-emailsentusername": "Якщо існує електронна адреса, яка асоційована з цим обліковим записом, на неї буде надіслано лист для відновлення пароля.",
- "passwordreset-emailsent-capture": "Електронний лист скидання пароля було надіслано, як показано нижче.",
- "passwordreset-emailerror-capture": "Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.",
"passwordreset-emailsent-capture2": "{{PLURAL:$1|Електронний лист|Електронні листи}} скидання паролю було надіслано. {{PLURAL:$1|Ім'я користувача і пароль|Список імен користувачів і паролів}} показано нижче.",
"passwordreset-emailerror-capture2": "Не вдалося надіслати листа {{GENDER:$2|користувачу|користувачці}}: $1 {{PLURAL:$3|Ім'я користувача і пароль|список імен користувачів і паролів}} показано нижче.",
"passwordreset-nocaller": "Має бути надане джерело виклику",
"passwordreset-nodata": "Не надано ні імені користувача, ні електронної адреси",
"changeemail": "Змінити або вилучити адресу електронної пошти",
"changeemail-header": "Заповніть цю форму, щоб змінити адресу електронної пошти. Якщо Ви хочете взагалі прибрати зв'язок свого облікового запису з адресою електронної пошти, при надсиланні форми залиште поле нової електронної адреси порожнім.",
- "changeemail-passwordrequired": "Вам потрібно буде ввести пароль, щоб підтвердити цю зміну.",
"changeemail-no-info": "Ви повинні увійти в систему, щоб отримати безпосередній доступ до цієї сторінки.",
"changeemail-oldemail": "Поточна адреса електронної пошти:",
"changeemail-newemail": "Нова адреса електронної пошти:",
"minoredit": "Незначна зміна",
"watchthis": "Спостерігати за цією сторінкою",
"savearticle": "Зберегти сторінку",
+ "savechanges": "Зберегти зміни",
"publishpage": "Опублікувати сторінку",
+ "publishchanges": "Опублікувати зміни",
"preview": "Попередній перегляд",
"showpreview": "Попередній перегляд",
"showdiff": "Показати зміни",
"content-model-css": "CSS",
"content-json-empty-object": "Порожній об'єкт",
"content-json-empty-array": "Порожній масив",
+ "deprecated-self-close-category": "Сторінки, що використовують недійсні самозакривні теги HTML",
+ "deprecated-self-close-category-desc": "Сторінка містить недійсні самозакривні теги HTML, наприклад, <code><b/></code> чи <code><span/></code>. Їхню поведінку невдовзі буде змінено у відповідності зі специфікацією HTML5, тому їх використання у вікітексті є застарілим.",
"duplicate-args-warning": "<strong>Увага:</strong> [[:$1]] викликає [[:$2]] з більш ніж одним значенням параметра «$3». Буде використано лише останнє вказане значення.",
"duplicate-args-category": "Сторінки, що містять шаблон із кількома значеннями одного й того ж параметра",
"duplicate-args-category-desc": "Тут перелічено сторінки, що містять дублікатне визначення аргументу при включенні шаблону, приміром, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"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-адрес у діапазоні <strong>$1</strong>, який включає вашу IP-адресу (<strong>$4</strong>), було заблоковано користувачем [[User:$3|$3]].\n\nКористувач $3 вказав як причину <em>$2</em>",
"viewpagelogs": "Показати журнали для цієї сторінки",
"action-applychangetags": "додавання міток разом зі змінами",
"action-changetags": "додавання або вилучення будь-яких міток для певних версій сторінок або записів журналів",
"action-deletechangetags": "вилучення міток з бази даних",
+ "action-purge": "очищення кешу цієї сторінки",
"nchanges": "$1 {{PLURAL:$1|зміна|зміни|змін}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|зміна з останнього візиту|зміни з останнього візиту|змін з останнього візиту}}",
"enhancedrc-history": "історія",
"watchnologin": "Ви не увійшли до системи",
"addwatch": "Додати до списку спостереження",
"addedwatchtext": "«[[:$1]]» та її сторінка обговорення додані до вашого [[Special:Watchlist|списку спостереження]].",
+ "addedwatchtext-talk": "«[[:$1]]» та пов'язану з нею сторінку додано до Вашого [[Special:Watchlist|списку спостереження]].",
"addedwatchtext-short": "Сторінка \" $1 \" була додана до вашого списку спостереження.",
"removewatch": "Видалити зі списку спостереження",
"removedwatchtext": "«[[:$1]]» та її сторінка обговорення вилучені з Вашого [[Special:Watchlist|списку спостереження]].",
+ "removedwatchtext-talk": "«[[:$1]]» та пов'язану з нею сторінку вилучено з Вашого [[Special:Watchlist|списку спостереження]].",
"removedwatchtext-short": "Сторінка \"$1\" була видалена із вашого списку спостереження.",
"watch": "Спостерігати",
"watchthispage": "Спостерігати за цією сторінкою",
"unblock": "Розблокувати користувача",
"blockip": "Заблокувати {{GENDER:$1|користувача|користувачку}}",
"blockip-legend": "Блокування користувача",
- "blockiptext": "Використовуйте форму нижче, щоб заблокувати можливість редагування зазначеній IP-адресі або користувачу.\nЦе слід робити лише для запобігання порушенням і у відповідності до [[{{MediaWiki:Policy-url}}|правил]].\nОбов'язково заповніть причину нижче, бажано дати інформативну вичерпну інформацію (наприклад, послатися на конкретні правила, дати посилання на редагування користувача, які призвели до блокування). Можна конкретизувати причину блокування на сторінці обговорення користувача.\nВи можете заблокувати діапазони IP-адрес, використовуючи [https://uk.wikipedia.org/wiki/CIDR]-синтаксис. Максимально допустимий діапазон — /$1 для протоколу IPv4 та /$2 для протоколу IPv6.",
+ "blockiptext": "Використовуйте форму нижче, щоб заблокувати можливість редагування зазначеній IP-адресі або користувачу.\nЦе слід робити лише для запобігання порушенням і у відповідності до [[{{MediaWiki:Policy-url}}|правил]].\nОбов'язково заповніть причину нижче, бажано дати інформативну вичерпну інформацію (наприклад, послатися на конкретні правила, дати посилання на редагування користувача, які призвели до блокування). Можна конкретизувати причину блокування на сторінці обговорення користувача.\nВи можете заблокувати діапазони IP-адрес, використовуючи [https://uk.wikipedia.org/wiki/CIDR CIDR]-синтаксис. Максимально допустимий діапазон — /$1 для протоколу IPv4 та /$2 для протоколу IPv6.",
"ipaddressorusername": "IP-адреса або ім'я користувача:",
"ipbexpiry": "Термін:",
"ipbreason": "Причина:",
"unblockip": "Розблокувати IP-адресу",
"unblockiptext": "Використовуйте подану нижче форму, щоб відновити можливість збереження з раніше заблокованої IP-адреси.",
"ipusubmit": "Зняти це блокування",
- "unblocked": "[[User:$1|$1]] {{GENDER:$1|розблокований|розблокована}}",
- "unblocked-range": "$1 розблоковано",
- "unblocked-id": "Блокування $1 було зняте",
- "unblocked-ip": "[[Special:Contributions/$1|$1]] вже розлоковано.",
+ "unblocked": "[[User:$1|$1]] {{GENDER:$1|розблокований|розблокована}}.",
+ "unblocked-range": "$1 розблоковано.",
+ "unblocked-id": "Блокування $1 було зняте.",
+ "unblocked-ip": "[[Special:Contributions/$1|$1]] розблоковано.",
"blocklist": "Заблоковані користувачі",
"ipblocklist": "Список заблокованих адрес та користувачів",
"ipblocklist-legend": "Пошук заблокованого користувача",
"logentry-delete-delete": "$1 {{GENDER:$2|вилучив|вилучила}} сторінку $3",
"logentry-delete-restore": "$1 {{GENDER:$2|відновив|відновила}} сторінку $3",
"logentry-delete-event": "$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5 запису журналу|$5 записів журналу}} на $3: $4",
- "logentry-delete-revision": "$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5 версії|$5 версій}} на сторінці $3: $4",
+ "logentry-delete-revision": "$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5|$5 версії|$5 версій}} на сторінці $3: $4",
"logentry-delete-event-legacy": "$1 {{GENDER:$2|змінив|змінила}} видимість записів журналу подій $3",
"logentry-delete-revision-legacy": "$1 {{GENDER:$2|змінив|змінила}} видимість версій на сторінці $3",
"logentry-suppress-delete": "$1 {{GENDER:$2|подавив|подавила}} сторінку $3",
"nologin": "کیا آپ نے کھاتہ نہیں بنایا ہوا؟ '''$1'''۔",
"nologinlink": "کھاتا بنائیں",
"createaccount": "کھاتہ کھولیں",
- "gotaccount": "پہلے سے کھاتہ بنا ہوا ہے? '''$1'''.",
+ "gotaccount": "پہلے سے کھاتہ بنا ہوا ہے؟ '''$1'''۔",
"gotaccountlink": "داخل ہوجائیے",
"userlogin-resetlink": "داخلِ نوشتہ ہونے کی تفاصیل بھول گئے ہیں؟",
"userlogin-resetpassword-link": "کلمہ شناخت بھول گئے؟",
"newarticle": "(نیا)",
"newarticletext": "آپ نے ایک ایسے صفحے کے ربط کی پیروی کی ہے جو کہ ابھی موجود نہیں ہے.\nیہ صفحہ تخلیق کرنے کیلئے درج ذیل خانہ میں متن درج کیجئے (مزید معلومات کیلئے [$1 صفحۂ معاونت] ملاحظہ فرمائیے).\nاگر آپ یہاں غلطی سے پہنچے ہیں تو پچھلے صفحے پر واپس جانے کیلئے اپنے متصفح پر '''back''' کا بٹن ٹک کیجئے.",
"anontalkpagetext": "----''یہ صفحہ ایک ایسے صارف کا ہے جنہوں نے یا تو اب تک اپنا کھاتا نہیں بنایا یا پھر وہ اسے استعمال نہیں کر رہے/ رہی ہیں۔ لہٰذا ہمیں انکی شناخت کے لئے ایک عددی آئی پی پتہ استعمال کرنا پڑرہا ہے۔ اس قسم کا آئی پی پتہ ایک سے زائد صارفین کے لئے مشترک بھی ہوسکتا ہے۔ اگر آپکی موجودہ حیثیت ایک گمنام صارف کی ہے اور آپ محسوس کریں کہ اس صفحہ پر آپکی جانب منسوب یہ بیان غیرضروری ہے تو براہ کرم [[Special:CreateAccount|کھاتہ بنائیں]] یا [[Special:UserLogin|داخلِ نوشتہ]] ہوجائیے تاکہ مستقبل میں آپکو گمنام صارفین میں شمار کرنے سے پرہیز کیا جاسکے۔\"",
- "noarticletext": "اِس صفحہ میں فی الحال کوئی متن موجود نہیں ہے۔\nآپ دیگر صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کے لیے تلاش کرسکتے ہیں]]، <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اِس صفحہ میں ترمیم کرسکتے ہیں]</span>",
+ "noarticletext": "اِس صفحہ میں فی الحال کوئی متن موجود نہیں ہے۔\nآپ دیگر صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کو تلاش کر سکتے ہیں]]، <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات میں تلاش کر سکتے ہیں]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اِس صفحہ کو تخلیق کر سکتے ہیں]</span>۔",
"noarticletext-nopermission": "اس صفحہ میں فی الحال کوئی متن موجود نہیں ہے۔\nآپ دیگر صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کے لیے]] یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں]</span>",
"userpage-userdoesnotexist-view": "صارف کھاتہ \"$1\" مندرج نہیں ہے۔",
"updated": "(اپ ڈیٹڈ)",
"history-show-deleted": "صرف حذف شدہ",
"histfirst": "قدیم ترین",
"histlast": "تازہ ترین",
- "historysize": "({{PLURAL:$1|1 لکمہ|$1 لکم}})",
+ "historysize": "({{PLURAL:$1|1 بائٹ|$1 بائٹ}})",
"historyempty": "(خالی)",
"history-feed-title": "تاریخچۂ نظرثانی",
"history-feed-description": "ویکی پر اِس صفحہ کا تاریخچۂ نظرثانی",
"group-user-member": "صارف",
"group-autoconfirmed-member": "خودتوثیق شدہ صارف",
"group-bot-member": "خودکار صارف",
- "group-sysop-member": "منتظم",
+ "group-sysop-member": "{{GENDER:$1|منتظم}}",
"group-bureaucrat-member": "{{GENDER:$1|مامور اداری}}",
"group-suppress-member": "{{GENDER:$1|suppressor}}",
"grouppage-user": "{{ns:project}}:صارفین",
"grouppage-autoconfirmed": "{{ns:project}}:خود توثیق شدہ صارف",
"grouppage-bot": "{{ns:project}}:روبہ جات",
"grouppage-sysop": "{{ns:project}}:منتظمین",
- "grouppage-bureaucrat": "بیورو کریٹ",
+ "grouppage-bureaucrat": "{{ns:project}}:مامورین اداری",
"right-upload": "ملفات زبراثقال (اپ لوڈ) کریں",
"right-writeapi": "اے پی آئی لکھائی کا استعمال",
"right-delete": "صفحات حذف کریں",
"newpageletter": "نیا ..",
"boteditletter": " خودکار",
"rc_categories_any": "کوئی بھی منتخب",
- "rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹس}} تبدیلی کے بعد",
+ "rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹ}} تبدیلی کے بعد",
"rc-enhanced-expand": "تفصیلات دکھائیں",
"rc-enhanced-hide": "تفصیلات چھپائیے",
"recentchangeslinked": "متعلقہ تبدیلیاں",
"trackingcategories-msg": "کھوجی زمرہ",
"trackingcategories-name": "پیغام کا عنوان",
"trackingcategories-desc": "زمرہ کی شمولیت کا معیار",
+ "restricted-displaytitle-ignored": "صفحات مع نظرانداز کردہ عناوین",
"trackingcategories-disabled": "زمرہ غیر فعال ہے",
"mailnologintext": "دیگر ارکان کو برقی خط ارسال کرنے کیلیۓ لازم ہے کہ آپ [[Special:UserLogin|داخل شدہ]] حالت میں ہوں اور آپ کی [[Special:Preferences|ترجیحات]] ایک درست برقی خط کا پتا درج ہو۔",
"emailuser": "صارف کو برقی خط لکھیں",
"protectlogpage": "نوشتۂ محفوظ شدگی",
"protectedarticle": "\"[[$1]]\" کومحفوظ کردیا",
"unprotectedarticle": "\"[[$1]]\" کوغیر محفوظ کیا",
+ "movedarticleprotection": "نے \"[[$2]]\" کا درجہ حفاظت \"[[$1]]\" کی جانب منتقل کیا",
"prot_1movedto2": "[[$1]] بجانب [[$2]] منتقل",
"protectcomment": "وجہ:",
"protect-default": "تمام صارفین کو اہل بناؤ",
"whatlinkshere-next": "{{PLURAL:$1|اگلا|اگلے $1}}",
"whatlinkshere-links": "روابط ←",
"whatlinkshere-hideredirs": "رجوع مکررات $1",
- "whatlinkshere-hidetrans": "$1 تضÙ\85Û\8cÙ\86ات",
+ "whatlinkshere-hidetrans": "$1 استعÙ\85اÙ\84ات",
"whatlinkshere-hidelinks": "روابط $1",
"whatlinkshere-hideimages": "روابطِ تصاویر $1",
"whatlinkshere-filters": "فلٹرذ",
"move-watch": "صفحہ زیر نظر",
"movepagebtn": "مـنـتـقـل",
"pagemovedsub": "انتقال کامیاب",
- "movepage-moved": "'''\"$1\" منتقل کردیا گیا بطرف \"$2\"'''",
+ "movepage-moved": "<strong>\"$1\" کو \"$2\" کی جانب منتقل کر دیا گیا</strong>",
"movepage-moved-redirect": "رجوع مکرر تخلیق کر دیا گیا۔",
+ "movepage-moved-noredirect": "رجوع مکرر کو بننے سے روک دیا گیا ہے۔",
"articleexists": "اس عنوان سے کوئی صفحہ پہلے ہی موجود ہے، یا آپکا منتخب کردہ نام مستعمل نہیں۔ براۓ مہربانی دوسرا نام منتخب کیجیۓ۔",
"movelogpage": "نوشتۂ منتقلی",
"movereason": "وجہ:",
"allmessages-filter-translate": "ترجمہ",
"thumbnail-more": "چوڑا کریں",
"import": "درآمد صفحات",
- "tooltip-pt-userpage": "آپ کا صارفی صفحہ",
- "tooltip-pt-mytalk": "آپ کا صÙ\81ØÛ\82 Ú¯Ù\81تگÙ\88",
+ "tooltip-pt-userpage": "آپ کا صارف صفحہ",
+ "tooltip-pt-mytalk": "آپ کا تبادÙ\84Û\81 Ø®Û\8cاÙ\84 صÙ\81ØÛ\81",
"tooltip-pt-preferences": "آپ کی ترجیحات",
"tooltip-pt-watchlist": "اُن صفحات کی فہرست جن کی تبدیلیاں آپ کی زیرِنظر ہیں",
- "tooltip-pt-mycontris": "آپ کی شراکت کی فہرست",
+ "tooltip-pt-mycontris": "آپ کی شراکتوں کی فہرست",
"tooltip-pt-login": "آپ کیلئے داخلِ نوشتہ ہونا اچھا ہے؛ تاہم، یہ ضروری نہیں",
"tooltip-pt-logout": "خارجِ نوشتہ ہوجائیں",
"tooltip-pt-createaccount": "آپ کو مدعو کیا جاتا ہے کہ کھاتہ بنائیں۔تاہم کھاتہ بنانا لازم نہیں۔",
"file-nohires": "اس سے بڑی تصمیم دستیاب نہیں۔",
"show-big-image": "اصل ملف",
"show-big-image-preview": "اس نمائش کا حجم:$1",
+ "show-big-image-other": "دیگر {{PLURAL:$2|تجویز|تجویزیں}}: $1۔",
"show-big-image-size": "$1 × $2 pixels",
"newimages": "نئی فائلوں کی گیلری",
"ilsubmit": "تلاش",
"bydate": "بالحاظ تاریخ",
"weeks": "{{PLURAL:$1|$1ہفتہ| $1 ہفتے}}",
+ "ago": "$1 قبل",
+ "minutes-ago": "$1 {{PLURAL:$1|منٹ|منٹ}} قبل",
+ "seconds-ago": "$1 {{PLURAL:$1|سیکنڈ|سیکنڈ}} قبل",
"bad_image_list": "شکلبند درج ذیل ہے:\n\nصرف فہرستی عناصر (* سے شروع ہونے والی لکیری) شامل کی جاتی ہیں۔\nکسی لکیر میں پہلا ربط کوئی خراب ملف کا ہونا چاہئے۔\nاُسی لکیر میں باقی آنے والے ربط کو مستثنیٰ قرار دیا جاتا ہے، مثلاً صفحات جہاں ملف لکیر کے وسط میں آسکتا ہے۔",
"metadata": "میٹا ڈیٹا",
"metadata-help": "اِس ملف میں اِضافی معلومات شامل ہیں، جو کہ شاید اُس رقمی کیمرے یا سکینر سے آئے ہیں جس کے ذریعے یہ ملف بنائی گئی تھی۔\nاگر ملف اپنی اصل حالت میں نہیں رہی ہے تو کچھ تفاصیل ترمیم شدہ ملف کی مکمل طور پر عکاسی نہیں کرپائیں گے۔",
"metadata-collapse": "طویل تفاصیل چھپاؤ",
+ "metadata-fields": "تصویر کے میٹاڈیٹا کے وہ خانے جو اس پیغام میں درج ہیں وہ تصویر کے صفحے پر شامل ہوتے ہیں نیز یہ اس وقت ظاہر ہوتے ہیں جب میٹاڈیٹا کو وسیع کیا جائے۔\nالبتہ دیگر خانے ابتدائی طور پر پوشیدہ ہوتے ہیں۔\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"exif-orientation": "پیشکش",
"exif-xresolution": "چھوڑاوی دکھاوت",
"exif-yresolution": "لمباوی دکھاوت",
"hijri-calendar-m10": "شوال",
"hijri-calendar-m11": "ذوالقعدہ",
"hijri-calendar-m12": "ذوالحجہ",
+ "restricted-displaytitle": "<strong>انتباہ!:</strong> عنوان \"$1\" کو نظر انداز کر دیا گیا ہے کیونکہ یہ متعلقہ صفحہ کے عنوان کا حقیقی متبادل نہیں ہے۔",
"version": "ورژن",
"version-specialpages": "خاص صفحات",
"version-other": "دیگر",
"specialpages": "خصوصی صفحات",
"specialpages-group-pages": "فہارست صفحات",
"tag-filter": "[[Special:Tags|لوحہ]] فلٹر:",
- "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ٹیگ|ٹیگز}}]]: $2)",
+ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ٹیگ|ٹیگ}}]]: $2)",
"tags-source-header": "ماخذ",
"tags-active-header": "فعال؟",
"tags-active-yes": "ہاں",
"logentry-delete-delete": "$1 {{GENDER:$2|حذف کیا گیا}} صفحہ $3",
"logentry-move-move": "$1 نے صفحہ $3 کو بجانب $4 منتقل کیا",
"logentry-newusers-create": "صارف کھاتہ $1 {{GENDER:$2|بنایا گیا}}",
+ "logentry-protect-move_prot": "$1 نے ترتیب درجہ حفاظت $4 سے $3 کی طرف {{GENDER:$2|منتقل کی}}",
"logentry-protect-modify": "$1 نے $3 کا درجۂ حفاظت {{GENDER:$2|تبدیل کیا}} $4",
+ "logentry-rights-rights": "$1 نے {{GENDER:$6|$3}} کی گروہی رکنیت از $4 تا $5 {{GENDER:$2|تبدیل کی}}",
"logentry-upload-upload": "$1 {{GENDER:$2|اپلوڈ}} $3",
"rightsnone": "(کچھ نہیں)",
"revdelete-summary": "خلاصۂ تدوین",
"passwordreset-emailtext-user": "El utente $1 da {{SITENAME}} (probabilmente ti steso) ga richiesto l'invio de na password nova par {{SITENAME}} ($4). {{PLURAL:$3|El profiło utente asocià|I profiłi utenti asociadi}} a sto indiriso de posta ełetronega łi xe:\n\n$2\n\n{{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.\n\nSarìa mejo acedare e deçidare na nova password sùito. Se no te si stà ti a fare ła richiesta, o se te te ghe ricordà ła password originałe e no te vołi pi canbiarla, te połi ignorare sto mesajo e continuar doparare ła to password vecia.",
"passwordreset-emailelement": "Nome utente: \n$1\n\nPassword tenporanea: \n$2",
"passwordreset-emailsentemail": "Xe stà invià na mail de reset password.",
- "passwordreset-emailsent-capture": "Xe stà invià na mail de reset password: el contegù xe riportà cuà de seguito.",
- "passwordreset-emailerror-capture": "Xe stà generà na mail de reset password, riportà cuà de seguito. L'invio a {{GENDER:$2|l'utente}} no xe riusido: $1",
"changeemail": "Canbia indiriso de posta ełetronega",
"changeemail-header": "Canbia el indiriso de posta ełetronega del account",
"changeemail-no-info": "Te ghe da aver efetuà l'aceso par acedare a sta pajina diretamente.",
"minoredit": "Segna come canbiamento picenin",
"watchthis": "Tien d'ocio sta pagina",
"savearticle": "Salva sta pagina",
+ "publishpage": "Pùblica la pàjina",
+ "publishchanges": "Pùblica i to canbiamenti",
"preview": "Anteprima",
"showpreview": "Varda anteprima",
"showdiff": "Mostra canbiamenti",
"undo-failure": "No se pol mìa anular la modifica, par via de un conflito con modifiche intermedie.",
"undo-norev": "La modifica no la pode vegner anulà parché no la esiste o la xe stà scancelà.",
"undo-summary": "Anulà la modifica $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
- "cantcreateaccounttitle": "Inpossibile registrar l'utente",
"cantcreateaccount-text": "La creazion de account novi a partir da sto indirizo IP ('''$1''') la xe stà blocà da [[User:$3|$3]].\n\nLa motivazion del bloco fornìa da $3 la xe sta qua: ''$2''",
"viewpagelogs": "Varda i registri de sta pagina",
"nohistory": "La cronołogia de łe version de sta pàxena no la xè reperibiłe.",
"mw-widgets-dateinput-placeholder-day": "AAAA-MM-GG",
"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
"mw-widgets-titleinput-description-redirect": "rimando a $1",
- "api-error-blacklisted": "Par piaser siełi un titoło difarente e descritivo.",
"randomrootpage": "Pagina raìsa caxuale"
}
"tagline": "Từ {{SITENAME}}",
"help": "Trợ giúp",
"search": "Tìm kiếm",
+ "search-ignored-headings": " #<!-- để yên dòng này --> <pre>\n# Công cụ tìm kiếm sẽ bỏ qua các đề mục này.\n# Các thay đổi trên danh sách này sẽ có hiệu lực một khi trang có đề mục được đưa vào chỉ mục.\n# Để bắt trang phải được đưa lại vào chỉ mục, thực hiện một sửa đổi vô hiệu quả.\n# Cú pháp:\n# * Tất cả mọi thứ từ ký hiệu “#” để cuối dòng là chú thích.\n# * Mỗi dòng có nội dung là đúng tên đề mục để bỏ qua, phân biệt chữ hoa/thường.\nTham khảo\nChú thích\nLiên kết ngoài\nXem thêm\nĐọc thêm\n #</pre> <!-- để yên dòng này -->",
"searchbutton": "Tìm kiếm",
"go": "Xem",
"searcharticle": "Xem",
"passwordreset-emailelement": "Tên người dùng: \n$1\n\nMật khẩu tạm: \n$2",
"passwordreset-emailsentemail": "Nếu đây là đúng địa chỉ thư điện tử của tài khoản của bạn, một thư điện tử dùng để tái tạo mật khẩu sẽ được gửi cho bạn.",
"passwordreset-emailsentusername": "Nếu một địa chỉ thư điện tử đã gắn với tên người dùng này thì một thư điện tử để đặt lại mật khẩu sẽ được gửi đến.",
- "passwordreset-emailsent-capture": "Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.",
- "passwordreset-emailerror-capture": "Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến {{GENDER:$2}}người dùng: $1",
"passwordreset-emailsent-capture2": "Đã gửi {{PLURAL:$1|thư điện tử|các thư điện tử}} để đặt lại mật khẩu. {{PLURAL:$1|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
"passwordreset-emailerror-capture2": "Không gửi được thư điện tử đến {{GENDER:$2}}người dùng: $1 {{PLURAL:$3|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
"passwordreset-nocaller": "Yêu cầu hàm gọi",
"passwordreset-nodata": "Cả tên người dùng và địa chỉ thư điện tử bị thiếu",
"changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
"changeemail-header": "Điền biểu mẫu này để đổi địa chỉ thư điện tử của bạn. Nếu bạn muốn gỡ địa chỉ thư điện tử nào khỏi tài khoản của bạn, để trống hộp địa chỉ thư điện tử mới và lưu biểu mẫu.",
- "changeemail-passwordrequired": "Bạn sẽ cần phải nhập mật khẩu của bạn để xác nhận thay đổi này.",
"changeemail-no-info": "Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.",
"changeemail-oldemail": "Địa chỉ thư điện tử hiện tại:",
"changeemail-newemail": "Địa chỉ thư điện tử mới:",
"watchthis": "Theo dõi trang này",
"savearticle": "Lưu trang",
"savechanges": "Lưu các thay đổi",
- "publishpage": "Xuất bản trang",
- "publishchanges": "Xuất bản các thay đổi",
+ "publishpage": "Đăng trang",
+ "publishchanges": "Đăng thay đổi",
"preview": "Xem trước",
"showpreview": "Xem trước",
"showdiff": "Xem thay đổi",
"content-model-css": "CSS",
"content-json-empty-object": "Đối tượng trống",
"content-json-empty-array": "Mảng trống",
+ "deprecated-self-close-category": "Trang có thẻ HTML tự đóng không hợp lệ",
+ "deprecated-self-close-category-desc": "Trang này chứa thẻ HTML tự đóng không hợp lệ, ví dụ <code><b/></code> hoặc <code><span/></code>. Tí nữa cách trình bày các thẻ này sẽ thay đổi để tuân theo tiêu chuẩn HTML5, nên sự sử dụng chúng trong mã wiki bị phản đối.",
"duplicate-args-warning": "<strong>Cảnh báo:</strong> [[:$1]] đang gọi [[:$2]] với nhiều hơn một giá trị cho thông số “$3”. Chỉ giá trị cuối cùng mới được sử dụng.",
"duplicate-args-category": "Trang đưa đối số thừa vào bản mẫu",
"duplicate-args-category-desc": "Trang đưa một đối số nhiều lần vào một bản mẫu được nhúng, thí dụ <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> hoặc <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"undo-nochange": "Hình như sửa đổi này đã được lùi lại rồi.",
"undo-summary": "Đã lùi lại sửa đổi $1 của [[Special:Contributions/$2|$2]] ([[User talk:$2|thảo luận]])",
"undo-summary-username-hidden": "Đã lùi lại sửa đổi $1 của một người dùng ẩn",
- "cantcreateaccounttitle": "Không thể mở tài khoản",
"cantcreateaccount-text": "Chức năng tài tạo khoản từ địa chỉ IP này ('''$1''') đã bị [[User:$3|$3]] cấm.\n\nLý do được $3 đưa ra là ''$2''",
"cantcreateaccount-range-text": "[[User:$3|$3]] đã cấm các địa chỉ IP trong dãy <strong>$1</strong>, bao gồm địa chỉ IP của bạn (<strong>$4</strong>), không được mở tài khoản.\n\nLý do được đưa ra bởi $3 là <em>$2</em>",
"viewpagelogs": "Xem nhật trình của trang này",
"action-applychangetags": "áp dụng các thẻ cùng với những thay đổi của bạn",
"action-changetags": "thêm và loại bỏ các thẻ tùy ý trên các phiên bản riêng và các mục nhật trình",
"action-deletechangetags": "xóa thẻ khỏi cơ sở dữ liệu",
+ "action-purge": "làm mới trang này",
"nchanges": "$1 thay đổi",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sau lần truy cập vừa rồi}}",
"enhancedrc-history": "lịch sử",
"log-action-filter-patrol": "Kiểu tuần tra:",
"log-action-filter-protect": "Loại bảo vệ:",
"log-action-filter-rights": "Kiểu thay đổi quyền:",
- "log-action-filter-suppress": "Kiểu ẩn giấu",
+ "log-action-filter-suppress": "Kiểu ẩn giấu:",
"log-action-filter-upload": "Loại tải lên:",
"log-action-filter-all": "Tất cả",
"log-action-filter-block-block": "Khối",
"enhancedrc-history": "歷史",
"recentchanges": "近段辰光个改动",
"recentchanges-legend": "近段辰光个改动选项",
- "recentchanges-summary": "登该个页面浪跟踪最近对维基百科个改动。",
+ "recentchanges-summary": "登该个页面浪跟踪最近对本站个改动。",
"recentchanges-feed-description": "跟踪此订阅垃拉 wiki 高头个最近更改。",
"recentchanges-label-newpage": "箇编辑建立着新页",
"recentchanges-label-minor": "箇是小编写",
"password-change-forbidden": "איר קען נישט ענדערן פאסווערטער אויף דער וויקי.",
"externaldberror": "עס איז אדער פארגעקומען אן אויטענטיקאציע דאטנבאזע פֿעלער אדער איר זענט נישט ערמעגליכט צו דערהיינטיגן אייער דרויסנדיגע קאנטע.",
"login": "אַרײַנלאָגירן",
+ "login-security": "וועריפיצירט אייער אידענטיטעט",
"nav-login-createaccount": "ארײַנלאָגירן / זיך אײַנשרײַבן",
"userlogin": "ארײַנלאָגירן / זיך אײַנשרײַבן",
"userloginnocreate": "אַרײַנלאגירן",
"createacct-reason-ph": "פֿארוואס שאפֿט איר נאך א קאנטע",
"createacct-submit": "שאפֿט אײַער קאנטע",
"createacct-another-submit": "שאַפֿן קאנטע",
+ "createacct-continue-submit": "פֿארטזעצן שאפֿן קאנטע",
+ "createacct-another-continue-submit": "פֿארטזעצן שאפֿן קאנטע",
"createacct-benefit-heading": "{{SITENAME}} איז געמאכט דורך מענטשן ווי איר.",
"createacct-benefit-body1": "{{PLURAL:$1|רעדאַקטירונג|$1 רעדאַקטירונגען}}",
"createacct-benefit-body2": "$1 {{PLURAL:$1|בלאַט|בלעטער}}",
"passwordreset-emailelement": "באַניצער נאָמען: \n$1\n\nפראוויזארישער פּאַראָל: \n$2",
"passwordreset-emailsentemail": "טאמער איז דער ע־פאסט אדרעס פארקניפט מיט אייער קאנטע, וועט מען שיקן א פאסווארט צוריקשטעלן ע-פּאָסט.",
"passwordreset-emailsentusername": "טאמער איז פאראן אן ע־פאסט אדרעס פארקניפט מיט דעם באניצער־נאמען, וועט מען שיקן א פאסווארט צוריקשטעלן ע-פּאָסט.",
- "passwordreset-emailsent-capture": "מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.",
- "passwordreset-emailerror-capture": "מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1",
"passwordreset-nocaller": "מען דארף פֿארזארגן א רופֿער",
"passwordreset-invalideamil": "אומגילטיקער ע־פאסט אדרעס",
"changeemail": "ענדערן אדער אראפנעמען ע-פּאָסט אַדרעס",
"changeemail-header": "דערגאַנצט די פֿאָרעם צו ענדערן אייער ע-פּאָסט אַדרעס .\nטאמער ווילט איר אראפנעמען די צוארדנונג פון איינעם פון אייערע ע־פאסט אדרעסן פו אייער קאנטע, לאזט ליידיג דעם נייעם ע־פאסט אדרעס ווען איר גיט איין די פֿארעם.",
- "changeemail-passwordrequired": "איר וועט דארפן איינגעבן אייער פאסווארט צו באשטעטיגן די ענדערונג.",
"changeemail-no-info": "איר דאַרפֿט זיין אַרײַנלאגירט צוצוקומען גלײַך צו דעם דאָזיגן בלאַט.",
"changeemail-oldemail": "קראַנטער ע-פּאָסט אַדרעס:",
"changeemail-newemail": "נײַער בליצפּאָסט אַדרעס:",
"minoredit": "דאס איז א מינערדיגע ענדערונג",
"watchthis": "טוט אױפֿפּאַסן דעם בלאט",
"savearticle": "אויפהיטן בלאַט",
- "publishpage": "פובליצירן בלאט",
+ "publishpage": "פובליקירן בלאַט",
+ "publishchanges": "פובליקירן ענדערונגען",
"preview": "פֿאראויסקוק",
"showpreview": "ווייזן פאָרױסקוק",
"showdiff": "ווײַז די ענדערונגען",
"content-json-empty-object": "ליידיגער אביעקט",
"content-json-empty-array": "ליידיגער אריי",
"duplicate-args-warning": "<strong>ווארענונג:</strong> [[:$1]] רופט [[:$2]] מיט מער ווי איין ווערט פארן פאראמעטער \"$3\". נאר דעם לעצטן ווערט וועט מען ניצן.",
- "duplicate-args-category": "×\91×\9c×¢×\98ער ×\95×\95×\90ס × ×\99צ×\9f ×\92×¢×\98×\90פ×\9c×\98×¢ ×\90ר×\92×\95×\9e×¢× ×\98×\9f ×\90×\99×\9f ×\9e×\95ס×\98ער ר×\95פ×\9f",
+ "duplicate-args-category": "×\91×\9c×¢×\98ער ×\95×\95×\90ס × ×\99צ×\9f ×\92×¢×\98×\90פ×\9c×\98×¢ ×\90ר×\92×\95×\9e×¢× ×\98×\9f ×\90×\99×\9f ×\90 ×\9e×\95ס×\98ער־ר×\95×£",
"duplicate-args-category-desc": "דער בלאט אנטהאלט מוסטער־אויפרופן וואס ניצן דופליקאטן פון ארגומענטן, ווי למשל <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
"expensive-parserfunction-warning": "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.\n\nער דארף האבן ווינציגער פון $2 {{PLURAL:$2|רוף|רופן}}, אבער אצינד {{PLURAL:$1|איז דא $1 רוף|זענען דא $1 רופן}}.",
"expensive-parserfunction-category": "בלעטער מיט צופֿיל טייערע פאַרזער פֿונקציאן רופֿן",
"undo-nochange": "אויבערפלעכטלעך איז די רעדאקטירונג שוין געווארן אנולירט.",
"undo-summary": "זיי מבטל רי-ווערסיע $1 פון [[Special:Contributions/$2|$2]] ([[User talk:$2|רעדן]])",
"undo-summary-username-hidden": "זײַט מבטל ווערסיע $1 פון א באהאלטענעם באניצער",
- "cantcreateaccounttitle": "מען קען נישט באשאפֿן קאנטע",
"cantcreateaccount-text": "שאפֿן קאנטעס פון דעם IP אדרעס (<b>$1</b>) איז געווארן בלאקירט דורך [[User:$3|$3]]. די סיבה געגעבן פֿון $3 איז \"$2\".",
"cantcreateaccount-range-text": "שאפן קאנטעס פון IP אדרעסן אינעם אפשטאנד <strong>$1</strong>, וואס נעמט אײַן אײַער IP אדרעס (<strong>$4</strong>), איז בלאקירט געווארן דורך [[User:$3|$3]].\n\nדער גרונט געגעבן פון $3 איז <em>$2</em>",
"viewpagelogs": "װײַזן לאָג-ביכער פֿאַר דעם בלאַט",
"tooltip-ca-nstab-category": "באקוקט דעם קאטעגאריע בלאט",
"tooltip-minoredit": "באצייכענען דאס אלס מינערדיגע ענדערונג",
"tooltip-save": "אויפֿהיטן אייערע ענדערונגען",
+ "tooltip-publish": "פובליקירן אייערע ענדערונגען",
"tooltip-preview": "פֿארויסדיגע ווײַזונג, זײַט אזוי גוט באניצט די געלעגנהייט פֿארן אויפֿהיטן!",
"tooltip-diff": "ווײַזן אייערע ענדערונגען צום טעקסט",
"tooltip-compareselectedversions": "פארגלײַכם די צוויי ווערסיעס פון דעם בלאט",
"log-action-filter-upload": "טיפ ארויפֿלאד:",
"log-action-filter-all": "אַלע",
"log-action-filter-delete-delete": "אויסמעקן בלאט",
+ "log-action-filter-import-interwiki": "אריבערוויקי אימפארט",
"log-action-filter-protect-unprotect": "אראפנעמען שיץ"
}
"Urhixidur",
"아라",
"Macofe",
- "Matma Rex"
+ "Matma Rex",
+ "Wikicology"
]
},
"tog-underline": "Ìfàlàsábẹ́ àwọn àjápọ̀:",
"otherlanguages": "Àwọn èdè míràn",
"redirectedfrom": "(Àtúnjúwe láti $1)",
"redirectpagesub": "Ojúewé àtúnjúwe",
+ "redirectto": "àtúnjúwe sí",
"lastmodifiedat": "Àtunṣe ojúewé yi gbẹ̀yìn wáyé ni ago $2, ọjọ́ọdún $1.",
"viewcount": "A ti wo ojúewé yi ni {{PLURAL:$1|ẹ̀kan péré|iye ìgbà $1}}.",
"protectedpage": "Ojúewé oníàbò",
"gotaccountlink": "Ẹ w'ọlé",
"userlogin-resetlink": "À bí ẹ gbàgbé ìwọlé yín?",
"userlogin-resetpassword-link": "Ṣé ẹ ti gbàgbé ọ̀rọ̀ìpamọ́ yín?",
+ "userlogin-helplink2": "Ìrànlọ́wọ́ láti wọlé",
"userlogin-loggedin": "Ẹ pilẹ̀ ti jáwọlé bíi {{GENDER:$1|$1}}.\nẸ lo fọ́ọ̀mù ìsàlẹ̀ látí jáwọlé gẹ́gẹ́ bíi oníṣe míràn.",
"userlogin-createanother": "Ìdá àkópamọ́ míràn",
"createacct-emailrequired": "Àdírẹ̀sì email",
"passwordreset-emailtext-user": "Oníṣe $1 lórí {{SITENAME}} tọrọ àtúntò ọ̀rọ̀ìpamọ́ yín fùn {{SITENAME}} ($4). {{PLURAL:$3|Àkópamọ́|Àwọn àkópamọ́}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pọ̀ mọ́ àdírẹ̀sì e-mail yìí:\n\n$2\n\n{{PLURAL:$3|Ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ yìí|Àwọn ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ wọ̀nyí}} yíò dópin lẹ́yìn {{PLURAL:$5|ọjọ́ kan|ọjọ́ $5}}.\nẸ gbọ́dọ̀ lọ yan ọ̀rọ̀ìpamọ́ tuntun báyìí. Tóbá jẹ́ pé ẹ̀lòmíràn ló ṣe ìtọrọ yìí, tàbí tọ́bá jẹ́ pé ẹ ti rántí ọ̀rọ̀ìpamọ́ àtètèkọ́ṣe yín, tí ẹ kọ̀ sí fẹ́ yíipadà mọ́, ẹ lé ṣàìkàsí ìránṣẹ́ yìí, kí ẹ sì tẹ̀síwájú ní lo ọ̀rọ̀ìpamọ́ àtijọ́ yín.",
"passwordreset-emailelement": "Orúkọ oníṣe: \n$1\n\nỌ̀rọ̀ìpamọ́ ìgbàdíẹ̀: \n$2",
"passwordreset-emailsentemail": "E-mail àtúntò ọ̀rọ̀ìpamọ́ ti jẹ́ fífiránṣẹ́.",
- "passwordreset-emailsent-capture": "E-mail àtúntò ọ̀rọ̀ìpamọ́ kan ti jẹ́ fífiránṣẹ́. Òhun nìyí nísàlẹ̀.",
- "passwordreset-emailerror-capture": "E-mail ìyípadà ọ̀rọ̀ìpamọ́ jẹ́ dídá, òhun lóhàn nísàlẹ̀ yìí, sùgbọ́n ìfiránṣẹ́ rẹ̀ sí {{GENDER:$2|oníṣe}} náà kùnà: $1",
"changeemail": "Ìyípadà àdírẹ̀sì E-mail",
"changeemail-header": "Ìyípadà àdírẹ̀sì e-mail àkópamọ́",
"changeemail-no-info": "Ẹ gbódọ̀ wọlé láti bósí ojúewé yìí tààrà.",
"subject": "Orí ọ̀rọ̀/àkọlé:",
"minoredit": "Àtúnṣe kékeré nìyí",
"watchthis": "M'ójútó ojúewé yìí",
- "savearticle": "Ìmúpamọ́ ojúewé",
+ "savearticle": "Ṣe àtẹ̀jáde ojú ewé",
+ "publishpage": "Ṣàtẹ̀jáde ojú ewé",
+ "publishchanges": "Ṣàtẹ̀jáde àtúnṣe",
"preview": "Àyẹ̀wò",
"showpreview": "Àkọ́yẹ̀wò",
"showdiff": "Ìfihàn àwọn àtúnṣe",
"undo-failure": "Àtúnṣe náà kò ṣe é múkúrò nítorí títakora àwọn àtúnṣe inú àrin.",
"undo-norev": "Àtúnṣe náà kò ṣe é múkúrò nítorí pé kò sí tàbí pé ó ti jẹ́ píparẹ́.",
"undo-summary": "Ìmúkúrò àtúnyẹ̀wò $1 ti [[Special:Contributions/$2|$2]] ([[User talk:$2|ọ̀rọ̀]])",
- "cantcreateaccounttitle": "Ìforúkọsílẹ̀ kò se é se",
"cantcreateaccount-text": "[[User:$3|$3]] ti dènà dídá àkópamọ́ láti orí àdírẹ́ẹ̀sì IP yìí ('''$1''').\n\nÌdí tí $3 ṣe ṣèyí ni ''$2''",
"viewpagelogs": "Ẹ wo àkọsílẹ̀ ìṣẹ̀lẹ̀ fún ojúewé yìí",
"nohistory": "Kò sí ìtàn àtùnṣe fún ojúewé yìí.",
"search-external": "Àwárí lóde",
"searchdisabled": "Ṣíṣàwárí nínú {{SITENAME}} wà ní dídálẹ́kun.\nNí báyìí ná ẹ le ṣàwárí lọ́dọ̀ Google.\nÀkíyèsí pé àwọn atọ́ka wọn fún àkóónú {{SITENAME}} le mọ́ jẹ́ tuntun.",
"search-error": "Àṣìṣe ṣẹlẹ̀ fún ìwárí: $1",
- "preferences": "Ã\80wá»\8dn ìfẹÌ\81rà n",
+ "preferences": "Ã\80wá»\8dn à à yò",
"mypreferences": "Àwọn ìfẹ́ràn",
"prefs-edits": "Iye àwọn àtúnṣe:",
"prefsnologintext2": "Ẹ jọ̀wọ́ ẹ $1 láti ṣe ìyípadà àwọn ìfẹ́ràn yín.",
"rcnotefrom": "Àwọn àtúnṣe láti ''''$2''' (títí dé '''$1''' hàn) lábẹ́.",
"rclistfrom": "Àfihàn àwọn àtúnṣe tuntun nípa bíbẹ̀rẹ̀ láti $3 $2",
"rcshowhideminor": "$1 àwọn àtúnṣe kékéèké",
+ "rcshowhideminor-show": "Fi hàn",
"rcshowhideminor-hide": "Ìbòmọ́lẹ̀",
"rcshowhidebots": "$1 àwọn bot",
"rcshowhidebots-show": "Ìfihàn",
+ "rcshowhidebots-hide": "Fi pamọ́",
"rcshowhideliu": "$1 àwọn oníṣe aforúkọsílẹ̀",
"rcshowhideliu-hide": "Ìbòmọ́lẹ̀",
"rcshowhideanons": "$1 àwọn oníṣe aláìlórúkọ",
+ "rcshowhideanons-show": "Fi hàn",
"rcshowhideanons-hide": "Ìbòmọ́lẹ̀",
"rcshowhidepatr": "$1 àwọn àtúnṣe ọlùṣọ́",
"rcshowhidemine": "$1 àwọn àtúnṣe mi",
+ "rcshowhidemine-show": "Fi hàn",
"rcshowhidemine-hide": "Ìbòmọ́lẹ̀",
"rclinks": "Ṣ'àfihàn àtúnṣe $1 tó kẹ̀yìn ní ọjọ́ $2 sẹ́yìn<br />$3",
"diff": "ìyàtọ̀",
"querypage-disabled": "Ojúewé pàtàkì yìí jẹ́ ìdálẹ́kun nítorí ìsiṣẹ́.",
"booksources": "Àwọn orísun ìwé",
"booksources-search-legend": "Àwáàrí fún áwọn ìwé ìtọ́ka",
+ "booksources-search": "Ṣàwárí",
"booksources-text": "Nísàlẹ̀ ni àtòjọ àwọn àjápọ̀ mọ́ àwọn ibiìtakùn míràn tí wọ́n únta ìwé tuntun àti ìwé àtijọ́, wọ́n sì le ní ọ̀rọ̀ ẹ̀kúnrẹ́rẹ́ nípa àwọn ìwé tí ẹ únwá:",
"booksources-invalid-isbn": "ISBN náà kò dà bíi pé ó jẹ́ oníìbámu; ẹ yẹ̀ ẹ́ wò bóyá àsìṣe wà láti ibi tó jẹ́ kíkọ wá.",
"specialloguserlabel": "Olùṣe:",
"contributions": "Àwọn àfikún {{GENDER:$1|oníṣe}}",
"contributions-title": "Àwọn àfikún oníṣe fún $1",
"mycontris": "Àwọn àfikún",
+ "anoncontribs": "Àwọn àfikún",
"contribsub2": "Fún {{GENDER:$3|$1}} ($2)",
"nocontribs": "Kò sí àtúnṣe tuntun tó bá àwárí mu.",
"uctop": "(lówọ́)",
"whatlinkshere-links": "← àwọn ìjápọ̀",
"whatlinkshere-hideredirs": "$1 àtúnjúwe",
"whatlinkshere-hidetrans": "$1 ìkómọ́ra",
- "whatlinkshere-hidelinks": "$1 ìjápọ̀",
+ "whatlinkshere-hidelinks": "$1 Ã\80wá»\8dn ìjápá»\8dÌ\80",
"whatlinkshere-hideimages": "$1 àwọn ìjápọ̀ fáìlì",
"whatlinkshere-filters": "Ajọ̀",
"autoblockid": "Ìdínàaláraẹni #$1",
"import-logentry-interwiki-detail": "{{PLURAL:$1|Àtúnyẹ̀wò|Àwọn àtúnyẹ̀wò}} $1 láti $2",
"javascripttest": "Ìdánwò JavaScript",
"javascripttest-qunit-intro": "Ẹ wo [$1 ìwé aṣàlàyé ìdánwò] ní mediawiki.org.",
- "tooltip-pt-userpage": "Ojúewé oníṣe yín",
+ "tooltip-pt-userpage": "Ojúewé oníṣe rẹ",
"tooltip-pt-anonuserpage": "Ojúewé oníṣe fún àdírẹ́ẹ̀sì IP tí ẹ únlò láti ṣàtúnṣe",
- "tooltip-pt-mytalk": "Ojúewé ọ̀rọ̀ yín",
+ "tooltip-pt-mytalk": "Ojúewé ọ̀rọ̀ rẹ",
"tooltip-pt-anontalk": "Ọ̀rọ̀ nípa àtúnṣe láti àdírẹ́ẹ̀sì IP yìí",
- "tooltip-pt-preferences": "Àwọn ìfẹ́ràn mi",
+ "tooltip-pt-preferences": "Àwọn ìfẹ́ràn rẹ",
"tooltip-pt-watchlist": "Àkójọ àwọn ojúewé tí ẹ̀ ún mójútó bóyá wọ́nyí padà",
- "tooltip-pt-mycontris": "Àkójọ àwọn àfikún yín",
+ "tooltip-pt-mycontris": "Àkójọ àwọn àfikún rẹ",
"tooltip-pt-login": "A gbà yín níyànjú kí ẹwọlé, bótilẹ̀jẹ́pẹ́ kò pọndandan.",
"tooltip-pt-logout": "Ìjáde",
"tooltip-pt-createaccount": "Ó dára kí ẹ dá àkópamọ́ kí ẹ sì ṣe ìtẹ̀jáwọlé, ṣùgbọ́n kò pọn dandan",
"logentry-rights-rights": "$1 yí ìjọ́mọ ẹgbẹ́ padà fún $3 láti $4 sí $5",
"logentry-rights-rights-legacy": "$1 {{GENDER:$2|yí}} ọmọ ẹgbẹ́ padà fún $3",
"logentry-rights-autopromote": "$1 jẹ́ {{GENDER:$2|gbígbénípòga}} nífúnraẹni láti $4 sí $5",
+ "logentry-upload-upload": "Ó dàfikún",
"rightsnone": "(kòsí)",
"revdelete-summary": "àkótán àtúnṣe",
"feedback-adding": "Ìfikún ìdáhùn sí ojúewé...",
"Yueman",
"CRCHF",
"Shinjiman",
- "Macofe"
+ "Macofe",
+ "Jdforrester"
]
},
"tog-underline": "連結加底線:",
"passwordreset-emailtext-user": "{{SITENAME}}用戶$1請求更改閣下喺{{SITENAME}}道嘅密碼$4。同爾個電子郵件有關聯嘅用戶包括:\n\n$2\n\n{{PLURAL:$3|爾個|爾啲}}臨時密碼會喺{{$5}}日之後失效。\n\n如果係閣下自己請求改密碼嘅,請馬上登錄{{SITENAME}}並且更改密碼。如果閣下諗返起自己個密碼,或者根本無申請過改密碼嘅話,請忽略爾條訊息,繼續用返舊密碼。",
"passwordreset-emailelement": "用戶名:\n$1\n\n臨時密碼:\n$2",
"passwordreset-emailsentemail": "若果你個戶口有登記電郵,密碼重設電郵經已送出。",
- "passwordreset-emailsent-capture": "密碼重設電郵經已送出,下面有顯示。",
- "passwordreset-emailerror-capture": "密碼重設電郵經已送出,下面有顯示,但送畀{{GENDER:$2|user}}時失敗: $1",
"changeemail": "改或者剷走電郵地址",
"changeemail-header": "填好呢份表去改戶口電郵地址。若果你想剷走你戶口個電郵地址,填表時請將電郵地址欄留空。",
- "changeemail-passwordrequired": "你要入密碼去確認改動。",
"changeemail-no-info": "你一定要簽到咗去直接入來呢一版。",
"changeemail-oldemail": "而家個電郵地址:",
"changeemail-newemail": "新電郵地址:",
"minoredit": "呢個係小修改",
"watchthis": "睇實呢一頁",
"savearticle": "儲存呢頁",
+ "publishpage": "發佈呢頁",
+ "publishchanges": "發佈修改",
"preview": "預覽",
"showpreview": "顯示預覽",
"showdiff": "顯示差異",
"undo-nochange": "呢個編輯睇嚟經已一早取消咗。",
"undo-summary": "取消由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])所做嘅修訂 $1",
"undo-summary-username-hidden": "取消匿埋咗嘅用戶嘅修改版本 $1",
- "cantcreateaccounttitle": "唔可以開新戶口",
"cantcreateaccount-text": "由呢個IP地址 ('''$1''') 開嘅新戶口已經被[[User:$3|$3]]封鎖。\n\n當中俾$3封鎖嘅原因係''$2''",
"cantcreateaccount-range-text": "由呢個IP地址範圍<strong>$1</strong>(包括你個IP <strong>$4</strong>)開嘅新戶口已經畀[[User:$3|$3]]封鎖咗。\n\n$3畀嘅理由係<em>$2</em>",
"viewpagelogs": "睇呢頁嘅日誌",
"Apflu",
"飞舞回堂前",
"Cosine02",
- "Arthur2e5"
+ "Arthur2e5",
+ "Myy730",
+ "SolidBlock"
]
},
"tog-underline": "链接下划线:",
"tagline": "来自{{SITENAME}}",
"help": "帮助",
"search": "搜索",
+ "search-ignored-headings": " #<!-- 请将此行保持原样 --> <pre>\n# 将被搜索忽略的标题。\n# 对此页面的更改会在带标题的页面被索引时产生影响。\n# 您可以通过进行空编辑来强制页面重新索引。\n# 语法如下:\n# * 所有以“#”开头的行都是注释。\n# * 所有非空白行都是要忽略的标题。\n参考文献\n外部链接\n参见\n #</pre> <!-- 请将此行保持原样 -->",
"searchbutton": "搜索",
"go": "前往",
"searcharticle": "前往",
"youhavenewmessagesmanyusers": "您有来自多个用户的$1($2)。",
"newmessageslinkplural": "{{PLURAL:$1|新信息|999=新消息}}",
"newmessagesdifflinkplural": "最后{{PLURAL:$1|更改|999=更改}}",
- "youhavenewmessagesmulti": "你在$1有新信息",
+ "youhavenewmessagesmulti": "您在$1有新信息",
"editsection": "编辑",
"editold": "编辑",
"viewsourceold": "查看源代码",
"databaseerror-query": "查询:$1",
"databaseerror-function": "函数:$1",
"databaseerror-error": "错误:$1",
- "transaction-duration-limit-exceeded": "因为写入时间($1)超过了$2{{PLURAL:$2|秒}}的限制,为防止创建大量复制延迟,此次处理已被中止。如果您正在同时更改很多项目,请尝试进行多次小规模操作。",
+ "transaction-duration-limit-exceeded": "因为写入时间($1)超过了$2秒的限制,为防止创建大量复制延迟,此次处理已被中止。如果您正在同时更改很多项目,请尝试进行多次小规模操作。",
"laggedslavemode": "<strong>警告:</strong>页面中可能没有包含最近的更新。",
"readonly": "数据库被锁定",
"enterlockreason": "请输入锁定的原因,这包括预计解除锁定的时间",
"password-login-forbidden": "这个用户名称及密码的使用是被禁止的。",
"mailmypassword": "重置密码",
"passwordremindertitle": "{{SITENAME}}的新临时密码",
- "passwordremindertext": "有人(可能是您,来自IP地址$1)已请求{{SITENAME}}的新密码($4)。\n用户“$2”的一个新临时密码现在已被设置好为“$3”。\n如果这个动作是您所指示的,您便需要立即登录并选择一个新的密码。\n您的临时密码会于$5天内过期。\n\n如果是其他人发出了该请求,或者您已经记起了您的密码并不准备改变它,您可以忽略此消息并继续使用您的旧密码。",
+ "passwordremindertext": "有人(可能是您,来自IP地址$1)已请求{{SITENAME}}的新密码($4)。用户“$2”的临时密码现在已被设置为“$3”。如果这个动作是您所指示的,您便需要立即登录并设置一个新的密码。您的临时密码会于{{PLURAL:$5|一天|$5天}}内过期。\n\n如果是其他人发出了该请求,或者您已经记起了您的密码并不准备改变它,您可以忽略此消息并继续使用您的旧密码。",
"noemail": "用户\"$1\"没有登记电子邮件地址。",
"noemailcreate": "您需要提供一个有效的电子邮件地址",
"passwordsent": "用户\"$1\"的新密码已经寄往所登记的电子邮件地址。\n请在收到后再登录。",
"passwordreset-emailelement": "用户名:\n$1\n\n临时密码:\n$2",
"passwordreset-emailsentemail": "如果此邮件地址与您的账户相关联的话,将发送一封密码重置邮件。",
"passwordreset-emailsentusername": "如果有邮件地址与此用户名相关联的话,将发送一封密码重置邮件。",
- "passwordreset-emailsent-capture": "密码重设电子邮件已发送,并在下面显示。",
- "passwordreset-emailerror-capture": "重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1",
"passwordreset-emailsent-capture2": "密码重置{{PLURAL:$1|邮件}}已发送。{{PLURAL:$1|用户名和密码|用户名和密码列表}}在下方显示。",
"passwordreset-emailerror-capture2": "向{{GENDER:$2|用户}}发送电子邮件失败:$1 {{PLURAL:$3|用户名和密码|用户名和密码列表}}在下方显示。",
"passwordreset-nocaller": "必须提供一个调用方",
"passwordreset-nodata": "用户名和电子邮件地址均未提供",
"changeemail": "更改或移除电子邮件地址",
"changeemail-header": "完成此表格以更改您的电子邮件地址。如果您希望从您的账户中移除任何关联的电子邮件地址,请在提交表格时将新电子邮件地址留空。",
- "changeemail-passwordrequired": "您需要输入您的密码以确认此次更改。",
"changeemail-no-info": "\n您必须登录以直接访问本页。",
"changeemail-oldemail": "当前电子邮件地址:",
"changeemail-newemail": "新的电子邮件地址:",
"clearyourcache": "<strong>注意:</strong>在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* <strong>Firefox或Safari:</strong>按住<em>Shift</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>或<em>Ctrl-R</em>(Mac为<em>⌘-R</em>)\n* <strong>Google Chrome:</strong>按<em>Ctrl-Shift-R</em>(Mac为<em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong>按住<em>Ctrl</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>\n* <strong>Opera:</strong>前往<em>菜单 → 设置</em>(Mac为<em>Opera → Preferences</em>),然后<em>隐私和安全 → 清除浏览数据 → 缓存的图片和文件</em>。",
"usercssyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
"userjsyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
- "usercsspreview": "<strong>请记住您现在只是在预览你的用户CSS。它尚未保存!</strong>",
+ "usercsspreview": "<strong>请记住您现在只是在预览您的用户CSS。它尚未保存!</strong>",
"userjspreview": "<strong>请记住您现在只是在测试/预览您的用户JavaScript。它尚未保存!</strong>",
- "sitecsspreview": "<strong>请记住你现在只是在预览该CSS。它尚未保存!</strong>",
+ "sitecsspreview": "<strong>请记住您现在只是在预览该CSS。它尚未保存!</strong>",
"sitejspreview": "<strong>请记住您现在只是在预览该JavaScript代码。它尚未保存!</strong>",
"userinvalidcssjstitle": "<strong>警告:</strong>不存在皮肤“$1”。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
"updated": "(已更新)",
"undo-nochange": "这次编辑似乎已被撤销。",
"undo-summary": "撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1",
"undo-summary-username-hidden": "取消由一匿名用户所作的版本$1",
- "cantcreateaccounttitle": "无法创建账户",
"cantcreateaccount-text": "从该IP地址(<strong>$1</strong>)创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是<em>$2</em>",
"cantcreateaccount-range-text": "从该IP地址段<strong>$1</strong>的账户创建已被[[User:$3|$3]]禁止,而这也包括了您的IP地址(<strong>$4</strong>)。\n\n$3给出的原因是<em>$2</em>",
"viewpagelogs": "查看该页面的日志",
"last": "之前",
"page_first": "首页",
"page_last": "末页",
- "histlegend": "差异选择:选中要对比的版本的单选按钮,按Enter键或下方的按钮。<br />\n说明:<strong>({{int:cur}})</strong>=与最后版本之间的差异,<strong>({{int:last}})</strong>=与上一版本之间的差异,<strong>{{int:minoreditletter}}</strong>=小编辑。",
+ "histlegend": "差异选择:选中要对比的版本的单选按钮,按Enter键或下方的按钮。<br />说明:<strong>({{int:cur}})</strong>=与最后版本之间的差异,<strong>({{int:last}})</strong>=与上一版本之间的差异,<strong>{{int:minoreditletter}}</strong>=小编辑。",
"history-fieldset-title": "浏览历史",
"history-show-deleted": "仅显示已删除的版本",
"histfirst": "最旧",
"searchdisabled": "{{SITENAME}}的搜索已被禁用。您可以暂时使用搜索引擎进行搜索,须注意他们索引的{{SITENAME}}内容可能不是最新的。",
"search-error": "搜索时发生错误:$1",
"preferences": "设置",
- "mypreferences": "设置",
+ "mypreferences": "参数设置",
"prefs-edits": "编辑数:",
"prefsnologintext2": "请登录以更改您的用户设置。",
"prefs-skin": "皮肤",
"action-applychangetags": "连同您的更改应用标签",
"action-changetags": "在个别修订和日志记录中添加和移除任意标签",
"action-deletechangetags": "从数据库删除标签",
+ "action-purge": "刷新此页面",
"nchanges": "$1次更改",
"enhancedrc-since-last-visit": "{{PLURAL:$1|上次访问后}}$1个",
"enhancedrc-history": "历史",
"emailpagetext": "您可以使用下面的表格发送电子邮件信息至该{{GENDER:$1|用户}}。您在[[Special:Preferences|系统设置]]中输入的电子邮件地址将显示为邮件的“发件人”地址,所以该用户将可以直接回复您。",
"defemailsubject": "来自{{SITENAME}}用户“$1”的电子邮件",
"usermaildisabled": "用户电子邮件停用",
- "usermaildisabledtext": "你不能发送电子邮件至本wiki的其他用户",
+ "usermaildisabledtext": "您不能发送电子邮件至本wiki的其他用户",
"noemailtitle": "无电子邮件地址",
"noemailtext": "该用户还没有指定一个有效的电子邮件地址。",
"nowikiemailtext": "该用户已经选择不接收来自其他用户的电子邮件。",
"watchnologin": "未登录",
"addwatch": "添加至监视列表",
"addedwatchtext": "“[[:$1]]”及其讨论页已加入至您的[[Special:Watchlist|监视列表]]中。",
+ "addedwatchtext-talk": "“[[:$1]]”及其相关联页面已加入至您的[[Special:Watchlist|监视列表]]中。",
"addedwatchtext-short": "页面“$1”已加入您的监视列表。",
"removewatch": "从监视列表中删除",
"removedwatchtext": "“[[:$1]]”及其讨论页已从您的[[Special:Watchlist|监视列表]]中移除。",
+ "removedwatchtext-talk": "“[[:$1]]”及其相关联页面已从您的[[Special:Watchlist|监视列表]]中移除。",
"removedwatchtext-short": "页面“$1”已从您的监视列表移除。",
"watch": "监视",
"watchthispage": "监视本页",
"markaspatrolleddiff": "标记为已巡查",
"markaspatrolledtext": "标记此页面为已巡查",
"markaspatrolledtext-file": "将此文件版本标记为已巡查",
- "markedaspatrolled": "标记为已检查",
+ "markedaspatrolled": "标记为已巡查",
"markedaspatrolledtext": "[[:$1]]的已选中版本已被标识为已巡查。",
"rcpatroldisabled": "最近更改巡查已禁用",
"rcpatroldisabledtext": "最近更改巡查功能目前已关闭。",
- "markedaspatrollederror": "不能标志为已检查",
- "markedaspatrollederrortext": "你需要指定一个版本以标记为已巡查。",
- "markedaspatrollederror-noautopatrol": "你不能把自己的更改标记为已检查。",
+ "markedaspatrollederror": "不能标记为已巡查",
+ "markedaspatrollederrortext": "您需要指定一个版本以标记为已巡查。",
+ "markedaspatrollederror-noautopatrol": "您不被允许将您自己的更改标记为已巡查。",
"markedaspatrollednotify": "$1的更改已被标记为已巡查。",
"markedaspatrollederrornotify": "标记为已巡查失败。",
"patrol-log-page": "巡查日志",
"watchlistedit-raw-submit": "更新监视列表",
"watchlistedit-raw-done": "您的监视列表已经更新。",
"watchlistedit-raw-added": "$1个标题被添加:",
- "watchlistedit-raw-removed": "$1个标题被删除:",
+ "watchlistedit-raw-removed": "$1个标题被移除:",
"watchlistedit-clear-title": "清空监视列表",
"watchlistedit-clear-legend": "清空监视列表",
"watchlistedit-clear-explain": "所有标题将从您的监视列表中移除",
"version-license-not-found": "未找到此扩展相关的详细授权信息。",
"version-credits-title": "$1贡献者名单",
"version-credits-not-found": "未找到此扩展相关的详细制作人信息。",
- "version-poweredby-credits": "本Wiki由'''[https://www.mediawiki.org/ MediaWiki]'''驱动,版权所有 © 2001-$1 $2。",
+ "version-poweredby-credits": "本Wiki由<strong>[https://www.mediawiki.org/ MediaWiki]</strong>驱动,版权所有 © 2001-$1 $2。",
"version-poweredby-others": "其他",
"version-poweredby-translators": "translatewiki.net上的翻译者",
"version-credits-summary": "我们感谢下列人士为[[Special:Version|MediaWiki]]作出的贡献。",
"Zerng07",
"Reke",
"Kly",
- "Cosine02"
+ "Cosine02",
+ "一個正常人"
]
},
"tog-underline": "底線標示連結:",
"tagline": "出自 {{SITENAME}}",
"help": "說明",
"search": "搜尋",
+ "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# 在搜尋中要忽略的標題。\n# 更該此檔案以快速對己列入索引的頁面標題生效。\n# 您可以編輯時不變更內容以強制頁面重新索引。\n# 語法如下:\n# * 任何以 \"#\" 字元開頭的行至結尾會做為註解。\n# * 任何非空白行代表要忽略的標題。\n參考文獻\n外部連結\n參見\n #</pre> <!-- leave this line exactly as it is -->",
"searchbutton": "搜尋",
"go": "前往",
"searcharticle": "執行",
"databaseerror-query": "查詢:$1",
"databaseerror-function": "功能:$1",
"databaseerror-error": "錯誤:$1",
- "transaction-duration-limit-exceeded": "為了避免造成大量備援延遲,因寫入時間 ($1) 已超出了 $2 {{PLURAL:$2|秒|秒}}限制,此次操作已被中止。\n若您一次修改了許多項目,可嘗試分批處理。",
+ "transaction-duration-limit-exceeded": "為了避免造成大量備援延遲,因寫入時間 ($1) 已超出了 $2 秒限制,此次操作已被中止。\n若您一次修改了許多項目,可嘗試分批處理。",
"laggedslavemode": "<strong>警告:</strong>頁面可能不包含最近的更新。",
"readonly": "資料庫已鎖定",
"enterlockreason": "請輸入鎖定的原因,包括估計重新開放的時間",
"passwordreset-emailelement": "使用者名稱:\n$1\n\n臨時密碼:\n$2",
"passwordreset-emailsentemail": "若此確實為您帳號所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
"passwordreset-emailsentusername": "若此確實為您使用者名稱所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
- "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並於下方顯示。",
- "passwordreset-emailerror-capture": "下列為重設密碼的電子郵件內容,傳送給{{GENDER:$2|使用者}}失敗:$1",
"passwordreset-emailsent-capture2": "密碼重設{{PLURAL:$1|郵件|郵件}}已寄出,{{PLURAL:$1|使用者名稱與密碼|使用者名稱與密碼}}如下顯示。",
"passwordreset-emailerror-capture2": "寄發電子郵件給{{GENDER:$2|使用者}}失敗:$1,{{PLURAL:$3|使用者名稱與密碼|使用者名稱與密碼}}如下顯示。",
"passwordreset-nocaller": "必須提供 caller",
"passwordreset-nodata": "未提供使用者名稱或是電子郵件地址",
"changeemail": "變更或移除電子郵件地址",
"changeemail-header": "請填寫此表單來變更您的電子郵件地址,若您想要移除您帳號所連結的所有電子郵件地址,請於新電子郵件地址欄位留空。",
- "changeemail-passwordrequired": "您須要輸入您的密碼來確認此次變更。",
"changeemail-no-info": "您必須登入方可直接存取此頁面。",
"changeemail-oldemail": "目前的電子郵件地址:",
"changeemail-newemail": "新的電子郵件地址:",
"content-model-css": "CSS",
"content-json-empty-object": "空物件",
"content-json-empty-array": "空陣列",
+ "deprecated-self-close-category": "使用無效 Self-closed HTML 標籤的頁面",
+ "deprecated-self-close-category-desc": "頁面包含無效的 Self-closed HTML 標籤,如 <code><b/></code> or <code><span/></code>。這些標籤的模式將會更改為與 HTML5 規格一致,因此 wikitext 的這種用法已停用。",
"duplicate-args-warning": "<strong>警告:</strong> [[:$1]] 呼叫 [[:$2]] 的 \"$3\" 參數使用了超過一次,僅會使用提供的最後一個參數值。",
"duplicate-args-category": "模板呼叫時使用重複的參數的頁面",
"duplicate-args-category-desc": "該頁面包含重複使用參數的模板呼叫,如 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> 或 <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
"undo-nochange": "此編輯已被還原。",
"undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 所作出的修訂 $1",
"undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
- "cantcreateaccounttitle": "無法建立帳號",
"cantcreateaccount-text": "自這個 IP 位址 (<strong>$1</strong>) 建立帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 <em>$2</em>",
"cantcreateaccount-range-text": "來自 IP 位址範圍 <strong>$1</strong>,包含您的 IP 位址 (<strong>$4</strong>) 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 <em>$2</em>",
"viewpagelogs": "檢視此頁面的日誌",
"action-applychangetags": "連同您的變更一起套用標籤",
"action-changetags": "加入與移除任何於各別修訂與日誌項目的標籤",
"action-deletechangetags": "從資料庫刪除標籤",
+ "action-purge": "刷新此頁面",
"nchanges": "$1 次變更",
"enhancedrc-since-last-visit": "{{PLURAL:$1|自上次拜訪}}已有 $1",
"enhancedrc-history": "歷史",
"watchlistedit-normal-legend": "從監視清單中移除標題",
"watchlistedit-normal-explain": "下方顯示在您監視清單中的標題。\n要移除標題,請勾選該標題旁的核選方塊並點選 \"{{int:Watchlistedit-normal-submit}}\"。\n您也可 [[Special:EditWatchlist/raw|編輯原始監視清單]]。",
"watchlistedit-normal-submit": "移除標題",
- "watchlistedit-normal-done": "已於您的監視清單中移除 $1 個標題:",
+ "watchlistedit-normal-done": "已於您的監視清單中移除 {{PLURAL:$1|$1}} 個標題:",
"watchlistedit-raw-title": "編輯原始監視清單",
"watchlistedit-raw-legend": "編輯原始監視清單",
"watchlistedit-raw-explain": "下方顯示在您監視清單中的標題,您可透過編輯來新增與移除清單項目,一個標題一行。\n完成編輯後,請點選 \"{{int:Watchlistedit-raw-submit}}\"。\n您也可 [[Special:EditWatchlist|使用標準編輯器]]。",
'Listbots' => [ 'Seznam_botů', 'Seznam_botu' ],
'ListDuplicatedFiles' => [ 'Seznam_duplicitních_souborů' ],
'Listfiles' => [ 'Seznam_souborů', 'Seznam_souboru' ],
- 'Listgrants' => [ 'Seznam_grantů' ],
+ 'Listgrants' => [ 'Seznam_skupin_oprávnění', 'Seznam_skupin_opravneni', 'Seznam_grantů' ],
'Listgrouprights' => [ 'Práva_uživatelských_skupin', 'Seznam_uživatelských_práv', 'Seznam_uzivatelskych_prav' ],
'Listredirects' => [ 'Seznam_přesměrování', 'Seznam_presmerovani' ],
'Listusers' => [ 'Uživatelé', 'Uzivatele', 'Seznam_uživatelů', 'Seznam_uzivatelu' ],
'श्रेणी_चर्चा' => NS_CATEGORY_TALK,
'मिडिया' => NS_MEDIA,
'उपेगकर्तो' => NS_USER,
- 'उपेगकर्तो चर्चा' => NS_USER_TALK
+ 'उपेगकर्तो_चर्चा' => NS_USER_TALK
];
$namespaceNames = [
NS_MEDIA => 'رسنۍ',
- NS_SPECIAL => 'Ú\81اÙ\86Ú«ړی',
+ NS_SPECIAL => 'Ú\81اÙ\86Ú¯ړی',
NS_TALK => 'خبرې_اترې',
NS_USER => 'کارن',
NS_USER_TALK => 'د_کارن_خبرې_اترې',
];
$namespaceAliases = [
+ 'ځﺎﻧګړی' => NS_SPECIAL,
'کارونکی' => NS_USER,
'د_کارونکي_خبرې_اترې' => NS_USER_TALK,
'انځور' => NS_FILE,
$fallback = 'kn';
+$namespaceNames = [
+ NS_MEDIA => 'ಮಾದ್ಯಮೊ',
+ NS_SPECIAL => 'ವಿಸೇಸೊ',
+ NS_TALK => 'ಪಾತೆರ',
+ NS_USER => 'ಬಳಕೆದಾರೆ',
+ NS_USER_TALK => 'ಬಳಕೆದಾರೆ_ಪಾತೆರ',
+ NS_PROJECT_TALK => '$1_ಪಾತೆರ',
+ NS_FILE => 'ಫೈಲ್',
+ NS_FILE_TALK => 'ಫೈಲ್_ಪಾತೆರ',
+ NS_MEDIAWIKI => 'ಮಾದ್ಯಮೊ_ವಿಕಿ',
+ NS_MEDIAWIKI_TALK => 'ಮಾದ್ಯಮೊ_ವಿಕಿ_ಪಾತೆರ',
+ NS_TEMPLATE => 'ಟೆಂಪ್ಲೇಟ್',
+ NS_TEMPLATE_TALK => 'ಟೆಂಪ್ಲೇಟ್_ಪಾತೆರ',
+ NS_HELP => 'ಸಕಾಯೊ',
+ NS_HELP_TALK => 'ಸಕಾಯೊ_ಪಾತೆರ',
+ NS_CATEGORY => 'ವರ್ಗೊ',
+ NS_CATEGORY_TALK => 'ವರ್ಗೊ_ಪಾತೆರ',
+];
+
*/
private $config;
+ /**
+ * @see Maintenance::requireExtension
+ * @var array
+ */
+ private $requiredExtensions = [];
+
/**
* Used to read the options in the order they were passed.
* Useful for option chaining (Ex. dumpBackup.php). It will
$this->config = $config;
}
+ /**
+ * Indicate that the specified extension must be
+ * loaded before the script can run.
+ *
+ * This *must* be called in the constructor.
+ *
+ * @since 1.28
+ * @param string $name
+ */
+ protected function requireExtension( $name ) {
+ $this->requiredExtensions[] = $name;
+ }
+
+ /**
+ * Verify that the required extensions are installed
+ *
+ * @since 1.28
+ */
+ public function checkRequiredExtensions() {
+ $registry = ExtensionRegistry::getInstance();
+ $missing = [];
+ foreach ( $this->requiredExtensions as $name ) {
+ if ( !$registry->isLoaded( $name ) ) {
+ $missing[] = $name;
+ }
+ }
+
+ if ( $missing ) {
+ $joined = implode( ', ', $missing );
+ $msg = "The following extensions are required to be installed "
+ . "for this script to run: $joined. Please enable them and then try again.";
+ $this->error( $msg, 1 );
+ }
+
+ }
+
/**
* Run a child maintenance script. Pass all of the current arguments
* to it.
}
public function execute() {
- global $wgDisableAuthManager;
-
if ( $this->hasOption( "user" ) ) {
$user = User::newFromName( $this->getOption( 'user' ) );
} elseif ( $this->hasOption( "userid" ) ) {
}
$password = $this->getOption( 'password' );
try {
- if ( $wgDisableAuthManager ) {
- $user->setPassword( $password );
- } else {
- $status = $user->changeAuthenticationData( [
- 'username' => $user->getName(),
- 'password' => $password,
- 'retype' => $password,
- ] );
- if ( !$status->isGood() ) {
- throw new PasswordError( $status->getWikiText( null, null, 'en' ) );
- }
+ $status = $user->changeAuthenticationData( [
+ 'username' => $user->getName(),
+ 'password' => $password,
+ 'retype' => $password,
+ ] );
+ if ( !$status->isGood() ) {
+ throw new PasswordError( $status->getWikiText( null, null, 'en' ) );
}
$user->saveSettings();
$this->output( "Password set for " . $user->getName() . "\n" );
--- /dev/null
+<?php
+/**
+ * Clean up empty categories in the category table.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to clean up empty categories in the category table.
+ *
+ * @ingroup Maintenance
+ * @since 1.28
+ */
+class CleanupEmptyCategories extends LoggedUpdateMaintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription(
+ <<<TEXT
+This script will clean up the category table by removing entries for empty
+categories without a description page and adding entries for empty categories
+with a description page. It will print out progress indicators every batch. The
+script is perfectly safe to run on large, live wikis, and running it multiple
+times is harmless. You may want to use the throttling options if it's causing
+too much load; they will not affect correctness.
+
+If the script is stopped and later resumed, you can use the --mode and --begin
+options with the last printed progress indicator to pick up where you left off.
+
+When the script has finished, it will make a note of this in the database, and
+will not run again without the --force option.
+TEXT
+ );
+
+ $this->addOption(
+ 'mode',
+ '"add" empty categories with description pages, "remove" empty categories '
+ . 'without description pages, or "both"',
+ false,
+ true
+ );
+ $this->addOption(
+ 'begin',
+ 'Only do categories whose names are alphabetically after the provided name',
+ false,
+ true
+ );
+ $this->addOption(
+ 'throttle',
+ 'Wait this many milliseconds after each batch. Default: 0',
+ false,
+ true
+ );
+ }
+
+ protected function getUpdateKey() {
+ return 'cleanup empty categories';
+ }
+
+ protected function doDBUpdates() {
+ $mode = $this->getOption( 'mode', 'both' );
+ $begin = $this->getOption( 'begin', '' );
+ $throttle = $this->getOption( 'throttle', 0 );
+
+ if ( !in_array( $mode, [ 'add', 'remove', 'both' ] ) ) {
+ $this->output( "--mode must be 'add', 'remove', or 'both'.\n" );
+ return false;
+ }
+
+ $dbw = $this->getDB( DB_MASTER );
+
+ $throttle = intval( $throttle );
+
+ if ( $mode === 'add' || $mode === 'both' ) {
+ if ( $begin !== '' ) {
+ $where = [ 'page_title > ' . $dbw->addQuotes( $begin ) ];
+ } else {
+ $where = [];
+ }
+
+ $this->output( "Adding empty categories with description pages...\n" );
+ while ( true ) {
+ # Find which category to update
+ $rows = $dbw->select(
+ [ 'page', 'category' ],
+ 'page_title',
+ array_merge( $where, [
+ 'page_namespace' => NS_CATEGORY,
+ 'cat_title' => null,
+ ] ),
+ __METHOD__,
+ [
+ 'ORDER BY' => 'page_title',
+ 'LIMIT' => $this->mBatchSize,
+ ],
+ [
+ 'category' => [ 'LEFT JOIN', 'page_title = cat_title' ],
+ ]
+ );
+ if ( !$rows || $rows->numRows() <= 0 ) {
+ # Done, hopefully.
+ break;
+ }
+
+ foreach ( $rows as $row ) {
+ $name = $row->page_title;
+ $where = [ 'page_title > ' . $dbw->addQuotes( $name ) ];
+
+ # Use the row to update the category count
+ $cat = Category::newFromName( $name );
+ if ( !is_object( $cat ) ) {
+ $this->output( "The category named $name is not valid?!\n" );
+ } else {
+ $cat->refreshCounts();
+ }
+ }
+ $this->output( "--mode=$mode --begin=$name\n" );
+
+ wfWaitForSlaves();
+ usleep( $throttle * 1000 );
+ }
+
+ $begin = '';
+ }
+
+ if ( $mode === 'remove' || $mode === 'both' ) {
+ if ( $begin !== '' ) {
+ $where = [ 'cat_title > ' . $dbw->addQuotes( $begin ) ];
+ } else {
+ $where = [];
+ }
+ $i = 0;
+
+ $this->output( "Removing empty categories without description pages...\n" );
+ while ( true ) {
+ # Find which category to update
+ $rows = $dbw->select(
+ [ 'category', 'page' ],
+ 'cat_title',
+ array_merge( $where, [
+ 'page_title' => null,
+ 'cat_pages' => 0,
+ ] ),
+ __METHOD__,
+ [
+ 'ORDER BY' => 'cat_title',
+ 'LIMIT' => $this->mBatchSize,
+ ],
+ [
+ 'page' => [ 'LEFT JOIN', [
+ 'page_namespace' => NS_CATEGORY, 'page_title = cat_title'
+ ] ],
+ ]
+ );
+ if ( !$rows || $rows->numRows() <= 0 ) {
+ # Done, hopefully.
+ break;
+ }
+ foreach ( $rows as $row ) {
+ $name = $row->cat_title;
+ $where = [ 'cat_title > ' . $dbw->addQuotes( $name ) ];
+
+ # Use the row to update the category count
+ $cat = Category::newFromName( $name );
+ if ( !is_object( $cat ) ) {
+ $this->output( "The category named $name is not valid?!\n" );
+ } else {
+ $cat->refreshCounts();
+ }
+ }
+
+ $this->output( "--mode=remove --begin=$name\n" );
+
+ wfWaitForSlaves();
+ usleep( $throttle * 1000 );
+ }
+ }
+
+ $this->output( "Category cleanup complete.\n" );
+
+ return true;
+ }
+}
+
+$maintClass = 'CleanupEmptyCategories';
+require_once RUN_MAINTENANCE_IF_MAIN;
$processor = new ReflectionClass( 'ExtensionProcessor' );
$settings = $processor->getProperty( 'globalSettings' );
$settings->setAccessible( true );
- return $settings->getValue() + $this->formerGlobals;
+ return array_merge( $settings->getValue(), $this->formerGlobals );
}
public function execute() {
$this->hasWarning = true;
} elseif ( strpos( $name, $configPrefix ) === 0 ) {
// Most likely a config setting
- $this->json['config'][substr( $name, strlen( $configPrefix ) )] = $value;
+ $this->json['config'][substr( $name, strlen( $configPrefix ) )] = [ 'value' => $value ];
} elseif ( $configPrefix !== 'wg' && strpos( $name, 'wg' ) === 0 ) {
// Warn about this
$this->output( 'Warning: Skipped global "' . $name . '" (' .
public function handleHooks( $realName, $value ) {
foreach ( $value as $hookName => &$handlers ) {
+ if ( $hookName === 'UnitTestsList' ) {
+ $this->output( "Note: the UnitTestsList hook is no longer necessary as " .
+ "long as your tests are located in the \"tests/phpunit/\" directory. " .
+ "Please see <https://www.mediawiki.org/wiki/Manual:PHP_unit_testing/" .
+ "Writing_unit_tests_for_extensions#Register_your_tests> for more details.\n"
+ );
+ }
foreach ( $handlers as $func ) {
if ( $func instanceof Closure ) {
$this->error( "Error: Closures cannot be converted to JSON. " .
}
public function execute() {
- global $wgDisableAuthManager;
-
$username = $this->getArg( 0 );
$password = $this->getArg( 1 );
$force = $this->hasOption( 'force' );
if ( $password ) {
# Try to set the password
try {
- if ( $wgDisableAuthManager ) {
- $user->setPassword( $password );
- } else {
- $status = $user->changeAuthenticationData( [
- 'username' => $user->getName(),
- 'password' => $password,
- 'retype' => $password,
- ] );
- if ( !$status->isGood() ) {
- throw new PasswordError( $status->getWikiText( null, null, 'en' ) );
- }
+ $status = $user->changeAuthenticationData( [
+ 'username' => $user->getName(),
+ 'password' => $password,
+ 'retype' => $password,
+ ] );
+ if ( !$status->isGood() ) {
+ throw new PasswordError( $status->getWikiText( null, null, 'en' ) );
}
if ( $exists ) {
$this->output( "Password set.\n" );
$this->output( "Searching for and deleting archived files...\n" );
$res = $dbw->select(
'filearchive',
- [ 'fa_id', 'fa_storage_group', 'fa_storage_key', 'fa_sha1' ],
+ [ 'fa_id', 'fa_storage_group', 'fa_storage_key', 'fa_sha1', 'fa_name' ],
'',
__METHOD__
);
continue;
}
+ /** @var LocalFile $file */
+ $file = $repo->newFile( $row->fa_name );
+ try {
+ $file->lock();
+ } catch ( LocalFileLockError $e ) {
+ $this->error( "Could not acquire lock on '{$row->fa_name}', skipping\n" );
+ continue;
+ }
+
$group = $row->fa_storage_group;
$id = $row->fa_id;
- $path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
+ $path = $repo->getZonePath( 'deleted' ) .
+ '/' . $repo->getDeletedHashPath( $key ) . $key;
if ( isset( $row->fa_sha1 ) ) {
$sha1 = $row->fa_sha1;
} else {
$this->output( "Notice - file '$key' is still in use\n" );
} elseif ( !$repo->quickPurge( $path ) ) {
$this->output( "Unable to remove file $path, skipping\n" );
+ $file->unlock();
continue; // don't delete even with --force
} else {
$needForce = false;
if ( $this->hasOption( 'force' ) ) {
$this->output( "Got --force, deleting DB entry\n" );
} else {
+ $file->unlock();
continue;
}
}
$count++;
$dbw->delete( 'filearchive', [ 'fa_id' => $id ], __METHOD__ );
+ $file->unlock();
}
$this->commitTransaction( $dbw, __METHOD__ );
// Initialize main config instance
$maintenance->setConfig( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+// Sanity-check required extensions are installed
+$maintenance->checkRequiredExtensions();
+
// Do the work
$maintenance->execute();
$base = dirname( __DIR__ );
$generator = new AutoloadGenerator( $base, 'local' );
-foreach ( [ 'includes', 'languages', 'maintenance', 'mw-config' ] as $dir ) {
- $generator->readDir( $base . '/' . $dir );
-}
-foreach ( glob( $base . '/*.php' ) as $file ) {
- $generator->readFile( $file );
-}
+$generator->initMediaWikiDefault();
// Write out the autoload
-$generator->generateAutoload( 'maintenance/generateLocalAutoload.php' );
+$fileinfo = $generator->getTargetFileinfo();
+file_put_contents(
+ $fileinfo['filename'],
+ $generator->getAutoload( 'maintenance/generateLocalAutoload.php' )
+);
if ( file_exists( $arg ) ) {
$files[$arg] = file_get_contents( $arg );
} else {
- $this->error( "Fatal error: The file '$arg' does not exist!", 1 );
+ // use glob to support the Windows shell, which doesn't automatically
+ // expand wildcards
+ $found = false;
+ foreach ( glob( $arg ) as $filename ) {
+ $found = true;
+ $files[$filename] = file_get_contents( $filename );
+ }
+ if ( !$found ) {
+ $this->error( "Fatal error: The file '$arg' does not exist!", 1 );
+ }
}
};
wiki|http://c2.com/cgi/wiki?$1|0|
wikia|http://www.wikia.com/wiki/$1|0|
wikibooks|https://en.wikibooks.org/wiki/$1|0|https://en.wikibooks.org/w/api.php
+wikidata|https://www.wikidata.org/wiki/$1|0|https://www.wikidata.org/w/api.php
wikif1|http://www.wikif1.org/$1|0|
wikihow|http://www.wikihow.com/$1|0|http://www.wikihow.com/api.php
wikinfo|http://wikinfo.co/English/index.php/$1|0|
('wiki','http://c2.com/cgi/wiki?$1',0,''),
('wikia','http://www.wikia.com/wiki/$1',0,''),
('wikibooks','https://en.wikibooks.org/wiki/$1',0,'https://en.wikibooks.org/w/api.php'),
+('wikidata','https://www.wikidata.org/wiki/$1',0,'https://www.wikidata.org/w/api.php'),
('wikif1','http://www.wikif1.org/$1',0,''),
('wikihow','http://www.wikihow.com/$1',0,'http://www.wikihow.com/api.php'),
('wikinfo','http://wikinfo.co/English/index.php/$1',0,''),
U+0915D酝|U+0919E醞|U+09196醖|
U+09170酰|U+09170酰|U+091AF醯|
U+09178酸|U+09178酸|U+075E0痠|
-U+091C7采|U+091C7采|U+063A1採|U+057F0埰|
+U+091C7采|U+091C7采|U+063A1採|U+05BC0寀|
U+091CC里|U+091CC里|U+088E1裡|U+088CF裏|
U+0949F钟|U+0937E鍾|U+09418鐘|
U+094A9钩|U+0920E鈎|U+09264鉤|
伏著 伏着
視著 视着
視著名 视著名
+視著作 视著作
+視著者 视著者
+視著稱 视著称
蓋著 盖着
蓋著名 盖著名
蓋著稱 盖著称
功能變數名稱 域名
音效卡 声卡
字型大小 字号
-字型檔 字库
欄位 字段
非同步 异步
匯流排 总线
电视里 電視裏
公寓里 公寓裏
窝里斗 窩裏鬥
+镇里 鎮裏
苑裡 苑裡
霄裡 霄裡
岸裡 岸裡
伏著 伏着
視著 視着
視著名 視著名
+視著作 視著作
+視著者 視著者
+視著稱 視著稱
蓋著 蓋着
蓋著名 蓋著名
蓋著稱 蓋著稱
偵蒐 侦搜
情蒐 情搜
蘋果 苹果
+蘋婆 苹婆
於之莹 於之莹
陆徵祥 陆徵祥
瞭臺 瞭台
光盘 光碟
光驱 光碟機
声卡 音效卡
-字库 字型檔
字段 欄位
存盘 存檔
控件 控制項
复苏 復甦
苹果 蘋果
苹果干 蘋果乾
+苹婆 蘋婆
龜山庄 龜山庄
寶山庄 寶山庄
員山庄 員山庄
-"余"=>
+余
碁
藉
-=>"獃"
𫚭
咤
吒
岙
㳕
䓕
+埯
+埰
皺彆
一彆頭
并州
+併力
,並力
-,并力攻
,并力討
+兼併
併兼
併骨
併網
錢穀
息穀
殖穀
-川穀
曬穀
臧穀亡羊
種穀
乾姐
乾紅葡萄酒
乾白葡萄酒
+抽乾
+排乾
+排幹部
+吸乾
楨幹
新幹縣
誰幹的
鍥而不捨
稜登
繃扒弔拷
-不弔
+不弔,
不通弔慶
陪弔
盆弔
公寓里弄
村裡的
村裡有
+鎮裡
裏白 #植物常用名
烏蘇里 #分詞用
首發
CREATE INDEX /*i*/cl_collation_ext ON /*_*/categorylinks (cl_collation, cl_to, cl_type, cl_from);
--
--- Track all existing categories. Something is a category if 1) it has an en-
--- try somewhere in categorylinks, or 2) it once did. Categories might not
--- have corresponding pages, so they need to be tracked separately.
+-- Track all existing categories. Something is a category if 1) it has an entry
+-- somewhere in categorylinks, or 2) it has a description page. Categories
+-- might not have corresponding pages, so they need to be tracked separately.
--
CREATE TABLE /*_*/category (
-- Primary key
continue;
}
- // Purge current version and any versions in oldimage table
+ // Purge current version and its thumbnails
$file->purgeCache();
+ // Purge the old versions and their thumbnails
+ foreach ( $file->getHistory() as $oldFile ) {
+ $oldFile->purgeCache();
+ }
if ( $logType === 'delete' ) {
// If there is an orphaned storage file... delete it
sleep( 10 ); // wait and retry copy again
$status = $dst->doQuickOperations( $ops, [ 'bypassReadOnly' => 1 ] );
}
- $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
+ $elapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
if ( $status->isOK() && $this->getOption( 'verbose' ) ) {
- $this->output( "Synchronized these file(s) [{$ellapsed_ms}ms]:\n" .
+ $this->output( "Synchronized these file(s) [{$elapsed_ms}ms]:\n" .
implode( "\n", $dPaths ) . "\n" );
}
CREATE INDEX /*i*/cl_collation_ext ON /*_*/categorylinks (cl_collation, cl_to, cl_type, cl_from);
--
--- Track all existing categories. Something is a category if 1) it has an en-
--- try somewhere in categorylinks, or 2) it once did. Categories might not
--- have corresponding pages, so they need to be tracked separately.
+-- Track all existing categories. Something is a category if 1) it has an entry
+-- somewhere in categorylinks, or 2) it has a description page. Categories
+-- might not have corresponding pages, so they need to be tracked separately.
--
CREATE TABLE /*_*/category (
-- Primary key
--- /dev/null
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+class UpdateExtensionJsonSchema extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Updates extension.json files to the latest manifest_version' );
+ $this->addArg( 'path', 'Location to the extension.json or skin.json you wish to convert',
+ /* $required = */ true );
+ }
+
+ public function execute() {
+ $filename = $this->getArg( 0 );
+ if ( !is_readable( $filename ) ) {
+ $this->error( "Error: Unable to read $filename", 1 );
+ }
+
+ $json = FormatJson::decode( file_get_contents( $filename ), true );
+ if ( $json === null ) {
+ $this->error( "Error: Invalid JSON", 1 );
+ }
+
+ if ( !isset( $json['manifest_version'] ) ) {
+ $json['manifest_version'] = 1;
+ }
+
+ if ( $json['manifest_version'] == ExtensionRegistry::MANIFEST_VERSION ) {
+ $this->output( "Already at the latest version: {$json['manifest_version']}\n" );
+ return;
+ }
+
+ while ( $json['manifest_version'] !== ExtensionRegistry::MANIFEST_VERSION ) {
+ $json['manifest_version'] += 1;
+ $func = "updateTo{$json['manifest_version']}";
+ $this->$func( $json );
+ }
+
+ file_put_contents( $filename, FormatJson::encode( $json, "\t", FormatJson::ALL_OK ) . "\n" );
+ $this->output( "Updated to {$json['manifest_version']}...\n" );
+ }
+
+ protected function updateTo2( &$json ) {
+ if ( isset( $json['config'] ) ) {
+ $config = $json['config'];
+ $json['config'] = [];
+ if ( isset( $config['_prefix'] ) ) {
+ $json = wfArrayInsertAfter( $json, [
+ 'config_prefix' => $config['_prefix']
+ ], 'config' );
+ unset( $config['_prefix'] );
+ }
+
+ foreach ( $config as $name => $value ) {
+ if ( $name[0] !== '@' ) {
+ $json['config'][$name] = [ 'value' => $value ];
+ if ( isset( $value[ExtensionRegistry::MERGE_STRATEGY] ) ) {
+ $json['config'][$name]['merge_strategy'] = $value[ExtensionRegistry::MERGE_STRATEGY];
+ unset( $value[ExtensionRegistry::MERGE_STRATEGY] );
+ }
+ }
+ }
+ }
+ }
+}
+
+$maintClass = 'UpdateExtensionJsonSchema';
+require_once RUN_MAINTENANCE_IF_MAIN;
"grunt-jscs": "2.8.0",
"grunt-jsonlint": "1.0.7",
"grunt-karma": "2.0.0",
- "grunt-stylelint": "0.4.0",
+ "grunt-stylelint": "0.6.0",
"karma": "1.1.0",
"karma-chrome-launcher": "1.0.1",
"karma-firefox-launcher": "1.0.0",
"karma-qunit": "1.0.0",
"qunitjs": "1.22.0",
- "stylelint-config-wikimedia": "0.2.2"
+ "stylelint-config-wikimedia": "0.3.0"
}
}
// Scripts managed by the current user (stored in their user space)
'user' => [ 'class' => 'ResourceLoaderUserModule' ],
+ 'user.styles' => [ 'class' => 'ResourceLoaderUserStylesModule' ],
// Scripts generated based on the current user's preferences
'user.cssprefs' => [ 'class' => 'ResourceLoaderUserCSSPrefsModule' ],
'jquery.arrowSteps' => [
'scripts' => 'resources/src/jquery/jquery.arrowSteps.js',
'styles' => 'resources/src/jquery/jquery.arrowSteps.css',
+ 'targets' => [ 'desktop', 'mobile' ],
],
'jquery.async' => [
'scripts' => 'resources/lib/jquery/jquery.async.js',
'jquery.spinner' => [
'scripts' => 'resources/src/jquery/jquery.spinner.js',
'styles' => 'resources/src/jquery/jquery.spinner.css',
+ 'targets' => [ 'desktop', 'mobile' ],
],
'jquery.jStorage' => [
'scripts' => 'resources/lib/jquery/jquery.jStorage.js',
'mediawiki.api.edit',
'json',
],
+ 'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.api.user' => [
'scripts' => 'resources/src/mediawiki/api/user.js',
'dependencies' => [
'mediawiki.api',
],
+ 'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.api.rollback' => [
'scripts' => 'resources/src/mediawiki/api/rollback.js',
],
'mediawiki.content.json' => [
'position' => 'top',
- 'styles' => 'resources/src/mediawiki/mediawiki.content.json.css',
+ 'styles' => 'resources/src/mediawiki/mediawiki.content.json.less',
],
'mediawiki.confirmCloseWindow' => [
'scripts' => [
'feedback-thanks-title',
'feedback-useragent'
],
+ 'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.feedlink' => [
'position' => 'top',
],
'mediawiki.icon' => [
'styles' => 'resources/src/mediawiki/mediawiki.icon.less',
+ 'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.inspect' => [
'scripts' => 'resources/src/mediawiki/mediawiki.inspect.js',
'scripts' => 'resources/src/mediawiki/mediawiki.notify.js',
'targets' => [ 'desktop', 'mobile' ],
],
+ 'mediawiki.notification.convertmessagebox' => [
+ 'dependencies' => [
+ 'mediawiki.notification',
+ ],
+ 'scripts' => 'resources/src/mediawiki/mediawiki.notification.convertmessagebox.js',
+ 'targets' => [ 'desktop', 'mobile' ],
+ ],
+ 'mediawiki.notification.convertmessagebox.styles' => [
+ 'position' => 'top',
+ 'styles' => [
+ 'resources/src/mediawiki/mediawiki.notification.convertmessagebox.styles.less',
+ ],
+ 'targets' => [ 'desktop', 'mobile' ],
+ ],
'mediawiki.RegExp' => [
'scripts' => 'resources/src/mediawiki/mediawiki.RegExp.js',
'targets' => [ 'desktop', 'mobile' ],
'class' => 'ResourceLoaderEditToolbarModule',
'scripts' => 'resources/src/mediawiki.toolbar/toolbar.js',
'styles' => 'resources/src/mediawiki.toolbar/toolbar.less',
+ 'dependencies' => 'jquery.textSelection',
'position' => 'top',
],
'mediawiki.experiments' => [
'mediawiki.libs.jpegmeta' => [
'scripts' => 'resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js',
+ 'targets' => [ 'desktop', 'mobile' ],
],
/* MediaWiki Page */
'position' => 'top',
'targets' => [ 'desktop', 'mobile' ],
],
+ 'mediawiki.page.patrol' => [
+ 'position' => 'top',
+ 'styles' => [
+ 'resources/src/mediawiki/page/mediawiki.page.patrol.css',
+ 'resources/src/mediawiki/page/mediawiki.page.patrol.print.css'
+ => [ 'media' => 'print' ],
+ ]
+ ],
'mediawiki.page.patrol.ajax' => [
'scripts' => 'resources/src/mediawiki/page/patrol.ajax.js',
'dependencies' => [
'dependencies' => [
'mediawiki.language',
'mediawiki.confirmCloseWindow',
- 'mediawiki.notification',
+ 'mediawiki.notification.convertmessagebox',
+ ],
+ ],
+ 'mediawiki.special.userrights' => [
+ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userrights.js',
+ 'dependencies' => [
+ 'mediawiki.notification.convertmessagebox',
],
],
'mediawiki.special.preferences.styles' => [
"Lloffiwr",
"Robin Owain",
"ОйЛ",
- "DChan (WMF)"
+ "DChan (WMF)",
+ "Jdforrester"
]
},
"ooui-outline-control-move-down": "Symud yr eitem i lawr",
"ooui-outline-control-move-up": "Symud yr eitem i fyny",
"ooui-outline-control-remove": "Tynnu'r eitem",
- "ooui-toolbar-more": "Rhagor"
+ "ooui-toolbar-more": "Rhagor",
+ "ooui-toolgroup-expand": "Mwy",
+ "ooui-toolgroup-collapse": "Llai",
+ "ooui-dialog-message-accept": "Iawn",
+ "ooui-dialog-message-reject": "Canslo",
+ "ooui-dialog-process-error": "Aeth rhywbeth o’i le",
+ "ooui-dialog-process-dismiss": "Gadael",
+ "ooui-dialog-process-retry": "Ailgeisio",
+ "ooui-dialog-process-continue": "Parhau",
+ "ooui-selectfile-button-select": "Dewis ffeil",
+ "ooui-selectfile-not-supported": "Nid oes modd dewis ffeil",
+ "ooui-selectfile-placeholder": "Dim ffeil wedi'i dewis",
+ "ooui-selectfile-dragdrop-placeholder": "Gollwng ffeil yma"
}
"ooui-dialog-message-accept": "Sobib",
"ooui-dialog-message-reject": "Loobu",
"ooui-dialog-process-error": "Midagi läks valesti",
- "ooui-dialog-process-dismiss": "Hülga",
+ "ooui-dialog-process-dismiss": "Sule",
"ooui-dialog-process-retry": "Proovi uuesti",
"ooui-dialog-process-continue": "Jätka",
"ooui-selectfile-button-select": "Vali fail",
"Hwangjy9"
]
},
- "ooui-outline-control-move-down": "í\95목ì\9d\84 ì\95\84ë\9e\98ë¡\9c ì\98®ê¸°ê¸°",
- "ooui-outline-control-move-up": "í\95목ì\9d\84 ì\9c\84ë¡\9c ì\98®ê¸°ê¸°",
+ "ooui-outline-control-move-down": "í\95목ì\9d\84 ì\95\84ë\9e\98ë¡\9c ì\9d´ë\8f\99",
+ "ooui-outline-control-move-up": "í\95목ì\9d\84 ì\9c\84ë¡\9c ì\9d´ë\8f\99",
"ooui-outline-control-remove": "항목 제거",
"ooui-toolbar-more": "더 보기",
"ooui-toolgroup-expand": "더 보기",
"Elioqoshi",
"GretaDoci",
"Gertakapllani",
- "Techlik"
+ "Techlik",
+ "Liridon"
]
},
"ooui-outline-control-move-down": "Zhvendose artikullin më poshtë",
"ooui-dialog-process-dismiss": "Largoje",
"ooui-dialog-process-retry": "Provo përsëri",
"ooui-dialog-process-continue": "Vazhdo",
+ "ooui-selectfile-button-select": "Përzgjidhni një skedë",
"ooui-selectfile-not-supported": "Skedari i përzgjedhur nuk përkrahet",
- "ooui-selectfile-placeholder": "Nuk është zgjedhur asnjë skedar"
+ "ooui-selectfile-placeholder": "Nuk është zgjedhur asnjë skedar",
+ "ooui-selectfile-dragdrop-placeholder": "Vendose skedën këtu"
}
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:03Z
+ * Date: 2016-08-03T16:38:22Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:07Z
+ * Date: 2016-08-03T16:38:27Z
*/
.oo-ui-element-hidden {
display: none !important;
+ /* stylelint-disable-line declaration-no-important */
}
.oo-ui-buttonElement > .oo-ui-buttonElement-button {
cursor: pointer;
overflow: auto;
resize: none;
}
+.oo-ui-textInputWidget [type="number"] {
+ -moz-appearance: textfield;
+}
+.oo-ui-textInputWidget [type="number"]::-webkit-outer-spin-button,
+.oo-ui-textInputWidget [type="number"]::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
.oo-ui-textInputWidget [type="search"] {
-webkit-appearance: textfield;
}
.oo-ui-comboBoxInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
cursor: pointer;
}
-.oo-ui-comboBoxInputWidget-php input::-webkit-calendar-picker-indicator {
- opacity: 0 !important;
+.oo-ui-comboBoxInputWidget-php ::-webkit-calendar-picker-indicator {
+ opacity: 0;
position: absolute;
right: 0;
top: 0;
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:07Z
+ * Date: 2016-08-03T16:38:27Z
*/
.oo-ui-element-hidden {
display: none !important;
+ /* stylelint-disable-line declaration-no-important */
}
.oo-ui-buttonElement > .oo-ui-buttonElement-button {
cursor: pointer;
margin-bottom: 1.25em;
}
.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
- padding: 0.25em 0.25em 0.25em 1em;
+ padding: 0.25em 0.25em 0.25em 0.5em;
}
.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
padding-top: 0.25em;
margin-top: 2em;
}
.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
- font-size: 1.1em;
margin-bottom: 0.5em;
- padding: 0.25em 0;
+ font-size: 1.1em;
font-weight: bold;
}
.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
background-color: transparent;
}
.oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
- padding: 0.25em 0.25em 0.25em 1em;
+ padding: 0.25em 0.25em 0.25em 0.5em;
}
.oo-ui-radioOptionWidget .oo-ui-radioInputWidget {
margin-right: 0;
background-position: center center;
background-origin: border-box;
background-size: 0 0;
- border: 1px solid #777777;
+ border: 1px solid #767676;
border-radius: 2px;
}
.oo-ui-checkboxInputWidget [type="checkbox"]:checked + span {
background-size: 100% 100%;
}
.oo-ui-checkboxInputWidget [type="checkbox"]:active + span {
- background-color: #cccccc;
- border-color: #cccccc;
+ background-color: #767676;
+ border-color: #767676;
}
.oo-ui-checkboxInputWidget [type="checkbox"]:focus + span {
border-width: 2px;
background-position: center center;
background-origin: border-box;
background-size: 0 0;
- border: 1px solid #777777;
+ border: 1px solid #767676;
border-radius: 100%;
}
.oo-ui-radioInputWidget [type="radio"]:checked + span {
background-size: 100% 100%;
}
.oo-ui-radioInputWidget [type="radio"]:active + span {
- background-color: #cccccc;
- border-color: #cccccc;
+ background-color: #767676;
+ border-color: #767676;
}
.oo-ui-radioInputWidget [type="radio"]:focus + span {
border-width: 2px;
overflow: auto;
resize: none;
}
+.oo-ui-textInputWidget [type="number"] {
+ -moz-appearance: textfield;
+}
+.oo-ui-textInputWidget [type="number"]::-webkit-outer-spin-button,
+.oo-ui-textInputWidget [type="number"]::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
.oo-ui-textInputWidget [type="search"] {
-webkit-appearance: textfield;
}
-moz-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:hover,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:hover {
+ border-color: #aaaaaa;
+}
.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
outline: 0;
color: #777777;
text-shadow: 0 1px 1px #ffffff;
}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:hover,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:hover {
+ border-color: #cccccc;
+}
.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
border-color: #cccccc;
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
border-color: #ff0000;
}
+.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input:hover,
+.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea:hover {
+ border-color: #ff0000;
+}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input:focus,
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea:focus {
border-color: #ff0000;
.oo-ui-comboBoxInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
cursor: pointer;
}
-.oo-ui-comboBoxInputWidget-php input::-webkit-calendar-picker-indicator {
- opacity: 0 !important;
+.oo-ui-comboBoxInputWidget-php ::-webkit-calendar-picker-indicator {
+ opacity: 0;
position: absolute;
right: 0;
top: 0;
vertical-align: middle;
}
.oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
- padding: 0.25em 0.25em 0.25em 1em;
+ padding: 0.25em 0.25em 0.25em 0.5em;
}
.oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget {
margin-right: 0;
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:03Z
+ * Date: 2016-08-03T16:38:22Z
*/
( function ( OO ) {
* @param {jQuery.Event} e
*/
OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) {
- var $options, checked,
+ var $options, lastClickedIndex, nowClickedIndex, i, direction, wasSelected, items,
$lastClicked = this.$lastClicked,
$nowClicked = $( e.target ).closest( '.oo-ui-checkboxMultioptionWidget' )
.not( '.oo-ui-widget-disabled' );
// Allow selecting multiple options at once by Shift-clicking them
if ( $lastClicked && $nowClicked.length && e.shiftKey ) {
$options = this.$group.find( '.oo-ui-checkboxMultioptionWidget' );
- checked = $nowClicked.find( 'input' ).prop( 'checked' );
-
- $options
- .slice(
- Math.min( $options.index( $lastClicked ), $options.index( $nowClicked ) ),
- Math.max( $options.index( $lastClicked ), $options.index( $nowClicked ) ) + 1
- )
- .find( 'input' )
- .filter( function () {
- return !this.disabled;
- } )
- .prop( 'checked', checked )
- .trigger( 'change' );
+ lastClickedIndex = $options.index( $lastClicked );
+ nowClickedIndex = $options.index( $nowClicked );
+ // If it's the same item, either the user is being silly, or it's a fake event generated by the
+ // browser. In either case we don't need custom handling.
+ if ( nowClickedIndex !== lastClickedIndex ) {
+ items = this.items;
+ wasSelected = items[ nowClickedIndex ].isSelected();
+ direction = nowClickedIndex > lastClickedIndex ? 1 : -1;
+
+ // This depends on the DOM order of the items and the order of the .items array being the same.
+ for ( i = lastClickedIndex; i !== nowClickedIndex; i += direction ) {
+ if ( !items[ i ].isDisabled() ) {
+ items[ i ].setSelected( !wasSelected );
+ }
+ }
+ // For the now-clicked element, use immediate timeout to allow the browser to do its own
+ // handling first, then set our value. The order in which events happen is different for
+ // clicks on the <input> and on the <label> and there are additional fake clicks fired for
+ // non-click actions that change the checkboxes.
+ e.preventDefault();
+ setTimeout( function () {
+ if ( !items[ nowClickedIndex ].isDisabled() ) {
+ items[ nowClickedIndex ].setSelected( !wasSelected );
+ }
+ } );
+ }
}
if ( $nowClicked.length ) {
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:03Z
+ * Date: 2016-08-03T16:38:22Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:07Z
+ * Date: 2016-08-03T16:38:27Z
*/
.oo-ui-popupTool .oo-ui-popupWidget-popup,
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:07Z
+ * Date: 2016-08-03T16:38:27Z
*/
.oo-ui-popupTool .oo-ui-popupWidget-popup,
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
.oo-ui-toolGroup {
display: inline-block;
vertical-align: middle;
+ border-right: 1px solid #cccccc;
border-radius: 0;
- border-right: 1px solid #dddddd;
}
.oo-ui-toolGroup-empty {
display: none;
.oo-ui-toolbar-narrow .oo-ui-toolGroup + .oo-ui-toolGroup {
margin-left: 0;
}
-.oo-ui-toolGroup .oo-ui-toolGroup .oo-ui-widget-enabled {
- border-right: 0 !important;
-}
.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
.oo-ui-barToolGroup > .oo-ui-labelElement-label {
display: none;
padding: 0 0.4em;
}
.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled:hover {
- border-color: rgba(0, 0, 0, 0.2);
background-color: #eeeeee;
}
.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool > a.oo-ui-tool-link .oo-ui-tool-title {
color: #555555;
}
.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled {
- border-color: rgba(0, 0, 0, 0.2);
box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
background-color: #e5e5e5;
}
.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled:hover {
background-color: #eeeeee;
}
-.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
- border-left-color: rgba(0, 0, 0, 0.1);
-}
.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link .oo-ui-tool-title {
color: #cccccc;
}
}
.oo-ui-popupToolGroup .oo-ui-tool-link {
padding: 0.4em 0.625em;
- box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
}
.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
height: 2.5em;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
- border-color: rgba(0, 0, 0, 0.2);
-}
.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
- border-color: rgba(0, 0, 0, 0.2);
background-color: #eeeeee;
}
.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:active {
opacity: 0.9;
}
.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
- border-color: rgba(0, 0, 0, 0.1);
box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
background-color: #e5e5e5;
}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
- border-top-color: rgba(0, 0, 0, 0.1);
-}
.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
- border-color: rgba(0, 0, 0, 0.2);
background-color: #eeeeee;
}
.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:03Z
+ * Date: 2016-08-03T16:38:22Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:07Z
+ * Date: 2016-08-03T16:38:27Z
*/
.oo-ui-draggableElement-handle,
.oo-ui-draggableElement-handle.oo-ui-widget {
left: 0;
right: 0;
bottom: 0;
+ /* stylelint-disable declaration-no-important */
+ /* stylelint-enable declaration-no-important */
}
.oo-ui-menuLayout-menu,
.oo-ui-menuLayout-content {
.oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
z-index: 2;
}
-.oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget {
cursor: default;
height: 5.5em;
padding: 0;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
display: none;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail {
height: 5.5em;
width: 5.5em;
position: absolute;
background-size: cover;
background-position: center center;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail.oo-ui-pendingElement-pending {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail.oo-ui-pendingElement-pending {
background-size: auto;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail > .oo-ui-selectFileWidget-noThumbnail-icon {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail > .oo-ui-selectFileWidget-noThumbnail-icon {
opacity: 0.4;
background-color: #cccccc;
height: 5.5em;
width: 5.5em;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
border: 0;
background: none;
display: block;
width: auto;
margin-left: 5.5em;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
position: relative;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileName {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileName {
display: block;
padding-right: 2.375em;
overflow: hidden;
text-overflow: ellipsis;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
display: block;
float: none;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
position: absolute;
right: 0.5em;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
display: none;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
display: block;
margin: 0.7em;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
text-align: center;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
margin: 0;
}
.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-clearButton,
.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropLabel {
display: block;
}
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button {
cursor: no-drop;
}
.oo-ui-selectFileWidget:last-child {
.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
right: 2em;
}
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
background-color: #e1f3ff;
}
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
color: #cccccc;
text-shadow: 0 1px 1px #ffffff;
border-color: #dddddd;
background-color: #f3f3f3;
}
-.oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget {
background-color: #ffffff;
border: 1px solid #aaaaaa;
margin-bottom: 0.5em;
vertical-align: middle;
border-radius: 0.25em;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
border-radius: 0.25em;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget {
border-style: dashed;
}
.oo-ui-outlineOptionWidget {
.oo-ui-numberInputWidget-field > .oo-ui-textInputWidget {
width: 100%;
}
-.oo-ui-numberInputWidget-field > .oo-ui-textInputWidget [type="number"]::-webkit-outer-spin-button,
-.oo-ui-numberInputWidget-field > .oo-ui-textInputWidget [type="number"]::-webkit-inner-spin-button {
- -webkit-appearance: none;
- margin: 0;
-}
-.oo-ui-numberInputWidget-field > .oo-ui-textInputWidget [type="number"] {
- -moz-appearance: textfield;
-}
.oo-ui-numberInputWidget-field > .oo-ui-buttonWidget {
white-space: nowrap;
}
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:07Z
+ * Date: 2016-08-03T16:38:27Z
*/
.oo-ui-draggableElement-handle,
.oo-ui-draggableElement-handle.oo-ui-widget {
left: 0;
right: 0;
bottom: 0;
+ /* stylelint-disable declaration-no-important */
+ /* stylelint-enable declaration-no-important */
}
.oo-ui-menuLayout-menu,
.oo-ui-menuLayout-content {
transform: translateZ(0);
height: 2em;
width: 3.5em;
- border: 1px solid #777777;
+ border: 1px solid #767676;
border-radius: 1em;
background-color: #ffffff;
margin-right: 0.5em;
min-height: 16px;
height: 1.2em;
border-radius: 1.2em;
- background-color: #555555;
-webkit-transition: left 100ms, margin-left 100ms;
-moz-transition: left 100ms, margin-left 100ms;
transition: left 100ms, margin-left 100ms;
left: 1.9em;
margin-left: -2px;
}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on {
- background-color: #347bff;
- border-color: #347bff;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
- background-color: #ffffff;
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
+ border: 1px solid #767676;
}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
border-color: #2962cc;
}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover.oo-ui-toggleWidget-on {
- background-color: #2962cc;
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
border-color: #2962cc;
}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover {
+ background-color: #767676;
+ border-color: #347bff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active .oo-ui-toggleSwitchWidget-grip,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover .oo-ui-toggleSwitchWidget-grip {
+ background-color: #ffffff;
+ border-color: #ffffff;
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
+}
.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus {
border-color: #347bff;
box-shadow: inset 0 0 0 1px #347bff;
outline: 0;
}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on {
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus .oo-ui-toggleSwitchWidget-grip {
border-color: #347bff;
}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on:before {
- border-color: #ffffff;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover {
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on {
background-color: #347bff;
border-color: #347bff;
}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active .oo-ui-toggleSwitchWidget-grip,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover .oo-ui-toggleSwitchWidget-grip {
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
background-color: #ffffff;
+ border-color: #ffffff;
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:hover {
+ background-color: #2962cc;
+ border-color: #2962cc;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:active,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:active:hover {
+ background-color: #1f4999;
+ border-color: #1f4999;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:focus {
+ border-color: #347bff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:focus:before {
+ border-color: #ffffff;
+}
.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
background-color: #dddddd;
border-color: #dddddd;
.oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
z-index: 2;
}
-.oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget {
cursor: default;
height: 5.5em;
padding: 0;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
display: none;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail {
height: 5.5em;
width: 5.5em;
position: absolute;
background-size: cover;
background-position: center center;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail.oo-ui-pendingElement-pending {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail.oo-ui-pendingElement-pending {
background-size: auto;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail > .oo-ui-selectFileWidget-noThumbnail-icon {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail > .oo-ui-selectFileWidget-noThumbnail-icon {
opacity: 0.4;
background-color: #cccccc;
height: 5.5em;
width: 5.5em;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
border: 0;
background: none;
display: block;
width: auto;
margin-left: 5.5em;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
position: relative;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileName {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileName {
display: block;
padding-right: 2.375em;
overflow: hidden;
text-overflow: ellipsis;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
display: block;
float: none;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
position: absolute;
right: 0.5em;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
display: none;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
display: block;
margin: 0.7em;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
text-align: center;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
margin: 0;
}
.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-clearButton,
.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropLabel {
display: block;
}
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button {
cursor: no-drop;
}
.oo-ui-selectFileWidget:last-child {
right: 2em;
padding-left: 0;
}
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
background-color: #ebf2ff;
}
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
border-color: #dddddd;
background-color: #f3f3f3;
}
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
color: #cccccc;
text-shadow: 0 1px 1px #ffffff;
}
-.oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget {
background-color: #ffffff;
border: 1px solid #cccccc;
margin-bottom: 0.5em;
overflow: hidden;
border-radius: 2px;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
+.oo-ui-selectFileWidget.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
border-radius: 2px;
}
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+.oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget {
background-color: #eeeeee;
border-style: dashed;
}
.oo-ui-numberInputWidget-field > .oo-ui-textInputWidget {
width: 100%;
}
-.oo-ui-numberInputWidget-field > .oo-ui-textInputWidget [type="number"]::-webkit-outer-spin-button,
-.oo-ui-numberInputWidget-field > .oo-ui-textInputWidget [type="number"]::-webkit-inner-spin-button {
- -webkit-appearance: none;
- margin: 0;
-}
-.oo-ui-numberInputWidget-field > .oo-ui-textInputWidget [type="number"] {
- -moz-appearance: textfield;
-}
.oo-ui-numberInputWidget-field > .oo-ui-buttonWidget {
white-space: nowrap;
}
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:03Z
+ * Date: 2016-08-03T16:38:22Z
*/
( function ( OO ) {
this.selectButton.setIcon( 'upload' );
this.$thumbnail = $( '<div>' ).addClass( 'oo-ui-selectFileWidget-thumbnail' );
this.setPendingElement( this.$thumbnail );
- this.$dropTarget = $( '<div>' )
- .addClass( 'oo-ui-selectFileWidget-dropTarget' )
+ this.$element
+ .addClass( 'oo-ui-selectFileWidget-dropTarget oo-ui-selectFileWidget' )
.on( {
click: this.onDropTargetClick.bind( this )
} )
.addClass( 'oo-ui-selectFileWidget-dropLabel' )
.text( OO.ui.msg( 'ooui-selectfile-dragdrop-placeholder' ) )
);
- this.$element.append( this.$dropTarget );
} else {
this.$element
.addClass( 'oo-ui-selectFileWidget' )
}.bind( this ) ).always( function () {
this.popPending();
}.bind( this ) );
- this.$dropTarget.off( 'click' );
+ this.$element.off( 'click' );
}
} else {
if ( this.showDropTarget ) {
- this.$dropTarget.off( 'click' );
- this.$dropTarget.on( {
+ this.$element.off( 'click' );
+ this.$element.on( {
click: this.onDropTargetClick.bind( this )
} );
this.$thumbnail
this.minusButton = new OO.ui.ButtonWidget( $.extend(
{
disabled: this.isDisabled(),
- tabIndex: -1
- },
- config.minusButton,
- {
+ tabIndex: -1,
classes: [ 'oo-ui-numberInputWidget-minusButton' ],
label: '−'
- }
+ },
+ config.minusButton
) );
this.plusButton = new OO.ui.ButtonWidget( $.extend(
{
disabled: this.isDisabled(),
- tabIndex: -1
- },
- config.plusButton,
- {
+ tabIndex: -1,
classes: [ 'oo-ui-numberInputWidget-plusButton' ],
label: '+'
- }
+ },
+ config.plusButton
) );
}
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:07Z
+ * Date: 2016-08-03T16:38:27Z
*/
.oo-ui-actionWidget.oo-ui-pendingElement-pending {
background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:07Z
+ * Date: 2016-08-03T16:38:27Z
*/
.oo-ui-window {
background: transparent;
text-align: left;
}
.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
- border-right: 1px solid #e5e5e5;
+ border-right: 1px solid #cccccc;
margin: 0;
}
.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
border-right-width: 0;
}
.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
- border-bottom: 1px solid #e5e5e5;
+ border-bottom: 1px solid #cccccc;
margin: 0;
}
.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
/*!
- * OOjs UI v0.17.6
+ * OOjs UI v0.17.7
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-07-12T20:26:03Z
+ * Date: 2016-08-03T16:38:22Z
*/
( function ( OO ) {
--- /dev/null
+{
+ "prefix": "oo-ui-icon",
+ "intro": "@import '../../../../src/styles/common';",
+ "images": {
+ "bell": { "file": "images/icons/bell.svg" },
+ "bellOn": { "file": {
+ "ltr": "images/icons/bellOn-ltr.svg",
+ "rtl": "images/icons/bellOn-rtl.svg"
+ } },
+ "eye": { "file": "images/icons/eye.svg" },
+ "eyeClosed": { "file": "images/icons/eyeClosed.svg" },
+ "message": { "file": {
+ "ltr": "images/icons/message-ltr.svg",
+ "rtl": "images/icons/message-rtl.svg"
+ } },
+ "signature": { "file": {
+ "ltr": "images/icons/signature-ltr.svg",
+ "rtl": "images/icons/signature-rtl.svg"
+ } },
+ "speechBubble": { "file": {
+ "ltr": "images/icons/speechBubble-ltr.svg",
+ "rtl": "images/icons/speechBubble-rtl.svg"
+ } },
+ "speechBubbleAdd": { "file": {
+ "ltr": "images/icons/speechBubbleAdd-ltr.svg",
+ "rtl": "images/icons/speechBubbleAdd-rtl.svg"
+ } },
+ "speechBubbles": { "file": {
+ "ltr": "images/icons/speechBubbles-ltr.svg",
+ "rtl": "images/icons/speechBubbles-rtl.svg"
+ } },
+ "tray": { "file": "images/icons/tray.svg" }
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M17.5 13V8c0-3-2.3-5-5.5-5S6.5 5 6.5 8v5c0 2 0 3-2 3v1h15v-1c-2 0-2-1-2-3zM12 19H9c0 1 1.6 2 3 2s3-1 3-2h-3z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M17.8 13.7L19.5 9c1-2.8-.5-5.5-3.5-6.6-3-1.1-5.9 0-6.9 2.8L7.4 9.9c-.7 1.9-1 2.8-2.9 2.1l-.3 1 14.1 5.1.3-.9c-1.9-.7-1.5-1.6-.8-3.5zM12 18.8l-2.8-1c-.3.9.8 2.4 2.1 2.9s3.2.1 3.5-.9l-2.8-1z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M6.21 13.7L4.51 9c-1-2.8.5-5.5 3.5-6.6 3-1.1 5.9 0 6.9 2.8l1.7 4.7c.7 1.9 1 2.8 2.9 2.1l.3 1-14.1 5.1-.3-.9c1.9-.7 1.5-1.6.8-3.5zm5.8 5.1l2.8-1c.3.9-.8 2.4-2.1 2.9s-3.2.1-3.5-.9l2.8-1z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+ <circle cx="12" cy="14" r="2"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M19.4 12.7c.7-.8 1.2-1.7 1.4-2.7h-1.6c-.9 2.5-3.9 4.4-7.7 4.6h-.1c-3.7-.2-6.8-2.1-7.7-4.6H2.2c.2 1 .8 1.9 1.4 2.7l-2 2 .7.7 2-2c.8.6 1.7 1.2 2.7 1.7l-1 2.8.9.3 1-2.8c1 .3 2 .6 3.1.6v3h1v-3c1.1-.1 2.2-.3 3.1-.6l1 2.8.9-.3-1-2.8c1-.4 1.9-1 2.6-1.7l2 2 .7-.7-1.9-2z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M21 9c0-1.7-1.3-3-3-3H3v3l9 4 9-4zM3 11v6c0 1.7 1.3 3 3 3h15v-9l-9 4-9-4z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M3 9c0-1.7 1.3-3 3-3h15v3l-9 4-9-4zm18 2v6c0 1.7-1.3 3-3 3H3v-9l9 4 9-4z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M0 20h24v1H0v-1zm6-8l-1-1-2 2-2-2-1 1 2 2-2 2 1 1 2-2 2 2 1-1-2-2zm15.6 3.7c-.9-.5-1.9-.5-2.7 0-1.5.9-3.1.4-3.1.4-.4-.2-.8-.4-1.1-.6 2.2-.6 4.4-1.8 6-3.9 1.1-1.2 2.5-3.9.4-6-.7-.7-1.6-1.1-2.7-1-1.4.1-2.8.9-3.9 2.1-.9 1.1-3.1 4.5-2.3 7.5 0 .1 0 .2.1.3-2.3.3-4.2.2-4.4.1v1.5c.7.1 2.7.2 5.1-.2.5.7 1.3 1.2 2.3 1.6.1 0 2.4.8 4.5-.6.5-.3.9-.1 1.1 0 .4.2.7.6.7 1H23c0-.8-.6-1.7-1.4-2.2zm-8-1.7c-.5-2.2 1.1-5.1 2-6.2.8-.9 1.8-1.5 2.8-1.6h.1c.6 0 1.1.2 1.5.6 1.6 1.6-.4 3.9-.5 4-1.5 2-3.7 3-5.8 3.5l-.1-.3z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M24 20H0v1h24v-1zm-6-8l1-1 2 2 2-2 1 1-2 2 2 2-1 1-2-2-2 2-1-1 2-2zM2.4 15.7c.9-.5 1.9-.5 2.7 0 1.5.9 3.1.4 3.1.4.4-.2.8-.4 1.1-.6-2.2-.6-4.4-1.8-6-3.9-1.1-1.2-2.5-3.9-.4-6 .7-.7 1.6-1.1 2.7-1 1.4.1 2.8.9 3.9 2.1.9 1.1 3.1 4.5 2.3 7.5 0 .1 0 .2-.1.3 2.3.3 4.2.2 4.4.1v1.5c-.7.1-2.7.2-5.1-.2-.5.7-1.3 1.2-2.3 1.6-.1 0-2.4.8-4.5-.6-.5-.3-.9-.1-1.1 0-.4.2-.7.6-.7 1H1c0-.8.6-1.7 1.4-2.2zm8-1.7c.5-2.2-1.1-5.1-2-6.2-.8-.9-1.8-1.5-2.8-1.6h-.1c-.6 0-1.1.2-1.5.6-1.6 1.6.4 3.9.5 4 1.5 2 3.7 3 5.8 3.5l.1-.3z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M19 20H2l3-3V6h17v11c0 1.7-1.3 3-3 3z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M5 20h17l-3-3V6H2v11c0 1.7 1.3 3 3 3z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M5 6v11l-3 3h17c1.7 0 3-1.3 3-3V6H5zm8 3h1v3h3v1h-3v3h-1v-3h-3v-1h3V9z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M2 6v11c0 1.7 1.3 3 3 3h17l-3-3V6H2zm8 3h1v3h3v1h-3v3h-1v-3H7v-1h3V9z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M20 9v9l2 2H8V9h12zM3 4h12v4H7v7H1l2-2V4z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M3 9v9l-2 2h14V9H3zm17-5H8v4h8v7h6l-2-2V4z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M3 13.35l1.8-7.2c.2-.996.81-1.8 1.8-1.8h10.8c.99 0 1.6.867 1.8 1.8l1.8 7.2v4.5c0 .99-.81 1.8-1.8 1.8H4.8c-.99 0-1.8-.81-1.8-1.8v-4.5zm6.96 1.8h4.08c-.49.557-1.212.9-2.04.9a2.68 2.68 0 0 1-2.04-.9h4.08c.414-.472.66-1.098.66-1.8h4.14l-1.44-7.2H6.6l-1.44 7.2H9.3c0 .702.246 1.328.66 1.8z" id="tray"/>
+</svg>
"speechBubbles": { "file": {
"ltr": "images/icons/speechBubbles-ltr.svg",
"rtl": "images/icons/speechBubbles-rtl.svg"
- } }
+ } },
+ "tray": { "file": "images/icons/tray.svg" }
}
}
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
- <path d="M17.5 14V9c0-3-2.3-5-5.5-5S6.5 6 6.5 9v5c0 2 0 3-2 3v1h15v-1c-2 0-2-1-2-3zM12 20H9c0 1 1.6 2 3 2s3-1 3-2h-3z"/>
+ <path d="M17.5 13V8c0-3-2.3-5-5.5-5S6.5 5 6.5 8v5c0 2 0 3-2 3v1h15v-1c-2 0-2-1-2-3zM12 19H9c0 1 1.6 2 3 2s3-1 3-2h-3z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <path d="M17.5 14V9c0-3-2.3-5-5.5-5S6.5 6 6.5 9v5c0 2 0 3-2 3v1h15v-1c-2 0-2-1-2-3zM12 20H9c0 1 1.6 2 3 2s3-1 3-2h-3z"/>
+ <path d="M17.5 13V8c0-3-2.3-5-5.5-5S6.5 5 6.5 8v5c0 2 0 3-2 3v1h15v-1c-2 0-2-1-2-3zM12 19H9c0 1 1.6 2 3 2s3-1 3-2h-3z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
- <path d="M17.8 14.7l1.7-4.7c1-2.8-.5-5.5-3.5-6.6s-5.9 0-6.9 2.8l-1.7 4.7c-.7 1.9-1 2.8-2.9 2.1l-.3 1 14.1 5.1.3-.9c-1.9-.7-1.5-1.6-.8-3.5zM12 19.8l-2.8-1c-.3.9.8 2.4 2.1 2.9s3.2.1 3.5-.9l-2.8-1z"/>
+ <path d="M17.8 13.7L19.5 9c1-2.8-.5-5.5-3.5-6.6-3-1.1-5.9 0-6.9 2.8L7.4 9.9c-.7 1.9-1 2.8-2.9 2.1l-.3 1 14.1 5.1.3-.9c-1.9-.7-1.5-1.6-.8-3.5zM12 18.8l-2.8-1c-.3.9.8 2.4 2.1 2.9s3.2.1 3.5-.9l-2.8-1z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <path d="M17.8 14.7l1.7-4.7c1-2.8-.5-5.5-3.5-6.6s-5.9 0-6.9 2.8l-1.7 4.7c-.7 1.9-1 2.8-2.9 2.1l-.3 1 14.1 5.1.3-.9c-1.9-.7-1.5-1.6-.8-3.5zM12 19.8l-2.8-1c-.3.9.8 2.4 2.1 2.9s3.2.1 3.5-.9l-2.8-1z"/>
+ <path d="M17.8 13.7L19.5 9c1-2.8-.5-5.5-3.5-6.6-3-1.1-5.9 0-6.9 2.8L7.4 9.9c-.7 1.9-1 2.8-2.9 2.1l-.3 1 14.1 5.1.3-.9c-1.9-.7-1.5-1.6-.8-3.5zM12 18.8l-2.8-1c-.3.9.8 2.4 2.1 2.9s3.2.1 3.5-.9l-2.8-1z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
- <path d="M6.21 14.7L4.51 10c-1-2.8.5-5.5 3.5-6.6 3-1.1 5.9 0 6.9 2.8l1.7 4.7c.7 1.9 1 2.8 2.9 2.1l.3 1-14.1 5.1-.3-.9c1.9-.7 1.5-1.6.8-3.5zm5.8 5.1l2.8-1c.3.9-.8 2.4-2.1 2.9s-3.2.1-3.5-.9l2.8-1z"/>
+ <path d="M6.21 13.7L4.51 9c-1-2.8.5-5.5 3.5-6.6 3-1.1 5.9 0 6.9 2.8l1.7 4.7c.7 1.9 1 2.8 2.9 2.1l.3 1-14.1 5.1-.3-.9c1.9-.7 1.5-1.6.8-3.5zm5.8 5.1l2.8-1c.3.9-.8 2.4-2.1 2.9s-3.2.1-3.5-.9l2.8-1z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <path d="M6.21 14.7L4.51 10c-1-2.8.5-5.5 3.5-6.6 3-1.1 5.9 0 6.9 2.8l1.7 4.7c.7 1.9 1 2.8 2.9 2.1l.3 1-14.1 5.1-.3-.9c1.9-.7 1.5-1.6.8-3.5zm5.8 5.1l2.8-1c.3.9-.8 2.4-2.1 2.9s-3.2.1-3.5-.9l2.8-1z"/>
+ <path d="M6.21 13.7L4.51 9c-1-2.8.5-5.5 3.5-6.6 3-1.1 5.9 0 6.9 2.8l1.7 4.7c.7 1.9 1 2.8 2.9 2.1l.3 1-14.1 5.1-.3-.9c1.9-.7 1.5-1.6.8-3.5zm5.8 5.1l2.8-1c.3.9-.8 2.4-2.1 2.9s-3.2.1-3.5-.9l2.8-1z"/>
</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+ <path d="M3 13.35l1.8-7.2c.2-.996.81-1.8 1.8-1.8h10.8c.99 0 1.6.867 1.8 1.8l1.8 7.2v4.5c0 .99-.81 1.8-1.8 1.8H4.8c-.99 0-1.8-.81-1.8-1.8v-4.5zm6.96 1.8h4.08c-.49.557-1.212.9-2.04.9a2.68 2.68 0 0 1-2.04-.9h4.08c.414-.472.66-1.098.66-1.8h4.14l-1.44-7.2H6.6l-1.44 7.2H9.3c0 .702.246 1.328.66 1.8z" id="tray"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M3 13.35l1.8-7.2c.2-.996.81-1.8 1.8-1.8h10.8c.99 0 1.6.867 1.8 1.8l1.8 7.2v4.5c0 .99-.81 1.8-1.8 1.8H4.8c-.99 0-1.8-.81-1.8-1.8v-4.5zm6.96 1.8h4.08c-.49.557-1.212.9-2.04.9a2.68 2.68 0 0 1-2.04-.9h4.08c.414-.472.66-1.098.66-1.8h4.14l-1.44-7.2H6.6l-1.44 7.2H9.3c0 .702.246 1.328.66 1.8z" id="tray"/>
+</svg>
* getAccessKeyPrefix
*
* @method updateTooltipAccessKeys_getAccessKeyPrefix
- * @deprecated 1.27 Use #getAccessKeyModifiers
+ * @deprecated since 1.27 Use #getAccessKeyModifiers
*/
$.fn.updateTooltipAccessKeys.getAccessKeyPrefix = function ( ua ) {
return getAccessKeyModifiers( ua ).join( '-' ) + '-';
for ( key in ts.collationTable ) {
// Check hasOwn to be safe
if ( ts.collationTable.hasOwnProperty( key ) ) {
- keys.push( key );
+ keys.push( mw.RegExp.escape( key ) );
}
}
if ( keys.length ) {
- ts.collationRegex = new RegExp( '[' + keys.join( '' ) + ']', 'ig' );
+ ts.collationRegex = new RegExp( keys.join( '|' ), 'ig' );
}
}
}
$( function () {
var idleTimeout = 3000,
api = new mw.Api(),
- pending = null,
+ timer,
+ pending,
+ lastText,
+ lastSummary,
+ lastTextHash,
$form = $( '#editform' ),
$text = $form.find( '#wpTextbox1' ),
$summary = $form.find( '#wpSummary' ),
model = $form.find( '[name=model]' ).val(),
format = $form.find( '[name=format]' ).val(),
revId = $form.find( '[name=parentRevId]' ).val(),
- lastText = $text.textSelection( 'getContents' ),
- timer = null;
+ lastPriority = 0,
+ PRIORITY_LOW = 1,
+ PRIORITY_HIGH = 2;
// Send a request to stash the edit to the API.
// If a request is in progress, abort it since its payload is stale and the API
// may limit concurrent stash parses.
function stashEdit() {
- if ( pending ) {
- pending.abort();
- }
-
api.getToken( 'csrf' ).then( function ( token ) {
- lastText = $text.textSelection( 'getContents' );
+ var req, params,
+ textChanged = isTextChanged(),
+ priority = textChanged ? PRIORITY_HIGH : PRIORITY_LOW;
+
+ if ( pending ) {
+ if ( lastPriority > priority ) {
+ // Stash request for summary change should wait on pending text change stash
+ pending.then( checkStash );
+ return;
+ }
+ pending.abort();
+ }
- pending = api.post( {
+ // Update the "last" tracking variables
+ lastSummary = $summary.textSelection( 'getContents' );
+ lastPriority = priority;
+ if ( textChanged ) {
+ lastText = $text.textSelection( 'getContents' );
+ // Reset hash
+ lastTextHash = null;
+ }
+
+ params = {
action: 'stashedit',
token: token,
title: mw.config.get( 'wgPageName' ),
section: section,
sectiontitle: '',
- text: lastText,
- summary: $summary.textSelection( 'getContents' ),
+ summary: lastSummary,
contentmodel: model,
contentformat: format,
baserevid: revId
+ };
+ if ( lastTextHash ) {
+ params.stashedtexthash = lastTextHash;
+ } else {
+ params.text = lastText;
+ }
+
+ req = api.post( params );
+ pending = req;
+ req.then( function ( data ) {
+ if ( req === pending ) {
+ pending = null;
+ }
+ if ( data.stashedit && data.stashedit.texthash ) {
+ lastTextHash = data.stashedit.texthash;
+ } else {
+ // Request failed or text hash expired;
+ // include the text in a future stash request.
+ lastTextHash = null;
+ }
} );
} );
}
- // Check if edit body text changed since the last stashEdit() call or if no edit
- // stash calls have yet been made
- function isChanged() {
- var newText = $text.textSelection( 'getContents' );
- return newText !== lastText;
+ // Whether the body text content changed since the last stashEdit()
+ function isTextChanged() {
+ return lastText !== $text.textSelection( 'getContents' );
+ }
+
+ // Whether the edit summary has changed since the last stashEdit()
+ function isSummaryChanged() {
+ return lastSummary !== $summary.textSelection( 'getContents' );
}
- function onEditorIdle() {
- if ( !isChanged() ) {
+ // Check whether text or summary have changed and call stashEdit()
+ function checkStash() {
+ if ( !isTextChanged() && !isSummaryChanged() ) {
return;
}
stashEdit();
}
- function onTextKeyUp( e ) {
+ function onKeyUp( e ) {
// Ignore keystrokes that don't modify text, like cursor movements.
// See <http://www.javascripter.net/faq/keycodes.htm> and
// <http://www.quirksmode.org/js/keys.html>. We don't have to be exhaustive,
}
clearTimeout( timer );
- timer = setTimeout( onEditorIdle, idleTimeout );
+ timer = setTimeout( checkStash, idleTimeout );
+ }
+
+ function onSummaryFocus() {
+ // Summary typing is usually near the end of the workflow and involves less pausing.
+ // Re-stash more frequently in hopes of capturing the final summary before submission.
+ idleTimeout = 1000;
+ // Stash now since the text is likely the final version. The re-stashes based on the
+ // summary are targeted at caching edit checks that need the final summary.
+ checkStash();
+ }
+
+ function onTextFocus() {
+ // User returned to the text field... reset stash rate to default
+ idleTimeout = 3000;
}
function onFormLoaded() {
// probably save the page soon
|| $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
) {
- stashEdit();
+ checkStash();
}
}
- // We don't attempt to stash new section edits because in such cases
- // the parser output varies on the edit summary (since it determines
- // the new section's name).
+ // We don't attempt to stash new section edits because in such cases the parser output
+ // varies on the edit summary (since it determines the new section's name).
if ( $form.find( 'input[name=wpSection]' ).val() === 'new' ) {
return;
}
- $text.on( { change: onEditorIdle, keyup: onTextKeyUp } );
- $summary.on( { focus: onEditorIdle } );
+ $text.on( {
+ change: checkStash,
+ keyup: onKeyUp,
+ focus: onTextFocus
+ } );
+ $summary.on( {
+ focus: onSummaryFocus,
+ focusout: checkStash,
+ keyup: onKeyUp
+ } );
onFormLoaded();
-
} );
}( mediaWiki, jQuery ) );
.editButtons input:first-child {
margin-left: .1em;
}
+
+/*
+ * Add a bit of margin space between the preview and the toolbar.
+ * This replaces the ugly <p><br /></p> we used to insert into the page source
+ */
+#wikiPreview.ontop {
+ margin-bottom: 1em;
+}
#footer-places,
.mw-hidden-catlinks,
.usermessage,
-.patrollink,
.ns-0 .mw-redirectedfrom,
div.magnify,
#mw-navigation,
font-style: italic;
}
-span.unpatrolled {
- font-weight: bold;
- color: #f00;
-}
-
div.gallerybox {
width: 150px;
}
unicode-bidi: isolate;
}
-/**
- * Add a bit of margin space between the preview and the toolbar.
- * This replaces the ugly <p><br /></p> we used to insert into the page source
- */
-#wikiPreview.ontop {
- margin-bottom: 1em;
-}
-
/* Stop floats from intruding into edit area in previews */
#editform,
#toolbar,
font-style: italic;
}
-/**
- * Patrol stuff
- */
-.not-patrolled {
- background-color: #ffa;
-}
-
-.unpatrolled {
- font-weight: bold;
- color: #f00;
-}
-
-div.patrollink {
- font-size: 75%;
- text-align: right;
-}
-
/**
* Forms
*/
#mw-revision-info-current,
#mw-revision-nav {
direction: ltr;
- display: inline;
}
/* Images */
div.tleft {
margin: .5em 1.4em 1.3em 0;
}
+
+/* Hide elements that are marked as "empty" according to legacy Tidy rules
+ */
+.mw-empty-elt, .mw-empty-li {
+ display: none;
+}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="13"
- height="110"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.5 r10040"
- sodipodi:docname="external link icons.svg">
- <defs
- id="defs4" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="15.999999"
- inkscape:cx="10.40536"
- inkscape:cy="65.686256"
- inkscape:document-units="px"
- inkscape:current-layer="layer5"
- showgrid="true"
- fit-margin-top="0"
- fit-margin-left="0"
- fit-margin-right="0"
- fit-margin-bottom="0"
- inkscape:window-width="1283"
- inkscape:window-height="711"
- inkscape:window-x="1790"
- inkscape:window-y="-6"
- inkscape:window-maximized="0">
- <inkscape:grid
- type="xygrid"
- id="grid3246"
- empspacing="4"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true"
- originx="0px"
- originy="-27.999997px" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="base"
- style="display:none"
- transform="translate(-505,-869.36218)">
- <rect
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
- id="rect4646"
- width="13"
- height="12.999996"
- x="505"
- y="885.36218" />
- <rect
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
- id="rect4646-4"
- width="13"
- height="12.999998"
- x="505"
- y="901.36218" />
- <rect
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
- id="rect4646-4-6"
- width="13"
- height="12.999996"
- x="505"
- y="917.36218"
- inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <rect
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
- id="rect4646-4-6-9"
- width="13"
- height="12.999996"
- x="505"
- y="933.36218" />
- <rect
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
- id="rect4646-4-6-6"
- width="13"
- height="12.999996"
- x="505"
- y="950.36218" />
- <rect
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
- id="rect4646-4-6-2"
- width="13"
- height="12.999998"
- x="505"
- y="966.36218" />
- <rect
- style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
- id="rect4646-44"
- width="13"
- height="12.999996"
- x="505"
- y="869.36218" />
- </g>
- <g
- inkscape:label="sketch 1"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(-505,-869.36218)"
- style="display:none"
- sodipodi:insensitive="true">
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 507,870.36218 0,5 3,0 4,4 0,-13 -4,4 z"
- id="path3194"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 517,869.36218 c 1,2 1,5 0,7"
- id="path3196"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 520,867.36218 c 2,2 2,9 0,11"
- id="path3198"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 507.93861,989.90562 0,15.99988 13,0 0,-10.99988 -5,-5 z"
- id="path3200"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 506.93861,918.90546 0,11.5 15,0 0,-11.5 z"
- id="path3202"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 506.93861,918.90546 7.5,6 7.5,-6"
- id="path3204"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 507.93861,890.90546 3,0"
- id="path3212"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 507.93861,893.90546 3,0"
- id="path3214"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 507.93861,899.90546 3,0"
- id="path3218"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 507.93861,902.90546 3,0"
- id="path3220"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 517.93861,890.90546 3,0"
- id="path3222"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 507.93861,896.90546 13,0"
- id="path3224"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 517.93861,893.90546 3,0"
- id="path3226"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 517.93861,899.90546 3,0"
- id="path3230"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 517.93861,902.90546 3,0"
- id="path3232"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 510.93861,890.90546 0,12 7,0 0,-12 z"
- id="path3206"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 507.93861,888.90546 0,16"
- id="path3208"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 520.93861,888.90546 0,16"
- id="path3210"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 515.93861,989.90562 0,5 5,0"
- id="path3234"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 513.93861,969.40546 c -2,0 -5,0 -7,0 l 0,10.99995 11,5e-5 c 0,-2.33332 0,-4.66668 0,-7"
- id="path3236"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none"
- d="m 513.93861,976.40546 5,-4 3,3 0,-10 -10,0 3,3 -4,5"
- id="path3242"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc" />
- <path
- style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 506.93861,940.40546 15,0 0,10 -6,0 -6,4 1,-4 -4,0 z"
- id="path3244"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <path
- style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 509.93861,972.40546 c 2,1 4,3 5,5"
- id="path4641"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer4"
- inkscape:label="sketch 2"
- style="display:none"
- transform="translate(0,-6.0000106)">
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 8.4921988,1.0623917 -4.0641234,4.064123 -3.2512987,0 0,5.6897733 3.2512987,0 4.0641234,4.064124 z m -1.6256494,4.064124 0,5.6897733 -1.6256493,-1.6256493 -2.438474,-1e-6 0,-2.438474 2.438474,1e-6 z"
- id="path4755-9"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 9.3050235,5.1265157 c 0,-0.812824 0.8128245,-1.625649 1.6256495,-0.812824 0,0 0.812825,0.812824 0.812825,3.251298 0,2.4384743 -0.812825,3.2512993 -0.812825,3.2512993 -0.812825,0.812825 -1.6256495,0 -1.6256495,-0.812825 0,0 0.8128245,-0.8128243 0.8128245,-2.4384743 0,-1.625649 -0.8128245,-2.438474 -0.8128245,-2.438474 z"
- id="path4760-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccsc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 11.743498,3.5008667 c 0,-0.812825 0.812824,-1.625649 1.625649,-0.812825 0,0 1.625649,1.62565 1.625649,4.876948 0,3.2512993 -1.625649,4.8769483 -1.625649,4.8769483 -0.812825,0.812825 -1.625649,0 -1.625649,-0.812824 0,0 1.625649,-1.62565 1.625649,-4.0641243 0,-2.438474 -1.625649,-4.064123 -1.625649,-4.064123 z"
- id="path4762-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccsc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 2.8024261,23.008658 0,0.812825 10.5667209,0 0,-0.812825 z"
- id="path4772"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 2.8024261,33.575379 10.5667209,0 0,-0.812825 -10.5667209,0 z"
- id="path4774"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 2.8024261,25.447132 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
- id="path4782"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 2.8024261,30.32408 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
- id="path4778"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 2.8024261,28.698431 10.5667209,0 0,-0.812825 -10.5667209,0 z"
- id="path4780"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 5.2409001,27.479194 0,1.625649 5.6897729,0 0,-1.625649 z"
- id="path4793"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 4.4280754,23.008658 0,10.56672 7.3154226,0 0,-10.56672 z m 1.6256494,1.625649 4.0641232,0 0,7.315422 -4.0641232,0 z"
- id="path4768"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 1.9896014,21.383009 1.6256493,0 0,13.818019 -1.6256493,0 z"
- id="path4764"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 12.556322,21.383009 1.62565,0 0,13.818019 -1.62565,0 z"
- id="path4766"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 1.9896014,44.954923 6.096185,5.689773 6.0961856,-5.689773 -0.812825,-0.812825 -1.625649,0.813196 -3.6577116,3.251298 -3.657711,-3.251298 -1.6256493,-0.813196 z"
- id="path4800-4"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 1.1767767,43.329273 0,11.379545 13.8180193,0 0,-11.379545 z m 1.6256494,1.625649 10.5667209,0 0,8.128247 -10.5667209,0 z"
- id="path4795-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 1.9896014,62.024243 -0.8128247,0.812824 0,8.128247 0.8128247,0.812825 2.438474,0 -0.8128247,3.251297 5.6897728,-3.251297 4.8769485,0 0.812824,-0.812825 0,-8.128247 -0.812824,-0.812824 z m 0.8128247,1.625649 10.5667209,0 0,6.502598 -4.0641235,0 -3.5815088,2.133664 0.9144278,-2.133664 -3.8355164,0 z"
- id="path4802-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 4.4280754,82.344856 10.5667206,0 0,10.56672 -3.251298,-3.25129 -3.2512992,2.43847 -0.8128247,-0.81282 4.0641239,-3.2513 1.625649,1.62565 0,-5.68978 -5.6897729,0 1.6256494,1.62565 -3.2512987,4.06413 -0.8128247,-0.81283 2.438474,-3.2513 z"
- id="path4807-5"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 8.4921988,85.596156 -7.3154221,0 0,10.56672 10.5667213,0 0,-7.31542 -1.62565,0.81283 0,4.87694 -7.3154219,0 0,-7.31542 4.876948,0 z"
- id="path4809-7"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 8.4921988,103.47831 0,4.87694 4.8769482,0 0,-1.62565 -3.251299,0 0,-3.25129 z"
- id="path4818-67"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 1.9896014,102.66548 0,13.81802 12.1923706,0 0,-10.13799 -3.657711,-3.68003 z m 1.6256493,1.62565 6.5025973,0 2.438474,2.43847 0,8.12825 -8.9410713,0 z"
- id="path4813-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 3.6152507,88.847456 c 0,-0.81282 0.8128247,-0.81282 0.8128247,-0.81282 2.438474,0.81282 4.0641234,2.43847 4.8769481,4.87694 0,0 0,0.81283 -0.8128247,0.81283 -1.6256494,-2.43847 -2.438474,-3.2513 -4.8769481,-4.87695 z"
- id="path4822-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="Layer"
- style="display:none"
- transform="translate(-10,-26.000007)">
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none"
- d="m 19,20.999995 -4,4 -3,0 0,6 3,0 4,4 z m -1,2.5 0,9 -2.6,-2.5 -2.4,0 0,-4 2.5,0 z"
- id="path4755"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none"
- d="m 19.75,24.999995 c 0,-1 0.75,-1 0.75,-1 0,0 1.5,1.029412 1.5,3.5 0,2.470588 -1.5,3.5 -1.5,3.5 0,0 -0.75,0 -0.75,-1 0,0 1,-0.852941 1,-2.5 0,-1.647059 -1,-2.5 -1,-2.5 z"
- id="path4760"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccsc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none"
- d="m 22.25,23.999995 c 0,-1 0.75,-1 0.75,-1 0,0 2,1.205882 2,4.5 0,3.294118 -2,4.5 -2,4.5 0,0 -0.75,0 -0.75,-1 0,0 1.5,-1.029412 1.5,-3.5 0,-2.470588 -1.5,-3.5 -1.5,-3.5 z"
- id="path4762"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccsc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none"
- d="m 31.4375,79.875 -1,1 0,10 1,1 3,0 -1,4 7,-4 6,0 1,-1 0,-10 -1,-1 z m 1,2 13,0 0,8 -5,0 -4.40625,2.625 1.125,-2.625 -4.71875,0 z"
- id="path4802"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none"
- d="m 35.125,98.8125 13,0 0,13 -4,-4 -4,3 -1,-1 5,-4 2,2 0,-7 -7,0 2,2 -4,5 -1,-1 3,-4 z"
- id="path4807"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none"
- d="m 40.125,102.8125 -9,0 0,13 13,0 0,-9 -2,1 0,6 -9,0 0,-9 6,0 z"
- id="path4809"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none"
- d="m 34.125,106.8125 c 0,-1 1,-1 1,-1 3,1 5,3 6,6 0,0 0,1 -1,1 -2,-3 -3,-4 -6,-6 z"
- id="path4822"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 12,50.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
- id="rect4841"
- inkscape:connector-curvature="0" />
- <path
- style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
- d="m 12,44.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
- id="rect4843"
- inkscape:connector-curvature="0" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
- d="m 12,52.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
- id="rect4843-1"
- sodipodi:nodetypes="cccccccccc" />
- <path
- inkscape:connector-curvature="0"
- style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
- d="m 12,41.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
- id="rect4843-17"
- sodipodi:nodetypes="cccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
- d="m 12,47.499995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
- id="rect4841-9"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <rect
- style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
- id="rect4835"
- width="7"
- height="2"
- x="4"
- y="27"
- transform="translate(10,19.999995)" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none"
- d="m 2,21 1,0 0,14 -1,0 z"
- id="path4826"
- inkscape:connector-curvature="0"
- transform="translate(10,19.999995)"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none"
- d="m 13,21 1,0 0,14 -1,0 z"
- id="path4828"
- inkscape:connector-curvature="0"
- transform="translate(10,19.999995)"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none"
- d="m 4,22 0,12 8,0 0,-12 z m 1,1 6,0 0,10 -6,0 z"
- transform="translate(10,19.999995)"
- id="path4830"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <rect
- style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
- id="rect4837"
- width="8"
- height="1"
- x="4"
- y="22"
- transform="translate(10,19.999995)" />
- <rect
- style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
- id="rect4839"
- width="8"
- height="1"
- x="4"
- y="33"
- transform="translate(10,19.999995)" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none"
- d="m 12,64.999995 6,5 6,-5 0.53033,-1.45299 -1.28033,0.45299 -5.25,4.5 -5.25,-4.5 -1.236136,-0.53033 z"
- id="path4910"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none"
- d="m 11,62.999995 0,10 14,0 0,-10 z m 1,1 12,0 0,8 -12,0 z"
- id="path4905"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 19,121 0,5 5,0 -1,-1 -3,0 0,-3 z"
- id="path4818-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 12,121 0,14 12,0 0,-10 -4,-4 z m 1,1 6.5,0 3.5,3.5 0,8.5 -10,0 z"
- id="path4813-3"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccc" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer5"
- inkscape:label="Layer#1"
- style="opacity:0.98999999"
- transform="translate(0,-6.0000106)">
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 7,23.000004 -3,3 -3,0 0,4 3,0 3,3 z m -1,2.500001 0,5 -1.5,-1.500001 -2.5,0 0,-2 2.5,0 z"
- id="path4755-9-5"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 7.4319858,26.075368 c 0,-0.621323 0.6213237,-1.242647 1.2426477,-0.621323 0,0 0.6213228,0.621323 0.6213228,2.485294 0,1.863971 -0.6213228,2.485294 -0.6213228,2.485294 -0.621324,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 0.6213237,-0.621324 0.6213237,-1.863971 0,-1.242648 -0.6213237,-1.863971 -0.6213237,-1.863971 z"
- id="path4760-1-7"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccsc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 9.2959563,24.832721 c 0,-0.621324 0.6213228,-1.242647 1.2426477,-0.621324 0,0 1.242646,1.242648 1.242646,3.727942 0,2.485294 -1.242646,3.727941 -1.242646,3.727941 -0.6213249,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 1.2426477,-1.242647 1.2426477,-3.106618 0,-1.863971 -1.2426477,-3.106618 -1.2426477,-3.106618 z"
- id="path4762-8-3"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccsc" />
- <path
- style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
- d="m 2.4916056,40.000004 0,0.621323 8.0979164,0 0,-0.621323 z"
- id="path4772-4"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
- d="m 2.4916056,48.000004 8.0979164,0 0,-0.621324 -8.0979164,0 z"
- id="path4774-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
- d="m 2.4916056,41.919118 0,0.621323 1.8687499,0 0,-0.621323 z m 6.2291665,0 0,0.621323 1.8687499,0 0,-0.621323 z"
- id="path4782-3"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
- d="m 2.4916056,45.589344 0,0.621322 1.8687499,0 0,-0.621322 z m 6.2291665,0 0,0.621322 1.8687499,0 0,-0.621322 z"
- id="path4778-9"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
- d="m 2.4916056,44.404412 8.0979164,0 0,-0.621323 -8.0979164,0 z"
- id="path4780-0"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 4.3603555,43.472427 0,1.242647 4.3604166,0 0,-1.242647 z"
- id="path4793-0"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 4,40.000004 0,8 5,0 0,-8 z m 1,1 3,0 0,6 -3,0 z"
- id="path4768-5"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 2,39.000004 1,0 0,10 -1,0 z"
- id="path4764-1"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 10,39.000004 1,0 0,10 -1,0 z"
- id="path4766-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="M 1.8400738,58.055766 6.5000005,62.405031 11.159927,58.055766 10.538604,57.434442 9.2959563,58.056049 6.5000005,60.541343 3.7040445,58.056049 2.4613977,57.434442 z"
- id="path4800-4-9"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccc"
- inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 1,57.000008 0,8 11,0 0,-8 z m 1,1 9,0 0,6 -9,0 z"
- id="path4795-8-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccc"
- inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="M 1.6213238,72.000004 1,72.621328 l 0,5.757352 0.6213238,0.621324 1.6894529,0 L 2.6894528,81.727943 7,79.000004 l 4.378677,0 L 12,78.37868 12,72.621328 11.378677,72.000004 z m 0.3786762,1 9,0 0,5 -4,0 L 4.0978858,79.896603 5,78.000004 l -3,0 z"
- id="path4802-8-9"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 5,88.000004 7,0 0,7 -2,-2 -3,2 0,-1 3,-2.249999 1,1 0,-3.750001 -3.75,0 1,1 -2.25,3 -1,0 2,-3 z"
- id="path4807-5-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 7,90.000004 -5,0 0,8 8,0 0,-5 -1,0 0,4 -6,0 0,-6 4,0 z"
- id="path4809-7-3"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 7.5,105.00001 0,3 2.5,0 1,-1 -2.5,0 0,-3 z"
- id="path4818-67-7"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccc" />
- <path
- style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
- d="m 3,104 0,10 8,1e-5 0,-7 -2.5,-3 z m 1,1 4,1e-5 2,2.50001 0,5.49999 -6,0 z"
- id="path4813-2-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccc" />
- <path
- style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
- d="m 4.0827206,92.533089 c 0,-0.621319 0.6213239,-0.621319 0.6213239,-0.621319 1.8639706,0.621319 3.1066175,1.863968 3.7279413,3.727935 0,0 0,0.621328 -0.6213238,0.621328 C 6.5680151,94.397065 5.9466913,93.775738 4.0827206,92.533089 z"
- id="path4822-8-2"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
- d="m 1,8.500006 0,7.5001 1,-0.9872 0,-6.0129 2,0 2,1 4,-2e-4 0,2.0002 1,0 0,-2.5 -0.5,-0.5002 -4.5,2e-4 -2,-1 -2.5,0 z"
- id="path3209"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccccccccccccc" />
- <path
- style="fill:#16a4e8;fill-opacity:1;stroke:none;display:inline"
- d="m 6,11.000106 -1,-10e-5 -2.5,0 -0.5,0.5 -1,4.5001 10,-10e-5 0,-4.4998 -0.5,-0.5 z m 0,1 4,-10e-5 0,3 -7.75,-1e-4 0.75,-3.0001 2,0 z"
- id="path3215"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccccccccccc" />
- <path
- style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
- d="m 2,17.000006 0,1 8,0 0,-1 z"
- id="path3247"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
- d="m 5,15.500006 0,2 2,0 0,-2 c 0,-0.5 -2,-0.5 -2,0 z"
- id="path3249"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccccc" />
- </g>
-</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="13"
+ height="110"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="external link icons.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.999999"
+ inkscape:cx="10.40536"
+ inkscape:cy="65.686256"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="true"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1283"
+ inkscape:window-height="711"
+ inkscape:window-x="1790"
+ inkscape:window-y="-6"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3246"
+ empspacing="4"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ originx="0px"
+ originy="-27.999997px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="base"
+ style="display:none"
+ transform="translate(-505,-869.36218)">
+ <rect
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect4646"
+ width="13"
+ height="12.999996"
+ x="505"
+ y="885.36218" />
+ <rect
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect4646-4"
+ width="13"
+ height="12.999998"
+ x="505"
+ y="901.36218" />
+ <rect
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect4646-4-6"
+ width="13"
+ height="12.999996"
+ x="505"
+ y="917.36218"
+ inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect4646-4-6-9"
+ width="13"
+ height="12.999996"
+ x="505"
+ y="933.36218" />
+ <rect
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect4646-4-6-6"
+ width="13"
+ height="12.999996"
+ x="505"
+ y="950.36218" />
+ <rect
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect4646-4-6-2"
+ width="13"
+ height="12.999998"
+ x="505"
+ y="966.36218" />
+ <rect
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+ id="rect4646-44"
+ width="13"
+ height="12.999996"
+ x="505"
+ y="869.36218" />
+ </g>
+ <g
+ inkscape:label="sketch 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-505,-869.36218)"
+ style="display:none"
+ sodipodi:insensitive="true">
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 507,870.36218 0,5 3,0 4,4 0,-13 -4,4 z"
+ id="path3194"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 517,869.36218 c 1,2 1,5 0,7"
+ id="path3196"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 520,867.36218 c 2,2 2,9 0,11"
+ id="path3198"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 507.93861,989.90562 0,15.99988 13,0 0,-10.99988 -5,-5 z"
+ id="path3200"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 506.93861,918.90546 0,11.5 15,0 0,-11.5 z"
+ id="path3202"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 506.93861,918.90546 7.5,6 7.5,-6"
+ id="path3204"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 507.93861,890.90546 3,0"
+ id="path3212"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 507.93861,893.90546 3,0"
+ id="path3214"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 507.93861,899.90546 3,0"
+ id="path3218"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 507.93861,902.90546 3,0"
+ id="path3220"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 517.93861,890.90546 3,0"
+ id="path3222"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 507.93861,896.90546 13,0"
+ id="path3224"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 517.93861,893.90546 3,0"
+ id="path3226"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 517.93861,899.90546 3,0"
+ id="path3230"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 517.93861,902.90546 3,0"
+ id="path3232"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 510.93861,890.90546 0,12 7,0 0,-12 z"
+ id="path3206"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 507.93861,888.90546 0,16"
+ id="path3208"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 520.93861,888.90546 0,16"
+ id="path3210"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 515.93861,989.90562 0,5 5,0"
+ id="path3234"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 513.93861,969.40546 c -2,0 -5,0 -7,0 l 0,10.99995 11,5e-5 c 0,-2.33332 0,-4.66668 0,-7"
+ id="path3236"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none"
+ d="m 513.93861,976.40546 5,-4 3,3 0,-10 -10,0 3,3 -4,5"
+ id="path3242"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 506.93861,940.40546 15,0 0,10 -6,0 -6,4 1,-4 -4,0 z"
+ id="path3244"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 509.93861,972.40546 c 2,1 4,3 5,5"
+ id="path4641"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="sketch 2"
+ style="display:none"
+ transform="translate(0,-6.0000106)">
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 8.4921988,1.0623917 -4.0641234,4.064123 -3.2512987,0 0,5.6897733 3.2512987,0 4.0641234,4.064124 z m -1.6256494,4.064124 0,5.6897733 -1.6256493,-1.6256493 -2.438474,-1e-6 0,-2.438474 2.438474,1e-6 z"
+ id="path4755-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 9.3050235,5.1265157 c 0,-0.812824 0.8128245,-1.625649 1.6256495,-0.812824 0,0 0.812825,0.812824 0.812825,3.251298 0,2.4384743 -0.812825,3.2512993 -0.812825,3.2512993 -0.812825,0.812825 -1.6256495,0 -1.6256495,-0.812825 0,0 0.8128245,-0.8128243 0.8128245,-2.4384743 0,-1.625649 -0.8128245,-2.438474 -0.8128245,-2.438474 z"
+ id="path4760-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsccsc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 11.743498,3.5008667 c 0,-0.812825 0.812824,-1.625649 1.625649,-0.812825 0,0 1.625649,1.62565 1.625649,4.876948 0,3.2512993 -1.625649,4.8769483 -1.625649,4.8769483 -0.812825,0.812825 -1.625649,0 -1.625649,-0.812824 0,0 1.625649,-1.62565 1.625649,-4.0641243 0,-2.438474 -1.625649,-4.064123 -1.625649,-4.064123 z"
+ id="path4762-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsccsc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 2.8024261,23.008658 0,0.812825 10.5667209,0 0,-0.812825 z"
+ id="path4772"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 2.8024261,33.575379 10.5667209,0 0,-0.812825 -10.5667209,0 z"
+ id="path4774"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 2.8024261,25.447132 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
+ id="path4782"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 2.8024261,30.32408 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
+ id="path4778"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 2.8024261,28.698431 10.5667209,0 0,-0.812825 -10.5667209,0 z"
+ id="path4780"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 5.2409001,27.479194 0,1.625649 5.6897729,0 0,-1.625649 z"
+ id="path4793"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 4.4280754,23.008658 0,10.56672 7.3154226,0 0,-10.56672 z m 1.6256494,1.625649 4.0641232,0 0,7.315422 -4.0641232,0 z"
+ id="path4768"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 1.9896014,21.383009 1.6256493,0 0,13.818019 -1.6256493,0 z"
+ id="path4764"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 12.556322,21.383009 1.62565,0 0,13.818019 -1.62565,0 z"
+ id="path4766"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 1.9896014,44.954923 6.096185,5.689773 6.0961856,-5.689773 -0.812825,-0.812825 -1.625649,0.813196 -3.6577116,3.251298 -3.657711,-3.251298 -1.6256493,-0.813196 z"
+ id="path4800-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 1.1767767,43.329273 0,11.379545 13.8180193,0 0,-11.379545 z m 1.6256494,1.625649 10.5667209,0 0,8.128247 -10.5667209,0 z"
+ id="path4795-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 1.9896014,62.024243 -0.8128247,0.812824 0,8.128247 0.8128247,0.812825 2.438474,0 -0.8128247,3.251297 5.6897728,-3.251297 4.8769485,0 0.812824,-0.812825 0,-8.128247 -0.812824,-0.812824 z m 0.8128247,1.625649 10.5667209,0 0,6.502598 -4.0641235,0 -3.5815088,2.133664 0.9144278,-2.133664 -3.8355164,0 z"
+ id="path4802-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 4.4280754,82.344856 10.5667206,0 0,10.56672 -3.251298,-3.25129 -3.2512992,2.43847 -0.8128247,-0.81282 4.0641239,-3.2513 1.625649,1.62565 0,-5.68978 -5.6897729,0 1.6256494,1.62565 -3.2512987,4.06413 -0.8128247,-0.81283 2.438474,-3.2513 z"
+ id="path4807-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 8.4921988,85.596156 -7.3154221,0 0,10.56672 10.5667213,0 0,-7.31542 -1.62565,0.81283 0,4.87694 -7.3154219,0 0,-7.31542 4.876948,0 z"
+ id="path4809-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 8.4921988,103.47831 0,4.87694 4.8769482,0 0,-1.62565 -3.251299,0 0,-3.25129 z"
+ id="path4818-67"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 1.9896014,102.66548 0,13.81802 12.1923706,0 0,-10.13799 -3.657711,-3.68003 z m 1.6256493,1.62565 6.5025973,0 2.438474,2.43847 0,8.12825 -8.9410713,0 z"
+ id="path4813-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 3.6152507,88.847456 c 0,-0.81282 0.8128247,-0.81282 0.8128247,-0.81282 2.438474,0.81282 4.0641234,2.43847 4.8769481,4.87694 0,0 0,0.81283 -0.8128247,0.81283 -1.6256494,-2.43847 -2.438474,-3.2513 -4.8769481,-4.87695 z"
+ id="path4822-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Layer"
+ style="display:none"
+ transform="translate(-10,-26.000007)">
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none"
+ d="m 19,20.999995 -4,4 -3,0 0,6 3,0 4,4 z m -1,2.5 0,9 -2.6,-2.5 -2.4,0 0,-4 2.5,0 z"
+ id="path4755"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none"
+ d="m 19.75,24.999995 c 0,-1 0.75,-1 0.75,-1 0,0 1.5,1.029412 1.5,3.5 0,2.470588 -1.5,3.5 -1.5,3.5 0,0 -0.75,0 -0.75,-1 0,0 1,-0.852941 1,-2.5 0,-1.647059 -1,-2.5 -1,-2.5 z"
+ id="path4760"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsccsc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none"
+ d="m 22.25,23.999995 c 0,-1 0.75,-1 0.75,-1 0,0 2,1.205882 2,4.5 0,3.294118 -2,4.5 -2,4.5 0,0 -0.75,0 -0.75,-1 0,0 1.5,-1.029412 1.5,-3.5 0,-2.470588 -1.5,-3.5 -1.5,-3.5 z"
+ id="path4762"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsccsc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none"
+ d="m 31.4375,79.875 -1,1 0,10 1,1 3,0 -1,4 7,-4 6,0 1,-1 0,-10 -1,-1 z m 1,2 13,0 0,8 -5,0 -4.40625,2.625 1.125,-2.625 -4.71875,0 z"
+ id="path4802"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none"
+ d="m 35.125,98.8125 13,0 0,13 -4,-4 -4,3 -1,-1 5,-4 2,2 0,-7 -7,0 2,2 -4,5 -1,-1 3,-4 z"
+ id="path4807"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none"
+ d="m 40.125,102.8125 -9,0 0,13 13,0 0,-9 -2,1 0,6 -9,0 0,-9 6,0 z"
+ id="path4809"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none"
+ d="m 34.125,106.8125 c 0,-1 1,-1 1,-1 3,1 5,3 6,6 0,0 0,1 -1,1 -2,-3 -3,-4 -6,-6 z"
+ id="path4822"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 12,50.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
+ id="rect4841"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 12,44.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
+ id="rect4843"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+ d="m 12,52.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
+ id="rect4843-1"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+ d="m 12,41.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
+ id="rect4843-17"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+ d="m 12,47.499995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
+ id="rect4841-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <rect
+ style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect4835"
+ width="7"
+ height="2"
+ x="4"
+ y="27"
+ transform="translate(10,19.999995)" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none"
+ d="m 2,21 1,0 0,14 -1,0 z"
+ id="path4826"
+ inkscape:connector-curvature="0"
+ transform="translate(10,19.999995)"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none"
+ d="m 13,21 1,0 0,14 -1,0 z"
+ id="path4828"
+ inkscape:connector-curvature="0"
+ transform="translate(10,19.999995)"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none"
+ d="m 4,22 0,12 8,0 0,-12 z m 1,1 6,0 0,10 -6,0 z"
+ transform="translate(10,19.999995)"
+ id="path4830"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <rect
+ style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect4837"
+ width="8"
+ height="1"
+ x="4"
+ y="22"
+ transform="translate(10,19.999995)" />
+ <rect
+ style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect4839"
+ width="8"
+ height="1"
+ x="4"
+ y="33"
+ transform="translate(10,19.999995)" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none"
+ d="m 12,64.999995 6,5 6,-5 0.53033,-1.45299 -1.28033,0.45299 -5.25,4.5 -5.25,-4.5 -1.236136,-0.53033 z"
+ id="path4910"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none"
+ d="m 11,62.999995 0,10 14,0 0,-10 z m 1,1 12,0 0,8 -12,0 z"
+ id="path4905"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 19,121 0,5 5,0 -1,-1 -3,0 0,-3 z"
+ id="path4818-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 12,121 0,14 12,0 0,-10 -4,-4 z m 1,1 6.5,0 3.5,3.5 0,8.5 -10,0 z"
+ id="path4813-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Layer#1"
+ style="opacity:0.98999999"
+ transform="translate(0,-6.0000106)">
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 7,23.000004 -3,3 -3,0 0,4 3,0 3,3 z m -1,2.500001 0,5 -1.5,-1.500001 -2.5,0 0,-2 2.5,0 z"
+ id="path4755-9-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 7.4319858,26.075368 c 0,-0.621323 0.6213237,-1.242647 1.2426477,-0.621323 0,0 0.6213228,0.621323 0.6213228,2.485294 0,1.863971 -0.6213228,2.485294 -0.6213228,2.485294 -0.621324,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 0.6213237,-0.621324 0.6213237,-1.863971 0,-1.242648 -0.6213237,-1.863971 -0.6213237,-1.863971 z"
+ id="path4760-1-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsccsc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 9.2959563,24.832721 c 0,-0.621324 0.6213228,-1.242647 1.2426477,-0.621324 0,0 1.242646,1.242648 1.242646,3.727942 0,2.485294 -1.242646,3.727941 -1.242646,3.727941 -0.6213249,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 1.2426477,-1.242647 1.2426477,-3.106618 0,-1.863971 -1.2426477,-3.106618 -1.2426477,-3.106618 z"
+ id="path4762-8-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsccsc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+ d="m 2.4916056,40.000004 0,0.621323 8.0979164,0 0,-0.621323 z"
+ id="path4772-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+ d="m 2.4916056,48.000004 8.0979164,0 0,-0.621324 -8.0979164,0 z"
+ id="path4774-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+ d="m 2.4916056,41.919118 0,0.621323 1.8687499,0 0,-0.621323 z m 6.2291665,0 0,0.621323 1.8687499,0 0,-0.621323 z"
+ id="path4782-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+ d="m 2.4916056,45.589344 0,0.621322 1.8687499,0 0,-0.621322 z m 6.2291665,0 0,0.621322 1.8687499,0 0,-0.621322 z"
+ id="path4778-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
+ d="m 2.4916056,44.404412 8.0979164,0 0,-0.621323 -8.0979164,0 z"
+ id="path4780-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 4.3603555,43.472427 0,1.242647 4.3604166,0 0,-1.242647 z"
+ id="path4793-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 4,40.000004 0,8 5,0 0,-8 z m 1,1 3,0 0,6 -3,0 z"
+ id="path4768-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 2,39.000004 1,0 0,10 -1,0 z"
+ id="path4764-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 10,39.000004 1,0 0,10 -1,0 z"
+ id="path4766-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="M 1.8400738,58.055766 6.5000005,62.405031 11.159927,58.055766 10.538604,57.434442 9.2959563,58.056049 6.5000005,60.541343 3.7040445,58.056049 2.4613977,57.434442 z"
+ id="path4800-4-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc"
+ inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 1,57.000008 0,8 11,0 0,-8 z m 1,1 9,0 0,6 -9,0 z"
+ id="path4795-8-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccc"
+ inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="M 1.6213238,72.000004 1,72.621328 l 0,5.757352 0.6213238,0.621324 1.6894529,0 L 2.6894528,81.727943 7,79.000004 l 4.378677,0 L 12,78.37868 12,72.621328 11.378677,72.000004 z m 0.3786762,1 9,0 0,5 -4,0 L 4.0978858,79.896603 5,78.000004 l -3,0 z"
+ id="path4802-8-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 5,88.000004 7,0 0,7 -2,-2 -3,2 0,-1 3,-2.249999 1,1 0,-3.750001 -3.75,0 1,1 -2.25,3 -1,0 2,-3 z"
+ id="path4807-5-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 7,90.000004 -5,0 0,8 8,0 0,-5 -1,0 0,4 -6,0 0,-6 4,0 z"
+ id="path4809-7-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 7.5,105.00001 0,3 2.5,0 1,-1 -2.5,0 0,-3 z"
+ id="path4818-67-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
+ d="m 3,104 0,10 8,1e-5 0,-7 -2.5,-3 z m 1,1 4,1e-5 2,2.50001 0,5.49999 -6,0 z"
+ id="path4813-2-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccc" />
+ <path
+ style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
+ d="m 4.0827206,92.533089 c 0,-0.621319 0.6213239,-0.621319 0.6213239,-0.621319 1.8639706,0.621319 3.1066175,1.863968 3.7279413,3.727935 0,0 0,0.621328 -0.6213238,0.621328 C 6.5680151,94.397065 5.9466913,93.775738 4.0827206,92.533089 z"
+ id="path4822-8-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
+ d="m 1,8.500006 0,7.5001 1,-0.9872 0,-6.0129 2,0 2,1 4,-2e-4 0,2.0002 1,0 0,-2.5 -0.5,-0.5002 -4.5,2e-4 -2,-1 -2.5,0 z"
+ id="path3209"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccc" />
+ <path
+ style="fill:#16a4e8;fill-opacity:1;stroke:none;display:inline"
+ d="m 6,11.000106 -1,-10e-5 -2.5,0 -0.5,0.5 -1,4.5001 10,-10e-5 0,-4.4998 -0.5,-0.5 z m 0,1 4,-10e-5 0,3 -7.75,-1e-4 0.75,-3.0001 2,0 z"
+ id="path3215"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccc" />
+ <path
+ style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
+ d="m 2,17.000006 0,1 8,0 0,-1 z"
+ id="path3247"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
+ d="m 5,15.500006 0,2 2,0 0,-2 c 0,-0.5 -2,-0.5 -2,0 z"
+ id="path3249"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+</svg>
table.mw-userrights-groups * th {
padding-right: 1.5em;
}
-
-/* Special:Upload */
-p.mw-upload-editlicenses {
- font-size: 90%;
- text-align: right;
-}
*/
( function ( mw, $ ) {
$( function () {
- var $preftoc, $preferences, $fieldsets,
- labelFunc,
- $tzSelect, $tzTextbox, $localtimeHolder, servertime,
- allowCloseWindow, notif;
+ var $preftoc, $preferences, $fieldsets, labelFunc,
+ $tzSelect, $tzTextbox, $localtimeHolder, servertime, allowCloseWindow,
+ convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
labelFunc = function () {
return this.id.replace( /^mw-prefsection/g, 'preftab' );
}
}
- // Check for messageboxes (.successbox, .warningbox, .errorbox) to replace with notifications
- if ( $( '.mw-preferences-messagebox' ).length ) {
- // If there is a #mw-preferences-success box and javascript is enabled, use a slick notification instead!
- if ( $( '#mw-preferences-success' ).length ) {
- notif = mw.notification.notify( mw.message( 'savedprefs' ), { autoHide: false } );
- // 'change' event not reliable!
- $( '#preftoc, .prefsection' ).one( 'change keydown mousedown', function () {
- if ( notif ) {
- notif.close();
- notif = null;
- }
- } );
- }
- }
+ // Check for successbox to replace with notifications
+ convertmessagebox();
// Enable keyboard users to use left and right keys to switch tabs
$preftoc.on( 'keydown', function ( event ) {
zoom: 1;
}
-/* When JS is enabled, .mw-preferences-messageboxes are replaced with mw.notifications */
-.client-js .mw-preferences-messagebox {
- display: none;
-}
-
.client-nojs #preftoc {
display: none;
}
margin-left: 0;
float: left;
}
-.mw-search-interwiki-header {
+.mw-search-visualclear {
clear: both;
}
.mw-search-results li {
color: #705000;
background-color: #fdf1d1;
}
+
+p.mw-upload-editlicenses {
+ font-size: 90%;
+ text-align: right;
+}
--- /dev/null
+/*!
+ * JavaScript for Special:UserRights
+ */
+( function () {
+ var convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
+ // Replace successbox with notifications
+ convertmessagebox();
+}() );
#mw-editbutton-hr {
.background-image("images/@{button-hr}");
}
-
-// Awful workaround for T113868, while it awaits a better fix.
-#mw-t113868 {
- background-image: url( images/ar/button_bold.png ), url( images/ar/button_headline.png ), url( images/ar/button_italic.png ), url( images/ar/button_link.png ), url( images/ar/button_nowiki.png ), url( images/be-tarask/button_bold.png ), url( images/be-tarask/button_italic.png ), url( images/be-tarask/button_link.png ), url( images/de/button_bold.png ), url( images/de/button_italic.png ), url( images/en/button_bold.png ), url( images/en/button_extlink.png ), url( images/en/button_headline.png ), url( images/en/button_hr.png ), url( images/en/button_image.png ), url( images/en/button_italic.png ), url( images/en/button_link.png ), url( images/en/button_media.png ), url( images/en/button_nowiki.png ), url( images/en/button_sig.png ), url( images/fa/button_bold.png ), url( images/fa/button_headline.png ), url( images/fa/button_italic.png ), url( images/fa/button_link.png ), url( images/fa/button_nowiki.png ), url( images/ksh/button_italic.png ), url( images/ru/button_bold.png ), url( images/ru/button_italic.png ), url( images/ru/button_link.png );
-}
},
// slash, colon (not supported by file systems like NTFS/Windows, Mac OS 9 [:], ext4 [/])
{
- pattern: /[:\/#]/g,
+ pattern: new RegExp( '[' + mw.config.get( 'wgIllegalFileChars', '' ) + ']', 'g' ),
replace: '-',
fileRule: true
},
+++ /dev/null
-/*!
- * CSS for styling HTML-formatted JSON Schema objects
- *
- * @file
- * @author Munaf Assaf <massaf@wikimedia.org>
- */
-
-.mw-json {
- border-collapse: collapse;
- border-spacing: 0;
- font-style: normal;
-}
-
-.mw-json th,
-.mw-json td {
- border: 1px solid #808080;
- font-size: 16px;
- padding: 0.5em 1em;
-}
-
-.mw-json .value,
-.mw-json-single-value {
- background-color: #dcfae3;
- font-family: monospace, monospace;
- white-space: pre-wrap;
-}
-
-.mw-json-single-value {
- background-color: #eee;
-}
-
-.mw-json-empty {
- background-color: #fff;
- font-style: italic;
-}
-
-.mw-json tr {
- margin-bottom: 0.5em;
- background-color: #eee;
-}
-
-.mw-json th {
- background-color: #fff;
- font-weight: normal;
-}
-
-.mw-json caption {
- /* For stylistic reasons, suppress the caption of the outermost table */
- display: none;
-}
-
-.mw-json table caption {
- color: #808080;
- display: inline-block;
- font-size: 10px;
- font-style: italic;
- margin-bottom: 0.5em;
- text-align: left;
-}
--- /dev/null
+/*!
+ * CSS for styling HTML-formatted JSON Schema objects
+ *
+ * @file
+ * @author Munaf Assaf <massaf@wikimedia.org>
+ */
+
+.mw-json {
+ border-collapse: collapse;
+ border-spacing: 0;
+ font-style: normal;
+}
+
+.mw-json th,
+.mw-json td {
+ border: 1px solid #808080;
+ font-size: 16px;
+ padding: 0.5em 1em;
+}
+
+.mw-json .value,
+.mw-json-single-value {
+ background-color: #dcfae3;
+ font-family: monospace, monospace;
+ white-space: pre-wrap;
+}
+
+.mw-json-single-value {
+ background-color: #eee;
+}
+
+.mw-json-empty {
+ background-color: #fff;
+ font-style: italic;
+}
+
+.mw-json tr {
+ margin-bottom: 0.5em;
+ background-color: #eee;
+}
+
+.mw-json th {
+ background-color: #fff;
+ font-weight: normal;
+}
+
+.mw-json caption {
+ /* For stylistic reasons, suppress the caption of the outermost table */
+ display: none;
+}
+
+.mw-json table caption {
+ color: #808080;
+ display: inline-block;
+ font-size: 10px;
+ font-style: italic;
+ margin-bottom: 0.5em;
+ text-align: left;
+}
return this.stop( true, true ).fadeOut();
};
- /**
- * Bind a function to the jQuery object via live(), and also immediately trigger
- * the function on the objects with an 'instant' parameter set to true.
- *
- * @method liveAndTestAtStart
- * @deprecated since 1.24 Use .on() and .each() directly.
- * @param {Function} callback
- * @param {boolean|jQuery.Event} callback.immediate True when the event is called immediately,
- * an event object when triggered from an event.
- * @chainable
- * @return {jQuery}
- */
- mw.log.deprecate( $.fn, 'liveAndTestAtStart', function ( callback ) {
- return this
- // Can't really migrate to .on() generically, needs knowledge of
- // calling code to know the correct selector. Fix callers and
- // get rid of this .liveAndTestAtStart() hack.
- .live( 'change', callback )
- .each( function () {
- callback.call( this, true );
- } );
- } );
-
function enhance( $root ) {
var $matrixTooltips, $autocomplete,
// cache the separator to avoid object creation on each keypress
width: 39%;
}
+/* Flatlist styling for PHP widgets... */
+.mw-htmlform-flatlist .oo-ui-fieldLayout-align-inline,
+/* ...and for JS widgets */
.mw-htmlform-flatlist .oo-ui-optionWidget,
.mw-htmlform-flatlist .oo-ui-multioptionWidget {
display: inline-block;
log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
obj[ key ] = val;
} : function ( obj, key, val, msg ) {
+ /*globals Set */
msg = 'Use of "' + key + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' );
+ var logged, loggedIsSet, uniqueTrace;
+ if ( window.Set ) {
+ logged = new Set();
+ loggedIsSet = true;
+ } else {
+ logged = {};
+ loggedIsSet = false;
+ }
+ uniqueTrace = function () {
+ var trace = new Error().stack;
+ if ( loggedIsSet ) {
+ if ( logged.has( trace ) ) {
+ return false;
+ }
+ logged.add( trace );
+ return true;
+ } else {
+ if ( logged.hasOwnProperty( trace ) ) {
+ return false;
+ }
+ logged[ trace ] = 1;
+ return true;
+ }
+ };
Object.defineProperty( obj, key, {
configurable: true,
enumerable: true,
get: function () {
- mw.track( 'mw.deprecate', key );
- mw.log.warn( msg );
+ if ( uniqueTrace() ) {
+ mw.track( 'mw.deprecate', key );
+ mw.log.warn( msg );
+ }
return val;
},
set: function ( newVal ) {
- mw.track( 'mw.deprecate', key );
- mw.log.warn( msg );
+ if ( uniqueTrace() ) {
+ mw.track( 'mw.deprecate', key );
+ mw.log.warn( msg );
+ }
val = newVal;
}
} );
* The CSS will be appended to an existing ResourceLoader-created `<style>` tag
* or create a new one based on whether the given `cssText` is safe for extension.
*
+ * @private
* @param {string} [cssText=cssBuffer] If called without cssText,
* the internal buffer will be inserted instead.
* @param {Function} [callback]
}
/**
- * @since 1.26
+ * @private
* @param {Array} modules List of module names
* @return {string} Hash of concatenated version hashes.
*/
* size of the startup module. This function changes those dependency lists back to
* arrays of strings.
*
+ * @private
* @param {Array} modules Modules array
*/
function resolveIndexedDependencies( modules ) {
/**
* Batch-request queued dependencies from the server.
+ *
+ * @protected
*/
work: function () {
var reqBase, splits, maxQueryLength, q, b, bSource, bGroup, bSourceGroup,
* The reason css strings are not concatenated anymore is bug 31676. We now check
* whether it's safe to extend the stylesheet.
*
+ * @protected
* @param {Object} [messages] List of key/value pairs to be added to mw#messages.
* @param {Object} [templates] List of key/value pairs to be added to mw#templates.
*/
* OO.compare( [ 1 ], [ 1 ] );
* } );
*
+ * Since MediaWiki 1.23 this also returns a promise.
+ *
+ * Since MediaWiki 1.28 the promise is resolved with a `require` function.
+ *
* @param {string|Array} dependencies Module name or array of modules names the
* callback depends on to be ready before executing
* @param {Function} [ready] Callback to execute when all dependencies are ready
* @param {Function} [error] Callback to execute if one or more dependencies failed
- * @return {jQuery.Promise}
- * @since 1.23 this returns a promise
+ * @return {jQuery.Promise} With a `require` function
*/
using: function ( dependencies, ready, error ) {
var deferred = $.Deferred();
dependencies = resolve( dependencies );
if ( allReady( dependencies ) ) {
// Run ready immediately
- deferred.resolve();
+ deferred.resolve( mw.loader.require );
} else if ( anyFailed( dependencies ) ) {
// Execute error immediately if any dependencies have errors
deferred.reject(
);
} else {
// Not all dependencies are ready: queue up a request
- request( dependencies, deferred.resolve, deferred.reject );
+ request( dependencies, function () {
+ deferred.resolve( mw.loader.require );
+ }, deferred.reject );
}
return deferred.promise();
/**
* Get the exported value of a module.
*
- * Module provide this value via their local `module.exports`.
+ * Modules may provide this via their local `module.exports`.
*
+ * @protected
* @since 1.27
- * @return {Array}
*/
require: function ( moduleName ) {
var state = mw.loader.getState( moduleName );
--- /dev/null
+/**
+ * Usage:
+ *
+ * var convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
+ *
+ * @class mw.plugin.convertmessagebox
+ * @singleton
+ */
+( function ( mw, $ ) {
+ 'use strict';
+
+ /**
+ * Convert a messagebox to a notification.
+ *
+ * Checks if a message box with class `.mw-notify-success`, `.mw-notify-warning`, or `.mw-notify-error`
+ * exists and converts it into a mw.Notification with the text of the element or a given message key.
+ *
+ * By default the notification will automatically hide after 5s, or when the user clicks the element.
+ * This can be overridden by setting attribute `data-mw-autohide="true"`.
+ *
+ * @param {Object} [options] Options
+ * @param {mw.Message} [options.msg] Message key (must be loaded already)
+ */
+ function convertmessagebox( options ) {
+ var $msgBox, type, autoHide, msg, notif,
+ $successBox = $( '.mw-notify-success' ),
+ $warningBox = $( '.mw-notify-warning' ),
+ $errorBox = $( '.mw-notify-error' );
+
+ // If there is a message box and javascript is enabled, use a slick notification instead!
+ if ( $successBox.length ) {
+ $msgBox = $successBox;
+ type = 'info';
+ } else if ( $warningBox.length ) {
+ $msgBox = $warningBox;
+ type = 'warn';
+ } else if ( $errorBox.length ) {
+ $msgBox = $errorBox;
+ type = 'error';
+ } else {
+ return;
+ }
+
+ autoHide = $msgBox.attr( 'data-mw-autohide' ) === 'true';
+
+ // If the msg param is given, use it, otherwise use the text of the successbox
+ msg = options && options.msg || $msgBox.text();
+ $msgBox.detach();
+
+ notif = mw.notification.notify( msg, { autoHide: autoHide, type: type } );
+ if ( !autoHide ) {
+ // 'change' event not reliable!
+ $( document ).one( 'keydown mousedown', function () {
+ if ( notif ) {
+ notif.close();
+ notif = null;
+ }
+ } );
+ }
+ }
+
+ module.exports = convertmessagebox;
+
+}( mediaWiki, jQuery ) );
--- /dev/null
+.client-js {
+ .mw-notify-success,
+ .mw-notify-warning,
+ .mw-notify-error {
+ display: none;
+ }
+}
-.mw-empty-elt,
-.mw-empty-li {
- display: none;
-}
word-wrap: break-word;
}
+.galleryfilename {
+ display: block;
+}
+
+.galleryfilename-truncate {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
/* new gallery stuff */
ul.mw-gallery-nolines li.gallerybox div.thumb {
background-color: transparent;
.mw-gallery-slideshow-img-container a {
display: block;
-}
\ No newline at end of file
+}
--- /dev/null
+.not-patrolled {
+ background-color: #ffa;
+}
+
+.unpatrolled {
+ font-weight: bold;
+ color: #f00;
+}
+
+.patrollink {
+ font-size: 75%;
+ text-align: right;
+}
--- /dev/null
+.patrollink {
+ display: none;
+}
( function ( mw, $ ) {
- // Support: MediaWiki < 1.26
- // Cached HTML will not yet have this from OutputPage::getHeadScripts.
- document.documentElement.className = document.documentElement.className
- .replace( /(^|\s)client-nojs(\s|$)/, '$1client-js$2' );
-
mw.page = {};
$( function () {
'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockSvgHandler.php",
'MockDjVuHandler' => "$testDir/phpunit/mocks/media/MockDjVuHandler.php",
'MockOggHandler' => "$testDir/phpunit/mocks/media/MockOggHandler.php",
+ 'MockMediaHandlerFactory' => "$testDir/phpunit/mocks/media/MockMediaHandlerFactory.php",
'MockWebRequest' => "$testDir/phpunit/mocks/MockWebRequest.php",
'MediaWiki\\Session\\DummySessionBackend'
=> "$testDir/phpunit/mocks/session/DummySessionBackend.php",
*/
private $tidySupport;
+ /**
+ * @var ITestRecorder
+ */
+ private $recorder;
+
private $maxFuzzTestLength = 300;
private $fuzzSeed = 0;
private $memoryLimit = 50;
#
# You can also set the following parser properties via test options:
# wgEnableUploads, wgAllowExternalImages, wgMaxTocLevel,
-# wgLinkHolderBatchSize, wgRawHtml
+# wgLinkHolderBatchSize, wgRawHtml, wgInterwikiMagic
#
# For testing purposes, temporary articles can created:
# !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle
<link rel="mw:PageProp/Language" href="http://zh.wikipedia.org/wiki/Chinese"/>
!! end
+## parsoid html2wt will lose the space variations
!! test
Interlanguage link with spacing
!! options
<link rel="mw:PageProp/Language" href="http://zh.wikipedia.org/wiki/Chinese"/>
!! end
+## parsoid html2wt will lose the space variations
!! test
Interlanguage link variations
!! options
<link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Foo_bar" />
!! end
+## parsoid html2wt will normalize the space to _
!! test
Space and question mark encoding in interlanguage links (T95473)
!! options
<link rel="mw:PageProp/Language" title="Multilingual" href="http://wikisource.org/wiki/Article"/>
!! end
+## PHP parser tests script needs an update
+## Parsoid html2wt will normalize output to [[:zh:Chinese]]
+!! test
+Language links render as inline links if $wgInterwikiMagic=false
+!! options
+wgInterwikiMagic=false
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+Blah blah blah
+[[zh:Chinese]]
+!! html/parsoid
+<p>Blah blah blah <a rel="mw:ExtLink" href="http://zh.wikipedia.org/wiki/Chinese" title="zh:Chinese">zh:Chinese</a></p>
+!! end
+
+## PHP parser tests script needs an update
+## Parsoid html2wt will normalize output to [[:zh:Chinese]]
+!! test
+Language links render as inline links in the Talk namespace
+!! options
+title=Talk:Foo
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+Blah blah blah
+[[zh:Chinese]]
+!! html/parsoid
+<p>Blah blah blah <a rel="mw:ExtLink" href="http://zh.wikipedia.org/wiki/Chinese" title="zh:Chinese">zh:Chinese</a></p>
+!! end
+
!! test
Parsoid-specific test: Wikilinks with should RT properly
!! options
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
<div class="gallerytext">
-<p><a href="/wiki/File:Nonexistent.jpg" title="File:Nonexistent.jpg">Nonexistent.jpg</a><br />
+<p><a href="/wiki/File:Nonexistent.jpg" class="galleryfilename galleryfilename-truncate" title="File:Nonexistent.jpg">Nonexistent.jpg</a>
caption
</p>
</div>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="height: 150px;">Nonexistent.jpg</div>
<div class="gallerytext">
-<p><a href="/wiki/File:Nonexistent.jpg" title="File:Nonexistent.jpg">Nonexistent.jpg</a><br />
+<p><a href="/wiki/File:Nonexistent.jpg" class="galleryfilename galleryfilename-truncate" title="File:Nonexistent.jpg">Nonexistent.jpg</a>
</p>
</div>
</div></li>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
<div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
+<p><a href="/wiki/File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">Foobar.jpg</a>
some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
</p>
</div>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
<div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
+<p><a href="/wiki/File:Foobar.jpg" class="galleryfilename galleryfilename-truncate" title="File:Foobar.jpg">Foobar.jpg</a>
</p>
</div>
</div></li>
</references>
!! end
+!! test
+DOMDiff: Edits to content nested in elements with templated attributes should not be lost (T139388)
+!! options
+parsoid={
+ "modes": ["selser"],
+ "changes": [
+ [ "div:first-child", "text", "bar" ]
+ ]
+}
+!! wikitext
+<div style="{{1x|color:red;}}%">foo</div>
+!! wikitext/edited
+<div style="{{1x|color:red;}}%">bar</div>
+!! end
+
!! test
Empty LI (T49673)
!! wikitext
!! html/php+tidy
<ul>
<li>a</li>
-<li class="mw-empty-li"></li>
-<li class="mw-empty-li"></li>
+<li class="mw-empty-elt"></li>
+<li class="mw-empty-elt"></li>
<li>b</li>
</ul>
!! end
+
+!! test
+Thumbnail output
+!! wikitext
+[[File:Thumb.png|thumb]]
+!! html/php+tidy
+<div class="thumb tright">
+<div class="thumbinner" style="width:137px;"><a href="/wiki/File:Thumb.png" class="image"><img alt="Thumb.png" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>
+<div class="thumbcaption">
+<div class="magnify"><a href="/wiki/File:Thumb.png" class="internal" title="Enlarge"></a></div>
+</div>
+</div>
+</div>
+!! end
// TODO: move global state into MediaWikiServices
RequestContext::resetMain();
- MediaHandler::resetCache();
if ( session_id() !== '' ) {
session_write_close();
session_id( '' );
// TODO: move global state into MediaWikiServices
RequestContext::resetMain();
- MediaHandler::resetCache();
if ( session_id() !== '' ) {
session_write_close();
session_id( '' );
return $buffer;
}
+ /**
+ * Create a temporary hook handler which will be reset by tearDown.
+ * This replaces other handlers for the same hook.
+ * @param string $hookName Hook name
+ * @param mixed $handler Value suitable for a hook handler
+ * @since 1.28
+ */
+ protected function setTemporaryHook( $hookName, $handler ) {
+ $this->mergeMwGlobalArrayValue( 'wgHooks', [ $hookName => [ $handler ] ] );
+ }
+
}
+++ /dev/null
-{{#list}}oh no{{/list}}{{#foo}}none of this should render{{/foo}}
\ No newline at end of file
$exporter->openStream();
$exporter->pageByTitle( $title );
$exporter->closeStream();
- $xmlString = $sink->getOutput();
// This throws error if invalid xml output
- $xmlObject = simplexml_load_string( $xmlString );
+ $xmlObject = simplexml_load_string( $sink );
/**
* Check namespaces match xml
[ 300, 225 ],
[ 800, 600 ],
],
- 'wgMediaHandlers' => [
- 'unknown/unknown' => 'MockBitmapHandler',
- ],
] );
}
* @dataProvider provideThumbParams
*/
public function testIsStandard( $message, $expected, $params ) {
+ $this->setService( 'MediaHandlerFactory', new MockMediaHandlerFactory() );
$this->assertSame(
$expected,
wfThumbIsStandard( new FakeDimensionFile( [ 2000, 1800 ] ), $params ),
'1x.png 1x, 1_5x.png 1.5x, 2x.png 2x',
'pixel depth keys may omit a trailing "x"'
],
+ [
+ [ '1' => 'small.png', '1.5' => 'large.png', '2' => 'large.png' ],
+ 'small.png 1x, large.png 1.5x',
+ 'omit larger duplicates'
+ ],
+ [
+ [ '1' => 'small.png', '2' => 'large.png', '1.5' => 'large.png' ],
+ 'small.png 1x, large.png 1.5x',
+ 'omit larger duplicates in irregular order'
+ ],
];
}
* @covers Linker::getLinkColour
*/
public function testGetLinkColour() {
+ $this->hideDeprecated( 'Linker::getLinkColour' );
$linkCache = MediaWikiServices::getInstance()->getLinkCache();
$foobarTitle = Title::makeTitle( NS_MAIN, 'FooBar' );
$redirectTitle = Title::makeTitle( NS_MAIN, 'Redirect' );
'DBLoadBalancer' => [ 'DBLoadBalancer', 'LoadBalancer' ],
'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
'WatchedItemQueryService' => [ 'WatchedItemQueryService', WatchedItemQueryService::class ],
+ 'MediaHandlerFactory' => [ 'MediaHandlerFactory', MediaHandlerFactory::class ],
'GenderCache' => [ 'GenderCache', GenderCache::class ],
'LinkCache' => [ 'LinkCache', LinkCache::class ],
'LinkRenderer' => [ 'LinkRenderer', LinkRenderer::class ],
<?php
+use MediaWiki\MediaWikiServices;
/**
* @author Addshore
$this->hideDeprecated( 'WatchedItem::addWatch' );
$this->hideDeprecated( 'WatchedItem::removeWatch' );
$this->hideDeprecated( 'WatchedItem::isWatched' );
- $this->hideDeprecated( 'WatchedItem::resetNotificationTimestamp' );
$this->hideDeprecated( 'WatchedItem::duplicateEntries' );
$this->hideDeprecated( 'WatchedItem::batchAddWatch' );
}
WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp()
);
- WatchedItem::fromUserTitle( $user, $title )->resetNotificationTimestamp();
+ MediaWikiServices::getInstance()->getWatchedItemStore()->resetNotificationTimestamp(
+ $user, $title
+ );
$this->assertNull( WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp() );
}
$user = $this->getUser();
$title = Title::newFromText( 'WatchedItemIntegrationTestPage' );
WatchedItem::fromUserTitle( $user, $title )->addWatch();
- WatchedItem::fromUserTitle( $user, $title )->resetNotificationTimestamp();
+ MediaWikiServices::getInstance()->getWatchedItemStore()->resetNotificationTimestamp(
+ $user, $title
+ );
$this->assertEquals(
null,
public function testUpdateNotificationTimestamp_watchersExist() {
$mockDb = $this->getMockDb();
$mockDb->expects( $this->once() )
- ->method( 'select' )
+ ->method( 'selectFieldValues' )
->with(
- [ 'watchlist' ],
- [ 'wl_user' ],
+ 'watchlist',
+ 'wl_user',
[
'wl_user != 1',
'wl_namespace' => 0,
'wl_notificationtimestamp IS NULL'
]
)
- ->will(
- $this->returnValue( [
- $this->getFakeRow( [ 'wl_user' => '2' ] ),
- $this->getFakeRow( [ 'wl_user' => '3' ] )
- ] )
- );
- $mockDb->expects( $this->once() )
- ->method( 'onTransactionIdle' )
- ->with( $this->isType( 'callable' ) )
- ->will( $this->returnCallback( function( $callable ) {
- $callable();
- } ) );
+ ->will( $this->returnValue( [ '2', '3' ] ) );
$mockDb->expects( $this->once() )
->method( 'update' )
->with(
public function testUpdateNotificationTimestamp_noWatchers() {
$mockDb = $this->getMockDb();
$mockDb->expects( $this->once() )
- ->method( 'select' )
+ ->method( 'selectFieldValues' )
->with(
- [ 'watchlist' ],
- [ 'wl_user' ],
+ 'watchlist',
+ 'wl_user',
[
'wl_user != 1',
'wl_namespace' => 0,
->will(
$this->returnValue( [] )
);
- $mockDb->expects( $this->never() )
- ->method( 'onTransactionIdle' );
$mockDb->expects( $this->never() )
->method( 'update' );
$this->getFakeRow( [ 'wl_notificationtimestamp' => '20151212010101' ] )
) );
$mockDb->expects( $this->once() )
- ->method( 'select' )
+ ->method( 'selectFieldValues' )
->will(
- $this->returnValue( [
- $this->getFakeRow( [ 'wl_user' => '2' ] ),
- $this->getFakeRow( [ 'wl_user' => '3' ] )
- ] )
+ $this->returnValue( [ '2', '3' ] )
);
- $mockDb->expects( $this->once() )
- ->method( 'onTransactionIdle' )
- ->with( $this->isType( 'callable' ) )
- ->will( $this->returnCallback( function( $callable ) {
- $callable();
- } ) );
$mockDb->expects( $this->once() )
->method( 'update' );
$this->assertEquals( $timestamp, $item->getNotificationTimestamp() );
}
- /**
- * @dataProvider provideUserTitleTimestamp
- */
- public function testResetNotificationTimestamp( $user, $linkTarget, $timestamp ) {
- $force = 'XXX';
- $oldid = 999;
-
- $store = $this->getMockWatchedItemStore();
- $store->expects( $this->once() )
- ->method( 'resetNotificationTimestamp' )
- ->with( $user, $this->isInstanceOf( Title::class ), $force, $oldid )
- ->will( $this->returnCallback(
- function ( $user, Title $title, $force, $oldid ) use ( $linkTarget ) {
- /** @var LinkTarget $linkTarget */
- $this->assertInstanceOf( 'Title', $title );
- $this->assertSame( $linkTarget->getDBkey(), $title->getDBkey() );
- $this->assertSame( $linkTarget->getFragment(), $title->getFragment() );
- $this->assertSame( $linkTarget->getNamespace(), $title->getNamespace() );
- $this->assertSame( $linkTarget->getText(), $title->getText() );
-
- return true;
- }
- ) );
- $this->setService( 'WatchedItemStore', $store );
-
- $item = new WatchedItem( $user, $linkTarget, $timestamp );
- $item->resetNotificationTimestamp( $force, $oldid );
- }
-
public function testAddWatch() {
$title = Title::newFromText( 'SomeTitle' );
$timestamp = null;
WatchedItem::duplicateEntries( $oldTitle, $newTitle );
}
- public function testBatchAddWatch() {
- $itemOne = new WatchedItem( $this->getMockUser( 1 ), new TitleValue( 0, 'Title1' ), null );
- $itemTwo = new WatchedItem(
- $this->getMockUser( 3 ),
- Title::newFromText( 'Title2' ),
- '20150101010101'
- );
-
- $store = $this->getMockWatchedItemStore();
- $store->expects( $this->exactly( 2 ) )
- ->method( 'addWatchBatchForUser' );
- $store->expects( $this->at( 0 ) )
- ->method( 'addWatchBatchForUser' )
- ->with(
- $itemOne->getUser(),
- [
- $itemOne->getTitle()->getSubjectPage(),
- $itemOne->getTitle()->getTalkPage(),
- ]
- );
- $store->expects( $this->at( 1 ) )
- ->method( 'addWatchBatchForUser' )
- ->with(
- $itemTwo->getUser(),
- [
- $itemTwo->getTitle()->getSubjectPage(),
- $itemTwo->getTitle()->getTalkPage(),
- ]
- );
- $this->setService( 'WatchedItemStore', $store );
-
- WatchedItem::batchAddWatch( [ $itemOne, $itemTwo ] );
- }
-
}
'wgServer' => [
'enwiki' => 'http://en.example.org',
'ruwiki' => '//ru.example.org',
+ 'nopathwiki' => '//nopath.example.org',
],
'wgArticlePath' => [
'enwiki' => '/w/$1',
'nlwiki (sites)' => [ $nlwiki, 'nlwiki', false ],
'enwiktionary (sites)' => [ $enwiktionary, 'enwiktionary', false ],
'non MediaWiki site' => [ null, 'spam', false ],
+ 'boguswiki' => [ null, 'boguswiki' ],
+ 'nopathwiki' => [ null, 'nopathwiki' ],
];
}
* Test result of attempted login with an empty username
*/
public function testApiLoginNoName() {
- global $wgDisableAuthManager;
-
$session = [
'wsTokenSecrets' => [ 'login' => 'foobar' ],
];
'lgname' => '', 'lgpassword' => self::$users['sysop']->getPassword(),
'lgtoken' => (string)( new MediaWiki\Session\Token( 'foobar', '' ) )
], $session );
- $this->assertEquals( $wgDisableAuthManager ? 'NoName' : 'Failed', $data[0]['login']['result'] );
+ $this->assertEquals( 'Failed', $data[0]['login']['result'] );
}
public function testApiLoginBadPass() {
- global $wgServer, $wgDisableAuthManager;
+ global $wgServer;
$user = self::$users['sysop'];
$userName = $user->getUser()->getName();
$this->assertNotInternalType( "bool", $result );
$a = $result["login"]["result"];
- $this->assertEquals( $wgDisableAuthManager ? 'WrongPass' : 'Failed', $a );
+ $this->assertEquals( 'Failed', $a );
}
public function testApiLoginGoodPass() {
--- /dev/null
+<?php
+
+use MediaWiki\MediaWikiServices;
+
+class ApiOpenSearchTest extends MediaWikiTestCase {
+ public function testGetAllowedParams() {
+ $config = $this->replaceSearchEngineConfig();
+ $config->expects( $this->any() )
+ ->method( 'getSearchTypes' )
+ ->will( $this->returnValue( [ 'the one ring' ] ) );
+
+ $engine = $this->replaceSearchEngine();
+ $engine->expects( $this->any() )
+ ->method( 'getProfiles' )
+ ->will( $this->returnValueMap( [
+ [ SearchEngine::COMPLETION_PROFILE_TYPE, [
+ [
+ 'name' => 'normal',
+ 'desc-message' => 'normal-message',
+ 'default' => true,
+ ],
+ [
+ 'name' => 'strict',
+ 'desc-message' => 'strict-message',
+ ],
+ ] ],
+ ] ) );
+
+ $api = $this->createApi();
+ $params = $api->getAllowedParams();
+
+ $this->assertArrayNotHasKey( 'offset', $params );
+ $this->assertArrayHasKey( 'profile', $params, print_r( $params, true ) );
+ $this->assertEquals( 'normal', $params['profile'][ApiBase::PARAM_DFLT] );
+ }
+
+ private function replaceSearchEngineConfig() {
+ $config = $this->getMockBuilder( 'SearchEngineConfig' )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->setService( 'SearchEngineConfig', $config );
+
+ return $config;
+ }
+
+ private function replaceSearchEngine() {
+ $engine = $this->getMockBuilder( 'SearchEngine' )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $engineFactory = $this->getMockBuilder( 'SearchEngineFactory' )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $engineFactory->expects( $this->any() )
+ ->method( 'create' )
+ ->will( $this->returnValue( $engine ) );
+ $this->setService( 'SearchEngineFactory', $engineFactory );
+
+ return $engine;
+ }
+
+ private function createApi() {
+ $ctx = new RequestContext();
+ $apiMain = new ApiMain( $ctx );
+ return new ApiOpenSearch( $apiMain, 'opensearch', '' );
+ }
+}
protected $apiContext;
protected function setUp() {
- global $wgServer, $wgDisableAuthManager;
+ global $wgServer;
parent::setUp();
self::$apiUrl = $wgServer . wfScript( 'api' );
];
$this->setMwGlobals( [
- 'wgAuth' => $wgDisableAuthManager ? new AuthPlugin : new MediaWiki\Auth\AuthManagerAuthPlugin,
+ 'wgAuth' => new MediaWiki\Auth\AuthManagerAuthPlugin,
'wgRequest' => new FauxRequest( [] ),
'wgUser' => self::$users['sysop']->getUser(),
] );
* @covers MediaWiki\Auth\AbstractAuthenticationProvider
*/
class AbstractAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testAbstractAuthenticationProvider() {
$provider = $this->getMockForAbstractClass( AbstractAuthenticationProvider::class );
$providerPriv = \TestingAccessWrapper::newFromObject( $provider );
* @covers MediaWiki\Auth\AbstractPasswordPrimaryAuthenticationProvider
*/
class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testConstructor() {
$provider = $this->getMockForAbstractClass(
AbstractPasswordPrimaryAuthenticationProvider::class
* @covers MediaWiki\Auth\AbstractPreAuthenticationProvider
*/
class AbstractPreAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testAbstractPreAuthenticationProvider() {
$user = \User::newFromName( 'UTSysop' );
* @covers MediaWiki\Auth\AbstractPrimaryAuthenticationProvider
*/
class AbstractPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testAbstractPrimaryAuthenticationProvider() {
$user = \User::newFromName( 'UTSysop' );
* @covers MediaWiki\Auth\AbstractSecondaryAuthenticationProvider
*/
class AbstractSecondaryAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testAbstractSecondaryAuthenticationProvider() {
$user = \User::newFromName( 'UTSysop' );
protected $managerPriv;
protected function setUp() {
- global $wgDisableAuthManager;
-
parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
$this->setMwGlobals( [ 'wgAuth' => null ] );
$this->stashMwGlobals( [ 'wgHooks' ] );
\RequestContext::getMain()->getConfig(),
\TestingAccessWrapper::newFromObject( $singleton )->config
);
-
- $this->setMwGlobals( [ 'wgDisableAuthManager' => true ] );
- try {
- AuthManager::singleton();
- $this->fail( 'Expected exception not thrown' );
- } catch ( \BadMethodCallException $ex ) {
- $this->assertSame( '$wgDisableAuthManager is set', $ex->getMessage() );
- }
}
public function testCanAuthenticateNow() {
* @covers MediaWiki\Auth\AuthPluginPrimaryAuthenticationProvider
*/
class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testConstruction() {
$plugin = new AuthManagerAuthPlugin();
try {
* @covers MediaWiki\Auth\AuthenticationRequest
*/
class AuthenticationRequestTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testBasics() {
$mock = $this->getMockForAbstractClass( AuthenticationRequest::class );
* @group AuthManager
*/
abstract class AuthenticationRequestTestCase extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
abstract protected function getInstance( array $args = [] );
/**
* @covers MediaWiki\Auth\AuthenticationResponse
*/
class AuthenticationResponseTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
/**
* @dataProvider provideConstructors
* @param string $constructor
* @covers MediaWiki\Auth\CheckBlocksSecondaryAuthenticationProvider
*/
class CheckBlocksSecondaryAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testConstructor() {
$provider = new CheckBlocksSecondaryAuthenticationProvider();
$providerPriv = \TestingAccessWrapper::newFromObject( $provider );
* @covers MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider
*/
class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
/**
* @dataProvider provideGetAuthenticationRequests
* @param string $action
* @covers MediaWiki\Auth\LegacyHookPreAuthenticationProvider
*/
class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
/**
* Get an instance of the provider
* @return LegacyHookPreAuthenticationProvider
private $config = null;
private $validity = null;
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
/**
* Get an instance of the provider
*
* @covers MediaWiki\Auth\ResetPasswordSecondaryAuthenticationProvider
*/
class ResetPasswordSecondaryAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
/**
* @dataProvider provideGetAuthenticationRequests
* @param string $action
private $config = null;
private $validity = null;
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
/**
* Get an instance of the provider
*
* @covers MediaWiki\Auth\ThrottlePreAuthenticationProvider
*/
class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testConstructor() {
$provider = new ThrottlePreAuthenticationProvider();
$providerPriv = \TestingAccessWrapper::newFromObject( $provider );
* @covers MediaWiki\Auth\Throttler
*/
class ThrottlerTest extends \MediaWikiTestCase {
- protected function setUp() {
- global $wgDisableAuthManager;
-
- parent::setUp();
- if ( $wgDisableAuthManager ) {
- $this->markTestSkipped( '$wgDisableAuthManager is set' );
- }
- }
-
public function testConstructor() {
$cache = new \HashBagOStuff();
$logger = $this->getMockBuilder( AbstractLogger::class )
'wgArticlePath' => '/wiki/$1'
] );
- $this->linkRenderer = new LinkRenderer(
- MediaWikiServices::getInstance()->getTitleFormatter()
- );
+ $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
}
public function testNewFromRecentChange() {
$rcCacheFactory = new RCCacheEntryFactory(
new RequestContext(),
[ 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' ],
- new LinkRenderer(
- MediaWikiServices::getInstance()->getTitleFormatter()
- )
+ MediaWikiServices::getInstance()->getLinkRenderer()
);
return $rcCacheFactory->newFromRecentChange( $recentChange, false );
}
/**
* @group ContentHandler
+ * @group Database
*/
class ContentHandlerTest extends MediaWikiTestCase {
parent::tearDown();
}
+ public function addDBDataOnce() {
+ $this->insertPage( 'Not_Main_Page', 'This is not a main page' );
+ $this->insertPage( 'Smithee', 'A smithee is one who smiths. See also [[Alan Smithee]]' );
+ }
+
public static function dataGetDefaultModelFor() {
return [
[ 'Help:Foo', CONTENT_MODEL_WIKITEXT ],
$this->assertInstanceOf( $handlerClass, $handler );
}
+ /**
+ * @covers ContentHandler::getDataForSearchIndex
+ */
+ public function testDataIndexFields() {
+ $mockEngine = $this->getMock( 'SearchEngine' );
+ $title = Title::newFromText( 'Not_Main_Page', NS_MAIN );
+ $page = new WikiPage( $title );
+
+ $this->setTemporaryHook( 'SearchDataForIndex',
+ function ( &$fields, ContentHandler $handler, WikiPage $page, ParserOutput $output,
+ SearchEngine $engine ) {
+ $fields['testDataField'] = 'test content';
+ } );
+
+ $output = $page->getContent()->getParserOutput( $title );
+ $data = $page->getContentHandler()->getDataForSearchIndex( $page, $output, $mockEngine );
+ $this->assertArrayHasKey( 'text', $data );
+ $this->assertArrayHasKey( 'text_bytes', $data );
+ $this->assertArrayHasKey( 'language', $data );
+ $this->assertArrayHasKey( 'testDataField', $data );
+ $this->assertEquals( 'test content', $data['testDataField'] );
+ }
+
+ /**
+ * @covers ContentHandler::getParserOutputForIndexing
+ */
+ public function testParserOutputForIndexing() {
+ $title = Title::newFromText( 'Smithee', NS_MAIN );
+ $page = new WikiPage( $title );
+
+ $out = $page->getContentHandler()->getParserOutputForIndexing( $page );
+ $this->assertInstanceOf( ParserOutput::class, $out );
+ $this->assertContains( 'one who smiths', $out->getRawText() );
+ }
+
}
$this->assertEquals( 'test', $mappedFields['language']['testData'] );
$this->assertEquals( 'language', $mappedFields['language']['name'] );
}
-
}
) {
}
*/
+
+ public function testDataIndexFieldsFile() {
+ $mockEngine = $this->getMock( 'SearchEngine' );
+ $title = Title::newFromText( 'Somefile.jpg', NS_FILE );
+ $page = new WikiPage( $title );
+
+ $handler = $this->getMockBuilder( WikitextContentHandler::class )
+ ->disableOriginalConstructor()
+ ->setMethods( [ 'getFileText' ] )
+ ->getMock();
+ $handler->method( 'getFileText' )->will( $this->returnValue( 'This is file content' ) );
+
+ $data = $handler->getDataForSearchIndex( $page, new ParserOutput(), $mockEngine );
+ $this->assertArrayHasKey( 'file_text', $data );
+ $this->assertEquals( 'This is file content', $data['file_text'] );
+ }
}
--- /dev/null
+<?php
+
+class WikitextStructureTest extends MediaWikiLangTestCase {
+
+ private function getMockTitle() {
+ return Title::newFromText( "TestTitle" );
+ }
+
+ /**
+ * Get parser output for Wiki text
+ * @param $text
+ * @return ParserOutput
+ */
+ private function getParserOutput( $text ) {
+ $content = new WikitextContent( $text );
+ return $content->getParserOutput( $this->getMockTitle() );
+ }
+
+ /**
+ * Get WikitextStructure for given text
+ * @param $text
+ * @return WikiTextStructure
+ */
+ private function getStructure( $text ) {
+ return new WikiTextStructure( $this->getParserOutput( $text ) );
+ }
+
+ public function testCategories() {
+ $text = <<<END
+We also have a {{Template}} and an {{Another template}} in addition.
+This text also has [[Category:Some Category| ]] and then [[Category:Yet another category]].
+And [[Category:Some Category| this category]] is repeated.
+END;
+ $struct = $this->getStructure( $text );
+ $cats = $struct->categories();
+ $this->assertCount( 2, $cats );
+ $this->assertContains( "Some Category", $cats );
+ $this->assertContains( "Yet another category", $cats );
+ }
+
+ public function testOutgoingLinks() {
+ $text = <<<END
+Here I add link to [[Some Page]]. And [[Some Page|This same page]] gets linked twice.
+We also have [[File:Image.jpg|image]].
+We also have a {{Template}} and an {{Another template}} in addition.
+Some templates are {{lowercase}}.
+And [[Some_Page]] is linked again.
+It also has [[Category:Some Category| ]] and then [[Category:Yet another category]].
+Also link to a [[Talk:TestTitle|talk page]] is here.
+END;
+ $struct = $this->getStructure( $text );
+ $links = $struct->outgoingLinks();
+ $this->assertContains( "Some_Page", $links );
+ $this->assertContains( "Template:Template", $links );
+ $this->assertContains( "Template:Another_template", $links );
+ $this->assertContains( "Template:Lowercase", $links );
+ $this->assertContains( "Talk:TestTitle", $links );
+ $this->assertCount( 5, $links );
+ }
+
+ public function testTemplates() {
+ $text = <<<END
+We have a {{Template}} and an {{Another template}} in addition.
+Some templates are {{lowercase}}. And this {{Template}} is repeated.
+Here is {{another_template|with=argument}}.
+This is a template that {{Xdoes not exist}}.
+END;
+ $this->setTemporaryHook( 'TitleExists', function ( Title $title, &$exists ) {
+ $txt = $title->getBaseText();
+ if ( $txt[0] != 'X' ) {
+ $exists = true;
+ }
+ return true;
+ } );
+ $struct = $this->getStructure( $text );
+ $templates = $struct->templates();
+ $this->assertCount( 3, $templates );
+ $this->assertContains( "Template:Template", $templates );
+ $this->assertContains( "Template:Another template", $templates );
+ $this->assertContains( "Template:Lowercase", $templates );
+ }
+
+ public function testHeadings() {
+ $text = <<<END
+Some text here
+== Heading one ==
+Some text
+==== heading two ====
+More text
+=== Applicability of the strict mass-energy equivalence formula, ''E'' = ''mc''<sup>2</sup> ===
+and more text
+== Wikitext '''in''' [[Heading]] and also <b>html</b> ==
+more text
+==== See also ====
+* Also things to see!
+END;
+ $struct = $this->getStructure( $text );
+ $headings = $struct->headings();
+ $this->assertCount( 4, $headings );
+ $this->assertContains( "Heading one", $headings );
+ $this->assertContains( "heading two", $headings );
+ $this->assertContains( "Applicability of the strict mass-energy equivalence formula, E = mc2",
+ $headings );
+ $this->assertContains( "Wikitext in Heading and also html", $headings );
+ }
+
+ public function testHeadingsFirst() {
+ $text = <<<END
+== Heading one ==
+Some text
+==== heading two ====
+END;
+ $struct = $this->getStructure( $text );
+ $headings = $struct->headings();
+ $this->assertCount( 2, $headings );
+ $this->assertContains( "Heading one", $headings );
+ $this->assertContains( "heading two", $headings );
+ }
+
+ public function testHeadingsNone() {
+ $text = "This text is completely devoid of headings.";
+ $struct = $this->getStructure( $text );
+ $headings = $struct->headings();
+ $this->assertArrayEquals( [], $headings );
+ }
+
+ public function testTexts() {
+ $text = <<<END
+Opening text is opening.
+== Then comes header ==
+Then we got more<br>text
+=== And more headers ===
+{| class="wikitable"
+|-
+! Header table
+|-
+| row in table
+|-
+| another row in table
+|}
+END;
+ $struct = $this->getStructure( $text );
+ $this->assertEquals( "Opening text is opening.", $struct->getOpeningText() );
+ $this->assertEquals( "Opening text is opening. Then we got more text",
+ $struct->getMainText() );
+ $this->assertEquals( [ "Header table row in table another row in table" ],
+ $struct->getAuxiliaryText() );
+ }
+}
/**
* @dataProvider provideComparePositions
*/
- function testHasReached( MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos ) {
- $this->assertTrue( $higherPos->hasReached( $lowerPos ) );
- $this->assertTrue( $higherPos->hasReached( $higherPos ) );
- $this->assertTrue( $lowerPos->hasReached( $lowerPos ) );
- $this->assertFalse( $lowerPos->hasReached( $higherPos ) );
+ function testHasReached( MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos, $match ) {
+ if ( $match ) {
+ $this->assertTrue( $lowerPos->channelsMatch( $higherPos ) );
+
+ $this->assertTrue( $higherPos->hasReached( $lowerPos ) );
+ $this->assertTrue( $higherPos->hasReached( $higherPos ) );
+ $this->assertTrue( $lowerPos->hasReached( $lowerPos ) );
+ $this->assertFalse( $lowerPos->hasReached( $higherPos ) );
+ } else { // channels don't match
+ $this->assertFalse( $lowerPos->channelsMatch( $higherPos ) );
+
+ $this->assertFalse( $higherPos->hasReached( $lowerPos ) );
+ $this->assertFalse( $lowerPos->hasReached( $higherPos ) );
+ }
}
function provideComparePositions() {
return [
+ // Binlog style
[
new MySQLMasterPos( 'db1034-bin.000976', '843431247' ),
- new MySQLMasterPos( 'db1034-bin.000976', '843431248' )
+ new MySQLMasterPos( 'db1034-bin.000976', '843431248' ),
+ true
],
[
new MySQLMasterPos( 'db1034-bin.000976', '999' ),
- new MySQLMasterPos( 'db1034-bin.000976', '1000' )
+ new MySQLMasterPos( 'db1034-bin.000976', '1000' ),
+ true
],
[
new MySQLMasterPos( 'db1034-bin.000976', '999' ),
- new MySQLMasterPos( 'db1035-bin.000976', '1000' )
+ new MySQLMasterPos( 'db1035-bin.000976', '1000' ),
+ false
+ ],
+ // MySQL GTID style
+ [
+ new MySQLMasterPos( 'db1-bin.2', '1', '3E11FA47-71CA-11E1-9E33-C80AA9429562:23' ),
+ new MySQLMasterPos( 'db1-bin.2', '2', '3E11FA47-71CA-11E1-9E33-C80AA9429562:24' ),
+ true
+ ],
+ [
+ new MySQLMasterPos( 'db1-bin.2', '1', '3E11FA47-71CA-11E1-9E33-C80AA9429562:99' ),
+ new MySQLMasterPos( 'db1-bin.2', '2', '3E11FA47-71CA-11E1-9E33-C80AA9429562:100' ),
+ true
+ ],
+ [
+ new MySQLMasterPos( 'db1-bin.2', '1', '3E11FA47-71CA-11E1-9E33-C80AA9429562:99' ),
+ new MySQLMasterPos( 'db1-bin.2', '2', '1E11FA47-71CA-11E1-9E33-C80AA9429562:100' ),
+ false
+ ],
+ // MariaDB GTID style
+ [
+ new MySQLMasterPos( 'db1-bin.2', '1', '255-11-23' ),
+ new MySQLMasterPos( 'db1-bin.2', '2', '255-11-24' ),
+ true
+ ],
+ [
+ new MySQLMasterPos( 'db1-bin.2', '1', '255-11-99' ),
+ new MySQLMasterPos( 'db1-bin.2', '2', '255-11-100' ),
+ true
+ ],
+ [
+ new MySQLMasterPos( 'db1-bin.2', '1', '255-11-999' ),
+ new MySQLMasterPos( 'db1-bin.2', '2', '254-11-1000' ),
+ false
],
];
}
$this->tearDownFiles();
$this->doTestStreamFile( $path, $content, $alreadyExists );
$this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestStreamFile( $path, $content, $alreadyExists );
+ $this->tearDownFiles();
}
private function doTestStreamFile( $path, $content ) {
$backendName = $this->backendClass();
- // Test doStreamFile() directly to avoid header madness
- $class = new ReflectionClass( $this->backend );
- $method = $class->getMethod( 'doStreamFile' );
- $method->setAccessible( true );
-
if ( $content !== null ) {
$this->prepare( [ 'dir' => dirname( $path ) ] );
$status = $this->create( [ 'dst' => $path, 'content' => $content ] );
"Creation of file at $path succeeded ($backendName)." );
ob_start();
- $method->invokeArgs( $this->backend, [ [ 'src' => $path ] ] );
+ $this->backend->streamFile( [ 'src' => $path, 'headless' => 1, 'allowOB' => 1 ] );
$data = ob_get_contents();
ob_end_clean();
$this->assertEquals( $content, $data, "Correct content streamed from '$path'" );
} else { // 404 case
ob_start();
- $method->invokeArgs( $this->backend, [ [ 'src' => $path ] ] );
+ $this->backend->streamFile( [ 'src' => $path, 'headless' => 1, 'allowOB' => 1 ] );
$data = ob_get_contents();
ob_end_clean();
- $this->assertEquals( '', $data, "Correct content streamed from '$path' ($backendName)" );
+ $this->assertRegExp( '#<h1>File not found</h1>#', $data,
+ "Correct content streamed from '$path' ($backendName)" );
}
}
return $cases;
}
+ public function testStreamFileRange() {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestStreamFileRange();
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestStreamFileRange();
+ $this->tearDownFiles();
+ }
+
+ private function doTestStreamFileRange() {
+ $backendName = $this->backendClass();
+
+ $base = self::baseStorePath();
+ $path = "$base/unittest-cont1/e/b/z/range_file.txt";
+ $content = "0123456789ABCDEF";
+
+ $this->prepare( [ 'dir' => dirname( $path ) ] );
+ $status = $this->create( [ 'dst' => $path, 'content' => $content ] );
+ $this->assertGoodStatus( $status,
+ "Creation of file at $path succeeded ($backendName)." );
+
+ static $ranges = [
+ 'bytes=0-0' => '0',
+ 'bytes=0-3' => '0123',
+ 'bytes=4-8' => '45678',
+ 'bytes=15-15' => 'F',
+ 'bytes=14-15' => 'EF',
+ 'bytes=-5' => 'BCDEF',
+ 'bytes=-1' => 'F',
+ 'bytes=10-16' => 'ABCDEF',
+ 'bytes=10-99' => 'ABCDEF',
+ ];
+
+ foreach ( $ranges as $range => $chunk ) {
+ ob_start();
+ $this->backend->streamFile( [ 'src' => $path, 'headless' => 1, 'allowOB' => 1,
+ 'options' => [ 'range' => $range ] ] );
+ $data = ob_get_contents();
+ ob_end_clean();
+
+ $this->assertEquals( $chunk, $data, "Correct chunk streamed from '$path' for '$range'" );
+ }
+ }
+
/**
* @dataProvider provider_testGetFileContents
* @covers FileBackend::getFileContents
$this->assertFalse( $testXML->wellFormed );
}
+ /**
+ * Verify we check for recursive entity DOS
+ *
+ * (If the DOS isn't properly handled, the test runner will probably go OOM...)
+ */
+ public function testRecursiveEntity() {
+ $xml = <<<'XML'
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE foo [
+ <!ENTITY test "&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;">
+ <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
+ <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
+ <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
+ <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
+ <!ENTITY e "&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;">
+ <!ENTITY f "&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;">
+ <!ENTITY g "-00000000000000000000000000000000000000000000000000000000000000000000000-">
+]>
+<foo>
+<bar>&test;</bar>
+</foo>
+XML;
+ $check = XmlTypeCheck::newFromString( $xml );
+ $this->assertFalse( $check->wellFormed );
+ }
+
/**
* @covers XMLTypeCheck::processingInstructionHandler
*/
$checkKeys = [ wfRandomString() ]; // new check keys => force misses
$ret = $cache->getWithSetCallback( $key, 30, $func,
[ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] );
- $this->assertEquals( $value, $ret );
+ $this->assertEquals( $value, $ret, 'Old value used' );
$this->assertEquals( 1, $calls, 'Callback was not used' );
$cache->delete( $key );
$ret = $cache->getWithSetCallback( $key, 30, $func,
- [ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] ); // should use interim value
- $this->assertEquals( $value, $ret );
- $this->assertEquals( 2, $calls, 'Callback was used' );
+ [ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] );
+ $this->assertEquals( $value, $ret, 'Callback was used; interim saved' );
+ $this->assertEquals( 2, $calls, 'Callback was used; interim saved' );
$ret = $cache->getWithSetCallback( $key, 30, $func,
[ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] );
- $this->assertEquals( $value, $ret );
+ $this->assertEquals( $value, $ret, 'Callback was not used; used interim' );
$this->assertEquals( 2, $calls, 'Callback was not used; used interim' );
}
$this->assertEquals( 1, $calls, 'Callback was not used' );
}
+ /**
+ * @covers WANObjectCache::getWithSetCallback()
+ * @covers WANObjectCache::doGetWithSetCallback()
+ */
+ public function testBusyValue() {
+ $cache = $this->cache;
+ $key = wfRandomString();
+ $value = wfRandomString();
+ $busyValue = wfRandomString();
+
+ $calls = 0;
+ $func = function() use ( &$calls, $value ) {
+ ++$calls;
+ return $value;
+ };
+
+ $ret = $cache->getWithSetCallback( $key, 30, $func, [ 'busyValue' => $busyValue ] );
+ $this->assertEquals( $value, $ret );
+ $this->assertEquals( 1, $calls, 'Value was populated' );
+
+ // Acquire a lock to verify that getWithSetCallback uses busyValue properly
+ $this->internalCache->lock( $key, 0 );
+
+ $checkKeys = [ wfRandomString() ]; // new check keys => force misses
+ $ret = $cache->getWithSetCallback( $key, 30, $func,
+ [ 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+ $this->assertEquals( $value, $ret, 'Callback used' );
+ $this->assertEquals( 2, $calls, 'Callback used' );
+
+ $ret = $cache->getWithSetCallback( $key, 30, $func,
+ [ 'lockTSE' => 30, 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+ $this->assertEquals( $value, $ret, 'Old value used' );
+ $this->assertEquals( 2, $calls, 'Callback was not used' );
+
+ $cache->delete( $key ); // no value at all anymore and still locked
+ $ret = $cache->getWithSetCallback( $key, 30, $func,
+ [ 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+ $this->assertEquals( $busyValue, $ret, 'Callback was not used; used busy value' );
+ $this->assertEquals( 2, $calls, 'Callback was not used; used busy value' );
+
+ $this->internalCache->unlock( $key );
+ $ret = $cache->getWithSetCallback( $key, 30, $func,
+ [ 'lockTSE' => 30, 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+ $this->assertEquals( $value, $ret, 'Callback was used; saved interim' );
+ $this->assertEquals( 3, $calls, 'Callback was used; saved interim' );
+
+ $this->internalCache->lock( $key, 0 );
+ $ret = $cache->getWithSetCallback( $key, 30, $func,
+ [ 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
+ $this->assertEquals( $value, $ret, 'Callback was not used; used interim' );
+ $this->assertEquals( 3, $calls, 'Callback was not used; used interim' );
+ }
+
/**
* @covers WANObjectCache::getMulti()
*/
*/
private $titleFormatter;
+ /**
+ * @var LinkCache
+ */
+ private $linkCache;
+
public function setUp() {
parent::setUp();
$this->titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+ $this->linkCache = MediaWikiServices::getInstance()->getLinkCache();
}
public static function provideCreateFromLegacyOptions() {
* @dataProvider provideCreateFromLegacyOptions
*/
public function testCreateFromLegacyOptions( $options, $func, $val ) {
- $factory = new LinkRendererFactory( $this->titleFormatter );
+ $factory = new LinkRendererFactory( $this->titleFormatter, $this->linkCache );
$linkRenderer = $factory->createFromLegacyOptions(
$options
);
}
public function testCreate() {
- $factory = new LinkRendererFactory( $this->titleFormatter );
+ $factory = new LinkRendererFactory( $this->titleFormatter, $this->linkCache );
$this->assertInstanceOf( LinkRenderer::class, $factory->create() );
}
public function testCreateForUser() {
+ /** @var PHPUnit_Framework_MockObject_MockObject|User $user */
$user = $this->getMock( User::class, [ 'getStubThreshold' ] );
$user->expects( $this->once() )
->method( 'getStubThreshold' )
->willReturn( 15 );
- $factory = new LinkRendererFactory( $this->titleFormatter );
+ $factory = new LinkRendererFactory( $this->titleFormatter, $this->linkCache );
$linkRenderer = $factory->createForUser( $user );
$this->assertInstanceOf( LinkRenderer::class, $linkRenderer );
$this->assertEquals( 15, $linkRenderer->getStubThreshold() );
<?php
use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
use MediaWiki\MediaWikiServices;
/**
class LinkRendererTest extends MediaWikiLangTestCase {
/**
- * @var TitleFormatter
+ * @var LinkRendererFactory
*/
- private $titleFormatter;
+ private $factory;
public function setUp() {
parent::setUp();
'wgScriptPath' => '/w',
'wgScript' => '/w/index.php',
] );
- $this->titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+ $this->factory = MediaWikiServices::getInstance()->getLinkRendererFactory();
+
}
public function testMergeAttribs() {
$target = new TitleValue( NS_SPECIAL, 'Blankpage' );
- $linkRenderer = new LinkRenderer( $this->titleFormatter );
+ $linkRenderer = $this->factory->create();
$link = $linkRenderer->makeBrokenLink( $target, null, [
// Appended to class
'class' => 'foobar',
public function testMakeKnownLink() {
$target = new TitleValue( NS_MAIN, 'Foobar' );
- $linkRenderer = new LinkRenderer( $this->titleFormatter );
+ $linkRenderer = $this->factory->create();
// Query added
$this->assertEquals(
public function testMakeBrokenLink() {
$target = new TitleValue( NS_MAIN, 'Foobar' );
$special = new TitleValue( NS_SPECIAL, 'Foobar' );
- $linkRenderer = new LinkRenderer( $this->titleFormatter );
+ $linkRenderer = $this->factory->create();
// action=edit&redlink=1 added
$this->assertEquals(
}
public function testMakeLink() {
- $linkRenderer = new LinkRenderer( $this->titleFormatter );
+ $linkRenderer = $this->factory->create();
$foobar = new TitleValue( NS_SPECIAL, 'Foobar' );
$blankpage = new TitleValue( NS_SPECIAL, 'Blankpage' );
$this->assertEquals(
$linkRenderer->makeLink( $foobar, new HtmlArmor( '<script>evil()</script>' ) )
);
}
+
+ public function testGetLinkClasses() {
+ $titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+ $linkCache = new LinkCache( $titleFormatter );
+ $foobarTitle = new TitleValue( NS_MAIN, 'FooBar' );
+ $redirectTitle = new TitleValue( NS_MAIN, 'Redirect' );
+ $userTitle = new TitleValue( NS_USER, 'Someuser' );
+ $linkCache->addGoodLinkObj(
+ 1, // id
+ $foobarTitle,
+ 10, // len
+ 0 // redir
+ );
+ $linkCache->addGoodLinkObj(
+ 2, // id
+ $redirectTitle,
+ 10, // len
+ 1 // redir
+ );
+
+ $linkCache->addGoodLinkObj(
+ 3, // id
+ $userTitle,
+ 10, // len
+ 0 // redir
+ );
+
+ $linkRenderer = new LinkRenderer( $titleFormatter, $linkCache );
+ $linkRenderer->setStubThreshold( 0 );
+ $this->assertEquals(
+ '',
+ $linkRenderer->getLinkClasses( $foobarTitle )
+ );
+
+ $linkRenderer->setStubThreshold( 20 );
+ $this->assertEquals(
+ 'stub',
+ $linkRenderer->getLinkClasses( $foobarTitle )
+ );
+
+ $linkRenderer->setStubThreshold( 0 );
+ $this->assertEquals(
+ 'mw-redirect',
+ $linkRenderer->getLinkClasses( $redirectTitle )
+ );
+
+ $linkRenderer->setStubThreshold( 20 );
+ $this->assertEquals(
+ '',
+ $linkRenderer->getLinkClasses( $userTitle )
+ );
+ }
+
}
/**
* @group BagOStuff
*/
-class RedisBagOStuffTest extends MediaWikiTestCase {
+class RedisBagOStuffTest extends PHPUnit_Framework_TestCase {
/** @var RedisBagOStuff */
private $cache;
protected function setUp() {
parent::setUp();
- $this->cache = TestingAccessWrapper::newFromObject( new RedisBagOStuff( [ 'servers' => [] ] ) );
+ $cache = $this->getMockBuilder( 'RedisBagOStuff' )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->cache = TestingAccessWrapper::newFromObject( $cache );
}
/**
<?php
+
+use MediaWiki\MediaWikiServices;
+
/**
* Although marked as a stub, can work independently.
*
$tmpGlobals['wgStyleDirectory'] = "$IP/skins";
}
- # Replace all media handlers with a mock. We do not need to generate
- # actual thumbnails to do parser testing, we only care about receiving
- # a ThumbnailImage properly initialized.
- global $wgMediaHandlers;
- foreach ( $wgMediaHandlers as $type => $handler ) {
- $tmpGlobals['wgMediaHandlers'][$type] = 'MockBitmapHandler';
- }
- // Vector images have to be handled slightly differently
- $tmpGlobals['wgMediaHandlers']['image/svg+xml'] = 'MockSvgHandler';
-
- // DjVu images have to be handled slightly differently
- $tmpGlobals['wgMediaHandlers']['image/vnd.djvu'] = 'MockDjVuHandler';
-
- // Ogg video/audio increasingly more differently
- $tmpGlobals['wgMediaHandlers']['application/ogg'] = 'MockOggHandler';
-
$tmpHooks = $wgHooks;
$tmpHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
$tmpHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
$wgContLang->resetNamespaces(); # reset namespace cache
ParserTest::resetTitleServices();
+ MediaWikiServices::getInstance()->disableService( 'MediaHandlerFactory' );
+ MediaWikiServices::getInstance()->redefineService(
+ 'MediaHandlerFactory',
+ function() {
+ return new MockMediaHandlerFactory();
+ }
+ );
}
protected function tearDown() {
// Restore message cache (temporary pages and $wgUseDatabaseMessages)
MessageCache::destroyInstance();
+ MediaWikiServices::getInstance()->resetServiceForTesting( 'MediaHandlerFactory' );
parent::tearDown();
class ExtensionProcessorTest extends MediaWikiTestCase {
- private $dir;
+ private $dir, $dirname;
public function setUp() {
parent::setUp();
$this->dir = __DIR__ . '/FooBar/extension.json';
+ $this->dirname = dirname( $this->dir );
}
/**
}
/**
- * @covers ExtensionProcessor::extractConfig
+ * @covers ExtensionProcessor::extractConfig1
*/
- public function testExtractConfig() {
+ public function testExtractConfig1() {
$processor = new ExtensionProcessor;
$info = [
'config' => [
$this->assertEquals( 'somevalue', $extracted['globals']['egBar'] );
}
+ /**
+ * @covers ExtensionProcessor::extractConfig2
+ */
+ public function testExtractConfig2() {
+ $processor = new ExtensionProcessor;
+ $info = [
+ 'config' => [
+ 'Bar' => [ 'value' => 'somevalue' ],
+ 'Foo' => [ 'value' => 10 ],
+ 'Path' => [ 'value' => 'foo.txt', 'path' => true ],
+ ],
+ ] + self::$default;
+ $info2 = [
+ 'config' => [
+ 'Bar' => [ 'value' => 'somevalue' ],
+ ],
+ 'config_prefix' => 'eg',
+ 'name' => 'FooBar2',
+ ];
+ $processor->extractInfo( $this->dir, $info, 2 );
+ $processor->extractInfo( $this->dir, $info2, 2 );
+ $extracted = $processor->getExtractedInfo();
+ $this->assertEquals( 'somevalue', $extracted['globals']['wgBar'] );
+ $this->assertEquals( 10, $extracted['globals']['wgFoo'] );
+ $this->assertEquals( "{$this->dirname}/foo.txt", $extracted['globals']['wgPath'] );
+ // Custom prefix:
+ $this->assertEquals( 'somevalue', $extracted['globals']['egBar'] );
+ }
+
public static function provideExtractExtensionMessagesFiles() {
$dir = __DIR__ . '/FooBar/';
return [
]
];
}
+
+ public function testGlobalSettingsDocumentedInSchema() {
+ global $IP;
+ $globalSettings = TestingAccessWrapper::newFromClass(
+ ExtensionProcessor::class )->globalSettings;
+
+ $schema = FormatJson::decode(
+ file_get_contents( "$IP/docs/extension.schema.json" ),
+ true
+ );
+ $missing = [];
+ foreach ( $globalSettings as $global ) {
+ if ( !isset( $schema['properties'][$global] ) ) {
+ $missing[] = $global;
+ }
+ }
+
+ $this->assertEquals( [], $missing,
+ "The following global settings are not documented in docs/extension.schema.json" );
+ }
}
/**
return [
'noTemplateModule' => [],
+ 'deprecatedModule' => $base + [
+ 'deprecated' => true,
+ ],
+ 'deprecatedTomorrow' => $base + [
+ 'deprecated' => [
+ 'message' => 'Will be removed tomorrow.'
+ ],
+ ],
+
'htmlTemplateModule' => $base + [
'templates' => [
'templates/template.html',
$this->assertEquals( $rl->getDependencies(), $expected );
}
+ public static function providerDeprecatedModules() {
+ return [
+ [
+ 'deprecatedModule',
+ 'mw.log.warn("This page is using the deprecated ResourceLoader module \"deprecatedModule\".");',
+ ],
+ [
+ 'deprecatedTomorrow',
+ 'mw.log.warn(' .
+ '"This page is using the deprecated ResourceLoader module \"deprecatedTomorrow\".\\n' .
+ "Will be removed tomorrow." .
+ '");'
+ ]
+ ];
+ }
+
+ /**
+ * @dataProvider providerDeprecatedModules
+ * @covers ResourceLoaderFileModule::getScript
+ */
+ public function testDeprecatedModules( $name, $expected ) {
+ $modules = self::getModules();
+ $rl = new ResourceLoaderFileModule( $modules[$name] );
+ $rl->setName( $name );
+ $ctx = $this->getResourceLoaderContext( 'en', 'ltr' );
+ $this->assertEquals( $rl->getScript( $ctx ), $expected );
+ }
+
/**
* @covers ResourceLoaderFileModule::getAllStyleFiles
* @covers ResourceLoaderFileModule::getAllSkinStyleFiles
// Version hash for a blank file module.
// Result of ResourceLoader::makeHash(), ResourceLoaderTestModule
// and ResourceLoaderFileModule::getDefinitionSummary().
- protected static $blankVersion = '0a56zyi';
+ protected static $blankVersion = '09p30q0';
protected static function expandPlaceholders( $text ) {
return strtr( $text, [
->willReturnCallback( $mockFieldBuilder );
// Not using mock since PHPUnit mocks do not work properly with references in params
- $this->mergeMwGlobalArrayValue( 'wgHooks',
- [ 'SearchIndexFields' => [ [ $this, 'hookSearchIndexFields', $mockFieldBuilder ] ] ] );
+ $this->setTemporaryHook( 'SearchIndexFields',
+ function ( &$fields, SearchEngine $engine ) use ( $mockFieldBuilder ) {
+ $fields['testField'] =
+ $mockFieldBuilder( "testField", SearchIndexField::INDEX_TYPE_TEXT );
+ return true;
+ } );
$fields = $mockEngine->getSearchIndexFields();
$this->assertArrayHasKey( 'language', $fields );
$this->assertArrayHasKey( 'testData', $mapping );
$this->assertEquals( 'test', $mapping['testData'] );
}
-
- public function hookSearchIndexFields( $mockFieldBuilder, &$fields, SearchEngine $engine ) {
- $fields['testField'] = $mockFieldBuilder( "testField", SearchIndexField::INDEX_TYPE_TEXT );
- return true;
- }
}
$this->assertTrue( SessionManager::validateSessionId( $id ), "Generated ID: $id" );
}
- public function testAutoCreateUser() {
- global $wgGroupPermissions, $wgDisableAuthManager;
-
- if ( !$wgDisableAuthManager ) {
- $this->markTestSkipped( 'AuthManager is not disabled' );
- }
-
- \ObjectCache::$instances[__METHOD__] = new TestBagOStuff();
- $this->setMwGlobals( [ 'wgMainCacheType' => __METHOD__ ] );
- $this->setMwGlobals( [
- 'wgAuth' => new AuthPlugin,
- ] );
-
- $this->stashMwGlobals( [ 'wgGroupPermissions' ] );
- $wgGroupPermissions['*']['createaccount'] = true;
- $wgGroupPermissions['*']['autocreateaccount'] = false;
-
- // Replace the global singleton with one configured for testing
- $manager = $this->getManager();
- $reset = TestUtils::setSessionManagerSingleton( $manager );
-
- $logger = new \TestLogger( true, function ( $m ) {
- if ( substr( $m, 0, 15 ) === 'SessionBackend ' ) {
- // Don't care.
- return null;
- }
- $m = str_replace( 'MediaWiki\Session\SessionManager::autoCreateUser: ', '', $m );
- return $m;
- } );
- $manager->setLogger( $logger );
-
- $session = SessionManager::getGlobalSession();
-
- // Can't create an already-existing user
- $user = User::newFromName( 'UTSysop' );
- $id = $user->getId();
- $this->assertFalse( $manager->autoCreateUser( $user ) );
- $this->assertSame( $id, $user->getId() );
- $this->assertSame( 'UTSysop', $user->getName() );
- $this->assertSame( [], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Sanity check that creation works at all
- $user = User::newFromName( 'UTSessionAutoCreate1' );
- $this->assertSame( 0, $user->getId(), 'sanity check' );
- $this->assertTrue( $manager->autoCreateUser( $user ) );
- $this->assertNotEquals( 0, $user->getId() );
- $this->assertSame( 'UTSessionAutoCreate1', $user->getName() );
- $this->assertEquals(
- $user->getId(), User::idFromName( 'UTSessionAutoCreate1', User::READ_LATEST )
- );
- $this->assertSame( [
- [ LogLevel::INFO, 'creating new user ({username}) - from: {url}' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Check lack of permissions
- $wgGroupPermissions['*']['createaccount'] = false;
- $wgGroupPermissions['*']['autocreateaccount'] = false;
- $user = User::newFromName( 'UTDoesNotExist' );
- $this->assertFalse( $manager->autoCreateUser( $user ) );
- $this->assertSame( 0, $user->getId() );
- $this->assertNotSame( 'UTDoesNotExist', $user->getName() );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
- $session->clear();
- $this->assertSame( [
- [
- LogLevel::DEBUG,
- 'user is blocked from this wiki, blacklisting',
- ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Check other permission
- $wgGroupPermissions['*']['createaccount'] = false;
- $wgGroupPermissions['*']['autocreateaccount'] = true;
- $user = User::newFromName( 'UTSessionAutoCreate2' );
- $this->assertSame( 0, $user->getId(), 'sanity check' );
- $this->assertTrue( $manager->autoCreateUser( $user ) );
- $this->assertNotEquals( 0, $user->getId() );
- $this->assertSame( 'UTSessionAutoCreate2', $user->getName() );
- $this->assertEquals(
- $user->getId(), User::idFromName( 'UTSessionAutoCreate2', User::READ_LATEST )
- );
- $this->assertSame( [
- [ LogLevel::INFO, 'creating new user ({username}) - from: {url}' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Test account-creation block
- $anon = new User;
- $block = new \Block( [
- 'address' => $anon->getName(),
- 'user' => $id,
- 'reason' => __METHOD__,
- 'expiry' => time() + 100500,
- 'createAccount' => true,
- ] );
- $block->insert();
- $this->assertInstanceOf( 'Block', $anon->isBlockedFromCreateAccount(), 'sanity check' );
- $reset2 = new \ScopedCallback( [ $block, 'delete' ] );
- $user = User::newFromName( 'UTDoesNotExist' );
- $this->assertFalse( $manager->autoCreateUser( $user ) );
- $this->assertSame( 0, $user->getId() );
- $this->assertNotSame( 'UTDoesNotExist', $user->getName() );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
- \ScopedCallback::consume( $reset2 );
- $session->clear();
- $this->assertSame( [
- [ LogLevel::DEBUG, 'user is blocked from this wiki, blacklisting' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Sanity check that creation still works
- $user = User::newFromName( 'UTSessionAutoCreate3' );
- $this->assertSame( 0, $user->getId(), 'sanity check' );
- $this->assertTrue( $manager->autoCreateUser( $user ) );
- $this->assertNotEquals( 0, $user->getId() );
- $this->assertSame( 'UTSessionAutoCreate3', $user->getName() );
- $this->assertEquals(
- $user->getId(), User::idFromName( 'UTSessionAutoCreate3', User::READ_LATEST )
- );
- $this->assertSame( [
- [ LogLevel::INFO, 'creating new user ({username}) - from: {url}' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Test prevention by AuthPlugin
- global $wgAuth;
- $oldWgAuth = $wgAuth;
- $mockWgAuth = $this->getMock( 'AuthPlugin', [ 'autoCreate' ] );
- $mockWgAuth->expects( $this->once() )->method( 'autoCreate' )
- ->will( $this->returnValue( false ) );
- $this->setMwGlobals( [
- 'wgAuth' => $mockWgAuth,
- ] );
- $user = User::newFromName( 'UTDoesNotExist' );
- $this->assertFalse( $manager->autoCreateUser( $user ) );
- $this->assertSame( 0, $user->getId() );
- $this->assertNotSame( 'UTDoesNotExist', $user->getName() );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
- $this->setMwGlobals( [
- 'wgAuth' => $oldWgAuth,
- ] );
- $session->clear();
- $this->assertSame( [
- [ LogLevel::DEBUG, 'denied by AuthPlugin' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Test prevention by wfReadOnly()
- $this->setMwGlobals( [
- 'wgReadOnly' => 'Because',
- ] );
- $user = User::newFromName( 'UTDoesNotExist' );
- $this->assertFalse( $manager->autoCreateUser( $user ) );
- $this->assertSame( 0, $user->getId() );
- $this->assertNotSame( 'UTDoesNotExist', $user->getName() );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
- $this->setMwGlobals( [
- 'wgReadOnly' => false,
- ] );
- $session->clear();
- $this->assertSame( [
- [ LogLevel::DEBUG, 'denied by wfReadOnly()' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Test prevention by a previous session
- $session->set( 'MWSession::AutoCreateBlacklist', 'test' );
- $user = User::newFromName( 'UTDoesNotExist' );
- $this->assertFalse( $manager->autoCreateUser( $user ) );
- $this->assertSame( 0, $user->getId() );
- $this->assertNotSame( 'UTDoesNotExist', $user->getName() );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
- $session->clear();
- $this->assertSame( [
- [ LogLevel::DEBUG, 'blacklisted in session (test)' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Test uncreatable name
- $user = User::newFromName( 'UTDoesNotExist@' );
- $this->assertFalse( $manager->autoCreateUser( $user ) );
- $this->assertSame( 0, $user->getId() );
- $this->assertNotSame( 'UTDoesNotExist@', $user->getName() );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
- $session->clear();
- $this->assertSame( [
- [ LogLevel::DEBUG, 'Invalid username, blacklisting' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Test AbortAutoAccount hook
- $mock = $this->getMock( __CLASS__, [ 'onAbortAutoAccount' ] );
- $mock->expects( $this->once() )->method( 'onAbortAutoAccount' )
- ->will( $this->returnCallback( function ( User $user, &$msg ) {
- $msg = 'No way!';
- return false;
- } ) );
- $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'AbortAutoAccount' => [ $mock ] ] );
- $user = User::newFromName( 'UTDoesNotExist' );
- $this->assertFalse( $manager->autoCreateUser( $user ) );
- $this->assertSame( 0, $user->getId() );
- $this->assertNotSame( 'UTDoesNotExist', $user->getName() );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
- $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'AbortAutoAccount' => [] ] );
- $session->clear();
- $this->assertSame( [
- [ LogLevel::DEBUG, 'denied by hook: No way!' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Test AbortAutoAccount hook screwing up the name
- $mock = $this->getMock( 'stdClass', [ 'onAbortAutoAccount' ] );
- $mock->expects( $this->once() )->method( 'onAbortAutoAccount' )
- ->will( $this->returnCallback( function ( User $user ) {
- $user->setName( 'UTDoesNotExistEither' );
- } ) );
- $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'AbortAutoAccount' => [ $mock ] ] );
- try {
- $user = User::newFromName( 'UTDoesNotExist' );
- $manager->autoCreateUser( $user );
- $this->fail( 'Expected exception not thrown' );
- } catch ( \UnexpectedValueException $ex ) {
- $this->assertSame(
- 'AbortAutoAccount hook tried to change the user name',
- $ex->getMessage()
- );
- }
- $this->assertSame( 0, $user->getId() );
- $this->assertNotSame( 'UTDoesNotExist', $user->getName() );
- $this->assertNotSame( 'UTDoesNotExistEither', $user->getName() );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExistEither', User::READ_LATEST ) );
- $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'AbortAutoAccount' => [] ] );
- $session->clear();
- $this->assertSame( [], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Test for "exception backoff"
- $user = User::newFromName( 'UTDoesNotExist' );
- $cache = \ObjectCache::getLocalClusterInstance();
- $backoffKey = wfMemcKey( 'MWSession', 'autocreate-failed', md5( $user->getName() ) );
- $cache->set( $backoffKey, 1, 60 * 10 );
- $this->assertFalse( $manager->autoCreateUser( $user ) );
- $this->assertSame( 0, $user->getId() );
- $this->assertNotSame( 'UTDoesNotExist', $user->getName() );
- $this->assertEquals( 0, User::idFromName( 'UTDoesNotExist', User::READ_LATEST ) );
- $cache->delete( $backoffKey );
- $session->clear();
- $this->assertSame( [
- [ LogLevel::DEBUG, 'denied by prior creation attempt failures' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
-
- // Sanity check that creation still works, and test completion hook
- $cb = $this->callback( function ( User $user ) {
- $this->assertNotEquals( 0, $user->getId() );
- $this->assertSame( 'UTSessionAutoCreate4', $user->getName() );
- $this->assertEquals(
- $user->getId(), User::idFromName( 'UTSessionAutoCreate4', User::READ_LATEST )
- );
- return true;
- } );
- $mock = $this->getMock( 'stdClass',
- [ 'onAuthPluginAutoCreate', 'onLocalUserCreated' ] );
- $mock->expects( $this->once() )->method( 'onAuthPluginAutoCreate' )
- ->with( $cb );
- $mock->expects( $this->once() )->method( 'onLocalUserCreated' )
- ->with( $cb, $this->identicalTo( true ) );
- $this->mergeMwGlobalArrayValue( 'wgHooks', [
- 'AuthPluginAutoCreate' => [ $mock ],
- 'LocalUserCreated' => [ $mock ],
- ] );
- $user = User::newFromName( 'UTSessionAutoCreate4' );
- $this->assertSame( 0, $user->getId(), 'sanity check' );
- $this->assertTrue( $manager->autoCreateUser( $user ) );
- $this->assertNotEquals( 0, $user->getId() );
- $this->assertSame( 'UTSessionAutoCreate4', $user->getName() );
- $this->assertEquals(
- $user->getId(),
- User::idFromName( 'UTSessionAutoCreate4', User::READ_LATEST )
- );
- $this->mergeMwGlobalArrayValue( 'wgHooks', [
- 'AuthPluginAutoCreate' => [],
- 'LocalUserCreated' => [],
- ] );
- $this->assertSame( [
- [ LogLevel::INFO, 'creating new user ({username}) - from: {url}' ],
- ], $logger->getBuffer() );
- $logger->clearBuffer();
- }
-
- public function onAbortAutoAccount( User $user, &$msg ) {
- }
-
public function testPreventSessionsForUser() {
$manager = $this->getManager();
'strict' => false, /* not strict */
'allowedHtmlElements' => null, /* no sanitization */
'tidyCompat' => false, /* standard parser */
+ 'allowComments' => true, /* comment parsing */
] );
}
/**
- * Anything cleanup you need to do should go here.
- */
- protected function tearDown() {
- parent::tearDown();
- }
-
- /**
- * @covers Balancer::balance
+ * @covers MediaWiki\Tidy\Balancer::balance
* @dataProvider provideBalancerTests
*/
public function testBalancer( $description, $input, $expected ) {
// for providers, and filter out HTML constructs which
// the balancer doesn't support.
$tests = [];
- $start = '<html><head></head><body>';
- $end = '</body></html>';
+ $okre = "~ \A
+ (?i:<!DOCTYPE\ html>)?
+ <html><head></head><body>
+ .*
+ </body></html>
+ \z ~xs";
foreach ( $json as $filename => $cases ) {
foreach ( $cases as $case ) {
$html = $case['document']['html'];
- if (
- substr( $html, 0, strlen( $start ) ) !== $start ||
- substr( $html, -strlen( $end ) ) !== $end
- ) {
+ if ( !preg_match( $okre, $html ) ) {
// Skip tests which involve stuff in the <head> or
// weird doctypes.
continue;
$html = $case['document']['noQuirksBodyHtml'];
// Normalize case of SVG attributes.
$html = str_replace( 'foreignObject', 'foreignobject', $html );
+ // Normalize case of MathML attributes.
+ $html = str_replace( 'definitionURL', 'definitionurl', $html );
- if ( isset( $case['document']['props']['comment'] ) ) {
- // Skip tests which include HTML comments, which
- // the balancer requires to have been stripped.
+ if (
+ isset( $case['document']['props']['comment'] ) &&
+ preg_match( ',<!--[^>]*<,', $html )
+ ) {
+ // Skip tests which include HTML comments containing
+ // the < character, which we don't support.
continue;
}
if ( strpos( $case['data'], '<![CDATA[' ) !== false ) {
// Skip tests involving <![CDATA[ ]]> quoting.
continue;
}
- if ( stripos( $case['data'], '<!DOCTYPE' ) !== false ) {
- // Skip tests involving doctypes.
+ if (
+ stripos( $case['data'], '<!DOCTYPE' ) !== false &&
+ stripos( $case['data'], '<!DOCTYPE html>' ) === false
+ ) {
+ // Skip tests involving unusual doctypes.
continue;
}
- if ( preg_match( ',</?(html|head|body|frame|plaintext)>|<rdar:,i', $case['data'] ) ) {
+ $literalre = "~ <rdar: | <isindex | < /? (
+ html | head | body | frame | frameset | plaintext
+ ) > ~xi";
+ if ( preg_match( $literalre, $case['data'] ) ) {
// Skip tests involving some literal tags, which are
// unsupported but don't show up in the expected output.
continue;
}
if (
- isset( $case['document']['props']['tags']['form'] ) ||
isset( $case['document']['props']['tags']['iframe'] ) ||
isset( $case['document']['props']['tags']['noembed'] ) ||
isset( $case['document']['props']['tags']['noscript'] ) ||
isset( $case['document']['props']['tags']['script'] ) ||
- isset( $case['document']['props']['tags']['select'] ) ||
isset( $case['document']['props']['tags']['svg script'] ) ||
isset( $case['document']['props']['tags']['svg title'] ) ||
- isset( $case['document']['props']['tags']['textarea'] ) ||
isset( $case['document']['props']['tags']['title'] ) ||
isset( $case['document']['props']['tags']['xmp'] )
) {
isset( $case['document']['props']['tagWithLt'] ) ||
isset( $case['document']['props']['attrWithFunnyChar'] ) ||
preg_match( ':^(</b test|<di|<foo bar=qux/>)$:', $case['data'] ) ||
- preg_match( ':</p<p>:', $case['data'] )
+ preg_match( ':</p<p>:', $case['data'] ) ||
+ preg_match( ':<b &=&>|<p/x/y/z>:', $case['data'] )
) {
// Skip tests with funny tag or attribute names,
// which are really tests of the HTML tokenizer, not
continue;
}
if (
- stripos( $case['data'], 'encoding=" text/html "' ) !== false
+ preg_match( ':encoding=" text/html "|type=" hidden":', $case['data'] )
) {
// The Sanitizer normalizes whitespace in attribute
// values, which makes this test case invalid.
// Skip tests with ASCII null, etc.
continue;
}
+ $data = preg_replace(
+ '~<!DOCTYPE html>~i', '', $case['data']
+ );
$tests[] = [
$filename, # use better description?
- $case['data'],
+ $data,
$html
];
}
[ 'ValidTitle.jpg', 'ValidTitle.jpg', UploadBase::OK,
'upload valid title' ],
/* A title with a slash */
- [ 'A/B.jpg', 'B.jpg', UploadBase::OK,
+ [ 'A/B.jpg', 'A-B.jpg', UploadBase::OK,
'upload title with slash' ],
/* A title with illegal char */
[ 'A:B.jpg', 'A-B.jpg', UploadBase::OK,
];
// @codingStandardsIgnoreEnd
}
+
+ /**
+ * @dataProvider provideCheckXMLEncodingMissmatch
+ */
+ public function testCheckXMLEncodingMissmatch( $fileContents, $evil ) {
+ $filename = $this->getNewTempFile();
+ file_put_contents( $filename, $fileContents );
+ $this->assertSame( UploadBase::checkXMLEncodingMissmatch( $filename ), $evil );
+ }
+
+ public function provideCheckXMLEncodingMissmatch() {
+ return [
+ [ '<?xml version="1.0" encoding="utf-7"?><svg></svg>', true ],
+ [ '<?xml version="1.0" encoding="utf-8"?><svg></svg>', false ],
+ [ '<?xml version="1.0" encoding="WINDOWS-1252"?><svg></svg>', false ],
+ ];
+ }
}
class UploadTestHandler extends UploadBase {
* @group medium
* @covers User::getEditCount
*/
- public function testEditCount() {
+ public function testGetEditCount() {
$user = $this->getMutableTestUser()->getUser();
// let the user have a few (3) edits
$page->doEdit( (string)$i, 'test', 0, false, $user );
}
- $user->clearInstanceCache();
$this->assertEquals(
3,
$user->getEditCount(),
'After three edits, the user edit count should be 3'
);
- // increase the edit count and clear the cache
+ // increase the edit count
$user->incEditCount();
- $user->clearInstanceCache();
$this->assertEquals(
4,
$user->getEditCount(),
);
}
+ /**
+ * Test User::editCount
+ * @group medium
+ * @covers User::getEditCount
+ */
+ public function testGetEditCountForAnons() {
+ $user = User::newFromName( 'Anonymous' );
+
+ $this->assertNull(
+ $user->getEditCount(),
+ 'Edit count starts null for anonymous users.'
+ );
+
+ $user->incEditCount();
+
+ $this->assertNull(
+ $user->getEditCount(),
+ 'Edit count remains null for anonymous users despite calls to increase it.'
+ );
+ }
+
+ /**
+ * Test User::editCount
+ * @group medium
+ * @covers User::incEditCount
+ */
+ public function testIncEditCount() {
+ $user = $this->getMutableTestUser()->getUser();
+ $user->incEditCount();
+
+ $reloadedUser = User::newFromId( $user->getId() );
+ $reloadedUser->incEditCount();
+
+ $this->assertEquals(
+ 2,
+ $reloadedUser->getEditCount(),
+ 'Increasing the edit count after a fresh load leaves the object up to date.'
+ );
+ }
+
/**
* Test changing user options.
* @covers User::setOption
$this->assertGreaterThan(
$touched, $user->getDBTouched(), "user_touched increased with casOnTouched() #2" );
}
+
+ /**
+ * @covers User::findUsersByGroup
+ */
+ public function testFindUsersByGroup() {
+ $users = User::findUsersByGroup( [] );
+ $this->assertEquals( 0, iterator_count( $users ) );
+
+ $users = User::findUsersByGroup( 'foo' );
+ $this->assertEquals( 0, iterator_count( $users ) );
+
+ $user = $this->getMutableTestUser( [ 'foo' ] )->getUser();
+ $users = User::findUsersByGroup( 'foo' );
+ $this->assertEquals( 1, iterator_count( $users ) );
+ $users->rewind();
+ $this->assertTrue( $user->equals( $users->current() ) );
+
+ // arguments have OR relationship
+ $user2 = $this->getMutableTestUser( [ 'bar' ] )->getUser();
+ $users = User::findUsersByGroup( [ 'foo', 'bar' ] );
+ $this->assertEquals( 2, iterator_count( $users ) );
+ $users->rewind();
+ $this->assertTrue( $user->equals( $users->current() ) );
+ $users->next();
+ $this->assertTrue( $user2->equals( $users->current() ) );
+
+ // users are not duplicated
+ $user = $this->getMutableTestUser( [ 'baz', 'boom' ] )->getUser();
+ $users = User::findUsersByGroup( [ 'baz', 'boom' ] );
+ $this->assertEquals( 1, iterator_count( $users ) );
+ $users->rewind();
+ $this->assertTrue( $user->equals( $users->current() ) );
+ }
}
--- /dev/null
+<?php
+/**
+ * Media-handling base classes and generic functionality.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Replace all media handlers with a mock. We do not need to generate
+ * actual thumbnails to do parser testing, we only care about receiving
+ * a ThumbnailImage properly initialized.
+ *
+ * @since 1.28
+ */
+class MockMediaHandlerFactory extends MediaHandlerFactory {
+
+ private static $overrides = [
+ 'image/svg+xml' => MockSvgHandler::class,
+ 'image/vnd.djvu' => MockDjVuHandler::class,
+ 'application/ogg' => MockOggHandler::class,
+ ];
+
+ public function __construct() {
+ // override parent
+ }
+
+ protected function getHandlerClass( $type ) {
+ if ( isset( self::$overrides[$type] ) ) {
+ return self::$overrides[$type];
+ }
+
+ return MockBitmapHandler::class;
+ }
+
+}
global $wgDevelopmentWarnings;
global $wgSessionProviders, $wgSessionPbkdf2Iterations;
global $wgJobTypeConf;
- global $wgAuthManagerConfig, $wgAuth, $wgDisableAuthManager;
+ global $wgAuthManagerConfig, $wgAuth;
// Inject test autoloader
require_once __DIR__ . '/../TestsAutoLoader.php';
],
'secondaryauth' => [],
];
- $wgAuth = $wgDisableAuthManager ? new AuthPlugin : new MediaWiki\Auth\AuthManagerAuthPlugin();
+ $wgAuth = new MediaWiki\Auth\AuthManagerAuthPlugin();
// Bug 44192 Do not attempt to send a real e-mail
Hooks::clear( 'AlternateUserMailer' );
$this->assertFalse( $uncerealized instanceof __PHP_Incomplete_Class,
"unserialize() can load classes case-insensitively." );
}
+
+ function testAutoloadOrder() {
+ $path = realpath( __DIR__ . '/../../..' );
+ $oldAutoload = file_get_contents( $path . '/autoload.php' );
+ $generator = new AutoloadGenerator( $path, 'local' );
+ $generator->initMediaWikiDefault();
+ $newAutoload = $generator->getAutoload( 'maintenance/generateLocalAutoload.php' );
+
+ $this->assertEquals( $oldAutoload, $newAutoload, 'autoload.php does not match' .
+ ' output of generateLocalAutoload.php script.' );
+ }
}
class ExtensionsTestSuite extends PHPUnit_Framework_TestSuite {
public function __construct() {
parent::__construct();
+
$paths = [];
+ // Autodiscover extension unit tests
+ $registry = ExtensionRegistry::getInstance();
+ foreach ( $registry->getAllThings() as $info ) {
+ $paths[] = dirname( $info['path'] ) . '/tests/phpunit';
+ }
// Extensions can return a list of files or directories
Hooks::run( 'UnitTestsList', [ &$paths ] );
- foreach ( $paths as $path ) {
+ foreach ( array_unique( $paths ) as $path ) {
if ( is_dir( $path ) ) {
// If the path is a directory, search for test cases.
// @since 1.24
$fileIterator = new File_Iterator_Facade();
$matchingFiles = $fileIterator->getFilesAsArray( $path, $suffixes );
$this->addTestFiles( $matchingFiles );
- } else {
+ } elseif ( file_exists( $path ) ) {
// Add a single test case or suite class
$this->addTestFile( $path );
}
[ 'Strasse' ]
],
+ // Data set "digraph"
+ digraphWords = [
+ [ 'London' ],
+ [ 'Ljubljana' ],
+ [ 'Luxembourg' ],
+ [ 'Njivice' ],
+ [ 'Norwich' ],
+ [ 'New York' ]
+ ],
+ digraphWordsSorted = [
+ [ 'London' ],
+ [ 'Luxembourg' ],
+ [ 'Ljubljana' ],
+ [ 'New York' ],
+ [ 'Norwich' ],
+ [ 'Njivice' ]
+ ],
+
complexMDYDates = [
[ 'January, 19 2010' ],
[ 'April 21 1991' ],
}
);
+ tableTest(
+ 'Digraphs with custom collation',
+ [ 'City' ],
+ digraphWords,
+ digraphWordsSorted,
+ function ( $table ) {
+ mw.config.set( 'tableSorterCollation', {
+ lj: 'lzzzz',
+ nj: 'nzzzz'
+ } );
+
+ $table.tablesorter();
+ $table.find( '.headerSort:eq(0)' ).click();
+ }
+ );
+
QUnit.test( 'Rowspan not exploded on init', 1, function ( assert ) {
var $table = tableCreate( header, planets );
);
}
- QUnit.asyncTest( 'mw.loader', 2, function ( assert ) {
+ QUnit.test( 'mw.loader', 2, function ( assert ) {
var isAwesomeDone;
mw.loader.testCallback = function () {
- QUnit.start();
assert.strictEqual( isAwesomeDone, undefined, 'Implementing module is.awesome: isAwesomeDone should still be undefined' );
isAwesomeDone = true;
};
mw.loader.implement( 'test.callback', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' ) ] );
- mw.loader.using( 'test.callback', function () {
-
- // /sample/awesome.js declares the "mw.loader.testCallback" function
- // which contains a call to start() and ok()
+ return mw.loader.using( 'test.callback', function () {
assert.strictEqual( isAwesomeDone, true, 'test.callback module should\'ve caused isAwesomeDone to be true' );
delete mw.loader.testCallback;
}, function () {
- QUnit.start();
assert.ok( false, 'Error callback fired while loader.using "test.callback" module' );
} );
} );
- QUnit.asyncTest( 'mw.loader with Object method as module name', 2, function ( assert ) {
+ QUnit.test( 'mw.loader with Object method as module name', 2, function ( assert ) {
var isAwesomeDone;
mw.loader.testCallback = function () {
- QUnit.start();
assert.strictEqual( isAwesomeDone, undefined, 'Implementing module hasOwnProperty: isAwesomeDone should still be undefined' );
isAwesomeDone = true;
};
mw.loader.implement( 'hasOwnProperty', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' ) ], {}, {} );
- mw.loader.using( 'hasOwnProperty', function () {
-
- // /sample/awesome.js declares the "mw.loader.testCallback" function
- // which contains a call to start() and ok()
+ return mw.loader.using( 'hasOwnProperty', function () {
assert.strictEqual( isAwesomeDone, true, 'hasOwnProperty module should\'ve caused isAwesomeDone to be true' );
delete mw.loader.testCallback;
}, function () {
- QUnit.start();
assert.ok( false, 'Error callback fired while loader.using "hasOwnProperty" module' );
} );
} );
- QUnit.asyncTest( 'mw.loader.using( .. ) Promise', 2, function ( assert ) {
+ QUnit.test( 'mw.loader.using( .. ) Promise', 2, function ( assert ) {
var isAwesomeDone;
mw.loader.testCallback = function () {
- QUnit.start();
assert.strictEqual( isAwesomeDone, undefined, 'Implementing module is.awesome: isAwesomeDone should still be undefined' );
isAwesomeDone = true;
};
mw.loader.implement( 'test.promise', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' ) ] );
- mw.loader.using( 'test.promise' )
+ return mw.loader.using( 'test.promise' )
.done( function () {
-
- // /sample/awesome.js declares the "mw.loader.testCallback" function
- // which contains a call to start() and ok()
assert.strictEqual( isAwesomeDone, true, 'test.promise module should\'ve caused isAwesomeDone to be true' );
delete mw.loader.testCallback;
} )
.fail( function () {
- QUnit.start();
assert.ok( false, 'Error callback fired while loader.using "test.promise" module' );
} );
} );
- QUnit.asyncTest( 'mw.loader.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
+ QUnit.test( 'mw.loader.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
assert.notEqual(
'right',
'style is applied'
);
- QUnit.start();
},
{
all: '.mw-test-implement-a { float: right; }'
}
);
- mw.loader.load( [
- 'test.implement.a'
- ] );
+ return mw.loader.using( 'test.implement.a' );
} );
- QUnit.asyncTest( 'mw.loader.implement( styles={ "url": { <media>: [url, ..] } } )', 7, function ( assert ) {
+ QUnit.test( 'mw.loader.implement( styles={ "url": { <media>: [url, ..] } } )', 7, function ( assert ) {
var $element1 = $( '<div class="mw-test-implement-b1"></div>' ).appendTo( '#qunit-fixture' ),
$element2 = $( '<div class="mw-test-implement-b2"></div>' ).appendTo( '#qunit-fixture' ),
- $element3 = $( '<div class="mw-test-implement-b3"></div>' ).appendTo( '#qunit-fixture' );
+ $element3 = $( '<div class="mw-test-implement-b3"></div>' ).appendTo( '#qunit-fixture' ),
+ done = assert.async();
assert.notEqual(
$element1.css( 'text-align' ),
mw.loader.implement(
'test.implement.b',
function () {
- // Note: QUnit.start() must only be called when the entire test is
+ // Note: done() must only be called when the entire test is
// complete. So, make sure that we don't start until *both*
// assertStyleAsync calls have completed.
var pending = 2;
pending--;
if ( pending === 0 ) {
- QUnit.start();
+ done();
}
} );
assertStyleAsync( assert, $element3, 'float', 'right', function () {
pending--;
if ( pending === 0 ) {
- QUnit.start();
+ done();
}
} );
},
}
);
- mw.loader.load( [
- 'test.implement.b'
- ] );
+ mw.loader.load( 'test.implement.b' );
} );
// Backwards compatibility
- QUnit.asyncTest( 'mw.loader.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
+ QUnit.test( 'mw.loader.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
var $element = $( '<div class="mw-test-implement-c"></div>' ).appendTo( '#qunit-fixture' );
assert.notEqual(
'right',
'style is applied'
);
- QUnit.start();
},
{
all: '.mw-test-implement-c { float: right; }'
}
);
- mw.loader.load( [
- 'test.implement.c'
- ] );
+ return mw.loader.using( 'test.implement.c' );
} );
// Backwards compatibility
- QUnit.asyncTest( 'mw.loader.implement( styles={ <media>: [url, ..] } ) (back-compat)', 4, function ( assert ) {
+ QUnit.test( 'mw.loader.implement( styles={ <media>: [url, ..] } ) (back-compat)', 4, function ( assert ) {
var $element = $( '<div class="mw-test-implement-d"></div>' ).appendTo( '#qunit-fixture' ),
- $element2 = $( '<div class="mw-test-implement-d2"></div>' ).appendTo( '#qunit-fixture' );
+ $element2 = $( '<div class="mw-test-implement-d2"></div>' ).appendTo( '#qunit-fixture' ),
+ done = assert.async();
assert.notEqual(
$element.css( 'float' ),
'test.implement.d',
function () {
assertStyleAsync( assert, $element, 'float', 'right', function () {
-
assert.notEqual( $element2.css( 'text-align' ), 'center', 'print style is not applied (bug 40500)' );
-
- QUnit.start();
+ done();
} );
},
{
}
);
- mw.loader.load( [
- 'test.implement.d'
- ] );
+ mw.loader.load( 'test.implement.d' );
} );
// @import (bug 31676)
- QUnit.asyncTest( 'mw.loader.implement( styles has @import )', 7, function ( assert ) {
- var isJsExecuted, $element;
+ QUnit.test( 'mw.loader.implement( styles has @import )', 7, function ( assert ) {
+ var isJsExecuted, $element,
+ done = assert.async();
mw.loader.implement(
'test.implement.import',
'CSS styles after the @import rule are working'
);
- QUnit.start();
+ done();
} );
},
{
} );
} );
- QUnit.asyncTest( 'mw.loader.implement( dependency with styles )', 4, function ( assert ) {
+ QUnit.test( 'mw.loader.implement( dependency with styles )', 4, function ( assert ) {
var $element = $( '<div class="mw-test-implement-e"></div>' ).appendTo( '#qunit-fixture' ),
$element2 = $( '<div class="mw-test-implement-e2"></div>' ).appendTo( '#qunit-fixture' );
'right',
'Depending module\'s style is applied'
);
- QUnit.start();
},
{
all: '.mw-test-implement-e { float: right; }'
}
);
- mw.loader.load( [
- 'test.implement.e'
- ] );
+ return mw.loader.using( 'test.implement.e' );
} );
QUnit.test( 'mw.loader.implement( only scripts )', 1, function ( assert ) {
assert.strictEqual( mw.loader.getState( 'test.onlyscripts' ), 'ready' );
} );
- QUnit.asyncTest( 'mw.loader.implement( only messages )', 2, function ( assert ) {
+ QUnit.test( 'mw.loader.implement( only messages )', 2, function ( assert ) {
assert.assertFalse( mw.messages.exists( 'bug_29107' ), 'Verify that the test message doesn\'t exist yet' );
// jscs: disable requireCamelCaseOrUpperCaseIdentifiers
mw.loader.implement( 'test.implement.msgs', [], {}, { bug_29107: 'loaded' } );
// jscs: enable requireCamelCaseOrUpperCaseIdentifiers
- mw.loader.using( 'test.implement.msgs', function () {
- QUnit.start();
+
+ return mw.loader.using( 'test.implement.msgs', function () {
assert.ok( mw.messages.exists( 'bug_29107' ), 'Bug 29107: messages-only module should implement ok' );
}, function () {
- QUnit.start();
assert.ok( false, 'Error callback fired while implementing "test.implement.msgs" module' );
} );
} );
);
} );
- QUnit.asyncTest( 'mw.loader dependency handling', 5, function ( assert ) {
+ QUnit.test( 'mw.loader dependency handling', 5, function ( assert ) {
+ var done = assert.async();
mw.loader.register( [
// [module, version, dependencies, group, source]
[ 'testMissing', '1', [], null, 'testloader' ],
verifyModuleStates();
- QUnit.start();
+ done();
},
function ( e, badmodules ) {
assert.ok( true, 'Error handler should be invoked.' );
verifyModuleStates();
- QUnit.start();
+ done();
}
);
} );
- QUnit.asyncTest( 'mw.loader skin-function handling', 5, function ( assert ) {
+ QUnit.test( 'mw.loader skin-function handling', 5, function ( assert ) {
mw.loader.register( [
// [module, version, dependencies, group, source, skip]
[ 'testSkipped', '1', [], null, 'testloader', 'return true;' ],
assert.equal( mw.loader.getState( 'testUsesSkippable' ), 'ready', 'Module is ready when skippable dependencies are ready' );
}
- mw.loader.using( [ 'testUsesSkippable' ],
+ return mw.loader.using( [ 'testUsesSkippable' ],
function () {
assert.ok( true, 'Success handler should be invoked.' );
assert.ok( true ); // Dummy to match error handler and reach QUnit expect()
verifyModuleStates();
-
- QUnit.start();
},
function ( e, badmodules ) {
assert.ok( false, 'Error handler should not be invoked.' );
assert.deepEqual( badmodules, [], 'Bad modules as expected.' );
verifyModuleStates();
-
- QUnit.start();
}
);
} );
mw.loader.load( target );
} );
- QUnit.asyncTest( 'mw.loader() executing race (T112232)', 2, function ( assert ) {
+ QUnit.test( 'mw.loader() executing race (T112232)', 2, function ( assert ) {
var done = false;
// The red herring schedules its CSS buffer first. In T112232, a bug in the
);
mw.loader.load( [ 'testRaceRedHerring', 'testRaceLoadMe' ] );
- mw.loader.using( 'testRaceLoadMe', function () {
+ return mw.loader.using( 'testRaceLoadMe', function () {
assert.strictEqual( done, true, 'script ran' );
assert.strictEqual( mw.loader.getState( 'testRaceLoadMe' ), 'ready', 'state' );
- } ).always( QUnit.start );
+ } );
} );
QUnit.test( 'mw.hook', 13, function ( assert ) {
);
} );
- QUnit.test( 'mw.loader.require', 6, function ( assert ) {
- var module1, module2, module3, module4;
-
+ QUnit.test( 'mw.loader require()', 6, function ( assert ) {
mw.loader.register( [
- [ 'test.module.require1', '0' ],
- [ 'test.module.require2', '0' ],
- [ 'test.module.require3', '0' ],
- [ 'test.module.require4', '0', [ 'test.module.require3' ] ]
+ [ 'test.require1', '0' ],
+ [ 'test.require2', '0' ],
+ [ 'test.require3', '0' ],
+ [ 'test.require4', '0', [ 'test.require3' ] ]
] );
- mw.loader.implement( 'test.module.require1', function () {} );
- mw.loader.implement( 'test.module.require2', function ( $, jQuery, require, module ) {
+ mw.loader.implement( 'test.require1', function () {} );
+ mw.loader.implement( 'test.require2', function ( $, jQuery, require, module ) {
module.exports = 1;
} );
- mw.loader.implement( 'test.module.require3', function ( $, jQuery, require, module ) {
+ mw.loader.implement( 'test.require3', function ( $, jQuery, require, module ) {
module.exports = function () {
return 'hello world';
};
} );
- mw.loader.implement( 'test.module.require4', function ( $, jQuery, require, module ) {
- var other = require( 'test.module.require3' );
+ mw.loader.implement( 'test.require4', function ( $, jQuery, require, module ) {
+ var other = require( 'test.require3' );
module.exports = {
pizza: function () {
return other();
}
};
} );
- module1 = mw.loader.require( 'test.module.require1' );
- module2 = mw.loader.require( 'test.module.require2' );
- module3 = mw.loader.require( 'test.module.require3' );
- module4 = mw.loader.require( 'test.module.require4' );
-
- assert.strictEqual( typeof module1, 'object', 'export of module with no export' );
- assert.strictEqual( module2, 1, 'export a number' );
- assert.strictEqual( module3(), 'hello world', 'export a function' );
- assert.strictEqual( typeof module4.pizza, 'function', 'export an object' );
- assert.strictEqual( module4.pizza(), 'hello world', 'module can require other modules' );
-
- assert.throws( function () {
- mw.loader.require( '_badmodule' );
- }, /is not loaded/, 'Requesting non-existent modules throws error.' );
+ return mw.loader.using( [ 'test.require1', 'test.require2', 'test.require3', 'test.require4' ] )
+ .then( function ( require ) {
+ var module1, module2, module3, module4;
+
+ module1 = require( 'test.require1' );
+ module2 = require( 'test.require2' );
+ module3 = require( 'test.require3' );
+ module4 = require( 'test.require4' );
+
+ assert.strictEqual( typeof module1, 'object', 'export of module with no export' );
+ assert.strictEqual( module2, 1, 'export a number' );
+ assert.strictEqual( module3(), 'hello world', 'export a function' );
+ assert.strictEqual( typeof module4.pizza, 'function', 'export an object' );
+ assert.strictEqual( module4.pizza(), 'hello world', 'module can require other modules' );
+
+ assert.throws( function () {
+ require( '_badmodule' );
+ }, /is not loaded/, 'Requesting non-existent modules throws error.' );
+ } );
} );
- QUnit.asyncTest( 'mw.loader require in debug mode', 1, function ( assert ) {
+ QUnit.test( 'mw.loader require() in debug mode', 1, function ( assert ) {
var path = mw.config.get( 'wgScriptPath' );
mw.loader.register( [
[ 'test.require.define', '0' ],
mw.loader.implement( 'test.require.callback', [ QUnit.fixurl( path + '/tests/qunit/data/requireCallMwLoaderTestCallback.js' ) ] );
mw.loader.implement( 'test.require.define', [ QUnit.fixurl( path + '/tests/qunit/data/defineCallMwLoaderTestCallback.js' ) ] );
- mw.loader.using( 'test.require.callback', function () {
- QUnit.start();
- var exported = mw.loader.require( 'test.require.callback' );
+ return mw.loader.using( 'test.require.callback' ).then( function ( require ) {
+ var exported = require( 'test.require.callback' );
assert.strictEqual( exported, 'Require worked.Define worked.',
'module.exports worked in debug mode' );
}, function () {
- QUnit.start();
assert.ok( false, 'Error callback fired while loader.using "test.require.callback" module' );
} );
} );