From: jenkins-bot Date: Tue, 21 Aug 2018 14:57:13 +0000 (+0000) Subject: Merge "Add Special:Search sort parameter without ui" X-Git-Tag: 1.34.0-rc.0~4353 X-Git-Url: http://git.cyclocoop.org/%22.%28%24lien.?a=commitdiff_plain;h=9171317645de4d31c61c570a9e4fa765e09ecc4d;hp=c6a83871b59d2bfb6a8c77160b37fbfb2ca8edd6;p=lhc%2Fweb%2Fwiklou.git Merge "Add Special:Search sort parameter without ui" --- diff --git a/.eslintrc.json b/.eslintrc.json index 844895d12c..da5d409765 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -11,6 +11,34 @@ "OO": false }, "rules": { + "no-restricted-properties": [ + 2, + { + "object": "$", + "property": "map", + "message": "Please use Array.prototype.map instead" + }, + { + "object": "$", + "property": "isArray", + "message": "Please use Array.isArray instead" + }, + { + "object": "$", + "property": "isFunction", + "message": "Please use typeof (e.g. typeof e === 'function') instead" + }, + { + "object": "$", + "property": "grep", + "message": "Please use Array.prototype.filter instead" + }, + { + "object": "$", + "property": "trim", + "message": "Please use String.prototype.trim instead" + } + ], "dot-notation": 0, "max-len": 0 } diff --git a/.mailmap b/.mailmap index 6c316171bd..f199b65457 100644 --- a/.mailmap +++ b/.mailmap @@ -24,6 +24,7 @@ [BOT] jenkins-bot [BOT] jenkins-bot [BOT] Translation updater bot +[BOT] libraryupgrader Aaron Schulz Aaron Schulz Adam Roses Wight diff --git a/.phpcs.xml b/.phpcs.xml index 2a34154689..944c3e20e1 100644 --- a/.phpcs.xml +++ b/.phpcs.xml @@ -22,7 +22,6 @@ - diff --git a/CREDITS b/CREDITS index d9bdc3d8f7..5e1c6ae768 100644 --- a/CREDITS +++ b/CREDITS @@ -94,6 +94,7 @@ The following list can be found parsed under Special:Version/Credits --> * Benny Situ * Bergi * Bertrand Grondin +* Bill Pirkle * Bill Traynor * Billinghurst * billm @@ -140,6 +141,7 @@ The following list can be found parsed under Special:Version/Credits --> * Conrad Irwin * Cormac Parle * cryptocoryne +* Daimona Eaytoy * Dan Barrett * Dan Collins * Dan Duvall @@ -191,6 +193,7 @@ The following list can be found parsed under Special:Version/Credits --> * dr0ptp4kt * Ebrahim Byagowi * Ed Sanders +* Ed Schouten * Eddie Greiner-Petter * Edward Chernenko * Edward Z. Yang @@ -250,6 +253,7 @@ The following list can be found parsed under Special:Version/Credits --> * glaisher * golopot * gopavasanth +* Greg Grossmeier * Greg Maxwell * Greg Sabino Mullane * Gregory Szorc @@ -257,6 +261,7 @@ The following list can be found parsed under Special:Version/Credits --> * Guillaume Blanchard * Guy Van den Broeck * Guycn2 +* Hagar Shilo * Haikal Izzuddin * HakanIST * Happy-melon @@ -285,6 +290,7 @@ The following list can be found parsed under Special:Version/Credits --> * Jacob Clark * jagori * Jaime Crespo +* Jakob Warkotsch * Jakub Vrana * James D. Forrester * James Earl Douglas @@ -356,6 +362,7 @@ The following list can be found parsed under Special:Version/Credits --> * kipod * kishanio * konarak +* Kosta Harlan * krishna keshav * Krzysztof Krzyzaniak * Krzysztof Zbudniewek @@ -519,7 +526,9 @@ The following list can be found parsed under Special:Version/Credits --> * OverlordQ * Owen Davis * Paa Kwesi Imbeah +* Pablo Grass * paladox +* Pankajeshkr * Patricio Molina * Patrick Reilly * Patrick Westerhoff @@ -592,6 +601,7 @@ The following list can be found parsed under Special:Version/Credits --> * Roman Tsukanov * Rotem Liss * Rowan Collins +* runntb * Russ Nelson * Russell Blau * Rusty Burchfield @@ -648,17 +658,21 @@ The following list can be found parsed under Special:Version/Credits --> * Stephan Muggli * Stephane Bisson * Stephen Liang +* Stephen Niedzielski * Steve Sanbeg * Steven Roddis * Steven Walling * Str4nd +* Strainu * Subin Siby * Subramanya Sastry * Sumit Asthana +* superyetkin * Suriyaa Kudo * svip * Szymon Świerkosz * T.D. Corell +* tacsipacsi * Tarquin * TerraCodes * Thalia Chan diff --git a/HISTORY b/HISTORY index 7540af3bca..bc74a6b700 100644 --- a/HISTORY +++ b/HISTORY @@ -4730,7 +4730,7 @@ This is a maintenance release of the MediaWiki 1.22 branch. === Changes since 1.22.9 === * (bug 64970) Fix support for blobs on DatabaseOracle::update -* (bug 60719) In MediaWiki 1.22, the job queue execution on each page request was changed (Gerrit change 59797) so, instead of executing the job inside the same PHP process that's rendering the page, a new PHP cli command is spawned to execute runJobs.php in the background. It will only work if $wgPhpCli is set to an actual path or safe mode is off, otherwise, the old method will be used. https://www.mediawiki.org/wiki/Manual:Job_queue#Changes_introduced_in_MediaWiki_1.22 for more infomation. This change was in earlier releases of 1.22 but was not noted here until now. +* (bug 60719) In MediaWiki 1.22, the job queue execution on each page request was changed (Gerrit change 59797) so, instead of executing the job inside the same PHP process that's rendering the page, a new PHP cli command is spawned to execute runJobs.php in the background. It will only work if $wgPhpCli is set to an actual path or safe mode is off, otherwise, the old method will be used. https://www.mediawiki.org/wiki/Manual:Job_queue#Changes_introduced_in_MediaWiki_1.22 for more information. This change was in earlier releases of 1.22 but was not noted here until now. == MediaWiki 1.22.9 == This is a security and maintenance release of the MediaWiki 1.22 branch. @@ -5808,7 +5808,7 @@ This is a security and maintenance release of the MediaWiki 1.20 branch. * Localisation updates from http://translatewiki.net. * mwdocgen.php: Implement --version option. * Remove svnstat stuff used in Doxygen generation -* (bug 43594) Correctly supress warnings that were missed after the upstream +* (bug 43594) Correctly suppress warnings that were missed after the upstream * PHP change to E_STRICT being included in E_ALL. == MediaWiki 1.20.4 == @@ -11905,7 +11905,7 @@ it from source control: https://www.mediawiki.org/wiki/Download_from_SVN * (bug 11082) Fix check for fully-specced table names in Database::tableName * (bug 11067) Fix regression in upload conflict thumbnail display * (bug 10985) Resolved cached entries on Special:DoubleRedirects were being - supressed, breaking paging - now strikes out "fixed" results + suppressed, breaking paging - now strikes out "fixed" results * (bug 8393) and need to be preserved (without attributes) for entries in the table of contents * (bug 11114) Fix regression in read-only mode error display during editing @@ -16315,7 +16315,7 @@ pages for purposes of page relevancy ranking. * (bug 1241) Don't show 'cont.' for first entry of the category list * (bug 1240) Special:Preferences was broken in Slovenian locale when $wgUseDynamicDates is enabled -* Added magic word MAG_NOCONTENTCONVERT to supress the conversion of the +* Added magic word MAG_NOCONTENTCONVERT to suppress the conversion of the content of an article. Useful in zh: * write-lock for updating the zh conversion tables in memcache * recursively parse subpages of MediaWiki:Zhconversiontable diff --git a/RELEASE-NOTES-1.32 b/RELEASE-NOTES-1.32 index 006476f7e8..3a1cc88fde 100644 --- a/RELEASE-NOTES-1.32 +++ b/RELEASE-NOTES-1.32 @@ -37,6 +37,9 @@ production. sitewide CSS/JS (and editing other users' CSS/JS). No other group has 'editsitecss', 'editusercss', 'editsitejs' or 'edituserjs' by default. * A new grant group, 'editsiteconfig', is added for granting the above rights. +* The $wgPasswordSenderName setting, ignored since 1.23 by MediaWiki and almost + all extensions, is no longer set at all. Instead, you can modify the system + message `emailsender`. === New features in 1.32 === * (T112474) Generalized the ResourceLoader mechanism for overriding modules @@ -68,6 +71,10 @@ production. additional links to the subtitle of a history page. * The 'GetLinkColours' hook now receives an additional $title parameter, the Title object of the page being parsed, on which the links will be shown. +* (T194731) DifferenceEngine supports multiple slots. Added SlotDiffRenderer to + render diffs between two Content objects, and DifferenceEngine::setRevisions() + to render diffs between two custom (potentially multi-content) revisions. + Added GetSlotDiffRenderer hook which works like GetDifferenceEngine for slots. === External library changes in 1.32 === * … @@ -80,9 +87,11 @@ production. * Updated mediawiki/mediawiki-codesniffer from v20.0.0 to v21.0.0. * Updated composer/spdx-licenses from 1.3.0 to 1.4.0. * Updated jquery.i18n from 1.0.4 to 1.0.5. +* Updated wikimedia/timestamp from 1.0.0 to 2.0.0. +* Updated wikimedia/remex-html from 1.0.3 to 2.0.0. ==== New external libraries ==== -* Added wikimedia/xmp-reader 0.5.1 +* Added wikimedia/xmp-reader 0.6.0 * … ==== Removed and replaced external libraries ==== @@ -150,6 +159,8 @@ because of Phabricator reports. * (T195940) Added language support for Batak Mandailing (btm). * (T137491) Added language support for Standard Moroccan Amazigh (zgh). * (T198132) Added language support for Manipuri (mni). +* (T201276) Added language support for Western Armenian (hyw). +* (T201583) Added language support for Mon (mnw). === Breaking changes in 1.32 === * $wgRequestTime, deprecated in 1.25, was removed. Use @@ -190,6 +201,7 @@ because of Phabricator reports. * The mediawiki.widgets.visibleByteLimit module alias, deprecated in 1.32, was removed. Use mediawiki.widgets.visibleLengthLimit instead. * The jquery.farbtastic module, unused since 1.18, was removed. +* The 'jquery.expandableField' module, unused since 1.22, was removed. * (T181318) The $wgStyleVersion setting and its appendage to various script and style URLs in OutputPage, deprecated in 1.31, was removed. * The hooks 'PreferencesFormPreSave' and 'PreferencesGetLegend' may provide @@ -204,6 +216,9 @@ because of Phabricator reports. * (T140807) The wgResourceLoaderLESSImportPaths configuration option was removed from ResourceLoader. Instead, use `@import` statements in LESS to import files directly from nearby directories within the same project. +* (T140804) The wgResourceLoaderLESSVars configuration option, deprecated + since 1.30, was removed. Instead, to expose variables from PHP to LESS, use + the ResourceLoaderModule::getLessVars() method. * The protected methods PHPSessionHandler::returnSuccess() and returnFailure(), only needed for PHP5 compatibility, have been removed. It now uses the boolean values `true` and `false` respectively. @@ -240,6 +255,10 @@ because of Phabricator reports. * MagicWord::clearCache() has been removed. Instead, create a new MagicWordFactory, such as by calling resetServiceForTesting( 'MagicWordFactory' ) on a MediaWikiServices. +* mw.util.init() has been removed. This function is not needed anymore and was + a no-op function since 1.30. +* SpecialPageFactory::resetList() is a no-op. Call overrideMwServices() + instead. === Deprecations in 1.32 === * Use of a StartProfiler.php file is deprecated in favour of placing @@ -328,20 +347,42 @@ because of Phabricator reports. Set $wgShowExceptionDetails and/or $wgShowHostnames instead. * The $wgShowDBErrorBacktrace global is deprecated and nonfunctional. Set $wgShowExceptionDetails instead. -* Public access to the DifferenceEngine properties mOldid, mNewid, mOldPage, - mNewPage, mOldContent, mNewContent, mRevisionsLoaded, mTextLoaded and - mCacheHit is deprecated. Use getOldid() / getNewid() for the first two, - do your own lookup for page/content. mNewRev / mOldRev remains public. +* Public access to the DifferenceEngine properties mOldid, mNewid, mOldRev, + mNewRev, mOldPage, mNewPage, mOldContent, mNewContent, mRevisionsLoaded, + mTextLoaded and mCacheHit is deprecated. Use getOldid() / getNewid() / + getOldRevision() / getNewRevision() for the first four (note that the + revision ones return a RevisionRecord, not a Revision), do your own lookup + for page/content. * The $wgExternalDiffEngine value 'wikidiff2' is deprecated. To use wikidiff2 just enable the PHP extension, and it will be autodetected. +* (T194731) DifferenceEngine properties mOldContent and mNewContent and methods + setContent(), generateContentDiffBody(), generateTextDiffBody() and textDiff() + are deprecated. To interact with a single slot, use a SlotDiffRenderer (and + subclass it to customize diff rendering); to diff custom (e.g. unsaved) + content, use setRevisions(). Subclassing DifferenceEngine should only be done + to customize page-level diff properties (such as the navigation header). * The wfUseMW function, soft-deprecated in 1.26, is now hard deprecated. * All MagicWord static methods are now deprecated. Use the MagicWordFactory methods instead. +* PasswordFactory::init is deprecated. To get a password factory with the + standard configuration, use MediaWikiServices::getPasswordFactory. +* $wgContLang is deprecated, use MediaWikiServices::getContentLanguage() + instead. +* $wgParser is deprecated, use MediaWikiServices::getParser() instead. +* wfGetMainCache() is deprecated, use ObjectCache::getLocalClusterInstance() + instead. +* wfGetCache() is deprecated, use ObjectCache::getInstance() instead. +* All SpecialPageFactory static methods are deprecated. Instead, call the + methods on a SpecialPageFactory instance, which may be obtained from + MediaWikiServices. === Other changes in 1.32 === * (T198811) The following tables have had their UNIQUE indexes turned into proper PRIMARY KEYs for increased maintainability: interwiki, page_props, protected_titles and site_identifiers. +* OOUI HTMLForm will now display help text inline after the input field, + rather than in a popup. Previous behavior can be restored by using + `'help-inline' => false`. * … == Compatibility == diff --git a/autoload.php b/autoload.php index b5b5c52060..8679827dcb 100644 --- a/autoload.php +++ b/autoload.php @@ -195,11 +195,13 @@ $wgAutoloadLocalClasses = [ 'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php', 'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php', 'BenchmarkJSMinPlus' => __DIR__ . '/maintenance/benchmarks/benchmarkJSMinPlus.php', + 'BenchmarkJavaScriptMinifier' => __DIR__ . '/maintenance/benchmarks/benchmarkJavaScriptMinifier.php', 'BenchmarkLruHash' => __DIR__ . '/maintenance/benchmarks/benchmarkLruHash.php', 'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php', 'BenchmarkPurge' => __DIR__ . '/maintenance/benchmarks/benchmarkPurge.php', 'BenchmarkSanitizer' => __DIR__ . '/maintenance/benchmarks/benchmarkSanitizer.php', 'BenchmarkTidy' => __DIR__ . '/maintenance/benchmarks/benchmarkTidy.php', + 'BenchmarkTitleValue' => __DIR__ . '/maintenance/benchmarks/benchmarkTitleValue.php', 'Benchmarker' => __DIR__ . '/maintenance/benchmarks/Benchmarker.php', 'BitmapHandler' => __DIR__ . '/includes/media/BitmapHandler.php', 'BitmapHandler_ClientOnly' => __DIR__ . '/includes/media/BitmapHandler_ClientOnly.php', @@ -378,6 +380,7 @@ $wgAutoloadLocalClasses = [ 'DeleteEqualMessages' => __DIR__ . '/maintenance/deleteEqualMessages.php', 'DeleteFileOp' => __DIR__ . '/includes/libs/filebackend/fileop/DeleteFileOp.php', 'DeleteLinksJob' => __DIR__ . '/includes/jobqueue/jobs/DeleteLinksJob.php', + 'DeleteLocalPasswords' => __DIR__ . '/maintenance/includes/DeleteLocalPasswords.php', 'DeleteLogFormatter' => __DIR__ . '/includes/logging/DeleteLogFormatter.php', 'DeleteOldRevisions' => __DIR__ . '/maintenance/deleteOldRevisions.php', 'DeleteOrphanedRevisions' => __DIR__ . '/maintenance/deleteOrphanedRevisions.php', @@ -402,6 +405,7 @@ $wgAutoloadLocalClasses = [ 'DiffOpCopy' => __DIR__ . '/includes/diff/DairikiDiff.php', 'DiffOpDelete' => __DIR__ . '/includes/diff/DairikiDiff.php', 'DifferenceEngine' => __DIR__ . '/includes/diff/DifferenceEngine.php', + 'DifferenceEngineSlotDiffRenderer' => __DIR__ . '/includes/diff/DifferenceEngineSlotDiffRenderer.php', 'Digit2Html' => __DIR__ . '/maintenance/language/digit2html.php', 'DjVuHandler' => __DIR__ . '/includes/media/DjVuHandler.php', 'DjVuImage' => __DIR__ . '/includes/media/DjVuImage.php', @@ -927,6 +931,7 @@ $wgAutoloadLocalClasses = [ 'MediaWiki\\Search\\ParserOutputSearchDataExtractor' => __DIR__ . '/includes/search/ParserOutputSearchDataExtractor.php', 'MediaWiki\\ShellDisabledError' => __DIR__ . '/includes/exception/ShellDisabledError.php', 'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php', + 'MediaWiki\\Special\\SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory.php', 'MediaWiki\\User\\UserIdentity' => __DIR__ . '/includes/user/UserIdentity.php', 'MediaWiki\\User\\UserIdentityValue' => __DIR__ . '/includes/user/UserIdentityValue.php', 'MediaWiki\\Widget\\ComplexNamespaceInputWidget' => __DIR__ . '/includes/widget/ComplexNamespaceInputWidget.php', @@ -1011,7 +1016,6 @@ $wgAutoloadLocalClasses = [ 'NewUsersLogFormatter' => __DIR__ . '/includes/logging/NewUsersLogFormatter.php', 'NoWriteWatchedItemStore' => __DIR__ . '/includes/watcheditem/NoWriteWatchedItemStore.php', 'NolinesImageGallery' => __DIR__ . '/includes/gallery/NolinesImageGallery.php', - 'NorthernSamiUppercaseCollation' => __DIR__ . '/includes/collation/NorthernSamiUppercaseCollation.php', 'NotRecursiveIterator' => __DIR__ . '/includes/libs/iterators/NotRecursiveIterator.php', 'NukeNS' => __DIR__ . '/maintenance/nukeNS.php', 'NukePage' => __DIR__ . '/maintenance/nukePage.php', @@ -1078,6 +1082,7 @@ $wgAutoloadLocalClasses = [ 'Parser' => __DIR__ . '/includes/parser/Parser.php', 'ParserCache' => __DIR__ . '/includes/parser/ParserCache.php', 'ParserDiffTest' => __DIR__ . '/includes/parser/ParserDiffTest.php', + 'ParserFactory' => __DIR__ . '/includes/parser/ParserFactory.php', 'ParserOptions' => __DIR__ . '/includes/parser/ParserOptions.php', 'ParserOutput' => __DIR__ . '/includes/parser/ParserOutput.php', 'ParsoidVirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/ParsoidVirtualRESTService.php', @@ -1128,6 +1133,7 @@ $wgAutoloadLocalClasses = [ 'PreferencesFormLegacy' => __DIR__ . '/includes/specials/forms/PreferencesFormLegacy.php', 'PreferencesFormOOUI' => __DIR__ . '/includes/specials/forms/PreferencesFormOOUI.php', 'PrefixSearch' => __DIR__ . '/includes/PrefixSearch.php', + 'PrefixingStatsdDataFactoryProxy' => __DIR__ . '/includes/libs/stats/PrefixingStatsdDataFactoryProxy.php', 'PreprocessDump' => __DIR__ . '/maintenance/preprocessDump.php', 'Preprocessor' => __DIR__ . '/includes/parser/Preprocessor.php', 'Preprocessor_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php', @@ -1338,6 +1344,7 @@ $wgAutoloadLocalClasses = [ 'SkinFallbackTemplate' => __DIR__ . '/includes/skins/SkinFallbackTemplate.php', 'SkinTemplate' => __DIR__ . '/includes/skins/SkinTemplate.php', 'SlideshowImageGallery' => __DIR__ . '/includes/gallery/SlideshowImageGallery.php', + 'SlotDiffRenderer' => __DIR__ . '/includes/diff/SlotDiffRenderer.php', 'SpecialActiveUsers' => __DIR__ . '/includes/specials/SpecialActiveusers.php', 'SpecialAllMessages' => __DIR__ . '/includes/specials/SpecialAllMessages.php', 'SpecialAllMyUploads' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php', @@ -1389,7 +1396,7 @@ $wgAutoloadLocalClasses = [ 'SpecialPage' => __DIR__ . '/includes/specialpage/SpecialPage.php', 'SpecialPageAction' => __DIR__ . '/includes/actions/SpecialPageAction.php', 'SpecialPageData' => __DIR__ . '/includes/specials/SpecialPageData.php', - 'SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory.php', + 'SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory_deprecated.php', 'SpecialPageLanguage' => __DIR__ . '/includes/specials/SpecialPageLanguage.php', 'SpecialPagesWithProp' => __DIR__ . '/includes/specials/SpecialPagesWithProp.php', 'SpecialPasswordPolicies' => __DIR__ . '/includes/specials/SpecialPasswordPolicies.php', @@ -1470,6 +1477,7 @@ $wgAutoloadLocalClasses = [ 'TextContent' => __DIR__ . '/includes/content/TextContent.php', 'TextContentHandler' => __DIR__ . '/includes/content/TextContentHandler.php', 'TextPassDumper' => __DIR__ . '/maintenance/dumpTextPass.php', + 'TextSlotDiffRenderer' => __DIR__ . '/includes/diff/TextSlotDiffRenderer.php', 'TextStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php', 'TgConverter' => __DIR__ . '/languages/classes/LanguageTg.php', 'ThrottledError' => __DIR__ . '/includes/exception/ThrottledError.php', @@ -1678,6 +1686,7 @@ $wgAutoloadLocalClasses = [ 'Wikimedia\\Rdbms\\SessionConsistentConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php', 'Wikimedia\\Rdbms\\Subquery' => __DIR__ . '/includes/libs/rdbms/encasing/Subquery.php', 'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php', + 'Wikimedia\\StaticArrayWriter' => __DIR__ . '/includes/libs/StaticArrayWriter.php', 'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php', 'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php', 'WikitextLogFormatter' => __DIR__ . '/includes/logging/WikitextLogFormatter.php', diff --git a/composer.json b/composer.json index dbc59a203b..454e27c6ac 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "ext-mbstring": "*", "ext-xml": "*", "liuggio/statsd-php-client": "1.0.18", - "oojs/oojs-ui": "0.27.5", + "oojs/oojs-ui": "0.28.0", "oyejorge/less.php": "1.7.0.14", "pear/mail": "1.4.1", "pear/mail_mime": "1.10.2", @@ -44,14 +44,14 @@ "wikimedia/php-session-serializer": "1.0.6", "wikimedia/purtle": "1.0.7", "wikimedia/relpath": "2.1.1", - "wikimedia/remex-html": "1.0.3", + "wikimedia/remex-html": "2.0.0", "wikimedia/running-stat": "1.2.1", "wikimedia/scoped-callback": "2.0.0", "wikimedia/utfnormal": "2.0.0", - "wikimedia/timestamp": "1.0.0", + "wikimedia/timestamp": "2.0.0", "wikimedia/wait-condition-loop": "1.0.1", "wikimedia/wrappedstring": "3.0.1", - "wikimedia/xmp-reader": "0.5.1", + "wikimedia/xmp-reader": "0.6.0", "zordius/lightncandy": "0.23" }, "require-dev": { diff --git a/docs/export-demo.xml b/docs/export-demo.xml index 93b237ffc6..2e2e459038 100644 --- a/docs/export-demo.xml +++ b/docs/export-demo.xml @@ -27,7 +27,7 @@ User User talk DemoWiki - DemoWIki talk + DemoWiki talk File File talk MediaWiki diff --git a/docs/extension.schema.v1.json b/docs/extension.schema.v1.json index a8f66c95ca..c9a887dd9c 100644 --- a/docs/extension.schema.v1.json +++ b/docs/extension.schema.v1.json @@ -342,10 +342,6 @@ "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" diff --git a/docs/extension.schema.v2.json b/docs/extension.schema.v2.json index c9d33e1898..24212a9a54 100644 --- a/docs/extension.schema.v2.json +++ b/docs/extension.schema.v2.json @@ -355,10 +355,6 @@ "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" diff --git a/docs/hooks.txt b/docs/hooks.txt index 219c51f30e..9cb22d23ed 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -1670,15 +1670,13 @@ $title: Title object that we need to get a sortkey for &$sortkey: Sortkey to use. 'GetDifferenceEngine': Called when getting a new difference engine interface -object Return false for valid object in $differenceEngine or true for the -default difference engine. +object. Can be used to decorate or replace the default difference engine. $context: IContextSource context to be used for diff $old: Revision ID to show and diff with $new: Either a revision ID or one of the strings 'cur', 'prev' or 'next' $refreshCache: If set, refreshes the diff cache $unhide: If set, allow viewing deleted revs -&$differenceEngine: output parameter, difference engine object to be used for - diff +&$differenceEngine: The difference engine object to be used for the diff 'GetDoubleUnderscoreIDs': Modify the list of behavior switch (double underscore) magic words. Called by MagicWord. @@ -1785,6 +1783,12 @@ $relativeTo: MWTimestamp object of the relative (user-adjusted) timestamp $user: User whose preferences are being used to make timestamp $lang: Language that will be used to render the timestamp +'GetSlotDiffRenderer': Replace or wrap the standard SlotDiffRenderer for some +content type. +$contentHandler: ContentHandler for which the slot diff renderer is fetched. +&$slotDiffRenderer: SlotDiffRenderer to change or replace. +$context: IContextSource + 'getUserPermissionsErrors': Add a permissions error when permissions errors are checked for. Use instead of userCan for most cases. Return false if the user can't do it, and populate $result with the reason in the form of diff --git a/docs/php-memcached/Documentation b/docs/php-memcached/Documentation index 32e340ac31..6a0dce673a 100644 --- a/docs/php-memcached/Documentation +++ b/docs/php-memcached/Documentation @@ -130,7 +130,7 @@ MemCachedClient::set_debug($do_debug); MemCachedClient::forget_dead_hosts(); // When a function returns FALSE, an error code is set. -// This funtion will return the error code. +// This function will return the error code. // See error_string() // returns last error code set MemCachedClient::error() diff --git a/docs/scripts.txt b/docs/scripts.txt index dff428c5a2..b2501d4469 100644 --- a/docs/scripts.txt +++ b/docs/scripts.txt @@ -28,19 +28,9 @@ Primary scripts: that points to the search engines of the wiki. profileinfo.php - Allow users to see the profiling information that are stored in the - database. - - To save the profiling information in the database (required to use this - script), you have to modify StartProfiler.php to use the Profiler class and - not the stub profiler which is enabled by default. - You will also need to set $wgProfiler['output'] to 'db' in LocalSettings.php - to force the profiler to save the informations in the database and apply the - maintenance/archives/patch-profiling.sql patch to the database. - - To enable the profileinfo.php itself, you'll need to set $wgDBadminuser - and $wgDBadminpassword in your LocalSettings.php, as well as $wgEnableProfileInfo - See also https://www.mediawiki.org/wiki/Manual:Profiling . + Simple interface for displaying request profiles that were stored in the + database. For more information, see the documentation in that file, and at + https://www.mediawiki.org/wiki/Manual:Profiling. thumb.php Script used to resize images if it is configured to be done when the web diff --git a/includes/ActorMigration.php b/includes/ActorMigration.php index 161c7a923b..51dfa60a0b 100644 --- a/includes/ActorMigration.php +++ b/includes/ActorMigration.php @@ -220,7 +220,7 @@ class ActorMigration { * @param UserIdentity $user User to set in the update * @return array with two values: * - array to merge into `$values` to `IDatabase->update()` or `$a` to `IDatabase->insert()` - * - callback to call with the the primary key for the main table insert + * - callback to call with the primary key for the main table insert * and extra fields needed for the temp table. */ public function getInsertValuesWithTempTable( IDatabase $dbw, $key, UserIdentity $user ) { diff --git a/includes/CategoriesRdf.php b/includes/CategoriesRdf.php index fc296d4c32..eb601a20ae 100644 --- a/includes/CategoriesRdf.php +++ b/includes/CategoriesRdf.php @@ -85,6 +85,10 @@ class CategoriesRdf { * @param int $subcategories Subcategory count */ public function writeCategoryData( $categoryName, $isHidden, $pages, $subcategories ) { + if ( $pages < 0 ) { + // Bugfix for T201119 + $pages = 0; + } $title = Title::makeTitle( NS_CATEGORY, $categoryName ); $this->rdfWriter->about( $this->titleToUrl( $title ) ) ->say( 'a' ) diff --git a/includes/CategoryViewer.php b/includes/CategoryViewer.php index 79ab8b4463..46a1473a91 100644 --- a/includes/CategoryViewer.php +++ b/includes/CategoryViewer.php @@ -221,8 +221,6 @@ class CategoryViewer extends ContextSource { * @return string */ function getSubcategorySortChar( $title, $sortkey ) { - global $wgContLang; - if ( $title->getPrefixedText() == $sortkey ) { $word = $title->getDBkey(); } else { @@ -231,7 +229,7 @@ class CategoryViewer extends ContextSource { $firstChar = $this->collation->getFirstLetter( $word ); - return $wgContLang->convert( $firstChar ); + return MediaWikiServices::getInstance()->getContentLanguage()->convert( $firstChar ); } /** @@ -242,7 +240,6 @@ class CategoryViewer extends ContextSource { * @param bool $isRedirect */ function addImage( Title $title, $sortkey, $pageLength, $isRedirect = false ) { - global $wgContLang; if ( $this->showGallery ) { $flip = $this->flip['file']; if ( $flip ) { @@ -253,8 +250,8 @@ class CategoryViewer extends ContextSource { } else { $this->imgsNoGallery[] = $this->generateLink( 'image', $title, $isRedirect ); - $this->imgsNoGallery_start_char[] = $wgContLang->convert( - $this->collation->getFirstLetter( $sortkey ) ); + $this->imgsNoGallery_start_char[] = MediaWikiServices::getInstance()-> + getContentLanguage()->convert( $this->collation->getFirstLetter( $sortkey ) ); } } @@ -266,12 +263,10 @@ class CategoryViewer extends ContextSource { * @param bool $isRedirect */ function addPage( $title, $sortkey, $pageLength, $isRedirect = false ) { - global $wgContLang; - $this->articles[] = $this->generateLink( 'page', $title, $isRedirect ); - $this->articles_start_char[] = $wgContLang->convert( - $this->collation->getFirstLetter( $sortkey ) ); + $this->articles_start_char[] = MediaWikiServices::getInstance()-> + getContentLanguage()->convert( $this->collation->getFirstLetter( $sortkey ) ); } function finaliseCategoryState() { diff --git a/includes/CommentStore.php b/includes/CommentStore.php index d03a00eb1f..bf3e3d6608 100644 --- a/includes/CommentStore.php +++ b/includes/CommentStore.php @@ -98,7 +98,7 @@ class CommentStore { /** * @param Language $lang Language to use for comment truncation. Defaults - * to $wgContLang. + * to content language. * @param int $migrationStage One of the MIGRATION_* constants */ public function __construct( Language $lang, $migrationStage ) { @@ -114,10 +114,11 @@ class CommentStore { * @return CommentStore */ public static function newKey( $key ) { - global $wgCommentTableSchemaMigrationStage, $wgContLang; + global $wgCommentTableSchemaMigrationStage; // TODO uncomment once not used in extensions // wfDeprecated( __METHOD__, '1.31' ); - $store = new CommentStore( $wgContLang, $wgCommentTableSchemaMigrationStage ); + $store = new CommentStore( MediaWikiServices::getInstance()->getContentLanguage(), + $wgCommentTableSchemaMigrationStage ); $store->key = $key; return $store; } diff --git a/includes/CommentStoreComment.php b/includes/CommentStoreComment.php index 7ed86d66c7..af866cdce7 100644 --- a/includes/CommentStoreComment.php +++ b/includes/CommentStoreComment.php @@ -19,6 +19,7 @@ * * @file */ +use MediaWiki\MediaWikiServices; /** * CommentStoreComment represents a comment stored by CommentStore. The fields @@ -63,8 +64,6 @@ class CommentStoreComment { * @return CommentStoreComment */ public static function newUnsavedComment( $comment, array $data = null ) { - global $wgContLang; - if ( $comment instanceof CommentStoreComment ) { return $comment; } @@ -79,7 +78,8 @@ class CommentStoreComment { if ( $comment instanceof Message ) { $message = clone $comment; - $text = $message->inLanguage( $wgContLang ) // Avoid $wgForceUIMsgAsContentMsg + // Avoid $wgForceUIMsgAsContentMsg + $text = $message->inLanguage( MediaWikiServices::getInstance()->getContentLanguage() ) ->setInterfaceMessageFlag( true ) ->text(); return new CommentStoreComment( null, $text, $message, $data ); diff --git a/includes/ContentSecurityPolicy.php b/includes/ContentSecurityPolicy.php index 91117f4e36..62160461c9 100644 --- a/includes/ContentSecurityPolicy.php +++ b/includes/ContentSecurityPolicy.php @@ -27,8 +27,6 @@ class ContentSecurityPolicy { const REPORT_ONLY_MODE = 1; const FULL_MODE = 2; - /** Used for meta tag. Does not include report urls or nonce sources */ - const FULL_MODE_RESTRICTED = 3; /** @var string The nonce to use for inline scripts (from OutputPage) */ private $nonce; @@ -65,20 +63,6 @@ class ContentSecurityPolicy { } } - /** - * Return the meta header to use for after load restricted mode - * - * This should restrict browsers that don't support nonce-sources. - * Idea stolen from - * https://blogs.dropbox.com/tech/2015/09/unsafe-inline-and-nonce-deployment/ - * - * @param array $csp CSP configuration - * @return string Content for meta tag - */ - public function getMetaHeader( $csp ) { - return $this->makeCSPDirectives( $csp, self::FULL_MODE_RESTRICTED ); - } - /** * Send CSP headers based on wiki config * @@ -100,39 +84,13 @@ class ContentSecurityPolicy { $csp->sendCSPHeader( $cspConfig, self::FULL_MODE ); $csp->sendCSPHeader( $cspConfigReportOnly, self::REPORT_ONLY_MODE ); - // Include header which increases security level after initial load. - // This helps mitigate attacks on browsers not supporting CSP2. It also - // helps mitigate attacks due to the shared nonce that non-logged in users - // get due to varnish cache. - // Unclear if this is the best place to insert the meta tag, or if - // it should be in a RL module. I figure its best to do this as early - // as possible. - // FIXME: Needs testing to see if this actually works properly - $metaHeader = $csp->getMetaHeader( $cspConfig ); - if ( $metaHeader ) { - $context->getOutput()->addScript( - ResourceLoader::makeInlineScript( - $csp->makeMetaInsertScript( - $metaHeader - ), - $out->getCSPNonce() - ) - ); - } - } - - /** - * Makes javascript to insert a meta CSP header after page load - * - * @see https://blogs.dropbox.com/tech/2015/09/unsafe-inline-and-nonce-deployment/ - * @param string $metaContents content of meta tag - * @return string JS for including in page - */ - private function makeMetaInsertScript( $metaContents ) { - return "$('\\x3Cmeta http-equiv=\"Content-Security-Policy\"\\x3E')" . - '.attr("content",' . - Xml::encodeJsVar( $metaContents ) . - ').prependTo($("head"))'; + // This used to insert a tag here, per advice at + // https://blogs.dropbox.com/tech/2015/09/unsafe-inline-and-nonce-deployment/ + // The goal was to prevent nonce from working after the page hit onready, + // This would help in old browsers that didn't support nonces, and + // also assist for varnish-cached pages which repeat nonces. + // However, this is incompatible with how resource loader storage works + // via mw.domEval() so it was removed. } /** @@ -140,7 +98,6 @@ class ContentSecurityPolicy { * * @param int $reportOnly Either self::REPORT_ONLY_MODE or self::FULL_MODE * @return string Name of http header - * @throws UnexpectedValueException if you feed it self::FULL_MODE_RESTRICTED. */ private function getHeaderName( $reportOnly ) { if ( $reportOnly === self::REPORT_ONLY_MODE ) { @@ -155,7 +112,7 @@ class ContentSecurityPolicy { * Determine what CSP policies to set for this page * * @param array|bool $config Policy configuration (Either $wgCSPHeader or $wgCSPReportOnlyHeader) - * @param int $mode self::REPORT_ONLY_MODE, self::FULL_MODE or Self::FULL_MODE_RESTRICTED + * @param int $mode self::REPORT_ONLY_MODE, self::FULL_MODE * @return string Policy directives, or empty string for no policy. */ private function makeCSPDirectives( $policyConfig, $mode ) { @@ -182,13 +139,10 @@ class ContentSecurityPolicy { $cssSrc = false; $imgSrc = false; $scriptSrc = [ "'unsafe-eval'", "'self'" ]; - if ( - $mode !== self::FULL_MODE_RESTRICTED && - ( !isset( $policyConfig['useNonces'] ) || $policyConfig['useNonces'] ) - ) { - $nonceSrc = "'nonce-" . $this->nonce . "'"; - $scriptSrc[] = $nonceSrc; + if ( !isset( $policyConfig['useNonces'] ) || $policyConfig['useNonces'] ) { + $scriptSrc[] = "'nonce-" . $this->nonce . "'"; } + $scriptSrc = array_merge( $scriptSrc, $additionalSelfUrlsScript ); if ( isset( $policyConfig['script-src'] ) && is_array( $policyConfig['script-src'] ) @@ -200,7 +154,6 @@ class ContentSecurityPolicy { // Note: default on if unspecified. if ( ( !isset( $policyConfig['unsafeFallback'] ) || $policyConfig['unsafeFallback'] ) - && $mode !== self::FULL_MODE_RESTRICTED ) { // unsafe-inline should be ignored on browsers // that support 'nonce-foo' sources. @@ -247,10 +200,7 @@ class ContentSecurityPolicy { $cssSrc = array_merge( $defaultSrc, [ "'unsafe-inline'" ] ); } - if ( $mode === self::FULL_MODE_RESTRICTED ) { - // report-uri disallowed in tags. - $reportUri = false; - } elseif ( isset( $policyConfig['report-uri'] ) && $policyConfig['report-uri'] !== true ) { + if ( isset( $policyConfig['report-uri'] ) && $policyConfig['report-uri'] !== true ) { if ( $policyConfig['report-uri'] === false ) { $reportUri = false; } else { @@ -311,14 +261,11 @@ class ContentSecurityPolicy { /** * Get the default report uri. * - * @param int $mode self::*_MODE constant. Do not use with self::FULL_MODE_RESTRICTED + * @param int $mode self::*_MODE constant. * @return string The URI to send reports to. * @throws UnexpectedValueException if given invalid mode. */ private function getReportUri( $mode ) { - if ( $mode === self::FULL_MODE_RESTRICTED ) { - throw new UnexpectedValueException( $mode ); - } $apiArguments = [ 'action' => 'cspreport', 'format' => 'json' diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 27769f973d..fdac10a53e 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -1646,13 +1646,6 @@ $wgEmergencyContact = false; */ $wgPasswordSender = false; -/** - * Sender name for e-mail notifications. - * - * @deprecated since 1.23; use the system message 'emailsender' instead. - */ -$wgPasswordSenderName = 'MediaWiki Mail'; - /** * Reply-To address for e-mail notifications. * @@ -3799,48 +3792,6 @@ $wgResourceLoaderMaxQueryLength = false; */ $wgResourceLoaderValidateJS = true; -/** - * If set to true, statically-sourced (file-backed) JavaScript resources will - * be parsed for validity before being bundled up into ResourceLoader modules. - * - * This can be helpful for development by providing better error messages in - * default (non-debug) mode, but JavaScript parsing is slow and memory hungry - * and may fail on large pre-bundled frameworks. - */ -$wgResourceLoaderValidateStaticJS = false; - -/** - * Global LESS variables. An associative array binding variable names to - * LESS code snippets representing their values. - * - * Adding an item here is equivalent to writing `@variable: value;` - * at the beginning of all your .less files, with all the consequences. - * In particular, string values must be escaped and quoted. - * - * Changes to this configuration do NOT trigger cache invalidation. - * - * @par Example: - * @code - * $wgResourceLoaderLESSVars = [ - * 'exampleFontSize' => '1em', - * 'exampleBlue' => '#36c', - * ]; - * @endcode - * @since 1.22 - * @deprecated since 1.30 Use ResourceLoaderModule::getLessVars() instead to - * add variables to individual modules that need them. - */ -$wgResourceLoaderLESSVars = [ - /** - * Minimum available screen width at which a device can be considered a tablet - * The number is currently based on the device width of a Samsung Galaxy S5 mini and is low - * enough to cover iPad (768px). Number is prone to change with new information. - * @since 1.27 - * @deprecated 1.31 Use mediawiki.ui/variables instead - */ - 'deviceWidthTablet' => '720px', -]; - /** * Whether ResourceLoader should attempt to persist modules in localStorage on * browsers that support the Web Storage API. @@ -6189,24 +6140,28 @@ $wgTrxProfilerLimits = [ 'GET' => [ 'masterConns' => 0, 'writes' => 0, - 'readQueryTime' => 5 + 'readQueryTime' => 5, + 'readQueryRows' => 10000 ], // HTTP POST requests. // Master reads and writes will happen for a subset of these. 'POST' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, + 'readQueryRows' => 100000, 'maxAffected' => 1000 ], 'POST-nonwrite' => [ 'masterConns' => 0, 'writes' => 0, - 'readQueryTime' => 5 + 'readQueryTime' => 5, + 'readQueryRows' => 10000 ], // Deferred updates that run after HTTP response is sent for GET requests 'PostSend-GET' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, + 'readQueryRows' => 10000, 'maxAffected' => 1000, // Log master queries under the post-send entry point as they are discouraged 'masterConns' => 0, @@ -6216,12 +6171,14 @@ $wgTrxProfilerLimits = [ 'PostSend-POST' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, + 'readQueryRows' => 100000, 'maxAffected' => 1000 ], // Background job runner 'JobRunner' => [ 'readQueryTime' => 30, 'writeQueryTime' => 5, + 'readQueryRows' => 100000, 'maxAffected' => 500 // ballpark of $wgUpdateRowsPerQuery ], // Command-line scripts @@ -6437,6 +6394,13 @@ $wgDeprecationReleaseLimit = false; */ $wgProfiler = []; +/** + * Allow the profileinfo.php entrypoint to be used. + * + * @since 1.5.0 + */ +$wgEnableProfileInfo = false; + /** * Only record profiling info for pages that took longer than this * @deprecated since 1.25: set $wgProfiler['threshold'] instead. @@ -8820,7 +8784,7 @@ $wgSearchRunSuggestedQuery = true; * @since 1.27 * @var string path to file */ -$wgPopularPasswordFile = __DIR__ . '/../serialized/commonpasswords.cdb'; +$wgPopularPasswordFile = __DIR__ . '/password/commonpasswords.cdb'; /* * Max time (in seconds) a user-generated transaction can spend in writes. diff --git a/includes/EditPage.php b/includes/EditPage.php index 16f1c5ae4e..d1f874ead7 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -236,7 +236,7 @@ class EditPage { public $action = 'submit'; /** @var bool Whether an edit conflict needs to be resolved. Detected based on whether - * $editRevId is different from the current revision. When a conflict has successfully + * $editRevId is different than the latest revision. When a conflict has successfully * been resolved by a 3-way-merge, this field is set to false. */ public $isConflict = false; @@ -250,7 +250,10 @@ class EditPage { /** @var string */ public $formtype; - /** @var bool */ + /** @var bool + * True the first time the edit form is rendered, false after re-rendering + * with diff, save prompts, etc. + */ public $firsttime; /** @var bool|stdClass */ @@ -330,7 +333,9 @@ class EditPage { /** @var bool */ public $recreate = false; - /** @var string */ + /** @var string + * Page content input field. + */ public $textbox1 = ''; /** @var string */ @@ -339,18 +344,24 @@ class EditPage { /** @var string */ public $summary = ''; - /** @var bool */ + /** @var bool + * If true, hide the summary field. + */ public $nosummary = false; - /** @var string */ + /** @var string + * Timestamp of the latest revision of the page when editing was initiated + * on the client. + */ public $edittime = ''; - /** @var int ID of the current revision at the time editing was initiated on the client. - * This is used to detect and resolve edit conflicts. + /** @var int Revision ID of the latest revision of the page when editing + * was initiated on the client. This is used to detect and resolve edit + * conflicts. * * @note 0 if the page did not exist at that time. * @note When starting an edit from an old revision, this still records the current - * revision at the time , not the one the edit is based on. + * revision at the time, not the one the edit is based on. * * @see $oldid * @see getBaseRevision() @@ -363,10 +374,14 @@ class EditPage { /** @var string */ public $sectiontitle = ''; - /** @var string */ + /** @var string + * Timestamp from the first time the edit form was rendered. + */ public $starttime = ''; /** @var int Revision ID the edit is based on, or 0 if it's the current revision. + * FIXME: This isn't used in conflict resolution--provide a better + * justification or merge with parentRevId. * @see $editRevId */ public $oldid = 0; @@ -1156,8 +1171,6 @@ class EditPage { * @since 1.21 */ protected function getContentObject( $def_content = null ) { - global $wgContLang; - $content = false; $user = $this->context->getUser(); @@ -1220,7 +1233,8 @@ class EditPage { if ( $undoMsg === null ) { $oldContent = $this->page->getContent( Revision::RAW ); - $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang ); + $popts = ParserOptions::newFromUserAndLang( + $user, MediaWikiServices::getInstance()->getContentLanguage() ); $newContent = $content->preSaveTransform( $this->mTitle, $user, $popts ); if ( $newContent->getModel() !== $oldContent->getModel() ) { // The undo may change content @@ -3167,7 +3181,7 @@ ERROR; } /** - * Helper function for summary input functions, which returns the neccessary + * Helper function for summary input functions, which returns the necessary * attributes for the input. * * @param array|null $inputAttrs Array of attrs to use on the input @@ -3446,8 +3460,6 @@ ERROR; * save and then make a comparison. */ public function showDiff() { - global $wgContLang; - $oldtitlemsg = 'currentrev'; # if message does not exist, show diff against the preloaded default if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) { @@ -3477,7 +3489,8 @@ ERROR; Hooks::run( 'EditPageGetDiffContent', [ $this, &$newContent ] ); $user = $this->context->getUser(); - $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang ); + $popts = ParserOptions::newFromUserAndLang( $user, + MediaWikiServices::getInstance()->getContentLanguage() ); $newContent = $newContent->preSaveTransform( $this->mTitle, $user, $popts ); } @@ -3588,10 +3601,10 @@ ERROR; * Get the Limit report for page previews * * @since 1.22 - * @param ParserOutput $output ParserOutput object from the parse + * @param ParserOutput|null $output ParserOutput object from the parse * @return string HTML */ - public static function getPreviewLimitReport( $output ) { + public static function getPreviewLimitReport( ParserOutput $output = null ) { global $wgLang; if ( !$output || !$output->getLimitReportData() ) { @@ -3764,6 +3777,8 @@ ERROR; } /** + * Get the last log record of this page being deleted, if ever. This is + * used to detect whether a delete occured during editing. * @return bool|stdClass */ protected function getLastDelete() { @@ -4030,8 +4045,7 @@ ERROR; * @return string */ public static function getEditToolbar( $title = null ) { - global $wgContLang, $wgOut; - global $wgEnableUploads, $wgForeignFileRepos; + global $wgOut, $wgEnableUploads, $wgForeignFileRepos; $imagesAvailable = $wgEnableUploads || count( $wgForeignFileRepos ); $showSignature = true; @@ -4039,6 +4053,8 @@ ERROR; $showSignature = MWNamespace::wantSignatures( $title->getNamespace() ); } + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + /** * $toolarray is an array of arrays each of which includes the * opening tag, the closing tag, optionally a sample text that is @@ -4086,14 +4102,14 @@ ERROR; ], $imagesAvailable ? [ 'id' => 'mw-editbutton-image', - 'open' => '[[' . $wgContLang->getNsText( NS_FILE ) . ':', + 'open' => '[[' . $contLang->getNsText( NS_FILE ) . ':', 'close' => ']]', 'sample' => wfMessage( 'image_sample' )->text(), 'tip' => wfMessage( 'image_tip' )->text(), ] : false, $imagesAvailable ? [ 'id' => 'mw-editbutton-media', - 'open' => '[[' . $wgContLang->getNsText( NS_MEDIA ) . ':', + 'open' => '[[' . $contLang->getNsText( NS_MEDIA ) . ':', 'close' => ']]', 'sample' => wfMessage( 'media_sample' )->text(), 'tip' => wfMessage( 'media_tip' )->text(), @@ -4121,7 +4137,7 @@ ERROR; ] ]; - $script = 'mw.loader.using("mediawiki.toolbar", function () {'; + $script = ''; foreach ( $toolarray as $tool ) { if ( !$tool ) { continue; @@ -4148,15 +4164,16 @@ ERROR; ); } - $script .= '});'; - $toolbar = '
'; if ( Hooks::run( 'EditPageBeforeEditToolbar', [ &$toolbar ] ) ) { // Only add the old toolbar cruft to the page payload if the toolbar has not // been over-written by a hook caller $nonce = $wgOut->getCSPNonce(); - $wgOut->addScript( ResourceLoader::makeInlineScript( $script, $nonce ) ); + $wgOut->addScript( Html::inlineScript( + ResourceLoader::makeInlineCodeWithModule( 'mediawiki.toolbar', $script ), + $nonce + ) ); }; return $toolbar; diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 4a09b9c6a1..d215e9f56e 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -1308,11 +1308,11 @@ function wfGetLangObj( $langcode = false ) { return $langcode; } - global $wgContLang, $wgLanguageCode; + global $wgLanguageCode; if ( $langcode === true || $langcode === $wgLanguageCode ) { # $langcode is the language code of the wikis content language object. # or it is a boolean and value is true - return $wgContLang; + return MediaWikiServices::getInstance()->getContentLanguage(); } global $wgLang; @@ -1330,7 +1330,7 @@ function wfGetLangObj( $langcode = false ) { # $langcode is a string, but not a valid language code; use content language. wfDebug( "Invalid language code passed to wfGetLangObj, falling back to content language.\n" ); - return $wgContLang; + return MediaWikiServices::getInstance()->getContentLanguage(); } /** @@ -2674,28 +2674,6 @@ function wfGetPrecompiledData( $name ) { return false; } -/** - * @since 1.32 - * @param string[] $data Array with string keys/values to export - * @param string $header - * @return string PHP code - */ -function wfMakeStaticArrayFile( array $data, $header = 'Automatically generated' ) { - $format = "\t%s => %s,\n"; - $code = " $value ) { - $code .= sprintf( - $format, - var_export( $key, true ), - var_export( $value, true ) - ); - } - $code .= "];\n"; - return $code; -} - /** * Make a cache key for the local wiki. * @@ -3119,6 +3097,7 @@ function wfBCP47( $code ) { /** * Get a specific cache object. * + * @deprecated since 1.32, use ObjectCache::getInstance() instead * @param int|string $cacheType A CACHE_* constants, or other key in $wgObjectCaches * @return BagOStuff */ @@ -3129,11 +3108,11 @@ function wfGetCache( $cacheType ) { /** * Get the main cache object * + * @deprecated since 1.32, use ObjectCache::getLocalClusterInstance() instead * @return BagOStuff */ function wfGetMainCache() { - global $wgMainCacheType; - return ObjectCache::getInstance( $wgMainCacheType ); + return ObjectCache::getLocalClusterInstance(); } /** diff --git a/includes/Html.php b/includes/Html.php index ad0130bf8f..dba4c67a72 100644 --- a/includes/Html.php +++ b/includes/Html.php @@ -22,6 +22,7 @@ * * @file */ +use MediaWiki\MediaWikiServices; /** * This class is a collection of static functions that serve two purposes: @@ -703,7 +704,7 @@ class Html { * @return string of HTML representing a box. */ private static function messageBox( $html, $className, $heading = '' ) { - if ( $heading ) { + if ( $heading !== '' ) { $html = self::element( 'h2', [], $heading ) . $html; } return self::rawElement( 'div', [ 'class' => $className ], $html ); @@ -824,8 +825,6 @@ class Html { * @return array */ public static function namespaceSelectorOptions( array $params = [] ) { - global $wgContLang; - $options = []; if ( !isset( $params['exclude'] ) || !is_array( $params['exclude'] ) ) { @@ -838,7 +837,8 @@ class Html { $options[$params['all']] = wfMessage( 'namespacesall' )->text(); } // Add all namespaces as options (in the content language) - $options += $wgContLang->getFormattedNamespaces(); + $options += + MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces(); $optionsOut = []; // Filter out namespaces below 0 and massage labels @@ -851,7 +851,8 @@ class Html { // main we don't use "" but the user message describing it (e.g. "(Main)" or "(Article)") $nsName = wfMessage( 'blanknamespace' )->text(); } elseif ( is_int( $nsId ) ) { - $nsName = $wgContLang->convertNamespace( $nsId ); + $nsName = MediaWikiServices::getInstance()->getContentLanguage()-> + convertNamespace( $nsId ); } $optionsOut[$nsId] = $nsName; } diff --git a/includes/Linker.php b/includes/Linker.php index f160fd67fa..08a57247a6 100644 --- a/includes/Linker.php +++ b/includes/Linker.php @@ -184,14 +184,13 @@ class Linker { * @return string */ public static function getInvalidTitleDescription( IContextSource $context, $namespace, $title ) { - global $wgContLang; - // First we check whether the namespace exists or not. if ( MWNamespace::exists( $namespace ) ) { if ( $namespace == NS_MAIN ) { $name = $context->msg( 'blanknamespace' )->text(); } else { - $name = $wgContLang->getFormattedNsText( $namespace ); + $name = MediaWikiServices::getInstance()->getContentLanguage()-> + getFormattedNsText( $namespace ); } return $context->msg( 'invalidtitle-knownnamespace', $namespace, $name, $title )->text(); } else { @@ -206,7 +205,8 @@ class Linker { */ public static function normaliseSpecialPage( LinkTarget $target ) { if ( $target->getNamespace() == NS_SPECIAL && !$target->isExternal() ) { - list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $target->getDBkey() ); + list( $name, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + resolveAlias( $target->getDBkey() ); if ( !$name ) { return $target; } @@ -1227,10 +1227,11 @@ class Linker { ([^[]*) # 3. link trail (the text up until the next link) /x', function ( $match ) use ( $title, $local, $wikiId ) { - global $wgContLang; - $medians = '(?:' . preg_quote( MWNamespace::getCanonicalName( NS_MEDIA ), '/' ) . '|'; - $medians .= preg_quote( $wgContLang->getNsText( NS_MEDIA ), '/' ) . '):'; + $medians .= preg_quote( + MediaWikiServices::getInstance()->getContentLanguage()->getNsText( NS_MEDIA ), + '/' + ) . '):'; $comment = $match[0]; @@ -1264,7 +1265,11 @@ class Linker { $match[1] = substr( $match[1], 1 ); } if ( $match[1] !== false && $match[1] !== '' ) { - if ( preg_match( $wgContLang->linkTrail(), $match[3], $submatch ) ) { + if ( preg_match( + MediaWikiServices::getInstance()->getContentLanguage()->linkTrail(), + $match[3], + $submatch + ) ) { $trail = $submatch[1]; } else { $trail = ""; @@ -1655,8 +1660,7 @@ class Linker { * @return array */ static function splitTrail( $trail ) { - global $wgContLang; - $regex = $wgContLang->linkTrail(); + $regex = MediaWikiServices::getInstance()->getContentLanguage()->linkTrail(); $inside = ''; if ( $trail !== '' ) { $m = []; diff --git a/includes/MWGrants.php b/includes/MWGrants.php index 769e5b4da4..3079c65512 100644 --- a/includes/MWGrants.php +++ b/includes/MWGrants.php @@ -193,12 +193,10 @@ class MWGrants { * @return string Wikitext */ public static function getGrantsWikiText( $grantsFilter, $lang = null ) { - global $wgContLang; - if ( is_string( $lang ) ) { $lang = Language::factory( $lang ); } elseif ( $lang === null ) { - $lang = $wgContLang; + $lang = MediaWikiServices::getInstance()->getContentLanguage(); } $s = ''; diff --git a/includes/MagicWord.php b/includes/MagicWord.php index a193c9fda9..4420d1d327 100644 --- a/includes/MagicWord.php +++ b/includes/MagicWord.php @@ -90,6 +90,9 @@ class MagicWord { /** @var bool */ private $mFound = false; + /** @var Language */ + private $contLang; + /**#@-*/ /** @@ -100,11 +103,17 @@ class MagicWord { * @param string|null $id The internal name of the magic word * @param string[]|string $syn synonyms for the magic word * @param bool $cs If magic word is case sensitive + * @param Language|null $contLang Content language */ - public function __construct( $id = null, $syn = [], $cs = false ) { + public function __construct( $id = null, $syn = [], $cs = false, Language $contLang = null ) { $this->mId = $id; $this->mSynonyms = (array)$syn; $this->mCaseSensitive = $cs; + $this->contLang = $contLang; + + if ( !$contLang ) { + $this->contLang = MediaWikiServices::getInstance()->getContentLanguage(); + } } /** @@ -166,9 +175,8 @@ class MagicWord { * @throws MWException */ public function load( $id ) { - global $wgContLang; $this->mId = $id; - $wgContLang->getMagic( $this ); + $this->contLang->getMagic( $this ); if ( !$this->mSynonyms ) { $this->mSynonyms = [ 'brionmademeputthishere' ]; throw new MWException( "Error: invalid magic word '$id'" ); @@ -486,9 +494,8 @@ class MagicWord { * @param string $value */ public function addToArray( &$array, $value ) { - global $wgContLang; foreach ( $this->mSynonyms as $syn ) { - $array[$wgContLang->lc( $syn )] = $value; + $array[$this->contLang->lc( $syn )] = $value; } } diff --git a/includes/MagicWordArray.php b/includes/MagicWordArray.php index 20ac680a98..fde32ce4fd 100644 --- a/includes/MagicWordArray.php +++ b/includes/MagicWordArray.php @@ -81,14 +81,13 @@ class MagicWordArray { */ public function getHash() { if ( is_null( $this->hash ) ) { - global $wgContLang; $this->hash = [ 0 => [], 1 => [] ]; foreach ( $this->names as $name ) { $magic = $this->factory->get( $name ); $case = intval( $magic->isCaseSensitive() ); foreach ( $magic->getSynonyms() as $syn ) { if ( !$case ) { - $syn = $wgContLang->lc( $syn ); + $syn = $this->factory->getContentLanguage()->lc( $syn ); } $this->hash[$case][$syn] = $name; } @@ -268,8 +267,7 @@ class MagicWordArray { if ( isset( $hash[1][$text] ) ) { return $hash[1][$text]; } - global $wgContLang; - $lc = $wgContLang->lc( $text ); + $lc = $this->factory->getContentLanguage()->lc( $text ); if ( isset( $hash[0][$lc] ) ) { return $hash[0][$lc]; } diff --git a/includes/MagicWordFactory.php b/includes/MagicWordFactory.php index 15a7678ffe..e62716d67e 100644 --- a/includes/MagicWordFactory.php +++ b/includes/MagicWordFactory.php @@ -192,8 +192,22 @@ class MagicWordFactory { /** @var MagicWordArray */ private $mDoubleUnderscoreArray = null; + /** @var Language */ + private $contLang; + /**#@-*/ + /** + * @param Language $contLang Content language + */ + public function __construct( Language $contLang ) { + $this->contLang = $contLang; + } + + public function getContentLanguage() { + return $this->contLang; + } + /** * Factory: creates an object representing an ID * @@ -203,7 +217,7 @@ class MagicWordFactory { */ public function get( $id ) { if ( !isset( $this->mObjects[$id] ) ) { - $mw = new MagicWord(); + $mw = new MagicWord( null, [], false, $this->contLang ); $mw->load( $id ); $this->mObjects[$id] = $mw; } diff --git a/includes/MediaWiki.php b/includes/MediaWiki.php index a67cb9bf47..4636ba349e 100644 --- a/includes/MediaWiki.php +++ b/includes/MediaWiki.php @@ -66,8 +66,6 @@ class MediaWiki { * @return Title Title object to be $wgTitle */ private function parseTitle() { - global $wgContLang; - $request = $this->context->getRequest(); $curid = $request->getInt( 'curid' ); $title = $request->getVal( 'title' ); @@ -88,12 +86,13 @@ class MediaWiki { if ( !is_null( $ret ) && $ret->getNamespace() == NS_MEDIA ) { $ret = Title::makeTitle( NS_FILE, $ret->getDBkey() ); } + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); // Check variant links so that interwiki links don't have to worry // about the possible different language variants - if ( $wgContLang->hasVariants() - && !is_null( $ret ) && $ret->getArticleID() == 0 + if ( + $contLang->hasVariants() && !is_null( $ret ) && $ret->getArticleID() == 0 ) { - $wgContLang->findVariantLink( $title, $ret ); + $contLang->findVariantLink( $title, $ret ); } } @@ -251,14 +250,15 @@ class MediaWiki { // Redirect loops, titleless URL, $wgUsePathInfo URLs, and URLs with a variant } elseif ( !$this->tryNormaliseRedirect( $title ) ) { // Prevent information leak via Special:MyPage et al (T109724) + $spFactory = MediaWikiServices::getInstance()->getSpecialPageFactory(); if ( $title->isSpecialPage() ) { - $specialPage = SpecialPageFactory::getPage( $title->getDBkey() ); + $specialPage = $spFactory->getPage( $title->getDBkey() ); if ( $specialPage instanceof RedirectSpecialPage ) { $specialPage->setContext( $this->context ); if ( $this->config->get( 'HideIdentifiableRedirects' ) && $specialPage->personallyIdentifiableTarget() ) { - list( , $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() ); + list( , $subpage ) = $spFactory->resolveAlias( $title->getDBkey() ); $target = $specialPage->getRedirect( $subpage ); // target can also be true. We let that case fall through to normal processing. if ( $target instanceof Title ) { @@ -285,7 +285,7 @@ class MediaWiki { // Special pages ($title may have changed since if statement above) if ( $title->isSpecialPage() ) { // Actions that need to be made when we have a special pages - SpecialPageFactory::executePath( $title, $this->context ); + $spFactory->executePath( $title, $this->context ); } else { // ...otherwise treat it as an article view. The article // may still be a wikipage redirect to another article or URL. @@ -339,7 +339,8 @@ class MediaWiki { } if ( $title->isSpecialPage() ) { - list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() ); + list( $name, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + resolveAlias( $title->getDBkey() ); if ( $name ) { $title = SpecialPage::getTitleFor( $name, $subpage ); } @@ -867,7 +868,7 @@ class MediaWiki { $this->performRequest(); // GUI-ify and stash the page output in MediaWiki::doPreOutputCommit() while - // ChronologyProtector synchronizes DB positions or replicas accross all datacenters. + // ChronologyProtector synchronizes DB positions or replicas across all datacenters. $buffer = null; $outputWork = function () use ( $output, &$buffer ) { if ( $buffer === null ) { @@ -1056,7 +1057,8 @@ class MediaWiki { $invokedWithSuccess = true; if ( $sock ) { - $special = SpecialPageFactory::getPage( 'RunJobs' ); + $special = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + getPage( 'RunJobs' ); $url = $special->getPageTitle()->getCanonicalURL( $query ); $req = ( "POST $url HTTP/1.1\r\n" . diff --git a/includes/MediaWikiServices.php b/includes/MediaWikiServices.php index f891042aae..4a6046d715 100644 --- a/includes/MediaWikiServices.php +++ b/includes/MediaWikiServices.php @@ -12,9 +12,11 @@ use GenderCache; use GlobalVarConfig; use Hooks; use IBufferingStatsdDataFactory; +use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface; use MediaWiki\Http\HttpRequestFactory; use MediaWiki\Preferences\PreferencesFactory; use MediaWiki\Shell\CommandFactory; +use MediaWiki\Special\SpecialPageFactory; use MediaWiki\Storage\BlobStore; use MediaWiki\Storage\BlobStoreFactory; use MediaWiki\Storage\NameTableStore; @@ -22,6 +24,7 @@ use MediaWiki\Storage\RevisionFactory; use MediaWiki\Storage\RevisionLookup; use MediaWiki\Storage\RevisionStore; use OldRevisionImporter; +use MediaWiki\Storage\RevisionStoreFactory; use UploadRevisionImporter; use Wikimedia\Rdbms\LBFactory; use LinkCache; @@ -38,6 +41,8 @@ use MimeAnalyzer; use ObjectCache; use Parser; use ParserCache; +use ParserFactory; +use PasswordFactory; use ProxyLookup; use SearchEngine; use SearchEngineConfig; @@ -400,6 +405,30 @@ class MediaWikiServices extends ServiceContainer { // CONVENIENCE GETTERS //////////////////////////////////////////////////// + /** + * @since 1.31 + * @return ActorMigration + */ + public function getActorMigration() { + return $this->getService( 'ActorMigration' ); + } + + /** + * @since 1.31 + * @return BlobStore + */ + public function getBlobStore() { + return $this->getService( '_SqlBlobStore' ); + } + + /** + * @since 1.31 + * @return BlobStoreFactory + */ + public function getBlobStoreFactory() { + return $this->getService( 'BlobStoreFactory' ); + } + /** * Returns the Config object containing the bootstrap configuration. * Bootstrap configuration would typically include database credentials @@ -418,283 +447,282 @@ class MediaWikiServices extends ServiceContainer { } /** - * @since 1.27 - * @return ConfigFactory + * @since 1.32 + * @return NameTableStore */ - public function getConfigFactory() { - return $this->getService( 'ConfigFactory' ); + public function getChangeTagDefStore() { + return $this->getService( 'ChangeTagDefStore' ); } /** - * Returns the Config object that provides configuration for MediaWiki core. - * This may or may not be the same object that is returned by getBootstrapConfig(). - * - * @since 1.27 - * @return Config + * @since 1.31 + * @return CommentStore */ - public function getMainConfig() { - return $this->getService( 'MainConfig' ); + public function getCommentStore() { + return $this->getService( 'CommentStore' ); } /** * @since 1.27 - * @return SiteLookup + * @return ConfigFactory */ - public function getSiteLookup() { - return $this->getService( 'SiteLookup' ); + public function getConfigFactory() { + return $this->getService( 'ConfigFactory' ); } /** - * @since 1.27 - * @return SiteStore + * @since 1.32 + * @return ConfigRepository */ - public function getSiteStore() { - return $this->getService( 'SiteStore' ); + public function getConfigRepository() { + return $this->getService( 'ConfigRepository' ); } /** - * @since 1.28 - * @return InterwikiLookup + * @since 1.29 + * @return \ConfiguredReadOnlyMode */ - public function getInterwikiLookup() { - return $this->getService( 'InterwikiLookup' ); + public function getConfiguredReadOnlyMode() { + return $this->getService( 'ConfiguredReadOnlyMode' ); } /** - * @since 1.27 - * @return IBufferingStatsdDataFactory + * @since 1.32 + * @return \Language */ - public function getStatsdDataFactory() { - return $this->getService( 'StatsdDataFactory' ); + public function getContentLanguage() { + return $this->getService( 'ContentLanguage' ); } /** - * @since 1.32 - * @return IBufferingStatsdDataFactory + * @since 1.31 + * @return NameTableStore */ - public function getPerDbNameStatsdDataFactory() { - return $this->getService( 'PerDbNameStatsdDataFactory' ); + public function getContentModelStore() { + return $this->getService( 'ContentModelStore' ); } /** - * @since 1.27 - * @return EventRelayerGroup + * @since 1.28 + * @return CryptHKDF */ - public function getEventRelayerGroup() { - return $this->getService( 'EventRelayerGroup' ); + public function getCryptHKDF() { + return $this->getService( 'CryptHKDF' ); } /** - * @since 1.27 - * @return SearchEngine + * @since 1.28 + * @deprecated since 1.32, use random_bytes()/random_int() + * @return CryptRand */ - public function newSearchEngine() { - // New engine object every time, since they keep state - return $this->getService( 'SearchEngineFactory' )->create(); + public function getCryptRand() { + return $this->getService( 'CryptRand' ); } /** - * @since 1.27 - * @return SearchEngineFactory + * @since 1.28 + * @return LoadBalancer The main DB load balancer for the local wiki. */ - public function getSearchEngineFactory() { - return $this->getService( 'SearchEngineFactory' ); + public function getDBLoadBalancer() { + return $this->getService( 'DBLoadBalancer' ); } /** - * @since 1.27 - * @return SearchEngineConfig + * @since 1.28 + * @return LBFactory */ - public function getSearchEngineConfig() { - return $this->getService( 'SearchEngineConfig' ); + public function getDBLoadBalancerFactory() { + return $this->getService( 'DBLoadBalancerFactory' ); } /** * @since 1.27 - * @return SkinFactory + * @return EventRelayerGroup */ - public function getSkinFactory() { - return $this->getService( 'SkinFactory' ); + public function getEventRelayerGroup() { + return $this->getService( 'EventRelayerGroup' ); } /** - * @since 1.28 - * @return LBFactory + * @since 1.31 + * @return \ExternalStoreFactory */ - public function getDBLoadBalancerFactory() { - return $this->getService( 'DBLoadBalancerFactory' ); + public function getExternalStoreFactory() { + return $this->getService( 'ExternalStoreFactory' ); } /** * @since 1.28 - * @return LoadBalancer The main DB load balancer for the local wiki. + * @return GenderCache */ - public function getDBLoadBalancer() { - return $this->getService( 'DBLoadBalancer' ); + public function getGenderCache() { + return $this->getService( 'GenderCache' ); } /** - * @since 1.28 - * @return WatchedItemStoreInterface + * @since 1.31 + * @return HttpRequestFactory */ - public function getWatchedItemStore() { - return $this->getService( 'WatchedItemStore' ); + public function getHttpRequestFactory() { + return $this->getService( 'HttpRequestFactory' ); } /** * @since 1.28 - * @return WatchedItemQueryService + * @return InterwikiLookup */ - public function getWatchedItemQueryService() { - return $this->getService( 'WatchedItemQueryService' ); + public function getInterwikiLookup() { + return $this->getService( 'InterwikiLookup' ); } /** * @since 1.28 - * @deprecated since 1.32, use random_bytes()/random_int() - * @return CryptRand + * @return LinkCache */ - public function getCryptRand() { - return $this->getService( 'CryptRand' ); + public function getLinkCache() { + return $this->getService( 'LinkCache' ); } /** + * LinkRenderer instance that can be used + * if no custom options are needed + * * @since 1.28 - * @return CryptHKDF + * @return LinkRenderer */ - public function getCryptHKDF() { - return $this->getService( 'CryptHKDF' ); + public function getLinkRenderer() { + return $this->getService( 'LinkRenderer' ); } /** * @since 1.28 - * @return MediaHandlerFactory + * @return LinkRendererFactory */ - public function getMediaHandlerFactory() { - return $this->getService( 'MediaHandlerFactory' ); + public function getLinkRendererFactory() { + return $this->getService( 'LinkRendererFactory' ); } /** * @since 1.28 - * @return MimeAnalyzer + * @return \BagOStuff */ - public function getMimeAnalyzer() { - return $this->getService( 'MimeAnalyzer' ); + public function getLocalServerObjectCache() { + return $this->getService( 'LocalServerObjectCache' ); } /** - * @since 1.28 - * @return ProxyLookup + * @since 1.32 + * @return MagicWordFactory */ - public function getProxyLookup() { - return $this->getService( 'ProxyLookup' ); + public function getMagicWordFactory() { + return $this->getService( 'MagicWordFactory' ); } /** - * @since 1.29 - * @return Parser + * Returns the Config object that provides configuration for MediaWiki core. + * This may or may not be the same object that is returned by getBootstrapConfig(). + * + * @since 1.27 + * @return Config */ - public function getParser() { - return $this->getService( 'Parser' ); + public function getMainConfig() { + return $this->getService( 'MainConfig' ); } /** - * @since 1.30 - * @return ParserCache + * @since 1.28 + * @return \BagOStuff */ - public function getParserCache() { - return $this->getService( 'ParserCache' ); + public function getMainObjectStash() { + return $this->getService( 'MainObjectStash' ); } /** * @since 1.28 - * @return GenderCache + * @return \WANObjectCache */ - public function getGenderCache() { - return $this->getService( 'GenderCache' ); + public function getMainWANObjectCache() { + return $this->getService( 'MainWANObjectCache' ); } /** * @since 1.28 - * @return LinkCache + * @return MediaHandlerFactory */ - public function getLinkCache() { - return $this->getService( 'LinkCache' ); + public function getMediaHandlerFactory() { + return $this->getService( 'MediaHandlerFactory' ); } /** * @since 1.28 - * @return LinkRendererFactory + * @return MimeAnalyzer */ - public function getLinkRendererFactory() { - return $this->getService( 'LinkRendererFactory' ); + public function getMimeAnalyzer() { + return $this->getService( 'MimeAnalyzer' ); } /** - * LinkRenderer instance that can be used - * if no custom options are needed - * - * @since 1.28 - * @return LinkRenderer + * @since 1.32 + * @return OldRevisionImporter */ - public function getLinkRenderer() { - return $this->getService( 'LinkRenderer' ); + public function getOldRevisionImporter() { + return $this->getService( 'OldRevisionImporter' ); } /** - * @since 1.28 - * @return TitleFormatter + * @since 1.29 + * @return Parser */ - public function getTitleFormatter() { - return $this->getService( 'TitleFormatter' ); + public function getParser() { + return $this->getService( 'Parser' ); } /** - * @since 1.28 - * @return TitleParser + * @since 1.30 + * @return ParserCache */ - public function getTitleParser() { - return $this->getService( 'TitleParser' ); + public function getParserCache() { + return $this->getService( 'ParserCache' ); } /** - * @since 1.28 - * @return \BagOStuff + * @since 1.32 + * @return ParserFactory */ - public function getMainObjectStash() { - return $this->getService( 'MainObjectStash' ); + public function getParserFactory() { + return $this->getService( 'ParserFactory' ); } /** - * @since 1.28 - * @return \WANObjectCache + * @since 1.32 + * @return PasswordFactory */ - public function getMainWANObjectCache() { - return $this->getService( 'MainWANObjectCache' ); + public function getPasswordFactory() { + return $this->getService( 'PasswordFactory' ); } /** - * @since 1.28 - * @return \BagOStuff + * @since 1.32 + * @return StatsdDataFactoryInterface */ - public function getLocalServerObjectCache() { - return $this->getService( 'LocalServerObjectCache' ); + public function getPerDbNameStatsdDataFactory() { + return $this->getService( 'PerDbNameStatsdDataFactory' ); } /** - * @since 1.28 - * @return VirtualRESTServiceClient + * @since 1.31 + * @return PreferencesFactory */ - public function getVirtualRESTServiceClient() { - return $this->getService( 'VirtualRESTServiceClient' ); + public function getPreferencesFactory() { + return $this->getService( 'PreferencesFactory' ); } /** - * @since 1.29 - * @return \ConfiguredReadOnlyMode + * @since 1.28 + * @return ProxyLookup */ - public function getConfiguredReadOnlyMode() { - return $this->getService( 'ConfiguredReadOnlyMode' ); + public function getProxyLookup() { + return $this->getService( 'ProxyLookup' ); } /** @@ -707,90 +735,91 @@ class MediaWikiServices extends ServiceContainer { /** * @since 1.31 - * @return \UploadRevisionImporter + * @return RevisionFactory */ - public function getWikiRevisionUploadImporter() { - return $this->getService( 'UploadRevisionImporter' ); + public function getRevisionFactory() { + return $this->getService( 'RevisionFactory' ); } /** * @since 1.31 - * @return \OldRevisionImporter + * @return RevisionLookup */ - public function getWikiRevisionOldRevisionImporter() { - return $this->getService( 'OldRevisionImporter' ); + public function getRevisionLookup() { + return $this->getService( 'RevisionLookup' ); } /** * @since 1.31 - * @return \OldRevisionImporter + * @return RevisionStore */ - public function getWikiRevisionOldRevisionImporterNoUpdates() { - return $this->getService( 'WikiRevisionOldRevisionImporterNoUpdates' ); + public function getRevisionStore() { + return $this->getService( 'RevisionStore' ); } /** - * @since 1.30 - * @return CommandFactory + * @since 1.32 + * @return RevisionStoreFactory */ - public function getShellCommandFactory() { - return $this->getService( 'ShellCommandFactory' ); + public function getRevisionStoreFactory() { + return $this->getService( 'RevisionStoreFactory' ); } /** - * @since 1.31 - * @return \ExternalStoreFactory + * @since 1.27 + * @return SearchEngine */ - public function getExternalStoreFactory() { - return $this->getService( 'ExternalStoreFactory' ); + public function newSearchEngine() { + // New engine object every time, since they keep state + return $this->getService( 'SearchEngineFactory' )->create(); } /** - * @since 1.31 - * @return BlobStoreFactory + * @since 1.27 + * @return SearchEngineConfig */ - public function getBlobStoreFactory() { - return $this->getService( 'BlobStoreFactory' ); + public function getSearchEngineConfig() { + return $this->getService( 'SearchEngineConfig' ); } /** - * @since 1.31 - * @return BlobStore + * @since 1.27 + * @return SearchEngineFactory */ - public function getBlobStore() { - return $this->getService( '_SqlBlobStore' ); + public function getSearchEngineFactory() { + return $this->getService( 'SearchEngineFactory' ); } /** - * @since 1.31 - * @return RevisionStore + * @since 1.30 + * @return CommandFactory */ - public function getRevisionStore() { - return $this->getService( 'RevisionStore' ); + public function getShellCommandFactory() { + return $this->getService( 'ShellCommandFactory' ); } /** - * @since 1.31 - * @return RevisionLookup + * @since 1.27 + * @return SiteLookup */ - public function getRevisionLookup() { - return $this->getService( 'RevisionLookup' ); + public function getSiteLookup() { + return $this->getService( 'SiteLookup' ); } /** - * @since 1.31 - * @return RevisionFactory + * @since 1.27 + * @return SiteStore */ - public function getRevisionFactory() { - return $this->getService( 'RevisionFactory' ); + public function getSiteStore() { + return $this->getService( 'SiteStore' ); } /** - * @since 1.31 - * @return NameTableStore + * @since 1.27 + * @return SkinFactory */ - public function getContentModelStore() { - return $this->getService( 'ContentModelStore' ); + public function getSkinFactory() { + return $this->getService( 'SkinFactory' ); } /** @@ -803,42 +832,34 @@ class MediaWikiServices extends ServiceContainer { /** * @since 1.32 - * @return NameTableStore - */ - public function getChangeTagDefStore() { - return $this->getService( 'ChangeTagDefStore' ); - } - - /** - * @since 1.31 - * @return PreferencesFactory + * @return SpecialPageFactory */ - public function getPreferencesFactory() { - return $this->getService( 'PreferencesFactory' ); + public function getSpecialPageFactory() : SpecialPageFactory { + return $this->getService( 'SpecialPageFactory' ); } /** - * @since 1.31 - * @return HttpRequestFactory + * @since 1.27 + * @return IBufferingStatsdDataFactory */ - public function getHttpRequestFactory() { - return $this->getService( 'HttpRequestFactory' ); + public function getStatsdDataFactory() { + return $this->getService( 'StatsdDataFactory' ); } /** - * @since 1.31 - * @return CommentStore + * @since 1.28 + * @return TitleFormatter */ - public function getCommentStore() { - return $this->getService( 'CommentStore' ); + public function getTitleFormatter() { + return $this->getService( 'TitleFormatter' ); } /** - * @since 1.31 - * @return ActorMigration + * @since 1.28 + * @return TitleParser */ - public function getActorMigration() { - return $this->getService( 'ActorMigration' ); + public function getTitleParser() { + return $this->getService( 'TitleParser' ); } /** @@ -850,33 +871,51 @@ class MediaWikiServices extends ServiceContainer { } /** - * @since 1.32 - * @return OldRevisionImporter + * @since 1.28 + * @return VirtualRESTServiceClient */ - public function getOldRevisionImporter() { - return $this->getService( 'OldRevisionImporter' ); + public function getVirtualRESTServiceClient() { + return $this->getService( 'VirtualRESTServiceClient' ); } /** - * @since 1.32 - * @return ConfigRepository + * @since 1.28 + * @return WatchedItemQueryService */ - public function getConfigRepository() { - return $this->getService( 'ConfigRepository' ); + public function getWatchedItemQueryService() { + return $this->getService( 'WatchedItemQueryService' ); } /** - * @since 1.32 - * @return MagicWordFactory + * @since 1.28 + * @return WatchedItemStoreInterface */ - public function getMagicWordFactory() { - return $this->getService( 'MagicWordFactory' ); + public function getWatchedItemStore() { + return $this->getService( 'WatchedItemStore' ); + } + + /** + * @since 1.31 + * @return \OldRevisionImporter + */ + public function getWikiRevisionOldRevisionImporter() { + return $this->getService( 'OldRevisionImporter' ); } - /////////////////////////////////////////////////////////////////////////// - // NOTE: When adding a service getter here, don't forget to add a test - // case for it in MediaWikiServicesTest::provideGetters() and in - // MediaWikiServicesTest::provideGetService()! - /////////////////////////////////////////////////////////////////////////// + /** + * @since 1.31 + * @return \OldRevisionImporter + */ + public function getWikiRevisionOldRevisionImporterNoUpdates() { + return $this->getService( 'WikiRevisionOldRevisionImporterNoUpdates' ); + } + + /** + * @since 1.31 + * @return \UploadRevisionImporter + */ + public function getWikiRevisionUploadImporter() { + return $this->getService( 'UploadRevisionImporter' ); + } } diff --git a/includes/Message.php b/includes/Message.php index 5ca0942291..3bd775537f 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -20,6 +20,7 @@ * @file * @author Niklas Laxström */ +use MediaWiki\MediaWikiServices; /** * The Message class provides methods which fulfil two basic services: @@ -469,18 +470,20 @@ class Message implements MessageSpecifier, Serializable { * @since 1.26 */ public function getTitle() { - global $wgContLang, $wgForceUIMsgAsContentMsg; + global $wgForceUIMsgAsContentMsg; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $lang = $this->getLanguage(); $title = $this->key; if ( - !$this->language->equals( $wgContLang ) + !$lang->equals( $contLang ) && in_array( $this->key, (array)$wgForceUIMsgAsContentMsg ) ) { - $code = $this->language->getCode(); - $title .= '/' . $code; + $title .= '/' . $lang->getCode(); } - return Title::makeTitle( NS_MEDIAWIKI, $wgContLang->ucfirst( strtr( $title, ' ', '_' ) ) ); + return Title::makeTitle( + NS_MEDIAWIKI, $contLang->ucfirst( strtr( $title, ' ', '_' ) ) ); } /** @@ -766,8 +769,7 @@ class Message implements MessageSpecifier, Serializable { return $this; } - global $wgContLang; - $this->inLanguage( $wgContLang ); + $this->inLanguage( MediaWikiServices::getInstance()->getContentLanguage() ); return $this; } diff --git a/includes/OutputPage.php b/includes/OutputPage.php index aa517e7608..c8e18e0218 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -71,7 +71,7 @@ class OutputPage extends ContextSource { * @var bool Is the displayed content related to the source of the * corresponding wiki article. */ - private $mIsarticle = false; + private $mIsArticle = false; /** @var bool Stores "article flag" toggle. */ private $mIsArticleRelated = true; @@ -255,6 +255,11 @@ class OutputPage extends ContextSource { private $mIndexPolicy = 'index'; private $mFollowPolicy = 'follow'; + + /** + * @var array Headers that cause the cache to vary. Key is header name, value is an array of + * options for the Key header. + */ private $mVaryHeader = [ 'Accept-Encoding' => [ 'match=gzip' ], ]; @@ -1164,12 +1169,12 @@ class OutputPage extends ContextSource { * corresponding article on the wiki * Setting true will cause the change "article related" toggle to true * - * @param bool $v + * @param bool $newVal */ - public function setArticleFlag( $v ) { - $this->mIsarticle = $v; - if ( $v ) { - $this->mIsArticleRelated = $v; + public function setArticleFlag( $newVal ) { + $this->mIsArticle = $newVal; + if ( $newVal ) { + $this->mIsArticleRelated = $newVal; } } @@ -1180,19 +1185,19 @@ class OutputPage extends ContextSource { * @return bool */ public function isArticle() { - return $this->mIsarticle; + return $this->mIsArticle; } /** * Set whether this page is related an article on the wiki * Setting false will cause the change of "article flag" toggle to false * - * @param bool $v + * @param bool $newVal */ - public function setArticleRelated( $v ) { - $this->mIsArticleRelated = $v; - if ( !$v ) { - $this->mIsarticle = false; + public function setArticleRelated( $newVal ) { + $this->mIsArticleRelated = $newVal; + if ( !$newVal ) { + $this->mIsArticle = false; } } @@ -1240,9 +1245,7 @@ class OutputPage extends ContextSource { * @param array $categories Mapping category name => sort key */ public function addCategoryLinks( array $categories ) { - global $wgContLang; - - if ( !is_array( $categories ) || count( $categories ) == 0 ) { + if ( !$categories ) { return; } @@ -1265,7 +1268,8 @@ class OutputPage extends ContextSource { 'OutputPageMakeCategoryLinks', [ &$outputPage, $categories, &$this->mCategoryLinks ] ) ) { - $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); + $services = MediaWikiServices::getInstance(); + $linkRenderer = $services->getLinkRenderer(); foreach ( $categories as $category => $type ) { // array keys will cast numeric category names to ints, so cast back to string $category = (string)$category; @@ -1274,11 +1278,11 @@ class OutputPage extends ContextSource { if ( !$title ) { continue; } - $wgContLang->findVariantLink( $category, $title, true ); + $services->getContentLanguage()->findVariantLink( $category, $title, true ); if ( $category != $origcategory && array_key_exists( $category, $categories ) ) { continue; } - $text = $wgContLang->convertHtml( $title->getText() ); + $text = $services->getContentLanguage()->convertHtml( $title->getText() ); $this->mCategories[$type][] = $title->getText(); $this->mCategoryLinks[$type][] = $linkRenderer->makeLink( $title, new HtmlArmor( $text ) ); } @@ -1579,12 +1583,12 @@ class OutputPage extends ContextSource { * Set the revision ID which will be seen by the wiki text parser * for things such as embedded {{REVISIONID}} variable use. * - * @param int|null $revid An positive integer, or null + * @param int|null $revid A positive integer, or null * @return mixed Previous value */ public function setRevisionId( $revid ) { $val = is_null( $revid ) ? null : intval( $revid ); - return wfSetVar( $this->mRevisionId, $val ); + return wfSetVar( $this->mRevisionId, $val, true ); } /** @@ -1604,7 +1608,7 @@ class OutputPage extends ContextSource { * @return mixed Previous value */ public function setRevisionTimestamp( $timestamp ) { - return wfSetVar( $this->mRevisionTimestamp, $timestamp ); + return wfSetVar( $this->mRevisionTimestamp, $timestamp, true ); } /** @@ -1620,7 +1624,7 @@ class OutputPage extends ContextSource { /** * Set the displayed file version * - * @param File|bool $file + * @param File|null $file * @return mixed Previous value */ public function setFileVersion( $file ) { @@ -1681,10 +1685,10 @@ class OutputPage extends ContextSource { * Add wikitext with a custom Title object * * @param string $text Wikitext - * @param Title &$title + * @param Title $title * @param bool $linestart Is this the start of a line? */ - public function addWikiTextWithTitle( $text, &$title, $linestart = true ) { + public function addWikiTextWithTitle( $text, Title $title, $linestart = true ) { $this->addWikiTextTitle( $text, $title, $linestart ); } @@ -1692,10 +1696,10 @@ class OutputPage extends ContextSource { * Add wikitext with a custom Title object and tidy enabled. * * @param string $text Wikitext - * @param Title &$title + * @param Title $title * @param bool $linestart Is this the start of a line? */ - function addWikiTextTitleTidy( $text, &$title, $linestart = true ) { + function addWikiTextTitleTidy( $text, Title $title, $linestart = true ) { $this->addWikiTextTitle( $text, $title, $linestart, true ); } @@ -1749,7 +1753,7 @@ class OutputPage extends ContextSource { * @since 1.24 * @param ParserOutput $parserOutput */ - public function addParserOutputMetadata( $parserOutput ) { + public function addParserOutputMetadata( ParserOutput $parserOutput ) { $this->mLanguageLinks = array_merge( $this->mLanguageLinks, $parserOutput->getLanguageLinks() ); $this->addCategoryLinks( $parserOutput->getCategories() ); @@ -1787,7 +1791,7 @@ class OutputPage extends ContextSource { foreach ( $parserOutput->getOutputHooks() as $hookInfo ) { list( $hookName, $data ) = $hookInfo; if ( isset( $parserOutputHooks[$hookName] ) ) { - call_user_func( $parserOutputHooks[$hookName], $this, $parserOutput, $data ); + $parserOutputHooks[$hookName]( $this, $parserOutput, $data ); } } @@ -1826,7 +1830,7 @@ class OutputPage extends ContextSource { * @param ParserOutput $parserOutput * @param array $poOptions Options to ParserOutput::getText() */ - public function addParserOutputContent( $parserOutput, $poOptions = [] ) { + public function addParserOutputContent( ParserOutput $parserOutput, $poOptions = [] ) { $this->addParserOutputText( $parserOutput, $poOptions ); $this->addModules( $parserOutput->getModules() ); @@ -1843,7 +1847,7 @@ class OutputPage extends ContextSource { * @param ParserOutput $parserOutput * @param array $poOptions Options to ParserOutput::getText() */ - public function addParserOutputText( $parserOutput, $poOptions = [] ) { + public function addParserOutputText( ParserOutput $parserOutput, $poOptions = [] ) { $text = $parserOutput->getText( $poOptions ); // Avoid PHP 7.1 warning of passing $this by reference $outputPage = $this; @@ -1857,7 +1861,7 @@ class OutputPage extends ContextSource { * @param ParserOutput $parserOutput * @param array $poOptions Options to ParserOutput::getText() */ - function addParserOutput( $parserOutput, $poOptions = [] ) { + function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) { $this->addParserOutputMetadata( $parserOutput ); $this->addParserOutputText( $parserOutput, $poOptions ); } @@ -1876,9 +1880,9 @@ class OutputPage extends ContextSource { * * @param string $text * @param bool $linestart Is this the start of a line? - * @param bool $interface Use interface language ($wgLang instead of - * $wgContLang) while parsing language sensitive magic words like GRAMMAR and PLURAL. - * This also disables LanguageConverter. + * @param bool $interface Use interface language (instead of content language) while parsing + * language sensitive magic words like GRAMMAR and PLURAL. This also disables + * LanguageConverter. * @param Language|null $language Target language object, will override $interface * @throws MWException * @return string HTML @@ -1920,9 +1924,8 @@ class OutputPage extends ContextSource { * * @param string $text * @param bool $linestart Is this the start of a line? - * @param bool $interface Use interface language ($wgLang instead of - * $wgContLang) while parsing language sensitive magic - * words like GRAMMAR and PLURAL + * @param bool $interface Use interface language (instead of content language) while parsing + * language sensitive magic words like GRAMMAR and PLURAL * @return string HTML */ public function parseInline( $text, $linestart = true, $interface = false ) { @@ -1940,7 +1943,10 @@ class OutputPage extends ContextSource { } /** - * Lower the value of the "s-maxage" part of the "Cache-control" HTTP header + * Set the value of the "s-maxage" part of the "Cache-control" HTTP header to $maxage if that is + * lower than the current s-maxage. Either way, $maxage is now an upper limit on s-maxage, so + * that future calls to setCdnMaxage() will no longer be able to raise the s-maxage above + * $maxage. * * @param int $maxage Maximum cache time on the CDN, in seconds * @since 1.27 @@ -1958,9 +1964,10 @@ class OutputPage extends ContextSource { * TTL is 90% of the age of the object, subject to the min and max. * * @param string|int|float|bool|null $mtime Last-Modified timestamp - * @param int $minTTL Mimimum TTL in seconds [default: 1 minute] + * @param int $minTTL Minimum TTL in seconds [default: 1 minute] * @param int $maxTTL Maximum TTL in seconds [default: $wgSquidMaxage] - * @return int TTL in seconds + * @return int TTL in seconds passed to lowerCdnMaxage() (may not be the same as the new + * s-maxage) * @since 1.28 */ public function adaptCdnTTL( $mtime, $minTTL = 0, $maxTTL = 0 ) { @@ -1983,16 +1990,16 @@ class OutputPage extends ContextSource { /** * Use enableClientCache(false) to force it to send nocache headers * - * @param bool $state + * @param bool|null $state New value, or null to not set the value * - * @return bool + * @return bool Old value */ public function enableClientCache( $state ) { return wfSetVar( $this->mEnableClientCache, $state ); } /** - * Get the list of cookies that will influence on the cache + * Get the list of cookie names that will influence the cache * * @return array */ @@ -2045,7 +2052,8 @@ class OutputPage extends ContextSource { if ( !is_array( $option ) ) { $option = []; } - $this->mVaryHeader[$header] = array_unique( array_merge( $this->mVaryHeader[$header], $option ) ); + $this->mVaryHeader[$header] = + array_unique( array_merge( $this->mVaryHeader[$header], $option ) ); } /** @@ -2120,14 +2128,13 @@ class OutputPage extends ContextSource { } /** - * T23672: Add Accept-Language to Vary and Key headers - * if there's no 'variant' parameter existed in GET. + * T23672: Add Accept-Language to Vary and Key headers if there's no 'variant' parameter in GET. * * For example: - * /w/index.php?title=Main_page should always be served; but - * /w/index.php?title=Main_page&variant=zh-cn should never be served. + * /w/index.php?title=Main_page will vary based on Accept-Language; but + * /w/index.php?title=Main_page&variant=zh-cn will not. */ - function addAcceptLanguage() { + private function addAcceptLanguage() { $title = $this->getTitle(); if ( !$title instanceof Title ) { return; @@ -2140,16 +2147,15 @@ class OutputPage extends ContextSource { foreach ( $variants as $variant ) { if ( $variant === $lang->getCode() ) { continue; - } else { - $aloption[] = 'substr=' . $variant; - - // IE and some other browsers use BCP 47 standards in - // their Accept-Language header, like "zh-CN" or "zh-Hant". - // We should handle these too. - $variantBCP47 = LanguageCode::bcp47( $variant ); - if ( $variantBCP47 !== $variant ) { - $aloption[] = 'substr=' . $variantBCP47; - } + } + + $aloption[] = "substr=$variant"; + + // IE and some other browsers use BCP 47 standards in their Accept-Language header, + // like "zh-CN" or "zh-Hant". We should handle these too. + $variantBCP47 = LanguageCode::bcp47( $variant ); + if ( $variantBCP47 !== $variant ) { + $aloption[] = "substr=$variantBCP47"; } } $this->addVaryHeader( 'Accept-Language', $aloption ); @@ -2307,8 +2313,6 @@ class OutputPage extends ContextSource { * @throws MWException */ public function output( $return = false ) { - global $wgContLang; - if ( $this->mDoNothing ) { return $return ? '' : null; } @@ -2355,7 +2359,8 @@ class OutputPage extends ContextSource { ob_start(); $response->header( 'Content-type: ' . $config->get( 'MimeType' ) . '; charset=UTF-8' ); - $response->header( 'Content-language: ' . $wgContLang->getHtmlCode() ); + $response->header( 'Content-language: ' . + MediaWikiServices::getInstance()->getContentLanguage()->getHtmlCode() ); if ( !$this->mArticleBodyOnly ) { $sk = $this->getSkin(); @@ -2751,7 +2756,7 @@ class OutputPage extends ContextSource { $this->rlClientContext = new DerivativeResourceLoaderContext( $this->rlClientContext ); $this->rlClientContext->setContentOverrideCallback( function ( Title $title ) { foreach ( $this->contentOverrideCallbacks as $callback ) { - $content = call_user_func( $callback, $title ); + $content = $callback( $title ); if ( $content !== null ) { return $content; } @@ -2853,10 +2858,8 @@ class OutputPage extends ContextSource { * @return string The doctype, opening "", and head element. */ public function headElement( Skin $sk, $includeStyle = true ) { - global $wgContLang; - $userdir = $this->getLanguage()->getDir(); - $sitedir = $wgContLang->getDir(); + $sitedir = MediaWikiServices::getInstance()->getContentLanguage()->getDir(); $pieces = []; $pieces[] = Html::htmlHeader( Sanitizer::mergeAttributes( @@ -3054,11 +3057,10 @@ class OutputPage extends ContextSource { * @return array */ public function getJSVars() { - global $wgContLang; - $curRevisionId = 0; $articleId = 0; $canonicalSpecialPageName = false; # T23115 + $services = MediaWikiServices::getInstance(); $title = $this->getTitle(); $ns = $title->getNamespace(); @@ -3074,7 +3076,8 @@ class OutputPage extends ContextSource { if ( $ns == NS_SPECIAL ) { list( $canonicalSpecialPageName, /*...*/ ) = - SpecialPageFactory::resolveAlias( $title->getDBkey() ); + $services->getSpecialPageFactory()-> + resolveAlias( $title->getDBkey() ); } elseif ( $this->canUseWikiPage() ) { $wikiPage = $this->getWikiPage(); $curRevisionId = $wikiPage->getLatest(); @@ -3125,6 +3128,7 @@ class OutputPage extends ContextSource { 'wgRelevantPageName' => $relevantTitle->getPrefixedDBkey(), 'wgRelevantArticleId' => $relevantTitle->getArticleID(), 'wgRequestId' => WebRequest::getRequestId(), + 'wgCSPNonce' => $this->getCSPNonce(), ]; if ( $user->isLoggedIn() ) { @@ -3138,8 +3142,9 @@ class OutputPage extends ContextSource { $vars['wgUserNewMsgRevisionId'] = $user->getNewMessageRevisionId(); } - if ( $wgContLang->hasVariants() ) { - $vars['wgUserVariant'] = $wgContLang->getPreferredVariant(); + $contLang = $services->getContentLanguage(); + if ( $contLang->hasVariants() ) { + $vars['wgUserVariant'] = $contLang->getPreferredVariant(); } // Same test as SkinTemplate $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user ) diff --git a/includes/PHPVersionCheck.php b/includes/PHPVersionCheck.php index 8eda14ad99..c49318bb1e 100644 --- a/includes/PHPVersionCheck.php +++ b/includes/PHPVersionCheck.php @@ -19,6 +19,7 @@ */ // phpcs:disable Generic.Arrays.DisallowLongArraySyntax,PSR2.Classes.PropertyDeclaration,MediaWiki.Usage.DirUsage +// phpcs:disable Squiz.Scope.MemberVarScope.Missing,Squiz.Scope.MethodScope.Missing /** * Check PHP Version, as well as for composer dependencies in entry points, * and display something vaguely comprehensible in the event of a totally @@ -71,7 +72,7 @@ class PHPVersionCheck { * - 'implementation': The name of the implementation used * - 'vendor': The development group, vendor or developer of the implementation. * - 'upstreamSupported': The minimum version of the implementation supported by the named vendor. - * - 'minSupported': The minimum version supported by MediWiki + * - 'minSupported': The minimum version supported by MediaWiki * - 'upgradeURL': The URL to the website of the implementation that contains * upgrade/installation instructions. */ diff --git a/includes/Preferences.php b/includes/Preferences.php index a8a312c3bd..6d379dcb49 100644 --- a/includes/Preferences.php +++ b/includes/Preferences.php @@ -35,12 +35,13 @@ class Preferences { * @return DefaultPreferencesFactory */ protected static function getDefaultPreferencesFactory() { - global $wgContLang; + $services = MediaWikiServices::getInstance(); $authManager = AuthManager::singleton(); - $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); - $config = MediaWikiServices::getInstance()->getMainConfig(); + $linkRenderer = $services->getLinkRenderer(); + $config = $services->getMainConfig(); $preferencesFactory = new DefaultPreferencesFactory( - $config, $wgContLang, $authManager, $linkRenderer + $config, $services->getContentLanguage(), $authManager, + $linkRenderer ); return $preferencesFactory; } diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php index 63a4d9c620..7bc7a084a5 100644 --- a/includes/PrefixSearch.php +++ b/includes/PrefixSearch.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * Handles searching prefixes of titles and finding any page * names that match. Used largely by the OpenSearch implementation. @@ -81,9 +83,8 @@ abstract class PrefixSearch { // if the content language has variants, try to retrieve fallback results $fallbackLimit = $limit - count( $searches ); if ( $fallbackLimit > 0 ) { - global $wgContLang; - - $fallbackSearches = $wgContLang->autoConvertToAllVariants( $search ); + $fallbackSearches = MediaWikiServices::getInstance()->getContentLanguage()-> + autoConvertToAllVariants( $search ); $fallbackSearches = array_diff( array_unique( $fallbackSearches ), [ $search ] ); foreach ( $fallbackSearches as $fbs ) { @@ -167,20 +168,19 @@ abstract class PrefixSearch { * @return array */ protected function specialSearch( $search, $limit, $offset ) { - global $wgContLang; - $searchParts = explode( '/', $search, 2 ); $searchKey = $searchParts[0]; $subpageSearch = $searchParts[1] ?? null; // Handle subpage search separately. + $spFactory = MediaWikiServices::getInstance()->getSpecialPageFactory(); if ( $subpageSearch !== null ) { // Try matching the full search string as a page name $specialTitle = Title::makeTitleSafe( NS_SPECIAL, $searchKey ); if ( !$specialTitle ) { return []; } - $special = SpecialPageFactory::getPage( $specialTitle->getText() ); + $special = $spFactory->getPage( $specialTitle->getText() ); if ( $special ) { $subpages = $special->prefixSearchSubpages( $subpageSearch, $limit, $offset ); return array_map( function ( $sub ) use ( $specialTitle ) { @@ -192,23 +192,24 @@ abstract class PrefixSearch { } # normalize searchKey, so aliases with spaces can be found - T27675 + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $searchKey = str_replace( ' ', '_', $searchKey ); - $searchKey = $wgContLang->caseFold( $searchKey ); + $searchKey = $contLang->caseFold( $searchKey ); // Unlike SpecialPage itself, we want the canonical forms of both // canonical and alias title forms... $keys = []; - foreach ( SpecialPageFactory::getNames() as $page ) { - $keys[$wgContLang->caseFold( $page )] = [ 'page' => $page, 'rank' => 0 ]; + foreach ( $spFactory->getNames() as $page ) { + $keys[$contLang->caseFold( $page )] = [ 'page' => $page, 'rank' => 0 ]; } - foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) { - if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# T22885 + foreach ( $contLang->getSpecialPageAliases() as $page => $aliases ) { + if ( !in_array( $page, $spFactory->getNames() ) ) {# T22885 continue; } foreach ( $aliases as $key => $alias ) { - $keys[$wgContLang->caseFold( $alias )] = [ 'page' => $alias, 'rank' => $key ]; + $keys[$contLang->caseFold( $alias )] = [ 'page' => $alias, 'rank' => $key ]; } } ksort( $keys ); @@ -307,10 +308,8 @@ abstract class PrefixSearch { * @return array (default: contains only NS_MAIN) */ protected function validateNamespaces( $namespaces ) { - global $wgContLang; - - // We will look at each given namespace against wgContLang namespaces - $validNamespaces = $wgContLang->getNamespaces(); + // We will look at each given namespace against content language namespaces + $validNamespaces = MediaWikiServices::getInstance()->getContentLanguage()->getNamespaces(); if ( is_array( $namespaces ) && count( $namespaces ) > 0 ) { $valid = []; foreach ( $namespaces as $ns ) { diff --git a/includes/Revision.php b/includes/Revision.php index 7ff73dddbf..6d684a8052 100644 --- a/includes/Revision.php +++ b/includes/Revision.php @@ -1013,7 +1013,7 @@ class Revision implements IDBAccessObject { * @param stdClass $row The text data * @param string $prefix Table prefix (default 'old_') * @param string|bool $wiki The name of the wiki to load the revision text from - * (same as the the wiki $row was loaded from) or false to indicate the local + * (same as the wiki $row was loaded from) or false to indicate the local * wiki (this is the default). Otherwise, it must be a symbolic wiki database * identifier as understood by the LoadBalancer class. * @return string|false Text the text requested or false on failure diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 66b4c0c810..1a19465ed5 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -37,64 +37,74 @@ * MediaWiki code base. */ +use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface; use MediaWiki\Auth\AuthManager; use MediaWiki\Config\ConfigRepository; use MediaWiki\Interwiki\ClassicInterwikiLookup; +use MediaWiki\Interwiki\InterwikiLookup; +use MediaWiki\Linker\LinkRenderer; use MediaWiki\Linker\LinkRendererFactory; use MediaWiki\Logger\LoggerFactory; use MediaWiki\MediaWikiServices; +use MediaWiki\Preferences\PreferencesFactory; use MediaWiki\Preferences\DefaultPreferencesFactory; use MediaWiki\Shell\CommandFactory; +use MediaWiki\Special\SpecialPageFactory; +use MediaWiki\Storage\BlobStore; use MediaWiki\Storage\BlobStoreFactory; use MediaWiki\Storage\NameTableStore; +use MediaWiki\Storage\RevisionFactory; +use MediaWiki\Storage\RevisionLookup; use MediaWiki\Storage\RevisionStore; +use MediaWiki\Storage\RevisionStoreFactory; use MediaWiki\Storage\SqlBlobStore; -use Wikimedia\ObjectFactory; return [ - 'DBLoadBalancerFactory' => function ( MediaWikiServices $services ) { - $mainConfig = $services->getMainConfig(); - - $lbConf = MWLBFactory::applyDefaultConfig( - $mainConfig->get( 'LBFactoryConf' ), - $mainConfig, - $services->getConfiguredReadOnlyMode() + 'ActorMigration' => function ( MediaWikiServices $services ) : ActorMigration { + return new ActorMigration( + $services->getMainConfig()->get( 'ActorTableSchemaMigrationStage' ) ); - $class = MWLBFactory::getLBFactoryClass( $lbConf ); - - $instance = new $class( $lbConf ); - MWLBFactory::setSchemaAliases( $instance, $mainConfig ); - - return $instance; }, - 'DBLoadBalancer' => function ( MediaWikiServices $services ) { - // just return the default LB from the DBLoadBalancerFactory service - return $services->getDBLoadBalancerFactory()->getMainLB(); + 'BlobStore' => function ( MediaWikiServices $services ) : BlobStore { + return $services->getService( '_SqlBlobStore' ); }, - 'SiteStore' => function ( MediaWikiServices $services ) { - $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() ); - - // TODO: replace wfGetCache with a CacheFactory service. - // TODO: replace wfIsHHVM with a capabilities service. - $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING ); - - return new CachingSiteStore( $rawSiteStore, $cache ); + 'BlobStoreFactory' => function ( MediaWikiServices $services ) : BlobStoreFactory { + return new BlobStoreFactory( + $services->getDBLoadBalancer(), + $services->getMainWANObjectCache(), + $services->getMainConfig(), + $services->getContentLanguage() + ); }, - 'SiteLookup' => function ( MediaWikiServices $services ) { - $cacheFile = $services->getMainConfig()->get( 'SitesCacheFile' ); + 'ChangeTagDefStore' => function ( MediaWikiServices $services ) : NameTableStore { + return new NameTableStore( + $services->getDBLoadBalancer(), + $services->getMainWANObjectCache(), + LoggerFactory::getInstance( 'NameTableSqlStore' ), + 'change_tag_def', + 'ctd_id', + 'ctd_name', + null, + false, + function ( $insertFields ) { + $insertFields['ctd_user_defined'] = 0; + $insertFields['ctd_count'] = 0; + return $insertFields; + } + ); + }, - if ( $cacheFile !== false ) { - return new FileBasedSiteLookup( $cacheFile ); - } else { - // Use the default SiteStore as the SiteLookup implementation for now - return $services->getSiteStore(); - } + 'CommentStore' => function ( MediaWikiServices $services ) : CommentStore { + return new CommentStore( + $services->getContentLanguage(), + $services->getMainConfig()->get( 'CommentTableSchemaMigrationStage' ) + ); }, - 'ConfigFactory' => function ( MediaWikiServices $services ) { + 'ConfigFactory' => function ( MediaWikiServices $services ) : ConfigFactory { // Use the bootstrap config to initialize the ConfigFactory. $registry = $services->getBootstrapConfig()->get( 'ConfigRegistry' ); $factory = new ConfigFactory(); @@ -105,134 +115,192 @@ return [ return $factory; }, - 'ConfigRepository' => function ( MediaWikiServices $services ) { + 'ConfigRepository' => function ( MediaWikiServices $services ) : ConfigRepository { return new ConfigRepository( $services->getConfigFactory() ); }, - 'MainConfig' => function ( MediaWikiServices $services ) { - // Use the 'main' config from the ConfigFactory service. - return $services->getConfigFactory()->makeConfig( 'main' ); + 'ConfiguredReadOnlyMode' => function ( MediaWikiServices $services ) : ConfiguredReadOnlyMode { + return new ConfiguredReadOnlyMode( $services->getMainConfig() ); }, - 'InterwikiLookup' => function ( MediaWikiServices $services ) { - global $wgContLang; // TODO: manage $wgContLang as a service - $config = $services->getMainConfig(); - return new ClassicInterwikiLookup( - $wgContLang, + 'ContentLanguage' => function ( MediaWikiServices $services ) : Language { + return Language::factory( $services->getMainConfig()->get( 'LanguageCode' ) ); + }, + + 'ContentModelStore' => function ( MediaWikiServices $services ) : NameTableStore { + return new NameTableStore( + $services->getDBLoadBalancer(), $services->getMainWANObjectCache(), - $config->get( 'InterwikiExpiry' ), - $config->get( 'InterwikiCache' ), - $config->get( 'InterwikiScopes' ), - $config->get( 'InterwikiFallbackSite' ) + LoggerFactory::getInstance( 'NameTableSqlStore' ), + 'content_models', + 'model_id', + 'model_name' + /** + * No strtolower normalization is added to the service as there are examples of + * extensions that do not stick to this assumption. + * - extensions/examples/DataPages define( 'CONTENT_MODEL_XML_DATA','XML_DATA' ); + * - extensions/Scribunto define( 'CONTENT_MODEL_SCRIBUNTO', 'Scribunto' ); + */ ); }, - 'StatsdDataFactory' => function ( MediaWikiServices $services ) { - return new BufferingStatsdDataFactory( - rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' ) + 'CryptHKDF' => function ( MediaWikiServices $services ) : CryptHKDF { + $config = $services->getMainConfig(); + + $secret = $config->get( 'HKDFSecret' ) ?: $config->get( 'SecretKey' ); + if ( !$secret ) { + throw new RuntimeException( "Cannot use MWCryptHKDF without a secret." ); + } + + // In HKDF, the context can be known to the attacker, but this will + // keep simultaneous runs from producing the same output. + $context = [ microtime(), getmypid(), gethostname() ]; + + // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup + $cache = $services->getLocalServerObjectCache(); + if ( $cache instanceof EmptyBagOStuff ) { + $cache = ObjectCache::getLocalClusterInstance(); + } + + return new CryptHKDF( $secret, $config->get( 'HKDFAlgorithm' ), $cache, $context ); + }, + + 'CryptRand' => function () : CryptRand { + return new CryptRand(); + }, + + 'DBLoadBalancer' => function ( MediaWikiServices $services ) : Wikimedia\Rdbms\LoadBalancer { + // just return the default LB from the DBLoadBalancerFactory service + return $services->getDBLoadBalancerFactory()->getMainLB(); + }, + + 'DBLoadBalancerFactory' => + function ( MediaWikiServices $services ) : Wikimedia\Rdbms\LBFactory { + $mainConfig = $services->getMainConfig(); + + $lbConf = MWLBFactory::applyDefaultConfig( + $mainConfig->get( 'LBFactoryConf' ), + $mainConfig, + $services->getConfiguredReadOnlyMode() ); + $class = MWLBFactory::getLBFactoryClass( $lbConf ); + + $instance = new $class( $lbConf ); + MWLBFactory::setSchemaAliases( $instance, $mainConfig ); + + return $instance; + }, + + 'EventRelayerGroup' => function ( MediaWikiServices $services ) : EventRelayerGroup { + return new EventRelayerGroup( $services->getMainConfig()->get( 'EventRelayerConfig' ) ); }, - 'PerDbNameStatsdDataFactory' => function ( MediaWikiServices $services ) { + 'ExternalStoreFactory' => function ( MediaWikiServices $services ) : ExternalStoreFactory { $config = $services->getMainConfig(); - $wiki = $config->get( 'DBname' ); - return new BufferingStatsdDataFactory( - rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ) ) . '.' . $wiki + + return new ExternalStoreFactory( + $config->get( 'ExternalStores' ) ); }, - 'EventRelayerGroup' => function ( MediaWikiServices $services ) { - return new EventRelayerGroup( $services->getMainConfig()->get( 'EventRelayerConfig' ) ); + 'GenderCache' => function ( MediaWikiServices $services ) : GenderCache { + return new GenderCache(); }, - 'SearchEngineFactory' => function ( MediaWikiServices $services ) { - return new SearchEngineFactory( $services->getSearchEngineConfig() ); + 'HttpRequestFactory' => + function ( MediaWikiServices $services ) : \MediaWiki\Http\HttpRequestFactory { + return new \MediaWiki\Http\HttpRequestFactory(); }, - 'SearchEngineConfig' => function ( MediaWikiServices $services ) { - global $wgContLang; - return new SearchEngineConfig( $services->getMainConfig(), $wgContLang ); + 'InterwikiLookup' => function ( MediaWikiServices $services ) : InterwikiLookup { + $config = $services->getMainConfig(); + return new ClassicInterwikiLookup( + $services->getContentLanguage(), + $services->getMainWANObjectCache(), + $config->get( 'InterwikiExpiry' ), + $config->get( 'InterwikiCache' ), + $config->get( 'InterwikiScopes' ), + $config->get( 'InterwikiFallbackSite' ) + ); }, - 'SkinFactory' => function ( MediaWikiServices $services ) { - $factory = new SkinFactory(); + 'LinkCache' => function ( MediaWikiServices $services ) : LinkCache { + return new LinkCache( + $services->getTitleFormatter(), + $services->getMainWANObjectCache() + ); + }, - $names = $services->getMainConfig()->get( 'ValidSkinNames' ); + 'LinkRenderer' => function ( MediaWikiServices $services ) : LinkRenderer { + global $wgUser; - foreach ( $names as $name => $skin ) { - $factory->register( $name, $skin, function () use ( $name, $skin ) { - $class = "Skin$skin"; - return new $class( $name ); - } ); + if ( defined( 'MW_NO_SESSION' ) ) { + return $services->getLinkRendererFactory()->create(); + } else { + return $services->getLinkRendererFactory()->createForUser( $wgUser ); } - // Register a hidden "fallback" skin - $factory->register( 'fallback', 'Fallback', function () { - return new SkinFallback; - } ); - // Register a hidden skin for api output - $factory->register( 'apioutput', 'ApiOutput', function () { - return new SkinApi; - } ); - - return $factory; }, - 'WatchedItemStore' => function ( MediaWikiServices $services ) { - $store = new WatchedItemStore( - $services->getDBLoadBalancer(), - new HashBagOStuff( [ 'maxKeys' => 100 ] ), - $services->getReadOnlyMode(), - $services->getMainConfig()->get( 'UpdateRowsPerQuery' ) + 'LinkRendererFactory' => function ( MediaWikiServices $services ) : LinkRendererFactory { + return new LinkRendererFactory( + $services->getTitleFormatter(), + $services->getLinkCache() ); - $store->setStatsdDataFactory( $services->getStatsdDataFactory() ); - - if ( $services->getMainConfig()->get( 'ReadOnlyWatchedItemStore' ) ) { - $store = new NoWriteWatchedItemStore( $store ); - } + }, - return $store; + 'LocalServerObjectCache' => function ( MediaWikiServices $services ) : BagOStuff { + $cacheId = \ObjectCache::detectLocalServerCache(); + return \ObjectCache::newFromId( $cacheId ); }, - 'WatchedItemQueryService' => function ( MediaWikiServices $services ) { - return new WatchedItemQueryService( - $services->getDBLoadBalancer(), - $services->getCommentStore(), - $services->getActorMigration() - ); + 'MagicWordFactory' => function ( MediaWikiServices $services ) : MagicWordFactory { + return new MagicWordFactory( $services->getContentLanguage() ); }, - 'CryptRand' => function () { - return new CryptRand(); + 'MainConfig' => function ( MediaWikiServices $services ) : Config { + // Use the 'main' config from the ConfigFactory service. + return $services->getConfigFactory()->makeConfig( 'main' ); }, - 'CryptHKDF' => function ( MediaWikiServices $services ) { - $config = $services->getMainConfig(); + 'MainObjectStash' => function ( MediaWikiServices $services ) : BagOStuff { + $mainConfig = $services->getMainConfig(); - $secret = $config->get( 'HKDFSecret' ) ?: $config->get( 'SecretKey' ); - if ( !$secret ) { - throw new RuntimeException( "Cannot use MWCryptHKDF without a secret." ); + $id = $mainConfig->get( 'MainStash' ); + if ( !isset( $mainConfig->get( 'ObjectCaches' )[$id] ) ) { + throw new UnexpectedValueException( + "Cache type \"$id\" is not present in \$wgObjectCaches." ); } - // In HKDF, the context can be known to the attacker, but this will - // keep simultaneous runs from producing the same output. - $context = [ microtime(), getmypid(), gethostname() ]; + return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] ); + }, - // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup - $cache = $services->getLocalServerObjectCache(); - if ( $cache instanceof EmptyBagOStuff ) { - $cache = ObjectCache::getLocalClusterInstance(); + 'MainWANObjectCache' => function ( MediaWikiServices $services ) : WANObjectCache { + $mainConfig = $services->getMainConfig(); + + $id = $mainConfig->get( 'MainWANCache' ); + if ( !isset( $mainConfig->get( 'WANObjectCaches' )[$id] ) ) { + throw new UnexpectedValueException( + "WAN cache type \"$id\" is not present in \$wgWANObjectCaches." ); } - return new CryptHKDF( $secret, $config->get( 'HKDFAlgorithm' ), $cache, $context ); + $params = $mainConfig->get( 'WANObjectCaches' )[$id]; + $objectCacheId = $params['cacheId']; + if ( !isset( $mainConfig->get( 'ObjectCaches' )[$objectCacheId] ) ) { + throw new UnexpectedValueException( + "Cache type \"$objectCacheId\" is not present in \$wgObjectCaches." ); + } + $params['store'] = $mainConfig->get( 'ObjectCaches' )[$objectCacheId]; + + return \ObjectCache::newWANCacheFromParams( $params ); }, - 'MediaHandlerFactory' => function ( MediaWikiServices $services ) { + 'MediaHandlerFactory' => function ( MediaWikiServices $services ) : MediaHandlerFactory { return new MediaHandlerFactory( $services->getMainConfig()->get( 'MediaHandlers' ) ); }, - 'MimeAnalyzer' => function ( MediaWikiServices $services ) { + 'MimeAnalyzer' => function ( MediaWikiServices $services ) : MimeAnalyzer { $logger = LoggerFactory::getInstance( 'Mime' ); $mainConfig = $services->getMainConfig(); $params = [ @@ -291,21 +359,19 @@ return [ return new MimeMagic( $params ); }, - 'ProxyLookup' => function ( MediaWikiServices $services ) { - $mainConfig = $services->getMainConfig(); - return new ProxyLookup( - $mainConfig->get( 'SquidServers' ), - $mainConfig->get( 'SquidServersNoPurge' ) + 'OldRevisionImporter' => function ( MediaWikiServices $services ) : OldRevisionImporter { + return new ImportableOldRevisionImporter( + true, + LoggerFactory::getInstance( 'OldRevisionImporter' ), + $services->getDBLoadBalancer() ); }, - 'Parser' => function ( MediaWikiServices $services ) { - $conf = $services->getMainConfig()->get( 'ParserConf' ); - return ObjectFactory::constructClassInstance( $conf['class'], - [ $conf, $services->getMagicWordFactory() ] ); + 'Parser' => function ( MediaWikiServices $services ) : Parser { + return $services->getParserFactory()->create(); }, - 'ParserCache' => function ( MediaWikiServices $services ) { + 'ParserCache' => function ( MediaWikiServices $services ) : ParserCache { $config = $services->getMainConfig(); $cache = ObjectCache::getInstance( $config->get( 'ParserCacheType' ) ); wfDebugLog( 'caches', 'parser: ' . get_class( $cache ) ); @@ -316,140 +382,99 @@ return [ ); }, - 'LinkCache' => function ( MediaWikiServices $services ) { - return new LinkCache( - $services->getTitleFormatter(), - $services->getMainWANObjectCache() + 'ParserFactory' => function ( MediaWikiServices $services ) : ParserFactory { + return new ParserFactory( + $services->getMainConfig()->get( 'ParserConf' ), + $services->getMagicWordFactory(), + $services->getContentLanguage(), + wfUrlProtocols(), + $services->getSpecialPageFactory() ); }, - 'LinkRendererFactory' => function ( MediaWikiServices $services ) { - return new LinkRendererFactory( - $services->getTitleFormatter(), - $services->getLinkCache() + 'PasswordFactory' => function ( MediaWikiServices $services ) : PasswordFactory { + $config = $services->getMainConfig(); + return new PasswordFactory( + $config->get( 'PasswordConfig' ), + $config->get( 'PasswordDefault' ) ); }, - 'LinkRenderer' => function ( MediaWikiServices $services ) { - global $wgUser; - - if ( defined( 'MW_NO_SESSION' ) ) { - return $services->getLinkRendererFactory()->create(); - } else { - return $services->getLinkRendererFactory()->createForUser( $wgUser ); - } - }, - - 'GenderCache' => function ( MediaWikiServices $services ) { - return new GenderCache(); - }, - - '_MediaWikiTitleCodec' => function ( MediaWikiServices $services ) { - global $wgContLang; - - return new MediaWikiTitleCodec( - $wgContLang, - $services->getGenderCache(), - $services->getMainConfig()->get( 'LocalInterwikis' ) + 'PerDbNameStatsdDataFactory' => + function ( MediaWikiServices $services ) : StatsdDataFactoryInterface { + $config = $services->getMainConfig(); + $wiki = $config->get( 'DBname' ); + return new PrefixingStatsdDataFactoryProxy( + $services->getStatsdDataFactory(), + $wiki ); }, - 'TitleFormatter' => function ( MediaWikiServices $services ) { - return $services->getService( '_MediaWikiTitleCodec' ); - }, + 'PreferencesFactory' => function ( MediaWikiServices $services ) : PreferencesFactory { + $factory = new DefaultPreferencesFactory( + $services->getMainConfig(), + $services->getContentLanguage(), + AuthManager::singleton(), + $services->getLinkRendererFactory()->create() + ); + $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) ); - 'TitleParser' => function ( MediaWikiServices $services ) { - return $services->getService( '_MediaWikiTitleCodec' ); + return $factory; }, - 'MainObjectStash' => function ( MediaWikiServices $services ) { + 'ProxyLookup' => function ( MediaWikiServices $services ) : ProxyLookup { $mainConfig = $services->getMainConfig(); - - $id = $mainConfig->get( 'MainStash' ); - if ( !isset( $mainConfig->get( 'ObjectCaches' )[$id] ) ) { - throw new UnexpectedValueException( - "Cache type \"$id\" is not present in \$wgObjectCaches." ); - } - - return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] ); + return new ProxyLookup( + $mainConfig->get( 'SquidServers' ), + $mainConfig->get( 'SquidServersNoPurge' ) + ); }, - 'MainWANObjectCache' => function ( MediaWikiServices $services ) { - $mainConfig = $services->getMainConfig(); - - $id = $mainConfig->get( 'MainWANCache' ); - if ( !isset( $mainConfig->get( 'WANObjectCaches' )[$id] ) ) { - throw new UnexpectedValueException( - "WAN cache type \"$id\" is not present in \$wgWANObjectCaches." ); - } - - $params = $mainConfig->get( 'WANObjectCaches' )[$id]; - $objectCacheId = $params['cacheId']; - if ( !isset( $mainConfig->get( 'ObjectCaches' )[$objectCacheId] ) ) { - throw new UnexpectedValueException( - "Cache type \"$objectCacheId\" is not present in \$wgObjectCaches." ); - } - $params['store'] = $mainConfig->get( 'ObjectCaches' )[$objectCacheId]; - - return \ObjectCache::newWANCacheFromParams( $params ); + 'ReadOnlyMode' => function ( MediaWikiServices $services ) : ReadOnlyMode { + return new ReadOnlyMode( + $services->getConfiguredReadOnlyMode(), + $services->getDBLoadBalancer() + ); }, - 'LocalServerObjectCache' => function ( MediaWikiServices $services ) { - $cacheId = \ObjectCache::detectLocalServerCache(); - return \ObjectCache::newFromId( $cacheId ); + 'RevisionFactory' => function ( MediaWikiServices $services ) : RevisionFactory { + return $services->getRevisionStore(); }, - 'VirtualRESTServiceClient' => function ( MediaWikiServices $services ) { - $config = $services->getMainConfig()->get( 'VirtualRestConfig' ); - - $vrsClient = new VirtualRESTServiceClient( new MultiHttpClient( [] ) ); - foreach ( $config['paths'] as $prefix => $serviceConfig ) { - $class = $serviceConfig['class']; - // Merge in the global defaults - $constructArg = $serviceConfig['options'] ?? []; - $constructArg += $config['global']; - // Make the VRS service available at the mount point - $vrsClient->mount( $prefix, [ 'class' => $class, 'config' => $constructArg ] ); - } - - return $vrsClient; + 'RevisionLookup' => function ( MediaWikiServices $services ) : RevisionLookup { + return $services->getRevisionStore(); }, - 'ConfiguredReadOnlyMode' => function ( MediaWikiServices $services ) { - return new ConfiguredReadOnlyMode( $services->getMainConfig() ); + 'RevisionStore' => function ( MediaWikiServices $services ) : RevisionStore { + return $services->getRevisionStoreFactory()->getRevisionStore(); }, - 'ReadOnlyMode' => function ( MediaWikiServices $services ) { - return new ReadOnlyMode( - $services->getConfiguredReadOnlyMode(), - $services->getDBLoadBalancer() + 'RevisionStoreFactory' => function ( MediaWikiServices $services ) : RevisionStoreFactory { + $config = $services->getMainConfig(); + $store = new RevisionStoreFactory( + $services->getDBLoadBalancerFactory(), + $services->getBlobStoreFactory(), + $services->getMainWANObjectCache(), + $services->getCommentStore(), + $services->getActorMigration(), + $config->get( 'MultiContentRevisionSchemaMigrationStage' ), + LoggerFactory::getProvider(), + $config->get( 'ContentHandlerUseDB' ) ); - }, - 'UploadRevisionImporter' => function ( MediaWikiServices $services ) { - return new ImportableUploadRevisionImporter( - $services->getMainConfig()->get( 'EnableUploads' ), - LoggerFactory::getInstance( 'UploadRevisionImporter' ) - ); + return $store; }, - 'OldRevisionImporter' => function ( MediaWikiServices $services ) { - return new ImportableOldRevisionImporter( - true, - LoggerFactory::getInstance( 'OldRevisionImporter' ), - $services->getDBLoadBalancer() - ); + 'SearchEngineConfig' => function ( MediaWikiServices $services ) : SearchEngineConfig { + return new SearchEngineConfig( $services->getMainConfig(), + $services->getContentLanguage() ); }, - 'WikiRevisionOldRevisionImporterNoUpdates' => function ( MediaWikiServices $services ) { - return new ImportableOldRevisionImporter( - false, - LoggerFactory::getInstance( 'OldRevisionImporter' ), - $services->getDBLoadBalancer() - ); + 'SearchEngineFactory' => function ( MediaWikiServices $services ) : SearchEngineFactory { + return new SearchEngineFactory( $services->getSearchEngineConfig() ); }, - 'ShellCommandFactory' => function ( MediaWikiServices $services ) { + 'ShellCommandFactory' => function ( MediaWikiServices $services ) : CommandFactory { $config = $services->getMainConfig(); $limits = [ @@ -468,142 +493,152 @@ return [ return $factory; }, - 'ExternalStoreFactory' => function ( MediaWikiServices $services ) { - $config = $services->getMainConfig(); + 'SiteLookup' => function ( MediaWikiServices $services ) : SiteLookup { + $cacheFile = $services->getMainConfig()->get( 'SitesCacheFile' ); - return new ExternalStoreFactory( - $config->get( 'ExternalStores' ) - ); + if ( $cacheFile !== false ) { + return new FileBasedSiteLookup( $cacheFile ); + } else { + // Use the default SiteStore as the SiteLookup implementation for now + return $services->getSiteStore(); + } }, - 'RevisionStore' => function ( MediaWikiServices $services ) { - /** @var SqlBlobStore $blobStore */ - $blobStore = $services->getService( '_SqlBlobStore' ); + 'SiteStore' => function ( MediaWikiServices $services ) : SiteStore { + $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() ); - $store = new RevisionStore( - $services->getDBLoadBalancer(), - $blobStore, - $services->getMainWANObjectCache(), - $services->getCommentStore(), - $services->getContentModelStore(), - $services->getSlotRoleStore(), - $services->getMainConfig()->get( 'MultiContentRevisionSchemaMigrationStage' ), - $services->getActorMigration() - ); + // TODO: replace wfGetCache with a CacheFactory service. + // TODO: replace wfIsHHVM with a capabilities service. + $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING ); - $store->setLogger( LoggerFactory::getInstance( 'RevisionStore' ) ); + return new CachingSiteStore( $rawSiteStore, $cache ); + }, - $config = $services->getMainConfig(); - $store->setContentHandlerUseDB( $config->get( 'ContentHandlerUseDB' ) ); + 'SkinFactory' => function ( MediaWikiServices $services ) : SkinFactory { + $factory = new SkinFactory(); - return $store; - }, + $names = $services->getMainConfig()->get( 'ValidSkinNames' ); - 'RevisionLookup' => function ( MediaWikiServices $services ) { - return $services->getRevisionStore(); - }, + foreach ( $names as $name => $skin ) { + $factory->register( $name, $skin, function () use ( $name, $skin ) { + $class = "Skin$skin"; + return new $class( $name ); + } ); + } + // Register a hidden "fallback" skin + $factory->register( 'fallback', 'Fallback', function () { + return new SkinFallback; + } ); + // Register a hidden skin for api output + $factory->register( 'apioutput', 'ApiOutput', function () { + return new SkinApi; + } ); - 'RevisionFactory' => function ( MediaWikiServices $services ) { - return $services->getRevisionStore(); + return $factory; }, - 'BlobStoreFactory' => function ( MediaWikiServices $services ) { - global $wgContLang; - return new BlobStoreFactory( + 'SlotRoleStore' => function ( MediaWikiServices $services ) : NameTableStore { + return new NameTableStore( $services->getDBLoadBalancer(), $services->getMainWANObjectCache(), + LoggerFactory::getInstance( 'NameTableSqlStore' ), + 'slot_roles', + 'role_id', + 'role_name', + 'strtolower' + ); + }, + + 'SpecialPageFactory' => function ( MediaWikiServices $services ) : SpecialPageFactory { + return new SpecialPageFactory( $services->getMainConfig(), - $wgContLang + $services->getContentLanguage() ); }, - 'BlobStore' => function ( MediaWikiServices $services ) { - return $services->getService( '_SqlBlobStore' ); + 'StatsdDataFactory' => function ( MediaWikiServices $services ) : IBufferingStatsdDataFactory { + return new BufferingStatsdDataFactory( + rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' ) + ); }, - '_SqlBlobStore' => function ( MediaWikiServices $services ) { - return $services->getBlobStoreFactory()->newSqlBlobStore(); + 'TitleFormatter' => function ( MediaWikiServices $services ) : TitleFormatter { + return $services->getService( '_MediaWikiTitleCodec' ); }, - 'ContentModelStore' => function ( MediaWikiServices $services ) { - return new NameTableStore( - $services->getDBLoadBalancer(), - $services->getMainWANObjectCache(), - LoggerFactory::getInstance( 'NameTableSqlStore' ), - 'content_models', - 'model_id', - 'model_name' - /** - * No strtolower normalization is added to the service as there are examples of - * extensions that do not stick to this assumption. - * - extensions/examples/DataPages define( 'CONTENT_MODEL_XML_DATA','XML_DATA' ); - * - extensions/Scribunto define( 'CONTENT_MODEL_SCRIBUNTO', 'Scribunto' ); - */ - ); + 'TitleParser' => function ( MediaWikiServices $services ) : TitleParser { + return $services->getService( '_MediaWikiTitleCodec' ); }, - 'SlotRoleStore' => function ( MediaWikiServices $services ) { - return new NameTableStore( - $services->getDBLoadBalancer(), - $services->getMainWANObjectCache(), - LoggerFactory::getInstance( 'NameTableSqlStore' ), - 'slot_roles', - 'role_id', - 'role_name', - 'strtolower' + 'UploadRevisionImporter' => function ( MediaWikiServices $services ) : UploadRevisionImporter { + return new ImportableUploadRevisionImporter( + $services->getMainConfig()->get( 'EnableUploads' ), + LoggerFactory::getInstance( 'UploadRevisionImporter' ) ); }, - 'ChangeTagDefStore' => function ( MediaWikiServices $services ) { - return new NameTableStore( + 'VirtualRESTServiceClient' => + function ( MediaWikiServices $services ) : VirtualRESTServiceClient { + $config = $services->getMainConfig()->get( 'VirtualRestConfig' ); + + $vrsClient = new VirtualRESTServiceClient( new MultiHttpClient( [] ) ); + foreach ( $config['paths'] as $prefix => $serviceConfig ) { + $class = $serviceConfig['class']; + // Merge in the global defaults + $constructArg = $serviceConfig['options'] ?? []; + $constructArg += $config['global']; + // Make the VRS service available at the mount point + $vrsClient->mount( $prefix, [ 'class' => $class, 'config' => $constructArg ] ); + } + + return $vrsClient; + }, + + 'WatchedItemQueryService' => + function ( MediaWikiServices $services ) : WatchedItemQueryService { + return new WatchedItemQueryService( $services->getDBLoadBalancer(), - $services->getMainWANObjectCache(), - LoggerFactory::getInstance( 'NameTableSqlStore' ), - 'change_tag_def', - 'ctd_id', - 'ctd_name', - null, - false, - function ( $insertFields ) { - $insertFields['ctd_user_defined'] = 0; - $insertFields['ctd_count'] = 0; - return $insertFields; - } + $services->getCommentStore(), + $services->getActorMigration() ); }, - 'PreferencesFactory' => function ( MediaWikiServices $services ) { - global $wgContLang; - $authManager = AuthManager::singleton(); - $linkRenderer = $services->getLinkRendererFactory()->create(); - $config = $services->getMainConfig(); - $factory = new DefaultPreferencesFactory( $config, $wgContLang, $authManager, $linkRenderer ); - $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) ); + 'WatchedItemStore' => function ( MediaWikiServices $services ) : WatchedItemStore { + $store = new WatchedItemStore( + $services->getDBLoadBalancer(), + new HashBagOStuff( [ 'maxKeys' => 100 ] ), + $services->getReadOnlyMode(), + $services->getMainConfig()->get( 'UpdateRowsPerQuery' ) + ); + $store->setStatsdDataFactory( $services->getStatsdDataFactory() ); - return $factory; - }, + if ( $services->getMainConfig()->get( 'ReadOnlyWatchedItemStore' ) ) { + $store = new NoWriteWatchedItemStore( $store ); + } - 'HttpRequestFactory' => function ( MediaWikiServices $services ) { - return new \MediaWiki\Http\HttpRequestFactory(); + return $store; }, - 'CommentStore' => function ( MediaWikiServices $services ) { - global $wgContLang; - return new CommentStore( - $wgContLang, - $services->getMainConfig()->get( 'CommentTableSchemaMigrationStage' ) + 'WikiRevisionOldRevisionImporterNoUpdates' => + function ( MediaWikiServices $services ) : ImportableOldRevisionImporter { + return new ImportableOldRevisionImporter( + false, + LoggerFactory::getInstance( 'OldRevisionImporter' ), + $services->getDBLoadBalancer() ); }, - 'ActorMigration' => function ( MediaWikiServices $services ) { - return new ActorMigration( - $services->getMainConfig()->get( 'ActorTableSchemaMigrationStage' ) + '_MediaWikiTitleCodec' => function ( MediaWikiServices $services ) : MediaWikiTitleCodec { + return new MediaWikiTitleCodec( + $services->getContentLanguage(), + $services->getGenderCache(), + $services->getMainConfig()->get( 'LocalInterwikis' ), + $services->getInterwikiLookup() ); }, - 'MagicWordFactory' => function ( MediaWikiServices $services ) { - global $wgContLang; - return new MagicWordFactory( $wgContLang ); + '_SqlBlobStore' => function ( MediaWikiServices $services ) : SqlBlobStore { + return $services->getBlobStoreFactory()->newSqlBlobStore(); }, /////////////////////////////////////////////////////////////////////////// diff --git a/includes/Setup.php b/includes/Setup.php index 4d9c495212..c015eacd5c 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -774,7 +774,7 @@ if ( $wgCommandLineMode ) { wfDebug( $debug ); } -$wgMemc = wfGetMainCache(); +$wgMemc = ObjectCache::getLocalClusterInstance(); $messageMemc = wfGetMessageCacheStorage(); wfDebugLog( 'caches', @@ -794,9 +794,9 @@ $ps_globals = Profiler::instance()->scopedProfileIn( $fname . '-globals' ); /** * @var Language $wgContLang + * @deprecated since 1.32, use the ContentLanguage service directly */ -$wgContLang = Language::factory( $wgLanguageCode ); -$wgContLang->initContLang(); +$wgContLang = MediaWikiServices::getInstance()->getContentLanguage(); // Now that variant lists may be available... $wgRequest->interpolateTitle(); @@ -898,6 +898,7 @@ $wgOut = RequestContext::getMain()->getOutput(); // BackCompat /** * @var Parser $wgParser + * @deprecated since 1.32, use MediaWikiServices::getParser() instead */ $wgParser = new StubObject( 'wgParser', function () { return MediaWikiServices::getInstance()->getParser(); diff --git a/includes/Storage/DerivedPageDataUpdater.php b/includes/Storage/DerivedPageDataUpdater.php index 6f241bab6b..a00766fa74 100644 --- a/includes/Storage/DerivedPageDataUpdater.php +++ b/includes/Storage/DerivedPageDataUpdater.php @@ -110,7 +110,7 @@ class DerivedPageDataUpdater implements IDBAccessObject { /** * @var Language */ - private $contentLanguage; + private $contLang; /** * @var LoggerInterface @@ -152,10 +152,21 @@ class DerivedPageDataUpdater implements IDBAccessObject { /** * The state of the relevant row in page table before the edit. * This is determined by the first call to grabCurrentRevision, prepareContent, - * or prepareUpdate. + * or prepareUpdate (so it is only accessible in 'knows-current' or a later stage). * If pageState was not initialized when prepareUpdate() is called, prepareUpdate() will * attempt to emulate the state of the page table before the edit. * + * Contains the following fields: + * - oldRevision (RevisionRecord|null): the revision that was current before the change + * associated with this update. Might not be set, use getOldRevision() instead of direct + * access. + * - oldId (int|null): the id of the above revision. 0 if there is no such revision (the change + * was about creating a new page); null if not known (that should not happen). + * - oldIsRedirect (bool|null): whether the page was a redirect before the change. Lazy-loaded, + * can be null; use wasRedirect() instead of direct access. + * - oldCountable (bool|null): whether the page was countable before the change (or null + * if we don't have that information) + * * @var array */ private $pageState = null; @@ -240,7 +251,7 @@ class DerivedPageDataUpdater implements IDBAccessObject { * @param ParserCache $parserCache * @param JobQueueGroup $jobQueueGroup * @param MessageCache $messageCache - * @param Language $contentLanguage + * @param Language $contLang * @param LoggerInterface|null $saveParseLogger */ public function __construct( @@ -249,7 +260,7 @@ class DerivedPageDataUpdater implements IDBAccessObject { ParserCache $parserCache, JobQueueGroup $jobQueueGroup, MessageCache $messageCache, - Language $contentLanguage, + Language $contLang, LoggerInterface $saveParseLogger = null ) { $this->wikiPage = $wikiPage; @@ -258,7 +269,7 @@ class DerivedPageDataUpdater implements IDBAccessObject { $this->revisionStore = $revisionStore; $this->jobQueueGroup = $jobQueueGroup; $this->messageCache = $messageCache; - $this->contentLanguage = $contentLanguage; + $this->contLang = $contLang; // XXX: replace all wfDebug calls with a Logger. Do we nede more than one logger here? $this->saveParseLogger = $saveParseLogger ?: new NullLogger(); @@ -309,7 +320,7 @@ class DerivedPageDataUpdater implements IDBAccessObject { /** * Checks whether this DerivedPageDataUpdater can be re-used for running updates targeting - * the the given revision. + * the given revision. * * @param UserIdentity|null $user The user creating the revision in question * @param RevisionRecord|null $revision New revision (after save, if already saved) @@ -751,7 +762,7 @@ class DerivedPageDataUpdater implements IDBAccessObject { $this->canonicalParserOutput = $output; } - $userPopts = ParserOptions::newFromUserAndLang( $user, $this->contentLanguage ); + $userPopts = ParserOptions::newFromUserAndLang( $user, $this->contLang ); Hooks::run( 'ArticlePrepareTextForEdit', [ $wikiPage, $userPopts ] ); $this->user = $user; @@ -958,7 +969,7 @@ class DerivedPageDataUpdater implements IDBAccessObject { * - null: if created is false, don't update the article count; if created * is true, do update the article count * - 'no-change': don't update the article count, ever - * + * When set to null, pageState['oldCountable'] will be used instead if available. */ public function prepareUpdate( RevisionRecord $revision, array $options = [] ) { Assert::parameter( @@ -1469,6 +1480,9 @@ class DerivedPageDataUpdater implements IDBAccessObject { } elseif ( $this->options['oldcountable'] !== null ) { $good = (int)$this->isCountable() - (int)$this->options['oldcountable']; + } elseif ( isset( $this->pageState['oldCountable'] ) ) { + $good = (int)$this->isCountable() + - (int)$this->pageState['oldCountable']; } else { $good = 0; } @@ -1533,7 +1547,7 @@ class DerivedPageDataUpdater implements IDBAccessObject { // TODO: In the wiring, register a listener for this on the new PageEventEmitter ResourceLoaderWikiModule::invalidateModuleCache( - $title, $oldLegacyRevision, $legacyRevision, $this->getWikiId() + $title, $oldLegacyRevision, $legacyRevision, $this->getWikiId() ?: wfWikiID() ); $this->doTransition( 'done' ); diff --git a/includes/Storage/NameTableStore.php b/includes/Storage/NameTableStore.php index 3516ffe664..52e8f5b993 100644 --- a/includes/Storage/NameTableStore.php +++ b/includes/Storage/NameTableStore.php @@ -26,6 +26,7 @@ use WANObjectCache; use Wikimedia\Assert\Assert; use Wikimedia\Rdbms\Database; use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\ILoadBalancer; use Wikimedia\Rdbms\LoadBalancer; /** @@ -64,8 +65,13 @@ class NameTableStore { private $insertCallback = null; /** - * @param LoadBalancer $dbLoadBalancer A load balancer for acquiring database connections - * @param WANObjectCache $cache A cache manager for caching data + * @param ILoadBalancer $dbLoadBalancer A load balancer for acquiring database connections + * @param WANObjectCache $cache A cache manager for caching data. This can be the local + * wiki's default instance even if $wikiId refers to a different wiki, since + * makeGlobalKey() is used to constructed a key that allows cached names from + * the same database to be re-used between wikis. For example, enwiki and frwiki will + * use the same cache keys for names from the wikidatawiki database, regardless + * of the cache's default key space. * @param LoggerInterface $logger * @param string $table * @param string $idField @@ -77,7 +83,7 @@ class NameTableStore { * This parameter was introduced in 1.32 */ public function __construct( - LoadBalancer $dbLoadBalancer, + ILoadBalancer $dbLoadBalancer, WANObjectCache $cache, LoggerInterface $logger, $table, diff --git a/includes/Storage/RevisionStore.php b/includes/Storage/RevisionStore.php index d090d8be52..5769527796 100644 --- a/includes/Storage/RevisionStore.php +++ b/includes/Storage/RevisionStore.php @@ -56,7 +56,7 @@ use Wikimedia\Assert\Assert; use Wikimedia\Rdbms\Database; use Wikimedia\Rdbms\DBConnRef; use Wikimedia\Rdbms\IDatabase; -use Wikimedia\Rdbms\LoadBalancer; +use Wikimedia\Rdbms\ILoadBalancer; /** * Service for looking up page revisions. @@ -88,7 +88,7 @@ class RevisionStore private $contentHandlerUseDB = true; /** - * @var LoadBalancer + * @var ILoadBalancer */ private $loadBalancer; @@ -128,9 +128,14 @@ class RevisionStore /** * @todo $blobStore should be allowed to be any BlobStore! * - * @param LoadBalancer $loadBalancer + * @param ILoadBalancer $loadBalancer * @param SqlBlobStore $blobStore - * @param WANObjectCache $cache + * @param WANObjectCache $cache A cache for caching revision rows. This can be the local + * wiki's default instance even if $wikiId refers to a different wiki, since + * makeGlobalKey() is used to constructed a key that allows cached revision rows from + * the same database to be re-used between wikis. For example, enwiki and frwiki will + * use the same cache keys for revision rows from the wikidatawiki database, regardless + * of the cache's default key space. * @param CommentStore $commentStore * @param NameTableStore $contentModelStore * @param NameTableStore $slotRoleStore @@ -141,7 +146,7 @@ class RevisionStore * @throws MWException if $mcrMigrationStage or $wikiId is invalid. */ public function __construct( - LoadBalancer $loadBalancer, + ILoadBalancer $loadBalancer, SqlBlobStore $blobStore, WANObjectCache $cache, CommentStore $commentStore, @@ -202,6 +207,20 @@ class RevisionStore return ( $this->mcrMigrationStage & $flags ) === $flags; } + /** + * Throws a RevisionAccessException if this RevisionStore is configured for cross-wiki loading + * and still reading from the old DB schema. + * + * @throws RevisionAccessException + */ + private function assertCrossWikiContentLoadingIsSafe() { + if ( $this->wikiId !== false && $this->hasMcrSchemaFlags( SCHEMA_COMPAT_READ_OLD ) ) { + throw new RevisionAccessException( + "Cross-wiki content loading is not supported by the pre-MCR schema" + ); + } + } + public function setLogger( LoggerInterface $logger ) { $this->logger = $logger; } @@ -239,7 +258,7 @@ class RevisionStore } /** - * @return LoadBalancer + * @return ILoadBalancer */ private function getDBLoadBalancer() { return $this->loadBalancer; @@ -775,6 +794,8 @@ class RevisionStore // MCR migration note: rev_content_model and rev_content_format will go away if ( $this->contentHandlerUseDB ) { + $this->assertCrossWikiContentLoadingIsSafe(); + $defaultModel = ContentHandler::getDefaultModelFor( $title ); $defaultFormat = ContentHandler::getForModelID( $defaultModel )->getDefaultFormat(); @@ -883,6 +904,8 @@ class RevisionStore // if $wgContentHandlerUseDB is not set, // all revisions must use the default content model and format. + $this->assertCrossWikiContentLoadingIsSafe(); + $defaultModel = ContentHandler::getDefaultModelFor( $title ); $defaultHandler = ContentHandler::getForModelID( $defaultModel ); $defaultFormat = $defaultHandler->getDefaultFormat(); @@ -1202,6 +1225,8 @@ class RevisionStore if ( $mainSlotRow->model_name === null ) { $mainSlotRow->model_name = function ( SlotRecord $slot ) use ( $title ) { + $this->assertCrossWikiContentLoadingIsSafe(); + // TODO: MCR: consider slot role in getDefaultModelFor()! Use LinkTarget! // TODO: MCR: deprecate $title->getModel(). return ContentHandler::getDefaultModelFor( $title ); diff --git a/includes/Storage/RevisionStoreFactory.php b/includes/Storage/RevisionStoreFactory.php new file mode 100644 index 0000000000..9419b40939 --- /dev/null +++ b/includes/Storage/RevisionStoreFactory.php @@ -0,0 +1,169 @@ +dbLoadBalancerFactory = $dbLoadBalancerFactory; + $this->blobStoreFactory = $blobStoreFactory; + $this->cache = $cache; + $this->commentStore = $commentStore; + $this->actorMigration = $actorMigration; + $this->mcrMigrationStage = $migrationStage; + $this->loggerProvider = $loggerProvider; + $this->contentHandlerUseDB = $contentHandlerUseDB; + } + /** + + /** + * @since 1.32 + * + * @param bool|string $wikiId false for the current domain / wikid + * + * @return RevisionStore for the given wikiId with all necessary services and a logger + */ + public function getRevisionStore( $wikiId = false ) { + Assert::parameterType( 'string|boolean', $wikiId, '$wikiId' ); + + $store = new RevisionStore( + $this->dbLoadBalancerFactory->getMainLB( $wikiId ), + $this->blobStoreFactory->newSqlBlobStore( $wikiId ), + $this->cache, // Pass local cache instance; Leave cache sharing to RevisionStore. + $this->commentStore, + $this->getContentModelStore( $wikiId ), + $this->getSlotRoleStore( $wikiId ), + $this->mcrMigrationStage, + $this->actorMigration, + $wikiId + ); + + $store->setLogger( $this->loggerProvider->getLogger( 'RevisionStore' ) ); + $store->setContentHandlerUseDB( $this->contentHandlerUseDB ); + + return $store; + } + + /** + * @param string $wikiId + * @return NameTableStore + */ + private function getContentModelStore( $wikiId ) { + // XXX: a dedicated ContentModelStore subclass would avoid hard-coding + // knowledge about the schema here. + return new NameTableStore( + $this->dbLoadBalancerFactory->getMainLB( $wikiId ), + $this->cache, // Pass local cache instance; Leave cache sharing to NameTableStore. + $this->loggerProvider->getLogger( 'NameTableSqlStore' ), + 'content_models', + 'model_id', + 'model_name', + null, + $wikiId + ); + } + + /** + * @param string $wikiId + * @return NameTableStore + */ + private function getSlotRoleStore( $wikiId ) { + // XXX: a dedicated ContentModelStore subclass would avoid hard-coding + // knowledge about the schema here. + return new NameTableStore( + $this->dbLoadBalancerFactory->getMainLB( $wikiId ), + $this->cache, // Pass local cache instance; Leave cache sharing to NameTableStore. + $this->loggerProvider->getLogger( 'NameTableSqlStore' ), + 'slot_roles', + 'role_id', + 'role_name', + 'strtolower', + $wikiId + ); + } + +} diff --git a/includes/Storage/SqlBlobStore.php b/includes/Storage/SqlBlobStore.php index 48ffe2c903..d7216c5c72 100644 --- a/includes/Storage/SqlBlobStore.php +++ b/includes/Storage/SqlBlobStore.php @@ -94,7 +94,12 @@ class SqlBlobStore implements IDBAccessObject, BlobStore { /** * @param LoadBalancer $dbLoadBalancer A load balancer for acquiring database connections - * @param WANObjectCache $cache A cache manager for caching blobs + * @param WANObjectCache $cache A cache manager for caching blobs. This can be the local + * wiki's default instance even if $wikiId refers to a different wiki, since + * makeGlobalKey() is used to constructed a key that allows cached blobs from the + * same database to be re-used between wikis. For example, enwiki and frwiki will + * use the same cache keys for blobs from the wikidatawiki database, regardless of + * the cache's default key space. * @param bool|string $wikiId The ID of the target wiki database. Use false for the local wiki. */ public function __construct( diff --git a/includes/TemplateParser.php b/includes/TemplateParser.php index dc7d31e522..4210a965ba 100644 --- a/includes/TemplateParser.php +++ b/includes/TemplateParser.php @@ -67,7 +67,7 @@ class TemplateParser { } /** - * Constructs the location of the the source Mustache template + * Constructs the location of the source Mustache template * @param string $templateName The name of the template * @return string * @throws UnexpectedValueException If $templateName attempts upwards directory traversal diff --git a/includes/Title.php b/includes/Title.php index cc7d722fba..e74824c9b8 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -745,12 +745,10 @@ class Title implements LinkTarget { public static function makeName( $ns, $title, $fragment = '', $interwiki = '', $canonicalNamespace = false ) { - global $wgContLang; - if ( $canonicalNamespace ) { $namespace = MWNamespace::getCanonicalName( $ns ); } else { - $namespace = $wgContLang->getNsText( $ns ); + $namespace = MediaWikiServices::getInstance()->getContentLanguage()->getNsText( $ns ); } $name = $namespace == '' ? $title : "$namespace:$title"; if ( strval( $interwiki ) != '' ) { @@ -807,15 +805,13 @@ class Title implements LinkTarget { * @return bool */ public function isValid() { - $ns = $this->getNamespace(); - - if ( !MWNamespace::exists( $ns ) ) { + if ( !MWNamespace::exists( $this->mNamespace ) ) { return false; } try { $parser = MediaWikiServices::getInstance()->getTitleParser(); - $parser->parseTitle( $this->getDBkey(), $ns ); + $parser->parseTitle( $this->mDbkeyform, $this->mNamespace ); return true; } catch ( MalformedTitleException $ex ) { return false; @@ -908,10 +904,10 @@ class Title implements LinkTarget { if ( $this->mTitleValue === null ) { try { $this->mTitleValue = new TitleValue( - $this->getNamespace(), - $this->getDBkey(), - $this->getFragment(), - $this->getInterwiki() + $this->mNamespace, + $this->mDbkeyform, + $this->mFragment, + $this->mInterwiki ); } catch ( InvalidArgumentException $ex ) { wfDebug( __METHOD__ . ': Can\'t create a TitleValue for [[' . @@ -1051,8 +1047,8 @@ class Title implements LinkTarget { * @return string Namespace text */ public function getSubjectNsText() { - global $wgContLang; - return $wgContLang->getNsText( MWNamespace::getSubject( $this->mNamespace ) ); + return MediaWikiServices::getInstance()->getContentLanguage()-> + getNsText( MWNamespace::getSubject( $this->mNamespace ) ); } /** @@ -1061,8 +1057,8 @@ class Title implements LinkTarget { * @return string Namespace text */ public function getTalkNsText() { - global $wgContLang; - return $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) ); + return MediaWikiServices::getInstance()->getContentLanguage()-> + getNsText( MWNamespace::getTalk( $this->mNamespace ) ); } /** @@ -1103,7 +1099,7 @@ class Title implements LinkTarget { * @return bool */ public function isWatchable() { - return !$this->isExternal() && MWNamespace::isWatchable( $this->getNamespace() ); + return !$this->isExternal() && MWNamespace::isWatchable( $this->mNamespace ); } /** @@ -1112,7 +1108,7 @@ class Title implements LinkTarget { * @return bool */ public function isSpecialPage() { - return $this->getNamespace() == NS_SPECIAL; + return $this->mNamespace == NS_SPECIAL; } /** @@ -1123,7 +1119,9 @@ class Title implements LinkTarget { */ public function isSpecial( $name ) { if ( $this->isSpecialPage() ) { - list( $thisName, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $this->getDBkey() ); + list( $thisName, /* $subpage */ ) = + MediaWikiServices::getInstance()->getSpecialPageFactory()-> + resolveAlias( $this->mDbkeyform ); if ( $name == $thisName ) { return true; } @@ -1139,9 +1137,10 @@ class Title implements LinkTarget { */ public function fixSpecialName() { if ( $this->isSpecialPage() ) { - list( $canonicalName, $par ) = SpecialPageFactory::resolveAlias( $this->mDbkeyform ); + $spFactory = MediaWikiServices::getInstance()->getSpecialPageFactory(); + list( $canonicalName, $par ) = $spFactory->resolveAlias( $this->mDbkeyform ); if ( $canonicalName ) { - $localName = SpecialPageFactory::getLocalNameFor( $canonicalName, $par ); + $localName = $spFactory->getLocalNameFor( $canonicalName, $par ); if ( $localName != $this->mDbkeyform ) { return self::makeTitle( NS_SPECIAL, $localName ); } @@ -1161,7 +1160,7 @@ class Title implements LinkTarget { * @since 1.19 */ public function inNamespace( $ns ) { - return MWNamespace::equals( $this->getNamespace(), $ns ); + return MWNamespace::equals( $this->mNamespace, $ns ); } /** @@ -1200,7 +1199,7 @@ class Title implements LinkTarget { * @return bool */ public function hasSubjectNamespace( $ns ) { - return MWNamespace::subjectEquals( $this->getNamespace(), $ns ); + return MWNamespace::subjectEquals( $this->mNamespace, $ns ); } /** @@ -1211,7 +1210,7 @@ class Title implements LinkTarget { * @return bool */ public function isContentPage() { - return MWNamespace::isContent( $this->getNamespace() ); + return MWNamespace::isContent( $this->mNamespace ); } /** @@ -1221,7 +1220,7 @@ class Title implements LinkTarget { * @return bool */ public function isMovable() { - if ( !MWNamespace::isMovable( $this->getNamespace() ) || $this->isExternal() ) { + if ( !MWNamespace::isMovable( $this->mNamespace ) || $this->isExternal() ) { // Interwiki title or immovable namespace. Hooks don't get to override here return false; } @@ -1264,7 +1263,7 @@ class Title implements LinkTarget { public function isConversionTable() { // @todo ConversionTable should become a separate content model. - return $this->getNamespace() == NS_MEDIAWIKI && + return $this->mNamespace == NS_MEDIAWIKI && strpos( $this->getText(), 'Conversiontable/' ) === 0; } @@ -1433,7 +1432,7 @@ class Title implements LinkTarget { $this->hasContentModel( CONTENT_MODEL_CSS ) // paranoia - a MediaWiki: namespace page with mismatching extension and content // model is probably by mistake and might get handled incorrectly (see e.g. T112937) - || substr( $this->getDBkey(), -4 ) === '.css' + || substr( $this->mDbkeyform, -4 ) === '.css' ) ); } @@ -1451,7 +1450,7 @@ class Title implements LinkTarget { $this->hasContentModel( CONTENT_MODEL_JSON ) // paranoia - a MediaWiki: namespace page with mismatching extension and content // model is probably by mistake and might get handled incorrectly (see e.g. T112937) - || substr( $this->getDBkey(), -5 ) === '.json' + || substr( $this->mDbkeyform, -5 ) === '.json' ) ); } @@ -1469,7 +1468,7 @@ class Title implements LinkTarget { $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) // paranoia - a MediaWiki: namespace page with mismatching extension and content // model is probably by mistake and might get handled incorrectly (see e.g. T112937) - || substr( $this->getDBkey(), -3 ) === '.js' + || substr( $this->mDbkeyform, -3 ) === '.js' ) ); } @@ -1480,7 +1479,7 @@ class Title implements LinkTarget { * @return bool */ public function isTalkPage() { - return MWNamespace::isTalk( $this->getNamespace() ); + return MWNamespace::isTalk( $this->mNamespace ); } /** @@ -1489,7 +1488,7 @@ class Title implements LinkTarget { * @return Title The object for the talk page */ public function getTalkPage() { - return self::makeTitle( MWNamespace::getTalk( $this->getNamespace() ), $this->getDBkey() ); + return self::makeTitle( MWNamespace::getTalk( $this->mNamespace ), $this->mDbkeyform ); } /** @@ -1517,11 +1516,11 @@ class Title implements LinkTarget { */ public function getSubjectPage() { // Is this the same title? - $subjectNS = MWNamespace::getSubject( $this->getNamespace() ); - if ( $this->getNamespace() == $subjectNS ) { + $subjectNS = MWNamespace::getSubject( $this->mNamespace ); + if ( $this->mNamespace == $subjectNS ) { return $this; } - return self::makeTitle( $subjectNS, $this->getDBkey() ); + return self::makeTitle( $subjectNS, $this->mDbkeyform ); } /** @@ -1587,9 +1586,9 @@ class Title implements LinkTarget { } elseif ( $this->isExternal() && !self::getInterwikiLookup()->fetch( $this->mInterwiki )->isLocal() ) { - return '#' . Sanitizer::escapeIdForExternalInterwiki( $this->getFragment() ); + return '#' . Sanitizer::escapeIdForExternalInterwiki( $this->mFragment ); } - return '#' . Sanitizer::escapeIdForLink( $this->getFragment() ); + return '#' . Sanitizer::escapeIdForLink( $this->mFragment ); } /** @@ -1617,10 +1616,10 @@ class Title implements LinkTarget { */ public function createFragmentTarget( $fragment ) { return self::makeTitle( - $this->getNamespace(), + $this->mNamespace, $this->getText(), $fragment, - $this->getInterwiki() + $this->mInterwiki ); } @@ -1632,8 +1631,6 @@ class Title implements LinkTarget { * @return string The prefixed text */ private function prefix( $name ) { - global $wgContLang; - $p = ''; if ( $this->isExternal() ) { $p = $this->mInterwiki . ':'; @@ -1644,7 +1641,8 @@ class Title implements LinkTarget { if ( $nsText === false ) { // See T165149. Awkward, but better than erroneously linking to the main namespace. - $nsText = $wgContLang->getNsText( NS_SPECIAL ) . ":Badtitle/NS{$this->mNamespace}"; + $nsText = MediaWikiServices::getInstance()->getContentLanguage()-> + getNsText( NS_SPECIAL ) . ":Badtitle/NS{$this->mNamespace}"; } $p .= $nsText . ':'; @@ -1697,7 +1695,7 @@ class Title implements LinkTarget { public function getFullText() { $text = $this->getPrefixedText(); if ( $this->hasFragment() ) { - $text .= '#' . $this->getFragment(); + $text .= '#' . $this->mFragment; } return $text; } @@ -1735,7 +1733,7 @@ class Title implements LinkTarget { * @since 1.20 */ public function getRootTitle() { - return self::makeTitle( $this->getNamespace(), $this->getRootText() ); + return self::makeTitle( $this->mNamespace, $this->getRootText() ); } /** @@ -1775,7 +1773,7 @@ class Title implements LinkTarget { * @since 1.20 */ public function getBaseTitle() { - return self::makeTitle( $this->getNamespace(), $this->getBaseText() ); + return self::makeTitle( $this->mNamespace, $this->getBaseText() ); } /** @@ -1811,7 +1809,7 @@ class Title implements LinkTarget { * @since 1.20 */ public function getSubpage( $text ) { - return self::makeTitleSafe( $this->getNamespace(), $this->getText() . '/' . $text ); + return self::makeTitleSafe( $this->mNamespace, $this->getText() . '/' . $text ); } /** @@ -1969,7 +1967,7 @@ class Title implements LinkTarget { # Yes! It can in interwiki transclusion. But... it probably shouldn't. $namespace .= ':'; } - $url = $interwiki->getURL( $namespace . $this->getDBkey() ); + $url = $interwiki->getURL( $namespace . $this->mDbkeyform ); $url = wfAppendQuery( $url, $query ); } else { $dbkey = wfUrlencode( $this->getPrefixedDBkey() ); @@ -1979,7 +1977,7 @@ class Title implements LinkTarget { $titleRef = $this; Hooks::run( 'GetLocalURL::Article', [ &$titleRef, &$url ] ); } else { - global $wgVariantArticlePath, $wgActionPaths, $wgContLang; + global $wgVariantArticlePath, $wgActionPaths; $url = false; $matches = []; @@ -2002,7 +2000,8 @@ class Title implements LinkTarget { if ( $url === false && $wgVariantArticlePath && preg_match( '/^variant=([^&]*)$/', $query, $matches ) - && $this->getPageLanguage()->equals( $wgContLang ) + && $this->getPageLanguage()->equals( + MediaWikiServices::getInstance()->getContentLanguage() ) && $this->getPageLanguage()->hasVariants() ) { $variant = urldecode( $matches[1] ); @@ -2700,7 +2699,7 @@ class Title implements LinkTarget { // Check for explicit whitelisting with and without underscores if ( in_array( $name, $wgWhitelistRead, true ) || in_array( $dbName, $wgWhitelistRead, true ) ) { $whitelisted = true; - } elseif ( $this->getNamespace() == NS_MAIN ) { + } elseif ( $this->mNamespace == NS_MAIN ) { # Old settings might have the title prefixed with # a colon for main-namespace pages if ( in_array( ':' . $name, $wgWhitelistRead ) ) { @@ -2708,8 +2707,10 @@ class Title implements LinkTarget { } } elseif ( $this->isSpecialPage() ) { # If it's a special page, ditch the subpage bit and check again - $name = $this->getDBkey(); - list( $name, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $name ); + $name = $this->mDbkeyform; + list( $name, /* $subpage */ ) = + MediaWikiServices::getInstance()->getSpecialPageFactory()-> + resolveAlias( $name ); if ( $name ) { $pure = SpecialPage::getTitleFor( $name )->getPrefixedText(); if ( in_array( $pure, $wgWhitelistRead, true ) ) { @@ -2859,7 +2860,7 @@ class Title implements LinkTarget { $types = self::getFilteredRestrictionTypes( $this->exists() ); - if ( $this->getNamespace() != NS_FILE ) { + if ( $this->mNamespace != NS_FILE ) { # Remove the upload restriction for non-file titles $types = array_diff( $types, [ 'upload' ] ); } @@ -2904,7 +2905,7 @@ class Title implements LinkTarget { */ protected function getTitleProtectionInternal() { // Can't protect pages in special namespaces - if ( $this->getNamespace() < 0 ) { + if ( $this->mNamespace < 0 ) { return false; } @@ -2924,7 +2925,7 @@ class Title implements LinkTarget { 'expiry' => 'pt_expiry', 'permission' => 'pt_create_perm' ] + $commentQuery['fields'], - [ 'pt_namespace' => $this->getNamespace(), 'pt_title' => $this->getDBkey() ], + [ 'pt_namespace' => $this->mNamespace, 'pt_title' => $this->mDbkeyform ], __METHOD__, [], $commentQuery['joins'] @@ -2954,7 +2955,7 @@ class Title implements LinkTarget { $dbw->delete( 'protected_titles', - [ 'pt_namespace' => $this->getNamespace(), 'pt_title' => $this->getDBkey() ], + [ 'pt_namespace' => $this->mNamespace, 'pt_title' => $this->mDbkeyform ], __METHOD__ ); $this->mTitleProtection = false; @@ -3087,18 +3088,18 @@ class Title implements LinkTarget { $dbr = wfGetDB( DB_REPLICA ); - if ( $this->getNamespace() == NS_FILE ) { + if ( $this->mNamespace == NS_FILE ) { $tables = [ 'imagelinks', 'page_restrictions' ]; $where_clauses = [ - 'il_to' => $this->getDBkey(), + 'il_to' => $this->mDbkeyform, 'il_from=pr_page', 'pr_cascade' => 1 ]; } else { $tables = [ 'templatelinks', 'page_restrictions' ]; $where_clauses = [ - 'tl_namespace' => $this->getNamespace(), - 'tl_title' => $this->getDBkey(), + 'tl_namespace' => $this->mNamespace, + 'tl_title' => $this->mDbkeyform, 'tl_from=pr_page', 'pr_cascade' => 1 ]; @@ -3441,13 +3442,13 @@ class Title implements LinkTarget { * doesn't allow subpages */ public function getSubpages( $limit = -1 ) { - if ( !MWNamespace::hasSubpages( $this->getNamespace() ) ) { + if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) { return []; } $dbr = wfGetDB( DB_REPLICA ); - $conds['page_namespace'] = $this->getNamespace(); - $conds[] = 'page_title ' . $dbr->buildLike( $this->getDBkey() . '/', $dbr->anyString() ); + $conds['page_namespace'] = $this->mNamespace; + $conds[] = 'page_title ' . $dbr->buildLike( $this->mDbkeyform . '/', $dbr->anyString() ); $options = []; if ( $limit > -1 ) { $options['LIMIT'] = $limit; @@ -3468,18 +3469,18 @@ class Title implements LinkTarget { * @return int The number of archived revisions */ public function isDeleted() { - if ( $this->getNamespace() < 0 ) { + if ( $this->mNamespace < 0 ) { $n = 0; } else { $dbr = wfGetDB( DB_REPLICA ); $n = $dbr->selectField( 'archive', 'COUNT(*)', - [ 'ar_namespace' => $this->getNamespace(), 'ar_title' => $this->getDBkey() ], + [ 'ar_namespace' => $this->mNamespace, 'ar_title' => $this->mDbkeyform ], __METHOD__ ); - if ( $this->getNamespace() == NS_FILE ) { + if ( $this->mNamespace == NS_FILE ) { $n += $dbr->selectField( 'filearchive', 'COUNT(*)', - [ 'fa_name' => $this->getDBkey() ], + [ 'fa_name' => $this->mDbkeyform ], __METHOD__ ); } @@ -3493,17 +3494,17 @@ class Title implements LinkTarget { * @return bool */ public function isDeletedQuick() { - if ( $this->getNamespace() < 0 ) { + if ( $this->mNamespace < 0 ) { return false; } $dbr = wfGetDB( DB_REPLICA ); $deleted = (bool)$dbr->selectField( 'archive', '1', - [ 'ar_namespace' => $this->getNamespace(), 'ar_title' => $this->getDBkey() ], + [ 'ar_namespace' => $this->mNamespace, 'ar_title' => $this->mDbkeyform ], __METHOD__ ); - if ( !$deleted && $this->getNamespace() == NS_FILE ) { + if ( !$deleted && $this->mNamespace == NS_FILE ) { $deleted = (bool)$dbr->selectField( 'filearchive', '1', - [ 'fa_name' => $this->getDBkey() ], + [ 'fa_name' => $this->mDbkeyform ], __METHOD__ ); } @@ -3519,7 +3520,7 @@ class Title implements LinkTarget { * @return int The ID */ public function getArticleID( $flags = 0 ) { - if ( $this->getNamespace() < 0 ) { + if ( $this->mNamespace < 0 ) { $this->mArticleID = 0; return $this->mArticleID; } @@ -3677,10 +3678,8 @@ class Title implements LinkTarget { * @return string Containing capitalized title */ public static function capitalize( $text, $ns = NS_MAIN ) { - global $wgContLang; - if ( MWNamespace::isCapitalized( $ns ) ) { - return $wgContLang->ucfirst( $text ); + return MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $text ); } else { return $text; } @@ -3699,13 +3698,6 @@ class Title implements LinkTarget { * @return bool True on success */ private function secureAndSplit() { - # Initialisation - $this->mInterwiki = ''; - $this->mFragment = ''; - $this->mNamespace = $this->mDefaultNamespace; # Usually NS_MAIN - - $dbkey = $this->mDbkeyform; - // @note: splitTitleString() is a temporary hack to allow MediaWikiTitleCodec to share // the parsing code with Title, while avoiding massive refactoring. // @todo: get rid of secureAndSplit, refactor parsing code. @@ -3713,7 +3705,7 @@ class Title implements LinkTarget { // splitTitleString method, but the only implementation (MediaWikiTitleCodec) does $titleCodec = MediaWikiServices::getInstance()->getTitleParser(); // MalformedTitleException can be thrown here - $parts = $titleCodec->splitTitleString( $dbkey, $this->getDefaultNamespace() ); + $parts = $titleCodec->splitTitleString( $this->mDbkeyform, $this->mDefaultNamespace ); # Fill fields $this->setFragment( '#' . $parts['fragment'] ); @@ -3758,8 +3750,8 @@ class Title implements LinkTarget { self::getSelectFields(), [ "{$prefix}_from=page_id", - "{$prefix}_namespace" => $this->getNamespace(), - "{$prefix}_title" => $this->getDBkey() ], + "{$prefix}_namespace" => $this->mNamespace, + "{$prefix}_title" => $this->mDbkeyform ], __METHOD__, $options ); @@ -4065,9 +4057,9 @@ class Title implements LinkTarget { ]; } // Do the source and target namespaces support subpages? - if ( !MWNamespace::hasSubpages( $this->getNamespace() ) ) { + if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) { return [ - [ 'namespace-nosubpages', MWNamespace::getCanonicalName( $this->getNamespace() ) ], + [ 'namespace-nosubpages', MWNamespace::getCanonicalName( $this->mNamespace ) ], ]; } if ( !MWNamespace::hasSubpages( $nt->getNamespace() ) ) { @@ -4099,7 +4091,7 @@ class Title implements LinkTarget { continue; } $newPageName = preg_replace( - '#^' . preg_quote( $this->getDBkey(), '#' ) . '#', + '#^' . preg_quote( $this->mDbkeyform, '#' ) . '#', StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # T23234 $oldSubpage->getDBkey() ); if ( $oldSubpage->isTalkPage() ) { @@ -4158,8 +4150,8 @@ class Title implements LinkTarget { # Does the article have a history? $row = $dbw->selectField( [ 'page', 'revision' ], 'rev_id', - [ 'page_namespace' => $this->getNamespace(), - 'page_title' => $this->getDBkey(), + [ 'page_namespace' => $this->mNamespace, + 'page_title' => $this->mDbkeyform, 'page_id=rev_page', 'page_latest != rev_id' ], @@ -4227,8 +4219,6 @@ class Title implements LinkTarget { * $parent => $currentarticle */ public function getParentCategories() { - global $wgContLang; - $data = []; $titleKey = $this->getArticleID(); @@ -4247,9 +4237,11 @@ class Title implements LinkTarget { ); if ( $res->numRows() > 0 ) { + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); foreach ( $res as $row ) { - // $data[] = Title::newFromText($wgContLang->getNsText ( NS_CATEGORY ).':'.$row->cl_to); - $data[$wgContLang->getNsText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText(); + // $data[] = Title::newFromText( $contLang->getNsText ( NS_CATEGORY ).':'.$row->cl_to); + $data[$contLang->getNsText( NS_CATEGORY ) . ':' . $row->cl_to] = + $this->getFullText(); } } return $data; @@ -4611,9 +4603,9 @@ class Title implements LinkTarget { */ public function equals( Title $title ) { // Note: === is necessary for proper matching of number-like titles. - return $this->getInterwiki() === $title->getInterwiki() - && $this->getNamespace() == $title->getNamespace() - && $this->getDBkey() === $title->getDBkey(); + return $this->mInterwiki === $title->mInterwiki + && $this->mNamespace == $title->mNamespace + && $this->mDbkeyform === $title->mDbkeyform; } /** @@ -4623,9 +4615,9 @@ class Title implements LinkTarget { * @return bool */ public function isSubpageOf( Title $title ) { - return $this->getInterwiki() === $title->getInterwiki() - && $this->getNamespace() == $title->getNamespace() - && strpos( $this->getDBkey(), $title->getDBkey() . '/' ) === 0; + return $this->mInterwiki === $title->mInterwiki + && $this->mNamespace == $title->mNamespace + && strpos( $this->mDbkeyform, $title->mDbkeyform . '/' ) === 0; } /** @@ -4691,7 +4683,8 @@ class Title implements LinkTarget { return (bool)wfFindFile( $this ); case NS_SPECIAL: // valid special page - return SpecialPageFactory::exists( $this->getDBkey() ); + return MediaWikiServices::getInstance()->getSpecialPageFactory()-> + exists( $this->mDbkeyform ); case NS_MAIN: // selflink, possibly with fragment return $this->mDbkeyform == ''; @@ -4733,11 +4726,11 @@ class Title implements LinkTarget { // message content will be displayed, same for language subpages- // Use always content language to avoid loading hundreds of languages // to get the link color. - global $wgContLang; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); list( $name, ) = MessageCache::singleton()->figureMessage( - $wgContLang->lcfirst( $this->getText() ) + $contLang->lcfirst( $this->getText() ) ); - $message = wfMessage( $name )->inLanguage( $wgContLang )->useDatabase( false ); + $message = wfMessage( $name )->inLanguage( $contLang )->useDatabase( false ); return $message->exists(); } @@ -4750,14 +4743,12 @@ class Title implements LinkTarget { * @return string|bool */ public function getDefaultMessageText() { - global $wgContLang; - - if ( $this->getNamespace() != NS_MEDIAWIKI ) { // Just in case + if ( $this->mNamespace != NS_MEDIAWIKI ) { // Just in case return false; } list( $name, $lang ) = MessageCache::singleton()->figureMessage( - $wgContLang->lcfirst( $this->getText() ) + MediaWikiServices::getInstance()->getContentLanguage()->lcfirst( $this->getText() ) ); $message = wfMessage( $name )->inLanguage( $lang )->useDatabase( false ); @@ -4818,7 +4809,7 @@ class Title implements LinkTarget { */ public function touchLinks() { DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this, 'pagelinks', 'page-touch' ) ); - if ( $this->getNamespace() == NS_CATEGORY ) { + if ( $this->mNamespace == NS_CATEGORY ) { DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this, 'categorylinks', 'category-touch' ) ); @@ -4884,9 +4875,8 @@ class Title implements LinkTarget { * @return string XML 'id' name */ public function getNamespaceKey( $prepend = 'nstab-' ) { - global $wgContLang; // Gets the subject namespace of this title - $subjectNS = MWNamespace::getSubject( $this->getNamespace() ); + $subjectNS = MWNamespace::getSubject( $this->mNamespace ); // Prefer canonical namespace name for HTML IDs $namespaceKey = MWNamespace::getCanonicalName( $subjectNS ); if ( $namespaceKey === false ) { @@ -4894,7 +4884,7 @@ class Title implements LinkTarget { $namespaceKey = $this->getSubjectNsText(); } // Makes namespace key lowercase - $namespaceKey = $wgContLang->lc( $namespaceKey ); + $namespaceKey = MediaWikiServices::getInstance()->getContentLanguage()->lc( $namespaceKey ); // Uses main if ( $namespaceKey == '' ) { $namespaceKey = 'main'; @@ -4917,12 +4907,12 @@ class Title implements LinkTarget { $dbr = wfGetDB( DB_REPLICA ); $where = [ - 'rd_namespace' => $this->getNamespace(), - 'rd_title' => $this->getDBkey(), + 'rd_namespace' => $this->mNamespace, + 'rd_title' => $this->mDbkeyform, 'rd_from = page_id' ]; if ( $this->isExternal() ) { - $where['rd_interwiki'] = $this->getInterwiki(); + $where['rd_interwiki'] = $this->mInterwiki; } else { $where[] = 'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'; } @@ -5043,7 +5033,7 @@ class Title implements LinkTarget { /** * Get the language in which the content of this page is written in - * wikitext. Defaults to $wgContLang, but in certain cases it can be + * wikitext. Defaults to content language, but in certain cases it can be * e.g. $wgLang (such as special pages, which are in the user language). * * @since 1.18 @@ -5081,7 +5071,7 @@ class Title implements LinkTarget { /** * Get the language in which the content of this page is written when - * viewed by user. Defaults to $wgContLang, but in certain cases it can be + * viewed by user. Defaults to content language, but in certain cases it can be * e.g. $wgLang (such as special pages, which are in the user language). * * @since 1.20 @@ -5135,7 +5125,7 @@ class Title implements LinkTarget { $notices = []; // Optional notice for the entire namespace - $editnotice_ns = 'editnotice-' . $this->getNamespace(); + $editnotice_ns = 'editnotice-' . $this->mNamespace; $msg = wfMessage( $editnotice_ns ); if ( $msg->exists() ) { $html = $msg->parseAsBlock(); @@ -5153,9 +5143,9 @@ class Title implements LinkTarget { } } - if ( MWNamespace::hasSubpages( $this->getNamespace() ) ) { + if ( MWNamespace::hasSubpages( $this->mNamespace ) ) { // Optional notice for page itself and any parent page - $parts = explode( '/', $this->getDBkey() ); + $parts = explode( '/', $this->mDbkeyform ); $editnotice_base = $editnotice_ns; while ( count( $parts ) > 0 ) { $editnotice_base .= '-' . array_shift( $parts ); @@ -5177,7 +5167,7 @@ class Title implements LinkTarget { } } else { // Even if there are no subpages in namespace, we still don't want "/" in MediaWiki message keys - $editnoticeText = $editnotice_ns . '-' . strtr( $this->getDBkey(), '/', '-' ); + $editnoticeText = $editnotice_ns . '-' . strtr( $this->mDbkeyform, '/', '-' ); $msg = wfMessage( $editnoticeText ); if ( $msg->exists() ) { $html = $msg->parseAsBlock(); diff --git a/includes/WebRequest.php b/includes/WebRequest.php index e31d3f9c77..327dd54c0d 100644 --- a/includes/WebRequest.php +++ b/includes/WebRequest.php @@ -162,11 +162,12 @@ class WebRequest { $router->add( $wgActionPaths, [ 'action' => '$key' ] ); } - global $wgVariantArticlePath, $wgContLang; + global $wgVariantArticlePath; if ( $wgVariantArticlePath ) { $router->add( $wgVariantArticlePath, [ 'variant' => '$2' ], - [ '$2' => $wgContLang->getVariants() ] + [ '$2' => MediaWikiServices::getInstance()->getContentLanguage()-> + getVariants() ] ); } @@ -306,7 +307,7 @@ class WebRequest { /** * Check for title, action, and/or variant data in the URL * and interpolate it into the GET variables. - * This should only be run after $wgContLang is available, + * This should only be run after the content language is available, * as we may need the list of language variants to determine * available variant URLs. */ @@ -364,9 +365,8 @@ class WebRequest { $data[$key] = $this->normalizeUnicode( $val ); } } else { - global $wgContLang; - $data = isset( $wgContLang ) ? - $wgContLang->normalize( $data ) : + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $data = $contLang ? $contLang->normalize( $data ) : UtfNormal\Validator::cleanUp( $data ); } return $data; @@ -386,12 +386,12 @@ class WebRequest { # Work around PHP *feature* to avoid *bugs* elsewhere. $name = strtr( $name, '.', '_' ); if ( isset( $arr[$name] ) ) { - global $wgContLang; $data = $arr[$name]; if ( isset( $_GET[$name] ) && !is_array( $data ) ) { # Check for alternate/legacy character encoding. - if ( isset( $wgContLang ) ) { - $data = $wgContLang->checkTitleEncoding( $data ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + if ( $contLang ) { + $data = $contLang->checkTitleEncoding( $data ); } } $data = $this->normalizeUnicode( $data ); diff --git a/includes/WebRequestUpload.php b/includes/WebRequestUpload.php index 916a10c9f0..34c606204c 100644 --- a/includes/WebRequestUpload.php +++ b/includes/WebRequestUpload.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * Object to access the $_FILES array * @@ -63,13 +65,12 @@ class WebRequestUpload { return null; } - global $wgContLang; $name = $this->fileInfo['name']; # Safari sends filenames in HTML-encoded Unicode form D... # Horrid and evil! Let's try to make some kind of sense of it. $name = Sanitizer::decodeCharReferences( $name ); - $name = $wgContLang->normalize( $name ); + $name = MediaWikiServices::getInstance()->getContentLanguage()->normalize( $name ); wfDebug( __METHOD__ . ": {$this->fileInfo['name']} normalized to '$name'\n" ); return $name; } diff --git a/includes/Xml.php b/includes/Xml.php index 8c65461680..9744aeefcc 100644 --- a/includes/Xml.php +++ b/includes/Xml.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * Module of static functions for generating XML */ @@ -79,9 +81,8 @@ class Xml { } /** - * Format an XML element as with self::element(), but run text through the - * $wgContLang->normalize() validator first to ensure that no invalid UTF-8 - * is passed. + * Format an XML element as with self::element(), but run text through the content language's + * normalize() validator first to ensure that no invalid UTF-8 is passed. * * @param string $element * @param array $attribs Name=>value pairs. Values will be escaped. @@ -89,12 +90,12 @@ class Xml { * @return string */ public static function elementClean( $element, $attribs = [], $contents = '' ) { - global $wgContLang; if ( $attribs ) { $attribs = array_map( [ 'UtfNormal\Validator', 'cleanUp' ], $attribs ); } if ( $contents ) { - $contents = $wgContLang->normalize( $contents ); + $contents = + MediaWikiServices::getInstance()->getContentLanguage()->normalize( $contents ); } return self::element( $element, $attribs, $contents ); } diff --git a/includes/actions/Action.php b/includes/actions/Action.php index fb22445410..66f4d590c8 100644 --- a/includes/actions/Action.php +++ b/includes/actions/Action.php @@ -19,6 +19,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * @defgroup Actions Action done on pages */ @@ -386,8 +388,7 @@ abstract class Action implements MessageLocalizer { * @since 1.25 */ public function addHelpLink( $to, $overrideBaseUrl = false ) { - global $wgContLang; - $msg = wfMessage( $wgContLang->lc( + $msg = wfMessage( MediaWikiServices::getInstance()->getContentLanguage()->lc( self::getActionName( $this->getContext() ) ) . '-helppage' ); diff --git a/includes/actions/HistoryAction.php b/includes/actions/HistoryAction.php index 1a15fc0179..2778a1d91f 100644 --- a/includes/actions/HistoryAction.php +++ b/includes/actions/HistoryAction.php @@ -358,12 +358,13 @@ class HistoryAction extends FormlessAction { $rev->getComment() ); if ( $rev->getComment() == '' ) { - global $wgContLang; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $title = $this->msg( 'history-feed-item-nocomment', $rev->getUserText(), - $wgContLang->timeanddate( $rev->getTimestamp() ), - $wgContLang->date( $rev->getTimestamp() ), - $wgContLang->time( $rev->getTimestamp() ) )->inContentLanguage()->text(); + $contLang->timeanddate( $rev->getTimestamp() ), + $contLang->date( $rev->getTimestamp() ), + $contLang->time( $rev->getTimestamp() ) + )->inContentLanguage()->text(); } else { $title = $rev->getUserText() . $this->msg( 'colon-separator' )->inContentLanguage()->text() . diff --git a/includes/actions/InfoAction.php b/includes/actions/InfoAction.php index e77cdf77c8..11b8badabf 100644 --- a/includes/actions/InfoAction.php +++ b/includes/actions/InfoAction.php @@ -207,8 +207,6 @@ class InfoAction extends FormlessAction { * @return array */ protected function pageInfo() { - global $wgContLang; - $services = MediaWikiServices::getInstance(); $user = $this->getUser(); @@ -235,13 +233,14 @@ class InfoAction extends FormlessAction { ]; // Is it a redirect? If so, where to? - if ( $title->isRedirect() ) { + $redirectTarget = $this->page->getRedirectTarget(); + if ( $redirectTarget !== null ) { $pageInfo['header-basic'][] = [ $this->msg( 'pageinfo-redirectsto' ), - $linkRenderer->makeLink( $this->page->getRedirectTarget() ) . + $linkRenderer->makeLink( $redirectTarget ) . $this->msg( 'word-separator' )->escaped() . $this->msg( 'parentheses' )->rawParams( $linkRenderer->makeLink( - $this->page->getRedirectTarget(), + $redirectTarget, $this->msg( 'pageinfo-redirectsto-info' )->text(), [], [ 'action' => 'info' ] @@ -607,7 +606,7 @@ class InfoAction extends FormlessAction { $wordIDs = $magicWords->names; // Array of IDs => localized magic words - $localizedWords = $wgContLang->getMagicWords(); + $localizedWords = $services->getContentLanguage()->getMagicWords(); $listItems = []; foreach ( $pageProperties as $property => $value ) { diff --git a/includes/actions/RevertAction.php b/includes/actions/RevertAction.php index a914c9b2b3..68a032573a 100644 --- a/includes/actions/RevertAction.php +++ b/includes/actions/RevertAction.php @@ -23,6 +23,8 @@ * @author Rob Church */ +use MediaWiki\MediaWikiServices; + /** * File reversion user interface * @@ -78,8 +80,6 @@ class RevertAction extends FormAction { } protected function getFormFields() { - global $wgContLang; - $timestamp = $this->oldFile->getTimestamp(); $user = $this->getUser(); @@ -88,8 +88,9 @@ class RevertAction extends FormAction { $userTime = $lang->userTime( $timestamp, $user ); $siteTs = MWTimestamp::getLocalInstance( $timestamp ); $ts = $siteTs->format( 'YmdHis' ); - $siteDate = $wgContLang->date( $ts, false, false ); - $siteTime = $wgContLang->time( $ts, false, false ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $siteDate = $contLang->date( $ts, false, false ); + $siteTime = $contLang->time( $ts, false, false ); $tzMsg = $siteTs->getTimezoneMessage()->inContentLanguage()->text(); return [ diff --git a/includes/actions/SpecialPageAction.php b/includes/actions/SpecialPageAction.php index e59b6d61ad..8a231cbe5f 100644 --- a/includes/actions/SpecialPageAction.php +++ b/includes/actions/SpecialPageAction.php @@ -18,6 +18,8 @@ * @ingroup Actions */ +use MediaWiki\MediaWikiServices; + /** * An action that just passes the request to the relevant special page * @@ -92,6 +94,7 @@ class SpecialPageAction extends FormlessAction { } // map actions to (whitelisted) special pages - return SpecialPageFactory::getPage( self::$actionToSpecialPageMapping[$action] ); + return MediaWikiServices::getInstance()->getSpecialPageFactory()-> + getPage( self::$actionToSpecialPageMapping[$action] ); } } diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php index e546c4aca5..ac07eebe3b 100644 --- a/includes/api/ApiBase.php +++ b/includes/api/ApiBase.php @@ -1246,8 +1246,8 @@ abstract class ApiBase extends ContextSource { // Preserve U+001F for self::parseMultiValue(), or error out if that won't be called if ( isset( $value ) && substr( $rawValue, 0, 1 ) === "\x1f" ) { if ( $multi ) { - // This loses the potential $wgContLang->checkTitleEncoding() transformation - // done by WebRequest for $_GET. Let's call that a feature. + // This loses the potential checkTitleEncoding() transformation done by + // WebRequest for $_GET. Let's call that a feature. $value = implode( "\x1f", $request->normalizeUnicode( explode( "\x1f", $rawValue ) ) ); } else { $this->dieWithError( 'apierror-badvalue-notmultivalue', 'badvalue_notmultivalue' ); diff --git a/includes/api/ApiHelp.php b/includes/api/ApiHelp.php index 041b02479b..72509c233e 100644 --- a/includes/api/ApiHelp.php +++ b/includes/api/ApiHelp.php @@ -91,8 +91,6 @@ class ApiHelp extends ApiBase { * @param array $options Formatting options (described above) */ public static function getHelp( IContextSource $context, $modules, array $options ) { - global $wgContLang; - if ( !is_array( $modules ) ) { $modules = [ $modules ]; } @@ -108,10 +106,12 @@ class ApiHelp extends ApiBase { } $out->setPageTitle( $context->msg( 'api-help-title' ) ); - $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + $services = MediaWikiServices::getInstance(); + $cache = $services->getMainWANObjectCache(); $cacheKey = null; if ( count( $modules ) == 1 && $modules[0] instanceof ApiMain && - $options['recursivesubmodules'] && $context->getLanguage() === $wgContLang + $options['recursivesubmodules'] && + $context->getLanguage()->equals( $services->getContentLanguage() ) ) { $cacheHelpTimeout = $context->getConfig()->get( 'APICacheHelpTimeout' ); if ( $cacheHelpTimeout > 0 ) { diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index e5e384c0f1..03d29524a8 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -244,8 +244,7 @@ class ApiMain extends ApiBase { // for uselang=user (see T85635). } else { if ( $uselang === 'content' ) { - global $wgContLang; - $uselang = $wgContLang->getCode(); + $uselang = MediaWikiServices::getInstance()->getContentLanguage()->getCode(); } $code = RequestContext::sanitizeLangCode( $uselang ); $this->getContext()->setLanguage( $code ); @@ -265,8 +264,7 @@ class ApiMain extends ApiBase { if ( $errorLangCode === 'uselang' ) { $errorLang = $this->getLanguage(); } elseif ( $errorLangCode === 'content' ) { - global $wgContLang; - $errorLang = $wgContLang; + $errorLang = MediaWikiServices::getInstance()->getContentLanguage(); } else { $errorLangCode = RequestContext::sanitizeLangCode( $errorLangCode ); $errorLang = Language::factory( $errorLangCode ); @@ -809,7 +807,7 @@ class ApiMain extends ApiBase { * Attempt to validate the value of Access-Control-Request-Headers against a list * of headers that we allow the follow up request to send. * - * @param string $requestedHeaders Comma seperated list of HTTP headers + * @param string $requestedHeaders Comma separated list of HTTP headers * @return bool True if all requested headers are in the list of allowed headers */ protected static function matchRequestedHeaders( $requestedHeaders ) { diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php index ea2a85fb1e..26846f4332 100644 --- a/includes/api/ApiPageSet.php +++ b/includes/api/ApiPageSet.php @@ -512,11 +512,10 @@ class ApiPageSet extends ApiBase { * @since 1.21 */ public function getNormalizedTitlesAsResult( $result = null ) { - global $wgContLang; - $values = []; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); foreach ( $this->getNormalizedTitles() as $rawTitleStr => $titleStr ) { - $encode = ( $wgContLang->normalize( $rawTitleStr ) !== $rawTitleStr ); + $encode = $contLang->normalize( $rawTitleStr ) !== $rawTitleStr; $values[] = [ 'fromencoded' => $encode, 'from' => $encode ? rawurlencode( $rawTitleStr ) : $rawTitleStr, @@ -1171,6 +1170,8 @@ class ApiPageSet extends ApiBase { private function processTitlesArray( $titles ) { $usernames = []; $linkBatch = new LinkBatch(); + $services = MediaWikiServices::getInstance(); + $contLang = $services->getContentLanguage(); foreach ( $titles as $title ) { if ( is_string( $title ) ) { @@ -1198,15 +1199,13 @@ class ApiPageSet extends ApiBase { $this->mInterwikiTitles[$unconvertedTitle] = $titleObj->getInterwiki(); } else { // Variants checking - global $wgContLang; - if ( $this->mConvertTitles && - $wgContLang->hasVariants() && - !$titleObj->exists() + if ( + $this->mConvertTitles && $contLang->hasVariants() && !$titleObj->exists() ) { // Language::findVariantLink will modify titleText and titleObj into // the canonical variant if possible $titleText = is_string( $title ) ? $title : $titleObj->getPrefixedText(); - $wgContLang->findVariantLink( $titleText, $titleObj ); + $contLang->findVariantLink( $titleText, $titleObj ); $titleWasConverted = $unconvertedTitle !== $titleObj->getPrefixedText(); } @@ -1219,7 +1218,8 @@ class ApiPageSet extends ApiBase { $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId; $target = null; if ( $ns === NS_SPECIAL && $this->mResolveRedirects ) { - $special = SpecialPageFactory::getPage( $dbkey ); + $spFactory = $services->getSpecialPageFactory(); + $special = $spFactory->getPage( $dbkey ); if ( $special instanceof RedirectSpecialArticle ) { // Only RedirectSpecialArticle is intended to redirect to an article, other kinds of // RedirectSpecialPage are probably applying weird URL parameters we don't want to handle. @@ -1227,7 +1227,7 @@ class ApiPageSet extends ApiBase { $context->setTitle( $titleObj ); $context->setRequest( new FauxRequest ); $special->setContext( $context ); - list( /* $alias */, $subpage ) = SpecialPageFactory::resolveAlias( $dbkey ); + list( /* $alias */, $subpage ) = $spFactory->resolveAlias( $dbkey ); $target = $special->getRedirect( $subpage ); } } @@ -1265,7 +1265,7 @@ class ApiPageSet extends ApiBase { } } // Get gender information - $genderCache = MediaWikiServices::getInstance()->getGenderCache(); + $genderCache = $services->getGenderCache(); $genderCache->doQuery( $usernames, __METHOD__ ); return $linkBatch; @@ -1402,7 +1402,7 @@ class ApiPageSet extends ApiBase { if ( isset( $data[$toPageId] ) && isset( $this->mGeneratorData[$fromNs][$fromDBkey] ) ) { - // It is necesary to set both $data and add to $result, if an ApiResult, + // It is necessary to set both $data and add to $result, if an ApiResult, // to ensure multiple redirects to the same destination are all merged. $data[$toPageId] = call_user_func( $this->mRedirectMergePolicy, diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php index 40abcaf2d2..1d57c3c47a 100644 --- a/includes/api/ApiQueryAllMessages.php +++ b/includes/api/ApiQueryAllMessages.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * A query action to return messages from site message cache * @@ -110,15 +112,13 @@ class ApiQueryAllMessages extends ApiQueryBase { // Whether we have any sort of message customisation filtering $customiseFilterEnabled = $params['customised'] !== 'all'; if ( $customiseFilterEnabled ) { - global $wgContLang; - $customisedMessages = AllMessagesTablePager::getCustomisedStatuses( array_map( [ $langObj, 'ucfirst' ], $messages_target ), $langObj->getCode(), - !$langObj->equals( $wgContLang ) + !$langObj->equals( MediaWikiServices::getInstance()->getContentLanguage() ) ); $customised = $params['customised'] === 'modified'; diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php index 8994e0638c..18d2804c2f 100644 --- a/includes/api/ApiQueryImageInfo.php +++ b/includes/api/ApiQueryImageInfo.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * A query action to get image information and upload history. * @@ -369,14 +371,12 @@ class ApiQueryImageInfo extends ApiQueryBase { * @return array Result array */ public static function getInfo( $file, $prop, $result, $thumbParams = null, $opts = false ) { - global $wgContLang; - $anyHidden = false; if ( !$opts || is_string( $opts ) ) { $opts = [ 'version' => $opts ?: 'latest', - 'language' => $wgContLang, + 'language' => MediaWikiServices::getInstance()->getContentLanguage(), 'multilang' => false, 'extmetadatafilter' => [], 'revdelUser' => null, @@ -650,8 +650,6 @@ class ApiQueryImageInfo extends ApiQueryBase { } public function getAllowedParams() { - global $wgContLang; - return [ 'prop' => [ ApiBase::PARAM_ISMULTI => true, @@ -690,7 +688,8 @@ class ApiQueryImageInfo extends ApiQueryBase { ], 'extmetadatalanguage' => [ ApiBase::PARAM_TYPE => 'string', - ApiBase::PARAM_DFLT => $wgContLang->getCode(), + ApiBase::PARAM_DFLT => + MediaWikiServices::getInstance()->getContentLanguage()->getCode(), ], 'extmetadatamultilang' => [ ApiBase::PARAM_TYPE => 'boolean', diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php index 1d3c110c3a..0cf6b04c82 100644 --- a/includes/api/ApiQueryInfo.php +++ b/includes/api/ApiQueryInfo.php @@ -764,12 +764,12 @@ class ApiQueryInfo extends ApiQueryBase { } private function getAllVariants( $text, $ns = NS_MAIN ) { - global $wgContLang; $result = []; - foreach ( $wgContLang->getVariants() as $variant ) { - $convertTitle = $wgContLang->autoConvert( $text, $variant ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + foreach ( $contLang->getVariants() as $variant ) { + $convertTitle = $contLang->autoConvert( $text, $variant ); if ( $ns !== NS_MAIN ) { - $convertNs = $wgContLang->convertNamespace( $ns, $variant ); + $convertNs = $contLang->convertNamespace( $ns, $variant ); $convertTitle = $convertNs . ':' . $convertTitle; } $result[$variant] = $convertTitle; diff --git a/includes/api/ApiQueryLangLinks.php b/includes/api/ApiQueryLangLinks.php index 2d8e44cda5..f33a67fe96 100644 --- a/includes/api/ApiQueryLangLinks.php +++ b/includes/api/ApiQueryLangLinks.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * A query module to list all langlinks (links to corresponding foreign language pages). * @@ -140,7 +142,6 @@ class ApiQueryLangLinks extends ApiQueryBase { } public function getAllowedParams() { - global $wgContLang; return [ 'prop' => [ ApiBase::PARAM_ISMULTI => true, @@ -160,7 +161,7 @@ class ApiQueryLangLinks extends ApiQueryBase { 'descending' ] ], - 'inlanguagecode' => $wgContLang->getCode(), + 'inlanguagecode' => MediaWikiServices::getInstance()->getContentLanguage()->getCode(), 'limit' => [ ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php index f5461e0ace..b90dd5d6af 100644 --- a/includes/api/ApiQuerySearch.php +++ b/includes/api/ApiQuerySearch.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * Query module to perform full text search within wiki titles and content * @@ -48,7 +50,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { * @return void */ private function run( $resultPageSet = null ) { - global $wgContLang; $params = $this->extractRequestParams(); // Extract parameters @@ -152,7 +153,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { } // Add the search results to the result - $terms = $wgContLang->convertForSearchResult( $matches->termMatches() ); + $terms = MediaWikiServices::getInstance()->getContentLanguage()-> + convertForSearchResult( $matches->termMatches() ); $titles = []; $count = 0; $limit = $params['limit']; @@ -397,13 +399,14 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { // If we have more than one engine the list of available sorts is // difficult to represent. For now don't expose it. - $alternatives = MediaWiki\MediaWikiServices::getInstance() + $services = MediaWiki\MediaWikiServices::getInstance(); + $alternatives = $services ->getSearchEngineConfig() ->getSearchTypes(); if ( count( $alternatives ) == 1 ) { $this->allowedParams['sort'] = [ ApiBase::PARAM_DFLT => 'relevance', - ApiBase::PARAM_TYPE => MediaWiki\MediaWikiServices::getInstance() + ApiBase::PARAM_TYPE => $services ->newSearchEngine() ->getValidSorts(), ]; diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php index 7d4b55f1e0..697eab69ba 100644 --- a/includes/api/ApiQuerySiteinfo.php +++ b/includes/api/ApiQuerySiteinfo.php @@ -54,8 +54,7 @@ class ApiQuerySiteinfo extends ApiQueryBase { $fit = $this->appendMagicWords( $p ); break; case 'interwikimap': - $filteriw = $params['filteriw'] ?? false; - $fit = $this->appendInterwikiMap( $p, $filteriw ); + $fit = $this->appendInterwikiMap( $p, $params['filteriw'] ); break; case 'dbrepllag': $fit = $this->appendDbReplLagInfo( $p, $params['showalldb'] ); @@ -112,7 +111,7 @@ class ApiQuerySiteinfo extends ApiQueryBase { $fit = $this->appendUploadDialog( $p ); break; default: - ApiBase::dieDebug( __METHOD__, "Unknown prop=$p" ); + ApiBase::dieDebug( __METHOD__, "Unknown prop=$p" ); // @codeCoverageIgnore } if ( !$fit ) { // Abuse siprop as a query-continue parameter @@ -126,8 +125,6 @@ class ApiQuerySiteinfo extends ApiQueryBase { } protected function appendGeneralInfo( $property ) { - global $wgContLang; - $config = $this->getConfig(); $data = []; @@ -145,7 +142,7 @@ class ApiQuerySiteinfo extends ApiQueryBase { $data['phpversion'] = PHP_VERSION; $data['phpsapi'] = PHP_SAPI; if ( defined( 'HHVM_VERSION' ) ) { - $data['hhvmversion'] = HHVM_VERSION; + $data['hhvmversion'] = HHVM_VERSION; // @codeCoverageIgnore } $data['dbtype'] = $config->get( 'DBtype' ); $data['dbversion'] = $this->getDB()->getServerVersion(); @@ -165,8 +162,9 @@ class ApiQuerySiteinfo extends ApiQueryBase { $data['langconversion'] = !$config->get( 'DisableLangConversion' ); $data['titleconversion'] = !$config->get( 'DisableTitleConversion' ); - if ( $wgContLang->linkPrefixExtension() ) { - $linkPrefixCharset = $wgContLang->linkPrefixCharset(); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + if ( $contLang->linkPrefixExtension() ) { + $linkPrefixCharset = $contLang->linkPrefixCharset(); $data['linkprefixcharset'] = $linkPrefixCharset; // For backwards compatibility $data['linkprefix'] = "/^((?>.*[^$linkPrefixCharset]|))(.+)$/sDu"; @@ -175,7 +173,7 @@ class ApiQuerySiteinfo extends ApiQueryBase { $data['linkprefix'] = ''; } - $linktrail = $wgContLang->linkTrail(); + $linktrail = $contLang->linkTrail(); $data['linktrail'] = $linktrail ?: ''; $data['legaltitlechars'] = Title::legalChars(); @@ -198,26 +196,26 @@ class ApiQuerySiteinfo extends ApiQueryBase { $data['lang'] = $config->get( 'LanguageCode' ); $fallbacks = []; - foreach ( $wgContLang->getFallbackLanguages() as $code ) { + foreach ( $contLang->getFallbackLanguages() as $code ) { $fallbacks[] = [ 'code' => $code ]; } $data['fallback'] = $fallbacks; ApiResult::setIndexedTagName( $data['fallback'], 'lang' ); - if ( $wgContLang->hasVariants() ) { + if ( $contLang->hasVariants() ) { $variants = []; - foreach ( $wgContLang->getVariants() as $code ) { + foreach ( $contLang->getVariants() as $code ) { $variants[] = [ 'code' => $code, - 'name' => $wgContLang->getVariantname( $code ), + 'name' => $contLang->getVariantname( $code ), ]; } $data['variants'] = $variants; ApiResult::setIndexedTagName( $data['variants'], 'lang' ); } - $data['rtl'] = $wgContLang->isRTL(); - $data['fallback8bitEncoding'] = $wgContLang->fallback8bitEncoding(); + $data['rtl'] = $contLang->isRTL(); + $data['fallback8bitEncoding'] = $contLang->fallback8bitEncoding(); $data['readonly'] = wfReadOnly(); if ( $data['readonly'] ) { @@ -229,12 +227,6 @@ class ApiQuerySiteinfo extends ApiQueryBase { $tz = $config->get( 'Localtimezone' ); $offset = $config->get( 'LocalTZoffset' ); - if ( is_null( $tz ) ) { - $tz = 'UTC'; - $offset = 0; - } elseif ( is_null( $offset ) ) { - $offset = 0; - } $data['timezone'] = $tz; $data['timeoffset'] = intval( $offset ); $data['articlepath'] = $config->get( 'ArticlePath' ); @@ -287,11 +279,13 @@ class ApiQuerySiteinfo extends ApiQueryBase { } protected function appendNamespaces( $property ) { - global $wgContLang; $data = [ ApiResult::META_TYPE => 'assoc', ]; - foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) { + foreach ( + MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces() + as $ns => $title + ) { $data[$ns] = [ 'id' => intval( $ns ), 'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive', @@ -321,10 +315,10 @@ class ApiQuerySiteinfo extends ApiQueryBase { } protected function appendNamespaceAliases( $property ) { - global $wgContLang; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $aliases = array_merge( $this->getConfig()->get( 'NamespaceAliases' ), - $wgContLang->getNamespaceAliases() ); - $namespaces = $wgContLang->getNamespaces(); + $contLang->getNamespaceAliases() ); + $namespaces = $contLang->getNamespaces(); $data = []; foreach ( $aliases as $title => $ns ) { if ( $namespaces[$ns] == $title ) { @@ -346,10 +340,10 @@ class ApiQuerySiteinfo extends ApiQueryBase { } protected function appendSpecialPageAliases( $property ) { - global $wgContLang; $data = []; - $aliases = $wgContLang->getSpecialPageAliases(); - foreach ( SpecialPageFactory::getNames() as $specialpage ) { + $services = MediaWikiServices::getInstance(); + $aliases = $services->getContentLanguage()->getSpecialPageAliases(); + foreach ( $services->getSpecialPageFactory()->getNames() as $specialpage ) { if ( isset( $aliases[$specialpage] ) ) { $arr = [ 'realname' => $specialpage, 'aliases' => $aliases[$specialpage] ]; ApiResult::setIndexedTagName( $arr['aliases'], 'alias' ); @@ -362,9 +356,11 @@ class ApiQuerySiteinfo extends ApiQueryBase { } protected function appendMagicWords( $property ) { - global $wgContLang; $data = []; - foreach ( $wgContLang->getMagicWords() as $magicword => $aliases ) { + foreach ( + MediaWikiServices::getInstance()->getContentLanguage()->getMagicWords() + as $magicword => $aliases + ) { $caseSensitive = array_shift( $aliases ); $arr = [ 'name' => $magicword, 'aliases' => $aliases ]; $arr['case-sensitive'] = (bool)$caseSensitive; @@ -377,13 +373,13 @@ class ApiQuerySiteinfo extends ApiQueryBase { } protected function appendInterwikiMap( $property, $filter ) { - $local = null; if ( $filter === 'local' ) { $local = 1; } elseif ( $filter === '!local' ) { $local = 0; - } elseif ( $filter ) { - ApiBase::dieDebug( __METHOD__, "Unknown filter=$filter" ); + } else { + // $filter === null + $local = null; } $params = $this->extractRequestParams(); @@ -663,13 +659,13 @@ class ApiQuerySiteinfo extends ApiQueryBase { $url = $config->get( 'RightsUrl' ); } $text = $config->get( 'RightsText' ); - if ( !$text && $title ) { + if ( $title && !strlen( $text ) ) { $text = $title->getPrefixedText(); } $data = [ - 'url' => $url ?: '', - 'text' => $text ?: '' + 'url' => strlen( $url ) ? $url : '', + 'text' => strlen( $text ) ? $text : '', ]; return $this->getResult()->addValue( 'query', $property, $data ); @@ -789,8 +785,12 @@ class ApiQuerySiteinfo extends ApiQueryBase { public function appendExtensionTags( $property ) { global $wgParser; - $wgParser->firstCallInit(); - $tags = array_map( [ $this, 'formatParserTags' ], $wgParser->getTags() ); + $tags = array_map( + function ( $item ) { + return "<$item>"; + }, + $wgParser->getTags() + ); ApiResult::setArrayType( $tags, 'BCarray' ); ApiResult::setIndexedTagName( $tags, 't' ); @@ -799,7 +799,6 @@ class ApiQuerySiteinfo extends ApiQueryBase { public function appendFunctionHooks( $property ) { global $wgParser; - $wgParser->firstCallInit(); $hooks = $wgParser->getFunctionHooks(); ApiResult::setArrayType( $hooks, 'BCarray' ); ApiResult::setIndexedTagName( $hooks, 'h' ); @@ -835,10 +834,6 @@ class ApiQuerySiteinfo extends ApiQueryBase { return $this->getResult()->addValue( 'query', $property, $config ); } - private function formatParserTags( $item ) { - return "<{$item}>"; - } - public function appendSubscribedHooks( $property ) { $hooks = $this->getConfig()->get( 'Hooks' ); $myWgHooks = $hooks; diff --git a/includes/api/ApiResult.php b/includes/api/ApiResult.php index 3b7c181fa7..c4a31c7845 100644 --- a/includes/api/ApiResult.php +++ b/includes/api/ApiResult.php @@ -18,6 +18,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * This class represents the result of the API operations. * It simply wraps a nested array structure, adding some functions to simplify @@ -330,8 +332,6 @@ class ApiResult implements ApiSerializable { * @return array|mixed|string */ private static function validateValue( $value ) { - global $wgContLang; - if ( is_object( $value ) ) { // Note we use is_callable() here instead of instanceof because // ApiSerializable is an informal protocol (see docs there for details). @@ -374,7 +374,7 @@ class ApiResult implements ApiSerializable { } elseif ( is_float( $value ) && !is_finite( $value ) ) { throw new InvalidArgumentException( 'Cannot add non-finite floats to ApiResult' ); } elseif ( is_string( $value ) ) { - $value = $wgContLang->normalize( $value ); + $value = MediaWikiServices::getInstance()->getContentLanguage()->normalize( $value ); } elseif ( $value !== null && !is_scalar( $value ) ) { $type = gettype( $value ); if ( is_resource( $value ) ) { diff --git a/includes/api/ApiStashEdit.php b/includes/api/ApiStashEdit.php index 23163c2489..a3e3e575e7 100644 --- a/includes/api/ApiStashEdit.php +++ b/includes/api/ApiStashEdit.php @@ -67,11 +67,11 @@ class ApiStashEdit extends ApiBase { ); } - $this->requireAtLeastOneParameter( $params, 'stashedtexthash', 'text' ); + $this->requireOnlyOneParameter( $params, 'stashedtexthash', 'text' ); $text = null; $textHash = null; - if ( strlen( $params['stashedtexthash'] ) ) { + if ( $params['stashedtexthash'] !== null ) { // Load from cache since the client indicates the text is the same as last stash $textHash = $params['stashedtexthash']; if ( !preg_match( '/^[0-9a-f]{40}$/', $textHash ) ) { @@ -82,16 +82,11 @@ class ApiStashEdit extends ApiBase { if ( !is_string( $text ) ) { $this->dieWithError( 'apierror-stashedit-missingtext', 'missingtext' ); } - } elseif ( $params['text'] !== null ) { - // Trim and fix newlines so the key SHA1's match (see WebRequest::getText()) + } else { + // 'text' was passed. 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->dieWithError( [ - 'apierror-missingparam-at-least-one-of', - Message::listParam( [ 'stashedtexthash', 'text' ] ), - 2, - ], 'missingparam' ); } $textContent = ContentHandler::makeContent( @@ -156,14 +151,13 @@ class ApiStashEdit extends ApiBase { $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); $stats->increment( "editstash.cache_stores.$status" ); - $this->getResult()->addValue( - null, - $this->getModuleName(), - [ - 'status' => $status, - 'texthash' => $textHash - ] - ); + $ret = [ 'status' => $status ]; + // If we were rate-limited, we still return the pre-existing valid hash if one was passed + if ( $status !== 'ratelimited' || $params['stashedtexthash'] !== null ) { + $ret['texthash'] = $textHash; + } + + $this->getResult()->addValue( null, $this->getModuleName(), $ret ); } /** @@ -407,7 +401,7 @@ class ApiStashEdit extends ApiBase { ) { // If an item is renewed, mind the cache TTL determined by config and parser functions. // Put an upper limit on the TTL for sanity to avoid extreme template/file staleness. - $since = time() - wfTimestamp( TS_UNIX, $parserOutput->getTimestamp() ); + $since = time() - wfTimestamp( TS_UNIX, $parserOutput->getCacheTime() ); $ttl = min( $parserOutput->getCacheExpiry() - $since, self::MAX_CACHE_TTL ); // Avoid extremely stale user signature timestamps (T84843) diff --git a/includes/api/i18n/ar.json b/includes/api/i18n/ar.json index 8c69b9d57b..241e71afd8 100644 --- a/includes/api/i18n/ar.json +++ b/includes/api/i18n/ar.json @@ -1056,13 +1056,16 @@ "apihelp-query+revisions+base-paramvalue-prop-user": "المستخدم الذي أجرى المراجعة.", "apihelp-query+revisions+base-paramvalue-prop-userid": "معرف المستخدم لمنشئ المراجعة.", "apihelp-query+revisions+base-paramvalue-prop-size": "طول (بايت) المراجعة.", + "apihelp-query+revisions+base-paramvalue-prop-slotsize": "طول (بايت) كل فتحة مراجعة.", "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (القاعدة 16) المراجعة.", - "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "معرف نموذج المحتوى للمراجعة.", + "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "SHA-1 (القاعدة 16) لكل فتحة مراجعة.", + "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "معرف نموذج المحتوى لكل فتحة مراجعة.", "apihelp-query+revisions+base-paramvalue-prop-comment": "تعليق من قبل المستخدم للمراجعة.", "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "تعليق محلل من قبل المستخدم للمراجعة.", - "apihelp-query+revisions+base-paramvalue-prop-content": "نص المراجعة.", + "apihelp-query+revisions+base-paramvalue-prop-content": "محتوى كل فتحة مراجعة.", "apihelp-query+revisions+base-paramvalue-prop-tags": "وسوم للمراجعة.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "موقوف. استخدم [[Special:ApiHelp/expandtemplates|action=expandtemplates]] أو [[Special:ApiHelp/parse|action=parse]] بدلا من ذلك، شجرة تحليل XML لمحتوى المراجعة (تتطلب نموذج المحتوى $1).", + "apihelp-query+revisions+base-paramvalue-prop-roles": "أدرج أدوار فتحة المحتوى الموجودة في المراجعة.", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "استخدم [[Special:ApiHelp/expandtemplates|action=expandtemplates]] أو [[Special:ApiHelp/parse|action=parse]] بدلا من ذلك، شجرة تحليل XML لمحتوى المراجعة (تتطلب نموذج المحتوى $1).", "apihelp-query+revisions+base-param-limit": "الحد من عدد المراجعات التي سيتم إرجاعها.", "apihelp-query+revisions+base-param-expandtemplates": "استخدم [[Special:ApiHelp/expandtemplates|action=expandtemplates]] بدلا من ذلك، قم بتوسيع القوالب في محتوى المراجعة (يتطلب $1prop=content).", "apihelp-query+revisions+base-param-generatexml": "استخدم [[Special:ApiHelp/expandtemplates|action=expandtemplates]] أو [[Special:ApiHelp/parse|action=parse]] بدلا من ذلك، قم بتوليد شجرة تحليل XML لمحتوى المراجعة (تتطلب $1prop=content).", @@ -1591,6 +1594,7 @@ "apierror-emptynewsection": "إنشاء أقسام جديدة فارغة غير ممكن.", "apierror-emptypage": "لا يُسمَح بإنشاء صفحات جديدة فارغة.", "apierror-exceptioncaught": "[$1] تم اكتشاف الاستثناء: $2", + "apierror-exceptioncaughttype": "[$1] تم اكتشافها باستثناء النوع $2", "apierror-filedoesnotexist": "الملف غير موجود.", "apierror-fileexists-sharedrepo-perm": "الملف الهدف موجود في مستودع مشترك; استخدم الوسيط ignorewarnings لتجاوزه.", "apierror-filenopath": "لا يمكن الحصول على مسار الملف المحلي.", diff --git a/includes/api/i18n/fr.json b/includes/api/i18n/fr.json index 56524046ca..a62b2bae4f 100644 --- a/includes/api/i18n/fr.json +++ b/includes/api/i18n/fr.json @@ -1725,7 +1725,7 @@ "apierror-sectionsnotsupported": "Les sections ne sont pas prises en charge pour le modèle de contenu $1.", "apierror-sectionsnotsupported-what": "Les sections ne sont pas prises en charge par $1.", "apierror-show": "Paramètre incorrect - des valeurs mutuellement exclusives ne peuvent pas être fournies.", - "apierror-siteinfo-includealldenied": "Impossible d’afficher toutes les informatiosn du serveur, sauf si $wgShowHostnames vaut vrai.", + "apierror-siteinfo-includealldenied": "Impossible d’afficher toutes les informations du serveur, sauf si $wgShowHostnames vaut vrai.", "apierror-sizediffdisabled": "La différence de taille est désactivée dans le mode Miser.", "apierror-spamdetected": "Votre modification a été refusée parce qu’elle contenait un fragment de pourriel : $1.", "apierror-specialpage-cantexecute": "Vous n'avez pas l'autorisation d'afficher les résultats de cette page spéciale.", diff --git a/includes/api/i18n/he.json b/includes/api/i18n/he.json index e2c73c20c5..cb018dc696 100644 --- a/includes/api/i18n/he.json +++ b/includes/api/i18n/he.json @@ -1062,13 +1062,17 @@ "apihelp-query+revisions+base-paramvalue-prop-user": "המשתמש שעשה את הגרסה", "apihelp-query+revisions+base-paramvalue-prop-userid": "מזהה המשתמש של יוצר הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-size": "אורך (בבייטים) של הגרסה.", + "apihelp-query+revisions+base-paramvalue-prop-slotsize": "אורך (בבתים) של כל משבצת גרסה.", "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (בבסיס 16) של הגרסה.", - "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "מזהה מודל התוכן של הגרסה.", + "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "SHA-1 (בסיס 16) של כל משבצת גרסה.", + "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "מזהה מודל התוכן של כל משבצת גרסה.", "apihelp-query+revisions+base-paramvalue-prop-comment": "הערה מאת המשתמש על הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "הערה מפוענחת מאת המשתמש על הגרסה.", - "apihelp-query+revisions+base-paramvalue-prop-content": "הטקסט של הגרסה.", + "apihelp-query+revisions+base-paramvalue-prop-content": "התוכן של כל משבצת גרסה.", "apihelp-query+revisions+base-paramvalue-prop-tags": "התגים עבור הגרסה.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "מיושן. יש להשתמש ב־ [[Special:ApiHelp/expandtemplates|action=expandtemplates]] או ב־ [[Special:ApiHelp/parse|action=parse]] במקום בזה.\n\nעץ פענוח XML של תוכן הגרסה (דורש מודל תוכן $1).", + "apihelp-query+revisions+base-paramvalue-prop-roles": "רשימת תפקידי משבצות תוכן שקיימות בגרסה.", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "יש להשתמש ב־ [[Special:ApiHelp/expandtemplates|action=expandtemplates]] או ב־ [[Special:ApiHelp/parse|action=parse]] במקום בזה.\n\nעץ פענוח XML של תוכן הגרסה (דורש מודל תוכן $1).", + "apihelp-query+revisions+base-param-slots": "עבור אילו משבצות תוכן להחזיר נתונים, כאשר מאפיינים שקשורים למשבצת כלולים ב־$1props. אם זה מושמט, נתונים ממשבצת main יוחזרו בתסדיר תואם לאחור.", "apihelp-query+revisions+base-param-limit": "הגבלת מספר הגרסאות שיוחזרו.", "apihelp-query+revisions+base-param-expandtemplates": "יש להשתמש ב־[[Special:ApiHelp/expandtemplates|action=expandtemplates]] במקום בזה. להרחיב תבניות בתוכן הגרסה (דורש $1prop=content).", "apihelp-query+revisions+base-param-generatexml": "יש להשתמש ב־[[Special:ApiHelp/expandtemplates|action=expandtemplates]] או ב־[[Special:ApiHelp/parse|action=parse]] במקום בזה. יצירת עץ פענוח XML עבור תוכן הגרסה (דורש את $1prop=content; מוחלף ב־$1prop=parsetree).", @@ -1599,6 +1603,7 @@ "apierror-emptynewsection": "יצירת פסקאות חדשות ריקות בלתי־אפשרי.", "apierror-emptypage": "יצירת דפים חדשים ריקים אינו מותר.", "apierror-exceptioncaught": "[$1] נתפס חריג: $2", + "apierror-exceptioncaughttype": "[$1] נתפס חריג מסוג $2", "apierror-filedoesnotexist": "הקובץ אינו קיים.", "apierror-fileexists-sharedrepo-perm": "קובץ היעד קיים במאגר משותף. יש להשתמש בפרמטר ignorewarnings כדי לעקוף אותו.", "apierror-filenopath": "לא ניתן לקבל נתיב לקובץ מקומי.", @@ -1747,6 +1752,7 @@ "apiwarn-deprecation-login-botpw": "כניסה לחשבון עיקרי (main-account) דרך action=login מיושנת ועלולה להפסיק לעבוד ללא אזהרה נוספת. כדי להמשיך להיכנס עם action=login, ר' [[Special:BotPasswords]]. כדי להמשיך באופן מאובטח באמצעות חשבון עיקרי, ר' action=clientlogin.", "apiwarn-deprecation-login-nobotpw": "כניסה בחשבון ראשי עם action=login מיושנת ויכולה להפסיק לעבוד ללא אזהרה. כדי להיכנס באופן מאובטח, ר' action=clientlogin.", "apiwarn-deprecation-login-token": "אחזור אסימון דרך action=login מיושן. נא להשתמש ב־action=query&meta=tokens&type=login במקום זה.", + "apiwarn-deprecation-missingparam": "מכיוון שלא צוין $1, ישמש תסדיר ישן לפלט. התסדיר הזה מוכרז בתור מיושן, ובעתיד ישמש רק התסדיר החדש.", "apiwarn-deprecation-parameter": "הפרמטר $1 מיושן.", "apiwarn-deprecation-parse-headitems": "prop=headitems מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־prop=headhtml בעת יצירת מסמכי HTML חדשים, או ב־prop=modules|jsconfigvars בעת עדכון מסמך בצד הלקוח.", "apiwarn-deprecation-purge-get": "שימוש ב־action=purge דרך GET מיושן. יש להשתמש ב־POST במקום זה.", diff --git a/includes/api/i18n/ko.json b/includes/api/i18n/ko.json index 56a6507a57..e37bbbc5cf 100644 --- a/includes/api/i18n/ko.json +++ b/includes/api/i18n/ko.json @@ -317,7 +317,7 @@ "apihelp-query+allcategories-summary": "모든 분류를 열거합니다.", "apihelp-query+allcategories-param-prefix": "이 값으로 시작하는 모든 분류 제목을 검색합니다.", "apihelp-query+allcategories-param-dir": "정렬 방향.", - "apihelp-query+allcategories-param-limit": "반환할 분류의 갯수입니다.", + "apihelp-query+allcategories-param-limit": "반환할 분류의 개수입니다.", "apihelp-query+allcategories-param-prop": "얻고자 하는 속성:", "apihelp-query+allcategories-paramvalue-prop-size": "페이지 수를 분류에 추가합니다.", "apihelp-query+alldeletedrevisions-summary": "사용자에 의해서나 이름공간 안에서 삭제된 모든 판을 나열합니다.", @@ -351,7 +351,7 @@ "apihelp-query+allredirects-param-namespace": "열거할 이름공간.", "apihelp-query+allredirects-param-limit": "반환할 총 항목 수입니다.", "apihelp-query+allrevisions-summary": "모든 판 표시.", - "apihelp-query+mystashedfiles-param-limit": "가져올 파일의 갯수.", + "apihelp-query+mystashedfiles-param-limit": "가져올 파일의 개수입니다.", "apihelp-query+alltransclusions-summary": "존재하지 않는 문서를 포함하여 끼워넣은 모든 문서({{x}}를 사용하여 끼워넣은 문서)를 나열합니다.", "apihelp-query+alltransclusions-param-prop": "포함할 정보:", "apihelp-query+alltransclusions-param-namespace": "열거할 이름공간.", @@ -384,7 +384,7 @@ "apihelp-query+blocks-paramvalue-prop-reason": "차단 이유를 추가합니다.", "apihelp-query+blocks-paramvalue-prop-range": "차단에 영향을 받는 IP 주소 대역을 추가합니다.", "apihelp-query+categories-summary": "문서가 속하는 모든 분류를 나열합니다.", - "apihelp-query+categories-param-limit": "반환할 분류의 갯수입니다.", + "apihelp-query+categories-param-limit": "반환할 분류의 개수입니다.", "apihelp-query+categoryinfo-summary": "제시된 분류의 정보를 반환합니다.", "apihelp-query+categorymembers-summary": "제시된 분류의 모든 문서를 나열합니다.", "apihelp-query+categorymembers-paramvalue-prop-ids": "페이지 ID를 추가합니다.", @@ -463,7 +463,7 @@ "apihelp-query+iwbacklinks-summary": "제시된 인터위키 링크에 연결된 모든 문서를 찾습니다.", "apihelp-query+iwbacklinks-param-prefix": "인터위키의 접두사.", "apihelp-query+iwbacklinks-param-title": "검색할 인터위키 링크. $1blprefix와 함께 사용해야 합니다.", - "apihelp-query+iwbacklinks-param-limit": "반활한 총 문서 수.", + "apihelp-query+iwbacklinks-param-limit": "반환할 총 문서 수입니다.", "apihelp-query+iwbacklinks-param-prop": "얻고자 하는 속성:", "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "인터위키의 접두사를 추가합니다.", "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "인터위키의 제목을 추가합니다.", @@ -883,6 +883,7 @@ "apierror-readonly": "위키는 현재 읽기 전용 모드입니다.", "apierror-revisions-badid": "$1 변수에 대한 판을 발견하지 못했습니다.", "apierror-revwrongpage": "r$1은(는) $2의 판이 아닙니다.", + "apierror-siteinfo-includealldenied": "$wgShowHostnames가 참이 아닐 경우 모든 서버의 정보를 볼 수 없습니다.", "apierror-specialpage-cantexecute": "특수 문서의 결과를 볼 권한이 없습니다.", "apierror-stashwrongowner": "잘못된 소유자: $1", "apierror-systemblocked": "당신은 미디어위키에 의해서 자동으로 차단되었습니다.", diff --git a/includes/api/i18n/ksh.json b/includes/api/i18n/ksh.json index 4ba40626e0..80d14162ce 100644 --- a/includes/api/i18n/ksh.json +++ b/includes/api/i18n/ksh.json @@ -2,7 +2,8 @@ "@metadata": { "authors": [ "Purodha", - "Macofe" + "Macofe", + "Als-Holder" ] }, "apihelp-main-extended-description": "
\n* [[mw:API:Main_page/de|Dokemäntazjohn]]\n* [[mw:API:FAQ/de|Öff jefrohch]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mäileng_Leß]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Aanköndejonge zom API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Jemäldte Fähler un Wönsch]\n
\nStatus: Alle op heh dä Sigg aanjzeischte Ußwahle sullte donn, ävver et API weed jrahd noch äntwekeld un et kann sesch alle Nahslangs jädd ändere. Holl Der de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ Mäileng_Leß med Aanköndejonge], öm automattesch övver Neujeschkeite enfommehrt ze wähde.\n\nKapodde Aanfrohre: Wam_mer kapodde Aanfroheaan et API API schek, kritt mer ene HTTP-Kopp ußjejovve met däm Täx „MediaWiki-API-Error“ dren, dä mer als ene Schlößel bedraachte kann. Mih dohzoh fengk met op dä Sigg [[mw:API:Errors_and_warnings|API: Fähler un Warnonge]].", @@ -289,7 +290,7 @@ "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 all“. ", + "apihelp-protect-example-unprotect": "Donn en Sigg nit mih schöze un doh för saz de Beschrängkonge op all.", "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 „Main Page“ un „API“ de zweschejeschpeijscherte Väsjohn fottschmiiße.", diff --git a/includes/api/i18n/pt-br.json b/includes/api/i18n/pt-br.json index 0b8a992e88..7378ac45f8 100644 --- a/includes/api/i18n/pt-br.json +++ b/includes/api/i18n/pt-br.json @@ -1070,7 +1070,7 @@ "apihelp-query+revisions+base-paramvalue-prop-content": "Conteúdo de cada segmento de revisão.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para a revisão.", "apihelp-query+revisions+base-paramvalue-prop-roles": "Listar as funções dos segmentos de conteúdo que existem na revisão.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Obsoleto. Use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]] em vez. A árvore de análise XML de conteúdo da revisão (requer o modelo de conteúdo $1).", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Usar antes [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]]. A árvore XML da análise sintática do conteúdo da revisão $1.", "apihelp-query+revisions+base-param-slots": "Quais os segmentos de revisão cujos dados devem ser devolvidos quando propriedades relacionadas com segmentos são incluídas em $1props. Se for omitido, serão devolvidos dados do segmento principal (main) num formato compatível com versões anteriores.", "apihelp-query+revisions+base-param-limit": "Limita quantas revisões serão retornadas.", "apihelp-query+revisions+base-param-expandtemplates": "Use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] em vez disso. Expande predefinições no conteúdo de revisão (requer $1prop=content).", diff --git a/includes/api/i18n/pt.json b/includes/api/i18n/pt.json index 0cc3238c1c..0733a2a212 100644 --- a/includes/api/i18n/pt.json +++ b/includes/api/i18n/pt.json @@ -1065,7 +1065,7 @@ "apihelp-query+revisions+base-paramvalue-prop-content": "Conteúdo de cada segmento de revisão.", "apihelp-query+revisions+base-paramvalue-prop-tags": "As etiquetas para a revisão.", "apihelp-query+revisions+base-paramvalue-prop-roles": "Listar as funções dos segmentos de conteúdo que existem na revisão.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Usar antes [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]]. A árvore XML da análise sintática do conteúdo da revisão $1).", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Usar antes [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]]. A árvore XML da análise sintática do conteúdo da revisão $1.", "apihelp-query+revisions+base-param-slots": "Quais os segmentos de revisão cujos dados devem ser devolvidos quando propriedades relacionadas com segmentos são incluídas em $1props. Se for omitido, serão devolvidos dados do segmento principal (main) num formato compatível com versões anteriores.", "apihelp-query+revisions+base-param-limit": "Limitar o número de revisões que serão devolvidas.", "apihelp-query+revisions+base-param-expandtemplates": "Em substituição, use [[Special:ApiHelp/expandtemplates|action=expandtemplates]]. Expandir predefinições no conteúdo da revisão (requer $1prop=content).", @@ -1093,7 +1093,7 @@ "apihelp-query+search-paramvalue-prop-sectionsnippet": "Adiciona um fragmento de código com o título da secção correspondente, após análise sintática.", "apihelp-query+search-paramvalue-prop-sectiontitle": "Adiciona o título da secção correspondente.", "apihelp-query+search-paramvalue-prop-categorysnippet": "Adiciona um fragmento de código com a categoria correspondente, após análise sintática.", - "apihelp-query+search-paramvalue-prop-isfilematch": "Adiciona um valor booleano que indica se a pesquisa encontrou correspondência no conteúdo de ficheiros.", + "apihelp-query+search-paramvalue-prop-isfilematch": "Adiciona um valor booliano que indica se a pesquisa encontrou correspondência no conteúdo de ficheiros.", "apihelp-query+search-paramvalue-prop-extensiondata": "Acrescenta dados adicionais gerados por extensões.", "apihelp-query+search-paramvalue-prop-score": "Ignorado.", "apihelp-query+search-paramvalue-prop-hasrelated": "Ignorado.", @@ -1441,11 +1441,11 @@ "apihelp-json-param-callback": "Se especificado, envolve o resultado de saída na forma de uma chamada para uma função. Por segurança, todos os dados específicos do utilizador estarão restringidos.", "apihelp-json-param-utf8": "Se especificado, codifica a maioria dos caracteres não ASCII (mas não todos) em UTF-8, em vez de substitui-los por sequências de escape hexadecimais. É o comportamento padrão quando formatversion não tem o valor 1.", "apihelp-json-param-ascii": "Se especificado, codifica todos caracteres não ASCII usando sequências de escape hexadecimais. É o comportamento padrão quando formatversion tem o valor 1.", - "apihelp-json-param-formatversion": "Formatação do resultado de saída:\n;1:Formato compatível com versões anteriores (booleanos ao estilo XML, * chaves para nodos de conteúdo, etc.).\n;2:Formato moderno experimental. As especificações podem mudar!\n;latest:Usar o formato mais recente (atualmente 2), mas pode ser alterado sem aviso prévio.", + "apihelp-json-param-formatversion": "Formatação do resultado de saída:\n;1:Formato compatível com versões anteriores (boolianos ao estilo XML, * chaves para nodos de conteúdo, etc.).\n;2:Formato moderno experimental. As especificações podem mudar!\n;latest:Usar o formato mais recente (atualmente 2), mas pode ser alterado sem aviso prévio.", "apihelp-jsonfm-summary": "Produzir os dados de saída em formato JSON (realce sintático em HTML).", "apihelp-none-summary": "Não produzir nada.", "apihelp-php-summary": "Produzir os dados de saída em formato PHP seriado.", - "apihelp-php-param-formatversion": "Formatação do resultado de saída:\n;1:Formato compatível com versões anteriores (booleanos ao estilo XML, * chaves para nodos de conteúdo, etc.).\n;2:Formato moderno experimental. As especificações podem mudar!\n;latest:Usar o formato mais recente (atualmente 2), mas pode ser alterado sem aviso prévio.", + "apihelp-php-param-formatversion": "Formatação do resultado de saída:\n;1:Formato compatível com versões anteriores (boolianos ao estilo XML, * chaves para nodos de conteúdo, etc.).\n;2:Formato moderno experimental. As especificações podem mudar!\n;latest:Usar o formato mais recente (atualmente 2), mas pode ser alterado sem aviso prévio.", "apihelp-phpfm-summary": "Produzir os dados de saída em formato PHP seriado (realce sintático em HTML).", "apihelp-rawfm-summary": "Produzir os dados de saída, incluindo elementos para despiste de erros, em formato JSON (realce sintático em HTML).", "apihelp-xml-summary": "Produzir os dados de saída em formato XML.", @@ -1490,12 +1490,12 @@ "api-help-param-templated-var-first": "{$1} no nome do parâmetro deve ser substituído com os valores de $2", "api-help-param-templated-var": "{$1} com valores de $2", "api-help-datatypes-header": "Tipo de dados", - "api-help-datatypes": "O formato de entrada para o MediaWiki deve ser UTF-8, normalizado de acordo com a norma NFC. O MediaWiki pode converter outros tipos de entrada, mas esta conversão pode originar a falha de algumas operações (tais como as [[Special:ApiHelp/edit|edições]] com verificações MD5).\n\nAlguns tipos de parâmetros nos pedidos à 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 seu valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:As datas e horas podem ser especificadas em vários formatos. É recomendado o formato ISO 8601. Todas as horas estão em UTC, qualquer inclusão do fuso horário é ignorada.\n:* Data e hora ISO 8601, 2001-01-15T14:56:00Z (pontuação e Z são opcionais)\n:* Data e hora ISO 8601 com segundos fracionários (estes são ignorados), 2001-01-15T14:56:00.00001Z (traços, dois pontos e Z são opcionais)\n:* Formato do MediaWiki, 20010115145600\n:* Formato numérico genérico, 2001-01-15 14:56:00 (fuso horário opcional GMT, +##, ou -## são ignorados)\n:* Formato EXIF, 2001:01:15 14:56:00\n:*Formato RFC 2822 (o fuso horário pode ser omitido), Mon, 15 Jan 2001 14:56:00\n:* Formato RFC 850 (o fuso horário pode ser omitido), Monday, 15-Jan-2001 14:56:00\n:* Formato C ctime, Mon Jan 15 14:56:00 2001\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 algarismos (excluindo 0)\n:* O texto now\n;separador alternativo de valores múltiplos\n:Os parâmetros que aceitam vários valores são normalmente fornecidos com os valores separados por uma barra vertical (''pipe''), por exemplo parâmetro=valor1|valor2 ou parâmetro=valor1%7Cvalor2. Se um valor contém a barra vertical, use como separador o U+001F (Separador de Unidades) ''e'' prefixe o valor com U+001F, isto é, parâmetro=%1Fvalor1%1Fvalor2.", + "api-help-datatypes": "O formato de entrada para o MediaWiki deve ser UTF-8, normalizado de acordo com a norma NFC. O MediaWiki pode converter outros tipos de entrada, mas esta conversão pode originar a falha de algumas operações (tais como as [[Special:ApiHelp/edit|edições]] com verificações MD5).\n\nAlguns tipos de parâmetros nos pedidos à API necessitam de mais explicações:\n;boolean\n:Os parâmetros boolianos funcionam como as caixas de seleção HTML: se o parâmetro for especificado, independentemente do seu valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:As datas e horas podem ser especificadas em vários formatos. É recomendado o formato ISO 8601. Todas as horas estão em UTC, qualquer inclusão do fuso horário é ignorada.\n:* Data e hora ISO 8601, 2001-01-15T14:56:00Z (pontuação e Z são opcionais)\n:* Data e hora ISO 8601 com segundos fracionários (estes são ignorados), 2001-01-15T14:56:00.00001Z (traços, dois pontos e Z são opcionais)\n:* Formato do MediaWiki, 20010115145600\n:* Formato numérico genérico, 2001-01-15 14:56:00 (fuso horário opcional GMT, +##, ou -## são ignorados)\n:* Formato EXIF, 2001:01:15 14:56:00\n:*Formato RFC 2822 (o fuso horário pode ser omitido), Mon, 15 Jan 2001 14:56:00\n:* Formato RFC 850 (o fuso horário pode ser omitido), Monday, 15-Jan-2001 14:56:00\n:* Formato C ctime, Mon Jan 15 14:56:00 2001\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 algarismos (excluindo 0)\n:* O texto now\n;separador alternativo de valores múltiplos\n:Os parâmetros que aceitam vários valores são normalmente fornecidos com os valores separados por uma barra vertical (''pipe''), por exemplo parâmetro=valor1|valor2 ou parâmetro=valor1%7Cvalor2. Se um valor contém a barra vertical, use como separador o U+001F (Separador de Unidades) ''e'' prefixe o valor com U+001F, isto é, parâmetro=%1Fvalor1%1Fvalor2.", "api-help-templatedparams-header": "Parâmetros modelados", "api-help-templatedparams": "Os parâmetros modelados usam-se nos casos em que um módulo da API necessita de um valor para cada valor de um outro parâmetro. Por exemplo, se existisse um módulo da API para encomendar fruta, poderia ter um parâmetro frutas para especificar as frutas que estão a ser encomendadas e um parâmetro modelado quantidade-de-{fruta} para especificar quanto de cada fruta. Um cliente da API que pretenda 1 maçã, 5 bananas e 20 morangos pode então fazer um pedido como frutas=maçãs|bananas|morangos&quantidade-de-maçãs=1&quantidade-de-bananas=5&quantidade-de-morangos=20.", "api-help-param-type-limit": "Tipo: inteiro ou max", "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=inteiro|2=lista de números inteiros}}", - "api-help-param-type-boolean": "Tipo: booleano ([[Special:ApiHelp/main#main/datatypes|detalhes]])", + "api-help-param-type-boolean": "Tipo: booliano ([[Special:ApiHelp/main#main/datatypes|detalhes]])", "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=data e hora|2=lista de datas e horas}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])", "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 (separados com {{!}} ou [[Special:ApiHelp/main#main/datatypes|alternativas]])}}: $2", diff --git a/includes/api/i18n/ru.json b/includes/api/i18n/ru.json index bae094898e..d712765cb1 100644 --- a/includes/api/i18n/ru.json +++ b/includes/api/i18n/ru.json @@ -785,6 +785,7 @@ "apihelp-query+filearchive-example-simple": "Список всех удалённых файлов.", "apihelp-query+filerepoinfo-summary": "Возвращает мета-информацию о файловых репозиториях, настроенных в вики.", "apihelp-query+filerepoinfo-param-prop": "Какие свойства хранилища получить (доступность свойств может отличаться в разных вики).", + "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "Ссылка на API репозитория — полезно для получения информации об изображении с сервера.", "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Корневой URL для изображений.", "apihelp-query+filerepoinfo-paramvalue-prop-url": "URL путь публичной зоны.", "apihelp-query+filerepoinfo-example-simple": "Получить информацию о файловых репозиториях.", @@ -1076,7 +1077,7 @@ "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Распарсенное описание правки.", "apihelp-query+revisions+base-paramvalue-prop-content": "Текст версии.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Метки версии.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Устарело. Вместо этого используйте [[Special:ApiHelp/expandtemplates|action=expandtemplates]] или [[Special:ApiHelp/parse|action=parse]]. Дерево парсинга XML содержимого версии (требуется модель содержимого $1).", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Используйте [[Special:ApiHelp/expandtemplates|action=expandtemplates]] или [[Special:ApiHelp/parse|action=parse]]. Дерево парсинга XML-содержимого версии (требуется модель содержимого $1).", "apihelp-query+revisions+base-param-limit": "Сколько версий вернуть.", "apihelp-query+revisions+base-param-expandtemplates": "Вместо этого используйте [[Special:ApiHelp/expandtemplates|action=expandtemplates]]. Раскрыть шаблоны в содержимом версии (требуется $1prop=content).", "apihelp-query+revisions+base-param-generatexml": "Вместо этого используйте [[Special:ApiHelp/expandtemplates|action=expandtemplates]] или [[Special:ApiHelp/parse|action=parse]]. Сгенерировать дерево парсинга XML содержимого версии (требуется $1prop=content).", diff --git a/includes/api/i18n/zh-hant.json b/includes/api/i18n/zh-hant.json index 9f101b6a17..1cced41bdc 100644 --- a/includes/api/i18n/zh-hant.json +++ b/includes/api/i18n/zh-hant.json @@ -15,10 +15,11 @@ "A2093064", "Wwycheuk", "Wbxshiori", - "Sanmosa" + "Sanmosa", + "Kly" ] }, - "apihelp-main-extended-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|說明文件]]\n* [[mw:Special:MyLanguage/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
\n狀態資訊:本頁所展示的所有功能都應正常運作,但API仍在開發,會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵寄清單]以便獲得更新通知。\n\n錯誤的請求:當API收到錯誤的請求,會發出以「MediaWiki-API-Error」為鍵的HTTP標頭欄位,隨後標頭欄位的值,以及傳回的錯誤碼會設為相同值。詳細資訊請參閱[[mw:Special:MyLanguage/API:Errors_and_warnings|API: 錯誤與警告]]。\n\n測試:要簡化API請求的測試過程,請見[[Special:ApiSandbox]]。", + "apihelp-main-extended-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|說明文件]]\n* [[mw:Special:MyLanguage/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
\n狀態資訊:MediaWiki API 已是成熟、穩定,並積極支援以改善的介面。儘管我們儘可能避免,但仍偶有需要重大變更的情況,請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵寄清單]以便獲得更新通知。\n\n錯誤的請求:當 API 收到錯誤的請求,會發出以「MediaWiki-API-Error」為鍵的 HTTP 標頭欄位,隨後標頭欄位的值,以及傳回的錯誤碼會設為相同值。詳細資訊請參閱 [[mw:Special:MyLanguage/API:Errors_and_warnings|API: 錯誤與警告]]。\n\n

測試:要簡化 API 請求的測試過程,請見 [[Special:ApiSandbox]]。

", "apihelp-main-param-action": "要執行的動作。", "apihelp-main-param-format": "輸出的格式。", "apihelp-main-param-smaxage": "將HTTP緩存控制頭欄位設為s-maxage秒。錯誤不會做緩存。", @@ -58,6 +59,10 @@ "apihelp-compare-param-totitle": "要比對的第二個標題。", "apihelp-compare-param-toid": "要比對的第二個頁面 ID。", "apihelp-compare-param-torev": "要比對的第二個修訂。", + "apihelp-compare-param-tocontentformat": "totext 的內容序列化格式。", + "apihelp-compare-param-prop": "要取得的資訊部份。", + "apihelp-compare-paramvalue-prop-diff": "HTML 差異。", + "apihelp-compare-paramvalue-prop-diffsize": "以位元組為單位的 HTML 差異大小。", "apihelp-compare-example-1": "建立修訂 1 與 1 的差異檔", "apihelp-createaccount-summary": "建立新使用者帳號。", "apihelp-createaccount-param-name": "使用者名稱。", @@ -75,6 +80,7 @@ "apihelp-delete-param-title": "您欲刪除的頁面標題。 無法與 $1pageid 同時使用。", "apihelp-delete-param-pageid": "您欲刪除頁面的頁面 ID。 無法與 $1title 同時使用。", "apihelp-delete-param-reason": "刪除的原因。 若未設定,將會使用自動產生的原因。", + "apihelp-delete-param-tags": "在刪除日誌裡更改套用到項目的標籤。", "apihelp-delete-param-watch": "加入目前頁面至您的監視清單。", "apihelp-delete-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。", "apihelp-delete-param-unwatch": "從您的監視清單中移除目前頁面。", @@ -89,6 +95,7 @@ "apihelp-edit-param-sectiontitle": "新章節的標題。", "apihelp-edit-param-text": "頁面內容。", "apihelp-edit-param-summary": "編輯摘要。 當未設定 $1section=new 與 $1sectiontitle 時也會當做章節標題。", + "apihelp-edit-param-tags": "更改套用到修訂的標籤。", "apihelp-edit-param-minor": "小編輯。", "apihelp-edit-param-notminor": "非小編輯。", "apihelp-edit-param-bot": "標記此編輯為機器人編輯。", @@ -97,6 +104,9 @@ "apihelp-edit-param-nocreate": "若頁面不存在,則產生錯誤。", "apihelp-edit-param-watch": "加入目前頁面至您的監視清單。", "apihelp-edit-param-unwatch": "從您的監視清單中移除目前頁面。", + "apihelp-edit-param-redirect": "自動化解決重新導向。", + "apihelp-edit-param-contentformat": "用於輸入文字的內容序列化格式。", + "apihelp-edit-param-contentmodel": "新內容的內容模組。", "apihelp-edit-example-edit": "編輯頁面", "apihelp-emailuser-summary": "寄送電子郵件給使用者。", "apihelp-emailuser-param-target": "電子郵件的收件使用者。", @@ -109,6 +119,11 @@ "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。", "apihelp-feedcontributions-summary": "回傳使用者貢獻 Feed。", "apihelp-feedcontributions-param-feedformat": "Feed 的格式。", + "apihelp-feedcontributions-param-year": "起始年份(更早之前)。", + "apihelp-feedcontributions-param-month": "起始月份(更早之前)。", + "apihelp-feedcontributions-param-deletedonly": "僅顯示已刪除的貢獻。", + "apihelp-feedcontributions-param-toponly": "只顯示最新修訂的編輯。", + "apihelp-feedcontributions-param-newonly": "只顯示建立頁面的編輯。", "apihelp-feedcontributions-param-hideminor": "隱藏小修改。", "apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。", "apihelp-feedcontributions-example-simple": "返回使用者Example的貢獻。", @@ -122,15 +137,22 @@ "apihelp-feedrecentchanges-param-hideanons": "隱藏匿名使用者做的變更。", "apihelp-feedrecentchanges-param-hideliu": "隱藏已註冊使用者做的變更。", "apihelp-feedrecentchanges-param-hidepatrolled": "隱藏已巡查的變更。", + "apihelp-feedrecentchanges-param-hidemyself": "隱藏由目前使用者做出的更改。", + "apihelp-feedrecentchanges-param-hidecategorization": "隱藏分類成員更改。", + "apihelp-feedrecentchanges-param-tagfilter": "按標籤篩選。", "apihelp-feedrecentchanges-example-simple": "顯示近期變更。", "apihelp-feedrecentchanges-example-30days": "顯示近期30天內的變動", "apihelp-feedwatchlist-summary": "返回監視清單 feed。", "apihelp-feedwatchlist-param-feedformat": "Feed 的格式。", "apihelp-filerevert-param-comment": "上載意見。", + "apihelp-help-summary": "顯示指定模組的說明。", "apihelp-help-example-main": "主模組使用說明", "apihelp-help-example-recursive": "一個頁面中的所有說明。", "apihelp-help-example-help": "說明模組自身的說明。", + "apihelp-help-example-query": "兩個查詢子模組的說明。", "apihelp-imagerotate-summary": "旋轉一張或多張圖片。", + "apihelp-imagerotate-param-rotation": "順時針旋轉圖片的度數。", + "apihelp-import-summary": "從其它 wiki 或 XML 檔案來匯入頁面。", "apihelp-import-param-summary": "匯入摘要。", "apihelp-import-param-xml": "上載的 XML 檔。", "apihelp-import-param-interwikisource": "用於跨 wiki 匯入:匯入的來源 wiki。", @@ -146,6 +168,7 @@ "apihelp-login-example-login": "登入", "apihelp-logout-summary": "登出並清除 session 資料。", "apihelp-logout-example-logout": "登出當前使用者", + "apihelp-managetags-param-tags": "在標籤管理日誌裡更改套用到項目的標籤。", "apihelp-mergehistory-summary": "合併頁面歷史", "apihelp-mergehistory-param-reason": "合併歷史的原因。", "apihelp-mergehistory-example-merge": "將Oldpage的整個歷史合併至Newpage。", @@ -166,12 +189,22 @@ "apihelp-opensearch-summary": "使用 OpenSearch 協定搜尋本 wiki。", "apihelp-opensearch-param-search": "搜尋字串。", "apihelp-opensearch-param-limit": "回傳的結果數量上限。", - "apihelp-opensearch-param-namespace": "搜尋的命名空間。", + "apihelp-opensearch-param-namespace": "搜尋的命名空間。若 $1search 以有效的命名空間前綴為開頭則會被忽略。", "apihelp-opensearch-param-suggest": "若[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]設定為false,則不做任何事。", "apihelp-opensearch-param-redirects": "如何處理重定向:\n;return:傳回重定向本身。\n;resolve:傳回目標頁面,傳回的結果數目可能少於$1limit。\n由於歷史原因,$1format=json的預設值為「return」,其他格式則為「resolve」。", "apihelp-opensearch-param-format": "輸出的格式。", + "apihelp-options-summary": "更改目前使用者的偏好設定。", "apihelp-options-param-reset": "重設偏好設定為網站預設值。", "apihelp-options-example-reset": "重設所有偏好設定", + "apihelp-options-example-change": "更改skin和hideminor偏好設定。", + "apihelp-paraminfo-summary": "獲得有關 API 模組的資訊。", + "apihelp-paraminfo-param-helpformat": "說明字串的格式。", + "apihelp-parse-param-summary": "解析摘要。", + "apihelp-parse-param-pageid": "解析此頁面的內容。覆蓋 $1page。", + "apihelp-parse-param-prop": "要取得的資訊部份:", + "apihelp-parse-paramvalue-prop-headhtml": "取得頁面已解析的 <head>。", + "apihelp-parse-param-disablepp": "請改用$1disablelimitreport。", + "apihelp-parse-param-preview": "在預覽模式下解析。", "apihelp-parse-example-page": "解析頁面。", "apihelp-parse-example-text": "解析 wikitext。", "apihelp-parse-example-texttitle": "解析 wikitext,指定頁面標題。", @@ -193,75 +226,302 @@ "apihelp-protect-param-watchlist": "無條件地將該頁面加入至或移除自目前使用者的監視列表、使用偏好設定或不更改監視。", "apihelp-protect-example-protect": "保護一個頁面。", "apihelp-purge-summary": "為指定標題清除快取。", + "apihelp-purge-param-forcelinkupdate": "更新連結表格。", "apihelp-purge-example-generator": "重新整理主要命名空間的前10個頁面。", "apihelp-query-summary": "擷取來自及有關MediaWiki的數據。", + "apihelp-query-param-list": "要取得的清單。", + "apihelp-query-param-meta": "要取得的詮釋資料。", + "apihelp-query+allcategories-summary": "列舉所有分類。", + "apihelp-query+allcategories-param-from": "起始列舉的分類。", + "apihelp-query+allcategories-param-to": "終止列舉的分類。", + "apihelp-query+allcategories-param-prefix": "搜尋以此值為開頭的所有分類標題。", + "apihelp-query+allcategories-param-dir": "排序的方向。", + "apihelp-query+allcategories-param-min": "僅回傳至少有這樣多成員的分類。", + "apihelp-query+allcategories-param-max": "僅回傳最多有這樣多成員的分類。", "apihelp-query+allcategories-param-limit": "要回傳的分類數量。", + "apihelp-query+allcategories-param-prop": "要取得的屬性。", + "apihelp-query+allcategories-paramvalue-prop-size": "在分類裡添加頁面數。", + "apihelp-query+alldeletedrevisions-summary": "依使用者或所在命名空間來列出所有已刪除的修訂。", + "apihelp-query+alldeletedrevisions-paraminfo-useronly": "僅與 $3user 一同使用。", + "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能與 $3user 一同使用。", + "apihelp-query+alldeletedrevisions-param-start": "起始列舉的時間戳記。", + "apihelp-query+alldeletedrevisions-param-end": "終止列舉的時間戳記。", + "apihelp-query+alldeletedrevisions-param-from": "在此標題開始列出。", + "apihelp-query+alldeletedrevisions-param-to": "在此標題停止列出。", + "apihelp-query+alldeletedrevisions-param-prefix": "搜尋以此值為開頭的所有頁面標題。", + "apihelp-query+alldeletedrevisions-param-user": "此列出由該使用者作出的修訂。", + "apihelp-query+alldeletedrevisions-param-excludeuser": "不要列出由該使用者作出的修訂。", + "apihelp-query+alldeletedrevisions-param-namespace": "僅列出此命名空間的頁面。", + "apihelp-query+allfileusages-paramvalue-prop-title": "添加檔案標題。", "apihelp-query+allfileusages-param-limit": "要回傳的項目總數。", + "apihelp-query+allfileusages-param-dir": "列出時所採用的方向。", + "apihelp-query+allfileusages-example-unique": "列出唯一的檔案標題。", + "apihelp-query+allfileusages-example-unique-generator": "取得所有檔案標題,標記為遺失。", + "apihelp-query+allfileusages-example-generator": "取得包含檔案的頁面。", + "apihelp-query+allimages-param-sort": "作為排序順序的屬性。", + "apihelp-query+allimages-param-dir": "列出時所採用的方向。", + "apihelp-query+allimages-param-minsize": "限制圖片至少要有這樣多的位元組。", + "apihelp-query+allimages-param-maxsize": "限制圖片最多只能這樣多的位元組。", + "apihelp-query+allimages-param-mime": "所要搜尋的 MIME 類型,例如:image/jpeg。", "apihelp-query+allimages-param-limit": "要回傳的圖片總數。", + "apihelp-query+alllinks-paramvalue-prop-title": "添加連結標題。", + "apihelp-query+alllinks-param-namespace": "要列舉的命名空間。", "apihelp-query+alllinks-param-limit": "要回傳的項目總數。", + "apihelp-query+alllinks-param-dir": "列出時所採用的方向。", "apihelp-query+allmessages-summary": "返回來自該網站的訊息。", + "apihelp-query+allmessages-param-prop": "要取得的屬性。", + "apihelp-query+allmessages-param-lang": "以此語言來回傳訊息。", + "apihelp-query+allmessages-param-from": "以此訊息來回傳訊息開頭。", + "apihelp-query+allmessages-param-to": "以此訊息來回傳訊息結尾。", + "apihelp-query+allpages-param-from": "起始列舉的頁面標題。", + "apihelp-query+allpages-param-to": "終止列舉的頁面標題。", + "apihelp-query+allpages-param-prefix": "搜尋以此值為開頭的所有頁面標題。", + "apihelp-query+allpages-param-namespace": "要列舉的命名空間。", + "apihelp-query+allpages-param-filterredir": "要列出的頁面。", + "apihelp-query+allpages-param-minsize": "限制頁面至少要有這樣多的位元組。", + "apihelp-query+allpages-param-maxsize": "限制頁面最多只能這樣多的位元組。", + "apihelp-query+allpages-param-prtype": "僅限受保護的頁面。", "apihelp-query+allpages-param-limit": "要回傳的頁面總數。", + "apihelp-query+allpages-param-dir": "列出時所採用的方向。", + "apihelp-query+allredirects-summary": "列出至命名空間的所有重新導向。", + "apihelp-query+allredirects-param-from": "要起始列舉的重新導向標題。", + "apihelp-query+allredirects-param-to": "要終止列舉的重新導向標題。", + "apihelp-query+allredirects-param-prefix": "搜尋以此值為開頭的所有目標頁面。", + "apihelp-query+allredirects-param-prop": "要包含的資訊部份:", + "apihelp-query+allredirects-paramvalue-prop-title": "添加重新導向的標題。", + "apihelp-query+allredirects-param-namespace": "要列舉的命名空間。", "apihelp-query+allredirects-param-limit": "要回傳的項目總數。", + "apihelp-query+allredirects-param-dir": "列出時所採用的方向。", + "apihelp-query+allredirects-example-generator": "取得包含重新導向的頁面。", "apihelp-query+allrevisions-summary": "列出所有修訂版本。", + "apihelp-query+allrevisions-param-start": "起始列舉的時間戳記。", + "apihelp-query+allrevisions-param-end": "終止列舉的時間戳記。", + "apihelp-query+allrevisions-param-user": "此列出由該使用者作出的修訂。", + "apihelp-query+allrevisions-param-excludeuser": "不要列出由該使用者作出的修訂。", + "apihelp-query+allrevisions-param-namespace": "僅列出此命名空間的頁面。", + "apihelp-query+mystashedfiles-param-prop": "要索取的檔案屬性。", + "apihelp-query+mystashedfiles-paramvalue-prop-size": "索取檔案大小與圖片尺寸。", + "apihelp-query+mystashedfiles-paramvalue-prop-type": "索取檔案的 MIME 類型以及媒體類型。", + "apihelp-query+mystashedfiles-param-limit": "要取得的檔案數量。", + "apihelp-query+alltransclusions-param-namespace": "要列舉的命名空間。", "apihelp-query+alltransclusions-param-limit": "要回傳的項目總數。", + "apihelp-query+alltransclusions-param-dir": "列出時所採用的方向。", + "apihelp-query+allusers-summary": "列舉所有已註冊使用者。", "apihelp-query+allusers-param-from": "起始列舉的使用者名稱。", + "apihelp-query+allusers-param-to": "終止列舉的使用者名稱。", + "apihelp-query+allusers-param-prefix": "搜尋以此值為開頭的所有使用者。", + "apihelp-query+allusers-param-dir": "排序的方向。", + "apihelp-query+allusers-param-group": "僅包含在指定群組的使用者。", + "apihelp-query+allusers-param-excludegroup": "排除指定群組中的使用者", + "apihelp-query+allusers-param-prop": "要包含的資訊部份:", + "apihelp-query+allusers-paramvalue-prop-rights": "列出使用者所擁有的權限。", + "apihelp-query+allusers-paramvalue-prop-editcount": "添加使用者的編輯次數。", "apihelp-query+allusers-example-Y": "列出以Y開頭的使用者。", "apihelp-query+authmanagerinfo-summary": "取得目前身分核對狀態的資訊。", + "apihelp-query+backlinks-summary": "找出連結至指定頁面的所有頁面。", + "apihelp-query+backlinks-param-namespace": "要列舉的命名空間。", + "apihelp-query+backlinks-param-dir": "列出時所採用的方向。", + "apihelp-query+blocks-summary": "列出所有被封鎖使用者與 IP 位址。", + "apihelp-query+blocks-param-start": "起始列舉的時間戳記。", + "apihelp-query+blocks-param-end": "終止列舉的時間戳記。", + "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": "添加進行封鎖中的使用者之使用者名稱。", + "apihelp-query+blocks-paramvalue-prop-byid": "添加進行封鎖中的使用者之使用者 ID。", + "apihelp-query+blocks-example-simple": "列出封鎖。", + "apihelp-query+blocks-example-users": "列出使用者 Alice 與 Bob 的封鎖。", "apihelp-query+categories-param-limit": "要回傳的分類數量。", "apihelp-query+categoryinfo-summary": "回傳有關指定分類的資訊。", "apihelp-query+categorymembers-summary": "在指定的分類中列出所有頁面。", + "apihelp-query+categorymembers-paramvalue-prop-ids": "添加頁面 ID。", "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。", + "apihelp-query+categorymembers-param-startsortkey": "請改用 $1starthexsortkey。", + "apihelp-query+categorymembers-param-endsortkey": "請改用 $1endhexsortkey。", + "apihelp-query+categorymembers-example-simple": "取得在 Category:Physics 裡前 10 項的頁面。", "apihelp-query+contributors-param-limit": "要回傳的貢獻人員數量。", + "apihelp-query+deletedrevisions-summary": "取得已刪除修訂的資訊。", + "apihelp-query+deletedrevisions-param-user": "此列出由該使用者作出的修訂。", + "apihelp-query+deletedrevisions-param-excludeuser": "不要列出由該使用者作出的修訂。", + "apihelp-query+deletedrevs-summary": "列出已刪除的修訂。", + "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式|模式}}:$2", + "apihelp-query+deletedrevs-param-start": "起始列舉的時間戳記。", + "apihelp-query+deletedrevs-param-end": "終止列舉的時間戳記。", + "apihelp-query+deletedrevs-param-from": "在此標題開始列出。", + "apihelp-query+deletedrevs-param-to": "在此標題停止列出。", + "apihelp-query+deletedrevs-param-user": "此列出由該使用者作出的修訂。", + "apihelp-query+deletedrevs-param-excludeuser": "不要列出由該使用者作出的修訂。", + "apihelp-query+deletedrevs-param-namespace": "僅列出此命名空間的頁面。", + "apihelp-query+disabled-summary": "已停用此查詢模組。", "apihelp-query+duplicatefiles-param-limit": "要回傳的重複檔案數量。", + "apihelp-query+duplicatefiles-param-dir": "列出時所採用的方向。", + "apihelp-query+duplicatefiles-example-generated": "查看全部有重複到的檔案。", + "apihelp-query+embeddedin-param-namespace": "要列舉的命名空間。", + "apihelp-query+embeddedin-param-dir": "列出時所採用的方向。", "apihelp-query+embeddedin-param-filterredir": "如何過濾重新導向。", "apihelp-query+embeddedin-param-limit": "要回傳的頁面總數。", "apihelp-query+extlinks-summary": "回傳所有指定頁面的外部 URL (非 interwiki)。", "apihelp-query+extlinks-param-limit": "要回傳的連結數量。", + "apihelp-query+exturlusage-paramvalue-prop-ids": "添加頁面 ID。", + "apihelp-query+exturlusage-paramvalue-prop-url": "添加用於頁面的 URL。", + "apihelp-query+exturlusage-param-namespace": "要列舉的頁面命名空間。", "apihelp-query+exturlusage-param-limit": "要回傳的頁面數量。", "apihelp-query+filearchive-param-limit": "要回傳的圖片總數。", + "apihelp-query+filearchive-param-dir": "列出時所採用的方向。", + "apihelp-query+filearchive-param-sha1": "圖片的 SHA1 雜湊值。覆蓋 $1sha1base36。", + "apihelp-query+filearchive-param-prop": "要取得的圖片資訊:", + "apihelp-query+filearchive-paramvalue-prop-sha1": "替圖片添加 SHA-1 雜湊值。", + "apihelp-query+filearchive-paramvalue-prop-mime": "添加圖片的 MIME。", + "apihelp-query+filearchive-paramvalue-prop-mediatype": "添加圖片的媒體類型。", + "apihelp-query+fileusage-param-prop": "要取得的屬性。", + "apihelp-query+fileusage-paramvalue-prop-pageid": "各頁面的頁面 ID。", + "apihelp-query+fileusage-paramvalue-prop-title": "各頁面的標題。", + "apihelp-query+fileusage-paramvalue-prop-redirect": "若頁面為重新導向,則做出標記。", + "apihelp-query+fileusage-param-namespace": "僅包含這些命名空間的頁面。", "apihelp-query+fileusage-param-limit": "要回傳的數量。", "apihelp-query+imageinfo-summary": "回傳檔案資訊與上傳日誌。", + "apihelp-query+imageinfo-param-prop": "要取得的檔案資訊:", + "apihelp-query+imageinfo-paramvalue-prop-sha1": "替檔案添加 SHA-1 雜湊值。", + "apihelp-query+imageinfo-paramvalue-prop-mime": "替檔案添加 MIME 類型。", + "apihelp-query+imageinfo-paramvalue-prop-mediatype": "添加檔案的媒體類型。", "apihelp-query+imageinfo-param-limit": "每個檔案要回傳的檔案修訂數量。", "apihelp-query+images-summary": "回傳指定頁面中包含的所有檔案。", "apihelp-query+images-param-limit": "要回傳的檔案數量。", + "apihelp-query+images-param-dir": "列出時所採用的方向。", + "apihelp-query+images-example-simple": "取得使用在 [[Main Page]] 的檔案清單。", + "apihelp-query+imageusage-param-namespace": "要列舉的命名空間。", + "apihelp-query+imageusage-param-dir": "列出時所採用的方向。", "apihelp-query+info-summary": "取得基本頁面訊息。", + "apihelp-query+info-param-prop": "要取得的額外屬性:", + "apihelp-query+info-paramvalue-prop-readable": "使用者是否可閱讀此頁面。", + "apihelp-query+iwbacklinks-param-prop": "要取得的屬性。", "apihelp-query+iwlinks-summary": "回傳指定頁面的所有 interwiki 連結。", + "apihelp-query+iwlinks-paramvalue-prop-url": "添加完整的 URL。", "apihelp-query+iwlinks-param-limit": "要回傳的跨 Wiki 連結數量。", "apihelp-query+langbacklinks-param-limit": "要回傳的頁面總數。", + "apihelp-query+langbacklinks-param-prop": "要取得的屬性。", "apihelp-query+langlinks-summary": "回傳指定頁面的所有跨語言連結。", "apihelp-query+langlinks-param-limit": "要回傳的 langlinks 數量。", + "apihelp-query+langlinks-paramvalue-prop-url": "添加完整的 URL。", + "apihelp-query+langlinks-param-dir": "列出時所採用的方向。", + "apihelp-query+langlinks-param-inlanguagecode": "用於本地化語言名稱的語言代碼。", "apihelp-query+links-summary": "回傳指定頁面的所有連結。", "apihelp-query+links-param-limit": "要回傳的連結數量。", + "apihelp-query+linkshere-param-prop": "要取得的屬性。", + "apihelp-query+linkshere-paramvalue-prop-title": "各頁面的標題。", + "apihelp-query+linkshere-paramvalue-prop-redirect": "若頁面為重新導向,則做出標記。", "apihelp-query+linkshere-param-limit": "要回傳的數量。", "apihelp-query+logevents-summary": "從日誌中獲取事件。", + "apihelp-query+logevents-param-prop": "要取得的屬性。", + "apihelp-query+logevents-param-start": "起始列舉的時間戳記。", + "apihelp-query+logevents-param-end": "結束列舉的時間戳記。", "apihelp-query+logevents-param-limit": "要回傳的事件項目總數。", "apihelp-query+pagepropnames-param-limit": "回傳的名稱數量上限。", + "apihelp-query+pageswithprop-paramvalue-prop-ids": "添加頁面 ID。", "apihelp-query+pageswithprop-param-limit": "回傳的頁面數量上限。", + "apihelp-query+prefixsearch-param-search": "搜尋字串。", + "apihelp-query+prefixsearch-param-namespace": "搜尋的命名空間。若 $1search 以有效的命名空間前綴為開頭則會被忽略。", "apihelp-query+prefixsearch-param-limit": "回傳的結果數量上限。", + "apihelp-query+prefixsearch-param-offset": "要略過的結果數量。", "apihelp-query+protectedtitles-param-limit": "要回傳的頁面總數。", + "apihelp-query+protectedtitles-param-prop": "要取得的屬性。", + "apihelp-query+protectedtitles-example-simple": "列出已保護的標題。", "apihelp-query+querypage-param-limit": "回傳的結果數量。", + "apihelp-query+random-summary": "取得隨機頁面集合", + "apihelp-query+random-param-namespace": "僅回傳在這些命名空間的頁面。", + "apihelp-query+random-param-redirect": "請改用 $1filterredir=redirects。", + "apihelp-query+random-param-filterredir": "如何過濾重新導向。", "apihelp-query+recentchanges-summary": "列舉出最近變更。", + "apihelp-query+recentchanges-param-start": "起始列舉的時間戳記。", + "apihelp-query+recentchanges-param-end": "結束列舉的時間戳記。", + "apihelp-query+recentchanges-param-user": "此列出由該使用者作出的更改。", + "apihelp-query+recentchanges-param-excludeuser": "不要列出由該使用者作出的更改。", + "apihelp-query+recentchanges-paramvalue-prop-flags": "添加編輯的標籤。", + "apihelp-query+recentchanges-paramvalue-prop-timestamp": "添加編輯的時間戳記。", + "apihelp-query+recentchanges-paramvalue-prop-title": "添加編輯的頁面標題。", + "apihelp-query+recentchanges-paramvalue-prop-tags": "列出項目的標籤。", "apihelp-query+recentchanges-param-limit": "要回傳變更總數。", + "apihelp-query+recentchanges-param-type": "更改的顯示類型。", "apihelp-query+recentchanges-example-simple": "最近變更清單", "apihelp-query+redirects-summary": "回傳連結至指定頁面的所有重新導向。", + "apihelp-query+redirects-param-prop": "要取得的屬性。", + "apihelp-query+redirects-paramvalue-prop-pageid": "各重新導向的頁面 ID。", + "apihelp-query+redirects-paramvalue-prop-title": "各重新導向的標題。", "apihelp-query+redirects-param-limit": "要回傳的重新導向數量。", + "apihelp-query+revisions-summary": "取得修訂的資訊。", + "apihelp-query+revisions-example-content": "取得用於標題 API 與 Main Page 最新修訂內容的資料。", + "apihelp-query+revisions-example-last5": "取得 Main Page 的最近 5 筆修訂。", + "apihelp-query+revisions-example-first5": "取得 Main Page 的最早前 5 筆修訂。", + "apihelp-query+revisions-example-first5-after": "取得 Main Page 自 2006-05-01 後做的前 5 筆修訂。", + "apihelp-query+revisions-example-first5-not-localhost": "取得 Main Page 裡並非由匿名使用者 127.0.0.1 所做出的最早前 5 筆修訂。", + "apihelp-query+revisions-example-first5-user": "取得 Main Page 裡由使用者 MediaWiki default 所做出的最早前 5 筆修訂。", + "apihelp-query+revisions+base-paramvalue-prop-ids": "修訂 ID。", + "apihelp-query+revisions+base-paramvalue-prop-tags": "修訂標籤。", + "apihelp-query+search-summary": "執行全文搜尋。", + "apihelp-query+search-param-what": "要執行的搜尋類型。", + "apihelp-query+search-param-info": "要回傳的詮釋資料。", + "apihelp-query+search-param-prop": "要回傳的屬性:", + "apihelp-query+search-paramvalue-prop-size": "添加以位元組為單位的頁面大小。", + "apihelp-query+search-paramvalue-prop-wordcount": "添加頁面的字數。", + "apihelp-query+search-paramvalue-prop-timestamp": "添加頁面自上一次編輯的時間戳記。", "apihelp-query+search-paramvalue-prop-score": "已忽略", "apihelp-query+search-paramvalue-prop-hasrelated": "已忽略", "apihelp-query+search-param-limit": "要回傳的頁面總數。", + "apihelp-query+siteinfo-paramvalue-prop-general": "全面系統資訊。", + "apihelp-query+siteinfo-param-numberingroup": "列出在使用者群組裡的使用者數目。", + "apihelp-query+siteinfo-example-simple": "索取站台資訊。", + "apihelp-query+siteinfo-example-interwiki": "索取本地端跨 wiki 前綴的清單。", "apihelp-query+stashimageinfo-summary": "回傳多筆儲藏檔案的檔案資訊。", "apihelp-query+stashimageinfo-example-simple": "回傳儲藏檔案的檔案資訊。", "apihelp-query+tags-summary": "列出變更標記。", + "apihelp-query+tags-param-prop": "要取得的屬性。", + "apihelp-query+tags-paramvalue-prop-name": "添加標籤名稱。", + "apihelp-query+tags-paramvalue-prop-displayname": "添加標籤的系統訊息。", + "apihelp-query+tags-paramvalue-prop-description": "添加標籤的描述。", + "apihelp-query+tags-example-simple": "列出可用標籤。", "apihelp-query+templates-summary": "回傳指定頁面中所有引用的頁面。", "apihelp-query+templates-param-limit": "要回傳的模板數量。", + "apihelp-query+templates-param-dir": "列出時所採用的方向。", "apihelp-query+tokens-param-type": "要求的權杖類型。", "apihelp-query+tokens-example-simple": "接收 csrf 密鑰 (預設)。", "apihelp-query+tokens-example-types": "接收監視密鑰以及巡邏密鑰。", + "apihelp-query+transcludedin-param-prop": "要取得的屬性。", + "apihelp-query+transcludedin-paramvalue-prop-pageid": "各頁面的頁面 ID。", + "apihelp-query+transcludedin-paramvalue-prop-title": "各頁面的標題。", + "apihelp-query+transcludedin-paramvalue-prop-redirect": "若頁面為重新導向,則做出標記。", "apihelp-query+transcludedin-param-limit": "回傳的數量。", + "apihelp-query+usercontribs-summary": "按使用者來取得所有編輯。", "apihelp-query+usercontribs-param-limit": "回傳的貢獻數量上限。", + "apihelp-query+usercontribs-paramvalue-prop-ids": "添加頁面 ID 與修訂 ID。", + "apihelp-query+usercontribs-paramvalue-prop-title": "添加標題與頁面的命名空間 ID。", + "apihelp-query+usercontribs-paramvalue-prop-timestamp": "添加編輯的時間戳記。", + "apihelp-query+usercontribs-paramvalue-prop-comment": "添加編輯的註釋。", + "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "添加編輯的已解析註解。", + "apihelp-query+usercontribs-paramvalue-prop-size": "添加編輯的新大小。", + "apihelp-query+userinfo-paramvalue-prop-realname": "添加使用者的真實姓名。", + "apihelp-query+userinfo-paramvalue-prop-email": "添加使用者的電子郵件地址與電子郵件驗證日期。", + "apihelp-query+userinfo-paramvalue-prop-registrationdate": "添加使用者的註冊日期。", + "apihelp-query+userinfo-example-simple": "取得目前使用者的資訊。", + "apihelp-query+userinfo-example-data": "取得目前使用者的額外資訊。", + "apihelp-query+users-summary": "取得有關使用者清單的資訊。", + "apihelp-query+users-param-prop": "要包含的資訊部份:", + "apihelp-query+watchlist-param-start": "起始列舉的時間戳記。", + "apihelp-query+watchlist-param-end": "結束列舉的時間戳記。", "apihelp-query+watchlist-param-limit": "每個請求要回傳的結果總數。", + "apihelp-query+watchlist-paramvalue-prop-title": "添加頁面標題。", + "apihelp-query+watchlist-paramvalue-prop-flags": "添加編輯的標籤。", + "apihelp-query+watchlist-paramvalue-prop-tags": "列出項目的標籤。", + "apihelp-query+watchlist-paramvalue-type-new": "頁面建立。", + "apihelp-query+watchlist-paramvalue-type-log": "日誌項目。", + "apihelp-query+watchlist-paramvalue-type-categorize": "分類成員更改。", "apihelp-query+watchlistraw-param-limit": "每個請求要回傳的結果總數。", + "apihelp-query+watchlistraw-param-dir": "列出時所採用的方向。", "apihelp-removeauthenticationdata-summary": "為目前使用者移除身分核對資料。", "apihelp-revisiondelete-summary": "刪除和取消刪除修訂。", + "apihelp-rollback-summary": "撤修頁面的最後一次編輯。", + "apihelp-setpagelanguage-summary": "更改頁面的語言。", + "apihelp-setpagelanguage-param-reason": "變更的原因。", "apihelp-stashedit-param-title": "正在編輯此頁面的標題。", "apihelp-stashedit-param-text": "頁面內容。", "apihelp-tokens-summary": "取得資料修改動作的密鑰。", @@ -269,13 +529,22 @@ "apihelp-unblock-summary": "解除封鎖一位使用者。", "apihelp-unblock-param-reason": "解除封鎖的原因。", "apihelp-unblock-example-id": "解除封銷 ID #105。", + "apihelp-undelete-param-title": "要恢復的頁面標題。", "apihelp-undelete-param-reason": "還原的原因。", + "apihelp-upload-param-filename": "目標檔案名稱。", + "apihelp-upload-param-comment": "上傳註釋。如果 $1text 未指定的話,也會作為新檔案用的初始頁面文字。", + "apihelp-upload-param-watch": "監視頁面。", + "apihelp-upload-param-ignorewarnings": "忽略所有警告。", + "apihelp-upload-param-file": "檔案內容。", + "apihelp-upload-example-url": "從 URL 上傳。", "apihelp-userrights-summary": "變更一位使用者的群組成員。", "apihelp-userrights-param-user": "使用者名稱。", "apihelp-userrights-param-userid": "使用者ID。", "apihelp-userrights-param-add": "加入使用者至這些群組;若已是成員,則更新失效時間。", "apihelp-userrights-param-remove": "從這些群組移除使用者。", "apihelp-userrights-param-reason": "變更的原因。", + "apihelp-validatepassword-param-password": "要驗證的密碼。", + "apihelp-watch-example-watch": "監視頁面 Main Page。", "apihelp-format-example-generic": "以 $1 格式傳回查詢結果。", "apihelp-json-summary": "使用 JSON 格式輸出資料。", "apihelp-jsonfm-summary": "使用 JSON 格式輸出資料 (使用 HTML 格式顯示)。", @@ -302,6 +571,8 @@ "api-help-flag-writerights": "此模組需要寫入權限。", "api-help-flag-mustbeposted": "此模組僅接受 POST 請求。", "api-help-flag-generator": "此模組可作為產生器使用。", + "api-help-source": "來源:$1", + "api-help-source-unknown": "來源:未知", "api-help-license": "協定:[[$1|$2]]", "api-help-license-noname": "協定:[[$1|查看連結]]", "api-help-license-unknown": "協定:未知", @@ -310,6 +581,7 @@ "api-help-param-required": "此參數為必填。", "api-help-datatypes-header": "資料類型", "api-help-datatypes": "至MediaWiki的輸入值應為NFC標準化的UTF-8。MediaWiki可以嘗試轉換其他輸入值,但這可能導致一些操作失敗(例如附帶MD5檢查的[[Special:ApiHelp/edit|編輯]])。\n\n一些在API請求中的參數類型需要更進一步解釋:\n;boolean\n:布林參數產生作用就像HTML複選框一樣:如果參數被指定,無論何值都被視為真(true)。如果要假值(false),則必須省略參數。\n;timestamp\n:時間戳記可被指定為多種格式。推荐使用ISO 8601日期和時間標準。所有時間為UTC時間,包含的任何時區都會被忽略。\n:* ISO 8601日期和時間,2001-01-15T14:56:00Z(標點和Z為選用)\n:* 帶小數秒(會被忽略)的ISO 8601日期和時間,2001-01-15T14:56:00.00001Z(破折號、冒號和Z為選用)\n:* MediaWiki格式,20010115145600\n:* 一般數字格式,2001-01-15 14:56:00(GMT、+##或-##的選用時區會被忽略)\n:* EXIF格式,2001:01:15 14:56:00\n:* RFC 2822格式(時區可省略),Mon, 15 Jan 2001 14:56:00\n:* RFC 850格式(時區可省略),Monday, 15-Jan-2001 14:56:00\n:* C ctime格式,Mon Jan 15 14:56:00 2001\n:* 從1970-01-01T00:00:00Z開始的秒數,作為1到13位數的整數(除了0)\n:* 字串now\n;替代多值分隔符號\n:使用多個值的參數通常會與垂直線符號(|)分隔的值一起提交,例如param=value1|value2或param=value1%7Cvalue2。如果值必須包含垂直線符號,使用U+001F(單位分隔符號)作為分隔符號,''並且''在值前加前綴U+001F,例如param=%1Fvalue1%1Fvalue2。", + "api-help-templatedparams-header": "模板參數", "api-help-param-type-limit": "類型:整數或max", "api-help-param-type-integer": "類型:{{PLURAL:$1|1=整數|2=整數列表}}", "api-help-param-type-boolean": "類型:布林值([[Special:ApiHelp/main#main/datatypes|詳細資訊]])", @@ -348,12 +620,49 @@ "api-help-authmanagerhelper-returnurl": "為第三方身份驗證流程傳回URL,必須為絕對值。需要此值或$1continue兩者之一。\n\n在接收REDIRECT回應時,一般狀況下您將打開瀏覽器或網站瀏覽功能到特定的redirecttarget URL以進行第三方身份驗證流程。當它完成時,第三方會將瀏覽器或網站瀏覽功能送至此URL。您應當提取任何來自URL的查詢或POST參數,並將之作為$1continue請求傳遞至此API模組。", "api-help-authmanagerhelper-continue": "此請求是在先前的UI或REDIRECT回應之後的後續動作。必須為此值或$1returnurl。", "api-help-authmanagerhelper-additional-params": "此模組允許額外參數,取決於可用的身份驗證請求。使用[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]与amirequestsfor=$1(或之前來自此模組的回應,如果合適)以決定可用請求及其使用的欄位。", + "apierror-badip": "IP 參數無效。", + "apierror-badmd5": "提供的 MD5 雜湊不正確。", + "apierror-badquery": "無效的查詢。", + "apierror-copyuploadbadurl": "不允許從此 URL 來上傳。", + "apierror-filedoesnotexist": "檔案不存在。", + "apierror-filenopath": "無法取得本地端檔案路徑。", + "apierror-filetypecannotberotated": "無法旋轉的檔案類型。", + "apierror-imageusage-badtitle": "$1的標題必須是檔案。", + "apierror-import-unknownerror": "未知的匯入錯誤:$1", + "apierror-invalidsha1hash": "所提供的 SHA1 雜湊無效。", + "apierror-invaliduser": "無效的使用者名稱「$1」。", + "apierror-invaliduserid": "使用者 ID $1 無效。", "apierror-missingparam": "$1參數必須被設定。", + "apierror-missingtitle": "您所指定的頁面不存在。", "apierror-mustbeloggedin-changeauth": "必須登入,才能變更身分核對資取。", + "apierror-mustbeloggedin-generic": "您必須登入。", + "apierror-mustbeloggedin-linkaccounts": "您必須登入到連結帳號。", "apierror-mustbeloggedin-removeauth": "必須登入,才能移除身分核對資取。", + "apierror-nodeleteablefile": "沒有這樣檔案的舊版本。", + "apierror-noedit-anon": "匿名使用者不可編輯頁面。", + "apierror-noedit": "您沒有權限來編輯頁面。", + "apierror-nouploadmodule": "未設定上傳模組。", + "apierror-pagecannotexist": "命名空間不允許實際頁面。", "apierror-permissiondenied": "您沒有權限$1。", + "apierror-permissiondenied-generic": "權限不足。", + "apierror-permissiondenied-unblock": "您沒有權限來解封使用者。", + "apierror-readapidenied": "您需要有閱讀權限來使用此模組。", + "apierror-readonly": "Wiki 目前為唯讀模式。", "apierror-reauthenticate": "於本工作階段還未核對身分,請重新核對。", + "apierror-searchdisabled": "$1搜尋已停用。", + "apierror-stashwrongowner": "錯誤擁有者:$1", "apierror-timeout": "伺服器未有在預計的時間內回應。", + "apierror-unknownerror-editpage": "不明編輯頁面錯誤:$1。", + "apierror-unknownerror-nocode": "不明錯誤。", + "apierror-unknownerror": "不明錯誤:\"$1\"。", + "apierror-unknownformat": "無法識別的格式\"$1\"。", + "apierror-upload-missingresult": "狀態資料裡沒有結果。", + "apiwarn-deprecation-httpsexpected": "當應為 HTTPS 時,HTTP 要被使用。", + "apiwarn-invalidcategory": "「$1」不是一個分類。", + "apiwarn-invalidtitle": "「$1」不是一個有效標題。", + "apiwarn-notfile": "「$1」不是一個檔案。", + "apiwarn-validationfailed-badpref": "不是有效的偏好設定。", + "apiwarn-validationfailed-cannotset": "不能透過此模組設定。", "api-feed-error-title": "錯誤($1)", "api-credits-header": "製作群", "api-credits": "API 開發人員:\n* Roan Kattouw (首席開發者 Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (創立者,首席開發者 Sep 2006–Sep 2007)\n* Brad Jorsch (首席開發者 2013–present)\n\n請傳送您的評論、建議以及問題至 mediawiki-api@lists.wikimedia.org\n或者回報問題至 https://phabricator.wikimedia.org/。" diff --git a/includes/auth/AbstractPasswordPrimaryAuthenticationProvider.php b/includes/auth/AbstractPasswordPrimaryAuthenticationProvider.php index 3d26767a0e..4096f1971a 100644 --- a/includes/auth/AbstractPasswordPrimaryAuthenticationProvider.php +++ b/includes/auth/AbstractPasswordPrimaryAuthenticationProvider.php @@ -53,8 +53,10 @@ abstract class AbstractPasswordPrimaryAuthenticationProvider */ protected function getPasswordFactory() { if ( $this->passwordFactory === null ) { - $this->passwordFactory = new PasswordFactory(); - $this->passwordFactory->init( $this->config ); + $this->passwordFactory = new PasswordFactory( + $this->config->get( 'PasswordConfig' ), + $this->config->get( 'PasswordDefault' ) + ); } return $this->passwordFactory; } diff --git a/includes/auth/AuthManager.php b/includes/auth/AuthManager.php index d3fd5fcb0f..ab7ba0fb8c 100644 --- a/includes/auth/AuthManager.php +++ b/includes/auth/AuthManager.php @@ -2408,15 +2408,15 @@ class AuthManager implements LoggerAwareInterface { * @param bool $useContextLang Use 'uselang' to set the user's language */ private function setDefaultUserOptions( User $user, $useContextLang ) { - global $wgContLang; - $user->setToken(); - $lang = $useContextLang ? \RequestContext::getMain()->getLanguage() : $wgContLang; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + + $lang = $useContextLang ? \RequestContext::getMain()->getLanguage() : $contLang; $user->setOption( 'language', $lang->getPreferredVariant() ); - if ( $wgContLang->hasVariants() ) { - $user->setOption( 'variant', $wgContLang->getPreferredVariant() ); + if ( $contLang->hasVariants() ) { + $user->setOption( 'variant', $contLang->getPreferredVariant() ); } } diff --git a/includes/cache/HTMLFileCache.php b/includes/cache/HTMLFileCache.php index f8cd754a06..3a89066f8c 100644 --- a/includes/cache/HTMLFileCache.php +++ b/includes/cache/HTMLFileCache.php @@ -91,7 +91,6 @@ class HTMLFileCache extends FileCacheBase { * @return bool */ public static function useFileCache( IContextSource $context, $mode = self::MODE_NORMAL ) { - global $wgContLang; $config = MediaWikiServices::getInstance()->getMainConfig(); if ( !$config->get( 'UseFileCache' ) && $mode !== self::MODE_REBUILD ) { @@ -124,7 +123,8 @@ class HTMLFileCache extends FileCacheBase { $ulang = $context->getLanguage(); // Check that there are no other sources of variation - if ( $user->getId() || !$ulang->equals( $wgContLang ) ) { + if ( $user->getId() || + !$ulang->equals( MediaWikiServices::getInstance()->getContentLanguage() ) ) { return false; } @@ -145,7 +145,6 @@ class HTMLFileCache extends FileCacheBase { * @return void */ public function loadFromFileCache( IContextSource $context, $mode = self::MODE_NORMAL ) { - global $wgContLang; $config = MediaWikiServices::getInstance()->getMainConfig(); wfDebug( __METHOD__ . "()\n" ); @@ -158,7 +157,8 @@ class HTMLFileCache extends FileCacheBase { $context->getOutput()->sendCacheControl(); header( "Content-Type: {$config->get( 'MimeType' )}; charset=UTF-8" ); - header( "Content-Language: {$wgContLang->getHtmlCode()}" ); + header( 'Content-Language: ' . + MediaWikiServices::getInstance()->getContentLanguage()->getHtmlCode() ); if ( $this->useGzip() ) { if ( wfClientAcceptsGzip() ) { header( 'Content-Encoding: gzip' ); diff --git a/includes/cache/LinkBatch.php b/includes/cache/LinkBatch.php index 30d105b212..7a0826e466 100644 --- a/includes/cache/LinkBatch.php +++ b/includes/cache/LinkBatch.php @@ -57,9 +57,12 @@ class LinkBatch { * @since 1.17 * * @param string $caller + * @return self (since 1.32) */ public function setCaller( $caller ) { $this->caller = $caller; + + return $this; } /** @@ -221,13 +224,13 @@ class LinkBatch { if ( $this->isEmpty() ) { return false; } + $services = MediaWikiServices::getInstance(); - global $wgContLang; - if ( !$wgContLang->needsGenderDistinction() ) { + if ( !$services->getContentLanguage()->needsGenderDistinction() ) { return false; } - $genderCache = MediaWikiServices::getInstance()->getGenderCache(); + $genderCache = $services->getGenderCache(); $genderCache->doLinkBatch( $this->data, $this->caller ); return true; diff --git a/includes/cache/LinkCache.php b/includes/cache/LinkCache.php index 260038af5f..9e182c796c 100644 --- a/includes/cache/LinkCache.php +++ b/includes/cache/LinkCache.php @@ -283,11 +283,11 @@ class LinkCache { /** * @param WANObjectCache $cache - * @param TitleValue $t + * @param LinkTarget $t * @return string[] * @since 1.28 */ - public function getMutableCacheKeys( WANObjectCache $cache, TitleValue $t ) { + public function getMutableCacheKeys( WANObjectCache $cache, LinkTarget $t ) { if ( $this->isCacheable( $t ) ) { return [ $cache->makeKey( 'page', $t->getNamespace(), sha1( $t->getDBkey() ) ) ]; } diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index 7a172bead8..7a1b988643 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -88,6 +88,8 @@ class MessageCache { protected $clusterCache; /** @var BagOStuff */ protected $srvCache; + /** @var Language */ + protected $contLang; /** * Singleton instance @@ -105,14 +107,16 @@ class MessageCache { public static function singleton() { if ( self::$instance === null ) { global $wgUseDatabaseMessages, $wgMsgCacheExpiry, $wgUseLocalMessageCache; + $services = MediaWikiServices::getInstance(); self::$instance = new self( - MediaWikiServices::getInstance()->getMainWANObjectCache(), + $services->getMainWANObjectCache(), wfGetMessageCacheStorage(), $wgUseLocalMessageCache - ? MediaWikiServices::getInstance()->getLocalServerObjectCache() + ? $services->getLocalServerObjectCache() : new EmptyBagOStuff(), $wgUseDatabaseMessages, - $wgMsgCacheExpiry + $wgMsgCacheExpiry, + $services->getContentLanguage() ); } @@ -135,13 +139,11 @@ class MessageCache { * @return string Normalized message key */ public static function normalizeKey( $key ) { - global $wgContLang; - $lckey = strtr( $key, ' ', '_' ); if ( ord( $lckey ) < 128 ) { $lckey[0] = strtolower( $lckey[0] ); } else { - $lckey = $wgContLang->lcfirst( $lckey ); + $lckey = MediaWikiServices::getInstance()->getContentLanguage()->lcfirst( $lckey ); } return $lckey; @@ -153,13 +155,15 @@ class MessageCache { * @param BagOStuff $serverCache * @param bool $useDB Whether to look for message overrides (e.g. MediaWiki: pages) * @param int $expiry Lifetime for cache. @see $mExpiry. + * @param Language|null $contLang Content language of site */ public function __construct( WANObjectCache $wanCache, BagOStuff $clusterCache, BagOStuff $serverCache, $useDB, - $expiry + $expiry, + Language $contLang = null ) { $this->wanCache = $wanCache; $this->clusterCache = $clusterCache; @@ -169,6 +173,7 @@ class MessageCache { $this->mDisable = !$useDB; $this->mExpiry = $expiry; + $this->contLang = $contLang ?? MediaWikiServices::getInstance()->getContentLanguage(); } /** @@ -228,13 +233,13 @@ class MessageCache { * (2) memcached * (3) from the database. * - * When succesfully loading from (2) or (3), all higher level caches are + * When successfully loading from (2) or (3), all higher level caches are * updated for the newest version. * * Nothing is loaded if member variable mDisable is true, either manually * set by calling code or if message loading fails (is this possible?). * - * Returns true if cache is already populated or it was succesfully populated, + * Returns true if cache is already populated or it was successfully populated, * or false if populating empty cache fails. Also returns true if MessageCache * is disabled. * @@ -364,7 +369,7 @@ class MessageCache { if ( !$success ) { $where[] = 'loading FAILED - cache is disabled'; $this->mDisable = true; - $this->cache->set( $code, null ); + $this->cache->set( $code, [] ); wfDebugLog( 'MessageCacheError', __METHOD__ . ": Failed to load $code\n" ); # This used to throw an exception, but that led to nasty side effects like # the whole wiki being instantly down if the memcached server died @@ -581,7 +586,7 @@ class MessageCache { // (b) Update the shared caches in a deferred update with a fresh DB snapshot DeferredUpdates::addCallableUpdate( function () use ( $title, $msg, $code ) { - global $wgContLang, $wgMaxMsgCacheEntrySize; + global $wgMaxMsgCacheEntrySize; // Allow one caller at a time to avoid race conditions $scopedLock = $this->getReentrantScopedLock( $this->clusterCache->makeKey( 'messages', $code ) @@ -627,7 +632,7 @@ class MessageCache { // Purge the message in the message blob store $resourceloader = RequestContext::getMain()->getOutput()->getResourceLoader(); $blobStore = $resourceloader->getMessageBlobStore(); - $blobStore->updateMessage( $wgContLang->lcfirst( $msg ) ); + $blobStore->updateMessage( $this->contLang->lcfirst( $msg ) ); Hooks::run( 'MessageCacheReplace', [ $title, $text ] ); }, @@ -860,8 +865,6 @@ class MessageCache { * @return string|bool The message, or false if not found */ protected function getMessageFromFallbackChain( $lang, $lckey, $useDB ) { - global $wgContLang; - $alreadyTried = []; // First try the requested language. @@ -871,7 +874,7 @@ class MessageCache { } // Now try checking the site language. - $message = $this->getMessageForLang( $wgContLang, $lckey, $useDB, $alreadyTried ); + $message = $this->getMessageForLang( $this->contLang, $lckey, $useDB, $alreadyTried ); return $message; } @@ -886,13 +889,11 @@ class MessageCache { * @return string|bool The message, or false if not found */ private function getMessageForLang( $lang, $lckey, $useDB, &$alreadyTried ) { - global $wgContLang; - $langcode = $lang->getCode(); // Try checking the database for the requested language if ( $useDB ) { - $uckey = $wgContLang->ucfirst( $lckey ); + $uckey = $this->contLang->ucfirst( $lckey ); if ( !isset( $alreadyTried[$langcode] ) ) { $message = $this->getMsgFromNamespace( @@ -1241,8 +1242,6 @@ class MessageCache { * @return array Array of message keys (strings) */ public function getAllMessageKeys( $code ) { - global $wgContLang; - $this->load( $code ); if ( !$this->cache->has( $code ) ) { // Apparently load() failed @@ -1257,7 +1256,7 @@ class MessageCache { $cache = array_diff( $cache, [ '!NONEXISTENT' ] ); // Keys may appear with a capital first letter. lcfirst them. - return array_map( [ $wgContLang, 'lcfirst' ], array_keys( $cache ) ); + return array_map( [ $this->contLang, 'lcfirst' ], array_keys( $cache ) ); } /** @@ -1268,8 +1267,6 @@ class MessageCache { * @since 1.29 */ public function updateMessageOverride( Title $title, Content $content = null ) { - global $wgContLang; - $msgText = $this->getMessageTextFromContent( $content ); if ( $msgText === null ) { $msgText = false; // treat as not existing @@ -1277,8 +1274,8 @@ class MessageCache { $this->replace( $title->getDBkey(), $msgText ); - if ( $wgContLang->hasVariants() ) { - $wgContLang->updateConversionTable( $title ); + if ( $this->contLang->hasVariants() ) { + $this->contLang->updateConversionTable( $title ); } } diff --git a/includes/cache/localisation/LCStoreDB.php b/includes/cache/localisation/LCStoreDB.php index c57145c04d..2d8e4d21a9 100644 --- a/includes/cache/localisation/LCStoreDB.php +++ b/includes/cache/localisation/LCStoreDB.php @@ -18,6 +18,7 @@ * @file */ +use Wikimedia\Rdbms\Database; use Wikimedia\Rdbms\IDatabase; use Wikimedia\Rdbms\DBQueryError; @@ -26,21 +27,29 @@ use Wikimedia\Rdbms\DBQueryError; * This will work on any MediaWiki installation. */ class LCStoreDB implements LCStore { - /** @var string */ private $currentLang; /** @var bool */ private $writesDone = false; - /** @var IDatabase */ + /** @var IDatabase|null */ private $dbw; /** @var array */ private $batch = []; /** @var bool */ private $readOnly = false; + /** @var array Server configuration map */ + private $server; + + public function __construct( $params ) { + $this->server = $params['server'] ?? []; + } public function get( $code, $key ) { - if ( $this->writesDone && $this->dbw ) { - $db = $this->dbw; // see the changes in finishWrite() + if ( $this->server || $this->writesDone ) { + // If a server configuration map is specified, always used that connection + // for reads and writes. Otherwise, if writes occurred in finishWrite(), make + // sure those changes are always visible. + $db = $this->getWriteConnection(); } else { $db = wfGetDB( DB_REPLICA ); } @@ -62,8 +71,8 @@ class LCStoreDB implements LCStore { throw new MWException( __METHOD__ . ": Invalid language \"$code\"" ); } - $this->dbw = wfGetDB( DB_MASTER ); - $this->readOnly = $this->dbw->isReadOnly(); + $dbw = $this->getWriteConnection(); + $this->readOnly = $dbw->isReadOnly(); $this->currentLang = $code; $this->batch = []; @@ -76,25 +85,22 @@ class LCStoreDB implements LCStore { throw new MWException( __CLASS__ . ': must call startWrite() before finishWrite()' ); } - $this->dbw->startAtomic( __METHOD__ ); + $dbw = $this->getWriteConnection(); + $dbw->startAtomic( __METHOD__ ); try { - $this->dbw->delete( - 'l10n_cache', - [ 'lc_lang' => $this->currentLang ], - __METHOD__ - ); + $dbw->delete( 'l10n_cache', [ 'lc_lang' => $this->currentLang ], __METHOD__ ); foreach ( array_chunk( $this->batch, 500 ) as $rows ) { - $this->dbw->insert( 'l10n_cache', $rows, __METHOD__ ); + $dbw->insert( 'l10n_cache', $rows, __METHOD__ ); } $this->writesDone = true; } catch ( DBQueryError $e ) { - if ( $this->dbw->wasReadOnlyError() ) { + if ( $dbw->wasReadOnlyError() ) { $this->readOnly = true; // just avoid site down time } else { throw $e; } } - $this->dbw->endAtomic( __METHOD__ ); + $dbw->endAtomic( __METHOD__ ); $this->currentLang = null; $this->batch = []; @@ -107,11 +113,30 @@ class LCStoreDB implements LCStore { throw new MWException( __CLASS__ . ': must call startWrite() before set()' ); } + $dbw = $this->getWriteConnection(); + $this->batch[] = [ 'lc_lang' => $this->currentLang, 'lc_key' => $key, - 'lc_value' => $this->dbw->encodeBlob( serialize( $value ) ) + 'lc_value' => $dbw->encodeBlob( serialize( $value ) ) ]; } + /** + * @return IDatabase + */ + private function getWriteConnection() { + if ( !$this->dbw ) { + if ( $this->server ) { + $this->dbw = Database::factory( $this->server['type'], $this->server ); + if ( !$this->dbw ) { + throw new MWException( __CLASS__ . ': failed to obtain a DB connection' ); + } + } else { + $this->dbw = wfGetDB( DB_MASTER ); + } + } + + return $this->dbw; + } } diff --git a/includes/cache/localisation/LocalisationCache.php b/includes/cache/localisation/LocalisationCache.php index 9e2a2fd2ca..75e5e19bce 100644 --- a/includes/cache/localisation/LocalisationCache.php +++ b/includes/cache/localisation/LocalisationCache.php @@ -203,6 +203,7 @@ class LocalisationCache { break; case 'db': $storeClass = LCStoreDB::class; + $storeConf['server'] = $conf['storeServer'] ?? []; break; case 'array': $storeClass = LCStoreStaticArray::class; @@ -215,6 +216,7 @@ class LocalisationCache { $storeClass = LCStoreCDB::class; } else { $storeClass = LCStoreDB::class; + $storeConf['server'] = $conf['storeServer'] ?? []; } break; default: diff --git a/includes/changes/ChangesList.php b/includes/changes/ChangesList.php index eb9febea08..fea31b46d6 100644 --- a/includes/changes/ChangesList.php +++ b/includes/changes/ChangesList.php @@ -531,10 +531,10 @@ class ChangesList extends ContextSource { public function getTimestamp( $rc ) { // @todo FIXME: Hard coded ". .". Is there a message for this? Should there be? return $this->message['semicolon-separator'] . '' . - $this->getLanguage()->userTime( + htmlspecialchars( $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() - ) . ' . . '; + ) ) . ' . . '; } /** diff --git a/includes/changes/OldChangesList.php b/includes/changes/OldChangesList.php index 7ba12fbddd..a2af01cc49 100644 --- a/includes/changes/OldChangesList.php +++ b/includes/changes/OldChangesList.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + class OldChangesList extends ChangesList { /** @@ -90,7 +92,8 @@ class OldChangesList extends ChangesList { } // Log entries (old format) or log targets, and special pages } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) { - list( $name, $htmlubpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] ); + list( $name, $htmlubpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + resolveAlias( $rc->mAttribs['rc_title'] ); if ( $name == 'Log' ) { $this->insertLog( $html, $rc->getTitle(), $htmlubpage ); } diff --git a/includes/changetags/ChangeTags.php b/includes/changetags/ChangeTags.php index 3bb777ec73..9a015f4503 100644 --- a/includes/changetags/ChangeTags.php +++ b/includes/changetags/ChangeTags.php @@ -201,9 +201,8 @@ class ChangeTags { } $taglessDesc = Sanitizer::stripAllTags( $originalDesc->parse() ); - $escapedDesc = Sanitizer::escapeHtmlAllowEntities( $taglessDesc ); - return $context->getLanguage()->truncateForVisual( $escapedDesc, $length ); + return $context->getLanguage()->truncateForVisual( $taglessDesc, $length ); } /** @@ -916,8 +915,8 @@ class ChangeTags { if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) { $dbw->update( 'change_tag_def', - [ 'ctd_name' => $tag ], [ 'ctd_user_defined' => 0 ], + [ 'ctd_name' => $tag ], __METHOD__ ); diff --git a/includes/collation/Collation.php b/includes/collation/Collation.php index f52dcae017..25b3d94574 100644 --- a/includes/collation/Collation.php +++ b/includes/collation/Collation.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * @since 1.16.3 * @author Tim Starling @@ -46,13 +48,12 @@ abstract class Collation { * @return Collation */ public static function factory( $collationName ) { - global $wgContLang; - switch ( $collationName ) { case 'uppercase': return new UppercaseCollation; case 'numeric': - return new NumericUppercaseCollation( $wgContLang ); + return new NumericUppercaseCollation( + MediaWikiServices::getInstance()->getContentLanguage() ); case 'identity': return new IdentityCollation; case 'uca-default': @@ -67,8 +68,6 @@ abstract class Collation { return new AbkhazUppercaseCollation; case 'uppercase-ba': return new BashkirUppercaseCollation; - case 'uppercase-se': - return new NorthernSamiUppercaseCollation; default: $match = []; if ( preg_match( '/^uca-([A-Za-z@=-]+)$/', $collationName, $match ) ) { diff --git a/includes/collation/IcuCollation.php b/includes/collation/IcuCollation.php index 5f401a588b..7d9f168fb9 100644 --- a/includes/collation/IcuCollation.php +++ b/includes/collation/IcuCollation.php @@ -75,7 +75,7 @@ class IcuCollation extends Collation { * letters (denoted by keys starting with '-'). * * These are additions to (or subtractions from) the data stored in the - * first-letters-root.ser file (which among others includes full basic latin, + * first-letters-root.php data file (which among others includes full basic latin, * cyrillic and greek alphabets). * * "Separate letter" is a letter that would have a separate heading/section @@ -348,9 +348,10 @@ class IcuCollation extends Collation { * @throws MWException */ private function fetchFirstLetterData() { + global $IP; // Generate data from serialized data file if ( isset( self::$tailoringFirstLetters[$this->locale] ) ) { - $letters = wfGetPrecompiledData( 'first-letters-root.ser' ); + $letters = require "$IP/includes/collation/data/first-letters-root.php"; // Append additional characters $letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] ); // Remove unnecessary ones, if any @@ -364,10 +365,15 @@ class IcuCollation extends Collation { $letters[] = $this->digitTransformLanguage->formatNum( $digit, true ); } } else { - $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" ); - if ( $letters === false ) { - throw new MWException( "MediaWiki does not support ICU locale " . - "\"{$this->locale}\"" ); + if ( $this->locale === 'root' ) { + $letters = require "$IP/includes/collation/data/first-letters-root.php"; + } else { + // FIXME: Is this still used? + $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" ); + if ( $letters === false ) { + throw new MWException( "MediaWiki does not support ICU locale " . + "\"{$this->locale}\"" ); + } } } diff --git a/includes/collation/IdentityCollation.php b/includes/collation/IdentityCollation.php index 46e7f38f5b..8e5871bf43 100644 --- a/includes/collation/IdentityCollation.php +++ b/includes/collation/IdentityCollation.php @@ -18,6 +18,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * Collation class that's essentially a no-op. * @@ -33,12 +35,11 @@ class IdentityCollation extends Collation { } public function getFirstLetter( $string ) { - global $wgContLang; // Copied from UppercaseCollation. // I'm kind of unclear on when this could happen... if ( $string[0] == "\0" ) { $string = substr( $string, 1 ); } - return $wgContLang->firstChar( $string ); + return MediaWikiServices::getInstance()->getContentLanguage()->firstChar( $string ); } } diff --git a/includes/collation/NorthernSamiUppercaseCollation.php b/includes/collation/NorthernSamiUppercaseCollation.php deleted file mode 100644 index d373749e54..0000000000 --- a/includes/collation/NorthernSamiUppercaseCollation.php +++ /dev/null @@ -1,83 +0,0 @@ -digitTransformLang = $lang; diff --git a/includes/collation/data/first-letters-root.php b/includes/collation/data/first-letters-root.php new file mode 100644 index 0000000000..7003aab000 --- /dev/null +++ b/includes/collation/data/first-letters-root.php @@ -0,0 +1,14747 @@ + 'ـ', + 1 => ' ', + 2 => '`', + 3 => '´', + 4 => '˜', + 5 => '^', + 6 => '¯', + 7 => '‾', + 8 => '˘', + 9 => '˙', + 10 => '¨', + 11 => '˚', + 12 => '˝', + 13 => '᾽', + 14 => '῝', + 15 => '¸', + 16 => '˛', + 17 => '_', + 18 => '‗', + 19 => '῀', + 20 => '﮲', + 21 => '﮳', + 22 => '﮴', + 23 => '﮵', + 24 => '﮶', + 25 => '﮷', + 26 => '﮸', + 27 => '﮹', + 28 => '﮺', + 29 => '﮻', + 30 => '﮼', + 31 => '﮽', + 32 => '﮾', + 33 => '﮿', + 34 => '﯀', + 35 => '﯁', + 36 => '゛', + 37 => '゜', + 38 => '-', + 39 => '֊', + 40 => '᐀', + 41 => '᭠', + 42 => '᠆', + 43 => '᠇', + 44 => '‐', + 45 => '‒', + 46 => '–', + 47 => '—', + 48 => '―', + 49 => '⁓', + 50 => '⸗', + 51 => '゠', + 52 => '・', + 53 => ',', + 54 => '՝', + 55 => '،', + 56 => '؍', + 57 => '٫', + 58 => '٬', + 59 => '߸', + 60 => '᠂', + 61 => '᠈', + 62 => '꓾', + 63 => '꘍', + 64 => '꛵', + 65 => '︑', + 66 => ';', + 67 => '؛', + 68 => '⁏', + 69 => '꛶', + 70 => ':', + 71 => '։', + 72 => '؞', + 73 => '܃', + 74 => '܄', + 75 => '܅', + 76 => '܆', + 77 => '܇', + 78 => '܈', + 79 => '࠰', + 80 => '࠱', + 81 => '࠲', + 82 => '࠳', + 83 => '࠴', + 84 => '࠵', + 85 => '࠶', + 86 => '࠷', + 87 => '࠸', + 88 => '࠹', + 89 => '࠺', + 90 => '࠻', + 91 => '࠼', + 92 => '࠽', + 93 => '࠾', + 94 => '፡', + 95 => '፣', + 96 => '፤', + 97 => '፥', + 98 => '፦', + 99 => '᠄', + 100 => '᠅', + 101 => '༔', + 102 => '៖', + 103 => '᭝', + 104 => '꧇', + 105 => '᛫', + 106 => '᛬', + 107 => '᛭', + 108 => '꛴', + 109 => '!', + 110 => '¡', + 111 => '՜', + 112 => '߹', + 113 => '᥄', + 114 => '?', + 115 => '¿', + 116 => '⸮', + 117 => '՞', + 118 => '؟', + 119 => '܉', + 120 => '፧', + 121 => '᥅', + 122 => '⳺', + 123 => '⳻', + 124 => '꘏', + 125 => '꛷', + 126 => '‽', + 127 => '⸘', + 128 => '.', + 129 => '᠁', + 130 => '۔', + 131 => '܁', + 132 => '܂', + 133 => '።', + 134 => '᠃', + 135 => '᠉', + 136 => '᙮', + 137 => '᭜', + 138 => '⳹', + 139 => '⳾', + 140 => '⸰', + 141 => '꓿', + 142 => '꘎', + 143 => '꛳', + 144 => '︒', + 145 => '·', + 146 => '⸱', + 147 => '।', + 148 => '॥', + 149 => '꣎', + 150 => '꣏', + 151 => '᰻', + 152 => '᰼', + 153 => '꡶', + 154 => '꡷', + 155 => '᜵', + 156 => '᜶', + 157 => '꤯', + 158 => '၊', + 159 => '။', + 160 => '។', + 161 => '៕', + 162 => '᪨', + 163 => '᪩', + 164 => '᪪', + 165 => '᪫', + 166 => '᭞', + 167 => '᭟', + 168 => '꧈', + 169 => '꧉', + 170 => '꩝', + 171 => '꩞', + 172 => '꩟', + 173 => '꯫', + 174 => '𐩖', + 175 => '𐩗', + 176 => '𑁇', + 177 => '𑁈', + 178 => '𑃀', + 179 => '𑃁', + 180 => '᱾', + 181 => '᱿', + 182 => '܀', + 183 => '߷', + 184 => '჻', + 185 => '፠', + 186 => '፨', + 187 => '᨞', + 188 => '᨟', + 189 => '᭚', + 190 => '᭛', + 191 => '꧁', + 192 => '꧂', + 193 => '꧃', + 194 => '꧄', + 195 => '꧅', + 196 => '꧆', + 197 => '꧊', + 198 => '꧋', + 199 => '꧌', + 200 => '꧍', + 201 => '꛲', + 202 => '꥟', + 203 => '𐡗', + 204 => '𐬺', + 205 => '𐬻', + 206 => '𐬼', + 207 => '𐬽', + 208 => '𐬾', + 209 => '𐬿', + 210 => '𑂾', + 211 => '𑂿', + 212 => '⁕', + 213 => '⁖', + 214 => '⁘', + 215 => '⁙', + 216 => '⁚', + 217 => '⁛', + 218 => '⁜', + 219 => '⁝', + 220 => '⁞', + 221 => '⸪', + 222 => '⸫', + 223 => '⸬', + 224 => '⸭', + 225 => '⳼', + 226 => '⳿', + 227 => '⸙', + 228 => '𐤿', + 229 => '𐄀', + 230 => '𐄁', + 231 => '𐄂', + 232 => '𐎟', + 233 => '𐏐', + 234 => '𐤟', + 235 => '𒑰', + 236 => '𒑱', + 237 => '𒑲', + 238 => '𒑳', + 239 => '\'', + 240 => '‘', + 241 => '’', + 242 => '‚', + 243 => '‛', + 244 => '‹', + 245 => '›', + 246 => '"', + 247 => '“', + 248 => '”', + 249 => '„', + 250 => '‟', + 251 => '«', + 252 => '»', + 253 => '(', + 254 => ')', + 255 => '[', + 256 => ']', + 257 => '{', + 258 => '}', + 259 => '༺', + 260 => '༻', + 261 => '༼', + 262 => '༽', + 263 => '᚛', + 264 => '᚜', + 265 => '⁅', + 266 => '⁆', + 267 => '⧼', + 268 => '⧽', + 269 => '⦃', + 270 => '⦄', + 271 => '⦅', + 272 => '⦆', + 273 => '⦇', + 274 => '⦈', + 275 => '⦉', + 276 => '⦊', + 277 => '⦋', + 278 => '⦌', + 279 => '⦍', + 280 => '⦎', + 281 => '⦏', + 282 => '⦐', + 283 => '⦑', + 284 => '⦒', + 285 => '⦓', + 286 => '⦔', + 287 => '⦕', + 288 => '⦖', + 289 => '⦗', + 290 => '⦘', + 291 => '⟬', + 292 => '⟭', + 293 => '⟮', + 294 => '⟯', + 295 => '⸂', + 296 => '⸃', + 297 => '⸄', + 298 => '⸅', + 299 => '⸉', + 300 => '⸊', + 301 => '⸌', + 302 => '⸍', + 303 => '⸜', + 304 => '⸝', + 305 => '⸠', + 306 => '⸡', + 307 => '⸢', + 308 => '⸣', + 309 => '⸤', + 310 => '⸥', + 311 => '⸦', + 312 => '⸧', + 313 => '⸨', + 314 => '⸩', + 315 => '〈', + 316 => '〉', + 317 => '「', + 318 => '」', + 319 => '﹝', + 320 => '﹞', + 321 => '︗', + 322 => '︘', + 323 => '﴾', + 324 => '﴿', + 325 => '§', + 326 => '¶', + 327 => '⁋', + 328 => '©', + 329 => '®', + 330 => '@', + 331 => '*', + 332 => '⁎', + 333 => '⁑', + 334 => '٭', + 335 => '꙳', + 336 => '/', + 337 => '⁄', + 338 => '\\', + 339 => '&', + 340 => '⅋', + 341 => '⁊', + 342 => '#', + 343 => '%', + 344 => '٪', + 345 => '‰', + 346 => '؉', + 347 => '‱', + 348 => '؊', + 349 => '⁒', + 350 => '†', + 351 => '‡', + 352 => '•', + 353 => '‣', + 354 => '‧', + 355 => '⁃', + 356 => '⁌', + 357 => '⁍', + 358 => '′', + 359 => '‵', + 360 => '‸', + 361 => '※', + 362 => '‿', + 363 => '⁔', + 364 => '⁀', + 365 => '⁐', + 366 => '⁁', + 367 => '⁂', + 368 => '⸀', + 369 => '⸁', + 370 => '⸆', + 371 => '⸇', + 372 => '⸈', + 373 => '⸋', + 374 => '⸎', + 375 => '⸏', + 376 => '⸐', + 377 => '⸑', + 378 => '⸒', + 379 => '⸓', + 380 => '⸔', + 381 => '⸕', + 382 => '⸖', + 383 => '⸚', + 384 => '⸛', + 385 => '⸞', + 386 => '⸟', + 387 => '꙾', + 388 => '՚', + 389 => '՛', + 390 => '՟', + 391 => '־', + 392 => '׀', + 393 => '׃', + 394 => '׆', + 395 => '׳', + 396 => '״', + 397 => '܊', + 398 => '܋', + 399 => '܌', + 400 => '܍', + 401 => '࡞', + 402 => '᠀', + 403 => '॰', + 404 => '꣸', + 405 => '꣹', + 406 => '꣺', + 407 => '෴', + 408 => '๚', + 409 => '๛', + 410 => '꫞', + 411 => '꫟', + 412 => '༄', + 413 => '༅', + 414 => '༆', + 415 => '༇', + 416 => '༈', + 417 => '༉', + 418 => '༊', + 419 => '࿐', + 420 => '࿑', + 421 => '་', + 422 => '།', + 423 => '༎', + 424 => '༏', + 425 => '༐', + 426 => '༑', + 427 => '༒', + 428 => '྅', + 429 => '࿒', + 430 => '࿓', + 431 => '࿔', + 432 => '࿙', + 433 => '࿚', + 434 => '᰽', + 435 => '᰾', + 436 => '᰿', + 437 => '᥀', + 438 => '၌', + 439 => '၍', + 440 => '၎', + 441 => '၏', + 442 => '႞', + 443 => '႟', + 444 => '꩷', + 445 => '꩸', + 446 => '꩹', + 447 => 'ៗ', + 448 => '៘', + 449 => '៙', + 450 => '៚', + 451 => '᪠', + 452 => '᪡', + 453 => '᪢', + 454 => '᪣', + 455 => '᪤', + 456 => '᪥', + 457 => '᪦', + 458 => '᪬', + 459 => '᪭', + 460 => '᙭', + 461 => '⵰', + 462 => '꡴', + 463 => '꡵', + 464 => '᯼', + 465 => '᯽', + 466 => '᯾', + 467 => '᯿', + 468 => '꤮', + 469 => '꧞', + 470 => '꧟', + 471 => '꩜', + 472 => '𑁉', + 473 => '𑁊', + 474 => '𑁋', + 475 => '𑁌', + 476 => '𑁍', + 477 => '𐩐', + 478 => '𐩑', + 479 => '𐩒', + 480 => '𐩓', + 481 => '𐩔', + 482 => '𐩕', + 483 => '𐩘', + 484 => '𐬹', + 485 => '𑂻', + 486 => '𑂼', + 487 => 'ʹ', + 488 => '͵', + 489 => 'ʺ', + 490 => '˂', + 491 => '˃', + 492 => '˄', + 493 => '˅', + 494 => 'ˆ', + 495 => 'ˇ', + 496 => 'ˈ', + 497 => 'ˉ', + 498 => 'ˊ', + 499 => 'ˋ', + 500 => 'ˌ', + 501 => 'ˍ', + 502 => 'ˎ', + 503 => 'ˏ', + 504 => '˒', + 505 => '˓', + 506 => '˔', + 507 => '˕', + 508 => '˖', + 509 => '˗', + 510 => '˞', + 511 => '˟', + 512 => '˥', + 513 => '˦', + 514 => '˧', + 515 => '˨', + 516 => '˩', + 517 => '˪', + 518 => '˫', + 519 => 'ˬ', + 520 => '˭', + 521 => '˯', + 522 => '˰', + 523 => '˱', + 524 => '˲', + 525 => '˳', + 526 => '˴', + 527 => '˵', + 528 => '˶', + 529 => '˷', + 530 => '˸', + 531 => '˹', + 532 => '˺', + 533 => '˻', + 534 => '˼', + 535 => '˽', + 536 => '˾', + 537 => '˿', + 538 => '᎐', + 539 => '᎑', + 540 => '᎒', + 541 => '᎓', + 542 => '᎔', + 543 => '᎕', + 544 => '᎖', + 545 => '᎗', + 546 => '᎘', + 547 => '᎙', + 548 => '꜀', + 549 => '꜁', + 550 => '꜂', + 551 => '꜃', + 552 => '꜄', + 553 => '꜅', + 554 => '꜆', + 555 => '꜇', + 556 => '꜈', + 557 => '꜉', + 558 => '꜊', + 559 => '꜋', + 560 => '꜌', + 561 => '꜍', + 562 => '꜎', + 563 => '꜏', + 564 => '꜐', + 565 => '꜑', + 566 => '꜒', + 567 => '꜓', + 568 => '꜔', + 569 => '꜕', + 570 => '꜖', + 571 => 'ꜗ', + 572 => 'ꜘ', + 573 => 'ꜙ', + 574 => 'ꜚ', + 575 => 'ꜛ', + 576 => 'ꜜ', + 577 => 'ꜝ', + 578 => 'ꜞ', + 579 => 'ꜟ', + 580 => '꜠', + 581 => '꜡', + 582 => 'ꞈ', + 583 => '꞉', + 584 => '꞊', + 585 => '°', + 586 => '҂', + 587 => '؈', + 588 => '؎', + 589 => '؏', + 590 => '۞', + 591 => '۩', + 592 => '﷽', + 593 => '߶', + 594 => '৺', + 595 => '୰', + 596 => '௳', + 597 => '௴', + 598 => '௵', + 599 => '௶', + 600 => '௷', + 601 => '௸', + 602 => '௺', + 603 => '౿', + 604 => '൹', + 605 => '꠨', + 606 => '꠩', + 607 => '꠪', + 608 => '꠫', + 609 => '꠶', + 610 => '꠷', + 611 => '꠹', + 612 => '๏', + 613 => '༁', + 614 => '༂', + 615 => '༃', + 616 => '༓', + 617 => '༕', + 618 => '༖', + 619 => '༗', + 620 => '༚', + 621 => '༛', + 622 => '༜', + 623 => '༝', + 624 => '༞', + 625 => '༟', + 626 => '༴', + 627 => '༶', + 628 => '༸', + 629 => '྾', + 630 => '྿', + 631 => '࿀', + 632 => '࿁', + 633 => '࿂', + 634 => '࿃', + 635 => '࿄', + 636 => '࿅', + 637 => '࿇', + 638 => '࿈', + 639 => '࿉', + 640 => '࿊', + 641 => '࿋', + 642 => '࿌', + 643 => '࿎', + 644 => '࿏', + 645 => '࿕', + 646 => '࿖', + 647 => '࿗', + 648 => '࿘', + 649 => '᧠', + 650 => '᧡', + 651 => '᧢', + 652 => '᧣', + 653 => '᧤', + 654 => '᧥', + 655 => '᧦', + 656 => '᧧', + 657 => '᧨', + 658 => '᧩', + 659 => '᧪', + 660 => '᧫', + 661 => '᧬', + 662 => '᧭', + 663 => '᧮', + 664 => '᧯', + 665 => '᧰', + 666 => '᧱', + 667 => '᧲', + 668 => '᧳', + 669 => '᧴', + 670 => '᧵', + 671 => '᧶', + 672 => '᧷', + 673 => '᧸', + 674 => '᧹', + 675 => '᧺', + 676 => '᧻', + 677 => '᧼', + 678 => '᧽', + 679 => '᧾', + 680 => '᧿', + 681 => '᭡', + 682 => '᭢', + 683 => '᭣', + 684 => '᭤', + 685 => '᭥', + 686 => '᭦', + 687 => '᭧', + 688 => '᭨', + 689 => '᭩', + 690 => '᭪', + 691 => '᭴', + 692 => '᭵', + 693 => '᭶', + 694 => '᭷', + 695 => '᭸', + 696 => '᭹', + 697 => '᭺', + 698 => '᭻', + 699 => '᭼', + 700 => '℄', + 701 => '℈', + 702 => '℔', + 703 => '℗', + 704 => '℘', + 705 => '℞', + 706 => '℟', + 707 => '℣', + 708 => '℥', + 709 => '℧', + 710 => '℩', + 711 => '℮', + 712 => '℺', + 713 => '⅁', + 714 => '⅂', + 715 => '⅃', + 716 => '⅄', + 717 => '⅊', + 718 => '⅌', + 719 => '⅍', + 720 => '⅏', + 721 => '←', + 722 => '→', + 723 => '↑', + 724 => '↓', + 725 => '↔', + 726 => '↕', + 727 => '↖', + 728 => '↗', + 729 => '↘', + 730 => '↙', + 731 => '↜', + 732 => '↝', + 733 => '↞', + 734 => '↟', + 735 => '↠', + 736 => '↡', + 737 => '↢', + 738 => '↣', + 739 => '↤', + 740 => '↥', + 741 => '↦', + 742 => '↧', + 743 => '↨', + 744 => '↩', + 745 => '↪', + 746 => '↫', + 747 => '↬', + 748 => '↭', + 749 => '↯', + 750 => '↰', + 751 => '↱', + 752 => '↲', + 753 => '↳', + 754 => '↴', + 755 => '↵', + 756 => '↶', + 757 => '↷', + 758 => '↸', + 759 => '↹', + 760 => '↺', + 761 => '↻', + 762 => '↼', + 763 => '↽', + 764 => '↾', + 765 => '↿', + 766 => '⇀', + 767 => '⇁', + 768 => '⇂', + 769 => '⇃', + 770 => '⇄', + 771 => '⇅', + 772 => '⇆', + 773 => '⇇', + 774 => '⇈', + 775 => '⇉', + 776 => '⇊', + 777 => '⇋', + 778 => '⇌', + 779 => '⇐', + 780 => '⇑', + 781 => '⇒', + 782 => '⇓', + 783 => '⇔', + 784 => '⇕', + 785 => '⇖', + 786 => '⇗', + 787 => '⇘', + 788 => '⇙', + 789 => '⇚', + 790 => '⇛', + 791 => '⇜', + 792 => '⇝', + 793 => '⇞', + 794 => '⇟', + 795 => '⇠', + 796 => '⇡', + 797 => '⇢', + 798 => '⇣', + 799 => '⇤', + 800 => '⇥', + 801 => '⇦', + 802 => '⇧', + 803 => '⇨', + 804 => '⇩', + 805 => '⇪', + 806 => '⇫', + 807 => '⇬', + 808 => '⇭', + 809 => '⇮', + 810 => '⇯', + 811 => '⇰', + 812 => '⇱', + 813 => '⇲', + 814 => '⇳', + 815 => '⇴', + 816 => '⇵', + 817 => '⇶', + 818 => '⇷', + 819 => '⇸', + 820 => '⇹', + 821 => '⇺', + 822 => '⇻', + 823 => '⇼', + 824 => '⇽', + 825 => '⇾', + 826 => '⇿', + 827 => '∀', + 828 => '∁', + 829 => '∂', + 830 => '∃', + 831 => '∅', + 832 => '∆', + 833 => '∇', + 834 => '∈', + 835 => '∊', + 836 => '∋', + 837 => '∍', + 838 => '϶', + 839 => '∎', + 840 => '∏', + 841 => '∐', + 842 => '∑', + 843 => '+', + 844 => '±', + 845 => '÷', + 846 => '×', + 847 => '<', + 848 => '=', + 849 => '>', + 850 => '¬', + 851 => '|', + 852 => '¦', + 853 => '‖', + 854 => '~', + 855 => '−', + 856 => '∓', + 857 => '∔', + 858 => '∕', + 859 => '∖', + 860 => '∗', + 861 => '∘', + 862 => '∙', + 863 => '√', + 864 => '∛', + 865 => '؆', + 866 => '∜', + 867 => '؇', + 868 => '∝', + 869 => '∞', + 870 => '∟', + 871 => '∠', + 872 => '∡', + 873 => '∢', + 874 => '∣', + 875 => '∥', + 876 => '∧', + 877 => '∨', + 878 => '∩', + 879 => '∪', + 880 => '∫', + 881 => '∮', + 882 => '∱', + 883 => '∲', + 884 => '∳', + 885 => '∴', + 886 => '∵', + 887 => '∶', + 888 => '∷', + 889 => '∸', + 890 => '∹', + 891 => '∺', + 892 => '∻', + 893 => '∼', + 894 => '∽', + 895 => '∾', + 896 => '∿', + 897 => '≀', + 898 => '≂', + 899 => '≃', + 900 => '≅', + 901 => '≆', + 902 => '≈', + 903 => '≊', + 904 => '≋', + 905 => '≌', + 906 => '≍', + 907 => '≎', + 908 => '≏', + 909 => '≐', + 910 => '≑', + 911 => '≒', + 912 => '≓', + 913 => '≔', + 914 => '≕', + 915 => '≖', + 916 => '≗', + 917 => '≘', + 918 => '≙', + 919 => '≚', + 920 => '≛', + 921 => '≜', + 922 => '≝', + 923 => '≞', + 924 => '≟', + 925 => '≡', + 926 => '≣', + 927 => '≤', + 928 => '≥', + 929 => '≦', + 930 => '≧', + 931 => '≨', + 932 => '≩', + 933 => '≪', + 934 => '≫', + 935 => '≬', + 936 => '≲', + 937 => '≳', + 938 => '≶', + 939 => '≷', + 940 => '≺', + 941 => '≻', + 942 => '≼', + 943 => '≽', + 944 => '≾', + 945 => '≿', + 946 => '⊂', + 947 => '⊃', + 948 => '⊆', + 949 => '⊇', + 950 => '⊊', + 951 => '⊋', + 952 => '⊌', + 953 => '⊍', + 954 => '⊎', + 955 => '⊏', + 956 => '⊐', + 957 => '⊑', + 958 => '⊒', + 959 => '⊓', + 960 => '⊔', + 961 => '⊕', + 962 => '⊖', + 963 => '⊗', + 964 => '⊘', + 965 => '⊙', + 966 => '⊚', + 967 => '⊛', + 968 => '⊜', + 969 => '⊝', + 970 => '⊞', + 971 => '⊟', + 972 => '⊠', + 973 => '⊡', + 974 => '⊢', + 975 => '⊣', + 976 => '⊤', + 977 => '⊥', + 978 => '⊦', + 979 => '⊧', + 980 => '⊨', + 981 => '⊩', + 982 => '⊪', + 983 => '⊫', + 984 => '⊰', + 985 => '⊱', + 986 => '⊲', + 987 => '⊳', + 988 => '⊴', + 989 => '⊵', + 990 => '⊶', + 991 => '⊷', + 992 => '⊸', + 993 => '⊹', + 994 => '⊺', + 995 => '⊻', + 996 => '⊼', + 997 => '⊽', + 998 => '⊾', + 999 => '⊿', + 1000 => '⋀', + 1001 => '⋁', + 1002 => '⋂', + 1003 => '⋃', + 1004 => '⋄', + 1005 => '⋅', + 1006 => '⋆', + 1007 => '⋇', + 1008 => '⋈', + 1009 => '⋉', + 1010 => '⋊', + 1011 => '⋋', + 1012 => '⋌', + 1013 => '⋍', + 1014 => '⋎', + 1015 => '⋏', + 1016 => '⋐', + 1017 => '⋑', + 1018 => '⋒', + 1019 => '⋓', + 1020 => '⋔', + 1021 => '⋕', + 1022 => '⋖', + 1023 => '⋗', + 1024 => '⋘', + 1025 => '⋙', + 1026 => '⋚', + 1027 => '⋛', + 1028 => '⋜', + 1029 => '⋝', + 1030 => '⋞', + 1031 => '⋟', + 1032 => '⋤', + 1033 => '⋥', + 1034 => '⋦', + 1035 => '⋧', + 1036 => '⋨', + 1037 => '⋩', + 1038 => '⋮', + 1039 => '⋯', + 1040 => '⋰', + 1041 => '⋱', + 1042 => '⋲', + 1043 => '⋳', + 1044 => '⋴', + 1045 => '⋵', + 1046 => '⋶', + 1047 => '⋷', + 1048 => '⋸', + 1049 => '⋹', + 1050 => '⋺', + 1051 => '⋻', + 1052 => '⋼', + 1053 => '⋽', + 1054 => '⋾', + 1055 => '⋿', + 1056 => '⌀', + 1057 => '⌁', + 1058 => '⌂', + 1059 => '⌃', + 1060 => '⌄', + 1061 => '⌅', + 1062 => '⌆', + 1063 => '⌇', + 1064 => '⌈', + 1065 => '⌉', + 1066 => '⌊', + 1067 => '⌋', + 1068 => '⌌', + 1069 => '⌍', + 1070 => '⌎', + 1071 => '⌏', + 1072 => '⌐', + 1073 => '⌑', + 1074 => '⌒', + 1075 => '⌓', + 1076 => '⌔', + 1077 => '⌕', + 1078 => '⌖', + 1079 => '⌗', + 1080 => '⌘', + 1081 => '⌙', + 1082 => '⌚', + 1083 => '⌛', + 1084 => '⌜', + 1085 => '⌝', + 1086 => '⌞', + 1087 => '⌟', + 1088 => '⌠', + 1089 => '⌡', + 1090 => '⌢', + 1091 => '⌣', + 1092 => '⌤', + 1093 => '⌥', + 1094 => '⌦', + 1095 => '⌧', + 1096 => '⌨', + 1097 => '⌫', + 1098 => '⌬', + 1099 => '⌭', + 1100 => '⌮', + 1101 => '⌯', + 1102 => '⌰', + 1103 => '⌱', + 1104 => '⌲', + 1105 => '⌳', + 1106 => '⌴', + 1107 => '⌵', + 1108 => '⌶', + 1109 => '⌷', + 1110 => '⌸', + 1111 => '⌹', + 1112 => '⌺', + 1113 => '⌻', + 1114 => '⌼', + 1115 => '⌽', + 1116 => '⌾', + 1117 => '⌿', + 1118 => '⍀', + 1119 => '⍁', + 1120 => '⍂', + 1121 => '⍃', + 1122 => '⍄', + 1123 => '⍅', + 1124 => '⍆', + 1125 => '⍇', + 1126 => '⍈', + 1127 => '⍉', + 1128 => '⍊', + 1129 => '⍋', + 1130 => '⍌', + 1131 => '⍍', + 1132 => '⍎', + 1133 => '⍏', + 1134 => '⍐', + 1135 => '⍑', + 1136 => '⍒', + 1137 => '⍓', + 1138 => '⍔', + 1139 => '⍕', + 1140 => '⍖', + 1141 => '⍗', + 1142 => '⍘', + 1143 => '⍙', + 1144 => '⍚', + 1145 => '⍛', + 1146 => '⍜', + 1147 => '⍝', + 1148 => '⍞', + 1149 => '⍟', + 1150 => '⍠', + 1151 => '⍡', + 1152 => '⍢', + 1153 => '⍣', + 1154 => '⍤', + 1155 => '⍥', + 1156 => '⍦', + 1157 => '⍧', + 1158 => '⍨', + 1159 => '⍩', + 1160 => '⍪', + 1161 => '⍫', + 1162 => '⍬', + 1163 => '⍭', + 1164 => '⍮', + 1165 => '⍯', + 1166 => '⍰', + 1167 => '⍱', + 1168 => '⍲', + 1169 => '⍳', + 1170 => '⍴', + 1171 => '⍵', + 1172 => '⍶', + 1173 => '⍷', + 1174 => '⍸', + 1175 => '⍹', + 1176 => '⍺', + 1177 => '⍻', + 1178 => '⍼', + 1179 => '⍽', + 1180 => '⍾', + 1181 => '⍿', + 1182 => '⎀', + 1183 => '⎁', + 1184 => '⎂', + 1185 => '⎃', + 1186 => '⎄', + 1187 => '⎅', + 1188 => '⎆', + 1189 => '⎇', + 1190 => '⎈', + 1191 => '⎉', + 1192 => '⎊', + 1193 => '⎋', + 1194 => '⎌', + 1195 => '⎍', + 1196 => '⎎', + 1197 => '⎏', + 1198 => '⎐', + 1199 => '⎑', + 1200 => '⎒', + 1201 => '⎓', + 1202 => '⎔', + 1203 => '⎕', + 1204 => '⎖', + 1205 => '⎗', + 1206 => '⎘', + 1207 => '⎙', + 1208 => '⎚', + 1209 => '⎛', + 1210 => '⎜', + 1211 => '⎝', + 1212 => '⎞', + 1213 => '⎟', + 1214 => '⎠', + 1215 => '⎡', + 1216 => '⎢', + 1217 => '⎣', + 1218 => '⎤', + 1219 => '⎥', + 1220 => '⎦', + 1221 => '⎧', + 1222 => '⎨', + 1223 => '⎩', + 1224 => '⎪', + 1225 => '⎫', + 1226 => '⎬', + 1227 => '⎭', + 1228 => '⎮', + 1229 => '⎯', + 1230 => '⎰', + 1231 => '⎱', + 1232 => '⎲', + 1233 => '⎳', + 1234 => '⎴', + 1235 => '⎵', + 1236 => '⎶', + 1237 => '⎷', + 1238 => '⎸', + 1239 => '⎹', + 1240 => '⎺', + 1241 => '⎻', + 1242 => '⎼', + 1243 => '⎽', + 1244 => '⎾', + 1245 => '⎿', + 1246 => '⏀', + 1247 => '⏁', + 1248 => '⏂', + 1249 => '⏃', + 1250 => '⏄', + 1251 => '⏅', + 1252 => '⏆', + 1253 => '⏇', + 1254 => '⏈', + 1255 => '⏉', + 1256 => '⏊', + 1257 => '⏋', + 1258 => '⏌', + 1259 => '⏍', + 1260 => '⏎', + 1261 => '⏏', + 1262 => '⏐', + 1263 => '⏑', + 1264 => '⏒', + 1265 => '⏓', + 1266 => '⏔', + 1267 => '⏕', + 1268 => '⏖', + 1269 => '⏗', + 1270 => '⏘', + 1271 => '⏙', + 1272 => '⏚', + 1273 => '⏛', + 1274 => '⏜', + 1275 => '⏝', + 1276 => '⏞', + 1277 => '⏟', + 1278 => '⏠', + 1279 => '⏡', + 1280 => '⏢', + 1281 => '⏣', + 1282 => '⏤', + 1283 => '⏥', + 1284 => '⏦', + 1285 => '⏧', + 1286 => '⏨', + 1287 => '⏩', + 1288 => '⏪', + 1289 => '⏫', + 1290 => '⏬', + 1291 => '⏭', + 1292 => '⏮', + 1293 => '⏯', + 1294 => '⏰', + 1295 => '⏱', + 1296 => '⏲', + 1297 => '⏳', + 1298 => '␀', + 1299 => '␁', + 1300 => '␂', + 1301 => '␃', + 1302 => '␄', + 1303 => '␅', + 1304 => '␆', + 1305 => '␇', + 1306 => '␈', + 1307 => '␉', + 1308 => '␊', + 1309 => '␋', + 1310 => '␌', + 1311 => '␍', + 1312 => '␎', + 1313 => '␏', + 1314 => '␐', + 1315 => '␑', + 1316 => '␒', + 1317 => '␓', + 1318 => '␔', + 1319 => '␕', + 1320 => '␖', + 1321 => '␗', + 1322 => '␘', + 1323 => '␙', + 1324 => '␚', + 1325 => '␛', + 1326 => '␜', + 1327 => '␝', + 1328 => '␞', + 1329 => '␟', + 1330 => '␠', + 1331 => '␡', + 1332 => '␢', + 1333 => '␣', + 1334 => '␤', + 1335 => '␥', + 1336 => '␦', + 1337 => '⑀', + 1338 => '⑁', + 1339 => '⑂', + 1340 => '⑃', + 1341 => '⑄', + 1342 => '⑅', + 1343 => '⑆', + 1344 => '⑇', + 1345 => '⑈', + 1346 => '⑉', + 1347 => '⑊', + 1348 => '─', + 1349 => '━', + 1350 => '│', + 1351 => '┃', + 1352 => '┄', + 1353 => '┅', + 1354 => '┆', + 1355 => '┇', + 1356 => '┈', + 1357 => '┉', + 1358 => '┊', + 1359 => '┋', + 1360 => '┌', + 1361 => '┍', + 1362 => '┎', + 1363 => '┏', + 1364 => '┐', + 1365 => '┑', + 1366 => '┒', + 1367 => '┓', + 1368 => '└', + 1369 => '┕', + 1370 => '┖', + 1371 => '┗', + 1372 => '┘', + 1373 => '┙', + 1374 => '┚', + 1375 => '┛', + 1376 => '├', + 1377 => '┝', + 1378 => '┞', + 1379 => '┟', + 1380 => '┠', + 1381 => '┡', + 1382 => '┢', + 1383 => '┣', + 1384 => '┤', + 1385 => '┥', + 1386 => '┦', + 1387 => '┧', + 1388 => '┨', + 1389 => '┩', + 1390 => '┪', + 1391 => '┫', + 1392 => '┬', + 1393 => '┭', + 1394 => '┮', + 1395 => '┯', + 1396 => '┰', + 1397 => '┱', + 1398 => '┲', + 1399 => '┳', + 1400 => '┴', + 1401 => '┵', + 1402 => '┶', + 1403 => '┷', + 1404 => '┸', + 1405 => '┹', + 1406 => '┺', + 1407 => '┻', + 1408 => '┼', + 1409 => '┽', + 1410 => '┾', + 1411 => '┿', + 1412 => '╀', + 1413 => '╁', + 1414 => '╂', + 1415 => '╃', + 1416 => '╄', + 1417 => '╅', + 1418 => '╆', + 1419 => '╇', + 1420 => '╈', + 1421 => '╉', + 1422 => '╊', + 1423 => '╋', + 1424 => '╌', + 1425 => '╍', + 1426 => '╎', + 1427 => '╏', + 1428 => '═', + 1429 => '║', + 1430 => '╒', + 1431 => '╓', + 1432 => '╔', + 1433 => '╕', + 1434 => '╖', + 1435 => '╗', + 1436 => '╘', + 1437 => '╙', + 1438 => '╚', + 1439 => '╛', + 1440 => '╜', + 1441 => '╝', + 1442 => '╞', + 1443 => '╟', + 1444 => '╠', + 1445 => '╡', + 1446 => '╢', + 1447 => '╣', + 1448 => '╤', + 1449 => '╥', + 1450 => '╦', + 1451 => '╧', + 1452 => '╨', + 1453 => '╩', + 1454 => '╪', + 1455 => '╫', + 1456 => '╬', + 1457 => '╭', + 1458 => '╮', + 1459 => '╯', + 1460 => '╰', + 1461 => '╱', + 1462 => '╲', + 1463 => '╳', + 1464 => '╴', + 1465 => '╵', + 1466 => '╶', + 1467 => '╷', + 1468 => '╸', + 1469 => '╹', + 1470 => '╺', + 1471 => '╻', + 1472 => '╼', + 1473 => '╽', + 1474 => '╾', + 1475 => '╿', + 1476 => '▀', + 1477 => '▁', + 1478 => '▂', + 1479 => '▃', + 1480 => '▄', + 1481 => '▅', + 1482 => '▆', + 1483 => '▇', + 1484 => '█', + 1485 => '▉', + 1486 => '▊', + 1487 => '▋', + 1488 => '▌', + 1489 => '▍', + 1490 => '▎', + 1491 => '▏', + 1492 => '▐', + 1493 => '░', + 1494 => '▒', + 1495 => '▓', + 1496 => '▔', + 1497 => '▕', + 1498 => '▖', + 1499 => '▗', + 1500 => '▘', + 1501 => '▙', + 1502 => '▚', + 1503 => '▛', + 1504 => '▜', + 1505 => '▝', + 1506 => '▞', + 1507 => '▟', + 1508 => '■', + 1509 => '□', + 1510 => '▢', + 1511 => '▣', + 1512 => '▤', + 1513 => '▥', + 1514 => '▦', + 1515 => '▧', + 1516 => '▨', + 1517 => '▩', + 1518 => '▪', + 1519 => '▫', + 1520 => '▬', + 1521 => '▭', + 1522 => '▮', + 1523 => '▯', + 1524 => '▰', + 1525 => '▱', + 1526 => '▲', + 1527 => '△', + 1528 => '▴', + 1529 => '▵', + 1530 => '▶', + 1531 => '▷', + 1532 => '▸', + 1533 => '▹', + 1534 => '►', + 1535 => '▻', + 1536 => '▼', + 1537 => '▽', + 1538 => '▾', + 1539 => '▿', + 1540 => '◀', + 1541 => '◁', + 1542 => '◂', + 1543 => '◃', + 1544 => '◄', + 1545 => '◅', + 1546 => '◆', + 1547 => '◇', + 1548 => '◈', + 1549 => '◉', + 1550 => '◊', + 1551 => '○', + 1552 => '◌', + 1553 => '◍', + 1554 => '◎', + 1555 => '●', + 1556 => '◐', + 1557 => '◑', + 1558 => '◒', + 1559 => '◓', + 1560 => '◔', + 1561 => '◕', + 1562 => '◖', + 1563 => '◗', + 1564 => '◘', + 1565 => '◙', + 1566 => '◚', + 1567 => '◛', + 1568 => '◜', + 1569 => '◝', + 1570 => '◞', + 1571 => '◟', + 1572 => '◠', + 1573 => '◡', + 1574 => '◢', + 1575 => '◣', + 1576 => '◤', + 1577 => '◥', + 1578 => '◦', + 1579 => '◧', + 1580 => '◨', + 1581 => '◩', + 1582 => '◪', + 1583 => '◫', + 1584 => '◬', + 1585 => '◭', + 1586 => '◮', + 1587 => '◯', + 1588 => '◰', + 1589 => '◱', + 1590 => '◲', + 1591 => '◳', + 1592 => '◴', + 1593 => '◵', + 1594 => '◶', + 1595 => '◷', + 1596 => '◸', + 1597 => '◹', + 1598 => '◺', + 1599 => '◻', + 1600 => '◼', + 1601 => '◽', + 1602 => '◾', + 1603 => '◿', + 1604 => '☀', + 1605 => '☁', + 1606 => '☂', + 1607 => '☃', + 1608 => '☄', + 1609 => '★', + 1610 => '☆', + 1611 => '☇', + 1612 => '☈', + 1613 => '☉', + 1614 => '☊', + 1615 => '☋', + 1616 => '☌', + 1617 => '☍', + 1618 => '☎', + 1619 => '☏', + 1620 => '☐', + 1621 => '☑', + 1622 => '☒', + 1623 => '☓', + 1624 => '☔', + 1625 => '☕', + 1626 => '☖', + 1627 => '☗', + 1628 => '☘', + 1629 => '☙', + 1630 => '☚', + 1631 => '☛', + 1632 => '☜', + 1633 => '☝', + 1634 => '☞', + 1635 => '☟', + 1636 => '☠', + 1637 => '☡', + 1638 => '☢', + 1639 => '☣', + 1640 => '☤', + 1641 => '☥', + 1642 => '☦', + 1643 => '☧', + 1644 => '☨', + 1645 => '☩', + 1646 => '☪', + 1647 => '☫', + 1648 => '☬', + 1649 => '☭', + 1650 => '☮', + 1651 => '☯', + 1652 => '☸', + 1653 => '☹', + 1654 => '☺', + 1655 => '☻', + 1656 => '☼', + 1657 => '☽', + 1658 => '☾', + 1659 => '☿', + 1660 => '♀', + 1661 => '♁', + 1662 => '♂', + 1663 => '♃', + 1664 => '♄', + 1665 => '♅', + 1666 => '♆', + 1667 => '♇', + 1668 => '♈', + 1669 => '♉', + 1670 => '♊', + 1671 => '♋', + 1672 => '♌', + 1673 => '♍', + 1674 => '♎', + 1675 => '♏', + 1676 => '♐', + 1677 => '♑', + 1678 => '♒', + 1679 => '♓', + 1680 => '♔', + 1681 => '♕', + 1682 => '♖', + 1683 => '♗', + 1684 => '♘', + 1685 => '♙', + 1686 => '♚', + 1687 => '♛', + 1688 => '♜', + 1689 => '♝', + 1690 => '♞', + 1691 => '♟', + 1692 => '♠', + 1693 => '♡', + 1694 => '♢', + 1695 => '♣', + 1696 => '♤', + 1697 => '♥', + 1698 => '♦', + 1699 => '♧', + 1700 => '♨', + 1701 => '♩', + 1702 => '♪', + 1703 => '♫', + 1704 => '♬', + 1705 => '♰', + 1706 => '♱', + 1707 => '♲', + 1708 => '♳', + 1709 => '♴', + 1710 => '♵', + 1711 => '♶', + 1712 => '♷', + 1713 => '♸', + 1714 => '♹', + 1715 => '♺', + 1716 => '♻', + 1717 => '♼', + 1718 => '♽', + 1719 => '♾', + 1720 => '♿', + 1721 => '⚀', + 1722 => '⚁', + 1723 => '⚂', + 1724 => '⚃', + 1725 => '⚄', + 1726 => '⚅', + 1727 => '⚆', + 1728 => '⚇', + 1729 => '⚈', + 1730 => '⚉', + 1731 => '⚐', + 1732 => '⚑', + 1733 => '⚒', + 1734 => '⚓', + 1735 => '⚔', + 1736 => '⚕', + 1737 => '⚖', + 1738 => '⚗', + 1739 => '⚘', + 1740 => '⚙', + 1741 => '⚚', + 1742 => '⚛', + 1743 => '⚜', + 1744 => '⚝', + 1745 => '⚞', + 1746 => '⚟', + 1747 => '⚠', + 1748 => '⚡', + 1749 => '⚢', + 1750 => '⚣', + 1751 => '⚤', + 1752 => '⚥', + 1753 => '⚦', + 1754 => '⚧', + 1755 => '⚨', + 1756 => '⚩', + 1757 => '⚪', + 1758 => '⚫', + 1759 => '⚬', + 1760 => '⚭', + 1761 => '⚮', + 1762 => '⚯', + 1763 => '⚰', + 1764 => '⚱', + 1765 => '⚲', + 1766 => '⚳', + 1767 => '⚴', + 1768 => '⚵', + 1769 => '⚶', + 1770 => '⚷', + 1771 => '⚸', + 1772 => '⚹', + 1773 => '⚺', + 1774 => '⚻', + 1775 => '⚼', + 1776 => '⚽', + 1777 => '⚾', + 1778 => '⚿', + 1779 => '⛀', + 1780 => '⛁', + 1781 => '⛂', + 1782 => '⛃', + 1783 => '⛄', + 1784 => '⛅', + 1785 => '⛆', + 1786 => '⛇', + 1787 => '⛈', + 1788 => '⛉', + 1789 => '⛊', + 1790 => '⛋', + 1791 => '⛌', + 1792 => '⛍', + 1793 => '⛎', + 1794 => '⛏', + 1795 => '⛐', + 1796 => '⛑', + 1797 => '⛒', + 1798 => '⛓', + 1799 => '⛔', + 1800 => '⛕', + 1801 => '⛖', + 1802 => '⛗', + 1803 => '⛘', + 1804 => '⛙', + 1805 => '⛚', + 1806 => '⛛', + 1807 => '⛜', + 1808 => '⛝', + 1809 => '⛞', + 1810 => '⛟', + 1811 => '⛠', + 1812 => '⛡', + 1813 => '⛢', + 1814 => '⛣', + 1815 => '⛤', + 1816 => '⛥', + 1817 => '⛦', + 1818 => '⛧', + 1819 => '⛨', + 1820 => '⛩', + 1821 => '⛪', + 1822 => '⛫', + 1823 => '⛬', + 1824 => '⛭', + 1825 => '⛮', + 1826 => '⛯', + 1827 => '⛰', + 1828 => '⛱', + 1829 => '⛲', + 1830 => '⛳', + 1831 => '⛴', + 1832 => '⛵', + 1833 => '⛶', + 1834 => '⛷', + 1835 => '⛸', + 1836 => '⛹', + 1837 => '⛺', + 1838 => '⛻', + 1839 => '⛼', + 1840 => '⛽', + 1841 => '⛾', + 1842 => '⛿', + 1843 => '✁', + 1844 => '✂', + 1845 => '✃', + 1846 => '✄', + 1847 => '✅', + 1848 => '✆', + 1849 => '✇', + 1850 => '✈', + 1851 => '✉', + 1852 => '✊', + 1853 => '✋', + 1854 => '✌', + 1855 => '✍', + 1856 => '✎', + 1857 => '✏', + 1858 => '✐', + 1859 => '✑', + 1860 => '✒', + 1861 => '✓', + 1862 => '✔', + 1863 => '✕', + 1864 => '✖', + 1865 => '✗', + 1866 => '✘', + 1867 => '✙', + 1868 => '✚', + 1869 => '✛', + 1870 => '✜', + 1871 => '✝', + 1872 => '✞', + 1873 => '✟', + 1874 => '✠', + 1875 => '✡', + 1876 => '✢', + 1877 => '✣', + 1878 => '✤', + 1879 => '✥', + 1880 => '✦', + 1881 => '✧', + 1882 => '✨', + 1883 => '✩', + 1884 => '✪', + 1885 => '✫', + 1886 => '✬', + 1887 => '✭', + 1888 => '✮', + 1889 => '✯', + 1890 => '✰', + 1891 => '✱', + 1892 => '✲', + 1893 => '✳', + 1894 => '✴', + 1895 => '✵', + 1896 => '✶', + 1897 => '✷', + 1898 => '✸', + 1899 => '✹', + 1900 => '✺', + 1901 => '✻', + 1902 => '✼', + 1903 => '✽', + 1904 => '✾', + 1905 => '✿', + 1906 => '❀', + 1907 => '❁', + 1908 => '❂', + 1909 => '❃', + 1910 => '❄', + 1911 => '❅', + 1912 => '❆', + 1913 => '❇', + 1914 => '❈', + 1915 => '❉', + 1916 => '❊', + 1917 => '❋', + 1918 => '❌', + 1919 => '❍', + 1920 => '❎', + 1921 => '❏', + 1922 => '❐', + 1923 => '❑', + 1924 => '❒', + 1925 => '❓', + 1926 => '❔', + 1927 => '❕', + 1928 => '❖', + 1929 => '❗', + 1930 => '❘', + 1931 => '❙', + 1932 => '❚', + 1933 => '❛', + 1934 => '❜', + 1935 => '❝', + 1936 => '❞', + 1937 => '❟', + 1938 => '❠', + 1939 => '❡', + 1940 => '❢', + 1941 => '❣', + 1942 => '❤', + 1943 => '❥', + 1944 => '❦', + 1945 => '❧', + 1946 => '❨', + 1947 => '❩', + 1948 => '❪', + 1949 => '❫', + 1950 => '❬', + 1951 => '❭', + 1952 => '❮', + 1953 => '❯', + 1954 => '❰', + 1955 => '❱', + 1956 => '❲', + 1957 => '❳', + 1958 => '❴', + 1959 => '❵', + 1960 => '➔', + 1961 => '➕', + 1962 => '➖', + 1963 => '➗', + 1964 => '➘', + 1965 => '➙', + 1966 => '➚', + 1967 => '➛', + 1968 => '➜', + 1969 => '➝', + 1970 => '➞', + 1971 => '➟', + 1972 => '➠', + 1973 => '➡', + 1974 => '➢', + 1975 => '➣', + 1976 => '➤', + 1977 => '➥', + 1978 => '➦', + 1979 => '➧', + 1980 => '➨', + 1981 => '➩', + 1982 => '➪', + 1983 => '➫', + 1984 => '➬', + 1985 => '➭', + 1986 => '➮', + 1987 => '➯', + 1988 => '➰', + 1989 => '➱', + 1990 => '➲', + 1991 => '➳', + 1992 => '➴', + 1993 => '➵', + 1994 => '➶', + 1995 => '➷', + 1996 => '➸', + 1997 => '➹', + 1998 => '➺', + 1999 => '➻', + 2000 => '➼', + 2001 => '➽', + 2002 => '➾', + 2003 => '➿', + 2004 => '⟀', + 2005 => '⟁', + 2006 => '⟂', + 2007 => '⟃', + 2008 => '⟄', + 2009 => '⟅', + 2010 => '⟆', + 2011 => '⟇', + 2012 => '⟈', + 2013 => '⟉', + 2014 => '⟊', + 2015 => '⟌', + 2016 => '⟎', + 2017 => '⟏', + 2018 => '⟐', + 2019 => '⟑', + 2020 => '⟒', + 2021 => '⟓', + 2022 => '⟔', + 2023 => '⟕', + 2024 => '⟖', + 2025 => '⟗', + 2026 => '⟘', + 2027 => '⟙', + 2028 => '⟚', + 2029 => '⟛', + 2030 => '⟜', + 2031 => '⟝', + 2032 => '⟞', + 2033 => '⟟', + 2034 => '⟠', + 2035 => '⟡', + 2036 => '⟢', + 2037 => '⟣', + 2038 => '⟤', + 2039 => '⟥', + 2040 => '⟦', + 2041 => '⟧', + 2042 => '⟨', + 2043 => '⟩', + 2044 => '⟪', + 2045 => '⟫', + 2046 => '⟰', + 2047 => '⟱', + 2048 => '⟲', + 2049 => '⟳', + 2050 => '⟴', + 2051 => '⟵', + 2052 => '⟶', + 2053 => '⟷', + 2054 => '⟸', + 2055 => '⟹', + 2056 => '⟺', + 2057 => '⟻', + 2058 => '⟼', + 2059 => '⟽', + 2060 => '⟾', + 2061 => '⟿', + 2062 => '⤀', + 2063 => '⤁', + 2064 => '⤂', + 2065 => '⤃', + 2066 => '⤄', + 2067 => '⤅', + 2068 => '⤆', + 2069 => '⤇', + 2070 => '⤈', + 2071 => '⤉', + 2072 => '⤊', + 2073 => '⤋', + 2074 => '⤌', + 2075 => '⤍', + 2076 => '⤎', + 2077 => '⤏', + 2078 => '⤐', + 2079 => '⤑', + 2080 => '⤒', + 2081 => '⤓', + 2082 => '⤔', + 2083 => '⤕', + 2084 => '⤖', + 2085 => '⤗', + 2086 => '⤘', + 2087 => '⤙', + 2088 => '⤚', + 2089 => '⤛', + 2090 => '⤜', + 2091 => '⤝', + 2092 => '⤞', + 2093 => '⤟', + 2094 => '⤠', + 2095 => '⤡', + 2096 => '⤢', + 2097 => '⤣', + 2098 => '⤤', + 2099 => '⤥', + 2100 => '⤦', + 2101 => '⤧', + 2102 => '⤨', + 2103 => '⤩', + 2104 => '⤪', + 2105 => '⤫', + 2106 => '⤬', + 2107 => '⤭', + 2108 => '⤮', + 2109 => '⤯', + 2110 => '⤰', + 2111 => '⤱', + 2112 => '⤲', + 2113 => '⤳', + 2114 => '⤴', + 2115 => '⤵', + 2116 => '⤶', + 2117 => '⤷', + 2118 => '⤸', + 2119 => '⤹', + 2120 => '⤺', + 2121 => '⤻', + 2122 => '⤼', + 2123 => '⤽', + 2124 => '⤾', + 2125 => '⤿', + 2126 => '⥀', + 2127 => '⥁', + 2128 => '⥂', + 2129 => '⥃', + 2130 => '⥄', + 2131 => '⥅', + 2132 => '⥆', + 2133 => '⥇', + 2134 => '⥈', + 2135 => '⥉', + 2136 => '⥊', + 2137 => '⥋', + 2138 => '⥌', + 2139 => '⥍', + 2140 => '⥎', + 2141 => '⥏', + 2142 => '⥐', + 2143 => '⥑', + 2144 => '⥒', + 2145 => '⥓', + 2146 => '⥔', + 2147 => '⥕', + 2148 => '⥖', + 2149 => '⥗', + 2150 => '⥘', + 2151 => '⥙', + 2152 => '⥚', + 2153 => '⥛', + 2154 => '⥜', + 2155 => '⥝', + 2156 => '⥞', + 2157 => '⥟', + 2158 => '⥠', + 2159 => '⥡', + 2160 => '⥢', + 2161 => '⥣', + 2162 => '⥤', + 2163 => '⥥', + 2164 => '⥦', + 2165 => '⥧', + 2166 => '⥨', + 2167 => '⥩', + 2168 => '⥪', + 2169 => '⥫', + 2170 => '⥬', + 2171 => '⥭', + 2172 => '⥮', + 2173 => '⥯', + 2174 => '⥰', + 2175 => '⥱', + 2176 => '⥲', + 2177 => '⥳', + 2178 => '⥴', + 2179 => '⥵', + 2180 => '⥶', + 2181 => '⥷', + 2182 => '⥸', + 2183 => '⥹', + 2184 => '⥺', + 2185 => '⥻', + 2186 => '⥼', + 2187 => '⥽', + 2188 => '⥾', + 2189 => '⥿', + 2190 => '⦀', + 2191 => '⦁', + 2192 => '⦂', + 2193 => '⦙', + 2194 => '⦚', + 2195 => '⦛', + 2196 => '⦜', + 2197 => '⦝', + 2198 => '⦞', + 2199 => '⦟', + 2200 => '⦠', + 2201 => '⦡', + 2202 => '⦢', + 2203 => '⦣', + 2204 => '⦤', + 2205 => '⦥', + 2206 => '⦦', + 2207 => '⦧', + 2208 => '⦨', + 2209 => '⦩', + 2210 => '⦪', + 2211 => '⦫', + 2212 => '⦬', + 2213 => '⦭', + 2214 => '⦮', + 2215 => '⦯', + 2216 => '⦰', + 2217 => '⦱', + 2218 => '⦲', + 2219 => '⦳', + 2220 => '⦴', + 2221 => '⦵', + 2222 => '⦶', + 2223 => '⦷', + 2224 => '⦸', + 2225 => '⦹', + 2226 => '⦺', + 2227 => '⦻', + 2228 => '⦼', + 2229 => '⦽', + 2230 => '⦾', + 2231 => '⦿', + 2232 => '⧀', + 2233 => '⧁', + 2234 => '⧂', + 2235 => '⧃', + 2236 => '⧄', + 2237 => '⧅', + 2238 => '⧆', + 2239 => '⧇', + 2240 => '⧈', + 2241 => '⧉', + 2242 => '⧊', + 2243 => '⧋', + 2244 => '⧌', + 2245 => '⧍', + 2246 => '⧎', + 2247 => '⧏', + 2248 => '⧐', + 2249 => '⧑', + 2250 => '⧒', + 2251 => '⧓', + 2252 => '⧔', + 2253 => '⧕', + 2254 => '⧖', + 2255 => '⧗', + 2256 => '⧘', + 2257 => '⧙', + 2258 => '⧚', + 2259 => '⧛', + 2260 => '⧜', + 2261 => '⧝', + 2262 => '⧞', + 2263 => '⧟', + 2264 => '⧠', + 2265 => '⧡', + 2266 => '⧢', + 2267 => '⧣', + 2268 => '⧤', + 2269 => '⧥', + 2270 => '⧦', + 2271 => '⧧', + 2272 => '⧨', + 2273 => '⧩', + 2274 => '⧪', + 2275 => '⧫', + 2276 => '⧬', + 2277 => '⧭', + 2278 => '⧮', + 2279 => '⧯', + 2280 => '⧰', + 2281 => '⧱', + 2282 => '⧲', + 2283 => '⧳', + 2284 => '⧴', + 2285 => '⧵', + 2286 => '⧶', + 2287 => '⧷', + 2288 => '⧸', + 2289 => '⧹', + 2290 => '⧺', + 2291 => '⧻', + 2292 => '⧾', + 2293 => '⧿', + 2294 => '⨀', + 2295 => '⨁', + 2296 => '⨂', + 2297 => '⨃', + 2298 => '⨄', + 2299 => '⨅', + 2300 => '⨆', + 2301 => '⨇', + 2302 => '⨈', + 2303 => '⨉', + 2304 => '⨊', + 2305 => '⨋', + 2306 => '⨍', + 2307 => '⨎', + 2308 => '⨏', + 2309 => '⨐', + 2310 => '⨑', + 2311 => '⨒', + 2312 => '⨓', + 2313 => '⨔', + 2314 => '⨕', + 2315 => '⨖', + 2316 => '⨗', + 2317 => '⨘', + 2318 => '⨙', + 2319 => '⨚', + 2320 => '⨛', + 2321 => '⨜', + 2322 => '⨝', + 2323 => '⨞', + 2324 => '⨟', + 2325 => '⨠', + 2326 => '⨡', + 2327 => '⨢', + 2328 => '⨣', + 2329 => '⨤', + 2330 => '⨥', + 2331 => '⨦', + 2332 => '⨧', + 2333 => '⨨', + 2334 => '⨩', + 2335 => '⨪', + 2336 => '⨫', + 2337 => '⨬', + 2338 => '⨭', + 2339 => '⨮', + 2340 => '⨯', + 2341 => '⨰', + 2342 => '⨱', + 2343 => '⨲', + 2344 => '⨳', + 2345 => '⨴', + 2346 => '⨵', + 2347 => '⨶', + 2348 => '⨷', + 2349 => '⨸', + 2350 => '⨹', + 2351 => '⨺', + 2352 => '⨻', + 2353 => '⨼', + 2354 => '⨽', + 2355 => '⨾', + 2356 => '⨿', + 2357 => '⩀', + 2358 => '⩁', + 2359 => '⩂', + 2360 => '⩃', + 2361 => '⩄', + 2362 => '⩅', + 2363 => '⩆', + 2364 => '⩇', + 2365 => '⩈', + 2366 => '⩉', + 2367 => '⩊', + 2368 => '⩋', + 2369 => '⩌', + 2370 => '⩍', + 2371 => '⩎', + 2372 => '⩏', + 2373 => '⩐', + 2374 => '⩑', + 2375 => '⩒', + 2376 => '⩓', + 2377 => '⩔', + 2378 => '⩕', + 2379 => '⩖', + 2380 => '⩗', + 2381 => '⩘', + 2382 => '⩙', + 2383 => '⩚', + 2384 => '⩛', + 2385 => '⩜', + 2386 => '⩝', + 2387 => '⩞', + 2388 => '⩟', + 2389 => '⩠', + 2390 => '⩡', + 2391 => '⩢', + 2392 => '⩣', + 2393 => '⩤', + 2394 => '⩥', + 2395 => '⩦', + 2396 => '⩧', + 2397 => '⩨', + 2398 => '⩩', + 2399 => '⩪', + 2400 => '⩫', + 2401 => '⩬', + 2402 => '⩭', + 2403 => '⩮', + 2404 => '⩯', + 2405 => '⩰', + 2406 => '⩱', + 2407 => '⩲', + 2408 => '⩳', + 2409 => '⩷', + 2410 => '⩸', + 2411 => '⩹', + 2412 => '⩺', + 2413 => '⩻', + 2414 => '⩼', + 2415 => '⩽', + 2416 => '⩾', + 2417 => '⩿', + 2418 => '⪀', + 2419 => '⪁', + 2420 => '⪂', + 2421 => '⪃', + 2422 => '⪄', + 2423 => '⪅', + 2424 => '⪆', + 2425 => '⪇', + 2426 => '⪈', + 2427 => '⪉', + 2428 => '⪊', + 2429 => '⪋', + 2430 => '⪌', + 2431 => '⪍', + 2432 => '⪎', + 2433 => '⪏', + 2434 => '⪐', + 2435 => '⪑', + 2436 => '⪒', + 2437 => '⪓', + 2438 => '⪔', + 2439 => '⪕', + 2440 => '⪖', + 2441 => '⪗', + 2442 => '⪘', + 2443 => '⪙', + 2444 => '⪚', + 2445 => '⪛', + 2446 => '⪜', + 2447 => '⪝', + 2448 => '⪞', + 2449 => '⪟', + 2450 => '⪠', + 2451 => '⪡', + 2452 => '⪢', + 2453 => '⪣', + 2454 => '⪤', + 2455 => '⪥', + 2456 => '⪦', + 2457 => '⪧', + 2458 => '⪨', + 2459 => '⪩', + 2460 => '⪪', + 2461 => '⪫', + 2462 => '⪬', + 2463 => '⪭', + 2464 => '⪮', + 2465 => '⪯', + 2466 => '⪰', + 2467 => '⪱', + 2468 => '⪲', + 2469 => '⪳', + 2470 => '⪴', + 2471 => '⪵', + 2472 => '⪶', + 2473 => '⪷', + 2474 => '⪸', + 2475 => '⪹', + 2476 => '⪺', + 2477 => '⪻', + 2478 => '⪼', + 2479 => '⪽', + 2480 => '⪾', + 2481 => '⪿', + 2482 => '⫀', + 2483 => '⫁', + 2484 => '⫂', + 2485 => '⫃', + 2486 => '⫄', + 2487 => '⫅', + 2488 => '⫆', + 2489 => '⫇', + 2490 => '⫈', + 2491 => '⫉', + 2492 => '⫊', + 2493 => '⫋', + 2494 => '⫌', + 2495 => '⫍', + 2496 => '⫎', + 2497 => '⫏', + 2498 => '⫐', + 2499 => '⫑', + 2500 => '⫒', + 2501 => '⫓', + 2502 => '⫔', + 2503 => '⫕', + 2504 => '⫖', + 2505 => '⫗', + 2506 => '⫘', + 2507 => '⫙', + 2508 => '⫚', + 2509 => '⫛', + 2510 => '⫝', + 2511 => '⫞', + 2512 => '⫟', + 2513 => '⫠', + 2514 => '⫡', + 2515 => '⫢', + 2516 => '⫣', + 2517 => '⫤', + 2518 => '⫥', + 2519 => '⫦', + 2520 => '⫧', + 2521 => '⫨', + 2522 => '⫩', + 2523 => '⫪', + 2524 => '⫫', + 2525 => '⫬', + 2526 => '⫭', + 2527 => '⫮', + 2528 => '⫯', + 2529 => '⫰', + 2530 => '⫱', + 2531 => '⫲', + 2532 => '⫳', + 2533 => '⫴', + 2534 => '⫵', + 2535 => '⫶', + 2536 => '⫷', + 2537 => '⫸', + 2538 => '⫹', + 2539 => '⫺', + 2540 => '⫻', + 2541 => '⫼', + 2542 => '⫽', + 2543 => '⫾', + 2544 => '⫿', + 2545 => '⬀', + 2546 => '⬁', + 2547 => '⬂', + 2548 => '⬃', + 2549 => '⬄', + 2550 => '⬅', + 2551 => '⬆', + 2552 => '⬇', + 2553 => '⬈', + 2554 => '⬉', + 2555 => '⬊', + 2556 => '⬋', + 2557 => '⬌', + 2558 => '⬍', + 2559 => '⬎', + 2560 => '⬏', + 2561 => '⬐', + 2562 => '⬑', + 2563 => '⬒', + 2564 => '⬓', + 2565 => '⬔', + 2566 => '⬕', + 2567 => '⬖', + 2568 => '⬗', + 2569 => '⬘', + 2570 => '⬙', + 2571 => '⬚', + 2572 => '⬛', + 2573 => '⬜', + 2574 => '⬝', + 2575 => '⬞', + 2576 => '⬟', + 2577 => '⬠', + 2578 => '⬡', + 2579 => '⬢', + 2580 => '⬣', + 2581 => '⬤', + 2582 => '⬥', + 2583 => '⬦', + 2584 => '⬧', + 2585 => '⬨', + 2586 => '⬩', + 2587 => '⬪', + 2588 => '⬫', + 2589 => '⬬', + 2590 => '⬭', + 2591 => '⬮', + 2592 => '⬯', + 2593 => '⬰', + 2594 => '⬱', + 2595 => '⬲', + 2596 => '⬳', + 2597 => '⬴', + 2598 => '⬵', + 2599 => '⬶', + 2600 => '⬷', + 2601 => '⬸', + 2602 => '⬹', + 2603 => '⬺', + 2604 => '⬻', + 2605 => '⬼', + 2606 => '⬽', + 2607 => '⬾', + 2608 => '⬿', + 2609 => '⭀', + 2610 => '⭁', + 2611 => '⭂', + 2612 => '⭃', + 2613 => '⭄', + 2614 => '⭅', + 2615 => '⭆', + 2616 => '⭇', + 2617 => '⭈', + 2618 => '⭉', + 2619 => '⭊', + 2620 => '⭋', + 2621 => '⭌', + 2622 => '⭐', + 2623 => '⭑', + 2624 => '⭒', + 2625 => '⭓', + 2626 => '⭔', + 2627 => '⭕', + 2628 => '⭖', + 2629 => '⭗', + 2630 => '⭘', + 2631 => '⭙', + 2632 => '⳥', + 2633 => '⳦', + 2634 => '⳧', + 2635 => '⳨', + 2636 => '⳩', + 2637 => '⳪', + 2638 => '⠀', + 2639 => '⠁', + 2640 => '⠂', + 2641 => '⠃', + 2642 => '⠄', + 2643 => '⠅', + 2644 => '⠆', + 2645 => '⠇', + 2646 => '⠈', + 2647 => '⠉', + 2648 => '⠊', + 2649 => '⠋', + 2650 => '⠌', + 2651 => '⠍', + 2652 => '⠎', + 2653 => '⠏', + 2654 => '⠐', + 2655 => '⠑', + 2656 => '⠒', + 2657 => '⠓', + 2658 => '⠔', + 2659 => '⠕', + 2660 => '⠖', + 2661 => '⠗', + 2662 => '⠘', + 2663 => '⠙', + 2664 => '⠚', + 2665 => '⠛', + 2666 => '⠜', + 2667 => '⠝', + 2668 => '⠞', + 2669 => '⠟', + 2670 => '⠠', + 2671 => '⠡', + 2672 => '⠢', + 2673 => '⠣', + 2674 => '⠤', + 2675 => '⠥', + 2676 => '⠦', + 2677 => '⠧', + 2678 => '⠨', + 2679 => '⠩', + 2680 => '⠪', + 2681 => '⠫', + 2682 => '⠬', + 2683 => '⠭', + 2684 => '⠮', + 2685 => '⠯', + 2686 => '⠰', + 2687 => '⠱', + 2688 => '⠲', + 2689 => '⠳', + 2690 => '⠴', + 2691 => '⠵', + 2692 => '⠶', + 2693 => '⠷', + 2694 => '⠸', + 2695 => '⠹', + 2696 => '⠺', + 2697 => '⠻', + 2698 => '⠼', + 2699 => '⠽', + 2700 => '⠾', + 2701 => '⠿', + 2702 => '⡀', + 2703 => '⡁', + 2704 => '⡂', + 2705 => '⡃', + 2706 => '⡄', + 2707 => '⡅', + 2708 => '⡆', + 2709 => '⡇', + 2710 => '⡈', + 2711 => '⡉', + 2712 => '⡊', + 2713 => '⡋', + 2714 => '⡌', + 2715 => '⡍', + 2716 => '⡎', + 2717 => '⡏', + 2718 => '⡐', + 2719 => '⡑', + 2720 => '⡒', + 2721 => '⡓', + 2722 => '⡔', + 2723 => '⡕', + 2724 => '⡖', + 2725 => '⡗', + 2726 => '⡘', + 2727 => '⡙', + 2728 => '⡚', + 2729 => '⡛', + 2730 => '⡜', + 2731 => '⡝', + 2732 => '⡞', + 2733 => '⡟', + 2734 => '⡠', + 2735 => '⡡', + 2736 => '⡢', + 2737 => '⡣', + 2738 => '⡤', + 2739 => '⡥', + 2740 => '⡦', + 2741 => '⡧', + 2742 => '⡨', + 2743 => '⡩', + 2744 => '⡪', + 2745 => '⡫', + 2746 => '⡬', + 2747 => '⡭', + 2748 => '⡮', + 2749 => '⡯', + 2750 => '⡰', + 2751 => '⡱', + 2752 => '⡲', + 2753 => '⡳', + 2754 => '⡴', + 2755 => '⡵', + 2756 => '⡶', + 2757 => '⡷', + 2758 => '⡸', + 2759 => '⡹', + 2760 => '⡺', + 2761 => '⡻', + 2762 => '⡼', + 2763 => '⡽', + 2764 => '⡾', + 2765 => '⡿', + 2766 => '⢀', + 2767 => '⢁', + 2768 => '⢂', + 2769 => '⢃', + 2770 => '⢄', + 2771 => '⢅', + 2772 => '⢆', + 2773 => '⢇', + 2774 => '⢈', + 2775 => '⢉', + 2776 => '⢊', + 2777 => '⢋', + 2778 => '⢌', + 2779 => '⢍', + 2780 => '⢎', + 2781 => '⢏', + 2782 => '⢐', + 2783 => '⢑', + 2784 => '⢒', + 2785 => '⢓', + 2786 => '⢔', + 2787 => '⢕', + 2788 => '⢖', + 2789 => '⢗', + 2790 => '⢘', + 2791 => '⢙', + 2792 => '⢚', + 2793 => '⢛', + 2794 => '⢜', + 2795 => '⢝', + 2796 => '⢞', + 2797 => '⢟', + 2798 => '⢠', + 2799 => '⢡', + 2800 => '⢢', + 2801 => '⢣', + 2802 => '⢤', + 2803 => '⢥', + 2804 => '⢦', + 2805 => '⢧', + 2806 => '⢨', + 2807 => '⢩', + 2808 => '⢪', + 2809 => '⢫', + 2810 => '⢬', + 2811 => '⢭', + 2812 => '⢮', + 2813 => '⢯', + 2814 => '⢰', + 2815 => '⢱', + 2816 => '⢲', + 2817 => '⢳', + 2818 => '⢴', + 2819 => '⢵', + 2820 => '⢶', + 2821 => '⢷', + 2822 => '⢸', + 2823 => '⢹', + 2824 => '⢺', + 2825 => '⢻', + 2826 => '⢼', + 2827 => '⢽', + 2828 => '⢾', + 2829 => '⢿', + 2830 => '⣀', + 2831 => '⣁', + 2832 => '⣂', + 2833 => '⣃', + 2834 => '⣄', + 2835 => '⣅', + 2836 => '⣆', + 2837 => '⣇', + 2838 => '⣈', + 2839 => '⣉', + 2840 => '⣊', + 2841 => '⣋', + 2842 => '⣌', + 2843 => '⣍', + 2844 => '⣎', + 2845 => '⣏', + 2846 => '⣐', + 2847 => '⣑', + 2848 => '⣒', + 2849 => '⣓', + 2850 => '⣔', + 2851 => '⣕', + 2852 => '⣖', + 2853 => '⣗', + 2854 => '⣘', + 2855 => '⣙', + 2856 => '⣚', + 2857 => '⣛', + 2858 => '⣜', + 2859 => '⣝', + 2860 => '⣞', + 2861 => '⣟', + 2862 => '⣠', + 2863 => '⣡', + 2864 => '⣢', + 2865 => '⣣', + 2866 => '⣤', + 2867 => '⣥', + 2868 => '⣦', + 2869 => '⣧', + 2870 => '⣨', + 2871 => '⣩', + 2872 => '⣪', + 2873 => '⣫', + 2874 => '⣬', + 2875 => '⣭', + 2876 => '⣮', + 2877 => '⣯', + 2878 => '⣰', + 2879 => '⣱', + 2880 => '⣲', + 2881 => '⣳', + 2882 => '⣴', + 2883 => '⣵', + 2884 => '⣶', + 2885 => '⣷', + 2886 => '⣸', + 2887 => '⣹', + 2888 => '⣺', + 2889 => '⣻', + 2890 => '⣼', + 2891 => '⣽', + 2892 => '⣾', + 2893 => '⣿', + 2894 => '⚊', + 2895 => '⚋', + 2896 => '⚌', + 2897 => '⚍', + 2898 => '⚎', + 2899 => '⚏', + 2900 => '☰', + 2901 => '☱', + 2902 => '☲', + 2903 => '☳', + 2904 => '☴', + 2905 => '☵', + 2906 => '☶', + 2907 => '☷', + 2908 => '䷀', + 2909 => '䷁', + 2910 => '䷂', + 2911 => '䷃', + 2912 => '䷄', + 2913 => '䷅', + 2914 => '䷆', + 2915 => '䷇', + 2916 => '䷈', + 2917 => '䷉', + 2918 => '䷊', + 2919 => '䷋', + 2920 => '䷌', + 2921 => '䷍', + 2922 => '䷎', + 2923 => '䷏', + 2924 => '䷐', + 2925 => '䷑', + 2926 => '䷒', + 2927 => '䷓', + 2928 => '䷔', + 2929 => '䷕', + 2930 => '䷖', + 2931 => '䷗', + 2932 => '䷘', + 2933 => '䷙', + 2934 => '䷚', + 2935 => '䷛', + 2936 => '䷜', + 2937 => '䷝', + 2938 => '䷞', + 2939 => '䷟', + 2940 => '䷠', + 2941 => '䷡', + 2942 => '䷢', + 2943 => '䷣', + 2944 => '䷤', + 2945 => '䷥', + 2946 => '䷦', + 2947 => '䷧', + 2948 => '䷨', + 2949 => '䷩', + 2950 => '䷪', + 2951 => '䷫', + 2952 => '䷬', + 2953 => '䷭', + 2954 => '䷮', + 2955 => '䷯', + 2956 => '䷰', + 2957 => '䷱', + 2958 => '䷲', + 2959 => '䷳', + 2960 => '䷴', + 2961 => '䷵', + 2962 => '䷶', + 2963 => '䷷', + 2964 => '䷸', + 2965 => '䷹', + 2966 => '䷺', + 2967 => '䷻', + 2968 => '䷼', + 2969 => '䷽', + 2970 => '䷾', + 2971 => '䷿', + 2972 => '𝌀', + 2973 => '𝌁', + 2974 => '𝌂', + 2975 => '𝌃', + 2976 => '𝌄', + 2977 => '𝌅', + 2978 => '𝌆', + 2979 => '𝌇', + 2980 => '𝌈', + 2981 => '𝌉', + 2982 => '𝌊', + 2983 => '𝌋', + 2984 => '𝌌', + 2985 => '𝌍', + 2986 => '𝌎', + 2987 => '𝌏', + 2988 => '𝌐', + 2989 => '𝌑', + 2990 => '𝌒', + 2991 => '𝌓', + 2992 => '𝌔', + 2993 => '𝌕', + 2994 => '𝌖', + 2995 => '𝌗', + 2996 => '𝌘', + 2997 => '𝌙', + 2998 => '𝌚', + 2999 => '𝌛', + 3000 => '𝌜', + 3001 => '𝌝', + 3002 => '𝌞', + 3003 => '𝌟', + 3004 => '𝌠', + 3005 => '𝌡', + 3006 => '𝌢', + 3007 => '𝌣', + 3008 => '𝌤', + 3009 => '𝌥', + 3010 => '𝌦', + 3011 => '𝌧', + 3012 => '𝌨', + 3013 => '𝌩', + 3014 => '𝌪', + 3015 => '𝌫', + 3016 => '𝌬', + 3017 => '𝌭', + 3018 => '𝌮', + 3019 => '𝌯', + 3020 => '𝌰', + 3021 => '𝌱', + 3022 => '𝌲', + 3023 => '𝌳', + 3024 => '𝌴', + 3025 => '𝌵', + 3026 => '𝌶', + 3027 => '𝌷', + 3028 => '𝌸', + 3029 => '𝌹', + 3030 => '𝌺', + 3031 => '𝌻', + 3032 => '𝌼', + 3033 => '𝌽', + 3034 => '𝌾', + 3035 => '𝌿', + 3036 => '𝍀', + 3037 => '𝍁', + 3038 => '𝍂', + 3039 => '𝍃', + 3040 => '𝍄', + 3041 => '𝍅', + 3042 => '𝍆', + 3043 => '𝍇', + 3044 => '𝍈', + 3045 => '𝍉', + 3046 => '𝍊', + 3047 => '𝍋', + 3048 => '𝍌', + 3049 => '𝍍', + 3050 => '𝍎', + 3051 => '𝍏', + 3052 => '𝍐', + 3053 => '𝍑', + 3054 => '𝍒', + 3055 => '𝍓', + 3056 => '𝍔', + 3057 => '𝍕', + 3058 => '𝍖', + 3059 => '꒐', + 3060 => '꒑', + 3061 => '꒒', + 3062 => '꒓', + 3063 => '꒔', + 3064 => '꒕', + 3065 => '꒖', + 3066 => '꒗', + 3067 => '꒘', + 3068 => '꒙', + 3069 => '꒚', + 3070 => '꒛', + 3071 => '꒜', + 3072 => '꒝', + 3073 => '꒞', + 3074 => '꒟', + 3075 => '꒠', + 3076 => '꒡', + 3077 => '꒢', + 3078 => '꒣', + 3079 => '꒤', + 3080 => '꒥', + 3081 => '꒦', + 3082 => '꒧', + 3083 => '꒨', + 3084 => '꒩', + 3085 => '꒪', + 3086 => '꒫', + 3087 => '꒬', + 3088 => '꒭', + 3089 => '꒮', + 3090 => '꒯', + 3091 => '꒰', + 3092 => '꒱', + 3093 => '꒲', + 3094 => '꒳', + 3095 => '꒴', + 3096 => '꒵', + 3097 => '꒶', + 3098 => '꒷', + 3099 => '꒸', + 3100 => '꒹', + 3101 => '꒺', + 3102 => '꒻', + 3103 => '꒼', + 3104 => '꒽', + 3105 => '꒾', + 3106 => '꒿', + 3107 => '꓀', + 3108 => '꓁', + 3109 => '꓂', + 3110 => '꓃', + 3111 => '꓄', + 3112 => '꓅', + 3113 => '꓆', + 3114 => '𐄷', + 3115 => '𐄸', + 3116 => '𐄹', + 3117 => '𐄺', + 3118 => '𐄻', + 3119 => '𐄼', + 3120 => '𐄽', + 3121 => '𐄾', + 3122 => '𐄿', + 3123 => '𐅹', + 3124 => '𐅺', + 3125 => '𐅻', + 3126 => '𐅼', + 3127 => '𐅽', + 3128 => '𐅾', + 3129 => '𐅿', + 3130 => '𐆀', + 3131 => '𐆁', + 3132 => '𐆂', + 3133 => '𐆃', + 3134 => '𐆄', + 3135 => '𐆅', + 3136 => '𐆆', + 3137 => '𐆇', + 3138 => '𐆈', + 3139 => '𐆉', + 3140 => '𐆐', + 3141 => '𐆑', + 3142 => '𐆒', + 3143 => '𐆓', + 3144 => '𐆔', + 3145 => '𐆕', + 3146 => '𐆖', + 3147 => '𐆗', + 3148 => '𐆘', + 3149 => '𐆙', + 3150 => '𐆚', + 3151 => '𐆛', + 3152 => '𐇐', + 3153 => '𐇑', + 3154 => '𐇒', + 3155 => '𐇓', + 3156 => '𐇔', + 3157 => '𐇕', + 3158 => '𐇖', + 3159 => '𐇗', + 3160 => '𐇘', + 3161 => '𐇙', + 3162 => '𐇚', + 3163 => '𐇛', + 3164 => '𐇜', + 3165 => '𐇝', + 3166 => '𐇞', + 3167 => '𐇟', + 3168 => '𐇠', + 3169 => '𐇡', + 3170 => '𐇢', + 3171 => '𐇣', + 3172 => '𐇤', + 3173 => '𐇥', + 3174 => '𐇦', + 3175 => '𐇧', + 3176 => '𐇨', + 3177 => '𐇩', + 3178 => '𐇪', + 3179 => '𐇫', + 3180 => '𐇬', + 3181 => '𐇭', + 3182 => '𐇮', + 3183 => '𐇯', + 3184 => '𐇰', + 3185 => '𐇱', + 3186 => '𐇲', + 3187 => '𐇳', + 3188 => '𐇴', + 3189 => '𐇵', + 3190 => '𐇶', + 3191 => '𐇷', + 3192 => '𐇸', + 3193 => '𐇹', + 3194 => '𐇺', + 3195 => '𐇻', + 3196 => '𐇼', + 3197 => '𝀀', + 3198 => '𝀁', + 3199 => '𝀂', + 3200 => '𝀃', + 3201 => '𝀄', + 3202 => '𝀅', + 3203 => '𝀆', + 3204 => '𝀇', + 3205 => '𝀈', + 3206 => '𝀉', + 3207 => '𝀊', + 3208 => '𝀋', + 3209 => '𝀌', + 3210 => '𝀍', + 3211 => '𝀎', + 3212 => '𝀏', + 3213 => '𝀐', + 3214 => '𝀑', + 3215 => '𝀒', + 3216 => '𝀓', + 3217 => '𝀔', + 3218 => '𝀕', + 3219 => '𝀖', + 3220 => '𝀗', + 3221 => '𝀘', + 3222 => '𝀙', + 3223 => '𝀚', + 3224 => '𝀛', + 3225 => '𝀜', + 3226 => '𝀝', + 3227 => '𝀞', + 3228 => '𝀟', + 3229 => '𝀠', + 3230 => '𝀡', + 3231 => '𝀢', + 3232 => '𝀣', + 3233 => '𝀤', + 3234 => '𝀥', + 3235 => '𝀦', + 3236 => '𝀧', + 3237 => '𝀨', + 3238 => '𝀩', + 3239 => '𝀪', + 3240 => '𝀫', + 3241 => '𝀬', + 3242 => '𝀭', + 3243 => '𝀮', + 3244 => '𝀯', + 3245 => '𝀰', + 3246 => '𝀱', + 3247 => '𝀲', + 3248 => '𝀳', + 3249 => '𝀴', + 3250 => '𝀵', + 3251 => '𝀶', + 3252 => '𝀷', + 3253 => '𝀸', + 3254 => '𝀹', + 3255 => '𝀺', + 3256 => '𝀻', + 3257 => '𝀼', + 3258 => '𝀽', + 3259 => '𝀾', + 3260 => '𝀿', + 3261 => '𝁀', + 3262 => '𝁁', + 3263 => '𝁂', + 3264 => '𝁃', + 3265 => '𝁄', + 3266 => '𝁅', + 3267 => '𝁆', + 3268 => '𝁇', + 3269 => '𝁈', + 3270 => '𝁉', + 3271 => '𝁊', + 3272 => '𝁋', + 3273 => '𝁌', + 3274 => '𝁍', + 3275 => '𝁎', + 3276 => '𝁏', + 3277 => '𝁐', + 3278 => '𝁑', + 3279 => '𝁒', + 3280 => '𝁓', + 3281 => '𝁔', + 3282 => '𝁕', + 3283 => '𝁖', + 3284 => '𝁗', + 3285 => '𝁘', + 3286 => '𝁙', + 3287 => '𝁚', + 3288 => '𝁛', + 3289 => '𝁜', + 3290 => '𝁝', + 3291 => '𝁞', + 3292 => '𝁟', + 3293 => '𝁠', + 3294 => '𝁡', + 3295 => '𝁢', + 3296 => '𝁣', + 3297 => '𝁤', + 3298 => '𝁥', + 3299 => '𝁦', + 3300 => '𝁧', + 3301 => '𝁨', + 3302 => '𝁩', + 3303 => '𝁪', + 3304 => '𝁫', + 3305 => '𝁬', + 3306 => '𝁭', + 3307 => '𝁮', + 3308 => '𝁯', + 3309 => '𝁰', + 3310 => '𝁱', + 3311 => '𝁲', + 3312 => '𝁳', + 3313 => '𝁴', + 3314 => '𝁵', + 3315 => '𝁶', + 3316 => '𝁷', + 3317 => '𝁸', + 3318 => '𝁹', + 3319 => '𝁺', + 3320 => '𝁻', + 3321 => '𝁼', + 3322 => '𝁽', + 3323 => '𝁾', + 3324 => '𝁿', + 3325 => '𝂀', + 3326 => '𝂁', + 3327 => '𝂂', + 3328 => '𝂃', + 3329 => '𝂄', + 3330 => '𝂅', + 3331 => '𝂆', + 3332 => '𝂇', + 3333 => '𝂈', + 3334 => '𝂉', + 3335 => '𝂊', + 3336 => '𝂋', + 3337 => '𝂌', + 3338 => '𝂍', + 3339 => '𝂎', + 3340 => '𝂏', + 3341 => '𝂐', + 3342 => '𝂑', + 3343 => '𝂒', + 3344 => '𝂓', + 3345 => '𝂔', + 3346 => '𝂕', + 3347 => '𝂖', + 3348 => '𝂗', + 3349 => '𝂘', + 3350 => '𝂙', + 3351 => '𝂚', + 3352 => '𝂛', + 3353 => '𝂜', + 3354 => '𝂝', + 3355 => '𝂞', + 3356 => '𝂟', + 3357 => '𝂠', + 3358 => '𝂡', + 3359 => '𝂢', + 3360 => '𝂣', + 3361 => '𝂤', + 3362 => '𝂥', + 3363 => '𝂦', + 3364 => '𝂧', + 3365 => '𝂨', + 3366 => '𝂩', + 3367 => '𝂪', + 3368 => '𝂫', + 3369 => '𝂬', + 3370 => '𝂭', + 3371 => '𝂮', + 3372 => '𝂯', + 3373 => '𝂰', + 3374 => '𝂱', + 3375 => '𝂲', + 3376 => '𝂳', + 3377 => '𝂴', + 3378 => '𝂵', + 3379 => '𝂶', + 3380 => '𝂷', + 3381 => '𝂸', + 3382 => '𝂹', + 3383 => '𝂺', + 3384 => '𝂻', + 3385 => '𝂼', + 3386 => '𝂽', + 3387 => '𝂾', + 3388 => '𝂿', + 3389 => '𝃀', + 3390 => '𝃁', + 3391 => '𝃂', + 3392 => '𝃃', + 3393 => '𝃄', + 3394 => '𝃅', + 3395 => '𝃆', + 3396 => '𝃇', + 3397 => '𝃈', + 3398 => '𝃉', + 3399 => '𝃊', + 3400 => '𝃋', + 3401 => '𝃌', + 3402 => '𝃍', + 3403 => '𝃎', + 3404 => '𝃏', + 3405 => '𝃐', + 3406 => '𝃑', + 3407 => '𝃒', + 3408 => '𝃓', + 3409 => '𝃔', + 3410 => '𝃕', + 3411 => '𝃖', + 3412 => '𝃗', + 3413 => '𝃘', + 3414 => '𝃙', + 3415 => '𝃚', + 3416 => '𝃛', + 3417 => '𝃜', + 3418 => '𝃝', + 3419 => '𝃞', + 3420 => '𝃟', + 3421 => '𝃠', + 3422 => '𝃡', + 3423 => '𝃢', + 3424 => '𝃣', + 3425 => '𝃤', + 3426 => '𝃥', + 3427 => '𝃦', + 3428 => '𝃧', + 3429 => '𝃨', + 3430 => '𝃩', + 3431 => '𝃪', + 3432 => '𝃫', + 3433 => '𝃬', + 3434 => '𝃭', + 3435 => '𝃮', + 3436 => '𝃯', + 3437 => '𝃰', + 3438 => '𝃱', + 3439 => '𝃲', + 3440 => '𝃳', + 3441 => '𝃴', + 3442 => '𝃵', + 3443 => '𝄀', + 3444 => '𝄁', + 3445 => '𝄂', + 3446 => '𝄃', + 3447 => '𝄄', + 3448 => '𝄅', + 3449 => '𝄆', + 3450 => '𝄇', + 3451 => '𝄈', + 3452 => '𝄉', + 3453 => '𝄊', + 3454 => '𝄋', + 3455 => '𝄌', + 3456 => '𝄍', + 3457 => '𝄎', + 3458 => '𝄏', + 3459 => '𝄐', + 3460 => '𝄑', + 3461 => '𝄒', + 3462 => '𝄓', + 3463 => '𝄔', + 3464 => '𝄕', + 3465 => '𝄖', + 3466 => '𝄗', + 3467 => '𝄘', + 3468 => '𝄙', + 3469 => '𝄚', + 3470 => '𝄛', + 3471 => '𝄜', + 3472 => '𝄝', + 3473 => '𝄞', + 3474 => '𝄟', + 3475 => '𝄠', + 3476 => '𝄡', + 3477 => '𝄢', + 3478 => '𝄣', + 3479 => '𝄤', + 3480 => '𝄥', + 3481 => '𝄦', + 3482 => '♭', + 3483 => '♮', + 3484 => '♯', + 3485 => '𝄪', + 3486 => '𝄫', + 3487 => '𝄬', + 3488 => '𝄭', + 3489 => '𝄮', + 3490 => '𝄯', + 3491 => '𝄰', + 3492 => '𝄱', + 3493 => '𝄲', + 3494 => '𝄳', + 3495 => '𝄴', + 3496 => '𝄵', + 3497 => '𝄶', + 3498 => '𝄷', + 3499 => '𝄸', + 3500 => '𝄹', + 3501 => '𝄩', + 3502 => '𝄺', + 3503 => '𝄻', + 3504 => '𝄼', + 3505 => '𝄽', + 3506 => '𝄾', + 3507 => '𝄿', + 3508 => '𝅀', + 3509 => '𝅁', + 3510 => '𝅂', + 3511 => '𝅃', + 3512 => '𝅄', + 3513 => '𝅅', + 3514 => '𝅆', + 3515 => '𝅇', + 3516 => '𝅈', + 3517 => '𝅉', + 3518 => '𝅊', + 3519 => '𝅋', + 3520 => '𝅌', + 3521 => '𝅍', + 3522 => '𝅎', + 3523 => '𝅏', + 3524 => '𝅐', + 3525 => '𝅑', + 3526 => '𝅒', + 3527 => '𝅓', + 3528 => '𝅔', + 3529 => '𝅕', + 3530 => '𝅖', + 3531 => '𝅗', + 3532 => '𝅘', + 3533 => '𝅙', + 3534 => '𝅚', + 3535 => '𝅛', + 3536 => '𝅜', + 3537 => '𝅝', + 3538 => '𝅪', + 3539 => '𝅫', + 3540 => '𝅬', + 3541 => '𝆃', + 3542 => '𝆄', + 3543 => '𝆌', + 3544 => '𝆍', + 3545 => '𝆎', + 3546 => '𝆏', + 3547 => '𝆐', + 3548 => '𝆑', + 3549 => '𝆒', + 3550 => '𝆓', + 3551 => '𝆔', + 3552 => '𝆕', + 3553 => '𝆖', + 3554 => '𝆗', + 3555 => '𝆘', + 3556 => '𝆙', + 3557 => '𝆚', + 3558 => '𝆛', + 3559 => '𝆜', + 3560 => '𝆝', + 3561 => '𝆞', + 3562 => '𝆟', + 3563 => '𝆠', + 3564 => '𝆡', + 3565 => '𝆢', + 3566 => '𝆣', + 3567 => '𝆤', + 3568 => '𝆥', + 3569 => '𝆦', + 3570 => '𝆧', + 3571 => '𝆨', + 3572 => '𝆩', + 3573 => '𝆮', + 3574 => '𝆯', + 3575 => '𝆰', + 3576 => '𝆱', + 3577 => '𝆲', + 3578 => '𝆳', + 3579 => '𝆴', + 3580 => '𝆵', + 3581 => '𝆶', + 3582 => '𝆷', + 3583 => '𝆸', + 3584 => '𝆹', + 3585 => '𝆺', + 3586 => '𝇁', + 3587 => '𝇂', + 3588 => '𝇃', + 3589 => '𝇄', + 3590 => '𝇅', + 3591 => '𝇆', + 3592 => '𝇇', + 3593 => '𝇈', + 3594 => '𝇉', + 3595 => '𝇊', + 3596 => '𝇋', + 3597 => '𝇌', + 3598 => '𝇍', + 3599 => '𝇎', + 3600 => '𝇏', + 3601 => '𝇐', + 3602 => '𝇑', + 3603 => '𝇒', + 3604 => '𝇓', + 3605 => '𝇔', + 3606 => '𝇕', + 3607 => '𝇖', + 3608 => '𝇗', + 3609 => '𝇘', + 3610 => '𝇙', + 3611 => '𝇚', + 3612 => '𝇛', + 3613 => '𝇜', + 3614 => '𝇝', + 3615 => '𝈀', + 3616 => '𝈁', + 3617 => '𝈂', + 3618 => '𝈃', + 3619 => '𝈄', + 3620 => '𝈅', + 3621 => '𝈆', + 3622 => '𝈇', + 3623 => '𝈈', + 3624 => '𝈉', + 3625 => '𝈊', + 3626 => '𝈋', + 3627 => '𝈌', + 3628 => '𝈍', + 3629 => '𝈎', + 3630 => '𝈏', + 3631 => '𝈐', + 3632 => '𝈑', + 3633 => '𝈒', + 3634 => '𝈓', + 3635 => '𝈔', + 3636 => '𝈕', + 3637 => '𝈖', + 3638 => '𝈗', + 3639 => '𝈘', + 3640 => '𝈙', + 3641 => '𝈚', + 3642 => '𝈛', + 3643 => '𝈜', + 3644 => '𝈝', + 3645 => '𝈞', + 3646 => '𝈟', + 3647 => '𝈠', + 3648 => '𝈡', + 3649 => '𝈢', + 3650 => '𝈣', + 3651 => '𝈤', + 3652 => '𝈥', + 3653 => '𝈦', + 3654 => '𝈧', + 3655 => '𝈨', + 3656 => '𝈩', + 3657 => '𝈪', + 3658 => '𝈫', + 3659 => '𝈬', + 3660 => '𝈭', + 3661 => '𝈮', + 3662 => '𝈯', + 3663 => '𝈰', + 3664 => '𝈱', + 3665 => '𝈲', + 3666 => '𝈳', + 3667 => '𝈴', + 3668 => '𝈵', + 3669 => '𝈶', + 3670 => '𝈷', + 3671 => '𝈸', + 3672 => '𝈹', + 3673 => '𝈺', + 3674 => '𝈻', + 3675 => '𝈼', + 3676 => '𝈽', + 3677 => '𝈾', + 3678 => '𝈿', + 3679 => '𝉀', + 3680 => '𝉁', + 3681 => '𝉅', + 3682 => '🀀', + 3683 => '🀁', + 3684 => '🀂', + 3685 => '🀃', + 3686 => '🀄', + 3687 => '🀅', + 3688 => '🀆', + 3689 => '🀇', + 3690 => '🀈', + 3691 => '🀉', + 3692 => '🀊', + 3693 => '🀋', + 3694 => '🀌', + 3695 => '🀍', + 3696 => '🀎', + 3697 => '🀏', + 3698 => '🀐', + 3699 => '🀑', + 3700 => '🀒', + 3701 => '🀓', + 3702 => '🀔', + 3703 => '🀕', + 3704 => '🀖', + 3705 => '🀗', + 3706 => '🀘', + 3707 => '🀙', + 3708 => '🀚', + 3709 => '🀛', + 3710 => '🀜', + 3711 => '🀝', + 3712 => '🀞', + 3713 => '🀟', + 3714 => '🀠', + 3715 => '🀡', + 3716 => '🀢', + 3717 => '🀣', + 3718 => '🀤', + 3719 => '🀥', + 3720 => '🀦', + 3721 => '🀧', + 3722 => '🀨', + 3723 => '🀩', + 3724 => '🀪', + 3725 => '🀫', + 3726 => '🀰', + 3727 => '🀱', + 3728 => '🀲', + 3729 => '🀳', + 3730 => '🀴', + 3731 => '🀵', + 3732 => '🀶', + 3733 => '🀷', + 3734 => '🀸', + 3735 => '🀹', + 3736 => '🀺', + 3737 => '🀻', + 3738 => '🀼', + 3739 => '🀽', + 3740 => '🀾', + 3741 => '🀿', + 3742 => '🁀', + 3743 => '🁁', + 3744 => '🁂', + 3745 => '🁃', + 3746 => '🁄', + 3747 => '🁅', + 3748 => '🁆', + 3749 => '🁇', + 3750 => '🁈', + 3751 => '🁉', + 3752 => '🁊', + 3753 => '🁋', + 3754 => '🁌', + 3755 => '🁍', + 3756 => '🁎', + 3757 => '🁏', + 3758 => '🁐', + 3759 => '🁑', + 3760 => '🁒', + 3761 => '🁓', + 3762 => '🁔', + 3763 => '🁕', + 3764 => '🁖', + 3765 => '🁗', + 3766 => '🁘', + 3767 => '🁙', + 3768 => '🁚', + 3769 => '🁛', + 3770 => '🁜', + 3771 => '🁝', + 3772 => '🁞', + 3773 => '🁟', + 3774 => '🁠', + 3775 => '🁡', + 3776 => '🁢', + 3777 => '🁣', + 3778 => '🁤', + 3779 => '🁥', + 3780 => '🁦', + 3781 => '🁧', + 3782 => '🁨', + 3783 => '🁩', + 3784 => '🁪', + 3785 => '🁫', + 3786 => '🁬', + 3787 => '🁭', + 3788 => '🁮', + 3789 => '🁯', + 3790 => '🁰', + 3791 => '🁱', + 3792 => '🁲', + 3793 => '🁳', + 3794 => '🁴', + 3795 => '🁵', + 3796 => '🁶', + 3797 => '🁷', + 3798 => '🁸', + 3799 => '🁹', + 3800 => '🁺', + 3801 => '🁻', + 3802 => '🁼', + 3803 => '🁽', + 3804 => '🁾', + 3805 => '🁿', + 3806 => '🂀', + 3807 => '🂁', + 3808 => '🂂', + 3809 => '🂃', + 3810 => '🂄', + 3811 => '🂅', + 3812 => '🂆', + 3813 => '🂇', + 3814 => '🂈', + 3815 => '🂉', + 3816 => '🂊', + 3817 => '🂋', + 3818 => '🂌', + 3819 => '🂍', + 3820 => '🂎', + 3821 => '🂏', + 3822 => '🂐', + 3823 => '🂑', + 3824 => '🂒', + 3825 => '🂓', + 3826 => '🂠', + 3827 => '🂡', + 3828 => '🂢', + 3829 => '🂣', + 3830 => '🂤', + 3831 => '🂥', + 3832 => '🂦', + 3833 => '🂧', + 3834 => '🂨', + 3835 => '🂩', + 3836 => '🂪', + 3837 => '🂫', + 3838 => '🂬', + 3839 => '🂭', + 3840 => '🂮', + 3841 => '🂱', + 3842 => '🂲', + 3843 => '🂳', + 3844 => '🂴', + 3845 => '🂵', + 3846 => '🂶', + 3847 => '🂷', + 3848 => '🂸', + 3849 => '🂹', + 3850 => '🂺', + 3851 => '🂻', + 3852 => '🂼', + 3853 => '🂽', + 3854 => '🂾', + 3855 => '🃁', + 3856 => '🃂', + 3857 => '🃃', + 3858 => '🃄', + 3859 => '🃅', + 3860 => '🃆', + 3861 => '🃇', + 3862 => '🃈', + 3863 => '🃉', + 3864 => '🃊', + 3865 => '🃋', + 3866 => '🃌', + 3867 => '🃍', + 3868 => '🃎', + 3869 => '🃏', + 3870 => '🃑', + 3871 => '🃒', + 3872 => '🃓', + 3873 => '🃔', + 3874 => '🃕', + 3875 => '🃖', + 3876 => '🃗', + 3877 => '🃘', + 3878 => '🃙', + 3879 => '🃚', + 3880 => '🃛', + 3881 => '🃜', + 3882 => '🃝', + 3883 => '🃞', + 3884 => '🃟', + 3885 => '🌀', + 3886 => '🌁', + 3887 => '🌂', + 3888 => '🌃', + 3889 => '🌄', + 3890 => '🌅', + 3891 => '🌆', + 3892 => '🌇', + 3893 => '🌈', + 3894 => '🌉', + 3895 => '🌊', + 3896 => '🌋', + 3897 => '🌌', + 3898 => '🌍', + 3899 => '🌎', + 3900 => '🌏', + 3901 => '🌐', + 3902 => '🌑', + 3903 => '🌒', + 3904 => '🌓', + 3905 => '🌔', + 3906 => '🌕', + 3907 => '🌖', + 3908 => '🌗', + 3909 => '🌘', + 3910 => '🌙', + 3911 => '🌚', + 3912 => '🌛', + 3913 => '🌜', + 3914 => '🌝', + 3915 => '🌞', + 3916 => '🌟', + 3917 => '🌠', + 3918 => '🌰', + 3919 => '🌱', + 3920 => '🌲', + 3921 => '🌳', + 3922 => '🌴', + 3923 => '🌵', + 3924 => '🌷', + 3925 => '🌸', + 3926 => '🌹', + 3927 => '🌺', + 3928 => '🌻', + 3929 => '🌼', + 3930 => '🌽', + 3931 => '🌾', + 3932 => '🌿', + 3933 => '🍀', + 3934 => '🍁', + 3935 => '🍂', + 3936 => '🍃', + 3937 => '🍄', + 3938 => '🍅', + 3939 => '🍆', + 3940 => '🍇', + 3941 => '🍈', + 3942 => '🍉', + 3943 => '🍊', + 3944 => '🍋', + 3945 => '🍌', + 3946 => '🍍', + 3947 => '🍎', + 3948 => '🍏', + 3949 => '🍐', + 3950 => '🍑', + 3951 => '🍒', + 3952 => '🍓', + 3953 => '🍔', + 3954 => '🍕', + 3955 => '🍖', + 3956 => '🍗', + 3957 => '🍘', + 3958 => '🍙', + 3959 => '🍚', + 3960 => '🍛', + 3961 => '🍜', + 3962 => '🍝', + 3963 => '🍞', + 3964 => '🍟', + 3965 => '🍠', + 3966 => '🍡', + 3967 => '🍢', + 3968 => '🍣', + 3969 => '🍤', + 3970 => '🍥', + 3971 => '🍦', + 3972 => '🍧', + 3973 => '🍨', + 3974 => '🍩', + 3975 => '🍪', + 3976 => '🍫', + 3977 => '🍬', + 3978 => '🍭', + 3979 => '🍮', + 3980 => '🍯', + 3981 => '🍰', + 3982 => '🍱', + 3983 => '🍲', + 3984 => '🍳', + 3985 => '🍴', + 3986 => '🍵', + 3987 => '🍶', + 3988 => '🍷', + 3989 => '🍸', + 3990 => '🍹', + 3991 => '🍺', + 3992 => '🍻', + 3993 => '🍼', + 3994 => '🎀', + 3995 => '🎁', + 3996 => '🎂', + 3997 => '🎃', + 3998 => '🎄', + 3999 => '🎅', + 4000 => '🎆', + 4001 => '🎇', + 4002 => '🎈', + 4003 => '🎉', + 4004 => '🎊', + 4005 => '🎋', + 4006 => '🎌', + 4007 => '🎍', + 4008 => '🎎', + 4009 => '🎏', + 4010 => '🎐', + 4011 => '🎑', + 4012 => '🎒', + 4013 => '🎓', + 4014 => '🎠', + 4015 => '🎡', + 4016 => '🎢', + 4017 => '🎣', + 4018 => '🎤', + 4019 => '🎥', + 4020 => '🎦', + 4021 => '🎧', + 4022 => '🎨', + 4023 => '🎩', + 4024 => '🎪', + 4025 => '🎫', + 4026 => '🎬', + 4027 => '🎭', + 4028 => '🎮', + 4029 => '🎯', + 4030 => '🎰', + 4031 => '🎱', + 4032 => '🎲', + 4033 => '🎳', + 4034 => '🎴', + 4035 => '🎵', + 4036 => '🎶', + 4037 => '🎷', + 4038 => '🎸', + 4039 => '🎹', + 4040 => '🎺', + 4041 => '🎻', + 4042 => '🎼', + 4043 => '🎽', + 4044 => '🎾', + 4045 => '🎿', + 4046 => '🏀', + 4047 => '🏁', + 4048 => '🏂', + 4049 => '🏃', + 4050 => '🏄', + 4051 => '🏆', + 4052 => '🏇', + 4053 => '🏈', + 4054 => '🏉', + 4055 => '🏊', + 4056 => '🏠', + 4057 => '🏡', + 4058 => '🏢', + 4059 => '🏣', + 4060 => '🏤', + 4061 => '🏥', + 4062 => '🏦', + 4063 => '🏧', + 4064 => '🏨', + 4065 => '🏩', + 4066 => '🏪', + 4067 => '🏫', + 4068 => '🏬', + 4069 => '🏭', + 4070 => '🏮', + 4071 => '🏯', + 4072 => '🏰', + 4073 => '🐀', + 4074 => '🐁', + 4075 => '🐂', + 4076 => '🐃', + 4077 => '🐄', + 4078 => '🐅', + 4079 => '🐆', + 4080 => '🐇', + 4081 => '🐈', + 4082 => '🐉', + 4083 => '🐊', + 4084 => '🐋', + 4085 => '🐌', + 4086 => '🐍', + 4087 => '🐎', + 4088 => '🐏', + 4089 => '🐐', + 4090 => '🐑', + 4091 => '🐒', + 4092 => '🐓', + 4093 => '🐔', + 4094 => '🐕', + 4095 => '🐖', + 4096 => '🐗', + 4097 => '🐘', + 4098 => '🐙', + 4099 => '🐚', + 4100 => '🐛', + 4101 => '🐜', + 4102 => '🐝', + 4103 => '🐞', + 4104 => '🐟', + 4105 => '🐠', + 4106 => '🐡', + 4107 => '🐢', + 4108 => '🐣', + 4109 => '🐤', + 4110 => '🐥', + 4111 => '🐦', + 4112 => '🐧', + 4113 => '🐨', + 4114 => '🐩', + 4115 => '🐪', + 4116 => '🐫', + 4117 => '🐬', + 4118 => '🐭', + 4119 => '🐮', + 4120 => '🐯', + 4121 => '🐰', + 4122 => '🐱', + 4123 => '🐲', + 4124 => '🐳', + 4125 => '🐴', + 4126 => '🐵', + 4127 => '🐶', + 4128 => '🐷', + 4129 => '🐸', + 4130 => '🐹', + 4131 => '🐺', + 4132 => '🐻', + 4133 => '🐼', + 4134 => '🐽', + 4135 => '🐾', + 4136 => '👀', + 4137 => '👂', + 4138 => '👃', + 4139 => '👄', + 4140 => '👅', + 4141 => '👆', + 4142 => '👇', + 4143 => '👈', + 4144 => '👉', + 4145 => '👊', + 4146 => '👋', + 4147 => '👌', + 4148 => '👍', + 4149 => '👎', + 4150 => '👏', + 4151 => '👐', + 4152 => '👑', + 4153 => '👒', + 4154 => '👓', + 4155 => '👔', + 4156 => '👕', + 4157 => '👖', + 4158 => '👗', + 4159 => '👘', + 4160 => '👙', + 4161 => '👚', + 4162 => '👛', + 4163 => '👜', + 4164 => '👝', + 4165 => '👞', + 4166 => '👟', + 4167 => '👠', + 4168 => '👡', + 4169 => '👢', + 4170 => '👣', + 4171 => '👤', + 4172 => '👥', + 4173 => '👦', + 4174 => '👧', + 4175 => '👨', + 4176 => '👩', + 4177 => '👪', + 4178 => '👫', + 4179 => '👬', + 4180 => '👭', + 4181 => '👮', + 4182 => '👯', + 4183 => '👰', + 4184 => '👱', + 4185 => '👲', + 4186 => '👳', + 4187 => '👴', + 4188 => '👵', + 4189 => '👶', + 4190 => '👷', + 4191 => '👸', + 4192 => '👹', + 4193 => '👺', + 4194 => '👻', + 4195 => '👼', + 4196 => '👽', + 4197 => '👾', + 4198 => '👿', + 4199 => '💀', + 4200 => '💁', + 4201 => '💂', + 4202 => '💃', + 4203 => '💄', + 4204 => '💅', + 4205 => '💆', + 4206 => '💇', + 4207 => '💈', + 4208 => '💉', + 4209 => '💊', + 4210 => '💋', + 4211 => '💌', + 4212 => '💍', + 4213 => '💎', + 4214 => '💏', + 4215 => '💐', + 4216 => '💑', + 4217 => '💒', + 4218 => '💓', + 4219 => '💔', + 4220 => '💕', + 4221 => '💖', + 4222 => '💗', + 4223 => '💘', + 4224 => '💙', + 4225 => '💚', + 4226 => '💛', + 4227 => '💜', + 4228 => '💝', + 4229 => '💞', + 4230 => '💟', + 4231 => '💠', + 4232 => '💡', + 4233 => '💢', + 4234 => '💣', + 4235 => '💤', + 4236 => '💥', + 4237 => '💦', + 4238 => '💧', + 4239 => '💨', + 4240 => '💩', + 4241 => '💪', + 4242 => '💫', + 4243 => '💬', + 4244 => '💭', + 4245 => '💮', + 4246 => '💯', + 4247 => '💰', + 4248 => '💱', + 4249 => '💲', + 4250 => '💳', + 4251 => '💴', + 4252 => '💵', + 4253 => '💶', + 4254 => '💷', + 4255 => '💸', + 4256 => '💹', + 4257 => '💺', + 4258 => '💻', + 4259 => '💼', + 4260 => '💽', + 4261 => '💾', + 4262 => '💿', + 4263 => '📀', + 4264 => '📁', + 4265 => '📂', + 4266 => '📃', + 4267 => '📄', + 4268 => '📅', + 4269 => '📆', + 4270 => '📇', + 4271 => '📈', + 4272 => '📉', + 4273 => '📊', + 4274 => '📋', + 4275 => '📌', + 4276 => '📍', + 4277 => '📎', + 4278 => '📏', + 4279 => '📐', + 4280 => '📑', + 4281 => '📒', + 4282 => '📓', + 4283 => '📔', + 4284 => '📕', + 4285 => '📖', + 4286 => '📗', + 4287 => '📘', + 4288 => '📙', + 4289 => '📚', + 4290 => '📛', + 4291 => '📜', + 4292 => '📝', + 4293 => '📞', + 4294 => '📟', + 4295 => '📠', + 4296 => '📡', + 4297 => '📢', + 4298 => '📣', + 4299 => '📤', + 4300 => '📥', + 4301 => '📦', + 4302 => '📧', + 4303 => '📨', + 4304 => '📩', + 4305 => '📪', + 4306 => '📫', + 4307 => '📬', + 4308 => '📭', + 4309 => '📮', + 4310 => '📯', + 4311 => '📰', + 4312 => '📱', + 4313 => '📲', + 4314 => '📳', + 4315 => '📴', + 4316 => '📵', + 4317 => '📶', + 4318 => '📷', + 4319 => '📹', + 4320 => '📺', + 4321 => '📻', + 4322 => '📼', + 4323 => '🔀', + 4324 => '🔁', + 4325 => '🔂', + 4326 => '🔃', + 4327 => '🔄', + 4328 => '🔅', + 4329 => '🔆', + 4330 => '🔇', + 4331 => '🔈', + 4332 => '🔉', + 4333 => '🔊', + 4334 => '🔋', + 4335 => '🔌', + 4336 => '🔍', + 4337 => '🔎', + 4338 => '🔏', + 4339 => '🔐', + 4340 => '🔑', + 4341 => '🔒', + 4342 => '🔓', + 4343 => '🔔', + 4344 => '🔕', + 4345 => '🔖', + 4346 => '🔗', + 4347 => '🔘', + 4348 => '🔙', + 4349 => '🔚', + 4350 => '🔛', + 4351 => '🔜', + 4352 => '🔝', + 4353 => '🔞', + 4354 => '🔟', + 4355 => '🔠', + 4356 => '🔡', + 4357 => '🔢', + 4358 => '🔣', + 4359 => '🔤', + 4360 => '🔥', + 4361 => '🔦', + 4362 => '🔧', + 4363 => '🔨', + 4364 => '🔩', + 4365 => '🔪', + 4366 => '🔫', + 4367 => '🔬', + 4368 => '🔭', + 4369 => '🔮', + 4370 => '🔯', + 4371 => '🔰', + 4372 => '🔱', + 4373 => '🔲', + 4374 => '🔳', + 4375 => '🔴', + 4376 => '🔵', + 4377 => '🔶', + 4378 => '🔷', + 4379 => '🔸', + 4380 => '🔹', + 4381 => '🔺', + 4382 => '🔻', + 4383 => '🔼', + 4384 => '🔽', + 4385 => '🕐', + 4386 => '🕑', + 4387 => '🕒', + 4388 => '🕓', + 4389 => '🕔', + 4390 => '🕕', + 4391 => '🕖', + 4392 => '🕗', + 4393 => '🕘', + 4394 => '🕙', + 4395 => '🕚', + 4396 => '🕛', + 4397 => '🕜', + 4398 => '🕝', + 4399 => '🕞', + 4400 => '🕟', + 4401 => '🕠', + 4402 => '🕡', + 4403 => '🕢', + 4404 => '🕣', + 4405 => '🕤', + 4406 => '🕥', + 4407 => '🕦', + 4408 => '🕧', + 4409 => '🗻', + 4410 => '🗼', + 4411 => '🗽', + 4412 => '🗾', + 4413 => '🗿', + 4414 => '😁', + 4415 => '😂', + 4416 => '😃', + 4417 => '😄', + 4418 => '😅', + 4419 => '😆', + 4420 => '😇', + 4421 => '😈', + 4422 => '😉', + 4423 => '😊', + 4424 => '😋', + 4425 => '😌', + 4426 => '😍', + 4427 => '😎', + 4428 => '😏', + 4429 => '😐', + 4430 => '😒', + 4431 => '😓', + 4432 => '😔', + 4433 => '😖', + 4434 => '😘', + 4435 => '😚', + 4436 => '😜', + 4437 => '😝', + 4438 => '😞', + 4439 => '😠', + 4440 => '😡', + 4441 => '😢', + 4442 => '😣', + 4443 => '😤', + 4444 => '😥', + 4445 => '😨', + 4446 => '😩', + 4447 => '😪', + 4448 => '😫', + 4449 => '😭', + 4450 => '😰', + 4451 => '😱', + 4452 => '😲', + 4453 => '😳', + 4454 => '😵', + 4455 => '😶', + 4456 => '😷', + 4457 => '😸', + 4458 => '😹', + 4459 => '😺', + 4460 => '😻', + 4461 => '😼', + 4462 => '😽', + 4463 => '😾', + 4464 => '😿', + 4465 => '🙀', + 4466 => '🙅', + 4467 => '🙆', + 4468 => '🙇', + 4469 => '🙈', + 4470 => '🙉', + 4471 => '🙊', + 4472 => '🙋', + 4473 => '🙌', + 4474 => '🙍', + 4475 => '🙎', + 4476 => '🙏', + 4477 => '🚀', + 4478 => '🚁', + 4479 => '🚂', + 4480 => '🚃', + 4481 => '🚄', + 4482 => '🚅', + 4483 => '🚆', + 4484 => '🚇', + 4485 => '🚈', + 4486 => '🚉', + 4487 => '🚊', + 4488 => '🚋', + 4489 => '🚌', + 4490 => '🚍', + 4491 => '🚎', + 4492 => '🚏', + 4493 => '🚐', + 4494 => '🚑', + 4495 => '🚒', + 4496 => '🚓', + 4497 => '🚔', + 4498 => '🚕', + 4499 => '🚖', + 4500 => '🚗', + 4501 => '🚘', + 4502 => '🚙', + 4503 => '🚚', + 4504 => '🚛', + 4505 => '🚜', + 4506 => '🚝', + 4507 => '🚞', + 4508 => '🚟', + 4509 => '🚠', + 4510 => '🚡', + 4511 => '🚢', + 4512 => '🚣', + 4513 => '🚤', + 4514 => '🚥', + 4515 => '🚦', + 4516 => '🚧', + 4517 => '🚨', + 4518 => '🚩', + 4519 => '🚪', + 4520 => '🚫', + 4521 => '🚬', + 4522 => '🚭', + 4523 => '🚮', + 4524 => '🚯', + 4525 => '🚰', + 4526 => '🚱', + 4527 => '🚲', + 4528 => '🚳', + 4529 => '🚴', + 4530 => '🚵', + 4531 => '🚶', + 4532 => '🚷', + 4533 => '🚸', + 4534 => '🚹', + 4535 => '🚺', + 4536 => '🚻', + 4537 => '🚼', + 4538 => '🚽', + 4539 => '🚾', + 4540 => '🚿', + 4541 => '🛀', + 4542 => '🛁', + 4543 => '🛂', + 4544 => '🛃', + 4545 => '🛄', + 4546 => '🛅', + 4547 => '🜀', + 4548 => '🜁', + 4549 => '🜂', + 4550 => '🜃', + 4551 => '🜄', + 4552 => '🜅', + 4553 => '🜆', + 4554 => '🜇', + 4555 => '🜈', + 4556 => '🜉', + 4557 => '🜊', + 4558 => '🜋', + 4559 => '🜌', + 4560 => '🜍', + 4561 => '🜎', + 4562 => '🜏', + 4563 => '🜐', + 4564 => '🜑', + 4565 => '🜒', + 4566 => '🜓', + 4567 => '🜔', + 4568 => '🜕', + 4569 => '🜖', + 4570 => '🜗', + 4571 => '🜘', + 4572 => '🜙', + 4573 => '🜚', + 4574 => '🜛', + 4575 => '🜜', + 4576 => '🜝', + 4577 => '🜞', + 4578 => '🜟', + 4579 => '🜠', + 4580 => '🜡', + 4581 => '🜢', + 4582 => '🜣', + 4583 => '🜤', + 4584 => '🜥', + 4585 => '🜦', + 4586 => '🜧', + 4587 => '🜨', + 4588 => '🜩', + 4589 => '🜪', + 4590 => '🜫', + 4591 => '🜬', + 4592 => '🜭', + 4593 => '🜮', + 4594 => '🜯', + 4595 => '🜰', + 4596 => '🜱', + 4597 => '🜲', + 4598 => '🜳', + 4599 => '🜴', + 4600 => '🜵', + 4601 => '🜶', + 4602 => '🜷', + 4603 => '🜸', + 4604 => '🜹', + 4605 => '🜺', + 4606 => '🜻', + 4607 => '🜼', + 4608 => '🜽', + 4609 => '🜾', + 4610 => '🜿', + 4611 => '🝀', + 4612 => '🝁', + 4613 => '🝂', + 4614 => '🝃', + 4615 => '🝄', + 4616 => '🝅', + 4617 => '🝆', + 4618 => '🝇', + 4619 => '🝈', + 4620 => '🝉', + 4621 => '🝊', + 4622 => '🝋', + 4623 => '🝌', + 4624 => '🝍', + 4625 => '🝎', + 4626 => '🝏', + 4627 => '🝐', + 4628 => '🝑', + 4629 => '🝒', + 4630 => '🝓', + 4631 => '🝔', + 4632 => '🝕', + 4633 => '🝖', + 4634 => '🝗', + 4635 => '🝘', + 4636 => '🝙', + 4637 => '🝚', + 4638 => '🝛', + 4639 => '🝜', + 4640 => '🝝', + 4641 => '🝞', + 4642 => '🝟', + 4643 => '🝠', + 4644 => '🝡', + 4645 => '🝢', + 4646 => '🝣', + 4647 => '🝤', + 4648 => '🝥', + 4649 => '🝦', + 4650 => '🝧', + 4651 => '🝨', + 4652 => '🝩', + 4653 => '🝪', + 4654 => '🝫', + 4655 => '🝬', + 4656 => '🝭', + 4657 => '🝮', + 4658 => '🝯', + 4659 => '🝰', + 4660 => '🝱', + 4661 => '🝲', + 4662 => '🝳', + 4663 => '㆐', + 4664 => '㆑', + 4665 => '', + 4666 => '�', + 4667 => '৴', + 4668 => '৵', + 4669 => '৶', + 4670 => '৷', + 4671 => '৸', + 4672 => '৹', + 4673 => '୲', + 4674 => '୳', + 4675 => '୴', + 4676 => '୵', + 4677 => '୶', + 4678 => '୷', + 4679 => '꠰', + 4680 => '꠱', + 4681 => '꠲', + 4682 => '꠳', + 4683 => '꠴', + 4684 => '꠵', + 4685 => '௰', + 4686 => '௱', + 4687 => '௲', + 4688 => '൰', + 4689 => '൱', + 4690 => '൲', + 4691 => '൳', + 4692 => '൴', + 4693 => '൵', + 4694 => '፲', + 4695 => '፳', + 4696 => '፴', + 4697 => '፵', + 4698 => '፶', + 4699 => '፷', + 4700 => '፸', + 4701 => '፹', + 4702 => '፺', + 4703 => '፻', + 4704 => '፼', + 4705 => 'ↀ', + 4706 => 'ↁ', + 4707 => 'ↂ', + 4708 => 'ↆ', + 4709 => 'ↇ', + 4710 => 'ↈ', + 4711 => '𐹩', + 4712 => '𐹪', + 4713 => '𐹫', + 4714 => '𐹬', + 4715 => '𐹭', + 4716 => '𐹮', + 4717 => '𐹯', + 4718 => '𐹰', + 4719 => '𐹱', + 4720 => '𐹲', + 4721 => '𐹳', + 4722 => '𐹴', + 4723 => '𐹵', + 4724 => '𐹶', + 4725 => '𐹷', + 4726 => '𐹸', + 4727 => '𐹹', + 4728 => '𐹺', + 4729 => '𐹻', + 4730 => '𐹼', + 4731 => '𐹽', + 4732 => '𐹾', + 4733 => '⳽', + 4734 => '𐌢', + 4735 => '𐌣', + 4736 => '𐄐', + 4737 => '𐄑', + 4738 => '𐄒', + 4739 => '𐄓', + 4740 => '𐄔', + 4741 => '𐄕', + 4742 => '𐄖', + 4743 => '𐄗', + 4744 => '𐄘', + 4745 => '𐄙', + 4746 => '𐄚', + 4747 => '𐄛', + 4748 => '𐄜', + 4749 => '𐄝', + 4750 => '𐄞', + 4751 => '𐄟', + 4752 => '𐄠', + 4753 => '𐄡', + 4754 => '𐄢', + 4755 => '𐄣', + 4756 => '𐄤', + 4757 => '𐄥', + 4758 => '𐄦', + 4759 => '𐄧', + 4760 => '𐄨', + 4761 => '𐄩', + 4762 => '𐄪', + 4763 => '𐄫', + 4764 => '𐄬', + 4765 => '𐄭', + 4766 => '𐄮', + 4767 => '𐄯', + 4768 => '𐄰', + 4769 => '𐄱', + 4770 => '𐄲', + 4771 => '𐄳', + 4772 => '𐅀', + 4773 => '𐅁', + 4774 => '𐅄', + 4775 => '𐅅', + 4776 => '𐅆', + 4777 => '𐅇', + 4778 => '𐅉', + 4779 => '𐅊', + 4780 => '𐅋', + 4781 => '𐅌', + 4782 => '𐅍', + 4783 => '𐅎', + 4784 => '𐅐', + 4785 => '𐅑', + 4786 => '𐅒', + 4787 => '𐅓', + 4788 => '𐅔', + 4789 => '𐅕', + 4790 => '𐅖', + 4791 => '𐅗', + 4792 => '𐅠', + 4793 => '𐅡', + 4794 => '𐅢', + 4795 => '𐅣', + 4796 => '𐅤', + 4797 => '𐅥', + 4798 => '𐅦', + 4799 => '𐅧', + 4800 => '𐅨', + 4801 => '𐅩', + 4802 => '𐅪', + 4803 => '𐅫', + 4804 => '𐅬', + 4805 => '𐅭', + 4806 => '𐅮', + 4807 => '𐅯', + 4808 => '𐅰', + 4809 => '𐅱', + 4810 => '𐅲', + 4811 => '𐅴', + 4812 => '𐅵', + 4813 => '𐅶', + 4814 => '𐅷', + 4815 => '𐅸', + 4816 => '𐏓', + 4817 => '𐏔', + 4818 => '𐏕', + 4819 => '𐩾', + 4820 => '𐩿', + 4821 => '𐤗', + 4822 => '𐤘', + 4823 => '𐤙', + 4824 => '𐡛', + 4825 => '𐡜', + 4826 => '𐡝', + 4827 => '𐡞', + 4828 => '𐡟', + 4829 => '𐭜', + 4830 => '𐭝', + 4831 => '𐭞', + 4832 => '𐭟', + 4833 => '𐭼', + 4834 => '𐭽', + 4835 => '𐭾', + 4836 => '𐭿', + 4837 => '𑁛', + 4838 => '𑁜', + 4839 => '𑁝', + 4840 => '𑁞', + 4841 => '𑁟', + 4842 => '𑁠', + 4843 => '𑁡', + 4844 => '𑁢', + 4845 => '𑁣', + 4846 => '𑁤', + 4847 => '𑁥', + 4848 => '𐩄', + 4849 => '𐩅', + 4850 => '𐩆', + 4851 => '𐩇', + 4852 => '𒐲', + 4853 => '𒐳', + 4854 => '𒑖', + 4855 => '𒑗', + 4856 => '𒑚', + 4857 => '𒑛', + 4858 => '𒑜', + 4859 => '𒑝', + 4860 => '𒑞', + 4861 => '𒑟', + 4862 => '𒑠', + 4863 => '𒑡', + 4864 => '𒑢', + 4865 => '𝍩', + 4866 => '𝍪', + 4867 => '𝍫', + 4868 => '𝍬', + 4869 => '𝍭', + 4870 => '𝍮', + 4871 => '𝍯', + 4872 => '𝍰', + 4873 => '𝍱', + 4874 => 'ː', + 4875 => 'ˑ', + 4876 => 'ॱ', + 4877 => 'ๆ', + 4878 => 'ໆ', + 4879 => 'ᪧ', + 4880 => 'ꧏ', + 4881 => 'ꩰ', + 4882 => 'ꫝ', + 4883 => 'ゝ', + 4884 => 'ー', + 4885 => 'ヽ', + 4886 => '¤', + 4887 => '¢', + 4888 => '$', + 4889 => '£', + 4890 => '¥', + 4891 => '؋', + 4892 => '৲', + 4893 => '৳', + 4894 => '৻', + 4895 => '૱', + 4896 => '꠸', + 4897 => '௹', + 4898 => '฿', + 4899 => '៛', + 4900 => '₠', + 4901 => '₡', + 4902 => '₢', + 4903 => '₣', + 4904 => '₤', + 4905 => '₥', + 4906 => '₦', + 4907 => '₧', + 4908 => '₩', + 4909 => '₪', + 4910 => '₫', + 4911 => '€', + 4912 => '₭', + 4913 => '₮', + 4914 => '₯', + 4915 => '₰', + 4916 => '₱', + 4917 => '₲', + 4918 => '₳', + 4919 => '₴', + 4920 => '₵', + 4921 => '₶', + 4922 => '₷', + 4923 => '₸', + 4924 => '₹', + 4925 => '0', + 4926 => '1', + 4927 => '2', + 4928 => '3', + 4929 => '4', + 4930 => '5', + 4931 => '6', + 4932 => '7', + 4933 => '8', + 4934 => '9', + 4935 => 'A', + 4936 => 'ᴀ', + 4937 => 'Ⱥ', + 4938 => 'ᶏ', + 4939 => 'ᴁ', + 4940 => 'ᴂ', + 4941 => 'Ɐ', + 4942 => 'Ɑ', + 4943 => 'ᶐ', + 4944 => 'Ɒ', + 4945 => 'B', + 4946 => 'ʙ', + 4947 => 'Ƀ', + 4948 => 'ᴯ', + 4949 => 'ᴃ', + 4950 => 'ᵬ', + 4951 => 'ᶀ', + 4952 => 'Ɓ', + 4953 => 'Ƃ', + 4954 => 'C', + 4955 => 'ᴄ', + 4956 => 'Ȼ', + 4957 => 'Ƈ', + 4958 => 'ɕ', + 4959 => 'Ↄ', + 4960 => 'Ꜿ', + 4961 => 'D', + 4962 => 'ᴅ', + 4963 => 'ᴆ', + 4964 => 'ᵭ', + 4965 => 'ᶁ', + 4966 => 'Ɖ', + 4967 => 'Ɗ', + 4968 => 'ᶑ', + 4969 => 'Ƌ', + 4970 => 'ȡ', + 4971 => 'ꝱ', + 4972 => 'ẟ', + 4973 => 'E', + 4974 => 'ᴇ', + 4975 => 'Ɇ', + 4976 => 'ᶒ', + 4977 => 'ⱸ', + 4978 => 'Ǝ', + 4979 => 'ⱻ', + 4980 => 'Ə', + 4981 => 'ᶕ', + 4982 => 'Ɛ', + 4983 => 'ᶓ', + 4984 => 'ɘ', + 4985 => 'ɚ', + 4986 => 'ɜ', + 4987 => 'ᶔ', + 4988 => 'ᴈ', + 4989 => 'ɝ', + 4990 => 'ɞ', + 4991 => 'ʚ', + 4992 => 'ɤ', + 4993 => 'F', + 4994 => 'ꜰ', + 4995 => 'ᵮ', + 4996 => 'ᶂ', + 4997 => 'Ƒ', + 4998 => 'Ⅎ', + 4999 => 'ꟻ', + 5000 => 'G', + 5001 => 'ɡ', + 5002 => 'ɢ', + 5003 => 'Ǥ', + 5004 => 'ᶃ', + 5005 => 'Ɠ', + 5006 => 'ʛ', + 5007 => 'ᵷ', + 5008 => 'Ꝿ', + 5009 => 'Ɣ', + 5010 => 'Ƣ', + 5011 => 'H', + 5012 => 'ʜ', + 5013 => 'Ƕ', + 5014 => 'ɦ', + 5015 => 'Ⱨ', + 5016 => 'Ⱶ', + 5017 => 'Ꜧ', + 5018 => 'ɧ', + 5019 => 'ʻ', + 5020 => 'ʽ', + 5021 => 'I', + 5022 => 'ı', + 5023 => 'ɪ', + 5024 => 'ꟾ', + 5025 => 'ᴉ', + 5026 => 'Ɨ', + 5027 => 'ᵻ', + 5028 => 'ᶖ', + 5029 => 'Ɩ', + 5030 => 'ᵼ', + 5031 => 'J', + 5032 => 'ȷ', + 5033 => 'ᴊ', + 5034 => 'Ɉ', + 5035 => 'ʝ', + 5036 => 'ɟ', + 5037 => 'ʄ', + 5038 => 'K', + 5039 => 'ᴋ', + 5040 => 'ᶄ', + 5041 => 'Ƙ', + 5042 => 'Ⱪ', + 5043 => 'Ꝁ', + 5044 => 'Ꝃ', + 5045 => 'Ꝅ', + 5046 => 'ʞ', + 5047 => 'L', + 5048 => 'ʟ', + 5049 => 'Ꝇ', + 5050 => 'ᴌ', + 5051 => 'Ꝉ', + 5052 => 'Ƚ', + 5053 => 'Ⱡ', + 5054 => 'Ɫ', + 5055 => 'ɬ', + 5056 => 'ᶅ', + 5057 => 'ɭ', + 5058 => 'ꞎ', + 5059 => 'ȴ', + 5060 => 'ꝲ', + 5061 => 'ɮ', + 5062 => 'Ꞁ', + 5063 => 'ƛ', + 5064 => 'ʎ', + 5065 => 'M', + 5066 => 'ᴍ', + 5067 => 'ᵯ', + 5068 => 'ᶆ', + 5069 => 'Ɱ', + 5070 => 'ꟽ', + 5071 => 'ꟿ', + 5072 => 'ꝳ', + 5073 => 'N', + 5074 => 'ɴ', + 5075 => 'ᴻ', + 5076 => 'ᴎ', + 5077 => 'ᵰ', + 5078 => 'Ɲ', + 5079 => 'Ƞ', + 5080 => 'Ꞑ', + 5081 => 'ᶇ', + 5082 => 'ɳ', + 5083 => 'ȵ', + 5084 => 'ꝴ', + 5085 => 'Ŋ', + 5086 => 'O', + 5087 => 'ᴏ', + 5088 => 'ᴑ', + 5089 => 'ɶ', + 5090 => 'ᴔ', + 5091 => 'ᴓ', + 5092 => 'Ɔ', + 5093 => 'ᴐ', + 5094 => 'ᴒ', + 5095 => 'ᶗ', + 5096 => 'Ꝍ', + 5097 => 'ᴖ', + 5098 => 'ᴗ', + 5099 => 'ⱺ', + 5100 => 'Ɵ', + 5101 => 'Ꝋ', + 5102 => 'ɷ', + 5103 => 'Ȣ', + 5104 => 'ᴕ', + 5105 => 'P', + 5106 => 'ᴘ', + 5107 => 'Ᵽ', + 5108 => 'Ꝑ', + 5109 => 'ᵱ', + 5110 => 'ᶈ', + 5111 => 'Ƥ', + 5112 => 'Ꝓ', + 5113 => 'Ꝕ', + 5114 => 'ꟼ', + 5115 => 'ɸ', + 5116 => 'ⱷ', + 5117 => 'Q', + 5118 => 'Ꝗ', + 5119 => 'Ꝙ', + 5120 => 'ʠ', + 5121 => 'Ɋ', + 5122 => 'ĸ', + 5123 => 'R', + 5124 => 'Ʀ', + 5125 => 'Ꝛ', + 5126 => 'ᴙ', + 5127 => 'Ɍ', + 5128 => 'ᵲ', + 5129 => 'ɹ', + 5130 => 'ᴚ', + 5131 => 'ɺ', + 5132 => 'ᶉ', + 5133 => 'ɻ', + 5134 => 'ⱹ', + 5135 => 'ɼ', + 5136 => 'Ɽ', + 5137 => 'ɾ', + 5138 => 'ᵳ', + 5139 => 'ɿ', + 5140 => 'ʁ', + 5141 => 'ꝵ', + 5142 => 'ꝶ', + 5143 => 'Ꝝ', + 5144 => 'S', + 5145 => 'ꜱ', + 5146 => 'ᵴ', + 5147 => 'ᶊ', + 5148 => 'ʂ', + 5149 => 'Ȿ', + 5150 => 'ẜ', + 5151 => 'ẝ', + 5152 => 'Ʃ', + 5153 => 'ᶋ', + 5154 => 'ƪ', + 5155 => 'ʅ', + 5156 => 'ᶘ', + 5157 => 'ʆ', + 5158 => 'T', + 5159 => 'ᴛ', + 5160 => 'Ŧ', + 5161 => 'Ⱦ', + 5162 => 'ᵵ', + 5163 => 'ƫ', + 5164 => 'Ƭ', + 5165 => 'Ʈ', + 5166 => 'ȶ', + 5167 => 'ꝷ', + 5168 => 'ʇ', + 5169 => 'U', + 5170 => 'ᴜ', + 5171 => 'ᴝ', + 5172 => 'ᴞ', + 5173 => 'ᵫ', + 5174 => 'Ʉ', + 5175 => 'ᵾ', + 5176 => 'ᶙ', + 5177 => 'Ɥ', + 5178 => 'ʮ', + 5179 => 'ʯ', + 5180 => 'Ɯ', + 5181 => 'ꟺ', + 5182 => 'ᴟ', + 5183 => 'ɰ', + 5184 => 'Ʊ', + 5185 => 'ᵿ', + 5186 => 'V', + 5187 => 'ᴠ', + 5188 => 'Ꝟ', + 5189 => 'ᶌ', + 5190 => 'Ʋ', + 5191 => 'ⱱ', + 5192 => 'ⱴ', + 5193 => 'Ỽ', + 5194 => 'Ʌ', + 5195 => 'W', + 5196 => 'ᴡ', + 5197 => 'Ⱳ', + 5198 => 'ʍ', + 5199 => 'X', + 5200 => 'ᶍ', + 5201 => 'Y', + 5202 => 'ʏ', + 5203 => 'Ɏ', + 5204 => 'Ƴ', + 5205 => 'Ỿ', + 5206 => 'Z', + 5207 => 'ᴢ', + 5208 => 'Ƶ', + 5209 => 'ᵶ', + 5210 => 'ᶎ', + 5211 => 'Ȥ', + 5212 => 'ʐ', + 5213 => 'ʑ', + 5214 => 'Ɀ', + 5215 => 'Ⱬ', + 5216 => 'Ꝣ', + 5217 => 'Ʒ', + 5218 => 'ᴣ', + 5219 => 'Ƹ', + 5220 => 'ᶚ', + 5221 => 'ƺ', + 5222 => 'ʓ', + 5223 => 'Ȝ', + 5224 => 'Þ', + 5225 => 'Ꝥ', + 5226 => 'Ꝧ', + 5227 => 'Ƿ', + 5228 => 'Ꝩ', + 5229 => 'Ꝫ', + 5230 => 'Ꝭ', + 5231 => 'Ꝯ', + 5232 => 'ꝸ', + 5233 => 'ƻ', + 5234 => 'Ꜫ', + 5235 => 'Ꜭ', + 5236 => 'Ꜯ', + 5237 => 'Ƨ', + 5238 => 'Ƽ', + 5239 => 'Ƅ', + 5240 => 'ʔ', + 5241 => 'Ɂ', + 5242 => 'ˀ', + 5243 => 'ʼ', + 5244 => 'ˮ', + 5245 => 'ʾ', + 5246 => 'Ꜣ', + 5247 => 'Ꞌ', + 5248 => 'ʕ', + 5249 => 'ʿ', + 5250 => 'ˁ', + 5251 => 'ᴤ', + 5252 => 'ᴥ', + 5253 => 'Ꜥ', + 5254 => 'ʡ', + 5255 => 'ʢ', + 5256 => 'ʖ', + 5257 => 'ǀ', + 5258 => 'ǁ', + 5259 => 'ǂ', + 5260 => 'ǃ', + 5261 => 'ʗ', + 5262 => 'ʘ', + 5263 => 'ʬ', + 5264 => 'ʭ', + 5265 => 'Α', + 5266 => 'Β', + 5267 => 'Γ', + 5268 => 'ᴦ', + 5269 => 'Δ', + 5270 => 'Ε', + 5271 => 'Ϝ', + 5272 => 'Ͷ', + 5273 => 'Ϛ', + 5274 => 'Ζ', + 5275 => 'Ͱ', + 5276 => 'Η', + 5277 => 'Θ', + 5278 => 'Ι', + 5279 => 'ϳ', + 5280 => 'Κ', + 5281 => 'Λ', + 5282 => 'ᴧ', + 5283 => 'Μ', + 5284 => 'Ν', + 5285 => 'Ξ', + 5286 => 'Ο', + 5287 => 'Π', + 5288 => 'ᴨ', + 5289 => 'Ϻ', + 5290 => 'Ϟ', + 5291 => 'Ϙ', + 5292 => 'Ρ', + 5293 => 'ᴩ', + 5294 => 'ϼ', + 5295 => 'Σ', + 5296 => 'Ͼ', + 5297 => 'Ͻ', + 5298 => 'Ͽ', + 5299 => 'Τ', + 5300 => 'Υ', + 5301 => 'Φ', + 5302 => 'Χ', + 5303 => 'Ψ', + 5304 => 'ᴪ', + 5305 => 'Ω', + 5306 => 'Ϡ', + 5307 => 'Ͳ', + 5308 => 'Ϸ', + 5309 => 'Ⲁ', + 5310 => 'Ⲃ', + 5311 => 'Ⲅ', + 5312 => 'Ⲇ', + 5313 => 'Ⲉ', + 5314 => 'Ⲷ', + 5315 => 'Ⲋ', + 5316 => 'Ⲍ', + 5317 => 'Ⲏ', + 5318 => 'Ⲑ', + 5319 => 'Ⲓ', + 5320 => 'Ⲕ', + 5321 => 'Ⲹ', + 5322 => 'Ⲗ', + 5323 => 'Ⲙ', + 5324 => 'Ⲛ', + 5325 => 'Ⲻ', + 5326 => 'Ⲽ', + 5327 => 'Ⲝ', + 5328 => 'Ⲟ', + 5329 => 'Ⲡ', + 5330 => 'Ⲣ', + 5331 => 'Ⲥ', + 5332 => 'Ⲧ', + 5333 => 'Ⲩ', + 5334 => 'Ⲫ', + 5335 => 'Ⲭ', + 5336 => 'Ⲯ', + 5337 => 'Ⲱ', + 5338 => 'Ⲿ', + 5339 => 'Ⳁ', + 5340 => 'Ϣ', + 5341 => 'Ⳬ', + 5342 => 'Ⳃ', + 5343 => 'Ⳅ', + 5344 => 'Ⳇ', + 5345 => 'Ϥ', + 5346 => 'Ϧ', + 5347 => 'Ⳉ', + 5348 => 'Ϩ', + 5349 => 'Ⳋ', + 5350 => 'Ⳍ', + 5351 => 'Ⳏ', + 5352 => 'Ⳑ', + 5353 => 'Ⳓ', + 5354 => 'Ⳕ', + 5355 => 'Ϫ', + 5356 => 'Ⳮ', + 5357 => 'Ⳗ', + 5358 => 'Ϭ', + 5359 => 'Ⳙ', + 5360 => 'Ⳛ', + 5361 => 'Ⳝ', + 5362 => 'Ϯ', + 5363 => 'Ⲳ', + 5364 => 'Ⲵ', + 5365 => 'Ⳟ', + 5366 => 'Ⳡ', + 5367 => 'Ⳣ', + 5368 => 'А', + 5369 => 'Ӑ', + 5370 => 'Ӓ', + 5371 => 'Ә', + 5372 => 'Ӛ', + 5373 => 'Ӕ', + 5374 => 'Б', + 5375 => 'В', + 5376 => 'Г', + 5377 => 'Ғ', + 5378 => 'Ӻ', + 5379 => 'Ҕ', + 5380 => 'Ӷ', + 5381 => 'Д', + 5382 => 'Ԁ', + 5383 => 'Ꚁ', + 5384 => 'Ђ', + 5385 => 'Ꙣ', + 5386 => 'Ԃ', + 5387 => 'Ѓ', + 5388 => 'Ҙ', + 5389 => 'Е', + 5390 => 'Ӗ', + 5391 => 'Є', + 5392 => 'Ж', + 5393 => 'Ꚅ', + 5394 => 'Ӝ', + 5395 => 'Җ', + 5396 => 'З', + 5397 => 'Ꙁ', + 5398 => 'Ԅ', + 5399 => 'Ԑ', + 5400 => 'Ӟ', + 5401 => 'Ꙃ', + 5402 => 'Ѕ', + 5403 => 'Ꙅ', + 5404 => 'Ӡ', + 5405 => 'Ꚉ', + 5406 => 'Ԇ', + 5407 => 'Ꚃ', + 5408 => 'И', + 5409 => 'Ҋ', + 5410 => 'Ӥ', + 5411 => 'І', + 5412 => 'Ꙇ', + 5413 => 'Ї', + 5414 => 'Й', + 5415 => 'Ј', + 5416 => 'Ꙉ', + 5417 => 'К', + 5418 => 'Қ', + 5419 => 'Ӄ', + 5420 => 'Ҡ', + 5421 => 'Ҟ', + 5422 => 'Ҝ', + 5423 => 'Ԟ', + 5424 => 'Ԛ', + 5425 => 'Л', + 5426 => 'ᴫ', + 5427 => 'Ӆ', + 5428 => 'Ԓ', + 5429 => 'Ԡ', + 5430 => 'Љ', + 5431 => 'Ꙥ', + 5432 => 'Ԉ', + 5433 => 'Ԕ', + 5434 => 'М', + 5435 => 'Ӎ', + 5436 => 'Ꙧ', + 5437 => 'Н', + 5438 => 'Ӊ', + 5439 => 'Ң', + 5440 => 'Ӈ', + 5441 => 'Ԣ', + 5442 => 'Ҥ', + 5443 => 'Њ', + 5444 => 'Ԋ', + 5445 => 'О', + 5446 => 'Ӧ', + 5447 => 'Ө', + 5448 => 'Ӫ', + 5449 => 'П', + 5450 => 'Ԥ', + 5451 => 'Ҧ', + 5452 => 'Ҁ', + 5453 => 'Р', + 5454 => 'Ҏ', + 5455 => 'Ԗ', + 5456 => 'С', + 5457 => 'Ԍ', + 5458 => 'Ҫ', + 5459 => 'Т', + 5460 => 'Ꚍ', + 5461 => 'Ԏ', + 5462 => 'Ҭ', + 5463 => 'Ꚋ', + 5464 => 'Ћ', + 5465 => 'Ќ', + 5466 => 'У', + 5467 => 'Ў', + 5468 => 'Ӱ', + 5469 => 'Ӳ', + 5470 => 'Ү', + 5471 => 'Ұ', + 5472 => 'Ꙋ', + 5473 => 'Ѹ', + 5474 => 'Ф', + 5475 => 'Х', + 5476 => 'Ӽ', + 5477 => 'Ӿ', + 5478 => 'Ҳ', + 5479 => 'Һ', + 5480 => 'Ԧ', + 5481 => 'Ꚕ', + 5482 => 'Ѡ', + 5483 => 'Ѿ', + 5484 => 'Ꙍ', + 5485 => 'Ѽ', + 5486 => 'Ѻ', + 5487 => 'Ц', + 5488 => 'Ꙡ', + 5489 => 'Ꚏ', + 5490 => 'Ҵ', + 5491 => 'Ꚑ', + 5492 => 'Ч', + 5493 => 'Ꚓ', + 5494 => 'Ӵ', + 5495 => 'Ҷ', + 5496 => 'Ӌ', + 5497 => 'Ҹ', + 5498 => 'Ꚇ', + 5499 => 'Ҽ', + 5500 => 'Ҿ', + 5501 => 'Џ', + 5502 => 'Ш', + 5503 => 'Ꚗ', + 5504 => 'Щ', + 5505 => 'Ꙏ', + 5506 => 'ⸯ', + 5507 => 'ꙿ', + 5508 => 'Ъ', + 5509 => 'Ꙑ', + 5510 => 'Ы', + 5511 => 'Ӹ', + 5512 => 'Ь', + 5513 => 'Ҍ', + 5514 => 'Ѣ', + 5515 => 'Ꙓ', + 5516 => 'Э', + 5517 => 'Ӭ', + 5518 => 'Ю', + 5519 => 'Ꙕ', + 5520 => 'Ꙗ', + 5521 => 'Я', + 5522 => 'Ԙ', + 5523 => 'Ѥ', + 5524 => 'Ѧ', + 5525 => 'Ꙙ', + 5526 => 'Ѫ', + 5527 => 'Ꙛ', + 5528 => 'Ѩ', + 5529 => 'Ꙝ', + 5530 => 'Ѭ', + 5531 => 'Ѯ', + 5532 => 'Ѱ', + 5533 => 'Ѳ', + 5534 => 'Ѵ', + 5535 => 'Ѷ', + 5536 => 'Ꙟ', + 5537 => 'Ҩ', + 5538 => 'Ԝ', + 5539 => 'Ӏ', + 5540 => 'Ⰰ', + 5541 => 'Ⰱ', + 5542 => 'Ⰲ', + 5543 => 'Ⰳ', + 5544 => 'Ⰴ', + 5545 => 'Ⰵ', + 5546 => 'Ⰶ', + 5547 => 'Ⰷ', + 5548 => 'Ⰸ', + 5549 => 'Ⰹ', + 5550 => 'Ⰺ', + 5551 => 'Ⰻ', + 5552 => 'Ⰼ', + 5553 => 'Ⰽ', + 5554 => 'Ⰾ', + 5555 => 'Ⰿ', + 5556 => 'Ⱀ', + 5557 => 'Ⱁ', + 5558 => 'Ⱂ', + 5559 => 'Ⱃ', + 5560 => 'Ⱄ', + 5561 => 'Ⱅ', + 5562 => 'Ⱆ', + 5563 => 'Ⱇ', + 5564 => 'Ⱈ', + 5565 => 'Ⱉ', + 5566 => 'Ⱊ', + 5567 => 'Ⱋ', + 5568 => 'Ⱌ', + 5569 => 'Ⱍ', + 5570 => 'Ⱎ', + 5571 => 'Ⱏ', + 5572 => 'Ⱐ', + 5573 => 'Ⱑ', + 5574 => 'Ⱒ', + 5575 => 'Ⱓ', + 5576 => 'Ⱔ', + 5577 => 'Ⱕ', + 5578 => 'Ⱖ', + 5579 => 'Ⱗ', + 5580 => 'Ⱘ', + 5581 => 'Ⱙ', + 5582 => 'Ⱚ', + 5583 => 'Ⱛ', + 5584 => 'Ⱜ', + 5585 => 'Ⱝ', + 5586 => 'Ⱞ', + 5587 => 'ა', + 5588 => 'Ⴀ', + 5589 => 'ბ', + 5590 => 'Ⴁ', + 5591 => 'გ', + 5592 => 'Ⴂ', + 5593 => 'დ', + 5594 => 'Ⴃ', + 5595 => 'ე', + 5596 => 'Ⴄ', + 5597 => 'ვ', + 5598 => 'Ⴅ', + 5599 => 'ზ', + 5600 => 'Ⴆ', + 5601 => 'ჱ', + 5602 => 'Ⴡ', + 5603 => 'თ', + 5604 => 'Ⴇ', + 5605 => 'ი', + 5606 => 'Ⴈ', + 5607 => 'კ', + 5608 => 'Ⴉ', + 5609 => 'ლ', + 5610 => 'Ⴊ', + 5611 => 'მ', + 5612 => 'Ⴋ', + 5613 => 'ნ', + 5614 => 'Ⴌ', + 5615 => 'ჲ', + 5616 => 'Ⴢ', + 5617 => 'ო', + 5618 => 'Ⴍ', + 5619 => 'პ', + 5620 => 'Ⴎ', + 5621 => 'ჟ', + 5622 => 'Ⴏ', + 5623 => 'რ', + 5624 => 'Ⴐ', + 5625 => 'ს', + 5626 => 'Ⴑ', + 5627 => 'ტ', + 5628 => 'Ⴒ', + 5629 => 'ჳ', + 5630 => 'Ⴣ', + 5631 => 'უ', + 5632 => 'Ⴓ', + 5633 => 'ფ', + 5634 => 'Ⴔ', + 5635 => 'ქ', + 5636 => 'Ⴕ', + 5637 => 'ღ', + 5638 => 'Ⴖ', + 5639 => 'ყ', + 5640 => 'Ⴗ', + 5641 => 'შ', + 5642 => 'Ⴘ', + 5643 => 'ჩ', + 5644 => 'Ⴙ', + 5645 => 'ც', + 5646 => 'Ⴚ', + 5647 => 'ძ', + 5648 => 'Ⴛ', + 5649 => 'წ', + 5650 => 'Ⴜ', + 5651 => 'ჭ', + 5652 => 'Ⴝ', + 5653 => 'ხ', + 5654 => 'Ⴞ', + 5655 => 'ჴ', + 5656 => 'Ⴤ', + 5657 => 'ჯ', + 5658 => 'Ⴟ', + 5659 => 'ჰ', + 5660 => 'Ⴠ', + 5661 => 'ჵ', + 5662 => 'Ⴥ', + 5663 => 'ჶ', + 5664 => 'ჷ', + 5665 => 'ჸ', + 5666 => 'ჹ', + 5667 => 'ჺ', + 5668 => 'Ա', + 5669 => 'Բ', + 5670 => 'Գ', + 5671 => 'Դ', + 5672 => 'Ե', + 5673 => 'Զ', + 5674 => 'Է', + 5675 => 'Ը', + 5676 => 'Թ', + 5677 => 'Ժ', + 5678 => 'Ի', + 5679 => 'Լ', + 5680 => 'Խ', + 5681 => 'Ծ', + 5682 => 'Կ', + 5683 => 'Հ', + 5684 => 'Ձ', + 5685 => 'Ղ', + 5686 => 'Ճ', + 5687 => 'Մ', + 5688 => 'Յ', + 5689 => 'Ն', + 5690 => 'Շ', + 5691 => 'Ո', + 5692 => 'Չ', + 5693 => 'Պ', + 5694 => 'Ջ', + 5695 => 'Ռ', + 5696 => 'Ս', + 5697 => 'Վ', + 5698 => 'Տ', + 5699 => 'Ր', + 5700 => 'Ց', + 5701 => 'Ւ', + 5702 => 'Փ', + 5703 => 'Ք', + 5704 => 'Օ', + 5705 => 'Ֆ', + 5706 => 'ՙ', + 5707 => 'א', + 5708 => 'ב', + 5709 => 'ג', + 5710 => 'ד', + 5711 => 'ה', + 5712 => 'ו', + 5713 => 'ז', + 5714 => 'ח', + 5715 => 'ט', + 5716 => 'י', + 5717 => 'ך', + 5718 => 'ל', + 5719 => 'ם', + 5720 => 'ן', + 5721 => 'ס', + 5722 => 'ע', + 5723 => 'ף', + 5724 => 'ץ', + 5725 => 'ק', + 5726 => 'ר', + 5727 => 'ש', + 5728 => 'ת', + 5729 => '𐤀', + 5730 => '𐤁', + 5731 => '𐤂', + 5732 => '𐤃', + 5733 => '𐤄', + 5734 => '𐤅', + 5735 => '𐤆', + 5736 => '𐤇', + 5737 => '𐤈', + 5738 => '𐤉', + 5739 => '𐤊', + 5740 => '𐤋', + 5741 => '𐤌', + 5742 => '𐤍', + 5743 => '𐤎', + 5744 => '𐤏', + 5745 => '𐤐', + 5746 => '𐤑', + 5747 => '𐤒', + 5748 => '𐤓', + 5749 => '𐤔', + 5750 => '𐤕', + 5751 => 'ࠀ', + 5752 => 'ࠁ', + 5753 => 'ࠂ', + 5754 => 'ࠃ', + 5755 => 'ࠄ', + 5756 => 'ࠅ', + 5757 => 'ࠆ', + 5758 => 'ࠇ', + 5759 => 'ࠈ', + 5760 => 'ࠉ', + 5761 => 'ࠊ', + 5762 => 'ࠋ', + 5763 => 'ࠌ', + 5764 => 'ࠍ', + 5765 => 'ࠎ', + 5766 => 'ࠏ', + 5767 => 'ࠐ', + 5768 => 'ࠑ', + 5769 => 'ࠒ', + 5770 => 'ࠓ', + 5771 => 'ࠔ', + 5772 => 'ࠕ', + 5773 => 'ࠚ', + 5774 => 'ء', + 5775 => 'آ', + 5776 => 'أ', + 5777 => 'ٲ', + 5778 => 'ٱ', + 5779 => 'ؤ', + 5780 => 'إ', + 5781 => 'ٳ', + 5782 => 'ݳ', + 5783 => 'ݴ', + 5784 => 'ئ', + 5785 => 'ا', + 5786 => 'ٮ', + 5787 => 'ب', + 5788 => 'ٻ', + 5789 => 'پ', + 5790 => 'ڀ', + 5791 => 'ݐ', + 5792 => 'ݑ', + 5793 => 'ݒ', + 5794 => 'ݓ', + 5795 => 'ݔ', + 5796 => 'ݕ', + 5797 => 'ݖ', + 5798 => 'ة', + 5799 => 'ت', + 5800 => 'ث', + 5801 => 'ٹ', + 5802 => 'ٺ', + 5803 => 'ټ', + 5804 => 'ٽ', + 5805 => 'ٿ', + 5806 => 'ج', + 5807 => 'ڃ', + 5808 => 'ڄ', + 5809 => 'چ', + 5810 => 'ڿ', + 5811 => 'ڇ', + 5812 => 'ح', + 5813 => 'خ', + 5814 => 'ځ', + 5815 => 'ڂ', + 5816 => 'څ', + 5817 => 'ݗ', + 5818 => 'ݘ', + 5819 => 'ݮ', + 5820 => 'ݯ', + 5821 => 'ݲ', + 5822 => 'ݼ', + 5823 => 'د', + 5824 => 'ذ', + 5825 => 'ڈ', + 5826 => 'ډ', + 5827 => 'ڊ', + 5828 => 'ڋ', + 5829 => 'ڌ', + 5830 => 'ڍ', + 5831 => 'ڎ', + 5832 => 'ڏ', + 5833 => 'ڐ', + 5834 => 'ۮ', + 5835 => 'ݙ', + 5836 => 'ݚ', + 5837 => 'ر', + 5838 => 'ز', + 5839 => 'ڑ', + 5840 => 'ڒ', + 5841 => 'ړ', + 5842 => 'ڔ', + 5843 => 'ڕ', + 5844 => 'ږ', + 5845 => 'ڗ', + 5846 => 'ژ', + 5847 => 'ڙ', + 5848 => 'ۯ', + 5849 => 'ݛ', + 5850 => 'ݫ', + 5851 => 'ݬ', + 5852 => 'ݱ', + 5853 => 'س', + 5854 => 'ش', + 5855 => 'ښ', + 5856 => 'ڛ', + 5857 => 'ڜ', + 5858 => 'ۺ', + 5859 => 'ݜ', + 5860 => 'ݭ', + 5861 => 'ݰ', + 5862 => 'ݽ', + 5863 => 'ݾ', + 5864 => 'ص', + 5865 => 'ض', + 5866 => 'ڝ', + 5867 => 'ڞ', + 5868 => 'ۻ', + 5869 => 'ط', + 5870 => 'ظ', + 5871 => 'ڟ', + 5872 => 'ع', + 5873 => 'غ', + 5874 => 'ڠ', + 5875 => 'ۼ', + 5876 => 'ݝ', + 5877 => 'ݞ', + 5878 => 'ݟ', + 5879 => 'ف', + 5880 => 'ڡ', + 5881 => 'ڢ', + 5882 => 'ڣ', + 5883 => 'ڤ', + 5884 => 'ڥ', + 5885 => 'ڦ', + 5886 => 'ݠ', + 5887 => 'ݡ', + 5888 => 'ٯ', + 5889 => 'ق', + 5890 => 'ڧ', + 5891 => 'ڨ', + 5892 => 'ك', + 5893 => 'ک', + 5894 => 'ڪ', + 5895 => 'ګ', + 5896 => 'ڬ', + 5897 => 'ݿ', + 5898 => 'ڭ', + 5899 => 'ڮ', + 5900 => 'گ', + 5901 => 'ڰ', + 5902 => 'ڱ', + 5903 => 'ڲ', + 5904 => 'ڳ', + 5905 => 'ڴ', + 5906 => 'ݢ', + 5907 => 'ػ', + 5908 => 'ؼ', + 5909 => 'ݣ', + 5910 => 'ݤ', + 5911 => 'ل', + 5912 => 'ڵ', + 5913 => 'ڶ', + 5914 => 'ڷ', + 5915 => 'ڸ', + 5916 => 'ݪ', + 5917 => 'م', + 5918 => 'ݥ', + 5919 => 'ݦ', + 5920 => 'ن', + 5921 => 'ں', + 5922 => 'ڻ', + 5923 => 'ڼ', + 5924 => 'ڽ', + 5925 => 'ڹ', + 5926 => 'ݧ', + 5927 => 'ݨ', + 5928 => 'ݩ', + 5929 => 'ه', + 5930 => 'ھ', + 5931 => 'ہ', + 5932 => 'ۃ', + 5933 => 'ۿ', + 5934 => 'ە', + 5935 => 'و', + 5936 => 'ۄ', + 5937 => 'ۅ', + 5938 => 'ۆ', + 5939 => 'ۇ', + 5940 => 'ۈ', + 5941 => 'ۉ', + 5942 => 'ۊ', + 5943 => 'ۋ', + 5944 => 'ۏ', + 5945 => 'ݸ', + 5946 => 'ݹ', + 5947 => 'ى', + 5948 => 'ي', + 5949 => 'ی', + 5950 => 'ۍ', + 5951 => 'ێ', + 5952 => 'ې', + 5953 => 'ۑ', + 5954 => 'ؽ', + 5955 => 'ؾ', + 5956 => 'ؿ', + 5957 => 'ؠ', + 5958 => 'ݵ', + 5959 => 'ݶ', + 5960 => 'ݷ', + 5961 => 'ے', + 5962 => 'ݺ', + 5963 => 'ݻ', + 5964 => 'ܐ', + 5965 => 'ܒ', + 5966 => 'ܓ', + 5967 => 'ܖ', + 5968 => 'ܕ', + 5969 => 'ܗ', + 5970 => 'ܘ', + 5971 => 'ܙ', + 5972 => 'ݍ', + 5973 => 'ܚ', + 5974 => 'ܛ', + 5975 => 'ܝ', + 5976 => 'ܞ', + 5977 => 'ܟ', + 5978 => 'ݎ', + 5979 => 'ܠ', + 5980 => 'ܡ', + 5981 => 'ܢ', + 5982 => 'ܣ', + 5983 => 'ܥ', + 5984 => 'ܦ', + 5985 => 'ݏ', + 5986 => 'ܨ', + 5987 => 'ܩ', + 5988 => 'ܪ', + 5989 => 'ܫ', + 5990 => 'ܬ', + 5991 => 'ࡀ', + 5992 => 'ࡁ', + 5993 => 'ࡂ', + 5994 => 'ࡃ', + 5995 => 'ࡄ', + 5996 => 'ࡅ', + 5997 => 'ࡆ', + 5998 => 'ࡇ', + 5999 => 'ࡈ', + 6000 => 'ࡉ', + 6001 => 'ࡊ', + 6002 => 'ࡋ', + 6003 => 'ࡌ', + 6004 => 'ࡍ', + 6005 => 'ࡎ', + 6006 => 'ࡏ', + 6007 => 'ࡐ', + 6008 => 'ࡑ', + 6009 => 'ࡒ', + 6010 => 'ࡓ', + 6011 => 'ࡔ', + 6012 => 'ࡕ', + 6013 => 'ࡖ', + 6014 => 'ࡗ', + 6015 => 'ࡘ', + 6016 => 'ހ', + 6017 => 'ޙ', + 6018 => 'ޚ', + 6019 => 'ށ', + 6020 => 'ނ', + 6021 => 'ރ', + 6022 => 'ޜ', + 6023 => 'ބ', + 6024 => 'ޅ', + 6025 => 'ކ', + 6026 => 'އ', + 6027 => 'ޢ', + 6028 => 'ޣ', + 6029 => 'ވ', + 6030 => 'ޥ', + 6031 => 'މ', + 6032 => 'ފ', + 6033 => 'ދ', + 6034 => 'ޛ', + 6035 => 'ތ', + 6036 => 'ޘ', + 6037 => 'ޠ', + 6038 => 'ޡ', + 6039 => 'ލ', + 6040 => 'ގ', + 6041 => 'ޤ', + 6042 => 'ޏ', + 6043 => 'ސ', + 6044 => 'ޝ', + 6045 => 'ޞ', + 6046 => 'ޟ', + 6047 => 'ޑ', + 6048 => 'ޒ', + 6049 => 'ޓ', + 6050 => 'ޔ', + 6051 => 'ޕ', + 6052 => 'ޖ', + 6053 => 'ޗ', + 6054 => 'ޱ', + 6055 => 'ߊ', + 6056 => 'ߋ', + 6057 => 'ߌ', + 6058 => 'ߍ', + 6059 => 'ߎ', + 6060 => 'ߏ', + 6061 => 'ߐ', + 6062 => 'ߑ', + 6063 => 'ߒ', + 6064 => 'ߓ', + 6065 => 'ߔ', + 6066 => 'ߕ', + 6067 => 'ߖ', + 6068 => 'ߗ', + 6069 => 'ߘ', + 6070 => 'ߙ', + 6071 => 'ߚ', + 6072 => 'ߛ', + 6073 => 'ߜ', + 6074 => 'ߝ', + 6075 => 'ߞ', + 6076 => 'ߟ', + 6077 => 'ߠ', + 6078 => 'ߡ', + 6079 => 'ߢ', + 6080 => 'ߣ', + 6081 => 'ߤ', + 6082 => 'ߥ', + 6083 => 'ߦ', + 6084 => 'ߧ', + 6085 => 'ߴ', + 6086 => 'ߵ', + 6087 => 'ⴰ', + 6088 => 'ⴱ', + 6089 => 'ⴲ', + 6090 => 'ⴳ', + 6091 => 'ⴴ', + 6092 => 'ⴵ', + 6093 => 'ⴶ', + 6094 => 'ⴷ', + 6095 => 'ⴸ', + 6096 => 'ⴹ', + 6097 => 'ⴺ', + 6098 => 'ⴻ', + 6099 => 'ⴼ', + 6100 => 'ⴽ', + 6101 => 'ⴾ', + 6102 => 'ⴿ', + 6103 => 'ⵀ', + 6104 => 'ⵁ', + 6105 => 'ⵂ', + 6106 => 'ⵃ', + 6107 => 'ⵄ', + 6108 => 'ⵅ', + 6109 => 'ⵆ', + 6110 => 'ⵇ', + 6111 => 'ⵈ', + 6112 => 'ⵉ', + 6113 => 'ⵊ', + 6114 => 'ⵋ', + 6115 => 'ⵌ', + 6116 => 'ⵍ', + 6117 => 'ⵎ', + 6118 => 'ⵏ', + 6119 => 'ⵐ', + 6120 => 'ⵑ', + 6121 => 'ⵒ', + 6122 => 'ⵓ', + 6123 => 'ⵔ', + 6124 => 'ⵕ', + 6125 => 'ⵖ', + 6126 => 'ⵗ', + 6127 => 'ⵘ', + 6128 => 'ⵙ', + 6129 => 'ⵚ', + 6130 => 'ⵛ', + 6131 => 'ⵜ', + 6132 => 'ⵝ', + 6133 => 'ⵞ', + 6134 => 'ⵟ', + 6135 => 'ⵠ', + 6136 => 'ⵡ', + 6137 => 'ⵢ', + 6138 => 'ⵣ', + 6139 => 'ⵤ', + 6140 => 'ⵥ', + 6141 => 'ⵯ', + 6142 => 'ሀ', + 6143 => 'ሁ', + 6144 => 'ሂ', + 6145 => 'ሃ', + 6146 => 'ሄ', + 6147 => 'ህ', + 6148 => 'ሆ', + 6149 => 'ሇ', + 6150 => 'ለ', + 6151 => 'ሉ', + 6152 => 'ሊ', + 6153 => 'ላ', + 6154 => 'ሌ', + 6155 => 'ል', + 6156 => 'ሎ', + 6157 => 'ሏ', + 6158 => 'ⶀ', + 6159 => 'ሐ', + 6160 => 'ሑ', + 6161 => 'ሒ', + 6162 => 'ሓ', + 6163 => 'ሔ', + 6164 => 'ሕ', + 6165 => 'ሖ', + 6166 => 'ሗ', + 6167 => 'መ', + 6168 => 'ሙ', + 6169 => 'ሚ', + 6170 => 'ማ', + 6171 => 'ሜ', + 6172 => 'ም', + 6173 => 'ሞ', + 6174 => 'ሟ', + 6175 => 'ᎀ', + 6176 => 'ᎁ', + 6177 => 'ᎂ', + 6178 => 'ᎃ', + 6179 => 'ⶁ', + 6180 => 'ሠ', + 6181 => 'ሡ', + 6182 => 'ሢ', + 6183 => 'ሣ', + 6184 => 'ሤ', + 6185 => 'ሥ', + 6186 => 'ሦ', + 6187 => 'ሧ', + 6188 => 'ረ', + 6189 => 'ሩ', + 6190 => 'ሪ', + 6191 => 'ራ', + 6192 => 'ሬ', + 6193 => 'ር', + 6194 => 'ሮ', + 6195 => 'ሯ', + 6196 => 'ⶂ', + 6197 => 'ሰ', + 6198 => 'ሱ', + 6199 => 'ሲ', + 6200 => 'ሳ', + 6201 => 'ሴ', + 6202 => 'ስ', + 6203 => 'ሶ', + 6204 => 'ሷ', + 6205 => 'ⶃ', + 6206 => 'ꬁ', + 6207 => 'ꬂ', + 6208 => 'ꬃ', + 6209 => 'ꬄ', + 6210 => 'ꬅ', + 6211 => 'ꬆ', + 6212 => 'ሸ', + 6213 => 'ሹ', + 6214 => 'ሺ', + 6215 => 'ሻ', + 6216 => 'ሼ', + 6217 => 'ሽ', + 6218 => 'ሾ', + 6219 => 'ሿ', + 6220 => 'ⶄ', + 6221 => 'ቀ', + 6222 => 'ቁ', + 6223 => 'ቂ', + 6224 => 'ቃ', + 6225 => 'ቄ', + 6226 => 'ቅ', + 6227 => 'ቆ', + 6228 => 'ቇ', + 6229 => 'ቈ', + 6230 => 'ቊ', + 6231 => 'ቋ', + 6232 => 'ቌ', + 6233 => 'ቍ', + 6234 => 'ቐ', + 6235 => 'ቑ', + 6236 => 'ቒ', + 6237 => 'ቓ', + 6238 => 'ቔ', + 6239 => 'ቕ', + 6240 => 'ቖ', + 6241 => 'ቘ', + 6242 => 'ቚ', + 6243 => 'ቛ', + 6244 => 'ቜ', + 6245 => 'ቝ', + 6246 => 'በ', + 6247 => 'ቡ', + 6248 => 'ቢ', + 6249 => 'ባ', + 6250 => 'ቤ', + 6251 => 'ብ', + 6252 => 'ቦ', + 6253 => 'ቧ', + 6254 => 'ᎄ', + 6255 => 'ᎅ', + 6256 => 'ᎆ', + 6257 => 'ᎇ', + 6258 => 'ⶅ', + 6259 => 'ቨ', + 6260 => 'ቩ', + 6261 => 'ቪ', + 6262 => 'ቫ', + 6263 => 'ቬ', + 6264 => 'ቭ', + 6265 => 'ቮ', + 6266 => 'ቯ', + 6267 => 'ተ', + 6268 => 'ቱ', + 6269 => 'ቲ', + 6270 => 'ታ', + 6271 => 'ቴ', + 6272 => 'ት', + 6273 => 'ቶ', + 6274 => 'ቷ', + 6275 => 'ⶆ', + 6276 => 'ቸ', + 6277 => 'ቹ', + 6278 => 'ቺ', + 6279 => 'ቻ', + 6280 => 'ቼ', + 6281 => 'ች', + 6282 => 'ቾ', + 6283 => 'ቿ', + 6284 => 'ⶇ', + 6285 => 'ኀ', + 6286 => 'ኁ', + 6287 => 'ኂ', + 6288 => 'ኃ', + 6289 => 'ኄ', + 6290 => 'ኅ', + 6291 => 'ኆ', + 6292 => 'ኇ', + 6293 => 'ኈ', + 6294 => 'ኊ', + 6295 => 'ኋ', + 6296 => 'ኌ', + 6297 => 'ኍ', + 6298 => 'ነ', + 6299 => 'ኑ', + 6300 => 'ኒ', + 6301 => 'ና', + 6302 => 'ኔ', + 6303 => 'ን', + 6304 => 'ኖ', + 6305 => 'ኗ', + 6306 => 'ⶈ', + 6307 => 'ኘ', + 6308 => 'ኙ', + 6309 => 'ኚ', + 6310 => 'ኛ', + 6311 => 'ኜ', + 6312 => 'ኝ', + 6313 => 'ኞ', + 6314 => 'ኟ', + 6315 => 'ⶉ', + 6316 => 'አ', + 6317 => 'ኡ', + 6318 => 'ኢ', + 6319 => 'ኣ', + 6320 => 'ኤ', + 6321 => 'እ', + 6322 => 'ኦ', + 6323 => 'ኧ', + 6324 => 'ⶊ', + 6325 => 'ከ', + 6326 => 'ኩ', + 6327 => 'ኪ', + 6328 => 'ካ', + 6329 => 'ኬ', + 6330 => 'ክ', + 6331 => 'ኮ', + 6332 => 'ኯ', + 6333 => 'ኰ', + 6334 => 'ኲ', + 6335 => 'ኳ', + 6336 => 'ኴ', + 6337 => 'ኵ', + 6338 => 'ኸ', + 6339 => 'ኹ', + 6340 => 'ኺ', + 6341 => 'ኻ', + 6342 => 'ኼ', + 6343 => 'ኽ', + 6344 => 'ኾ', + 6345 => 'ዀ', + 6346 => 'ዂ', + 6347 => 'ዃ', + 6348 => 'ዄ', + 6349 => 'ዅ', + 6350 => 'ወ', + 6351 => 'ዉ', + 6352 => 'ዊ', + 6353 => 'ዋ', + 6354 => 'ዌ', + 6355 => 'ው', + 6356 => 'ዎ', + 6357 => 'ዏ', + 6358 => 'ዐ', + 6359 => 'ዑ', + 6360 => 'ዒ', + 6361 => 'ዓ', + 6362 => 'ዔ', + 6363 => 'ዕ', + 6364 => 'ዖ', + 6365 => 'ዘ', + 6366 => 'ዙ', + 6367 => 'ዚ', + 6368 => 'ዛ', + 6369 => 'ዜ', + 6370 => 'ዝ', + 6371 => 'ዞ', + 6372 => 'ዟ', + 6373 => 'ⶋ', + 6374 => 'ꬑ', + 6375 => 'ꬒ', + 6376 => 'ꬓ', + 6377 => 'ꬔ', + 6378 => 'ꬕ', + 6379 => 'ꬖ', + 6380 => 'ዠ', + 6381 => 'ዡ', + 6382 => 'ዢ', + 6383 => 'ዣ', + 6384 => 'ዤ', + 6385 => 'ዥ', + 6386 => 'ዦ', + 6387 => 'ዧ', + 6388 => 'የ', + 6389 => 'ዩ', + 6390 => 'ዪ', + 6391 => 'ያ', + 6392 => 'ዬ', + 6393 => 'ይ', + 6394 => 'ዮ', + 6395 => 'ዯ', + 6396 => 'ደ', + 6397 => 'ዱ', + 6398 => 'ዲ', + 6399 => 'ዳ', + 6400 => 'ዴ', + 6401 => 'ድ', + 6402 => 'ዶ', + 6403 => 'ዷ', + 6404 => 'ⶌ', + 6405 => 'ꬉ', + 6406 => 'ꬊ', + 6407 => 'ꬋ', + 6408 => 'ꬌ', + 6409 => 'ꬍ', + 6410 => 'ꬎ', + 6411 => 'ዸ', + 6412 => 'ዹ', + 6413 => 'ዺ', + 6414 => 'ዻ', + 6415 => 'ዼ', + 6416 => 'ዽ', + 6417 => 'ዾ', + 6418 => 'ዿ', + 6419 => 'ⶍ', + 6420 => 'ጀ', + 6421 => 'ጁ', + 6422 => 'ጂ', + 6423 => 'ጃ', + 6424 => 'ጄ', + 6425 => 'ጅ', + 6426 => 'ጆ', + 6427 => 'ጇ', + 6428 => 'ⶎ', + 6429 => 'ገ', + 6430 => 'ጉ', + 6431 => 'ጊ', + 6432 => 'ጋ', + 6433 => 'ጌ', + 6434 => 'ግ', + 6435 => 'ጎ', + 6436 => 'ጏ', + 6437 => 'ጐ', + 6438 => 'ጒ', + 6439 => 'ጓ', + 6440 => 'ጔ', + 6441 => 'ጕ', + 6442 => 'ጘ', + 6443 => 'ጙ', + 6444 => 'ጚ', + 6445 => 'ጛ', + 6446 => 'ጜ', + 6447 => 'ጝ', + 6448 => 'ጞ', + 6449 => 'ጟ', + 6450 => 'ⶓ', + 6451 => 'ⶔ', + 6452 => 'ⶕ', + 6453 => 'ⶖ', + 6454 => 'ጠ', + 6455 => 'ጡ', + 6456 => 'ጢ', + 6457 => 'ጣ', + 6458 => 'ጤ', + 6459 => 'ጥ', + 6460 => 'ጦ', + 6461 => 'ጧ', + 6462 => 'ⶏ', + 6463 => 'ጨ', + 6464 => 'ጩ', + 6465 => 'ጪ', + 6466 => 'ጫ', + 6467 => 'ጬ', + 6468 => 'ጭ', + 6469 => 'ጮ', + 6470 => 'ጯ', + 6471 => 'ⶐ', + 6472 => 'ꬠ', + 6473 => 'ꬡ', + 6474 => 'ꬢ', + 6475 => 'ꬣ', + 6476 => 'ꬤ', + 6477 => 'ꬥ', + 6478 => 'ꬦ', + 6479 => 'ጰ', + 6480 => 'ጱ', + 6481 => 'ጲ', + 6482 => 'ጳ', + 6483 => 'ጴ', + 6484 => 'ጵ', + 6485 => 'ጶ', + 6486 => 'ጷ', + 6487 => 'ⶑ', + 6488 => 'ጸ', + 6489 => 'ጹ', + 6490 => 'ጺ', + 6491 => 'ጻ', + 6492 => 'ጼ', + 6493 => 'ጽ', + 6494 => 'ጾ', + 6495 => 'ጿ', + 6496 => 'ꬨ', + 6497 => 'ꬩ', + 6498 => 'ꬪ', + 6499 => 'ꬫ', + 6500 => 'ꬬ', + 6501 => 'ꬭ', + 6502 => 'ꬮ', + 6503 => 'ፀ', + 6504 => 'ፁ', + 6505 => 'ፂ', + 6506 => 'ፃ', + 6507 => 'ፄ', + 6508 => 'ፅ', + 6509 => 'ፆ', + 6510 => 'ፇ', + 6511 => 'ፈ', + 6512 => 'ፉ', + 6513 => 'ፊ', + 6514 => 'ፋ', + 6515 => 'ፌ', + 6516 => 'ፍ', + 6517 => 'ፎ', + 6518 => 'ፏ', + 6519 => 'ᎈ', + 6520 => 'ᎉ', + 6521 => 'ᎊ', + 6522 => 'ᎋ', + 6523 => 'ፐ', + 6524 => 'ፑ', + 6525 => 'ፒ', + 6526 => 'ፓ', + 6527 => 'ፔ', + 6528 => 'ፕ', + 6529 => 'ፖ', + 6530 => 'ፗ', + 6531 => 'ᎌ', + 6532 => 'ᎍ', + 6533 => 'ᎎ', + 6534 => 'ᎏ', + 6535 => 'ⶒ', + 6536 => 'ፘ', + 6537 => 'ፙ', + 6538 => 'ፚ', + 6539 => 'ⶠ', + 6540 => 'ⶡ', + 6541 => 'ⶢ', + 6542 => 'ⶣ', + 6543 => 'ⶤ', + 6544 => 'ⶥ', + 6545 => 'ⶦ', + 6546 => 'ⶨ', + 6547 => 'ⶩ', + 6548 => 'ⶪ', + 6549 => 'ⶫ', + 6550 => 'ⶬ', + 6551 => 'ⶭ', + 6552 => 'ⶮ', + 6553 => 'ⶰ', + 6554 => 'ⶱ', + 6555 => 'ⶲ', + 6556 => 'ⶳ', + 6557 => 'ⶴ', + 6558 => 'ⶵ', + 6559 => 'ⶶ', + 6560 => 'ⶸ', + 6561 => 'ⶹ', + 6562 => 'ⶺ', + 6563 => 'ⶻ', + 6564 => 'ⶼ', + 6565 => 'ⶽ', + 6566 => 'ⶾ', + 6567 => 'ⷀ', + 6568 => 'ⷁ', + 6569 => 'ⷂ', + 6570 => 'ⷃ', + 6571 => 'ⷄ', + 6572 => 'ⷅ', + 6573 => 'ⷆ', + 6574 => 'ⷈ', + 6575 => 'ⷉ', + 6576 => 'ⷊ', + 6577 => 'ⷋ', + 6578 => 'ⷌ', + 6579 => 'ⷍ', + 6580 => 'ⷎ', + 6581 => 'ⷐ', + 6582 => 'ⷑ', + 6583 => 'ⷒ', + 6584 => 'ⷓ', + 6585 => 'ⷔ', + 6586 => 'ⷕ', + 6587 => 'ⷖ', + 6588 => 'ⷘ', + 6589 => 'ⷙ', + 6590 => 'ⷚ', + 6591 => 'ⷛ', + 6592 => 'ⷜ', + 6593 => 'ⷝ', + 6594 => 'ⷞ', + 6595 => 'ॐ', + 6596 => 'ॲ', + 6597 => 'ऄ', + 6598 => 'अ', + 6599 => 'आ', + 6600 => 'ॳ', + 6601 => 'ॴ', + 6602 => 'ॵ', + 6603 => 'ॶ', + 6604 => 'ॷ', + 6605 => 'इ', + 6606 => 'ई', + 6607 => 'उ', + 6608 => 'ऊ', + 6609 => 'ऋ', + 6610 => 'ॠ', + 6611 => 'ऌ', + 6612 => 'ॡ', + 6613 => 'ऍ', + 6614 => 'ऎ', + 6615 => 'ए', + 6616 => 'ऐ', + 6617 => 'ऑ', + 6618 => 'ऒ', + 6619 => 'ओ', + 6620 => 'औ', + 6621 => 'क', + 6622 => 'ख', + 6623 => 'ग', + 6624 => 'ॻ', + 6625 => 'घ', + 6626 => 'ङ', + 6627 => 'च', + 6628 => 'छ', + 6629 => 'ज', + 6630 => 'ॹ', + 6631 => 'ॼ', + 6632 => 'झ', + 6633 => 'ञ', + 6634 => 'ट', + 6635 => 'ठ', + 6636 => 'ड', + 6637 => 'ॾ', + 6638 => 'ढ', + 6639 => 'ण', + 6640 => 'त', + 6641 => 'थ', + 6642 => 'द', + 6643 => 'ध', + 6644 => 'न', + 6645 => 'प', + 6646 => 'फ', + 6647 => 'ब', + 6648 => 'ॿ', + 6649 => 'भ', + 6650 => 'म', + 6651 => 'य', + 6652 => 'ॺ', + 6653 => 'र', + 6654 => 'ल', + 6655 => 'ळ', + 6656 => 'व', + 6657 => 'श', + 6658 => 'ष', + 6659 => 'स', + 6660 => 'ह', + 6661 => 'ऽ', + 6662 => 'ॽ', + 6663 => 'ᳩ', + 6664 => 'ꣲ', + 6665 => 'ꣻ', + 6666 => 'অ', + 6667 => 'আ', + 6668 => 'ই', + 6669 => 'ঈ', + 6670 => 'উ', + 6671 => 'ঊ', + 6672 => 'ঋ', + 6673 => 'ৠ', + 6674 => 'ঌ', + 6675 => 'ৡ', + 6676 => 'এ', + 6677 => 'ঐ', + 6678 => 'ও', + 6679 => 'ঔ', + 6680 => 'ক', + 6681 => 'খ', + 6682 => 'গ', + 6683 => 'ঘ', + 6684 => 'ঙ', + 6685 => 'চ', + 6686 => 'ছ', + 6687 => 'জ', + 6688 => 'ঝ', + 6689 => 'ঞ', + 6690 => 'ট', + 6691 => 'ঠ', + 6692 => 'ড', + 6693 => 'ঢ', + 6694 => 'ণ', + 6695 => 'ত', + 6696 => 'থ', + 6697 => 'দ', + 6698 => 'ধ', + 6699 => 'ন', + 6700 => 'প', + 6701 => 'ফ', + 6702 => 'ব', + 6703 => 'ভ', + 6704 => 'ম', + 6705 => 'য', + 6706 => 'র', + 6707 => 'ৰ', + 6708 => 'ল', + 6709 => 'ৱ', + 6710 => 'শ', + 6711 => 'ষ', + 6712 => 'স', + 6713 => 'হ', + 6714 => 'ঽ', + 6715 => 'ੴ', + 6716 => 'ੳ', + 6717 => 'ਉ', + 6718 => 'ਊ', + 6719 => 'ਓ', + 6720 => 'ਅ', + 6721 => 'ਆ', + 6722 => 'ਐ', + 6723 => 'ਔ', + 6724 => 'ੲ', + 6725 => 'ਇ', + 6726 => 'ਈ', + 6727 => 'ਏ', + 6728 => 'ਸ', + 6729 => 'ਹ', + 6730 => 'ਕ', + 6731 => 'ਖ', + 6732 => 'ਗ', + 6733 => 'ਘ', + 6734 => 'ਙ', + 6735 => 'ਚ', + 6736 => 'ਛ', + 6737 => 'ਜ', + 6738 => 'ਝ', + 6739 => 'ਞ', + 6740 => 'ਟ', + 6741 => 'ਠ', + 6742 => 'ਡ', + 6743 => 'ਢ', + 6744 => 'ਣ', + 6745 => 'ਤ', + 6746 => 'ਥ', + 6747 => 'ਦ', + 6748 => 'ਧ', + 6749 => 'ਨ', + 6750 => 'ਪ', + 6751 => 'ਫ', + 6752 => 'ਬ', + 6753 => 'ਭ', + 6754 => 'ਮ', + 6755 => 'ਯ', + 6756 => 'ਰ', + 6757 => 'ਲ', + 6758 => 'ਵ', + 6759 => 'ੜ', + 6760 => 'ૐ', + 6761 => 'અ', + 6762 => 'આ', + 6763 => 'ઇ', + 6764 => 'ઈ', + 6765 => 'ઉ', + 6766 => 'ઊ', + 6767 => 'ઋ', + 6768 => 'ૠ', + 6769 => 'ઌ', + 6770 => 'ૡ', + 6771 => 'ઍ', + 6772 => 'એ', + 6773 => 'ઐ', + 6774 => 'ઑ', + 6775 => 'ઓ', + 6776 => 'ઔ', + 6777 => 'ક', + 6778 => 'ખ', + 6779 => 'ગ', + 6780 => 'ઘ', + 6781 => 'ઙ', + 6782 => 'ચ', + 6783 => 'છ', + 6784 => 'જ', + 6785 => 'ઝ', + 6786 => 'ઞ', + 6787 => 'ટ', + 6788 => 'ઠ', + 6789 => 'ડ', + 6790 => 'ઢ', + 6791 => 'ણ', + 6792 => 'ત', + 6793 => 'થ', + 6794 => 'દ', + 6795 => 'ધ', + 6796 => 'ન', + 6797 => 'પ', + 6798 => 'ફ', + 6799 => 'બ', + 6800 => 'ભ', + 6801 => 'મ', + 6802 => 'ય', + 6803 => 'ર', + 6804 => 'લ', + 6805 => 'વ', + 6806 => 'શ', + 6807 => 'ષ', + 6808 => 'સ', + 6809 => 'હ', + 6810 => 'ળ', + 6811 => 'ઽ', + 6812 => 'ଅ', + 6813 => 'ଆ', + 6814 => 'ଇ', + 6815 => 'ଈ', + 6816 => 'ଉ', + 6817 => 'ଊ', + 6818 => 'ଋ', + 6819 => 'ୠ', + 6820 => 'ଌ', + 6821 => 'ୡ', + 6822 => 'ଏ', + 6823 => 'ଐ', + 6824 => 'ଓ', + 6825 => 'ଔ', + 6826 => 'କ', + 6827 => 'ଖ', + 6828 => 'ଗ', + 6829 => 'ଘ', + 6830 => 'ଙ', + 6831 => 'ଚ', + 6832 => 'ଛ', + 6833 => 'ଜ', + 6834 => 'ଝ', + 6835 => 'ଞ', + 6836 => 'ଟ', + 6837 => 'ଠ', + 6838 => 'ଡ', + 6839 => 'ଢ', + 6840 => 'ଣ', + 6841 => 'ତ', + 6842 => 'ଥ', + 6843 => 'ଦ', + 6844 => 'ଧ', + 6845 => 'ନ', + 6846 => 'ପ', + 6847 => 'ଫ', + 6848 => 'ବ', + 6849 => 'ଭ', + 6850 => 'ମ', + 6851 => 'ଯ', + 6852 => 'ୟ', + 6853 => 'ର', + 6854 => 'ଲ', + 6855 => 'ଳ', + 6856 => 'ଵ', + 6857 => 'ୱ', + 6858 => 'ଶ', + 6859 => 'ଷ', + 6860 => 'ସ', + 6861 => 'ହ', + 6862 => 'ଽ', + 6863 => 'ௐ', + 6864 => 'அ', + 6865 => 'ஆ', + 6866 => 'இ', + 6867 => 'ஈ', + 6868 => 'உ', + 6869 => 'ஊ', + 6870 => 'எ', + 6871 => 'ஏ', + 6872 => 'ஐ', + 6873 => 'ஒ', + 6874 => 'ஓ', + 6875 => 'ஔ', + 6876 => 'ஃ', + 6877 => 'க', + 6878 => 'ங', + 6879 => 'ச', + 6880 => 'ஞ', + 6881 => 'ட', + 6882 => 'ண', + 6883 => 'த', + 6884 => 'ந', + 6885 => 'ப', + 6886 => 'ம', + 6887 => 'ய', + 6888 => 'ர', + 6889 => 'ல', + 6890 => 'வ', + 6891 => 'ழ', + 6892 => 'ள', + 6893 => 'ற', + 6894 => 'ன', + 6895 => 'ஜ', + 6896 => 'ஶ', + 6897 => 'ஷ', + 6898 => 'ஸ', + 6899 => 'ஹ', + 6900 => 'అ', + 6901 => 'ఆ', + 6902 => 'ఇ', + 6903 => 'ఈ', + 6904 => 'ఉ', + 6905 => 'ఊ', + 6906 => 'ఋ', + 6907 => 'ౠ', + 6908 => 'ఌ', + 6909 => 'ౡ', + 6910 => 'ఎ', + 6911 => 'ఏ', + 6912 => 'ఐ', + 6913 => 'ఒ', + 6914 => 'ఓ', + 6915 => 'ఔ', + 6916 => 'క', + 6917 => 'ఖ', + 6918 => 'గ', + 6919 => 'ఘ', + 6920 => 'ఙ', + 6921 => 'చ', + 6922 => 'ౘ', + 6923 => 'ఛ', + 6924 => 'జ', + 6925 => 'ౙ', + 6926 => 'ఝ', + 6927 => 'ఞ', + 6928 => 'ట', + 6929 => 'ఠ', + 6930 => 'డ', + 6931 => 'ఢ', + 6932 => 'ణ', + 6933 => 'త', + 6934 => 'థ', + 6935 => 'ద', + 6936 => 'ధ', + 6937 => 'న', + 6938 => 'ప', + 6939 => 'ఫ', + 6940 => 'బ', + 6941 => 'భ', + 6942 => 'మ', + 6943 => 'య', + 6944 => 'ర', + 6945 => 'ఱ', + 6946 => 'ల', + 6947 => 'వ', + 6948 => 'శ', + 6949 => 'ష', + 6950 => 'స', + 6951 => 'హ', + 6952 => 'ళ', + 6953 => 'ఽ', + 6954 => 'ಅ', + 6955 => 'ಆ', + 6956 => 'ಇ', + 6957 => 'ಈ', + 6958 => 'ಉ', + 6959 => 'ಊ', + 6960 => 'ಋ', + 6961 => 'ೠ', + 6962 => 'ಌ', + 6963 => 'ೡ', + 6964 => 'ಎ', + 6965 => 'ಏ', + 6966 => 'ಐ', + 6967 => 'ಒ', + 6968 => 'ಓ', + 6969 => 'ಔ', + 6970 => 'ಕ', + 6971 => 'ಖ', + 6972 => 'ಗ', + 6973 => 'ಘ', + 6974 => 'ಙ', + 6975 => 'ಚ', + 6976 => 'ಛ', + 6977 => 'ಜ', + 6978 => 'ಝ', + 6979 => 'ಞ', + 6980 => 'ಟ', + 6981 => 'ಠ', + 6982 => 'ಡ', + 6983 => 'ಢ', + 6984 => 'ಣ', + 6985 => 'ತ', + 6986 => 'ಥ', + 6987 => 'ದ', + 6988 => 'ಧ', + 6989 => 'ನ', + 6990 => 'ಪ', + 6991 => 'ಫ', + 6992 => 'ಬ', + 6993 => 'ಭ', + 6994 => 'ಮ', + 6995 => 'ಯ', + 6996 => 'ರ', + 6997 => 'ಱ', + 6998 => 'ಲ', + 6999 => 'ವ', + 7000 => 'ಶ', + 7001 => 'ಷ', + 7002 => 'ಸ', + 7003 => 'ಹ', + 7004 => 'ಳ', + 7005 => 'ೞ', + 7006 => 'ಽ', + 7007 => 'ೱ', + 7008 => 'ೲ', + 7009 => 'അ', + 7010 => 'ആ', + 7011 => 'ഇ', + 7012 => 'ഈ', + 7013 => 'ഉ', + 7014 => 'ഊ', + 7015 => 'ഋ', + 7016 => 'ൠ', + 7017 => 'ഌ', + 7018 => 'ൡ', + 7019 => 'എ', + 7020 => 'ഏ', + 7021 => 'ഐ', + 7022 => 'ഒ', + 7023 => 'ഓ', + 7024 => 'ഔ', + 7025 => 'ക', + 7026 => 'ഖ', + 7027 => 'ഗ', + 7028 => 'ഘ', + 7029 => 'ങ', + 7030 => 'ച', + 7031 => 'ഛ', + 7032 => 'ജ', + 7033 => 'ഝ', + 7034 => 'ഞ', + 7035 => 'ട', + 7036 => 'ഠ', + 7037 => 'ഡ', + 7038 => 'ഢ', + 7039 => 'ണ', + 7040 => 'ത', + 7041 => 'ഥ', + 7042 => 'ദ', + 7043 => 'ധ', + 7044 => 'ന', + 7045 => 'ഩ', + 7046 => 'പ', + 7047 => 'ഫ', + 7048 => 'ബ', + 7049 => 'ഭ', + 7050 => 'മ', + 7051 => 'യ', + 7052 => 'ര', + 7053 => 'ല', + 7054 => 'വ', + 7055 => 'ശ', + 7056 => 'ഷ', + 7057 => 'സ', + 7058 => 'ഹ', + 7059 => 'ള', + 7060 => 'ഴ', + 7061 => 'റ', + 7062 => 'ഺ', + 7063 => 'ഽ', + 7064 => 'අ', + 7065 => 'ආ', + 7066 => 'ඇ', + 7067 => 'ඈ', + 7068 => 'ඉ', + 7069 => 'ඊ', + 7070 => 'උ', + 7071 => 'ඌ', + 7072 => 'ඍ', + 7073 => 'ඎ', + 7074 => 'ඏ', + 7075 => 'ඐ', + 7076 => 'එ', + 7077 => 'ඒ', + 7078 => 'ඓ', + 7079 => 'ඔ', + 7080 => 'ඕ', + 7081 => 'ඖ', + 7082 => 'ක', + 7083 => 'ඛ', + 7084 => 'ග', + 7085 => 'ඝ', + 7086 => 'ඞ', + 7087 => 'ඟ', + 7088 => 'ච', + 7089 => 'ඡ', + 7090 => 'ජ', + 7091 => 'ඣ', + 7092 => 'ඤ', + 7093 => 'ඥ', + 7094 => 'ඦ', + 7095 => 'ට', + 7096 => 'ඨ', + 7097 => 'ඩ', + 7098 => 'ඪ', + 7099 => 'ණ', + 7100 => 'ඬ', + 7101 => 'ත', + 7102 => 'ථ', + 7103 => 'ද', + 7104 => 'ධ', + 7105 => 'න', + 7106 => 'ඳ', + 7107 => 'ප', + 7108 => 'ඵ', + 7109 => 'බ', + 7110 => 'භ', + 7111 => 'ම', + 7112 => 'ඹ', + 7113 => 'ය', + 7114 => 'ර', + 7115 => 'ල', + 7116 => 'ව', + 7117 => 'ශ', + 7118 => 'ෂ', + 7119 => 'ස', + 7120 => 'හ', + 7121 => 'ළ', + 7122 => 'ෆ', + 7123 => 'ꯀ', + 7124 => 'ꯁ', + 7125 => 'ꯂ', + 7126 => 'ꯃ', + 7127 => 'ꯄ', + 7128 => 'ꯅ', + 7129 => 'ꯆ', + 7130 => 'ꯇ', + 7131 => 'ꯈ', + 7132 => 'ꯉ', + 7133 => 'ꯊ', + 7134 => 'ꯋ', + 7135 => 'ꯌ', + 7136 => 'ꯍ', + 7137 => 'ꯎ', + 7138 => 'ꯏ', + 7139 => 'ꯐ', + 7140 => 'ꯑ', + 7141 => 'ꯒ', + 7142 => 'ꯓ', + 7143 => 'ꯔ', + 7144 => 'ꯕ', + 7145 => 'ꯖ', + 7146 => 'ꯗ', + 7147 => 'ꯘ', + 7148 => 'ꯙ', + 7149 => 'ꯚ', + 7150 => 'ꯛ', + 7151 => 'ꯜ', + 7152 => 'ꯝ', + 7153 => 'ꯞ', + 7154 => 'ꯟ', + 7155 => 'ꯠ', + 7156 => 'ꯡ', + 7157 => 'ꯢ', + 7158 => 'ꠀ', + 7159 => 'ꠁ', + 7160 => 'ꠃ', + 7161 => 'ꠄ', + 7162 => 'ꠅ', + 7163 => 'ꠇ', + 7164 => 'ꠈ', + 7165 => 'ꠉ', + 7166 => 'ꠊ', + 7167 => 'ꠌ', + 7168 => 'ꠍ', + 7169 => 'ꠎ', + 7170 => 'ꠏ', + 7171 => 'ꠐ', + 7172 => 'ꠑ', + 7173 => 'ꠒ', + 7174 => 'ꠓ', + 7175 => 'ꠔ', + 7176 => 'ꠕ', + 7177 => 'ꠖ', + 7178 => 'ꠗ', + 7179 => 'ꠘ', + 7180 => 'ꠙ', + 7181 => 'ꠚ', + 7182 => 'ꠛ', + 7183 => 'ꠜ', + 7184 => 'ꠝ', + 7185 => 'ꠞ', + 7186 => 'ꠟ', + 7187 => 'ꠠ', + 7188 => 'ꠡ', + 7189 => 'ꠢ', + 7190 => 'ꢂ', + 7191 => 'ꢃ', + 7192 => 'ꢄ', + 7193 => 'ꢅ', + 7194 => 'ꢆ', + 7195 => 'ꢇ', + 7196 => 'ꢈ', + 7197 => 'ꢉ', + 7198 => 'ꢊ', + 7199 => 'ꢋ', + 7200 => 'ꢌ', + 7201 => 'ꢍ', + 7202 => 'ꢎ', + 7203 => 'ꢏ', + 7204 => 'ꢐ', + 7205 => 'ꢑ', + 7206 => 'ꢒ', + 7207 => 'ꢓ', + 7208 => 'ꢔ', + 7209 => 'ꢕ', + 7210 => 'ꢖ', + 7211 => 'ꢗ', + 7212 => 'ꢘ', + 7213 => 'ꢙ', + 7214 => 'ꢚ', + 7215 => 'ꢛ', + 7216 => 'ꢜ', + 7217 => 'ꢝ', + 7218 => 'ꢞ', + 7219 => 'ꢟ', + 7220 => 'ꢠ', + 7221 => 'ꢡ', + 7222 => 'ꢢ', + 7223 => 'ꢣ', + 7224 => 'ꢤ', + 7225 => 'ꢥ', + 7226 => 'ꢦ', + 7227 => 'ꢧ', + 7228 => 'ꢨ', + 7229 => 'ꢩ', + 7230 => 'ꢪ', + 7231 => 'ꢫ', + 7232 => 'ꢬ', + 7233 => 'ꢭ', + 7234 => 'ꢮ', + 7235 => 'ꢯ', + 7236 => 'ꢰ', + 7237 => 'ꢱ', + 7238 => 'ꢲ', + 7239 => 'ꢳ', + 7240 => '𑂃', + 7241 => '𑂄', + 7242 => '𑂅', + 7243 => '𑂆', + 7244 => '𑂇', + 7245 => '𑂈', + 7246 => '𑂉', + 7247 => '𑂊', + 7248 => '𑂋', + 7249 => '𑂌', + 7250 => '𑂍', + 7251 => '𑂎', + 7252 => '𑂏', + 7253 => '𑂐', + 7254 => '𑂑', + 7255 => '𑂒', + 7256 => '𑂓', + 7257 => '𑂔', + 7258 => '𑂕', + 7259 => '𑂖', + 7260 => '𑂗', + 7261 => '𑂘', + 7262 => '𑂙', + 7263 => '𑂛', + 7264 => '𑂝', + 7265 => '𑂞', + 7266 => '𑂟', + 7267 => '𑂠', + 7268 => '𑂡', + 7269 => '𑂢', + 7270 => '𑂣', + 7271 => '𑂤', + 7272 => '𑂥', + 7273 => '𑂦', + 7274 => '𑂧', + 7275 => '𑂨', + 7276 => '𑂩', + 7277 => '𑂪', + 7278 => '𑂬', + 7279 => '𑂭', + 7280 => '𑂮', + 7281 => '𑂯', + 7282 => 'ᮃ', + 7283 => 'ᮄ', + 7284 => 'ᮅ', + 7285 => 'ᮆ', + 7286 => 'ᮇ', + 7287 => 'ᮈ', + 7288 => 'ᮉ', + 7289 => 'ᮊ', + 7290 => 'ᮮ', + 7291 => 'ᮋ', + 7292 => 'ᮌ', + 7293 => 'ᮍ', + 7294 => 'ᮎ', + 7295 => 'ᮏ', + 7296 => 'ᮐ', + 7297 => 'ᮑ', + 7298 => 'ᮒ', + 7299 => 'ᮓ', + 7300 => 'ᮔ', + 7301 => 'ᮕ', + 7302 => 'ᮖ', + 7303 => 'ᮗ', + 7304 => 'ᮘ', + 7305 => 'ᮙ', + 7306 => 'ᮚ', + 7307 => 'ᮛ', + 7308 => 'ᮜ', + 7309 => 'ᮝ', + 7310 => 'ᮞ', + 7311 => 'ᮟ', + 7312 => 'ᮯ', + 7313 => 'ᮠ', + 7314 => '𑀅', + 7315 => '𑀆', + 7316 => '𑀇', + 7317 => '𑀈', + 7318 => '𑀉', + 7319 => '𑀊', + 7320 => '𑀋', + 7321 => '𑀌', + 7322 => '𑀍', + 7323 => '𑀎', + 7324 => '𑀏', + 7325 => '𑀐', + 7326 => '𑀑', + 7327 => '𑀒', + 7328 => '𑀓', + 7329 => '𑀔', + 7330 => '𑀕', + 7331 => '𑀖', + 7332 => '𑀗', + 7333 => '𑀘', + 7334 => '𑀙', + 7335 => '𑀚', + 7336 => '𑀛', + 7337 => '𑀜', + 7338 => '𑀝', + 7339 => '𑀞', + 7340 => '𑀟', + 7341 => '𑀠', + 7342 => '𑀡', + 7343 => '𑀢', + 7344 => '𑀣', + 7345 => '𑀤', + 7346 => '𑀥', + 7347 => '𑀦', + 7348 => '𑀧', + 7349 => '𑀨', + 7350 => '𑀩', + 7351 => '𑀪', + 7352 => '𑀫', + 7353 => '𑀬', + 7354 => '𑀭', + 7355 => '𑀮', + 7356 => '𑀯', + 7357 => '𑀰', + 7358 => '𑀱', + 7359 => '𑀲', + 7360 => '𑀳', + 7361 => '𑀃', + 7362 => '𑀄', + 7363 => '𑀴', + 7364 => '𑀵', + 7365 => '𑀶', + 7366 => '𑀷', + 7367 => '𐨀', + 7368 => '𐨐', + 7369 => '𐨑', + 7370 => '𐨒', + 7371 => '𐨓', + 7372 => '𐨕', + 7373 => '𐨖', + 7374 => '𐨗', + 7375 => '𐨙', + 7376 => '𐨚', + 7377 => '𐨛', + 7378 => '𐨜', + 7379 => '𐨝', + 7380 => '𐨞', + 7381 => '𐨟', + 7382 => '𐨠', + 7383 => '𐨡', + 7384 => '𐨢', + 7385 => '𐨣', + 7386 => '𐨤', + 7387 => '𐨥', + 7388 => '𐨦', + 7389 => '𐨧', + 7390 => '𐨨', + 7391 => '𐨩', + 7392 => '𐨪', + 7393 => '𐨫', + 7394 => '𐨬', + 7395 => '𐨭', + 7396 => '𐨮', + 7397 => '𐨯', + 7398 => '𐨰', + 7399 => '𐨱', + 7400 => '𐨲', + 7401 => '𐨳', + 7402 => 'ก', + 7403 => 'ข', + 7404 => 'ฃ', + 7405 => 'ค', + 7406 => 'ฅ', + 7407 => 'ฆ', + 7408 => 'ง', + 7409 => 'จ', + 7410 => 'ฉ', + 7411 => 'ช', + 7412 => 'ซ', + 7413 => 'ฌ', + 7414 => 'ญ', + 7415 => 'ฎ', + 7416 => 'ฏ', + 7417 => 'ฐ', + 7418 => 'ฑ', + 7419 => 'ฒ', + 7420 => 'ณ', + 7421 => 'ด', + 7422 => 'ต', + 7423 => 'ถ', + 7424 => 'ท', + 7425 => 'ธ', + 7426 => 'น', + 7427 => 'บ', + 7428 => 'ป', + 7429 => 'ผ', + 7430 => 'ฝ', + 7431 => 'พ', + 7432 => 'ฟ', + 7433 => 'ภ', + 7434 => 'ม', + 7435 => 'ย', + 7436 => 'ร', + 7437 => 'ฤ', + 7438 => 'ล', + 7439 => 'ฦ', + 7440 => 'ว', + 7441 => 'ศ', + 7442 => 'ษ', + 7443 => 'ส', + 7444 => 'ห', + 7445 => 'ฬ', + 7446 => 'อ', + 7447 => 'ฮ', + 7448 => 'ฯ', + 7449 => 'ะ', + 7450 => 'า', + 7451 => 'ำ', + 7452 => 'เ', + 7453 => 'แ', + 7454 => 'โ', + 7455 => 'ใ', + 7456 => 'ไ', + 7457 => 'ๅ', + 7458 => 'ກ', + 7459 => 'ຂ', + 7460 => 'ຄ', + 7461 => 'ງ', + 7462 => 'ຈ', + 7463 => 'ສ', + 7464 => 'ຊ', + 7465 => 'ຍ', + 7466 => 'ດ', + 7467 => 'ຕ', + 7468 => 'ຖ', + 7469 => 'ທ', + 7470 => 'ນ', + 7471 => 'ບ', + 7472 => 'ປ', + 7473 => 'ຜ', + 7474 => 'ຝ', + 7475 => 'ພ', + 7476 => 'ຟ', + 7477 => 'ມ', + 7478 => 'ຢ', + 7479 => 'ຣ', + 7480 => 'ລ', + 7481 => 'ວ', + 7482 => 'ຫ', + 7483 => 'ອ', + 7484 => 'ຮ', + 7485 => 'ຯ', + 7486 => 'ະ', + 7487 => 'າ', + 7488 => 'ຳ', + 7489 => 'ຽ', + 7490 => 'ເ', + 7491 => 'ແ', + 7492 => 'ໂ', + 7493 => 'ໃ', + 7494 => 'ໄ', + 7495 => 'ꪀ', + 7496 => 'ꪁ', + 7497 => 'ꪂ', + 7498 => 'ꪃ', + 7499 => 'ꪄ', + 7500 => 'ꪅ', + 7501 => 'ꪆ', + 7502 => 'ꪇ', + 7503 => 'ꪈ', + 7504 => 'ꪉ', + 7505 => 'ꪊ', + 7506 => 'ꪋ', + 7507 => 'ꪌ', + 7508 => 'ꪍ', + 7509 => 'ꪎ', + 7510 => 'ꪏ', + 7511 => 'ꪐ', + 7512 => 'ꪑ', + 7513 => 'ꪒ', + 7514 => 'ꪓ', + 7515 => 'ꪔ', + 7516 => 'ꪕ', + 7517 => 'ꪖ', + 7518 => 'ꪗ', + 7519 => 'ꪘ', + 7520 => 'ꪙ', + 7521 => 'ꪚ', + 7522 => 'ꪛ', + 7523 => 'ꪜ', + 7524 => 'ꪝ', + 7525 => 'ꪞ', + 7526 => 'ꪟ', + 7527 => 'ꪠ', + 7528 => 'ꪡ', + 7529 => 'ꪢ', + 7530 => 'ꪣ', + 7531 => 'ꪤ', + 7532 => 'ꪥ', + 7533 => 'ꪦ', + 7534 => 'ꪧ', + 7535 => 'ꪨ', + 7536 => 'ꪩ', + 7537 => 'ꪪ', + 7538 => 'ꪫ', + 7539 => 'ꪬ', + 7540 => 'ꪭ', + 7541 => 'ꪮ', + 7542 => 'ꪯ', + 7543 => 'ꪱ', + 7544 => 'ꪵ', + 7545 => 'ꪶ', + 7546 => 'ꪹ', + 7547 => 'ꪺ', + 7548 => 'ꪻ', + 7549 => 'ꪼ', + 7550 => 'ꪽ', + 7551 => 'ꫀ', + 7552 => 'ꫂ', + 7553 => 'ꫛ', + 7554 => 'ꫜ', + 7555 => 'ཀ', + 7556 => 'ཫ', + 7557 => 'ཁ', + 7558 => 'ག', + 7559 => 'ང', + 7560 => 'ཅ', + 7561 => 'ཆ', + 7562 => 'ཇ', + 7563 => 'ཉ', + 7564 => 'ཊ', + 7565 => 'ཋ', + 7566 => 'ཌ', + 7567 => 'ཎ', + 7568 => 'ཏ', + 7569 => 'ཐ', + 7570 => 'ད', + 7571 => 'ན', + 7572 => 'པ', + 7573 => 'ཕ', + 7574 => 'བ', + 7575 => 'མ', + 7576 => 'ཙ', + 7577 => 'ཚ', + 7578 => 'ཛ', + 7579 => 'ཝ', + 7580 => 'ཞ', + 7581 => 'ཟ', + 7582 => 'འ', + 7583 => 'ཡ', + 7584 => 'ར', + 7585 => 'ཬ', + 7586 => 'ལ', + 7587 => 'ཤ', + 7588 => 'ཥ', + 7589 => 'ས', + 7590 => 'ཧ', + 7591 => 'ཨ', + 7592 => 'ྈ', + 7593 => 'ྉ', + 7594 => 'ྌ', + 7595 => 'ྊ', + 7596 => 'ྋ', + 7597 => 'ᰀ', + 7598 => 'ᰁ', + 7599 => 'ᰂ', + 7600 => 'ᰃ', + 7601 => 'ᰄ', + 7602 => 'ᰅ', + 7603 => 'ᰆ', + 7604 => 'ᰇ', + 7605 => 'ᰈ', + 7606 => 'ᰉ', + 7607 => 'ᱍ', + 7608 => 'ᱎ', + 7609 => 'ᱏ', + 7610 => 'ᰊ', + 7611 => 'ᰋ', + 7612 => 'ᰌ', + 7613 => 'ᰍ', + 7614 => 'ᰎ', + 7615 => 'ᰏ', + 7616 => 'ᰐ', + 7617 => 'ᰑ', + 7618 => 'ᰒ', + 7619 => 'ᰓ', + 7620 => 'ᰔ', + 7621 => 'ᰕ', + 7622 => 'ᰖ', + 7623 => 'ᰗ', + 7624 => 'ᰘ', + 7625 => 'ᰙ', + 7626 => 'ᰚ', + 7627 => 'ᰛ', + 7628 => 'ᰜ', + 7629 => 'ᰝ', + 7630 => 'ᰞ', + 7631 => 'ᰟ', + 7632 => 'ᰠ', + 7633 => 'ᰡ', + 7634 => 'ᰢ', + 7635 => 'ᰣ', + 7636 => 'ꡀ', + 7637 => 'ꡁ', + 7638 => 'ꡂ', + 7639 => 'ꡃ', + 7640 => 'ꡄ', + 7641 => 'ꡅ', + 7642 => 'ꡆ', + 7643 => 'ꡇ', + 7644 => 'ꡩ', + 7645 => 'ꡪ', + 7646 => 'ꡫ', + 7647 => 'ꡬ', + 7648 => 'ꡈ', + 7649 => 'ꡉ', + 7650 => 'ꡊ', + 7651 => 'ꡋ', + 7652 => 'ꡌ', + 7653 => 'ꡍ', + 7654 => 'ꡎ', + 7655 => 'ꡏ', + 7656 => 'ꡐ', + 7657 => 'ꡑ', + 7658 => 'ꡒ', + 7659 => 'ꡓ', + 7660 => 'ꡧ', + 7661 => 'ꡔ', + 7662 => 'ꡕ', + 7663 => 'ꡖ', + 7664 => 'ꡗ', + 7665 => 'ꡨ', + 7666 => 'ꡭ', + 7667 => 'ꡘ', + 7668 => 'ꡱ', + 7669 => 'ꡲ', + 7670 => 'ꡙ', + 7671 => 'ꡚ', + 7672 => 'ꡮ', + 7673 => 'ꡛ', + 7674 => 'ꡜ', + 7675 => 'ꡯ', + 7676 => 'ꡰ', + 7677 => 'ꡝ', + 7678 => 'ꡢ', + 7679 => 'ꡣ', + 7680 => 'ꡤ', + 7681 => 'ꡥ', + 7682 => 'ꡞ', + 7683 => 'ꡟ', + 7684 => 'ꡠ', + 7685 => 'ꡡ', + 7686 => 'ꡦ', + 7687 => 'ꡳ', + 7688 => 'ᤀ', + 7689 => 'ᤁ', + 7690 => 'ᤂ', + 7691 => 'ᤃ', + 7692 => 'ᤄ', + 7693 => 'ᤅ', + 7694 => 'ᤆ', + 7695 => 'ᤇ', + 7696 => 'ᤈ', + 7697 => 'ᤉ', + 7698 => 'ᤊ', + 7699 => 'ᤋ', + 7700 => 'ᤌ', + 7701 => 'ᤍ', + 7702 => 'ᤎ', + 7703 => 'ᤏ', + 7704 => 'ᤐ', + 7705 => 'ᤑ', + 7706 => 'ᤒ', + 7707 => 'ᤓ', + 7708 => 'ᤔ', + 7709 => 'ᤕ', + 7710 => 'ᤖ', + 7711 => 'ᤗ', + 7712 => 'ᤘ', + 7713 => 'ᤙ', + 7714 => 'ᤚ', + 7715 => 'ᤛ', + 7716 => 'ᤜ', + 7717 => 'ᜀ', + 7718 => 'ᜁ', + 7719 => 'ᜂ', + 7720 => 'ᜃ', + 7721 => 'ᜄ', + 7722 => 'ᜅ', + 7723 => 'ᜆ', + 7724 => 'ᜇ', + 7725 => 'ᜈ', + 7726 => 'ᜉ', + 7727 => 'ᜊ', + 7728 => 'ᜋ', + 7729 => 'ᜌ', + 7730 => 'ᜎ', + 7731 => 'ᜏ', + 7732 => 'ᜐ', + 7733 => 'ᜑ', + 7734 => 'ᜠ', + 7735 => 'ᜡ', + 7736 => 'ᜢ', + 7737 => 'ᜣ', + 7738 => 'ᜤ', + 7739 => 'ᜥ', + 7740 => 'ᜦ', + 7741 => 'ᜧ', + 7742 => 'ᜨ', + 7743 => 'ᜩ', + 7744 => 'ᜪ', + 7745 => 'ᜫ', + 7746 => 'ᜬ', + 7747 => 'ᜭ', + 7748 => 'ᜮ', + 7749 => 'ᜯ', + 7750 => 'ᜰ', + 7751 => 'ᜱ', + 7752 => 'ᝀ', + 7753 => 'ᝁ', + 7754 => 'ᝂ', + 7755 => 'ᝃ', + 7756 => 'ᝄ', + 7757 => 'ᝅ', + 7758 => 'ᝆ', + 7759 => 'ᝇ', + 7760 => 'ᝈ', + 7761 => 'ᝉ', + 7762 => 'ᝊ', + 7763 => 'ᝋ', + 7764 => 'ᝌ', + 7765 => 'ᝍ', + 7766 => 'ᝎ', + 7767 => 'ᝏ', + 7768 => 'ᝐ', + 7769 => 'ᝑ', + 7770 => 'ᝠ', + 7771 => 'ᝡ', + 7772 => 'ᝢ', + 7773 => 'ᝣ', + 7774 => 'ᝤ', + 7775 => 'ᝥ', + 7776 => 'ᝦ', + 7777 => 'ᝧ', + 7778 => 'ᝨ', + 7779 => 'ᝩ', + 7780 => 'ᝪ', + 7781 => 'ᝫ', + 7782 => 'ᝬ', + 7783 => 'ᝮ', + 7784 => 'ᝯ', + 7785 => 'ᝰ', + 7786 => 'ᨀ', + 7787 => 'ᨁ', + 7788 => 'ᨂ', + 7789 => 'ᨃ', + 7790 => 'ᨄ', + 7791 => 'ᨅ', + 7792 => 'ᨆ', + 7793 => 'ᨇ', + 7794 => 'ᨈ', + 7795 => 'ᨉ', + 7796 => 'ᨊ', + 7797 => 'ᨋ', + 7798 => 'ᨌ', + 7799 => 'ᨍ', + 7800 => 'ᨎ', + 7801 => 'ᨏ', + 7802 => 'ᨐ', + 7803 => 'ᨑ', + 7804 => 'ᨒ', + 7805 => 'ᨓ', + 7806 => 'ᨔ', + 7807 => 'ᨕ', + 7808 => 'ᨖ', + 7809 => 'ᯀ', + 7810 => 'ᯂ', + 7811 => 'ᯅ', + 7812 => 'ᯇ', + 7813 => 'ᯉ', + 7814 => 'ᯋ', + 7815 => 'ᯎ', + 7816 => 'ᯐ', + 7817 => 'ᯑ', + 7818 => 'ᯒ', + 7819 => 'ᯔ', + 7820 => 'ᯖ', + 7821 => 'ᯘ', + 7822 => 'ᯛ', + 7823 => 'ᯝ', + 7824 => 'ᯞ', + 7825 => 'ᯠ', + 7826 => 'ᯡ', + 7827 => 'ᯢ', + 7828 => 'ᯣ', + 7829 => 'ᯤ', + 7830 => 'ᯥ', + 7831 => 'ꤰ', + 7832 => 'ꤱ', + 7833 => 'ꤲ', + 7834 => 'ꤳ', + 7835 => 'ꤴ', + 7836 => 'ꤵ', + 7837 => 'ꤶ', + 7838 => 'ꤷ', + 7839 => 'ꤸ', + 7840 => 'ꤹ', + 7841 => 'ꤺ', + 7842 => 'ꤻ', + 7843 => 'ꤼ', + 7844 => 'ꤽ', + 7845 => 'ꤾ', + 7846 => 'ꤿ', + 7847 => 'ꥀ', + 7848 => 'ꥁ', + 7849 => 'ꥂ', + 7850 => 'ꥃ', + 7851 => 'ꥄ', + 7852 => 'ꥅ', + 7853 => 'ꥆ', + 7854 => 'ꤊ', + 7855 => 'ꤋ', + 7856 => 'ꤌ', + 7857 => 'ꤍ', + 7858 => 'ꤎ', + 7859 => 'ꤏ', + 7860 => 'ꤐ', + 7861 => 'ꤑ', + 7862 => 'ꤒ', + 7863 => 'ꤓ', + 7864 => 'ꤔ', + 7865 => 'ꤕ', + 7866 => 'ꤖ', + 7867 => 'ꤗ', + 7868 => 'ꤘ', + 7869 => 'ꤙ', + 7870 => 'ꤚ', + 7871 => 'ꤛ', + 7872 => 'ꤜ', + 7873 => 'ꤝ', + 7874 => 'ꤞ', + 7875 => 'ꤟ', + 7876 => 'ꤠ', + 7877 => 'ꤡ', + 7878 => 'ꤢ', + 7879 => 'ꤣ', + 7880 => 'ꤤ', + 7881 => 'ꤥ', + 7882 => 'က', + 7883 => 'ၵ', + 7884 => 'ခ', + 7885 => 'ၶ', + 7886 => 'ဂ', + 7887 => 'ၷ', + 7888 => 'ꩠ', + 7889 => 'ဃ', + 7890 => 'င', + 7891 => 'ၚ', + 7892 => 'စ', + 7893 => 'ၸ', + 7894 => 'ꩡ', + 7895 => 'ဆ', + 7896 => 'ꩢ', + 7897 => 'ဇ', + 7898 => 'ꩣ', + 7899 => 'ၹ', + 7900 => 'ꩲ', + 7901 => 'ဈ', + 7902 => 'ၛ', + 7903 => 'ꩤ', + 7904 => 'ၡ', + 7905 => 'ဉ', + 7906 => 'ၺ', + 7907 => 'ꩥ', + 7908 => 'ည', + 7909 => 'ဋ', + 7910 => 'ꩦ', + 7911 => 'ဌ', + 7912 => 'ꩧ', + 7913 => 'ဍ', + 7914 => 'ꩨ', + 7915 => 'ဎ', + 7916 => 'ꩩ', + 7917 => 'ဏ', + 7918 => 'ၮ', + 7919 => 'တ', + 7920 => 'ထ', + 7921 => 'ဒ', + 7922 => 'ၻ', + 7923 => 'ဓ', + 7924 => 'ꩪ', + 7925 => 'န', + 7926 => 'ၼ', + 7927 => 'ꩫ', + 7928 => 'ပ', + 7929 => 'ဖ', + 7930 => 'ၽ', + 7931 => 'ၾ', + 7932 => 'ꩯ', + 7933 => 'ႎ', + 7934 => 'ဗ', + 7935 => 'ၿ', + 7936 => 'ဘ', + 7937 => 'မ', + 7938 => 'ယ', + 7939 => 'ရ', + 7940 => 'ꩳ', + 7941 => 'ꩺ', + 7942 => 'လ', + 7943 => 'ဝ', + 7944 => 'ႀ', + 7945 => 'ၐ', + 7946 => 'ၑ', + 7947 => 'ၥ', + 7948 => 'သ', + 7949 => 'ꩬ', + 7950 => 'ဟ', + 7951 => 'ႁ', + 7952 => 'ꩭ', + 7953 => 'ꩮ', + 7954 => 'ꩱ', + 7955 => 'ဠ', + 7956 => 'ၜ', + 7957 => 'ၝ', + 7958 => 'ၯ', + 7959 => 'ၰ', + 7960 => 'ၦ', + 7961 => 'အ', + 7962 => 'ဢ', + 7963 => 'ဣ', + 7964 => 'ဤ', + 7965 => 'ဥ', + 7966 => 'ဦ', + 7967 => 'ၒ', + 7968 => 'ၓ', + 7969 => 'ၔ', + 7970 => 'ၕ', + 7971 => 'ဧ', + 7972 => 'ဨ', + 7973 => 'ဩ', + 7974 => 'ဪ', + 7975 => 'ꩴ', + 7976 => 'ꩵ', + 7977 => 'ꩶ', + 7978 => 'ក', + 7979 => 'ខ', + 7980 => 'គ', + 7981 => 'ឃ', + 7982 => 'ង', + 7983 => 'ច', + 7984 => 'ឆ', + 7985 => 'ជ', + 7986 => 'ឈ', + 7987 => 'ញ', + 7988 => 'ដ', + 7989 => 'ឋ', + 7990 => 'ឌ', + 7991 => 'ឍ', + 7992 => 'ណ', + 7993 => 'ត', + 7994 => 'ថ', + 7995 => 'ទ', + 7996 => 'ធ', + 7997 => 'ន', + 7998 => 'ប', + 7999 => 'ផ', + 8000 => 'ព', + 8001 => 'ភ', + 8002 => 'ម', + 8003 => 'យ', + 8004 => 'រ', + 8005 => 'ល', + 8006 => 'វ', + 8007 => 'ឝ', + 8008 => 'ឞ', + 8009 => 'ស', + 8010 => 'ហ', + 8011 => 'ឡ', + 8012 => 'អ', + 8013 => 'ៜ', + 8014 => 'ឣ', + 8015 => 'ឤ', + 8016 => 'ឥ', + 8017 => 'ឦ', + 8018 => 'ឧ', + 8019 => 'ឨ', + 8020 => 'ឩ', + 8021 => 'ឪ', + 8022 => 'ឫ', + 8023 => 'ឬ', + 8024 => 'ឭ', + 8025 => 'ឮ', + 8026 => 'ឯ', + 8027 => 'ឰ', + 8028 => 'ឱ', + 8029 => 'ឲ', + 8030 => 'ឳ', + 8031 => 'ᥐ', + 8032 => 'ᥑ', + 8033 => 'ᥒ', + 8034 => 'ᥓ', + 8035 => 'ᥔ', + 8036 => 'ᥕ', + 8037 => 'ᥖ', + 8038 => 'ᥗ', + 8039 => 'ᥘ', + 8040 => 'ᥙ', + 8041 => 'ᥚ', + 8042 => 'ᥛ', + 8043 => 'ᥜ', + 8044 => 'ᥝ', + 8045 => 'ᥞ', + 8046 => 'ᥟ', + 8047 => 'ᥠ', + 8048 => 'ᥡ', + 8049 => 'ᥢ', + 8050 => 'ᥣ', + 8051 => 'ᥤ', + 8052 => 'ᥥ', + 8053 => 'ᥦ', + 8054 => 'ᥧ', + 8055 => 'ᥨ', + 8056 => 'ᥩ', + 8057 => 'ᥪ', + 8058 => 'ᥫ', + 8059 => 'ᥬ', + 8060 => 'ᥭ', + 8061 => 'ᥰ', + 8062 => 'ᥱ', + 8063 => 'ᥲ', + 8064 => 'ᥳ', + 8065 => 'ᥴ', + 8066 => 'ᦀ', + 8067 => 'ᦁ', + 8068 => 'ᦂ', + 8069 => 'ᦃ', + 8070 => 'ᦄ', + 8071 => 'ᦅ', + 8072 => 'ᦆ', + 8073 => 'ᦇ', + 8074 => 'ᦈ', + 8075 => 'ᦉ', + 8076 => 'ᦊ', + 8077 => 'ᦋ', + 8078 => 'ᦌ', + 8079 => 'ᦍ', + 8080 => 'ᦎ', + 8081 => 'ᦏ', + 8082 => 'ᦐ', + 8083 => 'ᦑ', + 8084 => 'ᦒ', + 8085 => 'ᦓ', + 8086 => 'ᦔ', + 8087 => 'ᦕ', + 8088 => 'ᦖ', + 8089 => 'ᦗ', + 8090 => 'ᦘ', + 8091 => 'ᦙ', + 8092 => 'ᦚ', + 8093 => 'ᦛ', + 8094 => 'ᦜ', + 8095 => 'ᦝ', + 8096 => 'ᦞ', + 8097 => 'ᦟ', + 8098 => 'ᦠ', + 8099 => 'ᦡ', + 8100 => 'ᦢ', + 8101 => 'ᦣ', + 8102 => 'ᦤ', + 8103 => 'ᦥ', + 8104 => 'ᦦ', + 8105 => 'ᦧ', + 8106 => 'ᦨ', + 8107 => 'ᦩ', + 8108 => 'ᦪ', + 8109 => 'ᦫ', + 8110 => 'ᧁ', + 8111 => 'ᧂ', + 8112 => 'ᧃ', + 8113 => 'ᧄ', + 8114 => 'ᧅ', + 8115 => 'ᧆ', + 8116 => 'ᧇ', + 8117 => 'ᨠ', + 8118 => 'ᨡ', + 8119 => 'ᨢ', + 8120 => 'ᨣ', + 8121 => 'ᨤ', + 8122 => 'ᨥ', + 8123 => 'ᨦ', + 8124 => 'ᨧ', + 8125 => 'ᨨ', + 8126 => 'ᨩ', + 8127 => 'ᨪ', + 8128 => 'ᨫ', + 8129 => 'ᨬ', + 8130 => 'ᨭ', + 8131 => 'ᨮ', + 8132 => 'ᨯ', + 8133 => 'ᨰ', + 8134 => 'ᨱ', + 8135 => 'ᨲ', + 8136 => 'ᨳ', + 8137 => 'ᨴ', + 8138 => 'ᨵ', + 8139 => 'ᨶ', + 8140 => 'ᨷ', + 8141 => 'ᨸ', + 8142 => 'ᨹ', + 8143 => 'ᨺ', + 8144 => 'ᨻ', + 8145 => 'ᨼ', + 8146 => 'ᨽ', + 8147 => 'ᨾ', + 8148 => 'ᨿ', + 8149 => 'ᩀ', + 8150 => 'ᩁ', + 8151 => 'ᩂ', + 8152 => 'ᩃ', + 8153 => 'ᩄ', + 8154 => 'ᩅ', + 8155 => 'ᩆ', + 8156 => 'ᩇ', + 8157 => 'ᩈ', + 8158 => 'ᩉ', + 8159 => 'ᩊ', + 8160 => 'ᩋ', + 8161 => 'ᩌ', + 8162 => 'ᩓ', + 8163 => 'ᩍ', + 8164 => 'ᩎ', + 8165 => 'ᩏ', + 8166 => 'ᩐ', + 8167 => 'ᩑ', + 8168 => 'ᩒ', + 8169 => 'ꨀ', + 8170 => 'ꨁ', + 8171 => 'ꨂ', + 8172 => 'ꨃ', + 8173 => 'ꨄ', + 8174 => 'ꨅ', + 8175 => 'ꨆ', + 8176 => 'ꨇ', + 8177 => 'ꨈ', + 8178 => 'ꨉ', + 8179 => 'ꨊ', + 8180 => 'ꨋ', + 8181 => 'ꨌ', + 8182 => 'ꨍ', + 8183 => 'ꨎ', + 8184 => 'ꨏ', + 8185 => 'ꨐ', + 8186 => 'ꨑ', + 8187 => 'ꨒ', + 8188 => 'ꨓ', + 8189 => 'ꨔ', + 8190 => 'ꨕ', + 8191 => 'ꨖ', + 8192 => 'ꨗ', + 8193 => 'ꨘ', + 8194 => 'ꨙ', + 8195 => 'ꨚ', + 8196 => 'ꨛ', + 8197 => 'ꨜ', + 8198 => 'ꨝ', + 8199 => 'ꨞ', + 8200 => 'ꨟ', + 8201 => 'ꨠ', + 8202 => 'ꨡ', + 8203 => 'ꨢ', + 8204 => 'ꨣ', + 8205 => 'ꨤ', + 8206 => 'ꨥ', + 8207 => 'ꨦ', + 8208 => 'ꨧ', + 8209 => 'ꨨ', + 8210 => 'ꩀ', + 8211 => 'ꩁ', + 8212 => 'ꩂ', + 8213 => 'ꩄ', + 8214 => 'ꩅ', + 8215 => 'ꩆ', + 8216 => 'ꩇ', + 8217 => 'ꩈ', + 8218 => 'ꩉ', + 8219 => 'ꩊ', + 8220 => 'ꩋ', + 8221 => 'ᬅ', + 8222 => 'ᬆ', + 8223 => 'ᬇ', + 8224 => 'ᬈ', + 8225 => 'ᬉ', + 8226 => 'ᬊ', + 8227 => 'ᬋ', + 8228 => 'ᬌ', + 8229 => 'ᬍ', + 8230 => 'ᬎ', + 8231 => 'ᬏ', + 8232 => 'ᬐ', + 8233 => 'ᬑ', + 8234 => 'ᬒ', + 8235 => 'ᬓ', + 8236 => 'ᭅ', + 8237 => 'ᭆ', + 8238 => 'ᬔ', + 8239 => 'ᬕ', + 8240 => 'ᬖ', + 8241 => 'ᬗ', + 8242 => 'ᬘ', + 8243 => 'ᬙ', + 8244 => 'ᬚ', + 8245 => 'ᬛ', + 8246 => 'ᬜ', + 8247 => 'ᬝ', + 8248 => 'ᬞ', + 8249 => 'ᬟ', + 8250 => 'ᬠ', + 8251 => 'ᬡ', + 8252 => 'ᬢ', + 8253 => 'ᭇ', + 8254 => 'ᬣ', + 8255 => 'ᬤ', + 8256 => 'ᬥ', + 8257 => 'ᬦ', + 8258 => 'ᬧ', + 8259 => 'ᭈ', + 8260 => 'ᬨ', + 8261 => 'ᬩ', + 8262 => 'ᬪ', + 8263 => 'ᬫ', + 8264 => 'ᬬ', + 8265 => 'ᬭ', + 8266 => 'ᬮ', + 8267 => 'ᬯ', + 8268 => 'ᭉ', + 8269 => 'ᬰ', + 8270 => 'ᬱ', + 8271 => 'ᬲ', + 8272 => 'ᭊ', + 8273 => 'ᭋ', + 8274 => 'ᬳ', + 8275 => 'ꦄ', + 8276 => 'ꦅ', + 8277 => 'ꦆ', + 8278 => 'ꦇ', + 8279 => 'ꦈ', + 8280 => 'ꦉ', + 8281 => 'ꦊ', + 8282 => 'ꦋ', + 8283 => 'ꦌ', + 8284 => 'ꦍ', + 8285 => 'ꦎ', + 8286 => 'ꦏ', + 8287 => 'ꦐ', + 8288 => 'ꦑ', + 8289 => 'ꦒ', + 8290 => 'ꦓ', + 8291 => 'ꦔ', + 8292 => 'ꦕ', + 8293 => 'ꦖ', + 8294 => 'ꦗ', + 8295 => 'ꦘ', + 8296 => 'ꦙ', + 8297 => 'ꦚ', + 8298 => 'ꦛ', + 8299 => 'ꦜ', + 8300 => 'ꦝ', + 8301 => 'ꦞ', + 8302 => 'ꦟ', + 8303 => 'ꦠ', + 8304 => 'ꦡ', + 8305 => 'ꦢ', + 8306 => 'ꦣ', + 8307 => 'ꦤ', + 8308 => 'ꦥ', + 8309 => 'ꦦ', + 8310 => 'ꦧ', + 8311 => 'ꦨ', + 8312 => 'ꦩ', + 8313 => 'ꦪ', + 8314 => 'ꦫ', + 8315 => 'ꦭ', + 8316 => 'ꦮ', + 8317 => 'ꦯ', + 8318 => 'ꦰ', + 8319 => 'ꦱ', + 8320 => 'ꦲ', + 8321 => 'ᢀ', + 8322 => 'ᢁ', + 8323 => 'ᢂ', + 8324 => 'ᢃ', + 8325 => 'ᢄ', + 8326 => 'ᢅ', + 8327 => 'ᢆ', + 8328 => 'ᡃ', + 8329 => 'ᠠ', + 8330 => 'ᢇ', + 8331 => 'ᠡ', + 8332 => 'ᡄ', + 8333 => 'ᡝ', + 8334 => 'ᠢ', + 8335 => 'ᡅ', + 8336 => 'ᡞ', + 8337 => 'ᡳ', + 8338 => 'ᢈ', + 8339 => 'ᡟ', + 8340 => 'ᠣ', + 8341 => 'ᡆ', + 8342 => 'ᠤ', + 8343 => 'ᡇ', + 8344 => 'ᡡ', + 8345 => 'ᠥ', + 8346 => 'ᡈ', + 8347 => 'ᠦ', + 8348 => 'ᡉ', + 8349 => 'ᡠ', + 8350 => 'ᠧ', + 8351 => 'ᠨ', + 8352 => 'ᠩ', + 8353 => 'ᡊ', + 8354 => 'ᡢ', + 8355 => 'ᢊ', + 8356 => 'ᢛ', + 8357 => 'ᠪ', + 8358 => 'ᡋ', + 8359 => 'ᠫ', + 8360 => 'ᡌ', + 8361 => 'ᡦ', + 8362 => 'ᠬ', + 8363 => 'ᡍ', + 8364 => 'ᠭ', + 8365 => 'ᡎ', + 8366 => 'ᡤ', + 8367 => 'ᢚ', + 8368 => 'ᡥ', + 8369 => 'ᠮ', + 8370 => 'ᡏ', + 8371 => 'ᠯ', + 8372 => 'ᠰ', + 8373 => 'ᠱ', + 8374 => 'ᡧ', + 8375 => 'ᢜ', + 8376 => 'ᢝ', + 8377 => 'ᢢ', + 8378 => 'ᢤ', + 8379 => 'ᢥ', + 8380 => 'ᠲ', + 8381 => 'ᡐ', + 8382 => 'ᡨ', + 8383 => 'ᠳ', + 8384 => 'ᡑ', + 8385 => 'ᡩ', + 8386 => 'ᠴ', + 8387 => 'ᡒ', + 8388 => 'ᡱ', + 8389 => 'ᡜ', + 8390 => 'ᢋ', + 8391 => 'ᠵ', + 8392 => 'ᡓ', + 8393 => 'ᡪ', + 8394 => 'ᡷ', + 8395 => 'ᠶ', + 8396 => 'ᡕ', + 8397 => 'ᡲ', + 8398 => 'ᠷ', + 8399 => 'ᡵ', + 8400 => 'ᠸ', + 8401 => 'ᡖ', + 8402 => 'ᠹ', + 8403 => 'ᡫ', + 8404 => 'ᡶ', + 8405 => 'ᠺ', + 8406 => 'ᡗ', + 8407 => 'ᡣ', + 8408 => 'ᡴ', + 8409 => 'ᢉ', + 8410 => 'ᠻ', + 8411 => 'ᠼ', + 8412 => 'ᡔ', + 8413 => 'ᡮ', + 8414 => 'ᠽ', + 8415 => 'ᡯ', + 8416 => 'ᡘ', + 8417 => 'ᡬ', + 8418 => 'ᠾ', + 8419 => 'ᡙ', + 8420 => 'ᡭ', + 8421 => 'ᠿ', + 8422 => 'ᡀ', + 8423 => 'ᡁ', + 8424 => 'ᡂ', + 8425 => 'ᡚ', + 8426 => 'ᡛ', + 8427 => 'ᡰ', + 8428 => 'ᢌ', + 8429 => 'ᢞ', + 8430 => 'ᢍ', + 8431 => 'ᢎ', + 8432 => 'ᢟ', + 8433 => 'ᢏ', + 8434 => 'ᢐ', + 8435 => 'ᢘ', + 8436 => 'ᢠ', + 8437 => 'ᢑ', + 8438 => 'ᢡ', + 8439 => 'ᢒ', + 8440 => 'ᢓ', + 8441 => 'ᢨ', + 8442 => 'ᢔ', + 8443 => 'ᢣ', + 8444 => 'ᢕ', + 8445 => 'ᢙ', + 8446 => 'ᢖ', + 8447 => 'ᢗ', + 8448 => 'ᢦ', + 8449 => 'ᢧ', + 8450 => 'ᢪ', + 8451 => 'ᱚ', + 8452 => 'ᱛ', + 8453 => 'ᱜ', + 8454 => 'ᱝ', + 8455 => 'ᱞ', + 8456 => 'ᱟ', + 8457 => 'ᱠ', + 8458 => 'ᱡ', + 8459 => 'ᱢ', + 8460 => 'ᱣ', + 8461 => 'ᱤ', + 8462 => 'ᱥ', + 8463 => 'ᱦ', + 8464 => 'ᱧ', + 8465 => 'ᱨ', + 8466 => 'ᱩ', + 8467 => 'ᱪ', + 8468 => 'ᱫ', + 8469 => 'ᱬ', + 8470 => 'ᱭ', + 8471 => 'ᱮ', + 8472 => 'ᱯ', + 8473 => 'ᱰ', + 8474 => 'ᱱ', + 8475 => 'ᱲ', + 8476 => 'ᱳ', + 8477 => 'ᱴ', + 8478 => 'ᱵ', + 8479 => 'ᱶ', + 8480 => 'ᱷ', + 8481 => 'ᱸ', + 8482 => 'ᱹ', + 8483 => 'ᱺ', + 8484 => 'ᱻ', + 8485 => 'ᱼ', + 8486 => 'ᱽ', + 8487 => 'Ꭰ', + 8488 => 'Ꭱ', + 8489 => 'Ꭲ', + 8490 => 'Ꭳ', + 8491 => 'Ꭴ', + 8492 => 'Ꭵ', + 8493 => 'Ꭶ', + 8494 => 'Ꭷ', + 8495 => 'Ꭸ', + 8496 => 'Ꭹ', + 8497 => 'Ꭺ', + 8498 => 'Ꭻ', + 8499 => 'Ꭼ', + 8500 => 'Ꭽ', + 8501 => 'Ꭾ', + 8502 => 'Ꭿ', + 8503 => 'Ꮀ', + 8504 => 'Ꮁ', + 8505 => 'Ꮂ', + 8506 => 'Ꮃ', + 8507 => 'Ꮄ', + 8508 => 'Ꮅ', + 8509 => 'Ꮆ', + 8510 => 'Ꮇ', + 8511 => 'Ꮈ', + 8512 => 'Ꮉ', + 8513 => 'Ꮊ', + 8514 => 'Ꮋ', + 8515 => 'Ꮌ', + 8516 => 'Ꮍ', + 8517 => 'Ꮎ', + 8518 => 'Ꮏ', + 8519 => 'Ꮐ', + 8520 => 'Ꮑ', + 8521 => 'Ꮒ', + 8522 => 'Ꮓ', + 8523 => 'Ꮔ', + 8524 => 'Ꮕ', + 8525 => 'Ꮖ', + 8526 => 'Ꮗ', + 8527 => 'Ꮘ', + 8528 => 'Ꮙ', + 8529 => 'Ꮚ', + 8530 => 'Ꮛ', + 8531 => 'Ꮜ', + 8532 => 'Ꮝ', + 8533 => 'Ꮞ', + 8534 => 'Ꮟ', + 8535 => 'Ꮠ', + 8536 => 'Ꮡ', + 8537 => 'Ꮢ', + 8538 => 'Ꮣ', + 8539 => 'Ꮤ', + 8540 => 'Ꮥ', + 8541 => 'Ꮦ', + 8542 => 'Ꮧ', + 8543 => 'Ꮨ', + 8544 => 'Ꮩ', + 8545 => 'Ꮪ', + 8546 => 'Ꮫ', + 8547 => 'Ꮬ', + 8548 => 'Ꮭ', + 8549 => 'Ꮮ', + 8550 => 'Ꮯ', + 8551 => 'Ꮰ', + 8552 => 'Ꮱ', + 8553 => 'Ꮲ', + 8554 => 'Ꮳ', + 8555 => 'Ꮴ', + 8556 => 'Ꮵ', + 8557 => 'Ꮶ', + 8558 => 'Ꮷ', + 8559 => 'Ꮸ', + 8560 => 'Ꮹ', + 8561 => 'Ꮺ', + 8562 => 'Ꮻ', + 8563 => 'Ꮼ', + 8564 => 'Ꮽ', + 8565 => 'Ꮾ', + 8566 => 'Ꮿ', + 8567 => 'Ᏸ', + 8568 => 'Ᏹ', + 8569 => 'Ᏺ', + 8570 => 'Ᏻ', + 8571 => 'Ᏼ', + 8572 => 'ᐁ', + 8573 => 'ᐂ', + 8574 => 'ᐃ', + 8575 => 'ᐄ', + 8576 => 'ᐅ', + 8577 => 'ᐆ', + 8578 => 'ᐇ', + 8579 => 'ᐈ', + 8580 => 'ᐉ', + 8581 => 'ᐊ', + 8582 => 'ᐋ', + 8583 => 'ᐌ', + 8584 => 'ᐍ', + 8585 => 'ᐎ', + 8586 => 'ᐏ', + 8587 => 'ᐐ', + 8588 => 'ᐑ', + 8589 => 'ᐒ', + 8590 => 'ᐓ', + 8591 => 'ᐔ', + 8592 => 'ᐕ', + 8593 => 'ᐖ', + 8594 => 'ᐗ', + 8595 => 'ᐘ', + 8596 => 'ᐙ', + 8597 => 'ᐚ', + 8598 => 'ᐛ', + 8599 => 'ᐜ', + 8600 => 'ᐝ', + 8601 => 'ᐞ', + 8602 => 'ᐟ', + 8603 => 'ᐠ', + 8604 => 'ᐡ', + 8605 => 'ᐢ', + 8606 => 'ᐣ', + 8607 => 'ᐤ', + 8608 => 'ᐥ', + 8609 => 'ᐦ', + 8610 => 'ᐧ', + 8611 => 'ᐨ', + 8612 => 'ᐩ', + 8613 => 'ᐪ', + 8614 => 'ᐫ', + 8615 => 'ᐬ', + 8616 => 'ᐭ', + 8617 => 'ᐮ', + 8618 => 'ᐯ', + 8619 => 'ᐰ', + 8620 => 'ᐱ', + 8621 => 'ᐲ', + 8622 => 'ᐳ', + 8623 => 'ᐴ', + 8624 => 'ᐵ', + 8625 => 'ᐶ', + 8626 => 'ᐷ', + 8627 => 'ᐸ', + 8628 => 'ᐹ', + 8629 => 'ᐺ', + 8630 => 'ᐻ', + 8631 => 'ᐼ', + 8632 => 'ᐽ', + 8633 => 'ᐾ', + 8634 => 'ᐿ', + 8635 => 'ᑀ', + 8636 => 'ᑁ', + 8637 => 'ᑂ', + 8638 => 'ᑃ', + 8639 => 'ᑄ', + 8640 => 'ᑅ', + 8641 => 'ᑆ', + 8642 => 'ᑇ', + 8643 => 'ᑈ', + 8644 => 'ᑉ', + 8645 => 'ᑊ', + 8646 => 'ᑋ', + 8647 => 'ᑌ', + 8648 => 'ᑍ', + 8649 => 'ᑎ', + 8650 => 'ᑏ', + 8651 => 'ᑐ', + 8652 => 'ᑑ', + 8653 => 'ᑒ', + 8654 => 'ᑓ', + 8655 => 'ᑔ', + 8656 => 'ᑕ', + 8657 => 'ᑖ', + 8658 => 'ᑗ', + 8659 => 'ᑘ', + 8660 => 'ᑙ', + 8661 => 'ᑚ', + 8662 => 'ᑛ', + 8663 => 'ᑜ', + 8664 => 'ᑝ', + 8665 => 'ᑞ', + 8666 => 'ᑟ', + 8667 => 'ᑠ', + 8668 => 'ᑡ', + 8669 => 'ᑢ', + 8670 => 'ᑣ', + 8671 => 'ᑤ', + 8672 => 'ᑥ', + 8673 => 'ᑦ', + 8674 => 'ᑧ', + 8675 => 'ᑨ', + 8676 => 'ᑩ', + 8677 => 'ᑪ', + 8678 => 'ᑫ', + 8679 => 'ᑬ', + 8680 => 'ᑭ', + 8681 => 'ᑮ', + 8682 => 'ᑯ', + 8683 => 'ᑰ', + 8684 => 'ᑱ', + 8685 => 'ᑲ', + 8686 => 'ᑳ', + 8687 => 'ᑴ', + 8688 => 'ᑵ', + 8689 => 'ᑶ', + 8690 => 'ᑷ', + 8691 => 'ᑸ', + 8692 => 'ᑹ', + 8693 => 'ᑺ', + 8694 => 'ᑻ', + 8695 => 'ᑼ', + 8696 => 'ᑽ', + 8697 => 'ᑾ', + 8698 => 'ᑿ', + 8699 => 'ᒀ', + 8700 => 'ᒁ', + 8701 => 'ᒂ', + 8702 => 'ᒃ', + 8703 => 'ᒄ', + 8704 => 'ᒅ', + 8705 => 'ᒆ', + 8706 => 'ᒇ', + 8707 => 'ᒈ', + 8708 => 'ᒉ', + 8709 => 'ᒊ', + 8710 => 'ᒋ', + 8711 => 'ᒌ', + 8712 => 'ᒍ', + 8713 => 'ᒎ', + 8714 => 'ᒏ', + 8715 => 'ᒐ', + 8716 => 'ᒑ', + 8717 => 'ᒒ', + 8718 => 'ᒓ', + 8719 => 'ᒔ', + 8720 => 'ᒕ', + 8721 => 'ᒖ', + 8722 => 'ᒗ', + 8723 => 'ᒘ', + 8724 => 'ᒙ', + 8725 => 'ᒚ', + 8726 => 'ᒛ', + 8727 => 'ᒜ', + 8728 => 'ᒝ', + 8729 => 'ᒞ', + 8730 => 'ᒟ', + 8731 => 'ᒠ', + 8732 => 'ᒡ', + 8733 => 'ᒢ', + 8734 => 'ᒣ', + 8735 => 'ᒤ', + 8736 => 'ᒥ', + 8737 => 'ᒦ', + 8738 => 'ᒧ', + 8739 => 'ᒨ', + 8740 => 'ᒩ', + 8741 => 'ᒪ', + 8742 => 'ᒫ', + 8743 => 'ᒬ', + 8744 => 'ᒭ', + 8745 => 'ᒮ', + 8746 => 'ᒯ', + 8747 => 'ᒰ', + 8748 => 'ᒱ', + 8749 => 'ᒲ', + 8750 => 'ᒳ', + 8751 => 'ᒴ', + 8752 => 'ᒵ', + 8753 => 'ᒶ', + 8754 => 'ᒷ', + 8755 => 'ᒸ', + 8756 => 'ᒹ', + 8757 => 'ᒺ', + 8758 => 'ᒻ', + 8759 => 'ᒼ', + 8760 => 'ᒽ', + 8761 => 'ᒾ', + 8762 => 'ᒿ', + 8763 => 'ᓀ', + 8764 => 'ᓁ', + 8765 => 'ᓂ', + 8766 => 'ᓃ', + 8767 => 'ᓄ', + 8768 => 'ᓅ', + 8769 => 'ᓆ', + 8770 => 'ᓇ', + 8771 => 'ᓈ', + 8772 => 'ᓉ', + 8773 => 'ᓊ', + 8774 => 'ᓋ', + 8775 => 'ᓌ', + 8776 => 'ᓍ', + 8777 => 'ᓎ', + 8778 => 'ᓏ', + 8779 => 'ᓐ', + 8780 => 'ᓑ', + 8781 => 'ᓒ', + 8782 => 'ᓓ', + 8783 => 'ᓔ', + 8784 => 'ᓕ', + 8785 => 'ᓖ', + 8786 => 'ᓗ', + 8787 => 'ᓘ', + 8788 => 'ᓙ', + 8789 => 'ᓚ', + 8790 => 'ᓛ', + 8791 => 'ᓜ', + 8792 => 'ᓝ', + 8793 => 'ᓞ', + 8794 => 'ᓟ', + 8795 => 'ᓠ', + 8796 => 'ᓡ', + 8797 => 'ᓢ', + 8798 => 'ᓣ', + 8799 => 'ᓤ', + 8800 => 'ᓥ', + 8801 => 'ᓦ', + 8802 => 'ᓧ', + 8803 => 'ᓨ', + 8804 => 'ᓩ', + 8805 => 'ᓪ', + 8806 => 'ᓫ', + 8807 => 'ᓬ', + 8808 => 'ᓭ', + 8809 => 'ᓮ', + 8810 => 'ᓯ', + 8811 => 'ᓰ', + 8812 => 'ᓱ', + 8813 => 'ᓲ', + 8814 => 'ᓳ', + 8815 => 'ᓴ', + 8816 => 'ᓵ', + 8817 => 'ᓶ', + 8818 => 'ᓷ', + 8819 => 'ᓸ', + 8820 => 'ᓹ', + 8821 => 'ᓺ', + 8822 => 'ᓻ', + 8823 => 'ᓼ', + 8824 => 'ᓽ', + 8825 => 'ᓾ', + 8826 => 'ᓿ', + 8827 => 'ᔀ', + 8828 => 'ᔁ', + 8829 => 'ᔂ', + 8830 => 'ᔃ', + 8831 => 'ᔄ', + 8832 => 'ᔅ', + 8833 => 'ᔆ', + 8834 => 'ᔇ', + 8835 => 'ᔈ', + 8836 => 'ᔉ', + 8837 => 'ᔊ', + 8838 => 'ᔋ', + 8839 => 'ᔌ', + 8840 => 'ᔍ', + 8841 => 'ᔎ', + 8842 => 'ᔏ', + 8843 => 'ᔐ', + 8844 => 'ᔑ', + 8845 => 'ᔒ', + 8846 => 'ᔓ', + 8847 => 'ᔔ', + 8848 => 'ᔕ', + 8849 => 'ᔖ', + 8850 => 'ᔗ', + 8851 => 'ᔘ', + 8852 => 'ᔙ', + 8853 => 'ᔚ', + 8854 => 'ᔛ', + 8855 => 'ᔜ', + 8856 => 'ᔝ', + 8857 => 'ᔞ', + 8858 => 'ᔟ', + 8859 => 'ᔠ', + 8860 => 'ᔡ', + 8861 => 'ᔢ', + 8862 => 'ᔣ', + 8863 => 'ᔤ', + 8864 => 'ᔥ', + 8865 => 'ᔦ', + 8866 => 'ᔧ', + 8867 => 'ᔨ', + 8868 => 'ᔩ', + 8869 => 'ᔪ', + 8870 => 'ᔫ', + 8871 => 'ᔬ', + 8872 => 'ᔭ', + 8873 => 'ᔮ', + 8874 => 'ᔯ', + 8875 => 'ᔰ', + 8876 => 'ᔱ', + 8877 => 'ᔲ', + 8878 => 'ᔳ', + 8879 => 'ᔴ', + 8880 => 'ᔵ', + 8881 => 'ᔶ', + 8882 => 'ᔷ', + 8883 => 'ᔸ', + 8884 => 'ᔹ', + 8885 => 'ᔺ', + 8886 => 'ᔻ', + 8887 => 'ᔼ', + 8888 => 'ᔽ', + 8889 => 'ᔾ', + 8890 => 'ᔿ', + 8891 => 'ᕀ', + 8892 => 'ᕁ', + 8893 => 'ᕂ', + 8894 => 'ᕃ', + 8895 => 'ᕄ', + 8896 => 'ᕅ', + 8897 => 'ᕆ', + 8898 => 'ᕇ', + 8899 => 'ᕈ', + 8900 => 'ᕉ', + 8901 => 'ᕊ', + 8902 => 'ᕋ', + 8903 => 'ᕌ', + 8904 => 'ᕍ', + 8905 => 'ᕎ', + 8906 => 'ᕏ', + 8907 => 'ᕐ', + 8908 => 'ᕑ', + 8909 => 'ᕒ', + 8910 => 'ᕓ', + 8911 => 'ᕔ', + 8912 => 'ᕕ', + 8913 => 'ᕖ', + 8914 => 'ᕗ', + 8915 => 'ᕘ', + 8916 => 'ᕙ', + 8917 => 'ᕚ', + 8918 => 'ᕛ', + 8919 => 'ᕜ', + 8920 => 'ᕝ', + 8921 => 'ᕞ', + 8922 => 'ᕟ', + 8923 => 'ᕠ', + 8924 => 'ᕡ', + 8925 => 'ᕢ', + 8926 => 'ᕣ', + 8927 => 'ᕤ', + 8928 => 'ᕥ', + 8929 => 'ᕦ', + 8930 => 'ᕧ', + 8931 => 'ᕨ', + 8932 => 'ᕩ', + 8933 => 'ᕪ', + 8934 => 'ᕫ', + 8935 => 'ᕬ', + 8936 => 'ᕭ', + 8937 => 'ᕮ', + 8938 => 'ᕯ', + 8939 => 'ᕰ', + 8940 => 'ᕱ', + 8941 => 'ᕲ', + 8942 => 'ᕳ', + 8943 => 'ᕴ', + 8944 => 'ᕵ', + 8945 => 'ᕶ', + 8946 => 'ᕷ', + 8947 => 'ᕸ', + 8948 => 'ᕹ', + 8949 => 'ᕺ', + 8950 => 'ᕻ', + 8951 => 'ᕽ', + 8952 => 'ᙯ', + 8953 => 'ᕾ', + 8954 => 'ᕿ', + 8955 => 'ᖀ', + 8956 => 'ᖁ', + 8957 => 'ᖂ', + 8958 => 'ᖃ', + 8959 => 'ᖄ', + 8960 => 'ᖅ', + 8961 => 'ᖆ', + 8962 => 'ᖇ', + 8963 => 'ᖈ', + 8964 => 'ᖉ', + 8965 => 'ᖊ', + 8966 => 'ᖋ', + 8967 => 'ᖌ', + 8968 => 'ᖍ', + 8969 => 'ᙰ', + 8970 => 'ᖎ', + 8971 => 'ᖏ', + 8972 => 'ᖐ', + 8973 => 'ᖑ', + 8974 => 'ᖒ', + 8975 => 'ᖓ', + 8976 => 'ᖔ', + 8977 => 'ᖕ', + 8978 => 'ᙱ', + 8979 => 'ᙲ', + 8980 => 'ᙳ', + 8981 => 'ᙴ', + 8982 => 'ᙵ', + 8983 => 'ᙶ', + 8984 => 'ᖖ', + 8985 => 'ᖗ', + 8986 => 'ᖘ', + 8987 => 'ᖙ', + 8988 => 'ᖚ', + 8989 => 'ᖛ', + 8990 => 'ᖜ', + 8991 => 'ᖝ', + 8992 => 'ᖞ', + 8993 => 'ᖟ', + 8994 => 'ᖠ', + 8995 => 'ᖡ', + 8996 => 'ᖢ', + 8997 => 'ᖣ', + 8998 => 'ᖤ', + 8999 => 'ᖥ', + 9000 => 'ᖦ', + 9001 => 'ᕼ', + 9002 => 'ᖧ', + 9003 => 'ᖨ', + 9004 => 'ᖩ', + 9005 => 'ᖪ', + 9006 => 'ᖫ', + 9007 => 'ᖬ', + 9008 => 'ᖭ', + 9009 => 'ᖮ', + 9010 => 'ᖯ', + 9011 => 'ᖰ', + 9012 => 'ᖱ', + 9013 => 'ᖲ', + 9014 => 'ᖳ', + 9015 => 'ᖴ', + 9016 => 'ᖵ', + 9017 => 'ᖶ', + 9018 => 'ᖷ', + 9019 => 'ᖸ', + 9020 => 'ᖹ', + 9021 => 'ᖺ', + 9022 => 'ᖻ', + 9023 => 'ᖼ', + 9024 => 'ᖽ', + 9025 => 'ᖾ', + 9026 => 'ᖿ', + 9027 => 'ᗀ', + 9028 => 'ᗁ', + 9029 => 'ᗂ', + 9030 => 'ᗃ', + 9031 => 'ᗄ', + 9032 => 'ᗅ', + 9033 => 'ᗆ', + 9034 => 'ᗇ', + 9035 => 'ᗈ', + 9036 => 'ᗉ', + 9037 => 'ᗊ', + 9038 => 'ᗋ', + 9039 => 'ᗌ', + 9040 => 'ᗍ', + 9041 => 'ᗎ', + 9042 => 'ᗏ', + 9043 => 'ᗐ', + 9044 => 'ᗑ', + 9045 => 'ᗒ', + 9046 => 'ᗓ', + 9047 => 'ᗔ', + 9048 => 'ᗕ', + 9049 => 'ᗖ', + 9050 => 'ᗗ', + 9051 => 'ᗘ', + 9052 => 'ᗙ', + 9053 => 'ᗚ', + 9054 => 'ᗛ', + 9055 => 'ᗜ', + 9056 => 'ᗝ', + 9057 => 'ᗞ', + 9058 => 'ᗟ', + 9059 => 'ᗠ', + 9060 => 'ᗡ', + 9061 => 'ᗢ', + 9062 => 'ᗣ', + 9063 => 'ᗤ', + 9064 => 'ᗥ', + 9065 => 'ᗦ', + 9066 => 'ᗧ', + 9067 => 'ᗨ', + 9068 => 'ᗩ', + 9069 => 'ᗪ', + 9070 => 'ᗫ', + 9071 => 'ᗬ', + 9072 => 'ᗭ', + 9073 => 'ᗮ', + 9074 => 'ᗯ', + 9075 => 'ᗰ', + 9076 => 'ᗱ', + 9077 => 'ᗲ', + 9078 => 'ᗳ', + 9079 => 'ᗴ', + 9080 => 'ᗵ', + 9081 => 'ᗶ', + 9082 => 'ᗷ', + 9083 => 'ᗸ', + 9084 => 'ᗹ', + 9085 => 'ᗺ', + 9086 => 'ᗻ', + 9087 => 'ᗼ', + 9088 => 'ᗽ', + 9089 => 'ᗾ', + 9090 => 'ᗿ', + 9091 => 'ᘀ', + 9092 => 'ᘁ', + 9093 => 'ᘂ', + 9094 => 'ᘃ', + 9095 => 'ᘄ', + 9096 => 'ᘅ', + 9097 => 'ᘆ', + 9098 => 'ᘇ', + 9099 => 'ᘈ', + 9100 => 'ᘉ', + 9101 => 'ᘊ', + 9102 => 'ᘋ', + 9103 => 'ᘌ', + 9104 => 'ᘍ', + 9105 => 'ᘎ', + 9106 => 'ᘏ', + 9107 => 'ᘐ', + 9108 => 'ᘑ', + 9109 => 'ᘒ', + 9110 => 'ᘓ', + 9111 => 'ᘔ', + 9112 => 'ᘕ', + 9113 => 'ᘖ', + 9114 => 'ᘗ', + 9115 => 'ᘘ', + 9116 => 'ᘙ', + 9117 => 'ᘚ', + 9118 => 'ᘛ', + 9119 => 'ᘜ', + 9120 => 'ᘝ', + 9121 => 'ᘞ', + 9122 => 'ᘟ', + 9123 => 'ᘠ', + 9124 => 'ᘡ', + 9125 => 'ᘢ', + 9126 => 'ᘣ', + 9127 => 'ᘤ', + 9128 => 'ᘥ', + 9129 => 'ᘦ', + 9130 => 'ᘧ', + 9131 => 'ᘨ', + 9132 => 'ᘩ', + 9133 => 'ᘪ', + 9134 => 'ᘫ', + 9135 => 'ᘬ', + 9136 => 'ᘭ', + 9137 => 'ᘮ', + 9138 => 'ᘯ', + 9139 => 'ᘰ', + 9140 => 'ᘱ', + 9141 => 'ᘲ', + 9142 => 'ᘳ', + 9143 => 'ᘴ', + 9144 => 'ᘵ', + 9145 => 'ᘶ', + 9146 => 'ᘷ', + 9147 => 'ᘸ', + 9148 => 'ᘹ', + 9149 => 'ᘺ', + 9150 => 'ᘻ', + 9151 => 'ᘼ', + 9152 => 'ᘽ', + 9153 => 'ᘾ', + 9154 => 'ᘿ', + 9155 => 'ᙀ', + 9156 => 'ᙁ', + 9157 => 'ᙂ', + 9158 => 'ᙃ', + 9159 => 'ᙄ', + 9160 => 'ᙅ', + 9161 => 'ᙆ', + 9162 => 'ᙇ', + 9163 => 'ᙈ', + 9164 => 'ᙉ', + 9165 => 'ᙊ', + 9166 => 'ᙋ', + 9167 => 'ᙌ', + 9168 => 'ᙍ', + 9169 => 'ᙎ', + 9170 => 'ᙏ', + 9171 => 'ᙐ', + 9172 => 'ᙑ', + 9173 => 'ᙒ', + 9174 => 'ᙓ', + 9175 => 'ᙔ', + 9176 => 'ᙕ', + 9177 => 'ᙖ', + 9178 => 'ᙗ', + 9179 => 'ᙘ', + 9180 => 'ᙙ', + 9181 => 'ᙚ', + 9182 => 'ᙛ', + 9183 => 'ᙜ', + 9184 => 'ᙝ', + 9185 => 'ᙞ', + 9186 => 'ᙟ', + 9187 => 'ᙠ', + 9188 => 'ᙡ', + 9189 => 'ᙢ', + 9190 => 'ᙣ', + 9191 => 'ᙤ', + 9192 => 'ᙥ', + 9193 => 'ᙦ', + 9194 => 'ᙧ', + 9195 => 'ᙨ', + 9196 => 'ᙩ', + 9197 => 'ᙪ', + 9198 => 'ᙫ', + 9199 => 'ᙬ', + 9200 => 'ᙷ', + 9201 => 'ᙸ', + 9202 => 'ᙹ', + 9203 => 'ᙺ', + 9204 => 'ᙻ', + 9205 => 'ᙼ', + 9206 => 'ᙽ', + 9207 => 'ᙾ', + 9208 => 'ᙿ', + 9209 => 'ᢰ', + 9210 => 'ᢱ', + 9211 => 'ᢲ', + 9212 => 'ᢳ', + 9213 => 'ᢴ', + 9214 => 'ᢵ', + 9215 => 'ᢶ', + 9216 => 'ᢷ', + 9217 => 'ᢸ', + 9218 => 'ᢹ', + 9219 => 'ᢺ', + 9220 => 'ᢻ', + 9221 => 'ᢼ', + 9222 => 'ᢽ', + 9223 => 'ᢾ', + 9224 => 'ᢿ', + 9225 => 'ᣀ', + 9226 => 'ᣁ', + 9227 => 'ᣂ', + 9228 => 'ᣃ', + 9229 => 'ᣄ', + 9230 => 'ᣅ', + 9231 => 'ᣆ', + 9232 => 'ᣇ', + 9233 => 'ᣈ', + 9234 => 'ᣉ', + 9235 => 'ᣊ', + 9236 => 'ᣋ', + 9237 => 'ᣌ', + 9238 => 'ᣍ', + 9239 => 'ᣎ', + 9240 => 'ᣏ', + 9241 => 'ᣐ', + 9242 => 'ᣑ', + 9243 => 'ᣒ', + 9244 => 'ᣓ', + 9245 => 'ᣔ', + 9246 => 'ᣕ', + 9247 => 'ᣖ', + 9248 => 'ᣗ', + 9249 => 'ᣘ', + 9250 => 'ᣙ', + 9251 => 'ᣚ', + 9252 => 'ᣛ', + 9253 => 'ᣜ', + 9254 => 'ᣝ', + 9255 => 'ᣞ', + 9256 => 'ᣟ', + 9257 => 'ᣠ', + 9258 => 'ᣡ', + 9259 => 'ᣢ', + 9260 => 'ᣣ', + 9261 => 'ᣤ', + 9262 => 'ᣥ', + 9263 => 'ᣦ', + 9264 => 'ᣧ', + 9265 => 'ᣨ', + 9266 => 'ᣩ', + 9267 => 'ᣪ', + 9268 => 'ᣫ', + 9269 => 'ᣬ', + 9270 => 'ᣭ', + 9271 => 'ᣮ', + 9272 => 'ᣯ', + 9273 => 'ᣰ', + 9274 => 'ᣱ', + 9275 => 'ᣲ', + 9276 => 'ᣳ', + 9277 => 'ᣴ', + 9278 => 'ᣵ', + 9279 => 'ᚁ', + 9280 => 'ᚂ', + 9281 => 'ᚃ', + 9282 => 'ᚄ', + 9283 => 'ᚅ', + 9284 => 'ᚆ', + 9285 => 'ᚇ', + 9286 => 'ᚈ', + 9287 => 'ᚉ', + 9288 => 'ᚊ', + 9289 => 'ᚋ', + 9290 => 'ᚌ', + 9291 => 'ᚍ', + 9292 => 'ᚎ', + 9293 => 'ᚏ', + 9294 => 'ᚐ', + 9295 => 'ᚑ', + 9296 => 'ᚒ', + 9297 => 'ᚓ', + 9298 => 'ᚔ', + 9299 => 'ᚕ', + 9300 => 'ᚖ', + 9301 => 'ᚗ', + 9302 => 'ᚘ', + 9303 => 'ᚙ', + 9304 => 'ᚚ', + 9305 => 'ᚠ', + 9306 => 'ᚢ', + 9307 => 'ᚦ', + 9308 => 'ᚨ', + 9309 => 'ᚯ', + 9310 => 'ᚰ', + 9311 => 'ᚱ', + 9312 => 'ᚲ', + 9313 => 'ᚷ', + 9314 => 'ᚹ', + 9315 => 'ᚺ', + 9316 => 'ᚾ', + 9317 => 'ᛁ', + 9318 => 'ᛃ', + 9319 => 'ᛅ', + 9320 => 'ᛇ', + 9321 => 'ᛈ', + 9322 => 'ᛉ', + 9323 => 'ᛊ', + 9324 => 'ᛏ', + 9325 => 'ᛒ', + 9326 => 'ᛖ', + 9327 => 'ᛗ', + 9328 => 'ᛚ', + 9329 => 'ᛜ', + 9330 => 'ᛞ', + 9331 => 'ᛟ', + 9332 => 'ᚪ', + 9333 => 'ᚫ', + 9334 => 'ᚣ', + 9335 => 'ᛠ', + 9336 => 'ᛣ', + 9337 => 'ᚸ', + 9338 => 'ᛤ', + 9339 => 'ᛡ', + 9340 => 'ᛢ', + 9341 => 'ᛥ', + 9342 => 'ᛦ', + 9343 => '𐰀', + 9344 => '𐰂', + 9345 => '𐰃', + 9346 => '𐰅', + 9347 => '𐰆', + 9348 => '𐰇', + 9349 => '𐰉', + 9350 => '𐰋', + 9351 => '𐰍', + 9352 => '𐰏', + 9353 => '𐰑', + 9354 => '𐰓', + 9355 => '𐰔', + 9356 => '𐰖', + 9357 => '𐰘', + 9358 => '𐰚', + 9359 => '𐰜', + 9360 => '𐰞', + 9361 => '𐰠', + 9362 => '𐰡', + 9363 => '𐰢', + 9364 => '𐰣', + 9365 => '𐰤', + 9366 => '𐰦', + 9367 => '𐰨', + 9368 => '𐰪', + 9369 => '𐰬', + 9370 => '𐰭', + 9371 => '𐰯', + 9372 => '𐰰', + 9373 => '𐰱', + 9374 => '𐰲', + 9375 => '𐰴', + 9376 => '𐰶', + 9377 => '𐰸', + 9378 => '𐰺', + 9379 => '𐰼', + 9380 => '𐰽', + 9381 => '𐰾', + 9382 => '𐰿', + 9383 => '𐱁', + 9384 => '𐱃', + 9385 => '𐱅', + 9386 => '𐱇', + 9387 => '𐱈', + 9388 => 'ꔀ', + 9389 => 'ꔁ', + 9390 => 'ꔂ', + 9391 => 'ꔃ', + 9392 => 'ꔄ', + 9393 => 'ꔅ', + 9394 => 'ꔆ', + 9395 => 'ꔇ', + 9396 => 'ꔈ', + 9397 => 'ꔉ', + 9398 => 'ꔊ', + 9399 => 'ꔋ', + 9400 => 'ꔌ', + 9401 => 'ꔍ', + 9402 => 'ꔎ', + 9403 => 'ꔏ', + 9404 => 'ꔐ', + 9405 => 'ꔑ', + 9406 => 'ꔒ', + 9407 => 'ꔓ', + 9408 => 'ꔔ', + 9409 => 'ꔕ', + 9410 => 'ꔖ', + 9411 => 'ꔗ', + 9412 => 'ꔘ', + 9413 => 'ꔙ', + 9414 => 'ꔚ', + 9415 => 'ꔛ', + 9416 => 'ꔜ', + 9417 => 'ꔝ', + 9418 => 'ꔞ', + 9419 => 'ꔟ', + 9420 => 'ꔠ', + 9421 => 'ꔡ', + 9422 => 'ꔢ', + 9423 => 'ꔣ', + 9424 => 'ꔤ', + 9425 => 'ꔥ', + 9426 => 'ꔦ', + 9427 => 'ꔧ', + 9428 => 'ꔨ', + 9429 => 'ꔩ', + 9430 => 'ꔪ', + 9431 => 'ꔫ', + 9432 => 'ꔬ', + 9433 => 'ꔭ', + 9434 => 'ꔮ', + 9435 => 'ꔯ', + 9436 => 'ꔰ', + 9437 => 'ꔱ', + 9438 => 'ꔲ', + 9439 => 'ꔳ', + 9440 => 'ꔴ', + 9441 => 'ꔵ', + 9442 => 'ꔶ', + 9443 => 'ꔷ', + 9444 => 'ꔸ', + 9445 => 'ꔹ', + 9446 => 'ꔺ', + 9447 => 'ꔻ', + 9448 => 'ꔼ', + 9449 => 'ꔽ', + 9450 => 'ꔾ', + 9451 => 'ꔿ', + 9452 => 'ꕀ', + 9453 => 'ꕁ', + 9454 => 'ꕂ', + 9455 => 'ꕃ', + 9456 => 'ꕄ', + 9457 => 'ꕅ', + 9458 => 'ꕆ', + 9459 => 'ꕇ', + 9460 => 'ꕈ', + 9461 => 'ꕉ', + 9462 => 'ꕊ', + 9463 => 'ꕋ', + 9464 => 'ꕌ', + 9465 => 'ꕍ', + 9466 => 'ꕎ', + 9467 => 'ꕏ', + 9468 => 'ꕐ', + 9469 => 'ꕑ', + 9470 => 'ꕒ', + 9471 => 'ꕓ', + 9472 => 'ꕔ', + 9473 => 'ꕕ', + 9474 => 'ꕖ', + 9475 => 'ꕗ', + 9476 => 'ꕘ', + 9477 => 'ꕙ', + 9478 => 'ꕚ', + 9479 => 'ꕛ', + 9480 => 'ꕜ', + 9481 => 'ꕝ', + 9482 => 'ꕞ', + 9483 => 'ꕟ', + 9484 => 'ꕠ', + 9485 => 'ꕡ', + 9486 => 'ꕢ', + 9487 => 'ꕣ', + 9488 => 'ꕤ', + 9489 => 'ꕥ', + 9490 => 'ꕦ', + 9491 => 'ꕧ', + 9492 => 'ꕨ', + 9493 => 'ꕩ', + 9494 => 'ꕪ', + 9495 => 'ꕫ', + 9496 => 'ꕬ', + 9497 => 'ꕭ', + 9498 => 'ꕮ', + 9499 => 'ꕯ', + 9500 => 'ꕰ', + 9501 => 'ꕱ', + 9502 => 'ꕲ', + 9503 => 'ꕳ', + 9504 => 'ꕴ', + 9505 => 'ꕵ', + 9506 => 'ꕶ', + 9507 => 'ꕷ', + 9508 => 'ꕸ', + 9509 => 'ꕹ', + 9510 => 'ꕺ', + 9511 => 'ꕻ', + 9512 => 'ꕼ', + 9513 => 'ꕽ', + 9514 => 'ꕾ', + 9515 => 'ꕿ', + 9516 => 'ꖀ', + 9517 => 'ꖁ', + 9518 => 'ꖂ', + 9519 => 'ꖃ', + 9520 => 'ꖄ', + 9521 => 'ꖅ', + 9522 => 'ꖆ', + 9523 => 'ꖇ', + 9524 => 'ꖈ', + 9525 => 'ꖉ', + 9526 => 'ꖊ', + 9527 => 'ꖋ', + 9528 => 'ꖌ', + 9529 => 'ꖍ', + 9530 => 'ꖎ', + 9531 => 'ꖏ', + 9532 => 'ꖐ', + 9533 => 'ꖑ', + 9534 => 'ꖒ', + 9535 => 'ꖓ', + 9536 => 'ꖔ', + 9537 => 'ꖕ', + 9538 => 'ꖖ', + 9539 => 'ꖗ', + 9540 => 'ꖘ', + 9541 => 'ꖙ', + 9542 => 'ꖚ', + 9543 => 'ꖛ', + 9544 => 'ꖜ', + 9545 => 'ꖝ', + 9546 => 'ꖞ', + 9547 => 'ꖟ', + 9548 => 'ꖠ', + 9549 => 'ꖡ', + 9550 => 'ꖢ', + 9551 => 'ꖣ', + 9552 => 'ꖤ', + 9553 => 'ꖥ', + 9554 => 'ꖦ', + 9555 => 'ꖧ', + 9556 => 'ꖨ', + 9557 => 'ꖩ', + 9558 => 'ꖪ', + 9559 => 'ꖫ', + 9560 => 'ꖬ', + 9561 => 'ꖭ', + 9562 => 'ꖮ', + 9563 => 'ꖯ', + 9564 => 'ꖰ', + 9565 => 'ꖱ', + 9566 => 'ꖲ', + 9567 => 'ꖳ', + 9568 => 'ꖴ', + 9569 => 'ꖵ', + 9570 => 'ꖶ', + 9571 => 'ꖷ', + 9572 => 'ꖸ', + 9573 => 'ꖹ', + 9574 => 'ꖺ', + 9575 => 'ꖻ', + 9576 => 'ꖼ', + 9577 => 'ꖽ', + 9578 => 'ꖾ', + 9579 => 'ꖿ', + 9580 => 'ꗀ', + 9581 => 'ꗁ', + 9582 => 'ꗂ', + 9583 => 'ꗃ', + 9584 => 'ꗄ', + 9585 => 'ꗅ', + 9586 => 'ꗆ', + 9587 => 'ꗇ', + 9588 => 'ꗈ', + 9589 => 'ꗉ', + 9590 => 'ꗊ', + 9591 => 'ꗋ', + 9592 => 'ꗌ', + 9593 => 'ꗍ', + 9594 => 'ꗎ', + 9595 => 'ꗏ', + 9596 => 'ꗐ', + 9597 => 'ꗑ', + 9598 => 'ꗒ', + 9599 => 'ꗓ', + 9600 => 'ꗔ', + 9601 => 'ꗕ', + 9602 => 'ꗖ', + 9603 => 'ꗗ', + 9604 => 'ꗘ', + 9605 => 'ꗙ', + 9606 => 'ꗚ', + 9607 => 'ꗛ', + 9608 => 'ꗜ', + 9609 => 'ꗝ', + 9610 => 'ꗞ', + 9611 => 'ꗟ', + 9612 => 'ꗠ', + 9613 => 'ꗡ', + 9614 => 'ꗢ', + 9615 => 'ꗣ', + 9616 => 'ꗤ', + 9617 => 'ꗥ', + 9618 => 'ꗦ', + 9619 => 'ꗧ', + 9620 => 'ꗨ', + 9621 => 'ꗩ', + 9622 => 'ꗪ', + 9623 => 'ꗫ', + 9624 => 'ꗬ', + 9625 => 'ꗭ', + 9626 => 'ꗮ', + 9627 => 'ꗯ', + 9628 => 'ꗰ', + 9629 => 'ꗱ', + 9630 => 'ꗲ', + 9631 => 'ꗳ', + 9632 => 'ꗴ', + 9633 => 'ꗵ', + 9634 => 'ꗶ', + 9635 => 'ꗷ', + 9636 => 'ꗸ', + 9637 => 'ꗹ', + 9638 => 'ꗺ', + 9639 => 'ꗻ', + 9640 => 'ꗼ', + 9641 => 'ꗽ', + 9642 => 'ꗾ', + 9643 => 'ꗿ', + 9644 => 'ꘀ', + 9645 => 'ꘁ', + 9646 => 'ꘂ', + 9647 => 'ꘃ', + 9648 => 'ꘄ', + 9649 => 'ꘅ', + 9650 => 'ꘆ', + 9651 => 'ꘇ', + 9652 => 'ꘈ', + 9653 => 'ꘉ', + 9654 => 'ꘊ', + 9655 => 'ꘋ', + 9656 => 'ꘌ', + 9657 => 'ꚠ', + 9658 => 'ꚡ', + 9659 => 'ꚢ', + 9660 => 'ꚣ', + 9661 => 'ꚤ', + 9662 => 'ꚥ', + 9663 => 'ꚦ', + 9664 => 'ꚧ', + 9665 => 'ꚨ', + 9666 => 'ꚩ', + 9667 => 'ꚪ', + 9668 => 'ꚫ', + 9669 => 'ꚬ', + 9670 => 'ꚭ', + 9671 => 'ꚮ', + 9672 => 'ꚯ', + 9673 => 'ꚰ', + 9674 => 'ꚱ', + 9675 => 'ꚲ', + 9676 => 'ꚳ', + 9677 => 'ꚴ', + 9678 => 'ꚵ', + 9679 => 'ꚶ', + 9680 => 'ꚷ', + 9681 => 'ꚸ', + 9682 => 'ꚹ', + 9683 => 'ꚺ', + 9684 => 'ꚻ', + 9685 => 'ꚼ', + 9686 => 'ꚽ', + 9687 => 'ꚾ', + 9688 => 'ꚿ', + 9689 => 'ꛀ', + 9690 => 'ꛁ', + 9691 => 'ꛂ', + 9692 => 'ꛃ', + 9693 => 'ꛄ', + 9694 => 'ꛅ', + 9695 => 'ꛆ', + 9696 => 'ꛇ', + 9697 => 'ꛈ', + 9698 => 'ꛉ', + 9699 => 'ꛊ', + 9700 => 'ꛋ', + 9701 => 'ꛌ', + 9702 => 'ꛍ', + 9703 => 'ꛎ', + 9704 => 'ꛏ', + 9705 => 'ꛐ', + 9706 => 'ꛑ', + 9707 => 'ꛒ', + 9708 => 'ꛓ', + 9709 => 'ꛔ', + 9710 => 'ꛕ', + 9711 => 'ꛖ', + 9712 => 'ꛗ', + 9713 => 'ꛘ', + 9714 => 'ꛙ', + 9715 => 'ꛚ', + 9716 => 'ꛛ', + 9717 => 'ꛜ', + 9718 => 'ꛝ', + 9719 => 'ꛞ', + 9720 => 'ꛟ', + 9721 => 'ꛠ', + 9722 => 'ꛡ', + 9723 => 'ꛢ', + 9724 => 'ꛣ', + 9725 => 'ꛤ', + 9726 => 'ꛥ', + 9727 => 'ꛦ', + 9728 => 'ꛧ', + 9729 => 'ꛨ', + 9730 => 'ꛩ', + 9731 => 'ꛪ', + 9732 => 'ꛫ', + 9733 => 'ꛬ', + 9734 => 'ꛭ', + 9735 => 'ꛮ', + 9736 => 'ꛯ', + 9737 => '𖠀', + 9738 => '𖠁', + 9739 => '𖠂', + 9740 => '𖠃', + 9741 => '𖠄', + 9742 => '𖠅', + 9743 => '𖠆', + 9744 => '𖠇', + 9745 => '𖠈', + 9746 => '𖠉', + 9747 => '𖠊', + 9748 => '𖠋', + 9749 => '𖠌', + 9750 => '𖠍', + 9751 => '𖠎', + 9752 => '𖠏', + 9753 => '𖠐', + 9754 => '𖠑', + 9755 => '𖠒', + 9756 => '𖠓', + 9757 => '𖠔', + 9758 => '𖠕', + 9759 => '𖠖', + 9760 => '𖠗', + 9761 => '𖠘', + 9762 => '𖠙', + 9763 => '𖠚', + 9764 => '𖠛', + 9765 => '𖠜', + 9766 => '𖠝', + 9767 => '𖠞', + 9768 => '𖠟', + 9769 => '𖠠', + 9770 => '𖠡', + 9771 => '𖠢', + 9772 => '𖠣', + 9773 => '𖠤', + 9774 => '𖠥', + 9775 => '𖠦', + 9776 => '𖠧', + 9777 => '𖠨', + 9778 => '𖠩', + 9779 => '𖠪', + 9780 => '𖠫', + 9781 => '𖠬', + 9782 => '𖠭', + 9783 => '𖠮', + 9784 => '𖠯', + 9785 => '𖠰', + 9786 => '𖠱', + 9787 => '𖠲', + 9788 => '𖠳', + 9789 => '𖠴', + 9790 => '𖠵', + 9791 => '𖠶', + 9792 => '𖠷', + 9793 => '𖠸', + 9794 => '𖠹', + 9795 => '𖠺', + 9796 => '𖠻', + 9797 => '𖠼', + 9798 => '𖠽', + 9799 => '𖠾', + 9800 => '𖠿', + 9801 => '𖡀', + 9802 => '𖡁', + 9803 => '𖡂', + 9804 => '𖡃', + 9805 => '𖡄', + 9806 => '𖡅', + 9807 => '𖡆', + 9808 => '𖡇', + 9809 => '𖡈', + 9810 => '𖡉', + 9811 => '𖡊', + 9812 => '𖡋', + 9813 => '𖡌', + 9814 => '𖡍', + 9815 => '𖡎', + 9816 => '𖡏', + 9817 => '𖡐', + 9818 => '𖡑', + 9819 => '𖡒', + 9820 => '𖡓', + 9821 => '𖡔', + 9822 => '𖡕', + 9823 => '𖡖', + 9824 => '𖡗', + 9825 => '𖡘', + 9826 => '𖡙', + 9827 => '𖡚', + 9828 => '𖡛', + 9829 => '𖡜', + 9830 => '𖡝', + 9831 => '𖡞', + 9832 => '𖡟', + 9833 => '𖡠', + 9834 => '𖡡', + 9835 => '𖡢', + 9836 => '𖡣', + 9837 => '𖡤', + 9838 => '𖡥', + 9839 => '𖡦', + 9840 => '𖡧', + 9841 => '𖡨', + 9842 => '𖡩', + 9843 => '𖡪', + 9844 => '𖡫', + 9845 => '𖡬', + 9846 => '𖡭', + 9847 => '𖡮', + 9848 => '𖡯', + 9849 => '𖡰', + 9850 => '𖡱', + 9851 => '𖡲', + 9852 => '𖡳', + 9853 => '𖡴', + 9854 => '𖡵', + 9855 => '𖡶', + 9856 => '𖡷', + 9857 => '𖡸', + 9858 => '𖡹', + 9859 => '𖡺', + 9860 => '𖡻', + 9861 => '𖡼', + 9862 => '𖡽', + 9863 => '𖡾', + 9864 => '𖡿', + 9865 => '𖢀', + 9866 => '𖢁', + 9867 => '𖢂', + 9868 => '𖢃', + 9869 => '𖢄', + 9870 => '𖢅', + 9871 => '𖢆', + 9872 => '𖢇', + 9873 => '𖢈', + 9874 => '𖢉', + 9875 => '𖢊', + 9876 => '𖢋', + 9877 => '𖢌', + 9878 => '𖢍', + 9879 => '𖢎', + 9880 => '𖢏', + 9881 => '𖢐', + 9882 => '𖢑', + 9883 => '𖢒', + 9884 => '𖢓', + 9885 => '𖢔', + 9886 => '𖢕', + 9887 => '𖢖', + 9888 => '𖢗', + 9889 => '𖢘', + 9890 => '𖢙', + 9891 => '𖢚', + 9892 => '𖢛', + 9893 => '𖢜', + 9894 => '𖢝', + 9895 => '𖢞', + 9896 => '𖢟', + 9897 => '𖢠', + 9898 => '𖢡', + 9899 => '𖢢', + 9900 => '𖢣', + 9901 => '𖢤', + 9902 => '𖢥', + 9903 => '𖢦', + 9904 => '𖢧', + 9905 => '𖢨', + 9906 => '𖢩', + 9907 => '𖢪', + 9908 => '𖢫', + 9909 => '𖢬', + 9910 => '𖢭', + 9911 => '𖢮', + 9912 => '𖢯', + 9913 => '𖢰', + 9914 => '𖢱', + 9915 => '𖢲', + 9916 => '𖢳', + 9917 => '𖢴', + 9918 => '𖢵', + 9919 => '𖢶', + 9920 => '𖢷', + 9921 => '𖢸', + 9922 => '𖢹', + 9923 => '𖢺', + 9924 => '𖢻', + 9925 => '𖢼', + 9926 => '𖢽', + 9927 => '𖢾', + 9928 => '𖢿', + 9929 => '𖣀', + 9930 => '𖣁', + 9931 => '𖣂', + 9932 => '𖣃', + 9933 => '𖣄', + 9934 => '𖣅', + 9935 => '𖣆', + 9936 => '𖣇', + 9937 => '𖣈', + 9938 => '𖣉', + 9939 => '𖣊', + 9940 => '𖣋', + 9941 => '𖣌', + 9942 => '𖣍', + 9943 => '𖣎', + 9944 => '𖣏', + 9945 => '𖣐', + 9946 => '𖣑', + 9947 => '𖣒', + 9948 => '𖣓', + 9949 => '𖣔', + 9950 => '𖣕', + 9951 => '𖣖', + 9952 => '𖣗', + 9953 => '𖣘', + 9954 => '𖣙', + 9955 => '𖣚', + 9956 => '𖣛', + 9957 => '𖣜', + 9958 => '𖣝', + 9959 => '𖣞', + 9960 => '𖣟', + 9961 => '𖣠', + 9962 => '𖣡', + 9963 => '𖣢', + 9964 => '𖣣', + 9965 => '𖣤', + 9966 => '𖣥', + 9967 => '𖣦', + 9968 => '𖣧', + 9969 => '𖣨', + 9970 => '𖣩', + 9971 => '𖣪', + 9972 => '𖣫', + 9973 => '𖣬', + 9974 => '𖣭', + 9975 => '𖣮', + 9976 => '𖣯', + 9977 => '𖣰', + 9978 => '𖣱', + 9979 => '𖣲', + 9980 => '𖣳', + 9981 => '𖣴', + 9982 => '𖣵', + 9983 => '𖣶', + 9984 => '𖣷', + 9985 => '𖣸', + 9986 => '𖣹', + 9987 => '𖣺', + 9988 => '𖣻', + 9989 => '𖣼', + 9990 => '𖣽', + 9991 => '𖣾', + 9992 => '𖣿', + 9993 => '𖤀', + 9994 => '𖤁', + 9995 => '𖤂', + 9996 => '𖤃', + 9997 => '𖤄', + 9998 => '𖤅', + 9999 => '𖤆', + 10000 => '𖤇', + 10001 => '𖤈', + 10002 => '𖤉', + 10003 => '𖤊', + 10004 => '𖤋', + 10005 => '𖤌', + 10006 => '𖤍', + 10007 => '𖤎', + 10008 => '𖤏', + 10009 => '𖤐', + 10010 => '𖤑', + 10011 => '𖤒', + 10012 => '𖤓', + 10013 => '𖤔', + 10014 => '𖤕', + 10015 => '𖤖', + 10016 => '𖤗', + 10017 => '𖤘', + 10018 => '𖤙', + 10019 => '𖤚', + 10020 => '𖤛', + 10021 => '𖤜', + 10022 => '𖤝', + 10023 => '𖤞', + 10024 => '𖤟', + 10025 => '𖤠', + 10026 => '𖤡', + 10027 => '𖤢', + 10028 => '𖤣', + 10029 => '𖤤', + 10030 => '𖤥', + 10031 => '𖤦', + 10032 => '𖤧', + 10033 => '𖤨', + 10034 => '𖤩', + 10035 => '𖤪', + 10036 => '𖤫', + 10037 => '𖤬', + 10038 => '𖤭', + 10039 => '𖤮', + 10040 => '𖤯', + 10041 => '𖤰', + 10042 => '𖤱', + 10043 => '𖤲', + 10044 => '𖤳', + 10045 => '𖤴', + 10046 => '𖤵', + 10047 => '𖤶', + 10048 => '𖤷', + 10049 => '𖤸', + 10050 => '𖤹', + 10051 => '𖤺', + 10052 => '𖤻', + 10053 => '𖤼', + 10054 => '𖤽', + 10055 => '𖤾', + 10056 => '𖤿', + 10057 => '𖥀', + 10058 => '𖥁', + 10059 => '𖥂', + 10060 => '𖥃', + 10061 => '𖥄', + 10062 => '𖥅', + 10063 => '𖥆', + 10064 => '𖥇', + 10065 => '𖥈', + 10066 => '𖥉', + 10067 => '𖥊', + 10068 => '𖥋', + 10069 => '𖥌', + 10070 => '𖥍', + 10071 => '𖥎', + 10072 => '𖥏', + 10073 => '𖥐', + 10074 => '𖥑', + 10075 => '𖥒', + 10076 => '𖥓', + 10077 => '𖥔', + 10078 => '𖥕', + 10079 => '𖥖', + 10080 => '𖥗', + 10081 => '𖥘', + 10082 => '𖥙', + 10083 => '𖥚', + 10084 => '𖥛', + 10085 => '𖥜', + 10086 => '𖥝', + 10087 => '𖥞', + 10088 => '𖥟', + 10089 => '𖥠', + 10090 => '𖥡', + 10091 => '𖥢', + 10092 => '𖥣', + 10093 => '𖥤', + 10094 => '𖥥', + 10095 => '𖥦', + 10096 => '𖥧', + 10097 => '𖥨', + 10098 => '𖥩', + 10099 => '𖥪', + 10100 => '𖥫', + 10101 => '𖥬', + 10102 => '𖥭', + 10103 => '𖥮', + 10104 => '𖥯', + 10105 => '𖥰', + 10106 => '𖥱', + 10107 => '𖥲', + 10108 => '𖥳', + 10109 => '𖥴', + 10110 => '𖥵', + 10111 => '𖥶', + 10112 => '𖥷', + 10113 => '𖥸', + 10114 => '𖥹', + 10115 => '𖥺', + 10116 => '𖥻', + 10117 => '𖥼', + 10118 => '𖥽', + 10119 => '𖥾', + 10120 => '𖥿', + 10121 => '𖦀', + 10122 => '𖦁', + 10123 => '𖦂', + 10124 => '𖦃', + 10125 => '𖦄', + 10126 => '𖦅', + 10127 => '𖦆', + 10128 => '𖦇', + 10129 => '𖦈', + 10130 => '𖦉', + 10131 => '𖦊', + 10132 => '𖦋', + 10133 => '𖦌', + 10134 => '𖦍', + 10135 => '𖦎', + 10136 => '𖦏', + 10137 => '𖦐', + 10138 => '𖦑', + 10139 => '𖦒', + 10140 => '𖦓', + 10141 => '𖦔', + 10142 => '𖦕', + 10143 => '𖦖', + 10144 => '𖦗', + 10145 => '𖦘', + 10146 => '𖦙', + 10147 => '𖦚', + 10148 => '𖦛', + 10149 => '𖦜', + 10150 => '𖦝', + 10151 => '𖦞', + 10152 => '𖦟', + 10153 => '𖦠', + 10154 => '𖦡', + 10155 => '𖦢', + 10156 => '𖦣', + 10157 => '𖦤', + 10158 => '𖦥', + 10159 => '𖦦', + 10160 => '𖦧', + 10161 => '𖦨', + 10162 => '𖦩', + 10163 => '𖦪', + 10164 => '𖦫', + 10165 => '𖦬', + 10166 => '𖦭', + 10167 => '𖦮', + 10168 => '𖦯', + 10169 => '𖦰', + 10170 => '𖦱', + 10171 => '𖦲', + 10172 => '𖦳', + 10173 => '𖦴', + 10174 => '𖦵', + 10175 => '𖦶', + 10176 => '𖦷', + 10177 => '𖦸', + 10178 => '𖦹', + 10179 => '𖦺', + 10180 => '𖦻', + 10181 => '𖦼', + 10182 => '𖦽', + 10183 => '𖦾', + 10184 => '𖦿', + 10185 => '𖧀', + 10186 => '𖧁', + 10187 => '𖧂', + 10188 => '𖧃', + 10189 => '𖧄', + 10190 => '𖧅', + 10191 => '𖧆', + 10192 => '𖧇', + 10193 => '𖧈', + 10194 => '𖧉', + 10195 => '𖧊', + 10196 => '𖧋', + 10197 => '𖧌', + 10198 => '𖧍', + 10199 => '𖧎', + 10200 => '𖧏', + 10201 => '𖧐', + 10202 => '𖧑', + 10203 => '𖧒', + 10204 => '𖧓', + 10205 => '𖧔', + 10206 => '𖧕', + 10207 => '𖧖', + 10208 => '𖧗', + 10209 => '𖧘', + 10210 => '𖧙', + 10211 => '𖧚', + 10212 => '𖧛', + 10213 => '𖧜', + 10214 => '𖧝', + 10215 => '𖧞', + 10216 => '𖧟', + 10217 => '𖧠', + 10218 => '𖧡', + 10219 => '𖧢', + 10220 => '𖧣', + 10221 => '𖧤', + 10222 => '𖧥', + 10223 => '𖧦', + 10224 => '𖧧', + 10225 => '𖧨', + 10226 => '𖧩', + 10227 => '𖧪', + 10228 => '𖧫', + 10229 => '𖧬', + 10230 => '𖧭', + 10231 => '𖧮', + 10232 => '𖧯', + 10233 => '𖧰', + 10234 => '𖧱', + 10235 => '𖧲', + 10236 => '𖧳', + 10237 => '𖧴', + 10238 => '𖧵', + 10239 => '𖧶', + 10240 => '𖧷', + 10241 => '𖧸', + 10242 => '𖧹', + 10243 => '𖧺', + 10244 => '𖧻', + 10245 => '𖧼', + 10246 => '𖧽', + 10247 => '𖧾', + 10248 => '𖧿', + 10249 => '𖨀', + 10250 => '𖨁', + 10251 => '𖨂', + 10252 => '𖨃', + 10253 => '𖨄', + 10254 => '𖨅', + 10255 => '𖨆', + 10256 => '𖨇', + 10257 => '𖨈', + 10258 => '𖨉', + 10259 => '𖨊', + 10260 => '𖨋', + 10261 => '𖨌', + 10262 => '𖨍', + 10263 => '𖨎', + 10264 => '𖨏', + 10265 => '𖨐', + 10266 => '𖨑', + 10267 => '𖨒', + 10268 => '𖨓', + 10269 => '𖨔', + 10270 => '𖨕', + 10271 => '𖨖', + 10272 => '𖨗', + 10273 => '𖨘', + 10274 => '𖨙', + 10275 => '𖨚', + 10276 => '𖨛', + 10277 => '𖨜', + 10278 => '𖨝', + 10279 => '𖨞', + 10280 => '𖨟', + 10281 => '𖨠', + 10282 => '𖨡', + 10283 => '𖨢', + 10284 => '𖨣', + 10285 => '𖨤', + 10286 => '𖨥', + 10287 => '𖨦', + 10288 => '𖨧', + 10289 => '𖨨', + 10290 => '𖨩', + 10291 => '𖨪', + 10292 => '𖨫', + 10293 => '𖨬', + 10294 => '𖨭', + 10295 => '𖨮', + 10296 => '𖨯', + 10297 => '𖨰', + 10298 => '𖨱', + 10299 => '𖨲', + 10300 => '𖨳', + 10301 => '𖨴', + 10302 => '𖨵', + 10303 => '𖨶', + 10304 => '𖨷', + 10305 => '𖨸', + 10306 => 'ᄀ', + 10307 => 'ᄁ', + 10308 => 'ᄂ', + 10309 => 'ᄃ', + 10310 => 'ᄄ', + 10311 => 'ᄅ', + 10312 => 'ᄆ', + 10313 => 'ᄇ', + 10314 => 'ᄈ', + 10315 => 'ᄉ', + 10316 => 'ᄊ', + 10317 => 'ᄋ', + 10318 => 'ᄌ', + 10319 => 'ᄍ', + 10320 => 'ᄎ', + 10321 => 'ᄏ', + 10322 => 'ᄐ', + 10323 => 'ᄑ', + 10324 => 'ᄒ', + 10325 => 'ᄓ', + 10326 => 'ᄔ', + 10327 => 'ᄕ', + 10328 => 'ᄖ', + 10329 => 'ᄗ', + 10330 => 'ᄘ', + 10331 => 'ᄙ', + 10332 => 'ᄚ', + 10333 => 'ᄛ', + 10334 => 'ᄜ', + 10335 => 'ᄝ', + 10336 => 'ᄞ', + 10337 => 'ᄟ', + 10338 => 'ᄠ', + 10339 => 'ᄡ', + 10340 => 'ᄢ', + 10341 => 'ᄣ', + 10342 => 'ᄤ', + 10343 => 'ᄥ', + 10344 => 'ᄦ', + 10345 => 'ᄧ', + 10346 => 'ᄨ', + 10347 => 'ᄩ', + 10348 => 'ᄪ', + 10349 => 'ᄫ', + 10350 => 'ᄬ', + 10351 => 'ᄭ', + 10352 => 'ᄮ', + 10353 => 'ᄯ', + 10354 => 'ᄰ', + 10355 => 'ᄱ', + 10356 => 'ᄲ', + 10357 => 'ᄳ', + 10358 => 'ᄴ', + 10359 => 'ᄵ', + 10360 => 'ᄶ', + 10361 => 'ᄷ', + 10362 => 'ᄸ', + 10363 => 'ᄹ', + 10364 => 'ᄺ', + 10365 => 'ᄻ', + 10366 => 'ᄼ', + 10367 => 'ᄽ', + 10368 => 'ᄾ', + 10369 => 'ᄿ', + 10370 => 'ᅀ', + 10371 => 'ᅁ', + 10372 => 'ᅂ', + 10373 => 'ᅃ', + 10374 => 'ᅄ', + 10375 => 'ᅅ', + 10376 => 'ᅆ', + 10377 => 'ᅇ', + 10378 => 'ᅈ', + 10379 => 'ᅉ', + 10380 => 'ᅊ', + 10381 => 'ᅋ', + 10382 => 'ᅌ', + 10383 => 'ᅍ', + 10384 => 'ᅎ', + 10385 => 'ᅏ', + 10386 => 'ᅐ', + 10387 => 'ᅑ', + 10388 => 'ᅒ', + 10389 => 'ᅓ', + 10390 => 'ᅔ', + 10391 => 'ᅕ', + 10392 => 'ᅖ', + 10393 => 'ᅗ', + 10394 => 'ᅘ', + 10395 => 'ᅙ', + 10396 => 'ᅚ', + 10397 => 'ᅛ', + 10398 => 'ᅜ', + 10399 => 'ᅝ', + 10400 => 'ᅞ', + 10401 => 'ꥠ', + 10402 => 'ꥡ', + 10403 => 'ꥢ', + 10404 => 'ꥣ', + 10405 => 'ꥤ', + 10406 => 'ꥥ', + 10407 => 'ꥦ', + 10408 => 'ꥧ', + 10409 => 'ꥨ', + 10410 => 'ꥩ', + 10411 => 'ꥪ', + 10412 => 'ꥫ', + 10413 => 'ꥬ', + 10414 => 'ꥭ', + 10415 => 'ꥮ', + 10416 => 'ꥯ', + 10417 => 'ꥰ', + 10418 => 'ꥱ', + 10419 => 'ꥲ', + 10420 => 'ꥳ', + 10421 => 'ꥴ', + 10422 => 'ꥵ', + 10423 => 'ꥶ', + 10424 => 'ꥷ', + 10425 => 'ꥸ', + 10426 => 'ꥹ', + 10427 => 'ꥺ', + 10428 => 'ꥻ', + 10429 => 'ꥼ', + 10430 => 'ᅟ', + 10431 => 'ᅠ', + 10432 => 'ᅡ', + 10433 => 'ᅢ', + 10434 => 'ᅣ', + 10435 => 'ᅤ', + 10436 => 'ᅥ', + 10437 => 'ᅦ', + 10438 => 'ᅧ', + 10439 => 'ᅨ', + 10440 => 'ᅩ', + 10441 => 'ᅪ', + 10442 => 'ᅫ', + 10443 => 'ᅬ', + 10444 => 'ᅭ', + 10445 => 'ᅮ', + 10446 => 'ᅯ', + 10447 => 'ᅰ', + 10448 => 'ᅱ', + 10449 => 'ᅲ', + 10450 => 'ᅳ', + 10451 => 'ᅴ', + 10452 => 'ᅵ', + 10453 => 'ᅶ', + 10454 => 'ᅷ', + 10455 => 'ᅸ', + 10456 => 'ᅹ', + 10457 => 'ᅺ', + 10458 => 'ᅻ', + 10459 => 'ᅼ', + 10460 => 'ᅽ', + 10461 => 'ᅾ', + 10462 => 'ᅿ', + 10463 => 'ᆀ', + 10464 => 'ᆁ', + 10465 => 'ᆂ', + 10466 => 'ᆃ', + 10467 => 'ᆄ', + 10468 => 'ᆅ', + 10469 => 'ᆆ', + 10470 => 'ᆇ', + 10471 => 'ᆈ', + 10472 => 'ᆉ', + 10473 => 'ᆊ', + 10474 => 'ᆋ', + 10475 => 'ᆌ', + 10476 => 'ᆍ', + 10477 => 'ᆎ', + 10478 => 'ᆏ', + 10479 => 'ᆐ', + 10480 => 'ᆑ', + 10481 => 'ᆒ', + 10482 => 'ᆓ', + 10483 => 'ᆔ', + 10484 => 'ᆕ', + 10485 => 'ᆖ', + 10486 => 'ᆗ', + 10487 => 'ᆘ', + 10488 => 'ᆙ', + 10489 => 'ᆚ', + 10490 => 'ᆛ', + 10491 => 'ᆜ', + 10492 => 'ᆝ', + 10493 => 'ᆞ', + 10494 => 'ᆟ', + 10495 => 'ᆠ', + 10496 => 'ᆡ', + 10497 => 'ᆢ', + 10498 => 'ᆣ', + 10499 => 'ᆤ', + 10500 => 'ᆥ', + 10501 => 'ᆦ', + 10502 => 'ᆧ', + 10503 => 'ힰ', + 10504 => 'ힱ', + 10505 => 'ힲ', + 10506 => 'ힳ', + 10507 => 'ힴ', + 10508 => 'ힵ', + 10509 => 'ힶ', + 10510 => 'ힷ', + 10511 => 'ힸ', + 10512 => 'ힹ', + 10513 => 'ힺ', + 10514 => 'ힻ', + 10515 => 'ힼ', + 10516 => 'ힽ', + 10517 => 'ힾ', + 10518 => 'ힿ', + 10519 => 'ퟀ', + 10520 => 'ퟁ', + 10521 => 'ퟂ', + 10522 => 'ퟃ', + 10523 => 'ퟄ', + 10524 => 'ퟅ', + 10525 => 'ퟆ', + 10526 => 'ᆨ', + 10527 => 'ᆩ', + 10528 => 'ᆪ', + 10529 => 'ᆫ', + 10530 => 'ᆬ', + 10531 => 'ᆭ', + 10532 => 'ᆮ', + 10533 => 'ᆯ', + 10534 => 'ᆰ', + 10535 => 'ᆱ', + 10536 => 'ᆲ', + 10537 => 'ᆳ', + 10538 => 'ᆴ', + 10539 => 'ᆵ', + 10540 => 'ᆶ', + 10541 => 'ᆷ', + 10542 => 'ᆸ', + 10543 => 'ᆹ', + 10544 => 'ᆺ', + 10545 => 'ᆻ', + 10546 => 'ᆼ', + 10547 => 'ᆽ', + 10548 => 'ᆾ', + 10549 => 'ᆿ', + 10550 => 'ᇀ', + 10551 => 'ᇁ', + 10552 => 'ᇂ', + 10553 => 'ᇃ', + 10554 => 'ᇄ', + 10555 => 'ᇅ', + 10556 => 'ᇆ', + 10557 => 'ᇇ', + 10558 => 'ᇈ', + 10559 => 'ᇉ', + 10560 => 'ᇊ', + 10561 => 'ᇋ', + 10562 => 'ᇌ', + 10563 => 'ᇍ', + 10564 => 'ᇎ', + 10565 => 'ᇏ', + 10566 => 'ᇐ', + 10567 => 'ᇑ', + 10568 => 'ᇒ', + 10569 => 'ᇓ', + 10570 => 'ᇔ', + 10571 => 'ᇕ', + 10572 => 'ᇖ', + 10573 => 'ᇗ', + 10574 => 'ᇘ', + 10575 => 'ᇙ', + 10576 => 'ᇚ', + 10577 => 'ᇛ', + 10578 => 'ᇜ', + 10579 => 'ᇝ', + 10580 => 'ᇞ', + 10581 => 'ᇟ', + 10582 => 'ᇠ', + 10583 => 'ᇡ', + 10584 => 'ᇢ', + 10585 => 'ᇣ', + 10586 => 'ᇤ', + 10587 => 'ᇥ', + 10588 => 'ᇦ', + 10589 => 'ᇧ', + 10590 => 'ᇨ', + 10591 => 'ᇩ', + 10592 => 'ᇪ', + 10593 => 'ᇫ', + 10594 => 'ᇬ', + 10595 => 'ᇭ', + 10596 => 'ᇮ', + 10597 => 'ᇯ', + 10598 => 'ᇰ', + 10599 => 'ᇱ', + 10600 => 'ᇲ', + 10601 => 'ᇳ', + 10602 => 'ᇴ', + 10603 => 'ᇵ', + 10604 => 'ᇶ', + 10605 => 'ᇷ', + 10606 => 'ᇸ', + 10607 => 'ᇹ', + 10608 => 'ᇺ', + 10609 => 'ᇻ', + 10610 => 'ᇼ', + 10611 => 'ᇽ', + 10612 => 'ᇾ', + 10613 => 'ᇿ', + 10614 => 'ퟋ', + 10615 => 'ퟌ', + 10616 => 'ퟍ', + 10617 => 'ퟎ', + 10618 => 'ퟏ', + 10619 => 'ퟐ', + 10620 => 'ퟑ', + 10621 => 'ퟒ', + 10622 => 'ퟓ', + 10623 => 'ퟔ', + 10624 => 'ퟕ', + 10625 => 'ퟖ', + 10626 => 'ퟗ', + 10627 => 'ퟘ', + 10628 => 'ퟙ', + 10629 => 'ퟚ', + 10630 => 'ퟛ', + 10631 => 'ퟜ', + 10632 => 'ퟝ', + 10633 => 'ퟞ', + 10634 => 'ퟟ', + 10635 => 'ퟠ', + 10636 => 'ퟡ', + 10637 => 'ퟢ', + 10638 => 'ퟣ', + 10639 => 'ퟤ', + 10640 => 'ퟥ', + 10641 => 'ퟦ', + 10642 => 'ퟧ', + 10643 => 'ퟨ', + 10644 => 'ퟩ', + 10645 => 'ퟪ', + 10646 => 'ퟫ', + 10647 => 'ퟬ', + 10648 => 'ퟭ', + 10649 => 'ퟮ', + 10650 => 'ퟯ', + 10651 => 'ퟰ', + 10652 => 'ퟱ', + 10653 => 'ퟲ', + 10654 => 'ퟳ', + 10655 => 'ퟴ', + 10656 => 'ퟵ', + 10657 => 'ퟶ', + 10658 => 'ퟷ', + 10659 => 'ퟸ', + 10660 => 'ퟹ', + 10661 => 'ퟺ', + 10662 => 'ퟻ', + 10663 => 'あ', + 10664 => 'い', + 10665 => 'う', + 10666 => '𛀀', + 10667 => 'え', + 10668 => 'お', + 10669 => 'か', + 10670 => 'き', + 10671 => 'く', + 10672 => 'け', + 10673 => 'こ', + 10674 => 'さ', + 10675 => 'し', + 10676 => 'す', + 10677 => 'せ', + 10678 => 'そ', + 10679 => 'た', + 10680 => 'ち', + 10681 => 'つ', + 10682 => 'て', + 10683 => 'と', + 10684 => 'な', + 10685 => 'に', + 10686 => 'ぬ', + 10687 => 'ね', + 10688 => 'の', + 10689 => 'は', + 10690 => 'ひ', + 10691 => 'ふ', + 10692 => 'へ', + 10693 => 'ほ', + 10694 => 'ま', + 10695 => 'み', + 10696 => 'む', + 10697 => 'め', + 10698 => 'も', + 10699 => 'や', + 10700 => 'ゆ', + 10701 => '𛀁', + 10702 => 'よ', + 10703 => 'ら', + 10704 => 'り', + 10705 => 'る', + 10706 => 'れ', + 10707 => 'ろ', + 10708 => 'わ', + 10709 => 'ゐ', + 10710 => 'ゑ', + 10711 => 'を', + 10712 => 'ん', + 10713 => 'ㄅ', + 10714 => 'ㄆ', + 10715 => 'ㄇ', + 10716 => 'ㄈ', + 10717 => 'ㄪ', + 10718 => 'ㄉ', + 10719 => 'ㄊ', + 10720 => 'ㄋ', + 10721 => 'ㄌ', + 10722 => 'ㄍ', + 10723 => 'ㄎ', + 10724 => 'ㄫ', + 10725 => 'ㆭ', + 10726 => 'ㄏ', + 10727 => 'ㄐ', + 10728 => 'ㄑ', + 10729 => 'ㄒ', + 10730 => 'ㄬ', + 10731 => 'ㄓ', + 10732 => 'ㄔ', + 10733 => 'ㄕ', + 10734 => 'ㄖ', + 10735 => 'ㄗ', + 10736 => 'ㄘ', + 10737 => 'ㄙ', + 10738 => 'ㆸ', + 10739 => 'ㆹ', + 10740 => 'ㆺ', + 10741 => 'ㄚ', + 10742 => 'ㄛ', + 10743 => 'ㆦ', + 10744 => 'ㄜ', + 10745 => 'ㄝ', + 10746 => 'ㆤ', + 10747 => 'ㄞ', + 10748 => 'ㄟ', + 10749 => 'ㄠ', + 10750 => 'ㄡ', + 10751 => 'ㄢ', + 10752 => 'ㄣ', + 10753 => 'ㄤ', + 10754 => 'ㆲ', + 10755 => 'ㄥ', + 10756 => 'ㆰ', + 10757 => 'ㆱ', + 10758 => 'ㆬ', + 10759 => 'ㄦ', + 10760 => 'ㄧ', + 10761 => 'ㄨ', + 10762 => 'ㄩ', + 10763 => 'ㄭ', + 10764 => 'ꀀ', + 10765 => 'ꀁ', + 10766 => 'ꀂ', + 10767 => 'ꀃ', + 10768 => 'ꀄ', + 10769 => 'ꀅ', + 10770 => 'ꀆ', + 10771 => 'ꀇ', + 10772 => 'ꀈ', + 10773 => 'ꀉ', + 10774 => 'ꀊ', + 10775 => 'ꀋ', + 10776 => 'ꀌ', + 10777 => 'ꀍ', + 10778 => 'ꀎ', + 10779 => 'ꀏ', + 10780 => 'ꀐ', + 10781 => 'ꀑ', + 10782 => 'ꀒ', + 10783 => 'ꀓ', + 10784 => 'ꀔ', + 10785 => 'ꀕ', + 10786 => 'ꀖ', + 10787 => 'ꀗ', + 10788 => 'ꀘ', + 10789 => 'ꀙ', + 10790 => 'ꀚ', + 10791 => 'ꀛ', + 10792 => 'ꀜ', + 10793 => 'ꀝ', + 10794 => 'ꀞ', + 10795 => 'ꀟ', + 10796 => 'ꀠ', + 10797 => 'ꀡ', + 10798 => 'ꀢ', + 10799 => 'ꀣ', + 10800 => 'ꀤ', + 10801 => 'ꀥ', + 10802 => 'ꀦ', + 10803 => 'ꀧ', + 10804 => 'ꀨ', + 10805 => 'ꀩ', + 10806 => 'ꀪ', + 10807 => 'ꀫ', + 10808 => 'ꀬ', + 10809 => 'ꀭ', + 10810 => 'ꀮ', + 10811 => 'ꀯ', + 10812 => 'ꀰ', + 10813 => 'ꀱ', + 10814 => 'ꀲ', + 10815 => 'ꀳ', + 10816 => 'ꀴ', + 10817 => 'ꀵ', + 10818 => 'ꀶ', + 10819 => 'ꀷ', + 10820 => 'ꀸ', + 10821 => 'ꀹ', + 10822 => 'ꀺ', + 10823 => 'ꀻ', + 10824 => 'ꀼ', + 10825 => 'ꀽ', + 10826 => 'ꀾ', + 10827 => 'ꀿ', + 10828 => 'ꁀ', + 10829 => 'ꁁ', + 10830 => 'ꁂ', + 10831 => 'ꁃ', + 10832 => 'ꁄ', + 10833 => 'ꁅ', + 10834 => 'ꁆ', + 10835 => 'ꁇ', + 10836 => 'ꁈ', + 10837 => 'ꁉ', + 10838 => 'ꁊ', + 10839 => 'ꁋ', + 10840 => 'ꁌ', + 10841 => 'ꁍ', + 10842 => 'ꁎ', + 10843 => 'ꁏ', + 10844 => 'ꁐ', + 10845 => 'ꁑ', + 10846 => 'ꁒ', + 10847 => 'ꁓ', + 10848 => 'ꁔ', + 10849 => 'ꁕ', + 10850 => 'ꁖ', + 10851 => 'ꁗ', + 10852 => 'ꁘ', + 10853 => 'ꁙ', + 10854 => 'ꁚ', + 10855 => 'ꁛ', + 10856 => 'ꁜ', + 10857 => 'ꁝ', + 10858 => 'ꁞ', + 10859 => 'ꁟ', + 10860 => 'ꁠ', + 10861 => 'ꁡ', + 10862 => 'ꁢ', + 10863 => 'ꁣ', + 10864 => 'ꁤ', + 10865 => 'ꁥ', + 10866 => 'ꁦ', + 10867 => 'ꁧ', + 10868 => 'ꁨ', + 10869 => 'ꁩ', + 10870 => 'ꁪ', + 10871 => 'ꁫ', + 10872 => 'ꁬ', + 10873 => 'ꁭ', + 10874 => 'ꁮ', + 10875 => 'ꁯ', + 10876 => 'ꁰ', + 10877 => 'ꁱ', + 10878 => 'ꁲ', + 10879 => 'ꁳ', + 10880 => 'ꁴ', + 10881 => 'ꁵ', + 10882 => 'ꁶ', + 10883 => 'ꁷ', + 10884 => 'ꁸ', + 10885 => 'ꁹ', + 10886 => 'ꁺ', + 10887 => 'ꁻ', + 10888 => 'ꁼ', + 10889 => 'ꁽ', + 10890 => 'ꁾ', + 10891 => 'ꁿ', + 10892 => 'ꂀ', + 10893 => 'ꂁ', + 10894 => 'ꂂ', + 10895 => 'ꂃ', + 10896 => 'ꂄ', + 10897 => 'ꂅ', + 10898 => 'ꂆ', + 10899 => 'ꂇ', + 10900 => 'ꂈ', + 10901 => 'ꂉ', + 10902 => 'ꂊ', + 10903 => 'ꂋ', + 10904 => 'ꂌ', + 10905 => 'ꂍ', + 10906 => 'ꂎ', + 10907 => 'ꂏ', + 10908 => 'ꂐ', + 10909 => 'ꂑ', + 10910 => 'ꂒ', + 10911 => 'ꂓ', + 10912 => 'ꂔ', + 10913 => 'ꂕ', + 10914 => 'ꂖ', + 10915 => 'ꂗ', + 10916 => 'ꂘ', + 10917 => 'ꂙ', + 10918 => 'ꂚ', + 10919 => 'ꂛ', + 10920 => 'ꂜ', + 10921 => 'ꂝ', + 10922 => 'ꂞ', + 10923 => 'ꂟ', + 10924 => 'ꂠ', + 10925 => 'ꂡ', + 10926 => 'ꂢ', + 10927 => 'ꂣ', + 10928 => 'ꂤ', + 10929 => 'ꂥ', + 10930 => 'ꂦ', + 10931 => 'ꂧ', + 10932 => 'ꂨ', + 10933 => 'ꂩ', + 10934 => 'ꂪ', + 10935 => 'ꂫ', + 10936 => 'ꂬ', + 10937 => 'ꂭ', + 10938 => 'ꂮ', + 10939 => 'ꂯ', + 10940 => 'ꂰ', + 10941 => 'ꂱ', + 10942 => 'ꂲ', + 10943 => 'ꂳ', + 10944 => 'ꂴ', + 10945 => 'ꂵ', + 10946 => 'ꂶ', + 10947 => 'ꂷ', + 10948 => 'ꂸ', + 10949 => 'ꂹ', + 10950 => 'ꂺ', + 10951 => 'ꂻ', + 10952 => 'ꂼ', + 10953 => 'ꂽ', + 10954 => 'ꂾ', + 10955 => 'ꂿ', + 10956 => 'ꃀ', + 10957 => 'ꃁ', + 10958 => 'ꃂ', + 10959 => 'ꃃ', + 10960 => 'ꃄ', + 10961 => 'ꃅ', + 10962 => 'ꃆ', + 10963 => 'ꃇ', + 10964 => 'ꃈ', + 10965 => 'ꃉ', + 10966 => 'ꃊ', + 10967 => 'ꃋ', + 10968 => 'ꃌ', + 10969 => 'ꃍ', + 10970 => 'ꃎ', + 10971 => 'ꃏ', + 10972 => 'ꃐ', + 10973 => 'ꃑ', + 10974 => 'ꃒ', + 10975 => 'ꃓ', + 10976 => 'ꃔ', + 10977 => 'ꃕ', + 10978 => 'ꃖ', + 10979 => 'ꃗ', + 10980 => 'ꃘ', + 10981 => 'ꃙ', + 10982 => 'ꃚ', + 10983 => 'ꃛ', + 10984 => 'ꃜ', + 10985 => 'ꃝ', + 10986 => 'ꃞ', + 10987 => 'ꃟ', + 10988 => 'ꃠ', + 10989 => 'ꃡ', + 10990 => 'ꃢ', + 10991 => 'ꃣ', + 10992 => 'ꃤ', + 10993 => 'ꃥ', + 10994 => 'ꃦ', + 10995 => 'ꃧ', + 10996 => 'ꃨ', + 10997 => 'ꃩ', + 10998 => 'ꃪ', + 10999 => 'ꃫ', + 11000 => 'ꃬ', + 11001 => 'ꃭ', + 11002 => 'ꃮ', + 11003 => 'ꃯ', + 11004 => 'ꃰ', + 11005 => 'ꃱ', + 11006 => 'ꃲ', + 11007 => 'ꃳ', + 11008 => 'ꃴ', + 11009 => 'ꃵ', + 11010 => 'ꃶ', + 11011 => 'ꃷ', + 11012 => 'ꃸ', + 11013 => 'ꃹ', + 11014 => 'ꃺ', + 11015 => 'ꃻ', + 11016 => 'ꃼ', + 11017 => 'ꃽ', + 11018 => 'ꃾ', + 11019 => 'ꃿ', + 11020 => 'ꄀ', + 11021 => 'ꄁ', + 11022 => 'ꄂ', + 11023 => 'ꄃ', + 11024 => 'ꄄ', + 11025 => 'ꄅ', + 11026 => 'ꄆ', + 11027 => 'ꄇ', + 11028 => 'ꄈ', + 11029 => 'ꄉ', + 11030 => 'ꄊ', + 11031 => 'ꄋ', + 11032 => 'ꄌ', + 11033 => 'ꄍ', + 11034 => 'ꄎ', + 11035 => 'ꄏ', + 11036 => 'ꄐ', + 11037 => 'ꄑ', + 11038 => 'ꄒ', + 11039 => 'ꄓ', + 11040 => 'ꄔ', + 11041 => 'ꄕ', + 11042 => 'ꄖ', + 11043 => 'ꄗ', + 11044 => 'ꄘ', + 11045 => 'ꄙ', + 11046 => 'ꄚ', + 11047 => 'ꄛ', + 11048 => 'ꄜ', + 11049 => 'ꄝ', + 11050 => 'ꄞ', + 11051 => 'ꄟ', + 11052 => 'ꄠ', + 11053 => 'ꄡ', + 11054 => 'ꄢ', + 11055 => 'ꄣ', + 11056 => 'ꄤ', + 11057 => 'ꄥ', + 11058 => 'ꄦ', + 11059 => 'ꄧ', + 11060 => 'ꄨ', + 11061 => 'ꄩ', + 11062 => 'ꄪ', + 11063 => 'ꄫ', + 11064 => 'ꄬ', + 11065 => 'ꄭ', + 11066 => 'ꄮ', + 11067 => 'ꄯ', + 11068 => 'ꄰ', + 11069 => 'ꄱ', + 11070 => 'ꄲ', + 11071 => 'ꄳ', + 11072 => 'ꄴ', + 11073 => 'ꄵ', + 11074 => 'ꄶ', + 11075 => 'ꄷ', + 11076 => 'ꄸ', + 11077 => 'ꄹ', + 11078 => 'ꄺ', + 11079 => 'ꄻ', + 11080 => 'ꄼ', + 11081 => 'ꄽ', + 11082 => 'ꄾ', + 11083 => 'ꄿ', + 11084 => 'ꅀ', + 11085 => 'ꅁ', + 11086 => 'ꅂ', + 11087 => 'ꅃ', + 11088 => 'ꅄ', + 11089 => 'ꅅ', + 11090 => 'ꅆ', + 11091 => 'ꅇ', + 11092 => 'ꅈ', + 11093 => 'ꅉ', + 11094 => 'ꅊ', + 11095 => 'ꅋ', + 11096 => 'ꅌ', + 11097 => 'ꅍ', + 11098 => 'ꅎ', + 11099 => 'ꅏ', + 11100 => 'ꅐ', + 11101 => 'ꅑ', + 11102 => 'ꅒ', + 11103 => 'ꅓ', + 11104 => 'ꅔ', + 11105 => 'ꅕ', + 11106 => 'ꅖ', + 11107 => 'ꅗ', + 11108 => 'ꅘ', + 11109 => 'ꅙ', + 11110 => 'ꅚ', + 11111 => 'ꅛ', + 11112 => 'ꅜ', + 11113 => 'ꅝ', + 11114 => 'ꅞ', + 11115 => 'ꅟ', + 11116 => 'ꅠ', + 11117 => 'ꅡ', + 11118 => 'ꅢ', + 11119 => 'ꅣ', + 11120 => 'ꅤ', + 11121 => 'ꅥ', + 11122 => 'ꅦ', + 11123 => 'ꅧ', + 11124 => 'ꅨ', + 11125 => 'ꅩ', + 11126 => 'ꅪ', + 11127 => 'ꅫ', + 11128 => 'ꅬ', + 11129 => 'ꅭ', + 11130 => 'ꅮ', + 11131 => 'ꅯ', + 11132 => 'ꅰ', + 11133 => 'ꅱ', + 11134 => 'ꅲ', + 11135 => 'ꅳ', + 11136 => 'ꅴ', + 11137 => 'ꅵ', + 11138 => 'ꅶ', + 11139 => 'ꅷ', + 11140 => 'ꅸ', + 11141 => 'ꅹ', + 11142 => 'ꅺ', + 11143 => 'ꅻ', + 11144 => 'ꅼ', + 11145 => 'ꅽ', + 11146 => 'ꅾ', + 11147 => 'ꅿ', + 11148 => 'ꆀ', + 11149 => 'ꆁ', + 11150 => 'ꆂ', + 11151 => 'ꆃ', + 11152 => 'ꆄ', + 11153 => 'ꆅ', + 11154 => 'ꆆ', + 11155 => 'ꆇ', + 11156 => 'ꆈ', + 11157 => 'ꆉ', + 11158 => 'ꆊ', + 11159 => 'ꆋ', + 11160 => 'ꆌ', + 11161 => 'ꆍ', + 11162 => 'ꆎ', + 11163 => 'ꆏ', + 11164 => 'ꆐ', + 11165 => 'ꆑ', + 11166 => 'ꆒ', + 11167 => 'ꆓ', + 11168 => 'ꆔ', + 11169 => 'ꆕ', + 11170 => 'ꆖ', + 11171 => 'ꆗ', + 11172 => 'ꆘ', + 11173 => 'ꆙ', + 11174 => 'ꆚ', + 11175 => 'ꆛ', + 11176 => 'ꆜ', + 11177 => 'ꆝ', + 11178 => 'ꆞ', + 11179 => 'ꆟ', + 11180 => 'ꆠ', + 11181 => 'ꆡ', + 11182 => 'ꆢ', + 11183 => 'ꆣ', + 11184 => 'ꆤ', + 11185 => 'ꆥ', + 11186 => 'ꆦ', + 11187 => 'ꆧ', + 11188 => 'ꆨ', + 11189 => 'ꆩ', + 11190 => 'ꆪ', + 11191 => 'ꆫ', + 11192 => 'ꆬ', + 11193 => 'ꆭ', + 11194 => 'ꆮ', + 11195 => 'ꆯ', + 11196 => 'ꆰ', + 11197 => 'ꆱ', + 11198 => 'ꆲ', + 11199 => 'ꆳ', + 11200 => 'ꆴ', + 11201 => 'ꆵ', + 11202 => 'ꆶ', + 11203 => 'ꆷ', + 11204 => 'ꆸ', + 11205 => 'ꆹ', + 11206 => 'ꆺ', + 11207 => 'ꆻ', + 11208 => 'ꆼ', + 11209 => 'ꆽ', + 11210 => 'ꆾ', + 11211 => 'ꆿ', + 11212 => 'ꇀ', + 11213 => 'ꇁ', + 11214 => 'ꇂ', + 11215 => 'ꇃ', + 11216 => 'ꇄ', + 11217 => 'ꇅ', + 11218 => 'ꇆ', + 11219 => 'ꇇ', + 11220 => 'ꇈ', + 11221 => 'ꇉ', + 11222 => 'ꇊ', + 11223 => 'ꇋ', + 11224 => 'ꇌ', + 11225 => 'ꇍ', + 11226 => 'ꇎ', + 11227 => 'ꇏ', + 11228 => 'ꇐ', + 11229 => 'ꇑ', + 11230 => 'ꇒ', + 11231 => 'ꇓ', + 11232 => 'ꇔ', + 11233 => 'ꇕ', + 11234 => 'ꇖ', + 11235 => 'ꇗ', + 11236 => 'ꇘ', + 11237 => 'ꇙ', + 11238 => 'ꇚ', + 11239 => 'ꇛ', + 11240 => 'ꇜ', + 11241 => 'ꇝ', + 11242 => 'ꇞ', + 11243 => 'ꇟ', + 11244 => 'ꇠ', + 11245 => 'ꇡ', + 11246 => 'ꇢ', + 11247 => 'ꇣ', + 11248 => 'ꇤ', + 11249 => 'ꇥ', + 11250 => 'ꇦ', + 11251 => 'ꇧ', + 11252 => 'ꇨ', + 11253 => 'ꇩ', + 11254 => 'ꇪ', + 11255 => 'ꇫ', + 11256 => 'ꇬ', + 11257 => 'ꇭ', + 11258 => 'ꇮ', + 11259 => 'ꇯ', + 11260 => 'ꇰ', + 11261 => 'ꇱ', + 11262 => 'ꇲ', + 11263 => 'ꇳ', + 11264 => 'ꇴ', + 11265 => 'ꇵ', + 11266 => 'ꇶ', + 11267 => 'ꇷ', + 11268 => 'ꇸ', + 11269 => 'ꇹ', + 11270 => 'ꇺ', + 11271 => 'ꇻ', + 11272 => 'ꇼ', + 11273 => 'ꇽ', + 11274 => 'ꇾ', + 11275 => 'ꇿ', + 11276 => 'ꈀ', + 11277 => 'ꈁ', + 11278 => 'ꈂ', + 11279 => 'ꈃ', + 11280 => 'ꈄ', + 11281 => 'ꈅ', + 11282 => 'ꈆ', + 11283 => 'ꈇ', + 11284 => 'ꈈ', + 11285 => 'ꈉ', + 11286 => 'ꈊ', + 11287 => 'ꈋ', + 11288 => 'ꈌ', + 11289 => 'ꈍ', + 11290 => 'ꈎ', + 11291 => 'ꈏ', + 11292 => 'ꈐ', + 11293 => 'ꈑ', + 11294 => 'ꈒ', + 11295 => 'ꈓ', + 11296 => 'ꈔ', + 11297 => 'ꈕ', + 11298 => 'ꈖ', + 11299 => 'ꈗ', + 11300 => 'ꈘ', + 11301 => 'ꈙ', + 11302 => 'ꈚ', + 11303 => 'ꈛ', + 11304 => 'ꈜ', + 11305 => 'ꈝ', + 11306 => 'ꈞ', + 11307 => 'ꈟ', + 11308 => 'ꈠ', + 11309 => 'ꈡ', + 11310 => 'ꈢ', + 11311 => 'ꈣ', + 11312 => 'ꈤ', + 11313 => 'ꈥ', + 11314 => 'ꈦ', + 11315 => 'ꈧ', + 11316 => 'ꈨ', + 11317 => 'ꈩ', + 11318 => 'ꈪ', + 11319 => 'ꈫ', + 11320 => 'ꈬ', + 11321 => 'ꈭ', + 11322 => 'ꈮ', + 11323 => 'ꈯ', + 11324 => 'ꈰ', + 11325 => 'ꈱ', + 11326 => 'ꈲ', + 11327 => 'ꈳ', + 11328 => 'ꈴ', + 11329 => 'ꈵ', + 11330 => 'ꈶ', + 11331 => 'ꈷ', + 11332 => 'ꈸ', + 11333 => 'ꈹ', + 11334 => 'ꈺ', + 11335 => 'ꈻ', + 11336 => 'ꈼ', + 11337 => 'ꈽ', + 11338 => 'ꈾ', + 11339 => 'ꈿ', + 11340 => 'ꉀ', + 11341 => 'ꉁ', + 11342 => 'ꉂ', + 11343 => 'ꉃ', + 11344 => 'ꉄ', + 11345 => 'ꉅ', + 11346 => 'ꉆ', + 11347 => 'ꉇ', + 11348 => 'ꉈ', + 11349 => 'ꉉ', + 11350 => 'ꉊ', + 11351 => 'ꉋ', + 11352 => 'ꉌ', + 11353 => 'ꉍ', + 11354 => 'ꉎ', + 11355 => 'ꉏ', + 11356 => 'ꉐ', + 11357 => 'ꉑ', + 11358 => 'ꉒ', + 11359 => 'ꉓ', + 11360 => 'ꉔ', + 11361 => 'ꉕ', + 11362 => 'ꉖ', + 11363 => 'ꉗ', + 11364 => 'ꉘ', + 11365 => 'ꉙ', + 11366 => 'ꉚ', + 11367 => 'ꉛ', + 11368 => 'ꉜ', + 11369 => 'ꉝ', + 11370 => 'ꉞ', + 11371 => 'ꉟ', + 11372 => 'ꉠ', + 11373 => 'ꉡ', + 11374 => 'ꉢ', + 11375 => 'ꉣ', + 11376 => 'ꉤ', + 11377 => 'ꉥ', + 11378 => 'ꉦ', + 11379 => 'ꉧ', + 11380 => 'ꉨ', + 11381 => 'ꉩ', + 11382 => 'ꉪ', + 11383 => 'ꉫ', + 11384 => 'ꉬ', + 11385 => 'ꉭ', + 11386 => 'ꉮ', + 11387 => 'ꉯ', + 11388 => 'ꉰ', + 11389 => 'ꉱ', + 11390 => 'ꉲ', + 11391 => 'ꉳ', + 11392 => 'ꉴ', + 11393 => 'ꉵ', + 11394 => 'ꉶ', + 11395 => 'ꉷ', + 11396 => 'ꉸ', + 11397 => 'ꉹ', + 11398 => 'ꉺ', + 11399 => 'ꉻ', + 11400 => 'ꉼ', + 11401 => 'ꉽ', + 11402 => 'ꉾ', + 11403 => 'ꉿ', + 11404 => 'ꊀ', + 11405 => 'ꊁ', + 11406 => 'ꊂ', + 11407 => 'ꊃ', + 11408 => 'ꊄ', + 11409 => 'ꊅ', + 11410 => 'ꊆ', + 11411 => 'ꊇ', + 11412 => 'ꊈ', + 11413 => 'ꊉ', + 11414 => 'ꊊ', + 11415 => 'ꊋ', + 11416 => 'ꊌ', + 11417 => 'ꊍ', + 11418 => 'ꊎ', + 11419 => 'ꊏ', + 11420 => 'ꊐ', + 11421 => 'ꊑ', + 11422 => 'ꊒ', + 11423 => 'ꊓ', + 11424 => 'ꊔ', + 11425 => 'ꊕ', + 11426 => 'ꊖ', + 11427 => 'ꊗ', + 11428 => 'ꊘ', + 11429 => 'ꊙ', + 11430 => 'ꊚ', + 11431 => 'ꊛ', + 11432 => 'ꊜ', + 11433 => 'ꊝ', + 11434 => 'ꊞ', + 11435 => 'ꊟ', + 11436 => 'ꊠ', + 11437 => 'ꊡ', + 11438 => 'ꊢ', + 11439 => 'ꊣ', + 11440 => 'ꊤ', + 11441 => 'ꊥ', + 11442 => 'ꊦ', + 11443 => 'ꊧ', + 11444 => 'ꊨ', + 11445 => 'ꊩ', + 11446 => 'ꊪ', + 11447 => 'ꊫ', + 11448 => 'ꊬ', + 11449 => 'ꊭ', + 11450 => 'ꊮ', + 11451 => 'ꊯ', + 11452 => 'ꊰ', + 11453 => 'ꊱ', + 11454 => 'ꊲ', + 11455 => 'ꊳ', + 11456 => 'ꊴ', + 11457 => 'ꊵ', + 11458 => 'ꊶ', + 11459 => 'ꊷ', + 11460 => 'ꊸ', + 11461 => 'ꊹ', + 11462 => 'ꊺ', + 11463 => 'ꊻ', + 11464 => 'ꊼ', + 11465 => 'ꊽ', + 11466 => 'ꊾ', + 11467 => 'ꊿ', + 11468 => 'ꋀ', + 11469 => 'ꋁ', + 11470 => 'ꋂ', + 11471 => 'ꋃ', + 11472 => 'ꋄ', + 11473 => 'ꋅ', + 11474 => 'ꋆ', + 11475 => 'ꋇ', + 11476 => 'ꋈ', + 11477 => 'ꋉ', + 11478 => 'ꋊ', + 11479 => 'ꋋ', + 11480 => 'ꋌ', + 11481 => 'ꋍ', + 11482 => 'ꋎ', + 11483 => 'ꋏ', + 11484 => 'ꋐ', + 11485 => 'ꋑ', + 11486 => 'ꋒ', + 11487 => 'ꋓ', + 11488 => 'ꋔ', + 11489 => 'ꋕ', + 11490 => 'ꋖ', + 11491 => 'ꋗ', + 11492 => 'ꋘ', + 11493 => 'ꋙ', + 11494 => 'ꋚ', + 11495 => 'ꋛ', + 11496 => 'ꋜ', + 11497 => 'ꋝ', + 11498 => 'ꋞ', + 11499 => 'ꋟ', + 11500 => 'ꋠ', + 11501 => 'ꋡ', + 11502 => 'ꋢ', + 11503 => 'ꋣ', + 11504 => 'ꋤ', + 11505 => 'ꋥ', + 11506 => 'ꋦ', + 11507 => 'ꋧ', + 11508 => 'ꋨ', + 11509 => 'ꋩ', + 11510 => 'ꋪ', + 11511 => 'ꋫ', + 11512 => 'ꋬ', + 11513 => 'ꋭ', + 11514 => 'ꋮ', + 11515 => 'ꋯ', + 11516 => 'ꋰ', + 11517 => 'ꋱ', + 11518 => 'ꋲ', + 11519 => 'ꋳ', + 11520 => 'ꋴ', + 11521 => 'ꋵ', + 11522 => 'ꋶ', + 11523 => 'ꋷ', + 11524 => 'ꋸ', + 11525 => 'ꋹ', + 11526 => 'ꋺ', + 11527 => 'ꋻ', + 11528 => 'ꋼ', + 11529 => 'ꋽ', + 11530 => 'ꋾ', + 11531 => 'ꋿ', + 11532 => 'ꌀ', + 11533 => 'ꌁ', + 11534 => 'ꌂ', + 11535 => 'ꌃ', + 11536 => 'ꌄ', + 11537 => 'ꌅ', + 11538 => 'ꌆ', + 11539 => 'ꌇ', + 11540 => 'ꌈ', + 11541 => 'ꌉ', + 11542 => 'ꌊ', + 11543 => 'ꌋ', + 11544 => 'ꌌ', + 11545 => 'ꌍ', + 11546 => 'ꌎ', + 11547 => 'ꌏ', + 11548 => 'ꌐ', + 11549 => 'ꌑ', + 11550 => 'ꌒ', + 11551 => 'ꌓ', + 11552 => 'ꌔ', + 11553 => 'ꌕ', + 11554 => 'ꌖ', + 11555 => 'ꌗ', + 11556 => 'ꌘ', + 11557 => 'ꌙ', + 11558 => 'ꌚ', + 11559 => 'ꌛ', + 11560 => 'ꌜ', + 11561 => 'ꌝ', + 11562 => 'ꌞ', + 11563 => 'ꌟ', + 11564 => 'ꌠ', + 11565 => 'ꌡ', + 11566 => 'ꌢ', + 11567 => 'ꌣ', + 11568 => 'ꌤ', + 11569 => 'ꌥ', + 11570 => 'ꌦ', + 11571 => 'ꌧ', + 11572 => 'ꌨ', + 11573 => 'ꌩ', + 11574 => 'ꌪ', + 11575 => 'ꌫ', + 11576 => 'ꌬ', + 11577 => 'ꌭ', + 11578 => 'ꌮ', + 11579 => 'ꌯ', + 11580 => 'ꌰ', + 11581 => 'ꌱ', + 11582 => 'ꌲ', + 11583 => 'ꌳ', + 11584 => 'ꌴ', + 11585 => 'ꌵ', + 11586 => 'ꌶ', + 11587 => 'ꌷ', + 11588 => 'ꌸ', + 11589 => 'ꌹ', + 11590 => 'ꌺ', + 11591 => 'ꌻ', + 11592 => 'ꌼ', + 11593 => 'ꌽ', + 11594 => 'ꌾ', + 11595 => 'ꌿ', + 11596 => 'ꍀ', + 11597 => 'ꍁ', + 11598 => 'ꍂ', + 11599 => 'ꍃ', + 11600 => 'ꍄ', + 11601 => 'ꍅ', + 11602 => 'ꍆ', + 11603 => 'ꍇ', + 11604 => 'ꍈ', + 11605 => 'ꍉ', + 11606 => 'ꍊ', + 11607 => 'ꍋ', + 11608 => 'ꍌ', + 11609 => 'ꍍ', + 11610 => 'ꍎ', + 11611 => 'ꍏ', + 11612 => 'ꍐ', + 11613 => 'ꍑ', + 11614 => 'ꍒ', + 11615 => 'ꍓ', + 11616 => 'ꍔ', + 11617 => 'ꍕ', + 11618 => 'ꍖ', + 11619 => 'ꍗ', + 11620 => 'ꍘ', + 11621 => 'ꍙ', + 11622 => 'ꍚ', + 11623 => 'ꍛ', + 11624 => 'ꍜ', + 11625 => 'ꍝ', + 11626 => 'ꍞ', + 11627 => 'ꍟ', + 11628 => 'ꍠ', + 11629 => 'ꍡ', + 11630 => 'ꍢ', + 11631 => 'ꍣ', + 11632 => 'ꍤ', + 11633 => 'ꍥ', + 11634 => 'ꍦ', + 11635 => 'ꍧ', + 11636 => 'ꍨ', + 11637 => 'ꍩ', + 11638 => 'ꍪ', + 11639 => 'ꍫ', + 11640 => 'ꍬ', + 11641 => 'ꍭ', + 11642 => 'ꍮ', + 11643 => 'ꍯ', + 11644 => 'ꍰ', + 11645 => 'ꍱ', + 11646 => 'ꍲ', + 11647 => 'ꍳ', + 11648 => 'ꍴ', + 11649 => 'ꍵ', + 11650 => 'ꍶ', + 11651 => 'ꍷ', + 11652 => 'ꍸ', + 11653 => 'ꍹ', + 11654 => 'ꍺ', + 11655 => 'ꍻ', + 11656 => 'ꍼ', + 11657 => 'ꍽ', + 11658 => 'ꍾ', + 11659 => 'ꍿ', + 11660 => 'ꎀ', + 11661 => 'ꎁ', + 11662 => 'ꎂ', + 11663 => 'ꎃ', + 11664 => 'ꎄ', + 11665 => 'ꎅ', + 11666 => 'ꎆ', + 11667 => 'ꎇ', + 11668 => 'ꎈ', + 11669 => 'ꎉ', + 11670 => 'ꎊ', + 11671 => 'ꎋ', + 11672 => 'ꎌ', + 11673 => 'ꎍ', + 11674 => 'ꎎ', + 11675 => 'ꎏ', + 11676 => 'ꎐ', + 11677 => 'ꎑ', + 11678 => 'ꎒ', + 11679 => 'ꎓ', + 11680 => 'ꎔ', + 11681 => 'ꎕ', + 11682 => 'ꎖ', + 11683 => 'ꎗ', + 11684 => 'ꎘ', + 11685 => 'ꎙ', + 11686 => 'ꎚ', + 11687 => 'ꎛ', + 11688 => 'ꎜ', + 11689 => 'ꎝ', + 11690 => 'ꎞ', + 11691 => 'ꎟ', + 11692 => 'ꎠ', + 11693 => 'ꎡ', + 11694 => 'ꎢ', + 11695 => 'ꎣ', + 11696 => 'ꎤ', + 11697 => 'ꎥ', + 11698 => 'ꎦ', + 11699 => 'ꎧ', + 11700 => 'ꎨ', + 11701 => 'ꎩ', + 11702 => 'ꎪ', + 11703 => 'ꎫ', + 11704 => 'ꎬ', + 11705 => 'ꎭ', + 11706 => 'ꎮ', + 11707 => 'ꎯ', + 11708 => 'ꎰ', + 11709 => 'ꎱ', + 11710 => 'ꎲ', + 11711 => 'ꎳ', + 11712 => 'ꎴ', + 11713 => 'ꎵ', + 11714 => 'ꎶ', + 11715 => 'ꎷ', + 11716 => 'ꎸ', + 11717 => 'ꎹ', + 11718 => 'ꎺ', + 11719 => 'ꎻ', + 11720 => 'ꎼ', + 11721 => 'ꎽ', + 11722 => 'ꎾ', + 11723 => 'ꎿ', + 11724 => 'ꏀ', + 11725 => 'ꏁ', + 11726 => 'ꏂ', + 11727 => 'ꏃ', + 11728 => 'ꏄ', + 11729 => 'ꏅ', + 11730 => 'ꏆ', + 11731 => 'ꏇ', + 11732 => 'ꏈ', + 11733 => 'ꏉ', + 11734 => 'ꏊ', + 11735 => 'ꏋ', + 11736 => 'ꏌ', + 11737 => 'ꏍ', + 11738 => 'ꏎ', + 11739 => 'ꏏ', + 11740 => 'ꏐ', + 11741 => 'ꏑ', + 11742 => 'ꏒ', + 11743 => 'ꏓ', + 11744 => 'ꏔ', + 11745 => 'ꏕ', + 11746 => 'ꏖ', + 11747 => 'ꏗ', + 11748 => 'ꏘ', + 11749 => 'ꏙ', + 11750 => 'ꏚ', + 11751 => 'ꏛ', + 11752 => 'ꏜ', + 11753 => 'ꏝ', + 11754 => 'ꏞ', + 11755 => 'ꏟ', + 11756 => 'ꏠ', + 11757 => 'ꏡ', + 11758 => 'ꏢ', + 11759 => 'ꏣ', + 11760 => 'ꏤ', + 11761 => 'ꏥ', + 11762 => 'ꏦ', + 11763 => 'ꏧ', + 11764 => 'ꏨ', + 11765 => 'ꏩ', + 11766 => 'ꏪ', + 11767 => 'ꏫ', + 11768 => 'ꏬ', + 11769 => 'ꏭ', + 11770 => 'ꏮ', + 11771 => 'ꏯ', + 11772 => 'ꏰ', + 11773 => 'ꏱ', + 11774 => 'ꏲ', + 11775 => 'ꏳ', + 11776 => 'ꏴ', + 11777 => 'ꏵ', + 11778 => 'ꏶ', + 11779 => 'ꏷ', + 11780 => 'ꏸ', + 11781 => 'ꏹ', + 11782 => 'ꏺ', + 11783 => 'ꏻ', + 11784 => 'ꏼ', + 11785 => 'ꏽ', + 11786 => 'ꏾ', + 11787 => 'ꏿ', + 11788 => 'ꐀ', + 11789 => 'ꐁ', + 11790 => 'ꐂ', + 11791 => 'ꐃ', + 11792 => 'ꐄ', + 11793 => 'ꐅ', + 11794 => 'ꐆ', + 11795 => 'ꐇ', + 11796 => 'ꐈ', + 11797 => 'ꐉ', + 11798 => 'ꐊ', + 11799 => 'ꐋ', + 11800 => 'ꐌ', + 11801 => 'ꐍ', + 11802 => 'ꐎ', + 11803 => 'ꐏ', + 11804 => 'ꐐ', + 11805 => 'ꐑ', + 11806 => 'ꐒ', + 11807 => 'ꐓ', + 11808 => 'ꐔ', + 11809 => 'ꐕ', + 11810 => 'ꐖ', + 11811 => 'ꐗ', + 11812 => 'ꐘ', + 11813 => 'ꐙ', + 11814 => 'ꐚ', + 11815 => 'ꐛ', + 11816 => 'ꐜ', + 11817 => 'ꐝ', + 11818 => 'ꐞ', + 11819 => 'ꐟ', + 11820 => 'ꐠ', + 11821 => 'ꐡ', + 11822 => 'ꐢ', + 11823 => 'ꐣ', + 11824 => 'ꐤ', + 11825 => 'ꐥ', + 11826 => 'ꐦ', + 11827 => 'ꐧ', + 11828 => 'ꐨ', + 11829 => 'ꐩ', + 11830 => 'ꐪ', + 11831 => 'ꐫ', + 11832 => 'ꐬ', + 11833 => 'ꐭ', + 11834 => 'ꐮ', + 11835 => 'ꐯ', + 11836 => 'ꐰ', + 11837 => 'ꐱ', + 11838 => 'ꐲ', + 11839 => 'ꐳ', + 11840 => 'ꐴ', + 11841 => 'ꐵ', + 11842 => 'ꐶ', + 11843 => 'ꐷ', + 11844 => 'ꐸ', + 11845 => 'ꐹ', + 11846 => 'ꐺ', + 11847 => 'ꐻ', + 11848 => 'ꐼ', + 11849 => 'ꐽ', + 11850 => 'ꐾ', + 11851 => 'ꐿ', + 11852 => 'ꑀ', + 11853 => 'ꑁ', + 11854 => 'ꑂ', + 11855 => 'ꑃ', + 11856 => 'ꑄ', + 11857 => 'ꑅ', + 11858 => 'ꑆ', + 11859 => 'ꑇ', + 11860 => 'ꑈ', + 11861 => 'ꑉ', + 11862 => 'ꑊ', + 11863 => 'ꑋ', + 11864 => 'ꑌ', + 11865 => 'ꑍ', + 11866 => 'ꑎ', + 11867 => 'ꑏ', + 11868 => 'ꑐ', + 11869 => 'ꑑ', + 11870 => 'ꑒ', + 11871 => 'ꑓ', + 11872 => 'ꑔ', + 11873 => 'ꑕ', + 11874 => 'ꑖ', + 11875 => 'ꑗ', + 11876 => 'ꑘ', + 11877 => 'ꑙ', + 11878 => 'ꑚ', + 11879 => 'ꑛ', + 11880 => 'ꑜ', + 11881 => 'ꑝ', + 11882 => 'ꑞ', + 11883 => 'ꑟ', + 11884 => 'ꑠ', + 11885 => 'ꑡ', + 11886 => 'ꑢ', + 11887 => 'ꑣ', + 11888 => 'ꑤ', + 11889 => 'ꑥ', + 11890 => 'ꑦ', + 11891 => 'ꑧ', + 11892 => 'ꑨ', + 11893 => 'ꑩ', + 11894 => 'ꑪ', + 11895 => 'ꑫ', + 11896 => 'ꑬ', + 11897 => 'ꑭ', + 11898 => 'ꑮ', + 11899 => 'ꑯ', + 11900 => 'ꑰ', + 11901 => 'ꑱ', + 11902 => 'ꑲ', + 11903 => 'ꑳ', + 11904 => 'ꑴ', + 11905 => 'ꑵ', + 11906 => 'ꑶ', + 11907 => 'ꑷ', + 11908 => 'ꑸ', + 11909 => 'ꑹ', + 11910 => 'ꑺ', + 11911 => 'ꑻ', + 11912 => 'ꑼ', + 11913 => 'ꑽ', + 11914 => 'ꑾ', + 11915 => 'ꑿ', + 11916 => 'ꒀ', + 11917 => 'ꒁ', + 11918 => 'ꒂ', + 11919 => 'ꒃ', + 11920 => 'ꒄ', + 11921 => 'ꒅ', + 11922 => 'ꒆ', + 11923 => 'ꒇ', + 11924 => 'ꒈ', + 11925 => 'ꒉ', + 11926 => 'ꒊ', + 11927 => 'ꒋ', + 11928 => 'ꒌ', + 11929 => 'ꓸ', + 11930 => 'ꓹ', + 11931 => 'ꓺ', + 11932 => 'ꓻ', + 11933 => 'ꓽ', + 11934 => 'ꓼ', + 11935 => 'ꓐ', + 11936 => 'ꓑ', + 11937 => 'ꓒ', + 11938 => 'ꓓ', + 11939 => 'ꓔ', + 11940 => 'ꓕ', + 11941 => 'ꓖ', + 11942 => 'ꓗ', + 11943 => 'ꓘ', + 11944 => 'ꓙ', + 11945 => 'ꓚ', + 11946 => 'ꓛ', + 11947 => 'ꓜ', + 11948 => 'ꓝ', + 11949 => 'ꓞ', + 11950 => 'ꓟ', + 11951 => 'ꓠ', + 11952 => 'ꓡ', + 11953 => 'ꓢ', + 11954 => 'ꓣ', + 11955 => 'ꓤ', + 11956 => 'ꓥ', + 11957 => 'ꓦ', + 11958 => 'ꓧ', + 11959 => 'ꓨ', + 11960 => 'ꓩ', + 11961 => 'ꓫ', + 11962 => 'ꓭ', + 11963 => 'ꓪ', + 11964 => 'ꓬ', + 11965 => 'ꓮ', + 11966 => 'ꓯ', + 11967 => 'ꓰ', + 11968 => 'ꓱ', + 11969 => 'ꓲ', + 11970 => 'ꓳ', + 11971 => 'ꓴ', + 11972 => 'ꓵ', + 11973 => 'ꓶ', + 11974 => 'ꓷ', + 11975 => '𐊀', + 11976 => '𐊁', + 11977 => '𐊂', + 11978 => '𐊃', + 11979 => '𐊄', + 11980 => '𐊅', + 11981 => '𐊆', + 11982 => '𐊇', + 11983 => '𐊈', + 11984 => '𐊉', + 11985 => '𐊊', + 11986 => '𐊋', + 11987 => '𐊌', + 11988 => '𐊍', + 11989 => '𐊎', + 11990 => '𐊏', + 11991 => '𐊐', + 11992 => '𐊑', + 11993 => '𐊒', + 11994 => '𐊓', + 11995 => '𐊔', + 11996 => '𐊕', + 11997 => '𐊖', + 11998 => '𐊗', + 11999 => '𐊘', + 12000 => '𐊙', + 12001 => '𐊚', + 12002 => '𐊛', + 12003 => '𐊜', + 12004 => '𐊠', + 12005 => '𐊡', + 12006 => '𐊢', + 12007 => '𐊣', + 12008 => '𐊤', + 12009 => '𐊥', + 12010 => '𐊦', + 12011 => '𐊧', + 12012 => '𐊨', + 12013 => '𐊩', + 12014 => '𐊪', + 12015 => '𐊫', + 12016 => '𐊬', + 12017 => '𐊭', + 12018 => '𐊮', + 12019 => '𐊯', + 12020 => '𐊰', + 12021 => '𐊱', + 12022 => '𐊲', + 12023 => '𐊳', + 12024 => '𐊴', + 12025 => '𐊵', + 12026 => '𐊶', + 12027 => '𐊷', + 12028 => '𐊸', + 12029 => '𐊹', + 12030 => '𐊺', + 12031 => '𐊻', + 12032 => '𐊼', + 12033 => '𐊽', + 12034 => '𐊾', + 12035 => '𐊿', + 12036 => '𐋀', + 12037 => '𐋁', + 12038 => '𐋂', + 12039 => '𐋃', + 12040 => '𐋄', + 12041 => '𐋅', + 12042 => '𐋆', + 12043 => '𐋇', + 12044 => '𐋈', + 12045 => '𐋉', + 12046 => '𐋊', + 12047 => '𐋋', + 12048 => '𐋌', + 12049 => '𐋍', + 12050 => '𐋎', + 12051 => '𐋏', + 12052 => '𐋐', + 12053 => '𐤠', + 12054 => '𐤡', + 12055 => '𐤢', + 12056 => '𐤣', + 12057 => '𐤤', + 12058 => '𐤥', + 12059 => '𐤦', + 12060 => '𐤧', + 12061 => '𐤨', + 12062 => '𐤩', + 12063 => '𐤪', + 12064 => '𐤫', + 12065 => '𐤬', + 12066 => '𐤭', + 12067 => '𐤮', + 12068 => '𐤯', + 12069 => '𐤰', + 12070 => '𐤱', + 12071 => '𐤲', + 12072 => '𐤳', + 12073 => '𐤴', + 12074 => '𐤵', + 12075 => '𐤶', + 12076 => '𐤷', + 12077 => '𐤸', + 12078 => '𐤹', + 12079 => '𐌀', + 12080 => '𐌁', + 12081 => '𐌂', + 12082 => '𐌃', + 12083 => '𐌄', + 12084 => '𐌅', + 12085 => '𐌆', + 12086 => '𐌇', + 12087 => '𐌈', + 12088 => '𐌉', + 12089 => '𐌊', + 12090 => '𐌋', + 12091 => '𐌌', + 12092 => '𐌍', + 12093 => '𐌎', + 12094 => '𐌏', + 12095 => '𐌐', + 12096 => '𐌑', + 12097 => '𐌒', + 12098 => '𐌓', + 12099 => '𐌔', + 12100 => '𐌕', + 12101 => '𐌖', + 12102 => '𐌗', + 12103 => '𐌘', + 12104 => '𐌙', + 12105 => '𐌚', + 12106 => '𐌛', + 12107 => '𐌜', + 12108 => '𐌝', + 12109 => '𐌞', + 12110 => '𐌰', + 12111 => '𐌱', + 12112 => '𐌲', + 12113 => '𐌳', + 12114 => '𐌴', + 12115 => '𐌵', + 12116 => '𐌶', + 12117 => '𐌷', + 12118 => '𐌸', + 12119 => '𐌹', + 12120 => '𐌺', + 12121 => '𐌻', + 12122 => '𐌼', + 12123 => '𐌽', + 12124 => '𐌾', + 12125 => '𐌿', + 12126 => '𐍀', + 12127 => '𐍁', + 12128 => '𐍂', + 12129 => '𐍃', + 12130 => '𐍄', + 12131 => '𐍅', + 12132 => '𐍆', + 12133 => '𐍇', + 12134 => '𐍈', + 12135 => '𐍉', + 12136 => '𐍊', + 12137 => '𐐀', + 12138 => '𐐁', + 12139 => '𐐂', + 12140 => '𐐃', + 12141 => '𐐄', + 12142 => '𐐅', + 12143 => '𐐆', + 12144 => '𐐇', + 12145 => '𐐈', + 12146 => '𐐉', + 12147 => '𐐊', + 12148 => '𐐋', + 12149 => '𐐌', + 12150 => '𐐍', + 12151 => '𐐎', + 12152 => '𐐏', + 12153 => '𐐐', + 12154 => '𐐑', + 12155 => '𐐒', + 12156 => '𐐓', + 12157 => '𐐔', + 12158 => '𐐕', + 12159 => '𐐖', + 12160 => '𐐗', + 12161 => '𐐘', + 12162 => '𐐙', + 12163 => '𐐚', + 12164 => '𐐛', + 12165 => '𐐜', + 12166 => '𐐝', + 12167 => '𐐞', + 12168 => '𐐟', + 12169 => '𐐠', + 12170 => '𐐡', + 12171 => '𐐢', + 12172 => '𐐣', + 12173 => '𐐤', + 12174 => '𐐥', + 12175 => '𐐦', + 12176 => '𐐧', + 12177 => '𐑐', + 12178 => '𐑑', + 12179 => '𐑒', + 12180 => '𐑓', + 12181 => '𐑔', + 12182 => '𐑕', + 12183 => '𐑖', + 12184 => '𐑗', + 12185 => '𐑘', + 12186 => '𐑙', + 12187 => '𐑚', + 12188 => '𐑛', + 12189 => '𐑜', + 12190 => '𐑝', + 12191 => '𐑞', + 12192 => '𐑟', + 12193 => '𐑠', + 12194 => '𐑡', + 12195 => '𐑢', + 12196 => '𐑣', + 12197 => '𐑤', + 12198 => '𐑥', + 12199 => '𐑦', + 12200 => '𐑧', + 12201 => '𐑨', + 12202 => '𐑩', + 12203 => '𐑪', + 12204 => '𐑫', + 12205 => '𐑬', + 12206 => '𐑭', + 12207 => '𐑮', + 12208 => '𐑯', + 12209 => '𐑰', + 12210 => '𐑱', + 12211 => '𐑲', + 12212 => '𐑳', + 12213 => '𐑴', + 12214 => '𐑵', + 12215 => '𐑶', + 12216 => '𐑷', + 12217 => '𐑸', + 12218 => '𐑹', + 12219 => '𐑺', + 12220 => '𐑻', + 12221 => '𐑼', + 12222 => '𐑽', + 12223 => '𐑾', + 12224 => '𐑿', + 12225 => '𐒀', + 12226 => '𐒁', + 12227 => '𐒂', + 12228 => '𐒃', + 12229 => '𐒄', + 12230 => '𐒅', + 12231 => '𐒆', + 12232 => '𐒇', + 12233 => '𐒈', + 12234 => '𐒉', + 12235 => '𐒊', + 12236 => '𐒋', + 12237 => '𐒌', + 12238 => '𐒍', + 12239 => '𐒎', + 12240 => '𐒏', + 12241 => '𐒐', + 12242 => '𐒑', + 12243 => '𐒒', + 12244 => '𐒓', + 12245 => '𐒔', + 12246 => '𐒕', + 12247 => '𐒖', + 12248 => '𐒗', + 12249 => '𐒘', + 12250 => '𐒙', + 12251 => '𐒚', + 12252 => '𐒛', + 12253 => '𐒜', + 12254 => '𐒝', + 12255 => '𐀀', + 12256 => '𐀁', + 12257 => '𐀂', + 12258 => '𐀃', + 12259 => '𐀄', + 12260 => '𐀅', + 12261 => '𐀆', + 12262 => '𐀇', + 12263 => '𐀈', + 12264 => '𐀉', + 12265 => '𐀊', + 12266 => '𐀋', + 12267 => '𐀍', + 12268 => '𐀎', + 12269 => '𐀏', + 12270 => '𐀐', + 12271 => '𐀑', + 12272 => '𐀒', + 12273 => '𐀓', + 12274 => '𐀔', + 12275 => '𐀕', + 12276 => '𐀖', + 12277 => '𐀗', + 12278 => '𐀘', + 12279 => '𐀙', + 12280 => '𐀚', + 12281 => '𐀛', + 12282 => '𐀜', + 12283 => '𐀝', + 12284 => '𐀞', + 12285 => '𐀟', + 12286 => '𐀠', + 12287 => '𐀡', + 12288 => '𐀢', + 12289 => '𐀣', + 12290 => '𐀤', + 12291 => '𐀥', + 12292 => '𐀦', + 12293 => '𐀨', + 12294 => '𐀩', + 12295 => '𐀪', + 12296 => '𐀫', + 12297 => '𐀬', + 12298 => '𐀭', + 12299 => '𐀮', + 12300 => '𐀯', + 12301 => '𐀰', + 12302 => '𐀱', + 12303 => '𐀲', + 12304 => '𐀳', + 12305 => '𐀴', + 12306 => '𐀵', + 12307 => '𐀶', + 12308 => '𐀷', + 12309 => '𐀸', + 12310 => '𐀹', + 12311 => '𐀺', + 12312 => '𐀼', + 12313 => '𐀽', + 12314 => '𐀿', + 12315 => '𐁀', + 12316 => '𐁁', + 12317 => '𐁂', + 12318 => '𐁃', + 12319 => '𐁄', + 12320 => '𐁅', + 12321 => '𐁆', + 12322 => '𐁇', + 12323 => '𐁈', + 12324 => '𐁉', + 12325 => '𐁊', + 12326 => '𐁋', + 12327 => '𐁌', + 12328 => '𐁍', + 12329 => '𐁐', + 12330 => '𐁑', + 12331 => '𐁒', + 12332 => '𐁓', + 12333 => '𐁔', + 12334 => '𐁕', + 12335 => '𐁖', + 12336 => '𐁗', + 12337 => '𐁘', + 12338 => '𐁙', + 12339 => '𐁚', + 12340 => '𐁛', + 12341 => '𐁜', + 12342 => '𐁝', + 12343 => '𐂀', + 12344 => '𐂁', + 12345 => '𐂂', + 12346 => '𐂃', + 12347 => '𐂄', + 12348 => '𐂅', + 12349 => '𐂆', + 12350 => '𐂇', + 12351 => '𐂈', + 12352 => '𐂉', + 12353 => '𐂊', + 12354 => '𐂋', + 12355 => '𐂌', + 12356 => '𐂍', + 12357 => '𐂎', + 12358 => '𐂏', + 12359 => '𐂐', + 12360 => '𐂑', + 12361 => '𐂒', + 12362 => '𐂓', + 12363 => '𐂔', + 12364 => '𐂕', + 12365 => '𐂖', + 12366 => '𐂗', + 12367 => '𐂘', + 12368 => '𐂙', + 12369 => '𐂚', + 12370 => '𐂛', + 12371 => '𐂜', + 12372 => '𐂝', + 12373 => '𐂞', + 12374 => '𐂟', + 12375 => '𐂠', + 12376 => '𐂡', + 12377 => '𐂢', + 12378 => '𐂣', + 12379 => '𐂤', + 12380 => '𐂥', + 12381 => '𐂦', + 12382 => '𐂧', + 12383 => '𐂨', + 12384 => '𐂩', + 12385 => '𐂪', + 12386 => '𐂫', + 12387 => '𐂬', + 12388 => '𐂭', + 12389 => '𐂮', + 12390 => '𐂯', + 12391 => '𐂰', + 12392 => '𐂱', + 12393 => '𐂲', + 12394 => '𐂳', + 12395 => '𐂴', + 12396 => '𐂵', + 12397 => '𐂶', + 12398 => '𐂷', + 12399 => '𐂸', + 12400 => '𐂹', + 12401 => '𐂺', + 12402 => '𐂻', + 12403 => '𐂼', + 12404 => '𐂽', + 12405 => '𐂾', + 12406 => '𐂿', + 12407 => '𐃀', + 12408 => '𐃁', + 12409 => '𐃂', + 12410 => '𐃃', + 12411 => '𐃄', + 12412 => '𐃅', + 12413 => '𐃆', + 12414 => '𐃇', + 12415 => '𐃈', + 12416 => '𐃉', + 12417 => '𐃊', + 12418 => '𐃋', + 12419 => '𐃌', + 12420 => '𐃍', + 12421 => '𐃎', + 12422 => '𐃏', + 12423 => '𐃐', + 12424 => '𐃑', + 12425 => '𐃒', + 12426 => '𐃓', + 12427 => '𐃔', + 12428 => '𐃕', + 12429 => '𐃖', + 12430 => '𐃗', + 12431 => '𐃘', + 12432 => '𐃙', + 12433 => '𐃚', + 12434 => '𐃛', + 12435 => '𐃜', + 12436 => '𐃝', + 12437 => '𐃞', + 12438 => '𐃟', + 12439 => '𐃠', + 12440 => '𐃡', + 12441 => '𐃢', + 12442 => '𐃣', + 12443 => '𐃤', + 12444 => '𐃥', + 12445 => '𐃦', + 12446 => '𐃧', + 12447 => '𐃨', + 12448 => '𐃩', + 12449 => '𐃪', + 12450 => '𐃫', + 12451 => '𐃬', + 12452 => '𐃭', + 12453 => '𐃮', + 12454 => '𐃯', + 12455 => '𐃰', + 12456 => '𐃱', + 12457 => '𐃲', + 12458 => '𐃳', + 12459 => '𐃴', + 12460 => '𐃵', + 12461 => '𐃶', + 12462 => '𐃷', + 12463 => '𐃸', + 12464 => '𐃹', + 12465 => '𐃺', + 12466 => '𐠀', + 12467 => '𐠁', + 12468 => '𐠂', + 12469 => '𐠃', + 12470 => '𐠄', + 12471 => '𐠅', + 12472 => '𐠈', + 12473 => '𐠊', + 12474 => '𐠋', + 12475 => '𐠌', + 12476 => '𐠍', + 12477 => '𐠎', + 12478 => '𐠏', + 12479 => '𐠐', + 12480 => '𐠑', + 12481 => '𐠒', + 12482 => '𐠓', + 12483 => '𐠔', + 12484 => '𐠕', + 12485 => '𐠖', + 12486 => '𐠗', + 12487 => '𐠘', + 12488 => '𐠙', + 12489 => '𐠚', + 12490 => '𐠛', + 12491 => '𐠜', + 12492 => '𐠝', + 12493 => '𐠞', + 12494 => '𐠟', + 12495 => '𐠠', + 12496 => '𐠡', + 12497 => '𐠢', + 12498 => '𐠣', + 12499 => '𐠤', + 12500 => '𐠥', + 12501 => '𐠦', + 12502 => '𐠧', + 12503 => '𐠨', + 12504 => '𐠩', + 12505 => '𐠪', + 12506 => '𐠫', + 12507 => '𐠬', + 12508 => '𐠭', + 12509 => '𐠮', + 12510 => '𐠯', + 12511 => '𐠰', + 12512 => '𐠱', + 12513 => '𐠲', + 12514 => '𐠳', + 12515 => '𐠴', + 12516 => '𐠵', + 12517 => '𐠷', + 12518 => '𐠸', + 12519 => '𐠼', + 12520 => '𐠿', + 12521 => '𐩠', + 12522 => '𐩡', + 12523 => '𐩢', + 12524 => '𐩣', + 12525 => '𐩤', + 12526 => '𐩥', + 12527 => '𐩦', + 12528 => '𐩧', + 12529 => '𐩨', + 12530 => '𐩩', + 12531 => '𐩪', + 12532 => '𐩫', + 12533 => '𐩬', + 12534 => '𐩭', + 12535 => '𐩮', + 12536 => '𐩯', + 12537 => '𐩰', + 12538 => '𐩱', + 12539 => '𐩲', + 12540 => '𐩳', + 12541 => '𐩴', + 12542 => '𐩵', + 12543 => '𐩶', + 12544 => '𐩷', + 12545 => '𐩸', + 12546 => '𐩹', + 12547 => '𐩺', + 12548 => '𐩻', + 12549 => '𐩼', + 12550 => '𐬀', + 12551 => '𐬁', + 12552 => '𐬂', + 12553 => '𐬃', + 12554 => '𐬄', + 12555 => '𐬅', + 12556 => '𐬆', + 12557 => '𐬇', + 12558 => '𐬈', + 12559 => '𐬉', + 12560 => '𐬊', + 12561 => '𐬋', + 12562 => '𐬌', + 12563 => '𐬍', + 12564 => '𐬎', + 12565 => '𐬏', + 12566 => '𐬐', + 12567 => '𐬑', + 12568 => '𐬒', + 12569 => '𐬓', + 12570 => '𐬔', + 12571 => '𐬕', + 12572 => '𐬖', + 12573 => '𐬗', + 12574 => '𐬘', + 12575 => '𐬙', + 12576 => '𐬚', + 12577 => '𐬛', + 12578 => '𐬜', + 12579 => '𐬝', + 12580 => '𐬞', + 12581 => '𐬟', + 12582 => '𐬠', + 12583 => '𐬡', + 12584 => '𐬢', + 12585 => '𐬣', + 12586 => '𐬤', + 12587 => '𐬥', + 12588 => '𐬦', + 12589 => '𐬧', + 12590 => '𐬨', + 12591 => '𐬩', + 12592 => '𐬪', + 12593 => '𐬫', + 12594 => '𐬬', + 12595 => '𐬭', + 12596 => '𐬯', + 12597 => '𐬰', + 12598 => '𐬱', + 12599 => '𐬲', + 12600 => '𐬳', + 12601 => '𐬴', + 12602 => '𐬵', + 12603 => '𐡀', + 12604 => '𐡁', + 12605 => '𐡂', + 12606 => '𐡃', + 12607 => '𐡄', + 12608 => '𐡅', + 12609 => '𐡆', + 12610 => '𐡇', + 12611 => '𐡈', + 12612 => '𐡉', + 12613 => '𐡊', + 12614 => '𐡋', + 12615 => '𐡌', + 12616 => '𐡍', + 12617 => '𐡎', + 12618 => '𐡏', + 12619 => '𐡐', + 12620 => '𐡑', + 12621 => '𐡒', + 12622 => '𐡓', + 12623 => '𐡔', + 12624 => '𐡕', + 12625 => '𐭀', + 12626 => '𐭁', + 12627 => '𐭂', + 12628 => '𐭃', + 12629 => '𐭄', + 12630 => '𐭅', + 12631 => '𐭆', + 12632 => '𐭇', + 12633 => '𐭈', + 12634 => '𐭉', + 12635 => '𐭊', + 12636 => '𐭋', + 12637 => '𐭌', + 12638 => '𐭍', + 12639 => '𐭎', + 12640 => '𐭏', + 12641 => '𐭐', + 12642 => '𐭑', + 12643 => '𐭒', + 12644 => '𐭓', + 12645 => '𐭔', + 12646 => '𐭕', + 12647 => '𐭠', + 12648 => '𐭡', + 12649 => '𐭢', + 12650 => '𐭣', + 12651 => '𐭤', + 12652 => '𐭥', + 12653 => '𐭦', + 12654 => '𐭧', + 12655 => '𐭨', + 12656 => '𐭩', + 12657 => '𐭪', + 12658 => '𐭫', + 12659 => '𐭬', + 12660 => '𐭭', + 12661 => '𐭮', + 12662 => '𐭯', + 12663 => '𐭰', + 12664 => '𐭱', + 12665 => '𐭲', + 12666 => '𐎀', + 12667 => '𐎁', + 12668 => '𐎂', + 12669 => '𐎃', + 12670 => '𐎄', + 12671 => '𐎅', + 12672 => '𐎆', + 12673 => '𐎇', + 12674 => '𐎈', + 12675 => '𐎉', + 12676 => '𐎊', + 12677 => '𐎋', + 12678 => '𐎌', + 12679 => '𐎍', + 12680 => '𐎎', + 12681 => '𐎏', + 12682 => '𐎐', + 12683 => '𐎑', + 12684 => '𐎒', + 12685 => '𐎓', + 12686 => '𐎔', + 12687 => '𐎕', + 12688 => '𐎖', + 12689 => '𐎗', + 12690 => '𐎘', + 12691 => '𐎙', + 12692 => '𐎚', + 12693 => '𐎛', + 12694 => '𐎜', + 12695 => '𐎝', + 12696 => '𐎠', + 12697 => '𐎡', + 12698 => '𐎢', + 12699 => '𐎣', + 12700 => '𐎤', + 12701 => '𐎥', + 12702 => '𐎦', + 12703 => '𐎧', + 12704 => '𐎨', + 12705 => '𐎩', + 12706 => '𐎪', + 12707 => '𐎫', + 12708 => '𐎬', + 12709 => '𐎭', + 12710 => '𐎮', + 12711 => '𐎯', + 12712 => '𐎰', + 12713 => '𐎱', + 12714 => '𐎲', + 12715 => '𐎳', + 12716 => '𐎴', + 12717 => '𐎵', + 12718 => '𐎶', + 12719 => '𐎷', + 12720 => '𐎸', + 12721 => '𐎹', + 12722 => '𐎺', + 12723 => '𐎻', + 12724 => '𐎼', + 12725 => '𐎽', + 12726 => '𐎾', + 12727 => '𐎿', + 12728 => '𐏀', + 12729 => '𐏁', + 12730 => '𐏂', + 12731 => '𐏃', + 12732 => '𐏈', + 12733 => '𐏉', + 12734 => '𐏊', + 12735 => '𐏋', + 12736 => '𐏌', + 12737 => '𐏍', + 12738 => '𐏎', + 12739 => '𐏏', + 12740 => '𒀀', + 12741 => '𒀁', + 12742 => '𒀂', + 12743 => '𒀃', + 12744 => '𒀄', + 12745 => '𒀅', + 12746 => '𒀆', + 12747 => '𒀇', + 12748 => '𒀈', + 12749 => '𒀉', + 12750 => '𒀊', + 12751 => '𒀋', + 12752 => '𒀌', + 12753 => '𒀍', + 12754 => '𒀎', + 12755 => '𒀏', + 12756 => '𒀐', + 12757 => '𒀑', + 12758 => '𒀒', + 12759 => '𒀓', + 12760 => '𒀔', + 12761 => '𒀕', + 12762 => '𒀖', + 12763 => '𒀗', + 12764 => '𒀘', + 12765 => '𒀙', + 12766 => '𒀚', + 12767 => '𒀛', + 12768 => '𒀜', + 12769 => '𒀝', + 12770 => '𒀞', + 12771 => '𒀟', + 12772 => '𒀠', + 12773 => '𒀡', + 12774 => '𒀢', + 12775 => '𒀣', + 12776 => '𒀤', + 12777 => '𒀥', + 12778 => '𒀦', + 12779 => '𒀧', + 12780 => '𒀨', + 12781 => '𒀩', + 12782 => '𒀪', + 12783 => '𒀫', + 12784 => '𒀬', + 12785 => '𒀭', + 12786 => '𒀮', + 12787 => '𒀯', + 12788 => '𒀰', + 12789 => '𒀱', + 12790 => '𒀲', + 12791 => '𒀳', + 12792 => '𒀴', + 12793 => '𒀵', + 12794 => '𒀶', + 12795 => '𒀷', + 12796 => '𒀸', + 12797 => '𒀹', + 12798 => '𒀺', + 12799 => '𒀻', + 12800 => '𒀼', + 12801 => '𒀽', + 12802 => '𒀾', + 12803 => '𒀿', + 12804 => '𒁀', + 12805 => '𒁁', + 12806 => '𒁂', + 12807 => '𒁃', + 12808 => '𒁄', + 12809 => '𒁅', + 12810 => '𒁆', + 12811 => '𒁇', + 12812 => '𒁈', + 12813 => '𒁉', + 12814 => '𒁊', + 12815 => '𒁋', + 12816 => '𒁌', + 12817 => '𒁍', + 12818 => '𒁎', + 12819 => '𒁏', + 12820 => '𒁐', + 12821 => '𒁑', + 12822 => '𒁒', + 12823 => '𒁓', + 12824 => '𒁔', + 12825 => '𒁕', + 12826 => '𒁖', + 12827 => '𒁗', + 12828 => '𒁘', + 12829 => '𒁙', + 12830 => '𒁚', + 12831 => '𒁛', + 12832 => '𒁜', + 12833 => '𒁝', + 12834 => '𒁞', + 12835 => '𒁟', + 12836 => '𒁠', + 12837 => '𒁡', + 12838 => '𒁢', + 12839 => '𒁣', + 12840 => '𒁤', + 12841 => '𒁥', + 12842 => '𒁦', + 12843 => '𒁧', + 12844 => '𒁨', + 12845 => '𒁩', + 12846 => '𒁪', + 12847 => '𒁫', + 12848 => '𒁬', + 12849 => '𒁭', + 12850 => '𒁮', + 12851 => '𒁯', + 12852 => '𒁰', + 12853 => '𒁱', + 12854 => '𒁲', + 12855 => '𒁳', + 12856 => '𒁴', + 12857 => '𒁵', + 12858 => '𒁶', + 12859 => '𒁷', + 12860 => '𒁸', + 12861 => '𒁹', + 12862 => '𒁺', + 12863 => '𒁻', + 12864 => '𒁼', + 12865 => '𒁽', + 12866 => '𒁾', + 12867 => '𒁿', + 12868 => '𒂀', + 12869 => '𒂁', + 12870 => '𒂂', + 12871 => '𒂃', + 12872 => '𒂄', + 12873 => '𒂅', + 12874 => '𒂆', + 12875 => '𒂇', + 12876 => '𒂈', + 12877 => '𒂉', + 12878 => '𒂊', + 12879 => '𒂋', + 12880 => '𒂌', + 12881 => '𒂍', + 12882 => '𒂎', + 12883 => '𒂏', + 12884 => '𒂐', + 12885 => '𒂑', + 12886 => '𒂒', + 12887 => '𒂓', + 12888 => '𒂔', + 12889 => '𒂕', + 12890 => '𒂖', + 12891 => '𒂗', + 12892 => '𒂘', + 12893 => '𒂙', + 12894 => '𒂚', + 12895 => '𒂛', + 12896 => '𒂜', + 12897 => '𒂝', + 12898 => '𒂞', + 12899 => '𒂟', + 12900 => '𒂠', + 12901 => '𒂡', + 12902 => '𒂢', + 12903 => '𒂣', + 12904 => '𒂤', + 12905 => '𒂥', + 12906 => '𒂦', + 12907 => '𒂧', + 12908 => '𒂨', + 12909 => '𒂩', + 12910 => '𒂪', + 12911 => '𒂫', + 12912 => '𒂬', + 12913 => '𒂭', + 12914 => '𒂮', + 12915 => '𒂯', + 12916 => '𒂰', + 12917 => '𒂱', + 12918 => '𒂲', + 12919 => '𒂳', + 12920 => '𒂴', + 12921 => '𒂵', + 12922 => '𒂶', + 12923 => '𒂷', + 12924 => '𒂸', + 12925 => '𒂹', + 12926 => '𒂺', + 12927 => '𒂻', + 12928 => '𒂼', + 12929 => '𒂽', + 12930 => '𒂾', + 12931 => '𒂿', + 12932 => '𒃀', + 12933 => '𒃁', + 12934 => '𒃂', + 12935 => '𒃃', + 12936 => '𒃄', + 12937 => '𒃅', + 12938 => '𒃆', + 12939 => '𒃇', + 12940 => '𒃈', + 12941 => '𒃉', + 12942 => '𒃊', + 12943 => '𒃋', + 12944 => '𒃌', + 12945 => '𒃍', + 12946 => '𒃎', + 12947 => '𒃏', + 12948 => '𒃐', + 12949 => '𒃑', + 12950 => '𒃒', + 12951 => '𒃓', + 12952 => '𒃔', + 12953 => '𒃕', + 12954 => '𒃖', + 12955 => '𒃗', + 12956 => '𒃘', + 12957 => '𒃙', + 12958 => '𒃚', + 12959 => '𒃛', + 12960 => '𒃜', + 12961 => '𒃝', + 12962 => '𒃞', + 12963 => '𒃟', + 12964 => '𒃠', + 12965 => '𒃡', + 12966 => '𒃢', + 12967 => '𒃣', + 12968 => '𒃤', + 12969 => '𒃥', + 12970 => '𒃦', + 12971 => '𒃧', + 12972 => '𒃨', + 12973 => '𒃩', + 12974 => '𒃪', + 12975 => '𒃫', + 12976 => '𒃬', + 12977 => '𒃭', + 12978 => '𒃮', + 12979 => '𒃯', + 12980 => '𒃰', + 12981 => '𒃱', + 12982 => '𒃲', + 12983 => '𒃳', + 12984 => '𒃴', + 12985 => '𒃵', + 12986 => '𒃶', + 12987 => '𒃷', + 12988 => '𒃸', + 12989 => '𒃹', + 12990 => '𒃺', + 12991 => '𒃻', + 12992 => '𒃼', + 12993 => '𒃽', + 12994 => '𒃾', + 12995 => '𒃿', + 12996 => '𒄀', + 12997 => '𒄁', + 12998 => '𒄂', + 12999 => '𒄃', + 13000 => '𒄄', + 13001 => '𒄅', + 13002 => '𒄆', + 13003 => '𒄇', + 13004 => '𒄈', + 13005 => '𒄉', + 13006 => '𒄊', + 13007 => '𒄋', + 13008 => '𒄌', + 13009 => '𒄍', + 13010 => '𒄎', + 13011 => '𒄏', + 13012 => '𒄐', + 13013 => '𒄑', + 13014 => '𒄒', + 13015 => '𒄓', + 13016 => '𒄔', + 13017 => '𒄕', + 13018 => '𒄖', + 13019 => '𒄗', + 13020 => '𒄘', + 13021 => '𒄙', + 13022 => '𒄚', + 13023 => '𒄛', + 13024 => '𒄜', + 13025 => '𒄝', + 13026 => '𒄞', + 13027 => '𒄟', + 13028 => '𒄠', + 13029 => '𒄡', + 13030 => '𒄢', + 13031 => '𒄣', + 13032 => '𒄤', + 13033 => '𒄥', + 13034 => '𒄦', + 13035 => '𒄧', + 13036 => '𒄨', + 13037 => '𒄩', + 13038 => '𒄪', + 13039 => '𒄫', + 13040 => '𒄬', + 13041 => '𒄭', + 13042 => '𒄮', + 13043 => '𒄯', + 13044 => '𒄰', + 13045 => '𒄱', + 13046 => '𒄲', + 13047 => '𒄳', + 13048 => '𒄴', + 13049 => '𒄵', + 13050 => '𒄶', + 13051 => '𒄷', + 13052 => '𒄸', + 13053 => '𒄹', + 13054 => '𒄺', + 13055 => '𒄻', + 13056 => '𒄼', + 13057 => '𒄽', + 13058 => '𒄾', + 13059 => '𒄿', + 13060 => '𒅀', + 13061 => '𒅁', + 13062 => '𒅂', + 13063 => '𒅃', + 13064 => '𒅄', + 13065 => '𒅅', + 13066 => '𒅆', + 13067 => '𒅇', + 13068 => '𒅈', + 13069 => '𒅉', + 13070 => '𒅊', + 13071 => '𒅋', + 13072 => '𒅌', + 13073 => '𒅍', + 13074 => '𒅎', + 13075 => '𒅏', + 13076 => '𒅐', + 13077 => '𒅑', + 13078 => '𒅒', + 13079 => '𒅓', + 13080 => '𒅔', + 13081 => '𒅕', + 13082 => '𒅖', + 13083 => '𒅗', + 13084 => '𒅘', + 13085 => '𒅙', + 13086 => '𒅚', + 13087 => '𒅛', + 13088 => '𒅜', + 13089 => '𒅝', + 13090 => '𒅞', + 13091 => '𒅟', + 13092 => '𒅠', + 13093 => '𒅡', + 13094 => '𒅢', + 13095 => '𒅣', + 13096 => '𒅤', + 13097 => '𒅥', + 13098 => '𒅦', + 13099 => '𒅧', + 13100 => '𒅨', + 13101 => '𒅩', + 13102 => '𒅪', + 13103 => '𒅫', + 13104 => '𒅬', + 13105 => '𒅭', + 13106 => '𒅮', + 13107 => '𒅯', + 13108 => '𒅰', + 13109 => '𒅱', + 13110 => '𒅲', + 13111 => '𒅳', + 13112 => '𒅴', + 13113 => '𒅵', + 13114 => '𒅶', + 13115 => '𒅷', + 13116 => '𒅸', + 13117 => '𒅹', + 13118 => '𒅺', + 13119 => '𒅻', + 13120 => '𒅼', + 13121 => '𒅽', + 13122 => '𒅾', + 13123 => '𒅿', + 13124 => '𒆀', + 13125 => '𒆁', + 13126 => '𒆂', + 13127 => '𒆃', + 13128 => '𒆄', + 13129 => '𒆅', + 13130 => '𒆆', + 13131 => '𒆇', + 13132 => '𒆈', + 13133 => '𒆉', + 13134 => '𒆊', + 13135 => '𒆋', + 13136 => '𒆌', + 13137 => '𒆍', + 13138 => '𒆎', + 13139 => '𒆏', + 13140 => '𒆐', + 13141 => '𒆑', + 13142 => '𒆒', + 13143 => '𒆓', + 13144 => '𒆔', + 13145 => '𒆕', + 13146 => '𒆖', + 13147 => '𒆗', + 13148 => '𒆘', + 13149 => '𒆙', + 13150 => '𒆚', + 13151 => '𒆛', + 13152 => '𒆜', + 13153 => '𒆝', + 13154 => '𒆞', + 13155 => '𒆟', + 13156 => '𒆠', + 13157 => '𒆡', + 13158 => '𒆢', + 13159 => '𒆣', + 13160 => '𒆤', + 13161 => '𒆥', + 13162 => '𒆦', + 13163 => '𒆧', + 13164 => '𒆨', + 13165 => '𒆩', + 13166 => '𒆪', + 13167 => '𒆫', + 13168 => '𒆬', + 13169 => '𒆭', + 13170 => '𒆮', + 13171 => '𒆯', + 13172 => '𒆰', + 13173 => '𒆱', + 13174 => '𒆲', + 13175 => '𒆳', + 13176 => '𒆴', + 13177 => '𒆵', + 13178 => '𒆶', + 13179 => '𒆷', + 13180 => '𒆸', + 13181 => '𒆹', + 13182 => '𒆺', + 13183 => '𒆻', + 13184 => '𒆼', + 13185 => '𒆽', + 13186 => '𒆾', + 13187 => '𒆿', + 13188 => '𒇀', + 13189 => '𒇁', + 13190 => '𒇂', + 13191 => '𒇃', + 13192 => '𒇄', + 13193 => '𒇅', + 13194 => '𒇆', + 13195 => '𒇇', + 13196 => '𒇈', + 13197 => '𒇉', + 13198 => '𒇊', + 13199 => '𒇋', + 13200 => '𒇌', + 13201 => '𒇍', + 13202 => '𒇎', + 13203 => '𒇏', + 13204 => '𒇐', + 13205 => '𒇑', + 13206 => '𒇒', + 13207 => '𒇓', + 13208 => '𒇔', + 13209 => '𒇕', + 13210 => '𒇖', + 13211 => '𒇗', + 13212 => '𒇘', + 13213 => '𒇙', + 13214 => '𒇚', + 13215 => '𒇛', + 13216 => '𒇜', + 13217 => '𒇝', + 13218 => '𒇞', + 13219 => '𒇟', + 13220 => '𒇠', + 13221 => '𒇡', + 13222 => '𒇢', + 13223 => '𒇣', + 13224 => '𒇤', + 13225 => '𒇥', + 13226 => '𒇦', + 13227 => '𒇧', + 13228 => '𒇨', + 13229 => '𒇩', + 13230 => '𒇪', + 13231 => '𒇫', + 13232 => '𒇬', + 13233 => '𒇭', + 13234 => '𒇮', + 13235 => '𒇯', + 13236 => '𒇰', + 13237 => '𒇱', + 13238 => '𒇲', + 13239 => '𒇳', + 13240 => '𒇴', + 13241 => '𒇵', + 13242 => '𒇶', + 13243 => '𒇷', + 13244 => '𒇸', + 13245 => '𒇹', + 13246 => '𒇺', + 13247 => '𒇻', + 13248 => '𒇼', + 13249 => '𒇽', + 13250 => '𒇾', + 13251 => '𒇿', + 13252 => '𒈀', + 13253 => '𒈁', + 13254 => '𒈂', + 13255 => '𒈃', + 13256 => '𒈄', + 13257 => '𒈅', + 13258 => '𒈆', + 13259 => '𒈇', + 13260 => '𒈈', + 13261 => '𒈉', + 13262 => '𒈊', + 13263 => '𒈋', + 13264 => '𒈌', + 13265 => '𒈍', + 13266 => '𒈎', + 13267 => '𒈏', + 13268 => '𒈐', + 13269 => '𒈑', + 13270 => '𒈒', + 13271 => '𒈓', + 13272 => '𒈔', + 13273 => '𒈕', + 13274 => '𒈖', + 13275 => '𒈗', + 13276 => '𒈘', + 13277 => '𒈙', + 13278 => '𒈚', + 13279 => '𒈛', + 13280 => '𒈜', + 13281 => '𒈝', + 13282 => '𒈞', + 13283 => '𒈟', + 13284 => '𒈠', + 13285 => '𒈡', + 13286 => '𒈢', + 13287 => '𒈣', + 13288 => '𒈤', + 13289 => '𒈥', + 13290 => '𒈦', + 13291 => '𒈧', + 13292 => '𒈨', + 13293 => '𒈩', + 13294 => '𒈪', + 13295 => '𒈫', + 13296 => '𒈬', + 13297 => '𒈭', + 13298 => '𒈮', + 13299 => '𒈯', + 13300 => '𒈰', + 13301 => '𒈱', + 13302 => '𒈲', + 13303 => '𒈳', + 13304 => '𒈴', + 13305 => '𒈵', + 13306 => '𒈶', + 13307 => '𒈷', + 13308 => '𒈸', + 13309 => '𒈹', + 13310 => '𒈺', + 13311 => '𒈻', + 13312 => '𒈼', + 13313 => '𒈽', + 13314 => '𒈾', + 13315 => '𒈿', + 13316 => '𒉀', + 13317 => '𒉁', + 13318 => '𒉂', + 13319 => '𒉃', + 13320 => '𒉄', + 13321 => '𒉅', + 13322 => '𒉆', + 13323 => '𒉇', + 13324 => '𒉈', + 13325 => '𒉉', + 13326 => '𒉊', + 13327 => '𒉋', + 13328 => '𒉌', + 13329 => '𒉍', + 13330 => '𒉎', + 13331 => '𒉏', + 13332 => '𒉐', + 13333 => '𒉑', + 13334 => '𒉒', + 13335 => '𒉓', + 13336 => '𒉔', + 13337 => '𒉕', + 13338 => '𒉖', + 13339 => '𒉗', + 13340 => '𒉘', + 13341 => '𒉙', + 13342 => '𒉚', + 13343 => '𒉛', + 13344 => '𒉜', + 13345 => '𒉝', + 13346 => '𒉞', + 13347 => '𒉟', + 13348 => '𒉠', + 13349 => '𒉡', + 13350 => '𒉢', + 13351 => '𒉣', + 13352 => '𒉤', + 13353 => '𒉥', + 13354 => '𒉦', + 13355 => '𒉧', + 13356 => '𒉨', + 13357 => '𒉩', + 13358 => '𒉪', + 13359 => '𒉫', + 13360 => '𒉬', + 13361 => '𒉭', + 13362 => '𒉮', + 13363 => '𒉯', + 13364 => '𒉰', + 13365 => '𒉱', + 13366 => '𒉲', + 13367 => '𒉳', + 13368 => '𒉴', + 13369 => '𒉵', + 13370 => '𒉶', + 13371 => '𒉷', + 13372 => '𒉸', + 13373 => '𒉹', + 13374 => '𒉺', + 13375 => '𒉻', + 13376 => '𒉼', + 13377 => '𒉽', + 13378 => '𒉾', + 13379 => '𒉿', + 13380 => '𒊀', + 13381 => '𒊁', + 13382 => '𒊂', + 13383 => '𒊃', + 13384 => '𒊄', + 13385 => '𒊅', + 13386 => '𒊆', + 13387 => '𒊇', + 13388 => '𒊈', + 13389 => '𒊉', + 13390 => '𒊊', + 13391 => '𒊋', + 13392 => '𒊌', + 13393 => '𒊍', + 13394 => '𒊎', + 13395 => '𒊏', + 13396 => '𒊐', + 13397 => '𒊑', + 13398 => '𒊒', + 13399 => '𒊓', + 13400 => '𒊔', + 13401 => '𒊕', + 13402 => '𒊖', + 13403 => '𒊗', + 13404 => '𒊘', + 13405 => '𒊙', + 13406 => '𒊚', + 13407 => '𒊛', + 13408 => '𒊜', + 13409 => '𒊝', + 13410 => '𒊞', + 13411 => '𒊟', + 13412 => '𒊠', + 13413 => '𒊡', + 13414 => '𒊢', + 13415 => '𒊣', + 13416 => '𒊤', + 13417 => '𒊥', + 13418 => '𒊦', + 13419 => '𒊧', + 13420 => '𒊨', + 13421 => '𒊩', + 13422 => '𒊪', + 13423 => '𒊫', + 13424 => '𒊬', + 13425 => '𒊭', + 13426 => '𒊮', + 13427 => '𒊯', + 13428 => '𒊰', + 13429 => '𒊱', + 13430 => '𒊲', + 13431 => '𒊳', + 13432 => '𒊴', + 13433 => '𒊵', + 13434 => '𒊶', + 13435 => '𒊷', + 13436 => '𒊸', + 13437 => '𒊹', + 13438 => '𒊺', + 13439 => '𒊻', + 13440 => '𒊼', + 13441 => '𒊽', + 13442 => '𒊾', + 13443 => '𒊿', + 13444 => '𒋀', + 13445 => '𒋁', + 13446 => '𒋂', + 13447 => '𒋃', + 13448 => '𒋄', + 13449 => '𒋅', + 13450 => '𒋆', + 13451 => '𒋇', + 13452 => '𒋈', + 13453 => '𒋉', + 13454 => '𒋊', + 13455 => '𒋋', + 13456 => '𒋌', + 13457 => '𒋍', + 13458 => '𒋎', + 13459 => '𒋏', + 13460 => '𒋐', + 13461 => '𒋑', + 13462 => '𒋒', + 13463 => '𒋓', + 13464 => '𒋔', + 13465 => '𒋕', + 13466 => '𒋖', + 13467 => '𒋗', + 13468 => '𒋘', + 13469 => '𒋙', + 13470 => '𒋚', + 13471 => '𒋛', + 13472 => '𒋜', + 13473 => '𒋝', + 13474 => '𒋞', + 13475 => '𒋟', + 13476 => '𒋠', + 13477 => '𒋡', + 13478 => '𒋢', + 13479 => '𒋣', + 13480 => '𒋤', + 13481 => '𒋥', + 13482 => '𒋦', + 13483 => '𒋧', + 13484 => '𒋨', + 13485 => '𒋩', + 13486 => '𒋪', + 13487 => '𒋫', + 13488 => '𒋬', + 13489 => '𒋭', + 13490 => '𒋮', + 13491 => '𒋯', + 13492 => '𒋰', + 13493 => '𒋱', + 13494 => '𒋲', + 13495 => '𒋳', + 13496 => '𒋴', + 13497 => '𒋵', + 13498 => '𒋶', + 13499 => '𒋷', + 13500 => '𒋸', + 13501 => '𒋹', + 13502 => '𒋺', + 13503 => '𒋻', + 13504 => '𒋼', + 13505 => '𒋽', + 13506 => '𒋾', + 13507 => '𒋿', + 13508 => '𒌀', + 13509 => '𒌁', + 13510 => '𒌂', + 13511 => '𒌃', + 13512 => '𒌄', + 13513 => '𒌅', + 13514 => '𒌆', + 13515 => '𒌇', + 13516 => '𒌈', + 13517 => '𒌉', + 13518 => '𒌊', + 13519 => '𒌋', + 13520 => '𒌌', + 13521 => '𒌍', + 13522 => '𒌎', + 13523 => '𒌏', + 13524 => '𒌐', + 13525 => '𒌑', + 13526 => '𒌒', + 13527 => '𒌓', + 13528 => '𒌔', + 13529 => '𒌕', + 13530 => '𒌖', + 13531 => '𒌗', + 13532 => '𒌘', + 13533 => '𒌙', + 13534 => '𒌚', + 13535 => '𒌛', + 13536 => '𒌜', + 13537 => '𒌝', + 13538 => '𒌞', + 13539 => '𒌟', + 13540 => '𒌠', + 13541 => '𒌡', + 13542 => '𒌢', + 13543 => '𒌣', + 13544 => '𒌤', + 13545 => '𒌥', + 13546 => '𒌦', + 13547 => '𒌧', + 13548 => '𒌨', + 13549 => '𒌩', + 13550 => '𒌪', + 13551 => '𒌫', + 13552 => '𒌬', + 13553 => '𒌭', + 13554 => '𒌮', + 13555 => '𒌯', + 13556 => '𒌰', + 13557 => '𒌱', + 13558 => '𒌲', + 13559 => '𒌳', + 13560 => '𒌴', + 13561 => '𒌵', + 13562 => '𒌶', + 13563 => '𒌷', + 13564 => '𒌸', + 13565 => '𒌹', + 13566 => '𒌺', + 13567 => '𒌻', + 13568 => '𒌼', + 13569 => '𒌽', + 13570 => '𒌾', + 13571 => '𒌿', + 13572 => '𒍀', + 13573 => '𒍁', + 13574 => '𒍂', + 13575 => '𒍃', + 13576 => '𒍄', + 13577 => '𒍅', + 13578 => '𒍆', + 13579 => '𒍇', + 13580 => '𒍈', + 13581 => '𒍉', + 13582 => '𒍊', + 13583 => '𒍋', + 13584 => '𒍌', + 13585 => '𒍍', + 13586 => '𒍎', + 13587 => '𒍏', + 13588 => '𒍐', + 13589 => '𒍑', + 13590 => '𒍒', + 13591 => '𒍓', + 13592 => '𒍔', + 13593 => '𒍕', + 13594 => '𒍖', + 13595 => '𒍗', + 13596 => '𒍘', + 13597 => '𒍙', + 13598 => '𒍚', + 13599 => '𒍛', + 13600 => '𒍜', + 13601 => '𒍝', + 13602 => '𒍞', + 13603 => '𒍟', + 13604 => '𒍠', + 13605 => '𒍡', + 13606 => '𒍢', + 13607 => '𒍣', + 13608 => '𒍤', + 13609 => '𒍥', + 13610 => '𒍦', + 13611 => '𒍧', + 13612 => '𒍨', + 13613 => '𒍩', + 13614 => '𒍪', + 13615 => '𒍫', + 13616 => '𒍬', + 13617 => '𒍭', + 13618 => '𒍮', + 13619 => '𓀀', + 13620 => '𓀁', + 13621 => '𓀂', + 13622 => '𓀃', + 13623 => '𓀄', + 13624 => '𓀅', + 13625 => '𓀆', + 13626 => '𓀇', + 13627 => '𓀈', + 13628 => '𓀉', + 13629 => '𓀊', + 13630 => '𓀋', + 13631 => '𓀌', + 13632 => '𓀍', + 13633 => '𓀎', + 13634 => '𓀏', + 13635 => '𓀐', + 13636 => '𓀑', + 13637 => '𓀒', + 13638 => '𓀓', + 13639 => '𓀔', + 13640 => '𓀕', + 13641 => '𓀖', + 13642 => '𓀗', + 13643 => '𓀘', + 13644 => '𓀙', + 13645 => '𓀚', + 13646 => '𓀛', + 13647 => '𓀜', + 13648 => '𓀝', + 13649 => '𓀞', + 13650 => '𓀟', + 13651 => '𓀠', + 13652 => '𓀡', + 13653 => '𓀢', + 13654 => '𓀣', + 13655 => '𓀤', + 13656 => '𓀥', + 13657 => '𓀦', + 13658 => '𓀧', + 13659 => '𓀨', + 13660 => '𓀩', + 13661 => '𓀪', + 13662 => '𓀫', + 13663 => '𓀬', + 13664 => '𓀭', + 13665 => '𓀮', + 13666 => '𓀯', + 13667 => '𓀰', + 13668 => '𓀱', + 13669 => '𓀲', + 13670 => '𓀳', + 13671 => '𓀴', + 13672 => '𓀵', + 13673 => '𓀶', + 13674 => '𓀷', + 13675 => '𓀸', + 13676 => '𓀹', + 13677 => '𓀺', + 13678 => '𓀻', + 13679 => '𓀼', + 13680 => '𓀽', + 13681 => '𓀾', + 13682 => '𓀿', + 13683 => '𓁀', + 13684 => '𓁁', + 13685 => '𓁂', + 13686 => '𓁃', + 13687 => '𓁄', + 13688 => '𓁅', + 13689 => '𓁆', + 13690 => '𓁇', + 13691 => '𓁈', + 13692 => '𓁉', + 13693 => '𓁊', + 13694 => '𓁋', + 13695 => '𓁌', + 13696 => '𓁍', + 13697 => '𓁎', + 13698 => '𓁏', + 13699 => '𓁐', + 13700 => '𓁑', + 13701 => '𓁒', + 13702 => '𓁓', + 13703 => '𓁔', + 13704 => '𓁕', + 13705 => '𓁖', + 13706 => '𓁗', + 13707 => '𓁘', + 13708 => '𓁙', + 13709 => '𓁚', + 13710 => '𓁛', + 13711 => '𓁜', + 13712 => '𓁝', + 13713 => '𓁞', + 13714 => '𓁟', + 13715 => '𓁠', + 13716 => '𓁡', + 13717 => '𓁢', + 13718 => '𓁣', + 13719 => '𓁤', + 13720 => '𓁥', + 13721 => '𓁦', + 13722 => '𓁧', + 13723 => '𓁨', + 13724 => '𓁩', + 13725 => '𓁪', + 13726 => '𓁫', + 13727 => '𓁬', + 13728 => '𓁭', + 13729 => '𓁮', + 13730 => '𓁯', + 13731 => '𓁰', + 13732 => '𓁱', + 13733 => '𓁲', + 13734 => '𓁳', + 13735 => '𓁴', + 13736 => '𓁵', + 13737 => '𓁶', + 13738 => '𓁷', + 13739 => '𓁸', + 13740 => '𓁹', + 13741 => '𓁺', + 13742 => '𓁻', + 13743 => '𓁼', + 13744 => '𓁽', + 13745 => '𓁾', + 13746 => '𓁿', + 13747 => '𓂀', + 13748 => '𓂁', + 13749 => '𓂂', + 13750 => '𓂃', + 13751 => '𓂄', + 13752 => '𓂅', + 13753 => '𓂆', + 13754 => '𓂇', + 13755 => '𓂈', + 13756 => '𓂉', + 13757 => '𓂊', + 13758 => '𓂋', + 13759 => '𓂌', + 13760 => '𓂍', + 13761 => '𓂎', + 13762 => '𓂏', + 13763 => '𓂐', + 13764 => '𓂑', + 13765 => '𓂒', + 13766 => '𓂓', + 13767 => '𓂔', + 13768 => '𓂕', + 13769 => '𓂖', + 13770 => '𓂗', + 13771 => '𓂘', + 13772 => '𓂙', + 13773 => '𓂚', + 13774 => '𓂛', + 13775 => '𓂜', + 13776 => '𓂝', + 13777 => '𓂞', + 13778 => '𓂟', + 13779 => '𓂠', + 13780 => '𓂡', + 13781 => '𓂢', + 13782 => '𓂣', + 13783 => '𓂤', + 13784 => '𓂥', + 13785 => '𓂦', + 13786 => '𓂧', + 13787 => '𓂨', + 13788 => '𓂩', + 13789 => '𓂪', + 13790 => '𓂫', + 13791 => '𓂬', + 13792 => '𓂭', + 13793 => '𓂮', + 13794 => '𓂯', + 13795 => '𓂰', + 13796 => '𓂱', + 13797 => '𓂲', + 13798 => '𓂳', + 13799 => '𓂴', + 13800 => '𓂵', + 13801 => '𓂶', + 13802 => '𓂷', + 13803 => '𓂸', + 13804 => '𓂹', + 13805 => '𓂺', + 13806 => '𓂻', + 13807 => '𓂼', + 13808 => '𓂽', + 13809 => '𓂾', + 13810 => '𓂿', + 13811 => '𓃀', + 13812 => '𓃁', + 13813 => '𓃂', + 13814 => '𓃃', + 13815 => '𓃄', + 13816 => '𓃅', + 13817 => '𓃆', + 13818 => '𓃇', + 13819 => '𓃈', + 13820 => '𓃉', + 13821 => '𓃊', + 13822 => '𓃋', + 13823 => '𓃌', + 13824 => '𓃍', + 13825 => '𓃎', + 13826 => '𓃏', + 13827 => '𓃐', + 13828 => '𓃑', + 13829 => '𓃒', + 13830 => '𓃓', + 13831 => '𓃔', + 13832 => '𓃕', + 13833 => '𓃖', + 13834 => '𓃗', + 13835 => '𓃘', + 13836 => '𓃙', + 13837 => '𓃚', + 13838 => '𓃛', + 13839 => '𓃜', + 13840 => '𓃝', + 13841 => '𓃞', + 13842 => '𓃟', + 13843 => '𓃠', + 13844 => '𓃡', + 13845 => '𓃢', + 13846 => '𓃣', + 13847 => '𓃤', + 13848 => '𓃥', + 13849 => '𓃦', + 13850 => '𓃧', + 13851 => '𓃨', + 13852 => '𓃩', + 13853 => '𓃪', + 13854 => '𓃫', + 13855 => '𓃬', + 13856 => '𓃭', + 13857 => '𓃮', + 13858 => '𓃯', + 13859 => '𓃰', + 13860 => '𓃱', + 13861 => '𓃲', + 13862 => '𓃳', + 13863 => '𓃴', + 13864 => '𓃵', + 13865 => '𓃶', + 13866 => '𓃷', + 13867 => '𓃸', + 13868 => '𓃹', + 13869 => '𓃺', + 13870 => '𓃻', + 13871 => '𓃼', + 13872 => '𓃽', + 13873 => '𓃾', + 13874 => '𓃿', + 13875 => '𓄀', + 13876 => '𓄁', + 13877 => '𓄂', + 13878 => '𓄃', + 13879 => '𓄄', + 13880 => '𓄅', + 13881 => '𓄆', + 13882 => '𓄇', + 13883 => '𓄈', + 13884 => '𓄉', + 13885 => '𓄊', + 13886 => '𓄋', + 13887 => '𓄌', + 13888 => '𓄍', + 13889 => '𓄎', + 13890 => '𓄏', + 13891 => '𓄐', + 13892 => '𓄑', + 13893 => '𓄒', + 13894 => '𓄓', + 13895 => '𓄔', + 13896 => '𓄕', + 13897 => '𓄖', + 13898 => '𓄗', + 13899 => '𓄘', + 13900 => '𓄙', + 13901 => '𓄚', + 13902 => '𓄛', + 13903 => '𓄜', + 13904 => '𓄝', + 13905 => '𓄞', + 13906 => '𓄟', + 13907 => '𓄠', + 13908 => '𓄡', + 13909 => '𓄢', + 13910 => '𓄣', + 13911 => '𓄤', + 13912 => '𓄥', + 13913 => '𓄦', + 13914 => '𓄧', + 13915 => '𓄨', + 13916 => '𓄩', + 13917 => '𓄪', + 13918 => '𓄫', + 13919 => '𓄬', + 13920 => '𓄭', + 13921 => '𓄮', + 13922 => '𓄯', + 13923 => '𓄰', + 13924 => '𓄱', + 13925 => '𓄲', + 13926 => '𓄳', + 13927 => '𓄴', + 13928 => '𓄵', + 13929 => '𓄶', + 13930 => '𓄷', + 13931 => '𓄸', + 13932 => '𓄹', + 13933 => '𓄺', + 13934 => '𓄻', + 13935 => '𓄼', + 13936 => '𓄽', + 13937 => '𓄾', + 13938 => '𓄿', + 13939 => '𓅀', + 13940 => '𓅁', + 13941 => '𓅂', + 13942 => '𓅃', + 13943 => '𓅄', + 13944 => '𓅅', + 13945 => '𓅆', + 13946 => '𓅇', + 13947 => '𓅈', + 13948 => '𓅉', + 13949 => '𓅊', + 13950 => '𓅋', + 13951 => '𓅌', + 13952 => '𓅍', + 13953 => '𓅎', + 13954 => '𓅏', + 13955 => '𓅐', + 13956 => '𓅑', + 13957 => '𓅒', + 13958 => '𓅓', + 13959 => '𓅔', + 13960 => '𓅕', + 13961 => '𓅖', + 13962 => '𓅗', + 13963 => '𓅘', + 13964 => '𓅙', + 13965 => '𓅚', + 13966 => '𓅛', + 13967 => '𓅜', + 13968 => '𓅝', + 13969 => '𓅞', + 13970 => '𓅟', + 13971 => '𓅠', + 13972 => '𓅡', + 13973 => '𓅢', + 13974 => '𓅣', + 13975 => '𓅤', + 13976 => '𓅥', + 13977 => '𓅦', + 13978 => '𓅧', + 13979 => '𓅨', + 13980 => '𓅩', + 13981 => '𓅪', + 13982 => '𓅫', + 13983 => '𓅬', + 13984 => '𓅭', + 13985 => '𓅮', + 13986 => '𓅯', + 13987 => '𓅰', + 13988 => '𓅱', + 13989 => '𓅲', + 13990 => '𓅳', + 13991 => '𓅴', + 13992 => '𓅵', + 13993 => '𓅶', + 13994 => '𓅷', + 13995 => '𓅸', + 13996 => '𓅹', + 13997 => '𓅺', + 13998 => '𓅻', + 13999 => '𓅼', + 14000 => '𓅽', + 14001 => '𓅾', + 14002 => '𓅿', + 14003 => '𓆀', + 14004 => '𓆁', + 14005 => '𓆂', + 14006 => '𓆃', + 14007 => '𓆄', + 14008 => '𓆅', + 14009 => '𓆆', + 14010 => '𓆇', + 14011 => '𓆈', + 14012 => '𓆉', + 14013 => '𓆊', + 14014 => '𓆋', + 14015 => '𓆌', + 14016 => '𓆍', + 14017 => '𓆎', + 14018 => '𓆏', + 14019 => '𓆐', + 14020 => '𓆑', + 14021 => '𓆒', + 14022 => '𓆓', + 14023 => '𓆔', + 14024 => '𓆕', + 14025 => '𓆖', + 14026 => '𓆗', + 14027 => '𓆘', + 14028 => '𓆙', + 14029 => '𓆚', + 14030 => '𓆛', + 14031 => '𓆜', + 14032 => '𓆝', + 14033 => '𓆞', + 14034 => '𓆟', + 14035 => '𓆠', + 14036 => '𓆡', + 14037 => '𓆢', + 14038 => '𓆣', + 14039 => '𓆤', + 14040 => '𓆥', + 14041 => '𓆦', + 14042 => '𓆧', + 14043 => '𓆨', + 14044 => '𓆩', + 14045 => '𓆪', + 14046 => '𓆫', + 14047 => '𓆬', + 14048 => '𓆭', + 14049 => '𓆮', + 14050 => '𓆯', + 14051 => '𓆰', + 14052 => '𓆱', + 14053 => '𓆲', + 14054 => '𓆳', + 14055 => '𓆴', + 14056 => '𓆵', + 14057 => '𓆶', + 14058 => '𓆷', + 14059 => '𓆸', + 14060 => '𓆹', + 14061 => '𓆺', + 14062 => '𓆻', + 14063 => '𓆼', + 14064 => '𓆽', + 14065 => '𓆾', + 14066 => '𓆿', + 14067 => '𓇀', + 14068 => '𓇁', + 14069 => '𓇂', + 14070 => '𓇃', + 14071 => '𓇄', + 14072 => '𓇅', + 14073 => '𓇆', + 14074 => '𓇇', + 14075 => '𓇈', + 14076 => '𓇉', + 14077 => '𓇊', + 14078 => '𓇋', + 14079 => '𓇌', + 14080 => '𓇍', + 14081 => '𓇎', + 14082 => '𓇏', + 14083 => '𓇐', + 14084 => '𓇑', + 14085 => '𓇒', + 14086 => '𓇓', + 14087 => '𓇔', + 14088 => '𓇕', + 14089 => '𓇖', + 14090 => '𓇗', + 14091 => '𓇘', + 14092 => '𓇙', + 14093 => '𓇚', + 14094 => '𓇛', + 14095 => '𓇜', + 14096 => '𓇝', + 14097 => '𓇞', + 14098 => '𓇟', + 14099 => '𓇠', + 14100 => '𓇡', + 14101 => '𓇢', + 14102 => '𓇣', + 14103 => '𓇤', + 14104 => '𓇥', + 14105 => '𓇦', + 14106 => '𓇧', + 14107 => '𓇨', + 14108 => '𓇩', + 14109 => '𓇪', + 14110 => '𓇫', + 14111 => '𓇬', + 14112 => '𓇭', + 14113 => '𓇮', + 14114 => '𓇯', + 14115 => '𓇰', + 14116 => '𓇱', + 14117 => '𓇲', + 14118 => '𓇳', + 14119 => '𓇴', + 14120 => '𓇵', + 14121 => '𓇶', + 14122 => '𓇷', + 14123 => '𓇸', + 14124 => '𓇹', + 14125 => '𓇺', + 14126 => '𓇻', + 14127 => '𓇼', + 14128 => '𓇽', + 14129 => '𓇾', + 14130 => '𓇿', + 14131 => '𓈀', + 14132 => '𓈁', + 14133 => '𓈂', + 14134 => '𓈃', + 14135 => '𓈄', + 14136 => '𓈅', + 14137 => '𓈆', + 14138 => '𓈇', + 14139 => '𓈈', + 14140 => '𓈉', + 14141 => '𓈊', + 14142 => '𓈋', + 14143 => '𓈌', + 14144 => '𓈍', + 14145 => '𓈎', + 14146 => '𓈏', + 14147 => '𓈐', + 14148 => '𓈑', + 14149 => '𓈒', + 14150 => '𓈓', + 14151 => '𓈔', + 14152 => '𓈕', + 14153 => '𓈖', + 14154 => '𓈗', + 14155 => '𓈘', + 14156 => '𓈙', + 14157 => '𓈚', + 14158 => '𓈛', + 14159 => '𓈜', + 14160 => '𓈝', + 14161 => '𓈞', + 14162 => '𓈟', + 14163 => '𓈠', + 14164 => '𓈡', + 14165 => '𓈢', + 14166 => '𓈣', + 14167 => '𓈤', + 14168 => '𓈥', + 14169 => '𓈦', + 14170 => '𓈧', + 14171 => '𓈨', + 14172 => '𓈩', + 14173 => '𓈪', + 14174 => '𓈫', + 14175 => '𓈬', + 14176 => '𓈭', + 14177 => '𓈮', + 14178 => '𓈯', + 14179 => '𓈰', + 14180 => '𓈱', + 14181 => '𓈲', + 14182 => '𓈳', + 14183 => '𓈴', + 14184 => '𓈵', + 14185 => '𓈶', + 14186 => '𓈷', + 14187 => '𓈸', + 14188 => '𓈹', + 14189 => '𓈺', + 14190 => '𓈻', + 14191 => '𓈼', + 14192 => '𓈽', + 14193 => '𓈾', + 14194 => '𓈿', + 14195 => '𓉀', + 14196 => '𓉁', + 14197 => '𓉂', + 14198 => '𓉃', + 14199 => '𓉄', + 14200 => '𓉅', + 14201 => '𓉆', + 14202 => '𓉇', + 14203 => '𓉈', + 14204 => '𓉉', + 14205 => '𓉊', + 14206 => '𓉋', + 14207 => '𓉌', + 14208 => '𓉍', + 14209 => '𓉎', + 14210 => '𓉏', + 14211 => '𓉐', + 14212 => '𓉑', + 14213 => '𓉒', + 14214 => '𓉓', + 14215 => '𓉔', + 14216 => '𓉕', + 14217 => '𓉖', + 14218 => '𓉗', + 14219 => '𓉘', + 14220 => '𓉙', + 14221 => '𓉚', + 14222 => '𓉛', + 14223 => '𓉜', + 14224 => '𓉝', + 14225 => '𓉞', + 14226 => '𓉟', + 14227 => '𓉠', + 14228 => '𓉡', + 14229 => '𓉢', + 14230 => '𓉣', + 14231 => '𓉤', + 14232 => '𓉥', + 14233 => '𓉦', + 14234 => '𓉧', + 14235 => '𓉨', + 14236 => '𓉩', + 14237 => '𓉪', + 14238 => '𓉫', + 14239 => '𓉬', + 14240 => '𓉭', + 14241 => '𓉮', + 14242 => '𓉯', + 14243 => '𓉰', + 14244 => '𓉱', + 14245 => '𓉲', + 14246 => '𓉳', + 14247 => '𓉴', + 14248 => '𓉵', + 14249 => '𓉶', + 14250 => '𓉷', + 14251 => '𓉸', + 14252 => '𓉹', + 14253 => '𓉺', + 14254 => '𓉻', + 14255 => '𓉼', + 14256 => '𓉽', + 14257 => '𓉾', + 14258 => '𓉿', + 14259 => '𓊀', + 14260 => '𓊁', + 14261 => '𓊂', + 14262 => '𓊃', + 14263 => '𓊄', + 14264 => '𓊅', + 14265 => '𓊆', + 14266 => '𓊇', + 14267 => '𓊈', + 14268 => '𓊉', + 14269 => '𓊊', + 14270 => '𓊋', + 14271 => '𓊌', + 14272 => '𓊍', + 14273 => '𓊎', + 14274 => '𓊏', + 14275 => '𓊐', + 14276 => '𓊑', + 14277 => '𓊒', + 14278 => '𓊓', + 14279 => '𓊔', + 14280 => '𓊕', + 14281 => '𓊖', + 14282 => '𓊗', + 14283 => '𓊘', + 14284 => '𓊙', + 14285 => '𓊚', + 14286 => '𓊛', + 14287 => '𓊜', + 14288 => '𓊝', + 14289 => '𓊞', + 14290 => '𓊟', + 14291 => '𓊠', + 14292 => '𓊡', + 14293 => '𓊢', + 14294 => '𓊣', + 14295 => '𓊤', + 14296 => '𓊥', + 14297 => '𓊦', + 14298 => '𓊧', + 14299 => '𓊨', + 14300 => '𓊩', + 14301 => '𓊪', + 14302 => '𓊫', + 14303 => '𓊬', + 14304 => '𓊭', + 14305 => '𓊮', + 14306 => '𓊯', + 14307 => '𓊰', + 14308 => '𓊱', + 14309 => '𓊲', + 14310 => '𓊳', + 14311 => '𓊴', + 14312 => '𓊵', + 14313 => '𓊶', + 14314 => '𓊷', + 14315 => '𓊸', + 14316 => '𓊹', + 14317 => '𓊺', + 14318 => '𓊻', + 14319 => '𓊼', + 14320 => '𓊽', + 14321 => '𓊾', + 14322 => '𓊿', + 14323 => '𓋀', + 14324 => '𓋁', + 14325 => '𓋂', + 14326 => '𓋃', + 14327 => '𓋄', + 14328 => '𓋅', + 14329 => '𓋆', + 14330 => '𓋇', + 14331 => '𓋈', + 14332 => '𓋉', + 14333 => '𓋊', + 14334 => '𓋋', + 14335 => '𓋌', + 14336 => '𓋍', + 14337 => '𓋎', + 14338 => '𓋏', + 14339 => '𓋐', + 14340 => '𓋑', + 14341 => '𓋒', + 14342 => '𓋓', + 14343 => '𓋔', + 14344 => '𓋕', + 14345 => '𓋖', + 14346 => '𓋗', + 14347 => '𓋘', + 14348 => '𓋙', + 14349 => '𓋚', + 14350 => '𓋛', + 14351 => '𓋜', + 14352 => '𓋝', + 14353 => '𓋞', + 14354 => '𓋟', + 14355 => '𓋠', + 14356 => '𓋡', + 14357 => '𓋢', + 14358 => '𓋣', + 14359 => '𓋤', + 14360 => '𓋥', + 14361 => '𓋦', + 14362 => '𓋧', + 14363 => '𓋨', + 14364 => '𓋩', + 14365 => '𓋪', + 14366 => '𓋫', + 14367 => '𓋬', + 14368 => '𓋭', + 14369 => '𓋮', + 14370 => '𓋯', + 14371 => '𓋰', + 14372 => '𓋱', + 14373 => '𓋲', + 14374 => '𓋳', + 14375 => '𓋴', + 14376 => '𓋵', + 14377 => '𓋶', + 14378 => '𓋷', + 14379 => '𓋸', + 14380 => '𓋹', + 14381 => '𓋺', + 14382 => '𓋻', + 14383 => '𓋼', + 14384 => '𓋽', + 14385 => '𓋾', + 14386 => '𓋿', + 14387 => '𓌀', + 14388 => '𓌁', + 14389 => '𓌂', + 14390 => '𓌃', + 14391 => '𓌄', + 14392 => '𓌅', + 14393 => '𓌆', + 14394 => '𓌇', + 14395 => '𓌈', + 14396 => '𓌉', + 14397 => '𓌊', + 14398 => '𓌋', + 14399 => '𓌌', + 14400 => '𓌍', + 14401 => '𓌎', + 14402 => '𓌏', + 14403 => '𓌐', + 14404 => '𓌑', + 14405 => '𓌒', + 14406 => '𓌓', + 14407 => '𓌔', + 14408 => '𓌕', + 14409 => '𓌖', + 14410 => '𓌗', + 14411 => '𓌘', + 14412 => '𓌙', + 14413 => '𓌚', + 14414 => '𓌛', + 14415 => '𓌜', + 14416 => '𓌝', + 14417 => '𓌞', + 14418 => '𓌟', + 14419 => '𓌠', + 14420 => '𓌡', + 14421 => '𓌢', + 14422 => '𓌣', + 14423 => '𓌤', + 14424 => '𓌥', + 14425 => '𓌦', + 14426 => '𓌧', + 14427 => '𓌨', + 14428 => '𓌩', + 14429 => '𓌪', + 14430 => '𓌫', + 14431 => '𓌬', + 14432 => '𓌭', + 14433 => '𓌮', + 14434 => '𓌯', + 14435 => '𓌰', + 14436 => '𓌱', + 14437 => '𓌲', + 14438 => '𓌳', + 14439 => '𓌴', + 14440 => '𓌵', + 14441 => '𓌶', + 14442 => '𓌷', + 14443 => '𓌸', + 14444 => '𓌹', + 14445 => '𓌺', + 14446 => '𓌻', + 14447 => '𓌼', + 14448 => '𓌽', + 14449 => '𓌾', + 14450 => '𓌿', + 14451 => '𓍀', + 14452 => '𓍁', + 14453 => '𓍂', + 14454 => '𓍃', + 14455 => '𓍄', + 14456 => '𓍅', + 14457 => '𓍆', + 14458 => '𓍇', + 14459 => '𓍈', + 14460 => '𓍉', + 14461 => '𓍊', + 14462 => '𓍋', + 14463 => '𓍌', + 14464 => '𓍍', + 14465 => '𓍎', + 14466 => '𓍏', + 14467 => '𓍐', + 14468 => '𓍑', + 14469 => '𓍒', + 14470 => '𓍓', + 14471 => '𓍔', + 14472 => '𓍕', + 14473 => '𓍖', + 14474 => '𓍗', + 14475 => '𓍘', + 14476 => '𓍙', + 14477 => '𓍚', + 14478 => '𓍛', + 14479 => '𓍜', + 14480 => '𓍝', + 14481 => '𓍞', + 14482 => '𓍟', + 14483 => '𓍠', + 14484 => '𓍡', + 14485 => '𓍢', + 14486 => '𓍣', + 14487 => '𓍤', + 14488 => '𓍥', + 14489 => '𓍦', + 14490 => '𓍧', + 14491 => '𓍨', + 14492 => '𓍩', + 14493 => '𓍪', + 14494 => '𓍫', + 14495 => '𓍬', + 14496 => '𓍭', + 14497 => '𓍮', + 14498 => '𓍯', + 14499 => '𓍰', + 14500 => '𓍱', + 14501 => '𓍲', + 14502 => '𓍳', + 14503 => '𓍴', + 14504 => '𓍵', + 14505 => '𓍶', + 14506 => '𓍷', + 14507 => '𓍸', + 14508 => '𓍹', + 14509 => '𓍺', + 14510 => '𓍻', + 14511 => '𓍼', + 14512 => '𓍽', + 14513 => '𓍾', + 14514 => '𓍿', + 14515 => '𓎀', + 14516 => '𓎁', + 14517 => '𓎂', + 14518 => '𓎃', + 14519 => '𓎄', + 14520 => '𓎅', + 14521 => '𓎆', + 14522 => '𓎇', + 14523 => '𓎈', + 14524 => '𓎉', + 14525 => '𓎊', + 14526 => '𓎋', + 14527 => '𓎌', + 14528 => '𓎍', + 14529 => '𓎎', + 14530 => '𓎏', + 14531 => '𓎐', + 14532 => '𓎑', + 14533 => '𓎒', + 14534 => '𓎓', + 14535 => '𓎔', + 14536 => '𓎕', + 14537 => '𓎖', + 14538 => '𓎗', + 14539 => '𓎘', + 14540 => '𓎙', + 14541 => '𓎚', + 14542 => '𓎛', + 14543 => '𓎜', + 14544 => '𓎝', + 14545 => '𓎞', + 14546 => '𓎟', + 14547 => '𓎠', + 14548 => '𓎡', + 14549 => '𓎢', + 14550 => '𓎣', + 14551 => '𓎤', + 14552 => '𓎥', + 14553 => '𓎦', + 14554 => '𓎧', + 14555 => '𓎨', + 14556 => '𓎩', + 14557 => '𓎪', + 14558 => '𓎫', + 14559 => '𓎬', + 14560 => '𓎭', + 14561 => '𓎮', + 14562 => '𓎯', + 14563 => '𓎰', + 14564 => '𓎱', + 14565 => '𓎲', + 14566 => '𓎳', + 14567 => '𓎴', + 14568 => '𓎵', + 14569 => '𓎶', + 14570 => '𓎷', + 14571 => '𓎸', + 14572 => '𓎹', + 14573 => '𓎺', + 14574 => '𓎻', + 14575 => '𓎼', + 14576 => '𓎽', + 14577 => '𓎾', + 14578 => '𓎿', + 14579 => '𓏀', + 14580 => '𓏁', + 14581 => '𓏂', + 14582 => '𓏃', + 14583 => '𓏄', + 14584 => '𓏅', + 14585 => '𓏆', + 14586 => '𓏇', + 14587 => '𓏈', + 14588 => '𓏉', + 14589 => '𓏊', + 14590 => '𓏋', + 14591 => '𓏌', + 14592 => '𓏍', + 14593 => '𓏎', + 14594 => '𓏏', + 14595 => '𓏐', + 14596 => '𓏑', + 14597 => '𓏒', + 14598 => '𓏓', + 14599 => '𓏔', + 14600 => '𓏕', + 14601 => '𓏖', + 14602 => '𓏗', + 14603 => '𓏘', + 14604 => '𓏙', + 14605 => '𓏚', + 14606 => '𓏛', + 14607 => '𓏜', + 14608 => '𓏝', + 14609 => '𓏞', + 14610 => '𓏟', + 14611 => '𓏠', + 14612 => '𓏡', + 14613 => '𓏢', + 14614 => '𓏣', + 14615 => '𓏤', + 14616 => '𓏥', + 14617 => '𓏦', + 14618 => '𓏧', + 14619 => '𓏨', + 14620 => '𓏩', + 14621 => '𓏪', + 14622 => '𓏫', + 14623 => '𓏬', + 14624 => '𓏭', + 14625 => '𓏮', + 14626 => '𓏯', + 14627 => '𓏰', + 14628 => '𓏱', + 14629 => '𓏲', + 14630 => '𓏳', + 14631 => '𓏴', + 14632 => '𓏵', + 14633 => '𓏶', + 14634 => '𓏷', + 14635 => '𓏸', + 14636 => '𓏹', + 14637 => '𓏺', + 14638 => '𓏻', + 14639 => '𓏼', + 14640 => '𓏽', + 14641 => '𓏾', + 14642 => '𓏿', + 14643 => '𓐀', + 14644 => '𓐁', + 14645 => '𓐂', + 14646 => '𓐃', + 14647 => '𓐄', + 14648 => '𓐅', + 14649 => '𓐆', + 14650 => '𓐇', + 14651 => '𓐈', + 14652 => '𓐉', + 14653 => '𓐊', + 14654 => '𓐋', + 14655 => '𓐌', + 14656 => '𓐍', + 14657 => '𓐎', + 14658 => '𓐏', + 14659 => '𓐐', + 14660 => '𓐑', + 14661 => '𓐒', + 14662 => '𓐓', + 14663 => '𓐔', + 14664 => '𓐕', + 14665 => '𓐖', + 14666 => '𓐗', + 14667 => '𓐘', + 14668 => '𓐙', + 14669 => '𓐚', + 14670 => '𓐛', + 14671 => '𓐜', + 14672 => '𓐝', + 14673 => '𓐞', + 14674 => '𓐟', + 14675 => '𓐠', + 14676 => '𓐡', + 14677 => '𓐢', + 14678 => '𓐣', + 14679 => '𓐤', + 14680 => '𓐥', + 14681 => '𓐦', + 14682 => '𓐧', + 14683 => '𓐨', + 14684 => '𓐩', + 14685 => '𓐪', + 14686 => '𓐫', + 14687 => '𓐬', + 14688 => '𓐭', + 14689 => '𓐮', + 14690 => '㆒', + 14691 => '㆜', + 14692 => '㆔', + 14693 => '㆖', + 14694 => '㆘', + 14695 => '㆛', + 14696 => '㆗', + 14697 => '㆚', + 14698 => '㆓', + 14699 => '🈘', + 14700 => '㆟', + 14701 => '🈞', + 14702 => '🈠', + 14703 => '🈜', + 14704 => '🈹', + 14705 => '🈒', + 14706 => '🉑', + 14707 => '🈮', + 14708 => '🈴', + 14709 => '🈥', + 14710 => '🈺', + 14711 => '㆕', + 14712 => '㆞', + 14713 => '🈤', + 14714 => '🈕', + 14715 => '㆝', + 14716 => '🈑', + 14717 => '🈬', + 14718 => '🈝', + 14719 => '🉐', + 14720 => '🈐', + 14721 => '🈱', + 14722 => '🈧', + 14723 => '🈯', + 14724 => '🈨', + 14725 => '🈛', + 14726 => '🈟', + 14727 => '🈙', + 14728 => '🈷', + 14729 => '🈶', + 14730 => '🈵', + 14731 => '🈦', + 14732 => '🈚', + 14733 => '🈢', + 14734 => '㆙', + 14735 => '🈸', + 14736 => '🈲', + 14737 => '🈳', + 14738 => '🈡', + 14739 => '🈖', + 14740 => '🈣', + 14741 => '🈰', + 14742 => '🈫', +]; diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php index 79bbba8b0f..b3286a9a29 100644 --- a/includes/content/ContentHandler.php +++ b/includes/content/ContentHandler.php @@ -1,5 +1,7 @@ getDiffEngineClass(); - return new $diffEngineClass( $context, $old, $new, $rcid, $refreshCache, $unhide ); + $differenceEngine = new $diffEngineClass( $context, $old, $new, $rcid, $refreshCache, $unhide ); + Hooks::run( 'GetDifferenceEngine', [ $context, $old, $new, $refreshCache, $unhide, + &$differenceEngine ] ); + return $differenceEngine; + } + + /** + * Get an appropriate SlotDiffRenderer for this content model. + * @since 1.32 + * @param IContextSource $context + * @return SlotDiffRenderer + */ + final public function getSlotDiffRenderer( IContextSource $context ) { + $slotDiffRenderer = $this->getSlotDiffRendererInternal( $context ); + if ( get_class( $slotDiffRenderer ) === TextSlotDiffRenderer::class ) { + // To keep B/C, when SlotDiffRenderer is not overridden for a given content type + // but DifferenceEngine is, use that instead. + $differenceEngine = $this->createDifferenceEngine( $context ); + if ( get_class( $differenceEngine ) !== DifferenceEngine::class ) { + // TODO turn this into a deprecation warning in a later release + LoggerFactory::getInstance( 'diff' )->notice( + 'Falling back to DifferenceEngineSlotDiffRenderer', [ + 'modelID' => $this->getModelID(), + 'DifferenceEngine' => get_class( $differenceEngine ), + ] ); + $slotDiffRenderer = new DifferenceEngineSlotDiffRenderer( $differenceEngine ); + } + } + Hooks::run( 'GetSlotDiffRenderer', [ $this, &$slotDiffRenderer, $context ] ); + return $slotDiffRenderer; + } + + /** + * Return the SlotDiffRenderer appropriate for this content handler. + * @param IContextSource $context + * @return SlotDiffRenderer + */ + protected function getSlotDiffRendererInternal( IContextSource $context ) { + $contentLanguage = MediaWikiServices::getInstance()->getContentLanguage(); + $statsdDataFactory = MediaWikiServices::getInstance()->getStatsdDataFactory(); + $slotDiffRenderer = new TextSlotDiffRenderer(); + $slotDiffRenderer->setStatsdDataFactory( $statsdDataFactory ); + // XXX using the page language would be better, but it's unclear how that should be injected + $slotDiffRenderer->setLanguage( $contentLanguage ); + $slotDiffRenderer->setWikiDiff2MovedParagraphDetectionCutoff( + $context->getConfig()->get( 'WikiDiff2MovedParagraphDetectionCutoff' ) + ); + + $engine = DifferenceEngine::getEngine(); + if ( $engine === false ) { + $slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_PHP ); + } elseif ( $engine === 'wikidiff2' ) { + $slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_WIKIDIFF2 ); + } else { + $slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_EXTERNAL, $engine ); + } + + return $slotDiffRenderer; } /** * Get the language in which the content of the given page is written. * - * This default implementation just returns $wgContLang (except for pages + * This default implementation just returns the content language (except for pages * in the MediaWiki namespace) * * Note that the pages language is not cacheable, since it may in some @@ -659,8 +724,8 @@ abstract class ContentHandler { * @return Language The page's language */ public function getPageLanguage( Title $title, Content $content = null ) { - global $wgContLang, $wgLang; - $pageLang = $wgContLang; + global $wgLang; + $pageLang = MediaWikiServices::getInstance()->getContentLanguage(); if ( $title->getNamespace() == NS_MEDIAWIKI ) { // Parse mediawiki messages with correct target language diff --git a/includes/content/TextContent.php b/includes/content/TextContent.php index c0582962b5..20bce3701a 100644 --- a/includes/content/TextContent.php +++ b/includes/content/TextContent.php @@ -25,6 +25,8 @@ * @author Daniel Kinzler */ +use MediaWiki\MediaWikiServices; + /** * Content object implementation for representing flat text. * @@ -71,13 +73,10 @@ class TextContent extends AbstractContent { } public function getTextForSummary( $maxlength = 250 ) { - global $wgContLang; - $text = $this->getNativeData(); - $truncatedtext = $wgContLang->truncateForDatabase( - preg_replace( "/[\n\r]/", ' ', $text ), - max( 0, $maxlength ) ); + $truncatedtext = MediaWikiServices::getInstance()->getContentLanguage()-> + truncateForDatabase( preg_replace( "/[\n\r]/", ' ', $text ), max( 0, $maxlength ) ); return $truncatedtext; } @@ -195,20 +194,18 @@ class TextContent extends AbstractContent { * * @param Content $that The other content object to compare this content object to. * @param Language|null $lang The language object to use for text segmentation. - * If not given, $wgContentLang is used. + * If not given, the content language is used. * * @return Diff A diff representing the changes that would have to be * made to this content object to make it equal to $that. */ public function diff( Content $that, Language $lang = null ) { - global $wgContLang; - $this->checkModelID( $that->getModel() ); // @todo could implement this in DifferenceEngine and just delegate here? if ( !$lang ) { - $lang = $wgContLang; + $lang = MediaWikiServices::getInstance()->getContentLanguage(); } $otext = $this->getNativeData(); diff --git a/includes/content/WikitextContent.php b/includes/content/WikitextContent.php index 21947d2061..a7021b1e7b 100644 --- a/includes/content/WikitextContent.php +++ b/includes/content/WikitextContent.php @@ -35,6 +35,12 @@ use MediaWiki\MediaWikiServices; class WikitextContent extends TextContent { private $redirectTargetAndText = null; + /** + * @var bool Tracks if the parser set the user-signature flag when creating this content, which + * would make it expire faster in ApiStashEdit. + */ + private $hadSignature = false; + public function __construct( $text ) { parent::__construct( $text, CONTENT_MODEL_WIKITEXT ); } @@ -140,7 +146,17 @@ class WikitextContent extends TextContent { $text = $this->getNativeData(); $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts ); - return ( $text === $pst ) ? $this : new static( $pst ); + if ( $text === $pst ) { + return $this; + } + + $ret = new static( $pst ); + + if ( $wgParser->getOutput()->getFlag( 'user-signature' ) ) { + $ret->hadSignature = true; + } + + return $ret; } /** @@ -337,6 +353,11 @@ class WikitextContent extends TextContent { $output->addModuleStyles( 'mediawiki.action.view.redirectPage' ); } } + + // Pass along user-signature flag + if ( $this->hadSignature ) { + $output->setFlag( 'user-signature' ); + } } /** diff --git a/includes/context/RequestContext.php b/includes/context/RequestContext.php index 7563330697..16c304c015 100644 --- a/includes/context/RequestContext.php +++ b/includes/context/RequestContext.php @@ -325,8 +325,6 @@ class RequestContext implements IContextSource, MutableContext { } elseif ( $this->lang === null ) { $this->recursion = true; - global $wgContLang; - try { $request = $this->getRequest(); $user = $this->getUser(); @@ -340,7 +338,7 @@ class RequestContext implements IContextSource, MutableContext { Hooks::run( 'UserGetLanguageObject', [ $user, &$code, $this ] ); if ( $code === $this->getConfig()->get( 'LanguageCode' ) ) { - $this->lang = $wgContLang; + $this->lang = MediaWikiServices::getInstance()->getContentLanguage(); } else { $obj = Language::factory( $code ); $this->lang = $obj; diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index f4f04f1ff9..49777627af 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -21,6 +21,7 @@ * @ingroup Database */ +use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\Database; use Wikimedia\Rdbms\Blob; use Wikimedia\Rdbms\ResultWrapper; @@ -446,8 +447,6 @@ class DatabaseOracle extends Database { * @throws DBUnexpectedError */ private function insertOneRow( $table, $row, $fname ) { - global $wgContLang; - $table = $this->tableName( $table ); // "INSERT INTO tables (a, b, c)" $sql = "INSERT INTO " . $table . " (" . implode( ',', array_keys( $row ) ) . ')'; @@ -493,7 +492,8 @@ class DatabaseOracle extends Database { $val = $this->getInfinity(); } - $val = ( $wgContLang != null ) ? $wgContLang->checkTitleEncoding( $val ) : $val; + $val = MediaWikiServices::getInstance()->getContentLanguage()-> + checkTitleEncoding( $val ); if ( oci_bind_by_name( $stmt, ":$col", $val, -1, SQLT_CHR ) === false ) { $e = oci_error( $stmt ); $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ ); @@ -1067,9 +1067,9 @@ class DatabaseOracle extends Database { } function addQuotes( $s ) { - global $wgContLang; - if ( isset( $wgContLang->mLoaded ) && $wgContLang->mLoaded ) { - $s = $wgContLang->checkTitleEncoding( $s ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + if ( isset( $contLang->mLoaded ) && $contLang->mLoaded ) { + $s = $contLang->checkTitleEncoding( $s ); } return "'" . $this->strencode( $s ) . "'"; @@ -1092,15 +1092,15 @@ class DatabaseOracle extends Database { } private function wrapFieldForWhere( $table, &$col, &$val ) { - global $wgContLang; - $col_info = $this->fieldInfoMulti( $table, $col ); $col_type = $col_info != false ? $col_info->type() : 'CONSTANT'; if ( $col_type == 'CLOB' ) { $col = 'TO_CHAR(' . $col . ')'; - $val = $wgContLang->checkTitleEncoding( $val ); + $val = + MediaWikiServices::getInstance()->getContentLanguage()->checkTitleEncoding( $val ); } elseif ( $col_type == 'VARCHAR2' ) { - $val = $wgContLang->checkTitleEncoding( $val ); + $val = + MediaWikiServices::getInstance()->getContentLanguage()->checkTitleEncoding( $val ); } } @@ -1225,8 +1225,6 @@ class DatabaseOracle extends Database { * @throws DBUnexpectedError */ function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) { - global $wgContLang; - $table = $this->tableName( $table ); $opts = $this->makeUpdateOptions( $options ); $sql = "UPDATE $opts $table SET "; @@ -1270,7 +1268,8 @@ class DatabaseOracle extends Database { $val = '31-12-2030 12:00:00.000000'; } - $val = ( $wgContLang != null ) ? $wgContLang->checkTitleEncoding( $val ) : $val; + $val = MediaWikiServices::getInstance()->getContentLanguage()-> + checkTitleEncoding( $val ); if ( oci_bind_by_name( $stmt, ":$col", $val ) === false ) { $e = oci_error( $stmt ); $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ ); diff --git a/includes/debug/logger/LegacyLogger.php b/includes/debug/logger/LegacyLogger.php index 7bd505d089..d4a79d931f 100644 --- a/includes/debug/logger/LegacyLogger.php +++ b/includes/debug/logger/LegacyLogger.php @@ -193,7 +193,7 @@ class LegacyLogger extends AbstractLogger { * Format a message. * * Messages to the 'wfDebug', 'wfLogDBError' and 'wfErrorLog' channels - * receive special fomatting to mimic the historic output of the functions + * receive special formatting to mimic the historic output of the functions * of the same name. All other channel values are formatted based on the * historic output of the `wfDebugLog()` global function. * diff --git a/includes/deferred/LinksUpdate.php b/includes/deferred/LinksUpdate.php index 141888cda6..5b1be6d2a5 100644 --- a/includes/deferred/LinksUpdate.php +++ b/includes/deferred/LinksUpdate.php @@ -581,12 +581,14 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate { * @return array */ private function getCategoryInsertions( $existing = [] ) { - global $wgContLang, $wgCategoryCollation; + global $wgCategoryCollation; $diffs = array_diff_assoc( $this->mCategories, $existing ); $arr = []; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $collation = Collation::singleton(); foreach ( $diffs as $name => $prefix ) { $nt = Title::makeTitleSafe( NS_CATEGORY, $name ); - $wgContLang->findVariantLink( $name, $nt, true ); + $contLang->findVariantLink( $name, $nt, true ); $type = MWNamespace::getCategoryLinkType( $this->mTitle->getNamespace() ); @@ -594,8 +596,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate { # things are forced to sort as '*' or something, they'll # sort properly in the category rather than in page_id # order or such. - $sortkey = Collation::singleton()->getSortKey( - $this->mTitle->getCategorySortkey( $prefix ) ); + $sortkey = $collation->getSortKey( $this->mTitle->getCategorySortkey( $prefix ) ); $arr[] = [ 'cl_from' => $this->mId, diff --git a/includes/deferred/SearchUpdate.php b/includes/deferred/SearchUpdate.php index 0d1de1a4a9..3625476398 100644 --- a/includes/deferred/SearchUpdate.php +++ b/includes/deferred/SearchUpdate.php @@ -75,13 +75,14 @@ class SearchUpdate implements DeferrableUpdate { * Perform actual update for the entry */ public function doUpdate() { - $config = MediaWikiServices::getInstance()->getSearchEngineConfig(); + $services = MediaWikiServices::getInstance(); + $config = $services->getSearchEngineConfig(); if ( $config->getConfig()->get( 'DisableSearchUpdate' ) || !$this->id ) { return; } - $seFactory = MediaWikiServices::getInstance()->getSearchEngineFactory(); + $seFactory = $services->getSearchEngineFactory(); foreach ( $config->getSearchTypes() as $type ) { $search = $seFactory->create( $type ); if ( !$search->supports( 'search-update' ) ) { @@ -117,15 +118,16 @@ class SearchUpdate implements DeferrableUpdate { * @return string */ public function updateText( $text, SearchEngine $se = null ) { - global $wgContLang; - + $services = MediaWikiServices::getInstance(); + $contLang = $services->getContentLanguage(); # Language-specific strip/conversion - $text = $wgContLang->normalizeForSearch( $text ); - $se = $se ?: MediaWikiServices::getInstance()->newSearchEngine(); + $text = $contLang->normalizeForSearch( $text ); + $se = $se ?: $services->newSearchEngine(); $lc = $se->legalSearchChars() . '&#;'; + # Strip HTML markup $text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/", - ' ', $wgContLang->lc( " " . $text . " " ) ); # Strip HTML markup + ' ', $contLang->lc( " " . $text . " " ) ); $text = preg_replace( "/(^|\\n)==\\s*([^\\n]+)\\s*==(\\s)/sD", "\\1\\2 \\2 \\2\\3", $text ); # Emphasize headings @@ -200,15 +202,14 @@ class SearchUpdate implements DeferrableUpdate { * @return string A stripped-down title string ready for the search index */ private function getNormalizedTitle( SearchEngine $search ) { - global $wgContLang; - + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $ns = $this->title->getNamespace(); $title = $this->title->getText(); $lc = $search->legalSearchChars() . '&#;'; - $t = $wgContLang->normalizeForSearch( $title ); + $t = $contLang->normalizeForSearch( $title ); $t = preg_replace( "/[^{$lc}]+/", ' ', $t ); - $t = $wgContLang->lc( $t ); + $t = $contLang->lc( $t ); # Handle 's, s' $t = preg_replace( "/([{$lc}]+)'s( |$)/", "\\1 \\1's ", $t ); diff --git a/includes/deferred/WANCacheReapUpdate.php b/includes/deferred/WANCacheReapUpdate.php index 5ffc938879..604f2052c4 100644 --- a/includes/deferred/WANCacheReapUpdate.php +++ b/includes/deferred/WANCacheReapUpdate.php @@ -1,5 +1,6 @@ getNamespace() >= 0 ) { - $entities[] = WikiPage::factory( Title::newFromTitleValue( $t ) ); + $entities[] = WikiPage::factory( Title::newFromLinkTarget( $t ) ); } if ( $t->inNamespace( NS_FILE ) ) { diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php index aa0a1f782f..2ceda216d0 100644 --- a/includes/diff/DifferenceEngine.php +++ b/includes/diff/DifferenceEngine.php @@ -20,12 +20,30 @@ * @file * @ingroup DifferenceEngine */ -use MediaWiki\MediaWikiServices; -use MediaWiki\Shell\Shell; + +use MediaWiki\Storage\RevisionRecord; /** - * @todo document + * DifferenceEngine is responsible for rendering the difference between two revisions as HTML. + * This includes interpreting URL parameters, retrieving revision data, checking access permissions, + * selecting and invoking the diff generator class for the individual slots, doing post-processing + * on the generated diff, adding the rest of the HTML (such as headers) and writing the whole thing + * to OutputPage. + * + * DifferenceEngine can be subclassed by extensions, by customizing + * ContentHandler::createDifferenceEngine; the content handler will be selected based on the + * content model of the main slot (of the new revision, when the two are different). + * That might change after PageTypeHandler gets introduced. + * + * In the past, the class was also used for slot-level diff generation, and extensions might still + * subclass it and add such functionality. When that is the case (sepcifically, when a + * ContentHandler returns a standard SlotDiffRenderer but a nonstandard DifferenceEngine) + * DifferenceEngineSlotDiffRenderer will be used to convert the old behavior into the new one. + * * @ingroup DifferenceEngine + * + * @todo This class is huge and poorly defined. It should be split into a controller responsible + * for interpreting query parameters, retrieving data and checking permissions; and a HTML renderer. */ class DifferenceEngine extends ContextSource { @@ -48,26 +66,55 @@ class DifferenceEngine extends ContextSource { private $mOldTags; private $mNewTags; - /** @var Content|null */ - protected $mOldContent; - - /** @var Content|null */ - protected $mNewContent; + /** + * Old revision (left pane). + * Allowed to be an unsaved revision, unlikely that's ever needed though. + * Null when the old revision does not exist; this can happen when using + * diff=prev on the first revision. + * Since 1.32 public access is deprecated. + * @var Revision|null + */ + protected $mOldRev; - /** @var Language */ - protected $mDiffLang; + /** + * New revision (right pane). + * Note that this might be an unsaved revision (e.g. for edit preview). + * Null only in case of load failure; diff methods will just return an error message in that case. + * Since 1.32 public access is deprecated. + * @var Revision|null + */ + protected $mNewRev; - /** @var Title */ + /** + * Title of $mOldRev or null if the old revision does not exist or does not belong to a page. + * Since 1.32 public access is deprecated and the property can be null. + * @var Title|null + */ protected $mOldPage; - /** @var Title */ + /** + * Title of $mNewRev or null if the new revision does not exist or does not belong to a page. + * Since 1.32 public access is deprecated and the property can be null. + * @var Title|null + */ protected $mNewPage; - /** @var Revision|null */ - public $mOldRev; + /** + * @var Content|null + * @deprecated since 1.32, content slots are now handled by the corresponding SlotDiffRenderer. + * This property is set to the content of the main slot, but not actually used for the main diff. + */ + private $mOldContent; + + /** + * @var Content|null + * @deprecated since 1.32, content slots are now handled by the corresponding SlotDiffRenderer. + * This property is set to the content of the main slot, but not actually used for the main diff. + */ + private $mNewContent; - /** @var Revision|null */ - public $mNewRev; + /** @var Language */ + protected $mDiffLang; /** @var bool Have the revisions IDs been loaded */ private $mRevisionsIdsLoaded = false; @@ -80,7 +127,10 @@ class DifferenceEngine extends ContextSource { /** * Was the content overridden via setContent()? - * If the content was overridden, most internal state (e.g. mOldid or mOldRev) should be ignored. + * If the content was overridden, most internal state (e.g. mOldid or mOldRev) should be ignored + * and only mOldContent and mNewContent is reliable. + * (Note that setRevisions() does not set this flag as in that case all properties are + * overriden and remain consistent with each other, so no special handling is needed.) * @var bool */ protected $isContentOverridden = false; @@ -109,6 +159,17 @@ class DifferenceEngine extends ContextSource { /** @var bool Refresh the diff cache */ protected $mRefreshCache = false; + /** @var SlotDiffRenderer[] DifferenceEngine classes for the slots, keyed by role name. */ + protected $slotDiffRenderers = null; + + /** + * Temporary hack for B/C while slot diff related methods of DifferenceEngine are being + * deprecated. When true, we are inside a DifferenceEngineSlotDiffRenderer and + * $slotDiffRenderers should not be used. + * @var bool + */ + protected $isSlotDiffRenderer = false; + /**#@-*/ /** @@ -124,6 +185,8 @@ class DifferenceEngine extends ContextSource { ) { $this->deprecatePublicProperty( 'mOldid', '1.32', __CLASS__ ); $this->deprecatePublicProperty( 'mNewid', '1.32', __CLASS__ ); + $this->deprecatePublicProperty( 'mOldRev', '1.32', __CLASS__ ); + $this->deprecatePublicProperty( 'mNewRev', '1.32', __CLASS__ ); $this->deprecatePublicProperty( 'mOldPage', '1.32', __CLASS__ ); $this->deprecatePublicProperty( 'mNewPage', '1.32', __CLASS__ ); $this->deprecatePublicProperty( 'mOldContent', '1.32', __CLASS__ ); @@ -145,6 +208,81 @@ class DifferenceEngine extends ContextSource { } /** + * @return SlotDiffRenderer[] Diff renderers for each slot, keyed by role name. + * Includes slots only present in one of the revisions. + */ + protected function getSlotDiffRenderers() { + if ( $this->isSlotDiffRenderer ) { + throw new LogicException( __METHOD__ . ' called in slot diff renderer mode' ); + } + + if ( $this->slotDiffRenderers === null ) { + if ( !$this->loadRevisionData() ) { + return []; + } + + $slotContents = $this->getSlotContents(); + $this->slotDiffRenderers = array_map( function ( $contents ) { + /** @var $content Content */ + $content = $contents['new'] ?: $contents['old']; + return $content->getContentHandler()->getSlotDiffRenderer( $this->getContext() ); + }, $slotContents ); + } + return $this->slotDiffRenderers; + } + + /** + * Mark this DifferenceEngine as a slot renderer (as opposed to a page renderer). + * This is used in legacy mode when the DifferenceEngine is wrapped in a + * DifferenceEngineSlotDiffRenderer. + * @internal For use by DifferenceEngineSlotDiffRenderer only. + */ + public function markAsSlotDiffRenderer() { + $this->isSlotDiffRenderer = true; + } + + /** + * Get the old and new content objects for all slots. + * This method does not do any permission checks. + * @return array [ role => [ 'old' => SlotRecord, 'new' => SlotRecord ], ... ] + */ + protected function getSlotContents() { + if ( $this->isContentOverridden ) { + return [ + 'main' => [ + 'old' => $this->mOldContent, + 'new' => $this->mNewContent, + ] + ]; + } + + $oldRev = $this->mOldRev->getRevisionRecord(); + $newRev = $this->mNewRev->getRevisionRecord(); + // The order here will determine the visual order of the diff. The current logic is + // changed first, then added, then deleted. This is ad hoc and should not be relied on + // - in the future we may want the ordering to depend on the page type. + $roles = array_merge( $newRev->getSlotRoles(), $oldRev->getSlotRoles() ); + $oldSlots = $oldRev->getSlots()->getSlots(); + $newSlots = $newRev->getSlots()->getSlots(); + + $slots = []; + foreach ( $roles as $role ) { + $slots[$role] = [ + 'old' => isset( $oldSlots[$role] ) ? $oldSlots[$role]->getContent() : null, + 'new' => isset( $newSlots[$role] ) ? $newSlots[$role]->getContent() : null, + ]; + } + // move main slot to front + if ( isset( $slots['main'] ) ) { + $slots = [ 'main' => $slots['main'] ] + $slots; + } + return $slots; + } + + /** + * Set reduced line numbers mode. + * When set, line X is not displayed when X is 1, for example to increase readability and + * conserve space with many small diffs. * @param bool $value */ public function setReducedLineNumbers( $value = true ) { @@ -190,6 +328,25 @@ class DifferenceEngine extends ContextSource { return $this->mNewid; } + /** + * Get the left side of the diff. + * Could be null when the first revision of the page is diffed to 'prev' (or in the case of + * load failure). + * @return RevisionRecord|null + */ + public function getOldRevision() { + return $this->mOldRev ? $this->mOldRev->getRevisionRecord() : null; + } + + /** + * Get the right side of the diff. + * Should not be null but can still happen in the case of load failure. + * @return RevisionRecord|null + */ + public function getNewRevision() { + return $this->mNewRev ? $this->mNewRev->getRevisionRecord() : null; + } + /** * Look up a special:Undelete link to the given deleted revision id, * as a workaround for being unable to load deleted diffs in currently. @@ -280,8 +437,11 @@ class DifferenceEngine extends ContextSource { } $user = $this->getUser(); - $permErrors = $this->mNewPage->getUserPermissionsErrors( 'read', $user ); - if ( $this->mOldPage ) { # mOldPage might not be set, see below. + $permErrors = []; + if ( $this->mNewPage ) { + $permErrors = $this->mNewPage->getUserPermissionsErrors( 'read', $user ); + } + if ( $this->mOldPage ) { $permErrors = wfMergeErrorArrays( $permErrors, $this->mOldPage->getUserPermissionsErrors( 'read', $user ) ); } @@ -311,7 +471,9 @@ class DifferenceEngine extends ContextSource { # a diff between a version V and its previous version V' AND the version V # is the first version of that article. In that case, V' does not exist. if ( $this->mOldRev === false ) { - $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) ); + if ( $this->mNewPage ) { + $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) ); + } $samePage = true; $oldHeader = ''; // Allow extensions to change the $oldHeader variable @@ -319,7 +481,10 @@ class DifferenceEngine extends ContextSource { } else { Hooks::run( 'DiffViewHeader', [ $this, $this->mOldRev, $this->mNewRev ] ); - if ( $this->mNewPage->equals( $this->mOldPage ) ) { + if ( !$this->mOldPage || !$this->mNewPage ) { + // XXX say something to the user? + $samePage = false; + } elseif ( $this->mNewPage->equals( $this->mOldPage ) ) { $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) ); $samePage = true; } else { @@ -329,7 +494,7 @@ class DifferenceEngine extends ContextSource { $samePage = false; } - if ( $samePage && $this->mNewPage->quickUserCan( 'edit', $user ) ) { + if ( $samePage && $this->mNewPage && $this->mNewPage->quickUserCan( 'edit', $user ) ) { if ( $this->mNewRev->isCurrent() && $this->mNewPage->userCan( 'rollback', $user ) ) { $rollbackLink = Linker::generateRollback( $this->mNewRev, $this->getContext() ); if ( $rollbackLink ) { @@ -356,7 +521,7 @@ class DifferenceEngine extends ContextSource { } # Make "previous revision link" - if ( $samePage && $this->mOldRev->getPrevious() ) { + if ( $samePage && $this->mOldPage && $this->mOldRev->getPrevious() ) { $prevlink = Linker::linkKnown( $this->mOldPage, $this->msg( 'previousdiff' )->escaped(), @@ -409,7 +574,7 @@ class DifferenceEngine extends ContextSource { # Make "next revision link" # Skip next link on the top revision - if ( $samePage && !$this->mNewRev->isCurrent() ) { + if ( $samePage && $this->mNewPage && !$this->mNewRev->isCurrent() ) { $nextlink = Linker::linkKnown( $this->mNewPage, $this->msg( 'nextdiff' )->escaped(), @@ -517,7 +682,7 @@ class DifferenceEngine extends ContextSource { if ( $this->mMarkPatrolledLink === null ) { $linkInfo = $this->getMarkPatrolledLinkInfo(); // If false, there is no patrol link needed/allowed - if ( !$linkInfo ) { + if ( !$linkInfo || !$this->mNewPage ) { $this->mMarkPatrolledLink = ''; } else { $this->mMarkPatrolledLink = ' [' . @@ -553,7 +718,7 @@ class DifferenceEngine extends ContextSource { // Prepare a change patrol link, if applicable if ( // Is patrolling enabled and the user allowed to? - $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $user ) && + $wgUseRCPatrol && $this->mNewPage && $this->mNewPage->quickUserCan( 'patrol', $user ) && // Only do this if the revision isn't more than 6 hours older // than the Max RC age (6h because the RC might not be cleaned out regularly) RecentChange::isInRCLifespan( $this->mNewRev->getTimestamp(), 21600 ) @@ -626,6 +791,12 @@ class DifferenceEngine extends ContextSource { # Page content may be handled by a hooked call instead... if ( Hooks::run( 'ArticleContentOnDiff', [ $this, $out ] ) ) { $this->loadNewText(); + if ( !$this->mNewPage ) { + // New revision is unsaved; bail out. + // TODO in theory rendering the new revision is a meaningful thing to do + // even if it's unsaved, but a lot of untangling is required to do it safely. + } + $out->setRevisionId( $this->mNewid ); $out->setRevisionTimestamp( $this->mNewRev->getTimestamp() ); $out->setArticleFlag( true ); @@ -714,7 +885,12 @@ class DifferenceEngine extends ContextSource { * Add style sheets for diff display. */ public function showDiffStyle() { - $this->getOutput()->addModuleStyles( 'mediawiki.diff.styles' ); + if ( !$this->isSlotDiffRenderer ) { + $this->getOutput()->addModuleStyles( 'mediawiki.diff.styles' ); + foreach ( $this->getSlotDiffRenderers() as $slotDiffRenderer ) { + $slotDiffRenderer->addModules( $this->getOutput() ); + } + } } /** @@ -751,25 +927,28 @@ class DifferenceEngine extends ContextSource { public function getDiffBody() { $this->mCacheHit = true; // Check if the diff should be hidden from this user - if ( !$this->loadRevisionData() ) { - return false; - } elseif ( $this->mOldRev && - !$this->mOldRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) - ) { - return false; - } elseif ( $this->mNewRev && - !$this->mNewRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) - ) { - return false; - } - // Short-circuit - if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev - && $this->mOldRev->getId() == $this->mNewRev->getId() ) - ) { - if ( Hooks::run( 'DifferenceEngineShowEmptyOldContent', [ $this ] ) ) { - return ''; + if ( !$this->isContentOverridden ) { + if ( !$this->loadRevisionData() ) { + return false; + } elseif ( $this->mOldRev && + !$this->mOldRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) + ) { + return false; + } elseif ( $this->mNewRev && + !$this->mNewRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) + ) { + return false; + } + // Short-circuit + if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev && + $this->mOldRev->getId() && $this->mOldRev->getId() == $this->mNewRev->getId() ) + ) { + if ( Hooks::run( 'DifferenceEngineShowEmptyOldContent', [ $this ] ) ) { + return ''; + } } } + // Cacheable? $key = false; $cache = ObjectCache::getMainWANInstance(); @@ -800,7 +979,20 @@ class DifferenceEngine extends ContextSource { return false; } - $difftext = $this->generateContentDiffBody( $this->mOldContent, $this->mNewContent ); + $difftext = ''; + // We've checked for revdelete at the beginning of this method; it's OK to ignore + // read permissions here. + $slotContents = $this->getSlotContents(); + foreach ( $this->getSlotDiffRenderers() as $role => $slotDiffRenderer ) { + $slotDiff = $slotDiffRenderer->getDiff( $slotContents[$role]['old'], + $slotContents[$role]['new'] ); + if ( $slotDiff && $role !== 'main' ) { + // TODO use human-readable role name at least + $slotTitle = $role; + $difftext .= $this->getSlotHeader( $slotTitle ); + } + $difftext .= $slotDiff; + } // Avoid PHP 7.1 warning from passing $this by reference $diffEngine = $this; @@ -822,6 +1014,21 @@ class DifferenceEngine extends ContextSource { return $difftext; } + /** + * Get a slot header for inclusion in a diff body (as a table row). + * + * @param string $headerText The text of the header + * @return string + * + */ + protected function getSlotHeader( $headerText ) { + // The old revision is missing on oldid=&diff=prev; only 2 columns in that case. + $columnCount = $this->mOldRev ? 4 : 2; + $userLang = $this->getLanguage()->getHtmlCode(); + return Html::rawElement( 'tr', [ 'class' => 'mw-diff-slot-header', 'lang' => $userLang ], + Html::element( 'th', [ 'colspan' => $columnCount ], $headerText ) ); + } + /** * Returns the cache key for diff body text or content. * @@ -867,98 +1074,112 @@ class DifferenceEngine extends ContextSource { $params[] = $this->getConfig()->get( 'WikiDiff2MovedParagraphDetectionCutoff' ); } + if ( !$this->isSlotDiffRenderer ) { + foreach ( $this->getSlotDiffRenderers() as $slotDiffRenderer ) { + $params = array_merge( $params, $slotDiffRenderer->getExtraCacheKeys() ); + } + } + + return $params; + } + + /** + * Implements DifferenceEngineSlotDiffRenderer::getExtraCacheKeys(). Only used when + * DifferenceEngine is wrapped in DifferenceEngineSlotDiffRenderer. + * @return array + * @internal for use by DifferenceEngineSlotDiffRenderer only + * @deprecated + */ + public function getExtraCacheKeys() { + // This method is called when the DifferenceEngine is used for a slot diff. We only care + // about special things, not the revision IDs, which are added to the cache key by the + // page-level DifferenceEngine, and which might not have a valid value for this object. + $this->mOldid = 123456789; + $this->mNewid = 987654321; + + // This will repeat a bunch of unnecessary key fields for each slot. Not nice but harmless. + $cacheString = $this->getDiffBodyCacheKey(); + if ( $cacheString ) { + return [ $cacheString ]; + } + + $params = $this->getDiffBodyCacheKeyParams(); + + // Try to get rid of the standard keys to keep the cache key human-readable: + // call the getDiffBodyCacheKeyParams implementation of the base class, and if + // the child class includes the same keys, drop them. + // Uses an obscure PHP feature where static calls to non-static methods are allowed + // as long as we are already in a non-static method of the same class, and the call context + // ($this) will be inherited. + // phpcs:ignore Squiz.Classes.SelfMemberReference.NotUsed + $standardParams = DifferenceEngine::getDiffBodyCacheKeyParams(); + if ( array_slice( $params, 0, count( $standardParams ) ) === $standardParams ) { + $params = array_slice( $params, count( $standardParams ) ); + } + return $params; } /** * Generate a diff, no caching. * - * This implementation uses generateTextDiffBody() to generate a diff based on the default - * serialization of the given Content objects. This will fail if $old or $new are not - * instances of TextContent. - * - * Subclasses may override this to provide a different rendering for the diff, - * perhaps taking advantage of the content's native form. This is required for all content - * models that are not text based. - * * @since 1.21 * * @param Content $old Old content * @param Content $new New content * - * @throws MWException If old or new content is not an instance of TextContent. + * @throws Exception If old or new content is not an instance of TextContent. * @return bool|string + * + * @deprecated since 1.32, use a SlotDiffRenderer instead. */ public function generateContentDiffBody( Content $old, Content $new ) { - if ( !( $old instanceof TextContent ) ) { - throw new MWException( "Diff not implemented for " . get_class( $old ) . "; " . - "override generateContentDiffBody to fix this." ); - } - - if ( !( $new instanceof TextContent ) ) { - throw new MWException( "Diff not implemented for " . get_class( $new ) . "; " - . "override generateContentDiffBody to fix this." ); - } - - $otext = $old->serialize(); - $ntext = $new->serialize(); - - return $this->generateTextDiffBody( $otext, $ntext ); + $slotDiffRenderer = $new->getContentHandler()->getSlotDiffRenderer( $this->getContext() ); + if ( + $slotDiffRenderer instanceof DifferenceEngineSlotDiffRenderer + && $this->isSlotDiffRenderer + ) { + // Oops, we are just about to enter an infinite loop (the slot-level DifferenceEngine + // called a DifferenceEngineSlotDiffRenderer that wraps the same DifferenceEngine class). + // This will happen when a content model has no custom slot diff renderer, it does have + // a custom difference engine, but that does not override this method. + throw new Exception( get_class( $this ) . ': could not maintain backwards compatibility. ' + . 'Please use a SlotDiffRenderer.' ); + } + return $slotDiffRenderer->getDiff( $old, $new ) . $this->getDebugString(); } /** * Generate a diff, no caching * - * @todo move this to TextDifferenceEngine, make DifferenceEngine abstract. At some point. - * * @param string $otext Old text, must be already segmented * @param string $ntext New text, must be already segmented * + * @throws Exception If content handling for text content is configured in a way + * that makes maintaining B/C hard. * @return bool|string + * + * @deprecated since 1.32, use a TextSlotDiffRenderer instead. */ public function generateTextDiffBody( $otext, $ntext ) { - $diff = function () use ( $otext, $ntext ) { - $time = microtime( true ); - - $result = $this->textDiff( $otext, $ntext ); - - $time = intval( ( microtime( true ) - $time ) * 1000 ); - MediaWikiServices::getInstance()->getStatsdDataFactory()->timing( 'diff_time', $time ); - // Log requests slower than 99th percentile - if ( $time > 100 && $this->mOldPage && $this->mNewPage ) { - wfDebugLog( 'diff', - "$time ms diff: {$this->mOldid} -> {$this->mNewid} {$this->mNewPage}" ); - } - - return $result; - }; - - /** - * @param Status $status - * @throws FatalError - */ - $error = function ( $status ) { - throw new FatalError( $status->getWikiText() ); - }; - - // Use PoolCounter if the diff looks like it can be expensive - if ( strlen( $otext ) + strlen( $ntext ) > 20000 ) { - $work = new PoolCounterWorkViaCallback( 'diff', - md5( $otext ) . md5( $ntext ), - [ 'doWork' => $diff, 'error' => $error ] - ); - return $work->execute(); - } - - return $diff(); + $slotDiffRenderer = ContentHandler::getForModelID( CONTENT_MODEL_TEXT ) + ->getSlotDiffRenderer( $this->getContext() ); + if ( !( $slotDiffRenderer instanceof TextSlotDiffRenderer ) ) { + // Someone used the GetSlotDiffRenderer hook to replace the renderer. + // This is too unlikely to happen to bother handling properly. + throw new Exception( 'The slot diff renderer for text content should be a ' + . 'TextSlotDiffRenderer subclass' ); + } + return $slotDiffRenderer->getTextDiff( $otext, $ntext ) . $this->getDebugString(); } /** * Process $wgExternalDiffEngine and get a sane, usable engine * * @return bool|string 'wikidiff2', path to an executable, or false + * @internal For use by this class and TextSlotDiffRenderer only. */ - private function getEngine() { + public static function getEngine() { global $wgExternalDiffEngine; // We use the global here instead of Config because we write to the value, // and Config is not mutable. @@ -989,92 +1210,23 @@ class DifferenceEngine extends ContextSource { * * @param string $otext Old text, must be already segmented * @param string $ntext New text, must be already segmented + * + * @throws Exception If content handling for text content is configured in a way + * that makes maintaining B/C hard. * @return bool|string + * + * @deprecated since 1.32, use a TextSlotDiffRenderer instead. */ protected function textDiff( $otext, $ntext ) { - global $wgContLang; - - $otext = str_replace( "\r\n", "\n", $otext ); - $ntext = str_replace( "\r\n", "\n", $ntext ); - - $engine = $this->getEngine(); - - // Better external diff engine, the 2 may some day be dropped - // This one does the escaping and segmenting itself - if ( $engine === 'wikidiff2' ) { - $wikidiff2Version = phpversion( 'wikidiff2' ); - if ( - $wikidiff2Version !== false && - version_compare( $wikidiff2Version, '1.5.0', '>=' ) - ) { - $text = wikidiff2_do_diff( - $otext, - $ntext, - 2, - $this->getConfig()->get( 'WikiDiff2MovedParagraphDetectionCutoff' ) - ); - } else { - // Don't pass the 4th parameter for compatibility with older versions of wikidiff2 - $text = wikidiff2_do_diff( - $otext, - $ntext, - 2 - ); - - // Log a warning in case the configuration value is set to not silently ignore it - if ( $this->getConfig()->get( 'WikiDiff2MovedParagraphDetectionCutoff' ) > 0 ) { - wfLogWarning( '$wgWikiDiff2MovedParagraphDetectionCutoff is set but has no - effect since the used version of WikiDiff2 does not support it.' ); - } - } - - $text .= $this->debug( 'wikidiff2' ); - - return $text; - } elseif ( $engine !== false ) { - # Diff via the shell - $tmpDir = wfTempDir(); - $tempName1 = tempnam( $tmpDir, 'diff_' ); - $tempName2 = tempnam( $tmpDir, 'diff_' ); - - $tempFile1 = fopen( $tempName1, "w" ); - if ( !$tempFile1 ) { - return false; - } - $tempFile2 = fopen( $tempName2, "w" ); - if ( !$tempFile2 ) { - return false; - } - fwrite( $tempFile1, $otext ); - fwrite( $tempFile2, $ntext ); - fclose( $tempFile1 ); - fclose( $tempFile2 ); - $cmd = [ $engine, $tempName1, $tempName2 ]; - $result = Shell::command( $cmd ) - ->execute(); - $exitCode = $result->getExitCode(); - if ( $exitCode !== 0 ) { - throw new Exception( "External diff command returned code {$exitCode}. Stderr: " - . wfEscapeWikiText( $result->getStderr() ) - ); - } - $difftext = $result->getStdout(); - $difftext .= $this->debug( "external $engine" ); - unlink( $tempName1 ); - unlink( $tempName2 ); - - return $difftext; - } - - # Native PHP diff - $ota = explode( "\n", $wgContLang->segmentForDiff( $otext ) ); - $nta = explode( "\n", $wgContLang->segmentForDiff( $ntext ) ); - $diffs = new Diff( $ota, $nta ); - $formatter = new TableDiffFormatter(); - $difftext = $wgContLang->unsegmentForDiff( $formatter->format( $diffs ) ); - $difftext .= $this->debug( 'native PHP' ); - - return $difftext; + $slotDiffRenderer = ContentHandler::getForModelID( CONTENT_MODEL_TEXT ) + ->getSlotDiffRenderer( $this->getContext() ); + if ( !( $slotDiffRenderer instanceof TextSlotDiffRenderer ) ) { + // Someone used the GetSlotDiffRenderer hook to replace the renderer. + // This is too unlikely to happen to bother handling properly. + throw new Exception( 'The slot diff renderer for text content should be a ' + . 'TextSlotDiffRenderer subclass' ); + } + return $slotDiffRenderer->getTextDiff( $otext, $ntext ) . $this->getDebugString(); } /** @@ -1101,6 +1253,17 @@ class DifferenceEngine extends ContextSource { " -->\n"; } + private function getDebugString() { + $engine = self::getEngine(); + if ( $engine === 'wikidiff2' ) { + return $this->debug( 'wikidiff2' ); + } elseif ( $engine === false ) { + return $this->debug( 'native PHP' ); + } else { + return $this->debug( "external $engine" ); + } + } + /** * Localise diff output * @@ -1171,10 +1334,12 @@ class DifferenceEngine extends ContextSource { * @return string */ public function getMultiNotice() { - if ( !is_object( $this->mOldRev ) || !is_object( $this->mNewRev ) ) { - return ''; - } elseif ( !$this->mOldPage->equals( $this->mNewPage ) ) { - // Comparing two different pages? Count would be meaningless. + // The notice only make sense if we are diffing two saved revisions of the same page. + if ( + !$this->mOldRev || !$this->mNewRev + || !$this->mOldPage || !$this->mNewPage + || !$this->mOldPage->equals( $this->mNewPage ) + ) { return ''; } @@ -1354,6 +1519,7 @@ class DifferenceEngine extends ContextSource { * @param Content $oldContent * @param Content $newContent * @since 1.21 + * @deprecated since 1.32, use setRevisions or ContentHandler::getSlotDiffRenderer. */ public function setContent( Content $oldContent, Content $newContent ) { $this->mOldContent = $oldContent; @@ -1362,6 +1528,38 @@ class DifferenceEngine extends ContextSource { $this->mTextLoaded = 2; $this->mRevisionsLoaded = true; $this->isContentOverridden = true; + $this->slotDiffRenderers = null; + } + + /** + * Use specified text instead of loading from the database. + * @param RevisionRecord|null $oldRevision + * @param RevisionRecord $newRevision + */ + public function setRevisions( + RevisionRecord $oldRevision = null, RevisionRecord $newRevision + ) { + if ( $oldRevision ) { + $this->mOldRev = new Revision( $oldRevision ); + $this->mOldid = $oldRevision->getId(); + $this->mOldPage = Title::newFromLinkTarget( $oldRevision->getPageAsLinkTarget() ); + // This method is meant for edit diffs and such so there is no reason to provide a + // revision that's not readable to the user, but check it just in case. + $this->mOldContent = $oldRevision ? $oldRevision->getContent( 'main', + RevisionRecord::FOR_THIS_USER, $this->getUser() ) : null; + } else { + $this->mOldRev = $this->mOldid = $this->mOldPage = null; + } + $this->mNewRev = new Revision( $newRevision ); + $this->mNewid = $newRevision->getId(); + $this->mNewPage = Title::newFromLinkTarget( $newRevision->getPageAsLinkTarget() ); + $this->mNewContent = $newRevision->getContent( 'main', + RevisionRecord::FOR_THIS_USER, $this->getUser() ); + + $this->mRevisionsIdsLoaded = $this->mRevisionsLoaded = true; + $this->mTextLoaded = !!$oldRevision + 1; + $this->isContentOverridden = false; + $this->slotDiffRenderers = null; } /** @@ -1470,7 +1668,11 @@ class DifferenceEngine extends ContextSource { // Update the new revision ID in case it was 0 (makes life easier doing UI stuff) $this->mNewid = $this->mNewRev->getId(); - $this->mNewPage = $this->mNewRev->getTitle(); + if ( $this->mNewid ) { + $this->mNewPage = $this->mNewRev->getTitle(); + } else { + $this->mNewPage = null; + } // Load the old revision object $this->mOldRev = false; @@ -1492,8 +1694,10 @@ class DifferenceEngine extends ContextSource { return false; } - if ( $this->mOldRev ) { + if ( $this->mOldRev && $this->mOldRev->getId() ) { $this->mOldPage = $this->mOldRev->getTitle(); + } else { + $this->mOldPage = null; } // Load tags information for both revisions diff --git a/includes/diff/DifferenceEngineSlotDiffRenderer.php b/includes/diff/DifferenceEngineSlotDiffRenderer.php new file mode 100644 index 0000000000..0c632b97ec --- /dev/null +++ b/includes/diff/DifferenceEngineSlotDiffRenderer.php @@ -0,0 +1,79 @@ +differenceEngine = clone $differenceEngine; + + // Set state to loaded. This should not matter to any of the methods invoked by + // the adapter, but just in case a load does get triggered somehow, make sure it's a no-op. + $fakeContent = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT )->makeEmptyContent(); + $this->differenceEngine->setContent( $fakeContent, $fakeContent ); + + $this->differenceEngine->markAsSlotDiffRenderer(); + } + + /** @inheritDoc */ + public function getDiff( Content $oldContent = null, Content $newContent = null ) { + if ( !$oldContent && !$newContent ) { + throw new InvalidArgumentException( '$oldContent and $newContent cannot both be null' ); + } + if ( !$oldContent || !$newContent ) { + $someContent = $newContent ?: $oldContent; + $emptyContent = $someContent->getContentHandler()->makeEmptyContent(); + $oldContent = $oldContent ?: $emptyContent; + $newContent = $newContent ?: $emptyContent; + } + return $this->differenceEngine->generateContentDiffBody( $oldContent, $newContent ); + } + + public function addModules( OutputPage $output ) { + $oldContext = null; + if ( $output !== $this->differenceEngine->getOutput() ) { + $oldContext = $this->differenceEngine->getContext(); + $newContext = new DerivativeContext( $oldContext ); + $newContext->setOutput( $output ); + $this->differenceEngine->setContext( $newContext ); + } + $this->differenceEngine->showDiffStyle(); + if ( $oldContext ) { + $this->differenceEngine->setContext( $oldContext ); + } + } + + public function getExtraCacheKeys() { + return $this->differenceEngine->getExtraCacheKeys(); + } + +} diff --git a/includes/diff/SlotDiffRenderer.php b/includes/diff/SlotDiffRenderer.php new file mode 100644 index 0000000000..f20b4169db --- /dev/null +++ b/includes/diff/SlotDiffRenderer.php @@ -0,0 +1,65 @@ +getSlotDiffRenderer( RequestContext::getMain() ) + * + * @ingroup DifferenceEngine + */ +class TextSlotDiffRenderer extends SlotDiffRenderer { + + /** Use the PHP diff implementation (DiffEngine). */ + const ENGINE_PHP = 'php'; + + /** Use the wikidiff2 PHP module. */ + const ENGINE_WIKIDIFF2 = 'wikidiff2'; + + /** Use an external executable. */ + const ENGINE_EXTERNAL = 'external'; + + /** @var IBufferingStatsdDataFactory|null */ + private $statsdDataFactory; + + /** @var Language|null The language this content is in. */ + private $language; + + /** + * Number of paragraph moves the algorithm should attempt to detect. + * Only used with the wikidiff2 engine. + * @var int + * @see $wgWikiDiff2MovedParagraphDetectionCutoff + */ + private $wikiDiff2MovedParagraphDetectionCutoff = 0; + + /** @var string One of the ENGINE_* constants. */ + private $engine = self::ENGINE_PHP; + + /** @var string Path to an executable to be used as the diff engine. */ + private $externalEngine; + + /** + * Convenience helper to use getTextDiff without an instance. + * @param string $oldText + * @param string $newText + * @return string + */ + public static function diff( $oldText, $newText ) { + /** @var $slotDiffRenderer TextSlotDiffRenderer */ + $slotDiffRenderer = ContentHandler::getForModelID( CONTENT_MODEL_TEXT ) + ->getSlotDiffRenderer( RequestContext::getMain() ); + return $slotDiffRenderer->getTextDiff( $oldText, $newText ); + } + + public function setStatsdDataFactory( IBufferingStatsdDataFactory $statsdDataFactory ) { + $this->statsdDataFactory = $statsdDataFactory; + } + + public function setLanguage( Language $language ) { + $this->language = $language; + } + /** + * @param int $cutoff + * @see $wgWikiDiff2MovedParagraphDetectionCutoff + */ + public function setWikiDiff2MovedParagraphDetectionCutoff( $cutoff ) { + Assert::parameterType( 'integer', $cutoff, '$cutoff' ); + $this->wikiDiff2MovedParagraphDetectionCutoff = $cutoff; + } + + /** + * Set which diff engine to use. + * @param string $type One of the ENGINE_* constants. + * @param string|null $executable Path to an external exectable, only when type is ENGINE_EXTERNAL. + */ + public function setEngine( $type, $executable = null ) { + $engines = [ self::ENGINE_PHP, self::ENGINE_WIKIDIFF2, self::ENGINE_EXTERNAL ]; + Assert::parameter( in_array( $type, $engines, true ), '$type', + 'must be one of the TextSlotDiffRenderer::ENGINE_* constants' ); + if ( $type === self::ENGINE_EXTERNAL ) { + Assert::parameter( is_string( $executable ) && is_executable( $executable ), '$executable', + 'must be a path to a valid executable' ); + } else { + Assert::parameter( is_null( $executable ), '$executable', + 'must not be set unless $type is ENGINE_EXTERNAL' ); + } + $this->engine = $type; + $this->externalEngine = $executable; + } + + /** @inheritDoc */ + public function getDiff( Content $oldContent = null, Content $newContent = null ) { + if ( !$oldContent && !$newContent ) { + throw new InvalidArgumentException( '$oldContent and $newContent cannot both be null' ); + } elseif ( $oldContent && !( $oldContent instanceof TextContent ) ) { + throw new InvalidArgumentException( __CLASS__ . ' does not handle ' . get_class( $oldContent ) ); + } elseif ( $newContent && !( $newContent instanceof TextContent ) ) { + throw new InvalidArgumentException( __CLASS__ . ' does not handle ' . get_class( $newContent ) ); + } + + if ( !$oldContent ) { + $oldContent = $newContent->getContentHandler()->makeEmptyContent(); + } elseif ( !$newContent ) { + $newContent = $oldContent->getContentHandler()->makeEmptyContent(); + } + + $oldText = $oldContent->serialize(); + $newText = $newContent->serialize(); + + return $this->getTextDiff( $oldText, $newText ); + } + + /** + * Diff the text representations of two content objects (or just two pieces of text in general). + * @param string $oldText + * @param string $newText + * @return string + */ + public function getTextDiff( $oldText, $newText ) { + Assert::parameterType( 'string', $oldText, '$oldText' ); + Assert::parameterType( 'string', $newText, '$newText' ); + + $diff = function () use ( $oldText, $newText ) { + $time = microtime( true ); + + $result = $this->getTextDiffInternal( $oldText, $newText ); + + $time = intval( ( microtime( true ) - $time ) * 1000 ); + if ( $this->statsdDataFactory ) { + $this->statsdDataFactory->timing( 'diff_time', $time ); + } + + // TODO reimplement this using T142313 + /* + // Log requests slower than 99th percentile + if ( $time > 100 && $this->mOldPage && $this->mNewPage ) { + wfDebugLog( 'diff', + "$time ms diff: {$this->mOldid} -> {$this->mNewid} {$this->mNewPage}" ); + } + */ + + return $result; + }; + + /** + * @param Status $status + * @throws FatalError + */ + $error = function ( $status ) { + throw new FatalError( $status->getWikiText() ); + }; + + // Use PoolCounter if the diff looks like it can be expensive + if ( strlen( $oldText ) + strlen( $newText ) > 20000 ) { + $work = new PoolCounterWorkViaCallback( 'diff', + md5( $oldText ) . md5( $newText ), + [ 'doWork' => $diff, 'error' => $error ] + ); + return $work->execute(); + } + + return $diff(); + } + + /** + * Diff the text representations of two content objects (or just two pieces of text in general). + * This does the actual diffing, getTextDiff() wraps it with logging and resource limiting. + * @param string $oldText + * @param string $newText + * @return string + * @throws Exception + */ + protected function getTextDiffInternal( $oldText, $newText ) { + // TODO move most of this into three parallel implementations of a text diff generator + // class, choose which one to use via dependecy injection + + $oldText = str_replace( "\r\n", "\n", $oldText ); + $newText = str_replace( "\r\n", "\n", $newText ); + + // Better external diff engine, the 2 may some day be dropped + // This one does the escaping and segmenting itself + if ( $this->engine === self::ENGINE_WIKIDIFF2 ) { + $wikidiff2Version = phpversion( 'wikidiff2' ); + if ( + $wikidiff2Version !== false && + version_compare( $wikidiff2Version, '1.5.0', '>=' ) + ) { + $text = wikidiff2_do_diff( + $oldText, + $newText, + 2, + $this->wikiDiff2MovedParagraphDetectionCutoff + ); + } else { + // Don't pass the 4th parameter for compatibility with older versions of wikidiff2 + $text = wikidiff2_do_diff( + $oldText, + $newText, + 2 + ); + + // Log a warning in case the configuration value is set to not silently ignore it + if ( $this->wikiDiff2MovedParagraphDetectionCutoff > 0 ) { + wfLogWarning( '$wgWikiDiff2MovedParagraphDetectionCutoff is set but has no + effect since the used version of WikiDiff2 does not support it.' ); + } + } + + return $text; + } elseif ( $this->engine === self::ENGINE_EXTERNAL ) { + # Diff via the shell + $tmpDir = wfTempDir(); + $tempName1 = tempnam( $tmpDir, 'diff_' ); + $tempName2 = tempnam( $tmpDir, 'diff_' ); + + $tempFile1 = fopen( $tempName1, "w" ); + if ( !$tempFile1 ) { + return false; + } + $tempFile2 = fopen( $tempName2, "w" ); + if ( !$tempFile2 ) { + return false; + } + fwrite( $tempFile1, $oldText ); + fwrite( $tempFile2, $newText ); + fclose( $tempFile1 ); + fclose( $tempFile2 ); + $cmd = [ $this->externalEngine, $tempName1, $tempName2 ]; + $result = Shell::command( $cmd ) + ->execute(); + $exitCode = $result->getExitCode(); + if ( $exitCode !== 0 ) { + throw new Exception( "External diff command returned code {$exitCode}. Stderr: " + . wfEscapeWikiText( $result->getStderr() ) + ); + } + $difftext = $result->getStdout(); + unlink( $tempName1 ); + unlink( $tempName2 ); + + return $difftext; + } elseif ( $this->engine === self::ENGINE_PHP ) { + if ( $this->language ) { + $oldText = $this->language->segmentForDiff( $oldText ); + $newText = $this->language->segmentForDiff( $newText ); + } + $ota = explode( "\n", $oldText ); + $nta = explode( "\n", $newText ); + $diffs = new Diff( $ota, $nta ); + $formatter = new TableDiffFormatter(); + $difftext = $formatter->format( $diffs ); + if ( $this->language ) { + $difftext = $this->language->unsegmentForDiff( $difftext ); + } + + return $difftext; + } + throw new LogicException( 'Invalid engine: ' . $this->engine ); + } + +} diff --git a/includes/editpage/TextConflictHelper.php b/includes/editpage/TextConflictHelper.php index b447b18f94..f7d0945ec4 100644 --- a/includes/editpage/TextConflictHelper.php +++ b/includes/editpage/TextConflictHelper.php @@ -165,10 +165,10 @@ class TextConflictHelper { /** * HTML to build the textbox1 on edit conflicts * - * @param mixed[]|null $customAttribs + * @param array $customAttribs * @return string HTML */ - public function getEditConflictMainTextBox( $customAttribs = [] ) { + public function getEditConflictMainTextBox( array $customAttribs = [] ) { $builder = new TextboxBuilder(); $classes = $builder->getTextboxProtectionCSSClasses( $this->title ); diff --git a/includes/export/XmlDumpWriter.php b/includes/export/XmlDumpWriter.php index e1c12de1b9..e6f1fd76f9 100644 --- a/includes/export/XmlDumpWriter.php +++ b/includes/export/XmlDumpWriter.php @@ -23,6 +23,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * @ingroup Dump */ @@ -38,7 +40,6 @@ class XmlDumpWriter { * @return string */ function openStream() { - global $wgContLang; $ver = WikiExporter::schemaVersion(); return Xml::element( 'mediawiki', [ 'xmlns' => "http://www.mediawiki.org/xml/export-$ver/", @@ -55,8 +56,8 @@ class XmlDumpWriter { */ 'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " . "http://www.mediawiki.org/xml/export-$ver.xsd", - 'version' => $ver, - 'xml:lang' => $wgContLang->getHtmlCode() ], + 'version' => $ver, + 'xml:lang' => MediaWikiServices::getInstance()->getContentLanguage()->getHtmlCode() ], null ) . "\n" . $this->siteInfo(); @@ -123,9 +124,11 @@ class XmlDumpWriter { * @return string */ function namespaces() { - global $wgContLang; $spaces = "\n"; - foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) { + foreach ( + MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces() + as $ns => $title + ) { $spaces .= ' ' . Xml::element( 'namespace', [ @@ -434,8 +437,8 @@ class XmlDumpWriter { return $title->getPrefixedText(); } - global $wgContLang; - $prefix = $wgContLang->getFormattedNsText( $title->getNamespace() ); + $prefix = MediaWikiServices::getInstance()->getContentLanguage()-> + getFormattedNsText( $title->getNamespace() ); // @todo Emit some kind of warning to the user if $title->getNamespace() !== // NS_MAIN and $prefix === '' (viz. pages in an unregistered namespace) diff --git a/includes/externalstore/ExternalStoreDB.php b/includes/externalstore/ExternalStoreDB.php index 422e1fb553..75f7ccdfab 100644 --- a/includes/externalstore/ExternalStoreDB.php +++ b/includes/externalstore/ExternalStoreDB.php @@ -21,10 +21,11 @@ */ use MediaWiki\MediaWikiServices; -use Wikimedia\Rdbms\LoadBalancer; +use Wikimedia\Rdbms\ILoadBalancer; use Wikimedia\Rdbms\IDatabase; use Wikimedia\Rdbms\DBConnRef; use Wikimedia\Rdbms\MaintainableDBConnRef; +use Wikimedia\Rdbms\DatabaseDomain; /** * DB accessible external objects. @@ -112,7 +113,7 @@ class ExternalStoreDB extends ExternalStoreMedium { * Get a LoadBalancer for the specified cluster * * @param string $cluster Cluster name - * @return LoadBalancer + * @return ILoadBalancer */ private function getLoadBalancer( $cluster ) { $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); @@ -128,8 +129,8 @@ class ExternalStoreDB extends ExternalStoreMedium { public function getSlave( $cluster ) { global $wgDefaultExternalStore; - $wiki = $this->params['wiki'] ?? false; $lb = $this->getLoadBalancer( $cluster ); + $domainId = $this->getDomainId( $lb->getServerInfo( $lb->getWriterIndex() ) ); if ( !in_array( "DB://" . $cluster, (array)$wgDefaultExternalStore ) ) { wfDebug( "read only external store\n" ); @@ -138,7 +139,7 @@ class ExternalStoreDB extends ExternalStoreMedium { wfDebug( "writable external store\n" ); } - $db = $lb->getConnectionRef( DB_REPLICA, [], $wiki ); + $db = $lb->getConnectionRef( DB_REPLICA, [], $domainId ); $db->clearFlag( DBO_TRX ); // sanity return $db; @@ -151,15 +152,42 @@ class ExternalStoreDB extends ExternalStoreMedium { * @return MaintainableDBConnRef */ public function getMaster( $cluster ) { - $wiki = $this->params['wiki'] ?? false; $lb = $this->getLoadBalancer( $cluster ); + $domainId = $this->getDomainId( $lb->getServerInfo( $lb->getWriterIndex() ) ); - $db = $lb->getMaintenanceConnectionRef( DB_MASTER, [], $wiki ); + $db = $lb->getMaintenanceConnectionRef( DB_MASTER, [], $domainId ); $db->clearFlag( DBO_TRX ); // sanity return $db; } + /** + * @param array $server Master DB server configuration array for LoadBalancer + * @return string|bool Database domain ID or false + */ + private function getDomainId( array $server ) { + if ( isset( $this->params['wiki'] ) ) { + return $this->params['wiki']; // explicit domain + } + + if ( isset( $server['dbname'] ) ) { + // T200471: for b/c, treat any "dbname" field as forcing which database to use. + // MediaWiki/LoadBalancer previously did not enforce any concept of a local DB + // domain, but rather assumed that the LB server configuration matched $wgDBname. + // This check is useful when the external storage DB for this cluster does not use + // the same name as the corresponding "main" DB(s) for wikis. + $domain = new DatabaseDomain( + $server['dbname'], + $server['schema'] ?? null, + $server['tablePrefix'] ?? '' + ); + + return $domain->getId(); + } + + return false; // local LB domain + } + /** * Get the 'blobs' table name for this database * diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php index 3d9a904bf5..858e124af4 100644 --- a/includes/filerepo/FileRepo.php +++ b/includes/filerepo/FileRepo.php @@ -7,6 +7,8 @@ * @details */ +use MediaWiki\MediaWikiServices; + /** * Base code for file repositories. * @@ -638,11 +640,10 @@ class FileRepo { * @return string */ public function getNameFromTitle( Title $title ) { - global $wgContLang; if ( $this->initialCapital != MWNamespace::isCapitalized( NS_FILE ) ) { $name = $title->getUserCaseDBKey(); if ( $this->initialCapital ) { - $name = $wgContLang->ucfirst( $name ); + $name = MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $name ); } } else { $name = $title->getDBkey(); @@ -1350,7 +1351,7 @@ class FileRepo { } /** - * Checks existence of a a file + * Checks existence of a file * * @param string $file Virtual URL (or storage path) of file to check * @return bool diff --git a/includes/filerepo/LocalRepo.php b/includes/filerepo/LocalRepo.php index 9a6ef22f17..c889e56723 100644 --- a/includes/filerepo/LocalRepo.php +++ b/includes/filerepo/LocalRepo.php @@ -278,7 +278,7 @@ class LocalRepo extends FileRepo { $applyMatchingFiles = function ( ResultWrapper $res, &$searchSet, &$finalFiles ) use ( $fileMatchesSearch, $flags ) { - global $wgContLang; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $info = $this->getInfo(); foreach ( $res as $row ) { $file = $this->newFileFromRow( $row ); @@ -287,7 +287,7 @@ class LocalRepo extends FileRepo { $dbKeysLook = [ strtr( $file->getName(), ' ', '_' ) ]; if ( !empty( $info['initialCapital'] ) ) { // Search keys for "hi.png" and "Hi.png" should use the "Hi.png file" - $dbKeysLook[] = $wgContLang->lcfirst( $file->getName() ); + $dbKeysLook[] = $contLang->lcfirst( $file->getName() ); } foreach ( $dbKeysLook as $dbKey ) { if ( isset( $searchSet[$dbKey] ) diff --git a/includes/filerepo/file/File.php b/includes/filerepo/file/File.php index 370ebb406b..5a0cf6a621 100644 --- a/includes/filerepo/file/File.php +++ b/includes/filerepo/file/File.php @@ -2051,17 +2051,17 @@ abstract class File implements IDBAccessObject { /** * Get the HTML text of the description page, if available * - * @param bool|Language $lang Optional language to fetch description in + * @param Language|null $lang Optional language to fetch description in * @return string|false */ - function getDescriptionText( $lang = false ) { + function getDescriptionText( Language $lang = null ) { global $wgLang; if ( !$this->repo || !$this->repo->fetchDescription ) { return false; } - $lang = $lang ?: $wgLang; + $lang = $lang ?? $wgLang; $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() ); if ( $renderUrl ) { diff --git a/includes/filerepo/file/ForeignAPIFile.php b/includes/filerepo/file/ForeignAPIFile.php index 0e48195c6e..fd3dc8bba6 100644 --- a/includes/filerepo/file/ForeignAPIFile.php +++ b/includes/filerepo/file/ForeignAPIFile.php @@ -355,12 +355,12 @@ class ForeignAPIFile extends File { } function purgeDescriptionPage() { - global $wgContLang; - - $url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() ); + $services = MediaWikiServices::getInstance(); + $url = $this->repo->getDescriptionRenderUrl( + $this->getName(), $services->getContentLanguage()->getCode() ); $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) ); - MediaWikiServices::getInstance()->getMainWANObjectCache()->delete( $key ); + $services->getMainWANObjectCache()->delete( $key ); } /** diff --git a/includes/filerepo/file/ForeignDBFile.php b/includes/filerepo/file/ForeignDBFile.php index 7a982bd34f..ee4df1d351 100644 --- a/includes/filerepo/file/ForeignDBFile.php +++ b/includes/filerepo/file/ForeignDBFile.php @@ -126,14 +126,14 @@ class ForeignDBFile extends LocalFile { * @param Language|null $lang Optional language to fetch description in. * @return string|false */ - function getDescriptionText( $lang = null ) { + function getDescriptionText( Language $lang = null ) { global $wgLang; if ( !$this->repo->fetchDescription ) { return false; } - $lang = $lang ?: $wgLang; + $lang = $lang ?? $wgLang; $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() ); if ( !$renderUrl ) { return false; diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index 742d78d3bb..7920e9cb4b 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -2115,7 +2115,7 @@ class LocalFile extends File { * @param Language|null $lang What language to get description in (Optional) * @return string|false */ - function getDescriptionText( $lang = null ) { + function getDescriptionText( Language $lang = null ) { $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL ); if ( !$revision ) { return false; @@ -3146,7 +3146,7 @@ class LocalFileRestoreBatch { /** * Cleanup a failed batch. The batch was only partially successful, so - * rollback by removing all items that were succesfully copied. + * rollback by removing all items that were successfully copied. * * @param Status $storeStatus * @param array[] $storeBatch diff --git a/includes/gallery/ImageGalleryBase.php b/includes/gallery/ImageGalleryBase.php index 09e40a2821..6e8c8c9ab7 100644 --- a/includes/gallery/ImageGalleryBase.php +++ b/includes/gallery/ImageGalleryBase.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * Image gallery * @@ -99,7 +101,6 @@ abstract class ImageGalleryBase extends ContextSource { * @throws MWException */ static function factory( $mode = false, IContextSource $context = null ) { - global $wgContLang; self::loadModes(); if ( !$context ) { $context = RequestContext::getMainAndWarn( __METHOD__ ); @@ -109,7 +110,7 @@ abstract class ImageGalleryBase extends ContextSource { $mode = $galleryOptions['mode']; } - $mode = $wgContLang->lc( $mode ); + $mode = MediaWikiServices::getInstance()->getContentLanguage()->lc( $mode ); if ( isset( self::$modeMapping[$mode] ) ) { $class = self::$modeMapping[$mode]; diff --git a/includes/gallery/PackedImageGallery.php b/includes/gallery/PackedImageGallery.php index 2e4836a583..d1c945528d 100644 --- a/includes/gallery/PackedImageGallery.php +++ b/includes/gallery/PackedImageGallery.php @@ -28,7 +28,7 @@ class PackedImageGallery extends TraditionalImageGallery { } /** - * We artificially have 1.5 the resolution neccessary so that + * We artificially have 1.5 the resolution necessary so that * we can scale it up by that much on the client side, without * worrying about requesting a new image. */ diff --git a/includes/gallery/TraditionalImageGallery.php b/includes/gallery/TraditionalImageGallery.php index 479ca5d9bd..5ede631aa3 100644 --- a/includes/gallery/TraditionalImageGallery.php +++ b/includes/gallery/TraditionalImageGallery.php @@ -170,8 +170,8 @@ class TraditionalImageGallery extends ImageGalleryBase { } // @todo Code is incomplete. - // $linkTarget = Title::newFromText( $wgContLang->getNsText( MWNamespace::getUser() ) . - // ":{$ut}" ); + // $linkTarget = Title::newFromText( MediaWikiServices::getInstance()-> + // getContentLanguage()->getNsText( MWNamespace::getUser() ) . ":{$ut}" ); // $ul = Linker::link( $linkTarget, $ut ); $meta = []; diff --git a/includes/htmlform/HTMLForm.php b/includes/htmlform/HTMLForm.php index 442a7cf6fa..0fa0406396 100644 --- a/includes/htmlform/HTMLForm.php +++ b/includes/htmlform/HTMLForm.php @@ -76,6 +76,9 @@ use Wikimedia\ObjectFactory; * 'help-messages' -- array of message keys/objects. As above, each item can * be an array of msg key and then parameters. * Overwrites 'help'. + * 'help-inline' -- Whether help text (defined using options above) will be shown + * inline after the input field, rather than in a popup. + * Defaults to true. Only used by OOUI form fields. * 'notice' -- message text for a message to use as a notice in the field. * Currently used by OOUI form fields only. * 'notice-messages' -- array of message keys/objects to use for notice. diff --git a/includes/htmlform/HTMLFormField.php b/includes/htmlform/HTMLFormField.php index 97e4b50551..f5d6e8cbb5 100644 --- a/includes/htmlform/HTMLFormField.php +++ b/includes/htmlform/HTMLFormField.php @@ -619,6 +619,7 @@ abstract class HTMLFormField { 'errors' => $errors, 'notices' => $notices, 'infusable' => $infusable, + 'helpInline' => $this->isHelpInline(), ]; $preloadModules = false; @@ -679,8 +680,8 @@ abstract class HTMLFormField { * @return bool */ protected function shouldInfuseOOUI() { - // Always infuse fields with help text, since the interface for it is nicer with JS - return $this->getHelpText() !== null; + // Always infuse fields with popup help text, since the interface for it is nicer with JS + return $this->getHelpText() !== null && !$this->isHelpInline(); } /** @@ -851,6 +852,18 @@ abstract class HTMLFormField { return $helptext; } + /** + * Determine if the help text should be displayed inline. + * + * Only applies to OOUI forms. + * + * @since 1.31 + * @return bool + */ + public function isHelpInline() { + return isset( $this->mParams['help-inline'] ) ? $this->mParams['help-inline'] : true; + } + /** * Determine form errors to display and their classes * @since 1.20 diff --git a/includes/htmlform/HTMLNestedFilterable.php b/includes/htmlform/HTMLNestedFilterable.php index d44fc60abe..a68ab62dad 100644 --- a/includes/htmlform/HTMLNestedFilterable.php +++ b/includes/htmlform/HTMLNestedFilterable.php @@ -2,7 +2,7 @@ interface HTMLNestedFilterable { /** - * Support for seperating multi-option preferences into multiple preferences + * Support for separating multi-option preferences into multiple preferences * Due to lack of array support. * * @param array $data diff --git a/includes/htmlform/fields/HTMLButtonField.php b/includes/htmlform/fields/HTMLButtonField.php index 7f7f718a60..84719a7add 100644 --- a/includes/htmlform/fields/HTMLButtonField.php +++ b/includes/htmlform/fields/HTMLButtonField.php @@ -34,6 +34,11 @@ class HTMLButtonField extends HTMLFormField { public function __construct( $info ) { $info['nodata'] = true; + + $this->setShowEmptyLabel( false ); + + parent::__construct( $info ); + if ( isset( $info['flags'] ) ) { $this->mFlags = $info['flags']; } @@ -55,10 +60,6 @@ class HTMLButtonField extends HTMLFormField { } elseif ( isset( $info['buttonlabel-raw'] ) ) { $this->buttonLabel = $info['buttonlabel-raw']; } - - $this->setShowEmptyLabel( false ); - - parent::__construct( $info ); } public function getInputHTML( $value ) { diff --git a/includes/htmlform/fields/HTMLTitleTextField.php b/includes/htmlform/fields/HTMLTitleTextField.php index 0ad41d43bd..93d09e7f14 100644 --- a/includes/htmlform/fields/HTMLTitleTextField.php +++ b/includes/htmlform/fields/HTMLTitleTextField.php @@ -1,5 +1,6 @@ getNsText( $this->mParams['namespace'] ); + $namespaceName = MediaWikiServices::getInstance()->getContentLanguage()-> + getNsText( $this->mParams['namespace'] ); $title = Title::newFromTextThrow( $namespaceName . ':' . $value ); } } catch ( MalformedTitleException $e ) { diff --git a/includes/import/WikiImporter.php b/includes/import/WikiImporter.php index e5dacd70bc..00a7b52992 100644 --- a/includes/import/WikiImporter.php +++ b/includes/import/WikiImporter.php @@ -24,6 +24,8 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; + /** * XML file reader for the page data importer. * @@ -286,11 +288,10 @@ class WikiImporter { $status->fatal( 'import-rootpage-invalid' ); } else { if ( !MWNamespace::hasSubpages( $title->getNamespace() ) ) { - global $wgContLang; - $displayNSText = $title->getNamespace() == NS_MAIN ? wfMessage( 'blanknamespace' )->text() - : $wgContLang->getNsText( $title->getNamespace() ); + : MediaWikiServices::getInstance()->getContentLanguage()-> + getNsText( $title->getNamespace() ); $status->fatal( 'import-rootpage-nosubpage', $displayNSText ); } else { // set namespace to 'all', so the namespace check in processTitle() can pass diff --git a/includes/installer/CliInstaller.php b/includes/installer/CliInstaller.php index 4f531dae52..aee51e78cd 100644 --- a/includes/installer/CliInstaller.php +++ b/includes/installer/CliInstaller.php @@ -21,6 +21,8 @@ * @ingroup Deployment */ +use MediaWiki\MediaWikiServices; + /** * Class for the core installer command line interface. * @@ -69,9 +71,9 @@ class CliInstaller extends Installer { if ( isset( $option['lang'] ) ) { global $wgLang, $wgLanguageCode; $this->setVar( '_UserLang', $option['lang'] ); - $wgContLang = Language::factory( $option['lang'] ); - $wgLang = Language::factory( $option['lang'] ); $wgLanguageCode = $option['lang']; + $wgContLang = MediaWikiServices::getInstance()->getContentLanguage(); + $wgLang = Language::factory( $option['lang'] ); RequestContext::getMain()->setLanguage( $wgLang ); } diff --git a/includes/installer/MssqlUpdater.php b/includes/installer/MssqlUpdater.php index 50c4517939..6ebf95e261 100644 --- a/includes/installer/MssqlUpdater.php +++ b/includes/installer/MssqlUpdater.php @@ -144,6 +144,7 @@ class MssqlUpdater extends DatabaseUpdater { [ 'addIndex', 'protected_titles', 'PRIMARY', 'patch-protected_titles-pk.sql' ], [ 'addIndex', 'page_props', 'PRIMARY', 'patch-page_props-pk.sql' ], [ 'addIndex', 'site_identifiers', 'PRIMARY', 'patch-site_identifiers-pk.sql' ], + [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ], ]; } diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php index 99d6b35bd9..408f2fbb36 100644 --- a/includes/installer/MysqlUpdater.php +++ b/includes/installer/MysqlUpdater.php @@ -367,6 +367,7 @@ class MysqlUpdater extends DatabaseUpdater { 'patch-protected_titles-fix-pk.sql' ], [ 'renameIndex', 'site_identifiers', 'site_ids_type', 'PRIMARY', false, 'patch-site_identifiers-fix-pk.sql' ], + [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ], ]; } @@ -756,8 +757,9 @@ class MysqlUpdater extends DatabaseUpdater { 'Converting links and brokenlinks tables to pagelinks' ); - global $wgContLang; - foreach ( $wgContLang->getNamespaces() as $ns => $name ) { + foreach ( + MediaWikiServices::getInstance()->getContentLanguage()->getNamespaces() as $ns => $name + ) { if ( $ns == 0 ) { continue; } diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php index c9ed53f8e7..fbb7696b07 100644 --- a/includes/installer/OracleUpdater.php +++ b/includes/installer/OracleUpdater.php @@ -155,6 +155,7 @@ class OracleUpdater extends DatabaseUpdater { [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ], [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ], [ 'populateContentTables' ], + [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ], // KEEP THIS AT THE BOTTOM!! [ 'doRebuildDuplicateFunction' ], diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php index 932c9412fa..e8663fbbe3 100644 --- a/includes/installer/PostgresUpdater.php +++ b/includes/installer/PostgresUpdater.php @@ -590,6 +590,7 @@ class PostgresUpdater extends DatabaseUpdater { [ 'addIndex', 'interwiki', 'interwiki_pkey', 'patch-interwiki-pk.sql' ], [ 'addIndex', 'protected_titles', 'protected_titles_pkey', 'patch-protected_titles-pk.sql' ], [ 'addIndex', 'site_identifiers', 'site_identifiers_pkey', 'patch-site_identifiers-pk.sql' ], + [ 'addPgIndex', 'recentchanges', 'rc_this_oldid', '(rc_this_oldid)' ], ]; } diff --git a/includes/installer/SqliteInstaller.php b/includes/installer/SqliteInstaller.php index 6f168720c7..aa954389b1 100644 --- a/includes/installer/SqliteInstaller.php +++ b/includes/installer/SqliteInstaller.php @@ -230,6 +230,7 @@ class SqliteInstaller extends DatabaseInstaller { $status = Status::newGood(); $status->merge( $this->makeStubDBFile( $dir, $db ) ); $status->merge( $this->makeStubDBFile( $dir, "wikicache" ) ); + $status->merge( $this->makeStubDBFile( $dir, "{$db}_l10n_cache" ) ); if ( !$status->isOK() ) { return $status; } @@ -242,7 +243,8 @@ class SqliteInstaller extends DatabaseInstaller { # Create the global cache DB try { - $conn = Database::factory( 'sqlite', [ 'dbname' => 'wikicache', 'dbDirectory' => $dir ] ); + $conn = Database::factory( + 'sqlite', [ 'dbname' => 'wikicache', 'dbDirectory' => $dir ] ); # @todo: don't duplicate objectcache definition, though it's very simple $sql = <<getMessage() ); } + # Create the l10n cache DB + try { + $conn = Database::factory( + 'sqlite', [ 'dbname' => "{$db}_l10n_cache", 'dbDirectory' => $dir ] ); + # @todo: don't duplicate l10n_cache definition, though it's very simple + $sql = +<<query( $sql ); + $conn->query( "PRAGMA journal_mode=WAL" ); // this is permanent + $conn->close(); + } catch ( DBConnectionError $e ) { + return Status::newFatal( 'config-sqlite-connection-error', $e->getMessage() ); + } + # Open the main DB return $this->getConnection(); } @@ -330,6 +353,13 @@ EOT; 'dbDirectory' => \$wgSQLiteDataDir, 'flags' => 0 ] +]; +\$wgLocalisationCacheConf['storeServer'] = [ + 'type' => 'sqlite', + 'dbname' => \"{\$wgDBname}_l10n_cache\", + 'tablePrefix' => '', + 'dbDirectory' => \$wgSQLiteDataDir, + 'flags' => 0 ];"; } } diff --git a/includes/installer/SqliteUpdater.php b/includes/installer/SqliteUpdater.php index 80eb84330b..57bf38975d 100644 --- a/includes/installer/SqliteUpdater.php +++ b/includes/installer/SqliteUpdater.php @@ -231,6 +231,7 @@ class SqliteUpdater extends DatabaseUpdater { 'patch-protected_titles-fix-pk.sql' ], [ 'renameIndex', 'site_identifiers', 'site_ids_type', 'PRIMARY', false, 'patch-site_identifiers-fix-pk.sql' ], + [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ], ]; } diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php index 739d9f21cf..d8281b015e 100644 --- a/includes/installer/WebInstaller.php +++ b/includes/installer/WebInstaller.php @@ -21,6 +21,8 @@ * @ingroup Deployment */ +use MediaWiki\MediaWikiServices; + /** * Class for the core installer web interface. * @@ -500,14 +502,14 @@ class WebInstaller extends Installer { if ( $this->getSession( 'test' ) === null && !$this->request->wasPosted() ) { $wgLanguageCode = $this->getAcceptLanguage(); - $wgLang = $wgContLang = Language::factory( $wgLanguageCode ); + $wgLang = Language::factory( $wgLanguageCode ); RequestContext::getMain()->setLanguage( $wgLang ); $this->setVar( 'wgLanguageCode', $wgLanguageCode ); $this->setVar( '_UserLang', $wgLanguageCode ); } else { $wgLanguageCode = $this->getVar( 'wgLanguageCode' ); - $wgContLang = Language::factory( $wgLanguageCode ); } + $wgContLang = MediaWikiServices::getInstance()->getContentLanguage(); } /** diff --git a/includes/installer/WebInstallerName.php b/includes/installer/WebInstallerName.php index 09fc0f37c7..8314fd2803 100644 --- a/includes/installer/WebInstallerName.php +++ b/includes/installer/WebInstallerName.php @@ -19,6 +19,8 @@ * @ingroup Deployment */ +use MediaWiki\MediaWikiServices; + class WebInstallerName extends WebInstallerPage { /** @@ -186,8 +188,7 @@ class WebInstallerName extends WebInstallerPage { } // Make sure it won't conflict with any existing namespaces - global $wgContLang; - $nsIndex = $wgContLang->getNsIndex( $name ); + $nsIndex = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $name ); if ( $nsIndex !== false && $nsIndex !== NS_PROJECT ) { $this->parent->showError( 'config-ns-conflict', $name ); $retVal = false; diff --git a/includes/installer/i18n/ast.json b/includes/installer/i18n/ast.json index e0afeff9f4..73929dd263 100644 --- a/includes/installer/i18n/ast.json +++ b/includes/installer/i18n/ast.json @@ -110,11 +110,11 @@ "config-sqlite-dir-help": "SQLite almacena tolos datos nun ficheru únicu.\n\nEl direutoriu que proporciones tien de poder escribise pol servidor web mientres la instalación.\n\nNun tendría de tener accesu pela web, por eso nun se pon nel sitiu onde tán los ficheros PHP.\n\nL'instalador escribirá un ficheru .htaccess xunto con él, pero si esto falla dalguién podría tener accesu a la base de datos completa.\nEso incluye los datos d'usuariu completos (direcciones de corréu electrónicu, contraseñes con hash) lo mesmo que les revisiones desaniciaes y otros datos acutaos de la wiki.\n\nConsidera poner la base de datos en dalgún otru sitiu, por casu en /var/lib/mediawiki/miowiki.", "config-oracle-def-ts": "Espaciu de tables predetermináu:", "config-oracle-temp-ts": "Espaciu de tables temporal:", - "config-type-mysql": "MySQL (o compatible)", + "config-type-mysql": "MariaDB, MySQL o compatible", "config-type-mssql": "Microsoft SQL Server", "config-support-info": "MediaWiki ye compatible colos siguientes sistemes de bases de datos:\n\n$1\n\nSi nun atopes na llista el sistema de base de datos que tas intentando utilizar, sigue les instrucciones enllazaes enriba p'activar la compatibilidá.", "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] ye un sistema comercial de base de datos empresariales pa Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Cómo compilar PHP con compatibilidá pa SQLSRV])", - "config-header-mysql": "Configuración de MySQL", + "config-header-mysql": "Configuración de MariaDB/MySQL", "config-header-postgres": "Configuración de PostgreSQL", "config-header-sqlite": "Configuración de SQLite", "config-header-oracle": "Configuración d'Oracle", @@ -150,9 +150,11 @@ "config-db-web-create": "Crear la cuenta si nun esiste yá", "config-db-web-no-create-privs": "La cuenta qu'especificasti pa la instalación nun tien permisos abondo pa crear una cuenta.\nLa cuenta qu'especifiques equí yá tien d'esistir.", "config-mysql-engine": "Motor d'almacenamientu:", - "config-mysql-innodb": "InnoDB", + "config-mysql-innodb": "InnoDB (recomendao)", "config-mysql-myisam": "MyISAM", "config-mssql-auth": "Triba d'autenticación:", + "config-mssql-sqlauth": "Autenticación de SQL Server", + "config-mssql-windowsauth": "Autenticación de Windows", "config-site-name": "Nome de la wiki:", "config-site-name-help": "Esto apaecerá na barra de títulos del navegador y en dellos sitios más.", "config-site-name-blank": "Escriba un nome pal sitiu.", @@ -161,9 +163,16 @@ "config-ns-site-name": "Igual que'l nome de la wiki: $1", "config-ns-other": "Otru (especificar)", "config-ns-other-default": "MioWiki", + "config-admin-box": "Cuenta d'alministrador", "config-admin-name": "El to nome d'usuariu:", "config-admin-password": "Contraseña:", + "config-admin-password-confirm": "Repiti la contraseña:", + "config-admin-help": "Escribe equí'l nome d'usuariu que desees, como por casu \"Nel Bloggs\".\nEsti ye'l nome que vas usar pa entrar na wiki.", + "config-admin-name-blank": "Escribe'l nome d'usuariu d'un alministrador.", "config-optional-skip": "Yá toi aburríu, namái instala la wiki.", + "config-profile-wiki": "Wiki públicu", + "config-profile-no-anon": "Ríquese crear una cuenta", + "config-profile-fishbowl": "Solo editores autorizaos", "config-profile-private": "Wiki privada", "config-license": "Derechos d'autor y llicencia:", "config-license-none": "Ensin pie de llicencia", @@ -193,6 +202,16 @@ "config-install-database": "Configurando la base de datos", "config-install-schema": "Creando l'esquema", "config-install-pg-schema-not-exist": "L'esquema PostgreSQL nun esiste.", + "config-install-user": "Creando l'usuariu de la base de datos", + "config-install-user-alreadyexists": "L'usuariu «$1» yá esiste.", + "config-install-user-create-failed": "Falló la creación del usuariu «$1»: $2", + "config-install-user-grant-failed": "Falló la concesión de permisos al usuariu «$1»: $2", + "config-install-user-missing": "L'usuariu especificáu «$1» nun esiste.", + "config-install-tables": "Creando tables", + "config-install-tables-exist": "Avisu: Paez que les tables de MediaWiki yá esisten.\nSaltándo la so creación.", + "config-install-tables-failed": "Error: La creación de tables falló col error siguiente: $1", + "config-install-interwiki": "Enllenando la tabla d'interwiki predeterminada", + "config-install-interwiki-list": "Nun pudo lleese'l ficheru interwiki.list.", "config-download-localsettings": "Descargar LocalSettings.php", "config-help": "Ayuda", "config-nofile": "Nun pudo atopase'l ficheru \"$1\". ¿Desaniciose?", diff --git a/includes/installer/i18n/br.json b/includes/installer/i18n/br.json index 6ee92635ef..b612a8b292 100644 --- a/includes/installer/i18n/br.json +++ b/includes/installer/i18n/br.json @@ -9,7 +9,7 @@ "Macofe" ] }, - "config-desc": "Poellad staliañ MediaWIki", + "config-desc": "Poellad staliañ MediaWiki", "config-title": "Staliadur MediaWiki $1", "config-information": "Titouroù", "config-localsettings-upgrade": "Kavet ez eus bet ur restr LocalSettings.php.\nEvit hizivaat ar staliadur-se, merkit an talvoud $wgUpgradeKey er voest dindan.\nE gavout a rit e LocalSettings.php.", diff --git a/includes/installer/i18n/ca.json b/includes/installer/i18n/ca.json index a1f7248161..c7f9b27569 100644 --- a/includes/installer/i18n/ca.json +++ b/includes/installer/i18n/ca.json @@ -98,7 +98,7 @@ "config-sqlite-dir": "Directori de dades de l'SQLite", "config-oracle-def-ts": "Espai de taules per defecte:", "config-oracle-temp-ts": "Espai de taules temporal:", - "config-type-mysql": "MySQL (o compatible)", + "config-type-mysql": "MariaDB, MySQL o compatible", "config-type-mssql": "Microsoft SQL Server", "config-support-info": "MediaWiki és compatible amb els següents sistemes de bases de dades:\n$1\nSi el sistema de bases de dades que intenteu utilitzar no apareix a la llista, seguiu les instruccions enllaçades més amunt per habilitar el suport.", "config-header-mysql": "Paràmetres de MySQL", diff --git a/includes/installer/i18n/da.json b/includes/installer/i18n/da.json index 2afd2ca5dd..94abdbaad4 100644 --- a/includes/installer/i18n/da.json +++ b/includes/installer/i18n/da.json @@ -7,7 +7,8 @@ "Thomsen", "MGA73", "Mads Haupt", - "Joedalton" + "Joedalton", + "Saederup92" ] }, "config-desc": "Installationsprogrammet til MediaWiki", @@ -53,7 +54,7 @@ "config-db-install-username": "Indtast brugernavnet som vil blive brugt til at forbinde til databasen under installationsprocessen.\nDette er ikke brugernavnet for MediaWiki-kontoen; det er brugernavnet på din database.", "config-mysql-old": "MySQL $1 eller nyere kræves. Du har $2.", "config-type-mssql": "Microsoft SQL-server", - "config-header-mysql": "MySQL-indstillinger", + "config-header-mysql": "MariaDB/MySQL-indstillinger", "config-header-postgres": "PostgreSQL-indstillinger", "config-header-sqlite": "SQLite-indstillinger", "config-header-oracle": "Oracle-indstillinger", @@ -78,6 +79,6 @@ "config-upload-deleted": "Mappe for slettede filer:", "config-help": "hjælp", "config-help-tooltip": "klik for at udvide", - "mainpagetext": "'''MediaWiki er nu installeret.'''", + "mainpagetext": "MediaWiki er nu installeret.", "mainpagedocfooter": "Se [https://meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.\n\n== At komme i gang ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listen over opsætningsmuligheder]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ofte stillede spørgsmål]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Oversæt MediaWiki til dit sprog]" } diff --git a/includes/installer/i18n/fi.json b/includes/installer/i18n/fi.json index cec1647f3d..3d2eea50b8 100644 --- a/includes/installer/i18n/fi.json +++ b/includes/installer/i18n/fi.json @@ -21,7 +21,8 @@ "Mikahama", "Olimar", "01miki10", - "Pyscowicz" + "Pyscowicz", + "Surjection" ] }, "config-desc": "Asennin MediaWikiä varten", @@ -74,7 +75,7 @@ "config-pcre-old": "Tärkeää: PCRE $1 tai uudempi versio tarvitaan.\nPHP-binäärisi on linkitetty versiolla PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Lisätietoja].", "config-memory-raised": "PHP:n memory_limit on $1, nostetaan arvoon $2.", "config-memory-bad": "'''Varoitus:''' PHP:n memory_limit on $1.\nTämä on luultavasti liian alhainen.\nAsennus saattaa epäonnistua!", - "config-apc": "[https://secure.php.net/apc APC] on asennettu.", + "config-apc": "[https://secure.php.net/apc APC] on asennettu", "config-apcu": "[https://secure.php.net/apcu APCu] on asennettu", "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] on asennettu", "config-diff3-bad": "GNU diff3:a ei löytynyt.", @@ -119,18 +120,18 @@ "config-sqlite-dir-help": "SQLite tallentaa kaiken sisällön yhteen tiedostoon.\n\nPalvelimen pitää pystyä kirjoittamaan tietoa hakemistoon asennuksen aikana.\n\nHakemiston ei tulisi olla nähtävissä www-selaimella. Siksi hakemisto on eri kuin missä PHP-tiedostot sijaitsevat.\n\nAsennusohjelma luo .htaccess-tiedoston, mutta jos sen luomisessa ilmenee ongelmia joku voi päästä käsiksi tietokantaasi. \nTietokannassa on kaikki sähköpostiosoitteet, salasanat, poistetut versiot ja kaikki muu tieto, joka ei näy wikissä.\n\nSuosittelemme tallentamaan tietokannan eri hakemistoon, esimerkiksi /var/lib/mediawiki/yourwiki.", "config-oracle-def-ts": "Oletus taulukkotila:", "config-oracle-temp-ts": "Väliaikainen taulukkotila:", - "config-type-mysql": "MySQL (tai yhteensopiva)", + "config-type-mysql": "MariaDB, MySQL tai yhteensopiva", "config-type-postgres": "PostgreSQL", "config-type-sqlite": "SQLite", "config-type-oracle": "Oracle", "config-type-mssql": "Microsoft SQL Server", "config-support-info": "MediaWiki tukee seuraavia tietokantajärjestelmiä:\n\n$1\n\nJos et näe tietokantajärjestelmää, jota yrität käyttää, listattuna alhaalla, seuraa yläpuolella olevia ohjeita tuen aktivoimiseksi.", - "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] on MediaWikin ensisijainen kohde ja se on myös parhaiten tuettu. MediaWiki voi myös käyttää [{{int:version-db-mariadb-url}} MariaDB]- sekä [{{int:version-db-percona-url}} Percona Server]-järjestelmiä, jotka ovat MySQL-yhteensopivia. ([https://secure.php.net/manual/en/mysqli.installation.php Miten käännetään PHP MySQL-tuella])", + "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] on MediaWikin ensisijainen kohde ja se on myös parhaiten tuettu. MediaWiki voi myös käyttää [{{int:version-db-mysql-url}} MySQL]- sekä [{{int:version-db-percona-url}} Percona Server]-järjestelmiä, jotka ovat MariaDB-yhteensopivia. ([https://secure.php.net/manual/en/mysqli.installation.php Miten käännetään PHP MySQL-tuella])", "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] on suosittu avoimen lähdekoodin tietokantajärjestelmä vaihtoehtona MySQL:lle. ([https://secure.php.net/manual/en/pgsql.installation.php Kuinka käännetään PHP PostgreSQL-tuella])", - "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] on kevyt tietokantajärjestelmä, jota tuetaan hyvin. ([http://www.php.net/manual/en/pdo.installation.php Miten käännetään PHP SQLite-tuella], käyttää PDO:ta)", - "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] on kaupallinen yritystietokanta. ([http://www.php.net/manual/en/oci8.installation.php Kuinka käännetään PHP OCI8-tuella])", + "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] on kevyt tietokantajärjestelmä, jota tuetaan hyvin. ([https://secure.php.net/manual/en/pdo.installation.php Miten käännetään PHP SQLite-tuella], käyttää PDO:ta)", + "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] on kaupallinen yritystietokanta. ([https://secure.php.net/manual/en/oci8.installation.php Kuinka käännetään PHP OCI8-tuella])", "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] on kaupallinen yritystietokanta Windowsille. ([https://secure.php.net/manual/en/sqlsrv.installation.php Miten käännetään PHP SQLSRV-tuella])", - "config-header-mysql": "MySQL-asetukset", + "config-header-mysql": "MariaDB/MySQL-asetukset", "config-header-postgres": "PostgreSQL-asetukset", "config-header-sqlite": "SQLite-asetukset", "config-header-oracle": "Oracle-asetukset", @@ -167,7 +168,7 @@ "config-db-web-create": "Lisää tili, jos sitä ei ole jo olemassa", "config-db-web-no-create-privs": "Tilillä jota käytetään asennuksessa ei ole oikeuksia luoda uutta tiliä.\nTähän määriteltävä tili täytyy olla jo olemassa.", "config-mysql-engine": "Tallennusmoottori", - "config-mysql-innodb": "InnoDB", + "config-mysql-innodb": "InnoDB (suositeltu)", "config-mysql-myisam": "MyISAM", "config-mssql-auth": "Varmennuksen tyyppi:", "config-mssql-install-auth": "Valitse varmennuksen tyyppi, jota käytetään yhdistäessä tietokantaan asennuksen aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.", @@ -224,7 +225,7 @@ "config-license-help": "Monet julkiset wikit käyttävät muokkauksiin [https://freedomdefined.org/Definition vapaata lisenssiä].\nTämä auttaa luomaan yhteisöllisen omistajuuden tunteen ja kannustaa pitkäkestoiseen muokkaamiseen.\nSe ei ole yleensä tarpeen yksityiselle tai yrityksen wikille.\n\nJos haluat pystyä käyttämään tekstiä Wikipediasta, ja haluat Wikipedian pystyvän hyväksymään wikistäsi kopioitua tekstiä, sinun tulisi valita {{int:config-license-cc-by-sa}}.\n\nWikipedia käytti aiemmin GNU Free Documentation Licenseä.\nGFDL on kelvollinen lisenssi, mutta vaikea ymmärtää.\nOn myös vaikeaa käyttää uudelleen GFDL-lisensöityä sisältöä.", "config-email-settings": "Sähköpostiasetukset", "config-enable-email": "Ota käyttöön sähköpostien lähetys", - "config-enable-email-help": "Jotta sähköposti toimii, [Config-dbsupport-oracle/manual/en/mail.configuration.php PHP:n sähköpostiasetukset] täytyy asettaa oikein.\nJos et halua käyttää sähköpostiominaisuuksia, ne voi kytkeä pois päältä tästä.", + "config-enable-email-help": "Jotta sähköposti toimii, [https://secure.php.net/manual/en/mail.configuration.php PHP:n sähköpostiasetukset] täytyy asettaa oikein.\nJos et halua käyttää sähköpostiominaisuuksia, ne voi kytkeä pois päältä tästä.", "config-email-user": "Ota käyttöön käyttäjältä käyttäjälle sähköpostit", "config-email-user-help": "Salli käyttäjien lähettää sähköpostia toisilleen jos he ovat ottaneet käyttöön toiminnon asetuksissaan.", "config-email-usertalk": "Ota käyttöön käyttäjien keskustelusivusta ilmoittaminen", diff --git a/includes/installer/i18n/ia.json b/includes/installer/i18n/ia.json index fe382ac5e0..b526d5aee4 100644 --- a/includes/installer/i18n/ia.json +++ b/includes/installer/i18n/ia.json @@ -4,7 +4,8 @@ "McDutchie", "아라", "Macofe", - "Fanjiayi" + "Fanjiayi", + "Fitoschido" ] }, "config-desc": "Le installator de MediaWiki", @@ -110,18 +111,18 @@ "config-sqlite-dir-help": "SQLite immagazina tote le datos in un sol file.\n\nLe directorio que tu forni debe permitter le accesso de scriptura al servitor web durante le installation.\n\nIllo '''non''' debe esser accessibile via web. Pro isto, nos non lo pone ubi tu files PHP es.\n\nLe installator scribera un file .htaccess insimul a illo, ma si isto falli, alcuno pote ganiar accesso directe a tu base de datos.\nIsto include le crude datos de usator (adresses de e-mail, contrasignos codificate) assi como versiones delite e altere datos restringite super le wiki.\n\nConsidera poner le base de datos in un loco completemente differente, per exemplo in /var/lib/mediawiki/yourwiki.", "config-oracle-def-ts": "Spatio de tabellas predefinite:", "config-oracle-temp-ts": "Spatio de tabellas temporari:", - "config-type-mysql": "MySQL (o compatibile)", + "config-type-mysql": "MariaDB, MySQL o compatibile", "config-type-postgres": "PostgreSQL", "config-type-sqlite": "SQLite", "config-type-oracle": "Oracle", "config-type-mssql": "Microsoft SQL Server", "config-support-info": "MediaWiki supporta le sequente systemas de base de datos:\n\n$1\n\nSi tu non vide hic infra le systema de base de datos que tu tenta usar, alora seque le instructiones ligate hic supra pro activar le supporto.", - "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es le systema primari pro MediaWiki e le melio supportate. MediaWiki functiona anque con [{{int:version-db-mariadb-url}} MariaDB] e con [{{int:version-db-percona-url}} Percona Server], le quales es compatibile con MySQL. ([https://secure.php.net/manual/en/mysqli.installation.php Como compilar PHP con supporto de MySQL])", + "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] es le systema primari pro MediaWiki e le melio supportate. MediaWiki functiona anque con [{{int:version-db-mysql-url}} MySQL] e con [{{int:version-db-percona-url}} Percona Server], le quales es compatibile con MariaDB. ([https://secure.php.net/manual/en/mysqli.installation.php Como compilar PHP con supporto de MySQL])", "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] es un systema de base de datos popular e open source, alternativa a MySQL. ([https://secure.php.net/manual/en/pgsql.installation.php Como compilar PHP con supporto de PostgreSQL])", "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un systema de base de datos legier que es multo ben supportate. ([https://secure.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)", "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es un banca de datos commercial pro interprisas. ([https://secure.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])", "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es un base de datos de interprisa commercial pro Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Como compilar PHP con supporto de SQLSRV])", - "config-header-mysql": "Configuration de MySQL", + "config-header-mysql": "Configuration de MariaDB/MySQL", "config-header-postgres": "Configuration de PostgreSQL", "config-header-sqlite": "Configuration de SQLite", "config-header-oracle": "Configuration de Oracle", diff --git a/includes/installer/i18n/ja.json b/includes/installer/i18n/ja.json index 0346dc7f6a..3ad6073817 100644 --- a/includes/installer/i18n/ja.json +++ b/includes/installer/i18n/ja.json @@ -129,18 +129,18 @@ "config-sqlite-dir-help": "SQLite は単一のファイル内にすべてのデータを格納しています。\n\n指定したディレクトリは、インストール時にウェブ サーバーが書き込めるようにしておく必要があります。\n\nこのディレクトリはウェブからアクセス不可能である必要があります。PHP ファイルがある場所には配置できないのはこのためです。\n\nインストーラーは .htaccess ファイルにも書き込みます。しかし、これが失敗した場合は、誰かが生のデータベースにアクセスできてしまいます。\nデータベースは、生のデータ (メールアドレス、パスワードのハッシュ値) の他、削除された版、その他ウィキ上の制限されているデータを含んでいます。\n\n例えば /var/lib/mediawiki/yourwiki のように、別の場所にデータベースを配置することを検討してください。", "config-oracle-def-ts": "既定のテーブル領域:", "config-oracle-temp-ts": "一時的なテーブル領域:", - "config-type-mysql": "MySQL(または互換製品)", + "config-type-mysql": "MariaDB、MySQLまたは互換製品", "config-type-postgres": "PostgreSQL", "config-type-sqlite": "SQLite", "config-type-oracle": "Oracle", "config-type-mssql": "マイクロソフト SQL Server", "config-support-info": "MediaWiki は以下のデータベース システムに対応しています:\n\n$1\n\n使用しようとしているデータベース システムが下記の一覧にない場合は、上記リンク先の手順に従ってインストールしてください。", - "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]はMediaWikiの主要な対象であり、最もよくサポートされています。MediaWikiはMySQLと互換性のある[{{int:version-db-mariadb-url}} MariaDB]、[{{int:version-db-percona-url}} Percona Server]でも動きます。 ([https://secure.php.net/manual/ja/mysqli.installation.php PHPをMySQLサポート付きでコンパイルする方法])", + "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB]はMediaWikiの主要な対象であり、最もよくサポートされています。MediaWikiはMariaDBと互換性のある[{{int:version-db-mysql-url}} MySQL]、[{{int:version-db-percona-url}} Percona Server]でも動きます。 ([https://secure.php.net/manual/ja/mysqli.installation.php PHPをMySQLサポート付きでコンパイルする方法])", "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] は、MySQLの代替として人気がある公開のデータベースシステムです。([https://secure.php.net/manual/en/pgsql.installation.php PHPをPostgreSQLサポート付きでコンパイルする方法])", "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]は、良くサポートされている、軽量データベースシステムです。([https://secure.php.net/manual/ja/pdo.installation.php SQLiteに対応したPHPをコンパイルする方法]、PDOを使用)", "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle]は商業企業のデータベースです。([https://secure.php.net/manual/en/oci8.installation.php OCI8サポートなPHPをコンパイルする方法])", "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]は商業企業のWindows用データベースです。([https://secure.php.net/manual/en/sqlsrv.installation.php SQLSRVサポートなPHPをコンパイルする方法])", - "config-header-mysql": "MySQL の設定", + "config-header-mysql": "MariaDB/MySQL の設定", "config-header-postgres": "PostgreSQL の設定", "config-header-sqlite": "SQLite の設定", "config-header-oracle": "Oracle の設定", @@ -179,7 +179,7 @@ "config-db-web-create": "アカウントが存在しない場合は作成する", "config-db-web-no-create-privs": "あなたがインストールのために定義したアカウントは、アカウント作成のための特権としては不充分です。\nあなたがここで指定したアカウントは既に存在している必要があります。", "config-mysql-engine": "ストレージ エンジン:", - "config-mysql-innodb": "InnoDB", + "config-mysql-innodb": "InnoDB(推奨)", "config-mysql-myisam": "MyISAM", "config-mysql-myisam-dep": "警告: MySQLのストレージエンジンとして MyISAM を選択していますが、これをMediaWikiで利用するのは推奨されていません。その理由は: \n* テーブルロックによる並列性をほとんどサポートしていない\n* 他のエンジンに比べて壊れやすい\n* MediaWiki のコードベースは必ずしも MyISAM を本来あるべきほどには扱っていない\n\nあなたがインストールした MySQL が InnoDB をサポートしている場合、代わりにそちらをお使いになることを強くお勧めします。\nあなたがインストールした MySQL が InnoDB をサポートしていない場合、アップグレードした方がいいでしょう。", "config-mysql-only-myisam-dep": "警告: MyISAM がこのマシンの MySQL の唯一のストレージエンジンですが、これをMediaWikiで利用するのは推奨されていません。その理由は: \n* テーブルロックによる並列性をほとんどサポートしていない\n* 他のエンジンに比べて壊れやすい\n* MediaWiki のコードベースは必ずしも MyISAM を本来あるべきほどには扱っていない\n\nあなたがインストールした MySQL が InnoDB をサポートしていない場合、アップグレードした方がいいでしょう。", diff --git a/includes/installer/i18n/lb.json b/includes/installer/i18n/lb.json index 7980ca716e..6f121e7e19 100644 --- a/includes/installer/i18n/lb.json +++ b/includes/installer/i18n/lb.json @@ -41,7 +41,7 @@ "config-help-restart": "Wëllt Dir all gespäichert Donnéeë läschen déi Dir bis elo aginn hutt an den Installatiounsprozess nei starten?", "config-restart": "Jo, neistarten", "config-welcome": "=== Iwwerpréifung vum Installatiounsenvironnement ===\nEt gi grondsätzlech Iwwerpréifunge gemaach fir ze kucken ob den Environnment gëeegent ass fir MediaWiki z'installéieren.\nDir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef frot wéi Dir D'Installatioun ofschléisse kënnt.", - "config-sidebar": "* [https://www.mediawiki.org MediaWiki Haaptsäit]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Benotzerguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide fir Administrateuren]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* Liest dëst\n* Informatioune vun der aktueller Versioun\n* Lizenzbedingungen\n* Aktualisatioun", + "config-sidebar": "* [https://www.mediawiki.org MediaWiki Haaptsäit]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Benotzerguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide fir Administrateuren]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* Liest dëst\n* Informatioune vun der aktueller Versioun\n* Lizenzbedingungen\n* Aktualiséierung", "config-env-good": "Den Environement gouf nogekuckt.\nDir kënnt MediaWiki installéieren.", "config-env-bad": "Den Environnement gouf iwwerpréift.\nDir kënnt MediWiki net installéieren.", "config-env-php": "PHP $1 ass installéiert.", diff --git a/includes/installer/i18n/nap.json b/includes/installer/i18n/nap.json index 6ba2375b8a..e391609344 100644 --- a/includes/installer/i18n/nap.json +++ b/includes/installer/i18n/nap.json @@ -3,7 +3,8 @@ "authors": [ "C.R.", "Chelin", - "Macofe" + "Macofe", + "Fitoschido" ] }, "config-desc": "'O prugramma d'istallazione 'e MediaWiki", @@ -107,7 +108,7 @@ "config-sqlite-dir-help": "SQLite astipa tutte 'e date dint'a n'uneco file.\n\n'A cartella ca starraje a innecà adda essere scrivibbele d' 'o server webe pe' tramente ca sta l'istallazione.\n\nAvess'a essere nun trasibbele via web, è pecchesto ca nun se sta mettenno addò stanno 'e file PHP.\n\nL'installatore scriverrà nzieme a chesta nu file .htaccess, ma si 'o tentativo scassasse, coccheruno putesse tenè acciesso dint' 'o database ncruro.\nChesto pure cunzidera 'e date ncruro 'e ll'utente (indirizze, password cifrate) accussì comme 'e verziune luvate e ati dati d'accesso limmetato dint' 'o wiki.\n\nCunzidera ll'opportunità 'e sistimà ô tiempo 'o database 'a n'ata parte, p'esempio int'a /var/lib/mediawiki/tuowiki.", "config-oracle-def-ts": "Tablespace 'e default:", "config-oracle-temp-ts": "Tablespace temporaneo:", - "config-type-mysql": "MySQL (o compatibbele)", + "config-type-mysql": "MariaDB, MySQL o compatibbele", "config-type-mssql": "Microsoft SQL Server", "config-support-info": "MediaWiki supporta 'e sisteme 'e database ccà abbascio:\n\n$1\n\nSi nfra chiste ccà nun vedite 'o sistema 'e database ca vulite ausà, allora avite liegge 'e instruziune ccà ncoppa pe' ne dà supporto.", "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] è 'a configurazione cchiù mmeglio p' 'o MediaWiki e è chilla meglio suppurtata. MediaWiki può faticà pure cu' [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], ca fossero MySQL cumpatibbele. ([https://secure.php.net/manual/en/mysqli.installation.php Comme s'adda fà pe' cumpilà PHP cu suppuorto MySQL])", diff --git a/includes/installer/i18n/nl.json b/includes/installer/i18n/nl.json index ca4bcc2e10..0459807148 100644 --- a/includes/installer/i18n/nl.json +++ b/includes/installer/i18n/nl.json @@ -21,7 +21,8 @@ "Mainframe98", "Rcdeboer", "Festina90", - "MarcoSwart" + "MarcoSwart", + "Kippenvlees1" ] }, "config-desc": "Het installatieprogramma voor MediaWiki", @@ -133,7 +134,7 @@ "config-type-oracle": "Oracle", "config-type-mssql": "Microsoft SQL Server", "config-support-info": "MediaWiki ondersteunt de volgende databasesystemen:\n\n$1\n\nAls u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.", - "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] is de primaire database voor MediaWiki en wordt het best ondersteund. MediaWiki werkt ook met [{{int:version-db-mariadb-url}} MariaDB] en [{{int:version-db-percona-url}} Percona Server], die MySQL compatibel zijn ([https://secure.php.net/manual/en/mysqli.installation.php hoe PHP te compileren met MySQL-ondersteuning]).", + "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] is de primaire database voor MediaWiki en wordt het best ondersteund. MediaWiki werkt ook met [{{int:version-db-mysql-url}} MySQL] en [{{int:version-db-percona-url}} Percona Server], die MariaDB-compatibel zijn ([https://secure.php.net/manual/en/mysqli.installation.php hoe PHP te compileren met MySQL-ondersteuning]).", "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is een populair open source databasesysteem als alternatief voor MySQL.([https://secure.php.net/manual/en/pgsql.installation.php Hoe u PHP kunt compileren met ondersteuning voor PostgreSQL])", "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is een zeer goed ondersteund lichtgewicht databasesysteem ([https://secure.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor SQLite]; gebruikt PDO).", "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is een commerciële database voor grote bedrijven ([https://secure.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).", diff --git a/includes/installer/i18n/sr-ec.json b/includes/installer/i18n/sr-ec.json index 62f253867e..3bdc7617f8 100644 --- a/includes/installer/i18n/sr-ec.json +++ b/includes/installer/i18n/sr-ec.json @@ -70,9 +70,9 @@ "config-mssql-old": "Потребан је Microsoft SQL Server $1 или новији. Ви имате $2.", "config-mysql-innodb": "InnoDB (препоручено)", "config-mysql-myisam": "MyISAM", - "config-mssql-auth": "Тип провере идентитета:", - "config-mssql-sqlauth": "Провера идентитета SQL Server-а", - "config-mssql-windowsauth": "Провера идентитета Виндоуса", + "config-mssql-auth": "Тип потврде идентитета:", + "config-mssql-sqlauth": "Аутентификација за СКуЛ Сервер", + "config-mssql-windowsauth": "Аутентификација за Виндоус", "config-site-name": "Име викија:", "config-site-name-blank": "Унесите име сајта.", "config-project-namespace": "Именски простор пројекта:", @@ -81,7 +81,7 @@ "config-ns-other": "Друго (наведите)", "config-ns-other-default": "MyWiki", "config-admin-box": "Налог администратора", - "config-admin-name": "Ваше корисничко име:", + "config-admin-name": "Корисничко име:", "config-admin-password": "Лозинка:", "config-admin-password-confirm": "Поново унесите лозинку:", "config-admin-help": "Овде упишите жељено корисничко име; на пример, „Јован Крстић“.\nОво име ћете користити за пријаву на вики.", @@ -137,6 +137,6 @@ "config-skins-screenshots": "„$1” (снимци екрана: $2)", "config-skins-screenshot": "$1 ($2)", "config-screenshot": "снимак екрана", - "mainpagetext": "Медијавики је успешно инсталиран.", + "mainpagetext": "Медијавики је инсталиран.", "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/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/Manual:Combating_spam Научите како да се борите против спама на својој вики]" } diff --git a/includes/installer/i18n/tt-cyrl.json b/includes/installer/i18n/tt-cyrl.json index 9ebbc27446..5565354fb7 100644 --- a/includes/installer/i18n/tt-cyrl.json +++ b/includes/installer/i18n/tt-cyrl.json @@ -27,23 +27,50 @@ "config-page-upgradedoc": "Яңарту", "config-page-existingwiki": "Хәзерге вики", "config-restart": "Әйе, яңадан башларга", + "config-env-php": "PHP $1 куелды.", + "config-env-hhvm": "HHVM $1 куелды.", "config-apc": "[https://secure.php.net/apc APC] куелды", "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] куелды", "config-diff3-bad": "GNU diff3 табылмады.", "config-git": "Git юрамалар идарә итү системасы табылды: $1.", + "config-using-server": "«$1» сервер исеме файдаланыла.", + "config-using-uri": "«$1$2» URL исемле сервер файдаланыла.", "config-db-type": "Мәгълүмат базасы төре:", "config-db-host": "Мәгълүмат базасы хосты:", "config-db-host-oracle": "TNS мәгълүмат базасы:", + "config-db-wiki-settings": "Бу вики идентификациясе", + "config-db-name": "Мәгълүмат базасы исеме:", "config-db-name-oracle": "Мәгълүмат базасы төзелеше:", "config-db-username": "Мәгълүмат базасын кулланучы исеме:", "config-db-password": "Мәгълүмат базасының серсүзе:", "config-db-port": "Мәгълүмат базасы порты:", "config-db-schema": "MediaWiki өчен төзелеш:", - "config-mysql-innodb": "InnoDB", + "config-type-mysql": "MariaDB, MySQL яисә ярашлы", + "config-type-mssql": "Microsoft SQL Server", + "config-header-mysql": "MariaDB/MySQL көйләнмәләре", + "config-header-postgres": "PostgreSQL көйләнмәләре", + "config-header-sqlite": "SQLite көйләнмәләре", + "config-header-oracle": "Oracle көйләнмәләре", + "config-header-mssql": "Microsoft SQL Server көйләнмәләре", + "config-invalid-db-type": "Ялган бирелмәләр базасы төре", + "config-upgrade-done-no-regenerate": "Яңартү тәмамланды.\n\nХәзер сез [$1 вики] белән эшли аласыз.", + "config-regenerate": "LocalSettings.php яңадан төзү →", + "config-show-table-status": "«SHOW TABLE STATUS» таләбе эшләнмәде!", + "config-mysql-engine": "Саклау системасы:", + "config-mysql-innodb": "InnoDB (тәкъдим ителә)", "config-mysql-myisam": "MyISAM", + "config-mssql-auth": "Аутентификация төре:", + "config-mssql-sqlauth": "SQL Server чынлыгын раслау", + "config-mssql-windowsauth": "Windows чынлыгын раслау", + "config-site-name": "Вики исеме:", + "config-site-name-blank": "Сайт исемен языгыз.", + "config-project-namespace": "Проектның исемнәр киңлеге:", "config-ns-generic": "Проект", + "config-ns-site-name": "Вики исеме сыман: $1", "config-ns-other": "Башка (күрсәтегез)", "config-ns-other-default": "MyWiki", + "config-admin-box": "Иларәченең хисап язмасы", + "config-admin-name": "Кулланучы исемегез:", "config-admin-password": "Серсүз:", "config-admin-password-confirm": "Серсүзне кабатлагыз:", "config-admin-email": "Электрон почта адресы:", @@ -59,11 +86,20 @@ "config-logo": "Логотип URL:", "config-cc-again": "Кабат сайлагыз...", "config-advanced-settings": "Өстәмә көйләнмәләр", + "config-memcached-servers": "Memcached серверлары:", "config-extensions": "Киңәйтүләр", "config-skins": "Бизәлеш", "config-install-step-done": "әзер", "config-install-step-failed": "булмады", + "config-install-schema": "Схема төзү", + "config-install-tables": "Табын төзү", + "config-install-stats": "Инициализация статистикасы", + "config-download-localsettings": "LocalSettings.php йөкләү", "config-help": "ярдәм", + "config-help-tooltip": "ачу өчен басыгыз", + "config-skins-screenshots": "$1 (скриншотлар: $2)", + "config-extensions-requires": "$1 ($2 кирәк)", + "config-screenshot": "скриншот", "mainpagetext": "«MediaWiki» куелды.", "mainpagedocfooter": "Бу вики турында мәгълүматны [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ru биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (рус.)];\n* [https://www.mediawiki.org/wiki/Manual:FAQ/ru MediaWiki турында еш бирелгән сораулар һәм җаваплар (рус.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki сәхифәсенең яңа юрамалары турында хәбәрләр яздырып алу].\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki сәхифәсен туган телегезгә тәрҗемә итү]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Үзегезнең викида ничек спам белән көрәшү турында мәгълүмат]" } diff --git a/includes/interwiki/ClassicInterwikiLookup.php b/includes/interwiki/ClassicInterwikiLookup.php index eada9d40ca..05cf933345 100644 --- a/includes/interwiki/ClassicInterwikiLookup.php +++ b/includes/interwiki/ClassicInterwikiLookup.php @@ -53,7 +53,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { /** * @var Language */ - private $contentLanguage; + private $contLang; /** * @var WANObjectCache @@ -91,7 +91,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { private $thisSite = null; /** - * @param Language $contentLanguage Language object used to convert prefixes to lower case + * @param Language $contLang Language object used to convert prefixes to lower case * @param WANObjectCache $objectCache Cache for interwiki info retrieved from the database * @param int $objectCacheExpiry Expiry time for $objectCache, in seconds * @param bool|array|string $cdbData The path of a CDB file, or @@ -104,7 +104,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { * @param string $fallbackSite The code to assume for the local site, */ function __construct( - Language $contentLanguage, + Language $contLang, WANObjectCache $objectCache, $objectCacheExpiry, $cdbData, @@ -113,7 +113,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { ) { $this->localCache = new MapCacheLRU( 100 ); - $this->contentLanguage = $contentLanguage; + $this->contLang = $contLang; $this->objectCache = $objectCache; $this->objectCacheExpiry = $objectCacheExpiry; $this->cdbData = $cdbData; @@ -144,7 +144,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { return null; } - $prefix = $this->contentLanguage->lc( $prefix ); + $prefix = $this->contLang->lc( $prefix ); if ( $this->localCache->has( $prefix ) ) { return $this->localCache->get( $prefix ); } diff --git a/includes/jobqueue/JobQueueDB.php b/includes/jobqueue/JobQueueDB.php index bc737188f9..689326e8b6 100644 --- a/includes/jobqueue/JobQueueDB.php +++ b/includes/jobqueue/JobQueueDB.php @@ -221,7 +221,7 @@ class JobQueueDB extends JobQueue { $rowSet = []; // (sha1 => job) map for jobs that are de-duplicated $rowList = []; // list of jobs for jobs that are not de-duplicated foreach ( $jobs as $job ) { - $row = $this->insertFields( $job ); + $row = $this->insertFields( $job, $dbw ); if ( $job->ignoreDuplicates() ) { $rowSet[$row['job_sha1']] = $row; } else { @@ -722,11 +722,10 @@ class JobQueueDB extends JobQueue { /** * @param IJobSpecification $job + * @param IDatabase $db * @return array */ - protected function insertFields( IJobSpecification $job ) { - $dbw = $this->getMasterDB(); - + protected function insertFields( IJobSpecification $job, IDatabase $db ) { return [ // Fields that describe the nature of the job 'job_cmd' => $job->getType(), @@ -734,7 +733,7 @@ class JobQueueDB extends JobQueue { 'job_title' => $job->getTitle()->getDBkey(), 'job_params' => self::makeBlob( $job->getParams() ), // Additional job metadata - 'job_timestamp' => $dbw->timestamp(), + 'job_timestamp' => $db->timestamp(), 'job_sha1' => Wikimedia\base_convert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 diff --git a/includes/jobqueue/jobs/ThumbnailRenderJob.php b/includes/jobqueue/jobs/ThumbnailRenderJob.php index cf3155d7a8..49eabbba25 100644 --- a/includes/jobqueue/jobs/ThumbnailRenderJob.php +++ b/includes/jobqueue/jobs/ThumbnailRenderJob.php @@ -43,29 +43,18 @@ class ThumbnailRenderJob extends Job { if ( $wgUploadThumbnailRenderMethod === 'jobqueue' ) { $thumb = $file->transform( $transformParams, File::RENDER_NOW ); - if ( $thumb && !$thumb->isError() ) { - return true; - } else { - $this->setLastError( __METHOD__ . ': thumbnail couln\'t be generated' ); + if ( !$thumb || $thumb->isError() ) { + if ( $thumb instanceof MediaTransformError ) { + $this->setLastError( __METHOD__ . ': thumbnail couln\'t be generated:' . + $thumb->toText() ); + } else { + $this->setLastError( __METHOD__ . ': thumbnail couln\'t be generated' ); + } return false; } + return true; } elseif ( $wgUploadThumbnailRenderMethod === 'http' ) { - $thumbUrl = ''; - $status = $this->hitThumbUrl( $file, $transformParams, $thumbUrl ); - - wfDebug( __METHOD__ . ": received status {$status}\n" ); - - // 400 happens when requesting a size greater or equal than the original - if ( $status === 200 || $status === 301 || $status === 302 || $status === 400 ) { - return true; - } elseif ( $status ) { - $this->setLastError( __METHOD__ . ': incorrect HTTP status ' . - $status . ' when hitting ' . $thumbUrl ); - return false; - } else { - $this->setLastError( __METHOD__ . ': HTTP request failure' ); - return false; - } + return $this->hitThumbUrl( $file, $transformParams ); } else { $this->setLastError( __METHOD__ . ': unknown thumbnail render method ' . $wgUploadThumbnailRenderMethod ); @@ -77,16 +66,35 @@ class ThumbnailRenderJob extends Job { } } - protected function hitThumbUrl( LocalFile $file, $transformParams, &$thumbUrl ) { + /** + * @param LocalFile $file + * @param array $transformParams + * @return bool Success status (error will be set via setLastError() when false) + */ + protected function hitThumbUrl( LocalFile $file, $transformParams ) { global $wgUploadThumbnailRenderHttpCustomHost, $wgUploadThumbnailRenderHttpCustomDomain; + $handler = $file->getHandler(); + if ( !$handler ) { + $this->setLastError( __METHOD__ . ': could not get handler' ); + return false; + } elseif ( !$handler->normaliseParams( $file, $transformParams ) ) { + $this->setLastError( __METHOD__ . ': failed to normalize' ); + return false; + } $thumbName = $file->thumbName( $transformParams ); $thumbUrl = $file->getThumbUrl( $thumbName ); + if ( $thumbUrl === null ) { + $this->setLastError( __METHOD__ . ': could not get thumb URL' ); + return false; + } + if ( $wgUploadThumbnailRenderHttpCustomDomain ) { $parsedUrl = wfParseUrl( $thumbUrl ); if ( !$parsedUrl || !isset( $parsedUrl['path'] ) || !strlen( $parsedUrl['path'] ) ) { + $this->setLastError( __METHOD__ . ": invalid thumb URL: $thumbUrl" ); return false; } @@ -105,7 +113,19 @@ class ThumbnailRenderJob extends Job { } $status = $request->execute(); - - return $request->getStatus(); + $statusCode = $request->getStatus(); + wfDebug( __METHOD__ . ": received status {$statusCode}\n" ); + + // 400 happens when requesting a size greater or equal than the original + // TODO use proper error signaling. 400 could mean a number of other things. + if ( $statusCode === 200 || $statusCode === 301 || $statusCode === 302 || $statusCode === 400 ) { + return true; + } elseif ( $statusCode ) { + $this->setLastError( __METHOD__ . ": incorrect HTTP status $statusCode when hitting $thumbUrl" ); + } else { + $this->setLastError( __METHOD__ . ': HTTP request failure: ' + . Status::wrap( $status )->getWikiText( null, null, 'en' ) ); + } + return false; } } diff --git a/includes/libs/JavaScriptMinifier.php b/includes/libs/JavaScriptMinifier.php index 2e8b5919f4..73f3e70739 100644 --- a/includes/libs/JavaScriptMinifier.php +++ b/includes/libs/JavaScriptMinifier.php @@ -17,6 +17,13 @@ * slow, because they construct a complete parse tree before outputting the code minified. * So this class is meant to allow arbitrary (but syntactically correct) input, while being * fast enough to be used for on-the-fly minifying. + * + * This class was written with ECMA-262 Edition 3 in mind ("ECMAScript 3"). Parsing features + * new to ECMAScript 5 or later might not be supported. However, Edition 5.1 better reflects + * how actual JS engines worked and work and is simpler and more readable prose. As such, + * the below code will refer to sections of the 5.1 specification. + * + * See . */ class JavaScriptMinifier { @@ -44,33 +51,42 @@ class JavaScriptMinifier { const PROPERTY_EXPRESSION_FUNC = 15; /* Token types */ - const TYPE_UN_OP = 1; // unary operators - const TYPE_INCR_OP = 2; // ++ and -- - const TYPE_BIN_OP = 3; // binary operators - const TYPE_ADD_OP = 4; // + and - which can be either unary or binary ops - const TYPE_HOOK = 5; // ? - const TYPE_COLON = 6; // : - const TYPE_COMMA = 7; // , - const TYPE_SEMICOLON = 8; // ; - const TYPE_BRACE_OPEN = 9; // { - const TYPE_BRACE_CLOSE = 10; // } - const TYPE_PAREN_OPEN = 11; // ( and [ - const TYPE_PAREN_CLOSE = 12; // ) and ] - const TYPE_RETURN = 13; // keywords: break, continue, return, throw - const TYPE_IF = 14; // keywords: catch, for, with, switch, while, if - const TYPE_DO = 15; // keywords: case, var, finally, else, do, try - const TYPE_FUNC = 16; // keywords: function - const TYPE_LITERAL = 17; // all literals, identifiers and unrecognised tokens + const TYPE_UN_OP = 101; // unary operators + const TYPE_INCR_OP = 102; // ++ and -- + const TYPE_BIN_OP = 103; // binary operators + const TYPE_ADD_OP = 104; // + and - which can be either unary or binary ops + const TYPE_HOOK = 105; // ? + const TYPE_COLON = 106; // : + const TYPE_COMMA = 107; // , + const TYPE_SEMICOLON = 108; // ; + const TYPE_BRACE_OPEN = 109; // { + const TYPE_BRACE_CLOSE = 110; // } + const TYPE_PAREN_OPEN = 111; // ( and [ + const TYPE_PAREN_CLOSE = 112; // ) and ] + const TYPE_RETURN = 113; // keywords: break, continue, return, throw + const TYPE_IF = 114; // keywords: catch, for, with, switch, while, if + const TYPE_DO = 115; // keywords: case, var, finally, else, do, try + const TYPE_FUNC = 116; // keywords: function + const TYPE_LITERAL = 117; // all literals, identifiers and unrecognised tokens + + const ACTION_GOTO = 201; + const ACTION_PUSH = 202; + const ACTION_POP = 203; // Sanity limit to avoid excessive memory usage const STACK_LIMIT = 1000; /** - * NOTE: This isn't a strict maximum. Longer lines will be produced when - * literals (e.g. quoted strings) longer than this are encountered - * or when required to guard against semicolon insertion. + * Maximum line length + * + * This is not a strict maximum, but a guideline. Longer lines will be + * produced when literals (e.g. quoted strings) longer than this are + * encountered, or when required to guard against semicolon insertion. + * + * This is a private member (instead of constant) to allow tests to + * set it to 1, to verify ASI and line-breaking behaviour. */ - const MAX_LINE_LENGTH = 1000; + private static $maxLineLength = 1000; /** * Returns minified JavaScript code. @@ -81,309 +97,507 @@ class JavaScriptMinifier { public static function minify( $s ) { // First we declare a few tables that contain our parsing rules - // $opChars : characters, which can be combined without whitespace in between them + // $opChars : Characters which can be combined without whitespace between them. $opChars = [ - '!' => true, - '"' => true, - '%' => true, - '&' => true, - "'" => true, + // ECMAScript 5.1 § 7.7 Punctuators + // Unlike the spec, these are individual symbols, not sequences. + '{' => true, + '}' => true, '(' => true, ')' => true, - '*' => true, - '+' => true, - ',' => true, - '-' => true, + '[' => true, + ']' => true, '.' => true, - '/' => true, - ':' => true, ';' => true, + ',' => true, '<' => true, - '=' => true, '>' => true, - '?' => true, - '[' => true, - ']' => true, - '^' => true, - '{' => true, + '=' => true, + '!' => true, + '+' => true, + '-' => true, + '*' => true, + '%' => true, + '&' => true, '|' => true, - '}' => true, - '~' => true + '^' => true, + '~' => true, + '?' => true, + ':' => true, + '/' => true, + // ECMAScript 5.1 § 7.8.4 String Literals + '"' => true, + "'" => true, ]; - // $tokenTypes : maps keywords and operators to their corresponding token type + // $tokenTypes : Map keywords and operators to their corresponding token type $tokenTypes = [ - '!' => self::TYPE_UN_OP, - '~' => self::TYPE_UN_OP, - 'delete' => self::TYPE_UN_OP, + // ECMAScript 5.1 § 11.4 Unary Operators + // ECMAScript 5.1 § 11.6 Additive Operators + // UnaryExpression includes PostfixExpression, which includes 'new'. 'new' => self::TYPE_UN_OP, - 'typeof' => self::TYPE_UN_OP, + 'delete' => self::TYPE_UN_OP, 'void' => self::TYPE_UN_OP, + 'typeof' => self::TYPE_UN_OP, '++' => self::TYPE_INCR_OP, '--' => self::TYPE_INCR_OP, + '+' => self::TYPE_ADD_OP, + '-' => self::TYPE_ADD_OP, + '~' => self::TYPE_UN_OP, + '!' => self::TYPE_UN_OP, + // ECMAScript 5.1 § 11.5 Multiplicative Operators + '*' => self::TYPE_BIN_OP, + '/' => self::TYPE_BIN_OP, + '%' => self::TYPE_BIN_OP, + // ECMAScript 5.1 § 11.7 Bitwise Shift Operators + '<<' => self::TYPE_BIN_OP, + '>>' => self::TYPE_BIN_OP, + '>>>' => self::TYPE_BIN_OP, + // ECMAScript 5.1 § 11.8 Relational Operators + '<' => self::TYPE_BIN_OP, + '>' => self::TYPE_BIN_OP, + '<=' => self::TYPE_BIN_OP, + '>=' => self::TYPE_BIN_OP, + // ECMAScript 5.1 § 11.9 Equality Operators + '==' => self::TYPE_BIN_OP, '!=' => self::TYPE_BIN_OP, + '===' => self::TYPE_BIN_OP, '!==' => self::TYPE_BIN_OP, - '%' => self::TYPE_BIN_OP, - '%=' => self::TYPE_BIN_OP, + 'instanceof' => self::TYPE_BIN_OP, + 'in' => self::TYPE_BIN_OP, + // ECMAScript 5.1 § 11.10 Binary Bitwise Operators '&' => self::TYPE_BIN_OP, + '^' => self::TYPE_BIN_OP, + '|' => self::TYPE_BIN_OP, + // ECMAScript 5.1 § 11.11 Binary Logical Operators '&&' => self::TYPE_BIN_OP, - '&=' => self::TYPE_BIN_OP, - '*' => self::TYPE_BIN_OP, + '||' => self::TYPE_BIN_OP, + // ECMAScript 5.1 § 11.12 Conditional Operator + // Also known as ternary. + '?' => self::TYPE_HOOK, + ':' => self::TYPE_COLON, + // ECMAScript 5.1 § 11.13 Assignment Operators + '=' => self::TYPE_BIN_OP, '*=' => self::TYPE_BIN_OP, + '/=' => self::TYPE_BIN_OP, + '%=' => self::TYPE_BIN_OP, '+=' => self::TYPE_BIN_OP, '-=' => self::TYPE_BIN_OP, - '.' => self::TYPE_BIN_OP, - '/' => self::TYPE_BIN_OP, - '/=' => self::TYPE_BIN_OP, - '<' => self::TYPE_BIN_OP, - '<<' => self::TYPE_BIN_OP, '<<=' => self::TYPE_BIN_OP, - '<=' => self::TYPE_BIN_OP, - '=' => self::TYPE_BIN_OP, - '==' => self::TYPE_BIN_OP, - '===' => self::TYPE_BIN_OP, - '>' => self::TYPE_BIN_OP, - '>=' => self::TYPE_BIN_OP, - '>>' => self::TYPE_BIN_OP, '>>=' => self::TYPE_BIN_OP, - '>>>' => self::TYPE_BIN_OP, '>>>=' => self::TYPE_BIN_OP, - '^' => self::TYPE_BIN_OP, + '&=' => self::TYPE_BIN_OP, '^=' => self::TYPE_BIN_OP, - '|' => self::TYPE_BIN_OP, '|=' => self::TYPE_BIN_OP, - '||' => self::TYPE_BIN_OP, - 'in' => self::TYPE_BIN_OP, - 'instanceof' => self::TYPE_BIN_OP, - '+' => self::TYPE_ADD_OP, - '-' => self::TYPE_ADD_OP, - '?' => self::TYPE_HOOK, - ':' => self::TYPE_COLON, + // ECMAScript 5.1 § 11.14 Comma Operator ',' => self::TYPE_COMMA, - ';' => self::TYPE_SEMICOLON, - '{' => self::TYPE_BRACE_OPEN, - '}' => self::TYPE_BRACE_CLOSE, - '(' => self::TYPE_PAREN_OPEN, - '[' => self::TYPE_PAREN_OPEN, - ')' => self::TYPE_PAREN_CLOSE, - ']' => self::TYPE_PAREN_CLOSE, - 'break' => self::TYPE_RETURN, + + // The keywords that disallow LineTerminator before their + // (sometimes optional) Expression or Identifier. + // + // keyword ; + // keyword [no LineTerminator here] Identifier ; + // keyword [no LineTerminator here] Expression ; + // + // See also ECMAScript 5.1: + // - § 12.7 The continue Statement + // - $ 12.8 The break Statement + // - § 12.9 The return Statement + // - § 12.13 The throw Statement 'continue' => self::TYPE_RETURN, + 'break' => self::TYPE_RETURN, 'return' => self::TYPE_RETURN, 'throw' => self::TYPE_RETURN, + + // The keywords require a parenthesised Expression or Identifier + // before the next Statement. + // + // keyword ( Expression ) Statement + // keyword ( Identifier ) Statement + // + // See also ECMAScript 5.1: + // - § 12.5 The if Statement + // - § 12.6 Iteration Statements (do, while, for) + // - § 12.10 The with Statement + // - § 12.11 The switch Statement + // - § 12.13 The throw Statement + 'if' => self::TYPE_IF, 'catch' => self::TYPE_IF, + 'while' => self::TYPE_IF, 'for' => self::TYPE_IF, - 'if' => self::TYPE_IF, 'switch' => self::TYPE_IF, - 'while' => self::TYPE_IF, 'with' => self::TYPE_IF, - 'case' => self::TYPE_DO, - 'do' => self::TYPE_DO, + + // The keywords followed by an Identifier, Statement, + // Expression, or Block. + // + // var Identifier + // else Statement + // do Statement + // case Expression + // try Block + // finally Block + // + // See also ECMAScript 5.1: + // - § 12.2 Variable Statement + // - § 12.5 The if Statement (else) + // - § 12.6 Iteration Statements (do, while, for) + // - § 12.11 The switch Statement (case) + // - § 12.14 The try Statement + 'var' => self::TYPE_DO, 'else' => self::TYPE_DO, - 'finally' => self::TYPE_DO, + 'do' => self::TYPE_DO, + 'case' => self::TYPE_DO, 'try' => self::TYPE_DO, - 'var' => self::TYPE_DO, - 'function' => self::TYPE_FUNC - ]; + 'finally' => self::TYPE_DO, - // $goto : This is the main table for our state machine. For every state/token pair - // the following state is defined. When no rule exists for a given pair, - // the state is left unchanged. - $goto = [ - self::STATEMENT => [ - self::TYPE_UN_OP => self::EXPRESSION, - self::TYPE_INCR_OP => self::EXPRESSION, - self::TYPE_ADD_OP => self::EXPRESSION, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION, - self::TYPE_RETURN => self::EXPRESSION_NO_NL, - self::TYPE_IF => self::CONDITION, - self::TYPE_FUNC => self::CONDITION, - self::TYPE_LITERAL => self::EXPRESSION_OP - ], - self::CONDITION => [ - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION - ], - self::PROPERTY_ASSIGNMENT => [ - self::TYPE_COLON => self::PROPERTY_EXPRESSION, - self::TYPE_BRACE_OPEN => self::STATEMENT - ], - self::EXPRESSION => [ - self::TYPE_SEMICOLON => self::STATEMENT, - self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION, - self::TYPE_FUNC => self::EXPRESSION_FUNC, - self::TYPE_LITERAL => self::EXPRESSION_OP - ], - self::EXPRESSION_NO_NL => [ - self::TYPE_SEMICOLON => self::STATEMENT, - self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION, - self::TYPE_FUNC => self::EXPRESSION_FUNC, - self::TYPE_LITERAL => self::EXPRESSION_OP - ], - self::EXPRESSION_OP => [ - self::TYPE_BIN_OP => self::EXPRESSION, - self::TYPE_ADD_OP => self::EXPRESSION, - self::TYPE_HOOK => self::EXPRESSION_TERNARY, - self::TYPE_COLON => self::STATEMENT, - self::TYPE_COMMA => self::EXPRESSION, - self::TYPE_SEMICOLON => self::STATEMENT, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION - ], - self::EXPRESSION_FUNC => [ - self::TYPE_BRACE_OPEN => self::STATEMENT - ], - self::EXPRESSION_TERNARY => [ - self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION, - self::TYPE_FUNC => self::EXPRESSION_TERNARY_FUNC, - self::TYPE_LITERAL => self::EXPRESSION_TERNARY_OP - ], - self::EXPRESSION_TERNARY_OP => [ - self::TYPE_BIN_OP => self::EXPRESSION_TERNARY, - self::TYPE_ADD_OP => self::EXPRESSION_TERNARY, - self::TYPE_HOOK => self::EXPRESSION_TERNARY, - self::TYPE_COMMA => self::EXPRESSION_TERNARY, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION - ], - self::EXPRESSION_TERNARY_FUNC => [ - self::TYPE_BRACE_OPEN => self::STATEMENT - ], - self::PAREN_EXPRESSION => [ - self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION, - self::TYPE_FUNC => self::PAREN_EXPRESSION_FUNC, - self::TYPE_LITERAL => self::PAREN_EXPRESSION_OP - ], - self::PAREN_EXPRESSION_OP => [ - self::TYPE_BIN_OP => self::PAREN_EXPRESSION, - self::TYPE_ADD_OP => self::PAREN_EXPRESSION, - self::TYPE_HOOK => self::PAREN_EXPRESSION, - self::TYPE_COLON => self::PAREN_EXPRESSION, - self::TYPE_COMMA => self::PAREN_EXPRESSION, - self::TYPE_SEMICOLON => self::PAREN_EXPRESSION, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION - ], - self::PAREN_EXPRESSION_FUNC => [ - self::TYPE_BRACE_OPEN => self::STATEMENT - ], - self::PROPERTY_EXPRESSION => [ - self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION, - self::TYPE_FUNC => self::PROPERTY_EXPRESSION_FUNC, - self::TYPE_LITERAL => self::PROPERTY_EXPRESSION_OP - ], - self::PROPERTY_EXPRESSION_OP => [ - self::TYPE_BIN_OP => self::PROPERTY_EXPRESSION, - self::TYPE_ADD_OP => self::PROPERTY_EXPRESSION, - self::TYPE_HOOK => self::PROPERTY_EXPRESSION, - self::TYPE_COMMA => self::PROPERTY_ASSIGNMENT, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION - ], - self::PROPERTY_EXPRESSION_FUNC => [ - self::TYPE_BRACE_OPEN => self::STATEMENT - ] + // ECMAScript 5.1 § 13 Function Definition + 'function' => self::TYPE_FUNC, + + // Can be one of: + // - DecimalLiteral (ECMAScript 5.1 § 7.8.3 Numeric Literals) + // - MemberExpression (ECMAScript 5.1 § 11.2 Left-Hand-Side Expressions) + '.' => self::TYPE_BIN_OP, + + // Can be one of: + // - Block (ECMAScript 5.1 § 12.1 Block) + // - ObjectLiteral (ECMAScript 5.1 § 11.1 Primary Expressions) + '{' => self::TYPE_BRACE_OPEN, + '}' => self::TYPE_BRACE_CLOSE, + + // Can be one of: + // - Parenthesised Identifier or Expression after a + // TYPE_IF or TYPE_FUNC keyword. + // - PrimaryExpression (ECMAScript 5.1 § 11.1 Primary Expressions) + // - CallExpression (ECMAScript 5.1 § 11.2 Left-Hand-Side Expressions) + '(' => self::TYPE_PAREN_OPEN, + ')' => self::TYPE_PAREN_CLOSE, + + // Can be one of: + // - ArrayLiteral (ECMAScript 5.1 § 11.1 Primary Expressions) + '[' => self::TYPE_PAREN_OPEN, + ']' => self::TYPE_PAREN_CLOSE, + + // Can be one of: + // - End of any statement + // - EmptyStatement (ECMAScript 5.1 § 12.3 Empty Statement) + ';' => self::TYPE_SEMICOLON, ]; - // $push : This table contains the rules for when to push a state onto the stack. - // The pushed state is the state to return to when the corresponding - // closing token is found - $push = [ + // $model : This is the main table for our state machine. For every state/token pair + // the desired action is defined. + // + // The state pushed onto the stack by ACTION_PUSH will be returned to by ACTION_POP. + // + // A given state/token pair MAY NOT specify both ACTION_POP and ACTION_GOTO. + // In the event of such mistake, ACTION_POP is used instead of ACTION_GOTO. + $model = [ + // Statement - This is the initial state. self::STATEMENT => [ - self::TYPE_BRACE_OPEN => self::STATEMENT, - self::TYPE_PAREN_OPEN => self::EXPRESSION_OP + self::TYPE_UN_OP => [ + self::ACTION_GOTO => self::EXPRESSION, + ], + self::TYPE_INCR_OP => [ + self::ACTION_GOTO => self::EXPRESSION, + ], + self::TYPE_ADD_OP => [ + self::ACTION_GOTO => self::EXPRESSION, + ], + self::TYPE_BRACE_OPEN => [ + // Use of '{' in statement context, creates a Block. + self::ACTION_PUSH => self::STATEMENT, + ], + self::TYPE_BRACE_CLOSE => [ + // Ends a Block + self::ACTION_POP => true, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_RETURN => [ + self::ACTION_GOTO => self::EXPRESSION_NO_NL, + ], + self::TYPE_IF => [ + self::ACTION_GOTO => self::CONDITION, + ], + self::TYPE_FUNC => [ + self::ACTION_GOTO => self::CONDITION, + ], + self::TYPE_LITERAL => [ + self::ACTION_GOTO => self::EXPRESSION_OP, + ], ], self::CONDITION => [ - self::TYPE_PAREN_OPEN => self::STATEMENT + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::STATEMENT, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], ], + // Property assignment - This is an object literal declaration. + // For example: `{ key: value }` self::PROPERTY_ASSIGNMENT => [ - self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT + self::TYPE_COLON => [ + self::ACTION_GOTO => self::PROPERTY_EXPRESSION, + ], + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::PROPERTY_ASSIGNMENT, + self::ACTION_GOTO => self::STATEMENT, + ], + self::TYPE_BRACE_CLOSE => [ + self::ACTION_POP => true, + ], ], self::EXPRESSION => [ - self::TYPE_BRACE_OPEN => self::EXPRESSION_OP, - self::TYPE_PAREN_OPEN => self::EXPRESSION_OP + self::TYPE_SEMICOLON => [ + self::ACTION_GOTO => self::STATEMENT, + ], + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_OP, + self::ACTION_GOTO => self::PROPERTY_ASSIGNMENT, + ], + self::TYPE_BRACE_CLOSE => [ + self::ACTION_POP => true, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_FUNC => [ + self::ACTION_GOTO => self::EXPRESSION_FUNC, + ], + self::TYPE_LITERAL => [ + self::ACTION_GOTO => self::EXPRESSION_OP, + ], ], self::EXPRESSION_NO_NL => [ - self::TYPE_BRACE_OPEN => self::EXPRESSION_OP, - self::TYPE_PAREN_OPEN => self::EXPRESSION_OP + self::TYPE_SEMICOLON => [ + self::ACTION_GOTO => self::STATEMENT, + ], + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_OP, + self::ACTION_GOTO => self::PROPERTY_ASSIGNMENT, + ], + self::TYPE_BRACE_CLOSE => [ + self::ACTION_POP => true, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_FUNC => [ + self::ACTION_GOTO => self::EXPRESSION_FUNC, + ], + self::TYPE_LITERAL => [ + self::ACTION_GOTO => self::EXPRESSION_OP, + ], ], self::EXPRESSION_OP => [ - self::TYPE_HOOK => self::EXPRESSION, - self::TYPE_PAREN_OPEN => self::EXPRESSION_OP + self::TYPE_BIN_OP => [ + self::ACTION_GOTO => self::EXPRESSION, + ], + self::TYPE_ADD_OP => [ + self::ACTION_GOTO => self::EXPRESSION, + ], + self::TYPE_HOOK => [ + self::ACTION_PUSH => self::EXPRESSION, + self::ACTION_GOTO => self::EXPRESSION_TERNARY, + ], + self::TYPE_COLON => [ + self::ACTION_GOTO => self::STATEMENT, + ], + self::TYPE_COMMA => [ + self::ACTION_GOTO => self::EXPRESSION, + ], + self::TYPE_SEMICOLON => [ + self::ACTION_GOTO => self::STATEMENT, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_BRACE_CLOSE => [ + self::ACTION_POP => true, + ], ], self::EXPRESSION_FUNC => [ - self::TYPE_BRACE_OPEN => self::EXPRESSION_OP + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_OP, + self::ACTION_GOTO => self::STATEMENT, + ], ], self::EXPRESSION_TERNARY => [ - self::TYPE_BRACE_OPEN => self::EXPRESSION_TERNARY_OP, - self::TYPE_PAREN_OPEN => self::EXPRESSION_TERNARY_OP + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_TERNARY_OP, + self::ACTION_GOTO => self::PROPERTY_ASSIGNMENT, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_TERNARY_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_FUNC => [ + self::ACTION_GOTO => self::EXPRESSION_TERNARY_FUNC, + ], + self::TYPE_LITERAL => [ + self::ACTION_GOTO => self::EXPRESSION_TERNARY_OP, + ], ], self::EXPRESSION_TERNARY_OP => [ - self::TYPE_HOOK => self::EXPRESSION_TERNARY, - self::TYPE_PAREN_OPEN => self::EXPRESSION_TERNARY_OP + self::TYPE_BIN_OP => [ + self::ACTION_GOTO => self::EXPRESSION_TERNARY, + ], + self::TYPE_ADD_OP => [ + self::ACTION_GOTO => self::EXPRESSION_TERNARY, + ], + self::TYPE_HOOK => [ + self::ACTION_PUSH => self::EXPRESSION_TERNARY, + self::ACTION_GOTO => self::EXPRESSION_TERNARY, + ], + self::TYPE_COMMA => [ + self::ACTION_GOTO => self::EXPRESSION_TERNARY, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_TERNARY_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_COLON => [ + self::ACTION_POP => true, + ], ], self::EXPRESSION_TERNARY_FUNC => [ - self::TYPE_BRACE_OPEN => self::EXPRESSION_TERNARY_OP + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::EXPRESSION_TERNARY_OP, + self::ACTION_GOTO => self::STATEMENT, + ], ], self::PAREN_EXPRESSION => [ - self::TYPE_BRACE_OPEN => self::PAREN_EXPRESSION_OP, - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION_OP + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::PAREN_EXPRESSION_OP, + self::ACTION_GOTO => self::PROPERTY_ASSIGNMENT, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::PAREN_EXPRESSION_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_PAREN_CLOSE => [ + self::ACTION_POP => true, + ], + self::TYPE_FUNC => [ + self::ACTION_GOTO => self::PAREN_EXPRESSION_FUNC, + ], + self::TYPE_LITERAL => [ + self::ACTION_GOTO => self::PAREN_EXPRESSION_OP, + ], ], self::PAREN_EXPRESSION_OP => [ - self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION_OP + self::TYPE_BIN_OP => [ + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_ADD_OP => [ + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_HOOK => [ + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_COLON => [ + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_COMMA => [ + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_SEMICOLON => [ + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::PAREN_EXPRESSION_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_PAREN_CLOSE => [ + self::ACTION_POP => true, + ], ], self::PAREN_EXPRESSION_FUNC => [ - self::TYPE_BRACE_OPEN => self::PAREN_EXPRESSION_OP + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::PAREN_EXPRESSION_OP, + self::ACTION_GOTO => self::STATEMENT, + ], ], + // Property expression - The value of a key in an object literal. self::PROPERTY_EXPRESSION => [ - self::TYPE_BRACE_OPEN => self::PROPERTY_EXPRESSION_OP, - self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::PROPERTY_EXPRESSION_OP, + self::ACTION_GOTO => self::PROPERTY_ASSIGNMENT, + ], + self::TYPE_BRACE_CLOSE => [ + self::ACTION_POP => true, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::PROPERTY_EXPRESSION_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], + self::TYPE_FUNC => [ + self::ACTION_GOTO => self::PROPERTY_EXPRESSION_FUNC, + ], + self::TYPE_LITERAL => [ + self::ACTION_GOTO => self::PROPERTY_EXPRESSION_OP, + ], ], self::PROPERTY_EXPRESSION_OP => [ - self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP + self::TYPE_BIN_OP => [ + self::ACTION_GOTO => self::PROPERTY_EXPRESSION, + ], + self::TYPE_ADD_OP => [ + self::ACTION_GOTO => self::PROPERTY_EXPRESSION, + ], + self::TYPE_HOOK => [ + self::ACTION_PUSH => self::PROPERTY_EXPRESSION, + self::ACTION_GOTO => self::EXPRESSION_TERNARY, + ], + self::TYPE_COMMA => [ + self::ACTION_GOTO => self::PROPERTY_ASSIGNMENT, + ], + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::PROPERTY_EXPRESSION_OP, + ], + self::TYPE_BRACE_CLOSE => [ + self::ACTION_POP => true, + ], + self::TYPE_PAREN_OPEN => [ + self::ACTION_PUSH => self::PROPERTY_EXPRESSION_OP, + self::ACTION_GOTO => self::PAREN_EXPRESSION, + ], ], self::PROPERTY_EXPRESSION_FUNC => [ - self::TYPE_BRACE_OPEN => self::PROPERTY_EXPRESSION_OP - ] - ]; - - // $pop : Rules for when to pop a state from the stack - $pop = [ - self::STATEMENT => [ self::TYPE_BRACE_CLOSE => true ], - self::PROPERTY_ASSIGNMENT => [ self::TYPE_BRACE_CLOSE => true ], - self::EXPRESSION => [ self::TYPE_BRACE_CLOSE => true ], - self::EXPRESSION_NO_NL => [ self::TYPE_BRACE_CLOSE => true ], - self::EXPRESSION_OP => [ self::TYPE_BRACE_CLOSE => true ], - self::EXPRESSION_TERNARY_OP => [ self::TYPE_COLON => true ], - self::PAREN_EXPRESSION => [ self::TYPE_PAREN_CLOSE => true ], - self::PAREN_EXPRESSION_OP => [ self::TYPE_PAREN_CLOSE => true ], - self::PROPERTY_EXPRESSION => [ self::TYPE_BRACE_CLOSE => true ], - self::PROPERTY_EXPRESSION_OP => [ self::TYPE_BRACE_CLOSE => true ] + self::TYPE_BRACE_OPEN => [ + self::ACTION_PUSH => self::PROPERTY_EXPRESSION_OP, + self::ACTION_GOTO => self::STATEMENT, + ], + ], ]; // $semicolon : Rules for when a semicolon insertion is appropriate $semicolon = [ self::EXPRESSION_NO_NL => [ - self::TYPE_UN_OP => true, - self::TYPE_INCR_OP => true, - self::TYPE_ADD_OP => true, + self::TYPE_UN_OP => true, + self::TYPE_INCR_OP => true, + self::TYPE_ADD_OP => true, self::TYPE_BRACE_OPEN => true, self::TYPE_PAREN_OPEN => true, - self::TYPE_RETURN => true, - self::TYPE_IF => true, - self::TYPE_DO => true, - self::TYPE_FUNC => true, - self::TYPE_LITERAL => true + self::TYPE_RETURN => true, + self::TYPE_IF => true, + self::TYPE_DO => true, + self::TYPE_FUNC => true, + self::TYPE_LITERAL => true ], self::EXPRESSION_OP => [ - self::TYPE_UN_OP => true, - self::TYPE_INCR_OP => true, + self::TYPE_UN_OP => true, + self::TYPE_INCR_OP => true, self::TYPE_BRACE_OPEN => true, - self::TYPE_RETURN => true, - self::TYPE_IF => true, - self::TYPE_DO => true, - self::TYPE_FUNC => true, - self::TYPE_LITERAL => true + self::TYPE_RETURN => true, + self::TYPE_IF => true, + self::TYPE_DO => true, + self::TYPE_FUNC => true, + self::TYPE_LITERAL => true ] ]; @@ -583,7 +797,7 @@ class JavaScriptMinifier { $out .= "\n"; $state = self::STATEMENT; $lineLength = 0; - } elseif ( $lineLength + $end - $pos > self::MAX_LINE_LENGTH && + } elseif ( $lineLength + $end - $pos > self::$maxLineLength && !isset( $semicolon[$state][$type] ) && $type !== self::TYPE_INCR_OP ) { // This line would get too long if we added $token, so add a newline first. // Only do this if it won't trigger semicolon insertion and if it won't @@ -615,13 +829,15 @@ class JavaScriptMinifier { $newlineFound = false; // Now that we have output our token, transition into the new state. - if ( isset( $push[$state][$type] ) && count( $stack ) < self::STACK_LIMIT ) { - $stack[] = $push[$state][$type]; + if ( isset( $model[$state][$type][self::ACTION_PUSH] ) && + count( $stack ) < self::STACK_LIMIT + ) { + $stack[] = $model[$state][$type][self::ACTION_PUSH]; } - if ( $stack && isset( $pop[$state][$type] ) ) { + if ( $stack && isset( $model[$state][$type][self::ACTION_POP] ) ) { $state = array_pop( $stack ); - } elseif ( isset( $goto[$state][$type] ) ) { - $state = $goto[$state][$type]; + } elseif ( isset( $model[$state][$type][self::ACTION_GOTO] ) ) { + $state = $model[$state][$type][self::ACTION_GOTO]; } } return $out; diff --git a/includes/libs/MapCacheLRU.php b/includes/libs/MapCacheLRU.php index ad5e58d808..3a549af7af 100644 --- a/includes/libs/MapCacheLRU.php +++ b/includes/libs/MapCacheLRU.php @@ -64,7 +64,7 @@ class MapCacheLRU implements IExpiringStore, Serializable { Assert::parameter( $maxKeys > 0, '$maxKeys', 'must be above zero' ); $this->maxCacheKeys = $maxKeys; - // Use the current time as the default "as of" timesamp of entries + // Use the current time as the default "as of" timestamp of entries $this->epoch = $this->getCurrentTime(); } @@ -141,7 +141,7 @@ class MapCacheLRU implements IExpiringStore, Serializable { public function has( $key, $maxAge = 0.0 ) { if ( !is_int( $key ) && !is_string( $key ) ) { throw new UnexpectedValueException( - __METHOD__ . ' called with invalid key. Must be string or integer.' ); + __METHOD__ . ': invalid key; must be string or integer.' ); } if ( !array_key_exists( $key, $this->cache ) ) { @@ -183,8 +183,15 @@ class MapCacheLRU implements IExpiringStore, Serializable { $this->set( $key, [], $initRank ); } + if ( !is_int( $field ) && !is_string( $field ) ) { + throw new UnexpectedValueException( + __METHOD__ . ": invalid field for '$key'; must be string or integer." ); + } + if ( !is_array( $this->cache[$key] ) ) { - throw new UnexpectedValueException( "The value of '$key' is not an array." ); + $type = gettype( $this->cache[$key] ); + + throw new UnexpectedValueException( "The value of '$key' ($type) is not an array." ); } $this->cache[$key][$field] = $value; @@ -199,6 +206,12 @@ class MapCacheLRU implements IExpiringStore, Serializable { */ public function hasField( $key, $field, $maxAge = 0.0 ) { $value = $this->get( $key ); + + if ( !is_int( $field ) && !is_string( $field ) ) { + throw new UnexpectedValueException( + __METHOD__ . ": invalid field for '$key'; must be string or integer." ); + } + if ( !is_array( $value ) || !array_key_exists( $field, $value ) ) { return false; } diff --git a/includes/libs/StaticArrayWriter.php b/includes/libs/StaticArrayWriter.php new file mode 100644 index 0000000000..cd1860ffe4 --- /dev/null +++ b/includes/libs/StaticArrayWriter.php @@ -0,0 +1,49 @@ + %s,\n"; + $code = " $value ) { + $code .= sprintf( + $format, + var_export( $key, true ), + var_export( $value, true ) + ); + } + $code .= "];\n"; + return $code; + } +} diff --git a/includes/libs/filebackend/FileBackend.php b/includes/libs/filebackend/FileBackend.php index 6d5efa23b9..2852265cbe 100644 --- a/includes/libs/filebackend/FileBackend.php +++ b/includes/libs/filebackend/FileBackend.php @@ -394,7 +394,7 @@ abstract class FileBackend implements LoggerAwareInterface { * This should only be used if all entries in the process * cache were added after the files were already locked. (since 1.20) * - * @remarks Remarks on locking: + * @note Remarks on locking: * File system paths given to operations should refer to files that are * already locked or otherwise safe from modification from other processes. * Normally these files will be new temp files, which should be adequate. diff --git a/includes/libs/objectcache/WANObjectCache.php b/includes/libs/objectcache/WANObjectCache.php index 2989c81c04..716641fcbc 100644 --- a/includes/libs/objectcache/WANObjectCache.php +++ b/includes/libs/objectcache/WANObjectCache.php @@ -107,6 +107,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { protected $useInterimHoldOffCaching = true; /** @var callable|null Function that takes a WAN cache callback and runs it later */ protected $asyncHandler; + /** @var float Unix timestamp of the oldest possible valid values */ + protected $epoch; /** @var int ERR_* constant for the "last error" registry */ protected $lastRelayError = self::ERR_NONE; @@ -223,6 +225,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { * - mcrouterAware: set as true if mcrouter is the backing store proxy and mcrouter * is configured to interpret /// key prefixes as routes. This * requires that "region" and "cluster" are both set above. [optional] + * - epoch: lowest UNIX timestamp a value/tombstone must have to be valid. [optional] */ public function __construct( array $params ) { $this->cache = $params['cache']; @@ -231,6 +234,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { $this->region = $params['region'] ?? 'main'; $this->cluster = $params['cluster'] ?? 'wan-main'; $this->mcrouterAware = !empty( $params['mcrouterAware'] ); + $this->epoch = $params['epoch'] ?? 1.0; $this->setLogger( $params['logger'] ?? new NullLogger() ); $this->stats = $params['stats'] ?? new NullStatsdDataFactory(); @@ -942,7 +946,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { * @code * $catSituationTolerabilityCache = $this->cache->getWithSetCallback( * // Group by constraint ID/hash, cat family ID/hash, or something else useful - * $this->cache->makeKey( 'cat-situation-tolerablity-checks', $groupKey ), + * $this->cache->makeKey( 'cat-situation-tolerability-checks', $groupKey ), * WANObjectCache::TTL_DAY, // rarely used groups should fade away * // The $scenarioKey format is $constraintId: * function ( $cacheMap ) use ( $scenarioKey, $constraintId, $situation ) { @@ -2042,6 +2046,11 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { $curTTL = INF; } + if ( $wrapped[self::FLD_TIME] < $this->epoch ) { + // Values this old are ignored + return [ false, null ]; + } + return [ $wrapped[self::FLD_VALUE], $curTTL ]; } @@ -2070,7 +2079,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { } /** - * @param string $value Wrapped value like "PURGED::" + * @param string|array|bool $value Possible string of the form "PURGED::" * @return array|bool Array containing a UNIX timestamp (float) and holdoff period (integer), * or false if value isn't a valid purge value */ @@ -2078,16 +2087,24 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { if ( !is_string( $value ) ) { return false; } + $segments = explode( ':', $value, 3 ); if ( !isset( $segments[0] ) || !isset( $segments[1] ) || "{$segments[0]}:" !== self::PURGE_VAL_PREFIX ) { return false; } + if ( !isset( $segments[2] ) ) { // Back-compat with old purge values without holdoff $segments[2] = self::HOLDOFF_TTL; } + + if ( $segments[1] < $this->epoch ) { + // Values this old are ignored + return false; + } + return [ self::FLD_TIME => (float)$segments[1], self::FLD_HOLDOFF => (int)$segments[2], diff --git a/includes/libs/rdbms/TransactionProfiler.php b/includes/libs/rdbms/TransactionProfiler.php index c353a224c6..8ea28f0a65 100644 --- a/includes/libs/rdbms/TransactionProfiler.php +++ b/includes/libs/rdbms/TransactionProfiler.php @@ -62,6 +62,7 @@ class TransactionProfiler implements LoggerAwareInterface { 'conns' => INF, 'masterConns' => INF, 'maxAffected' => INF, + 'readQueryRows' => INF, 'readQueryTime' => INF, 'writeQueryTime' => INF ]; @@ -199,7 +200,7 @@ class TransactionProfiler implements LoggerAwareInterface { * @param string $query Function name or generalized SQL * @param float $sTime Starting UNIX wall time * @param bool $isWrite Whether this is a write query - * @param int $n Number of affected rows + * @param int $n Number of affected/read rows */ public function recordQueryCompletion( $query, $sTime, $isWrite = false, $n = 0 ) { $eTime = microtime( true ); @@ -209,6 +210,10 @@ class TransactionProfiler implements LoggerAwareInterface { $this->logger->warning( "Query affected $n row(s):\n" . $query . "\n" . ( new RuntimeException() )->getTraceAsString() ); + } elseif ( !$isWrite && $n > $this->expect['readQueryRows'] ) { + $this->logger->warning( + "Query returned $n row(s):\n" . $query . "\n" . + ( new RuntimeException() )->getTraceAsString() ); } // Report when too many writes/queries happen... diff --git a/includes/libs/rdbms/database/DBConnRef.php b/includes/libs/rdbms/database/DBConnRef.php index 7cb0604e51..eba1657f29 100644 --- a/includes/libs/rdbms/database/DBConnRef.php +++ b/includes/libs/rdbms/database/DBConnRef.php @@ -371,7 +371,8 @@ class DBConnRef implements IDatabase { } public function selectDB( $db ) { - return $this->__call( __FUNCTION__, func_get_args() ); + // Disallow things that might confuse the LoadBalancer tracking + throw new DBUnexpectedError( $this, "Database selection is disallowed to enable reuse." ); } public function getDBname() { diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index 4070a02b32..e35e0827b0 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -1132,11 +1132,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware if ( $this->trxLevel && !$this->trxDoneWrites && $isWrite ) { $this->trxDoneWrites = true; $this->trxProfiler->transactionWritingIn( - $this->server, $this->dbName, $this->trxShortId ); + $this->server, $this->getDomainID(), $this->trxShortId ); } if ( $this->getFlag( self::DBO_DEBUG ) ) { - $this->queryLogger->debug( "{$this->dbName} {$commentedSql}" ); + $this->queryLogger->debug( "{$this->getDomainID()} {$commentedSql}" ); } # Send the query to the server and fetch any corresponding errors @@ -1239,7 +1239,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } $this->trxProfiler->recordQueryCompletion( - $queryProf, $startTime, $isWrite, $this->affectedRows() + $queryProf, + $startTime, + $isWrite, + $isWrite ? $this->affectedRows() : $this->numRows( $ret ) ); $this->queryLogger->debug( $sql, [ 'method' => $fname, @@ -3853,7 +3856,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->lastWriteTime = microtime( true ); $this->trxProfiler->transactionWritingOut( $this->server, - $this->dbName, + $this->getDomainID(), $this->trxShortId, $writeTime, $this->trxWriteAffectedRows @@ -3904,7 +3907,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware if ( $this->trxDoneWrites ) { $this->trxProfiler->transactionWritingOut( $this->server, - $this->dbName, + $this->getDomainID(), $this->trxShortId, $writeTime, $this->trxWriteAffectedRows @@ -4587,7 +4590,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware */ public function __clone() { $this->connLogger->warning( - "Cloning " . static::class . " is not recomended; forking connection:\n" . + "Cloning " . static::class . " is not recommended; forking connection:\n" . ( new RuntimeException() )->getTraceAsString() ); diff --git a/includes/libs/rdbms/database/DatabaseMysqlBase.php b/includes/libs/rdbms/database/DatabaseMysqlBase.php index 3ecfca9108..57fab54936 100644 --- a/includes/libs/rdbms/database/DatabaseMysqlBase.php +++ b/includes/libs/rdbms/database/DatabaseMysqlBase.php @@ -367,7 +367,7 @@ abstract class DatabaseMysqlBase extends Database { $res = $res->result; } Wikimedia\suppressWarnings(); - $n = $this->mysqlNumRows( $res ); + $n = $res ? $this->mysqlNumRows( $res ) : 0; Wikimedia\restoreWarnings(); // Unfortunately, mysql_num_rows does not reset the last errno. diff --git a/includes/libs/rdbms/database/DatabasePostgres.php b/includes/libs/rdbms/database/DatabasePostgres.php index a043cd6a89..a959d72ba8 100644 --- a/includes/libs/rdbms/database/DatabasePostgres.php +++ b/includes/libs/rdbms/database/DatabasePostgres.php @@ -299,6 +299,10 @@ class DatabasePostgres extends Database { } public function numRows( $res ) { + if ( $res === false ) { + return 0; + } + if ( $res instanceof ResultWrapper ) { $res = $res->result; } @@ -645,7 +649,7 @@ __INDEXATTR__; * be quoted with Database::addQuotes() * $conds may be "*" to copy the whole table * srcTable may be an array of tables. - * @todo FIXME: Implement this a little better (seperate select/insert)? + * @todo FIXME: Implement this a little better (separate select/insert)? * * @param string $destTable * @param array|string $srcTable diff --git a/includes/libs/rdbms/database/DatabaseSqlite.php b/includes/libs/rdbms/database/DatabaseSqlite.php index b0fd12a69c..25fbba09e5 100644 --- a/includes/libs/rdbms/database/DatabaseSqlite.php +++ b/includes/libs/rdbms/database/DatabaseSqlite.php @@ -399,13 +399,14 @@ class DatabaseSqlite extends Database { /** * The PDO::Statement class implements the array interface so count() will work * - * @param ResultWrapper|array $res + * @param ResultWrapper|array|false $res * @return int */ function numRows( $res ) { + // false does not implement Countable $r = $res instanceof ResultWrapper ? $res->result : $res; - return count( $r ); + return is_array( $r ) ? count( $r ) : 0; } /** diff --git a/includes/libs/rdbms/database/IDatabase.php b/includes/libs/rdbms/database/IDatabase.php index 61788e1f48..7da259d9f0 100644 --- a/includes/libs/rdbms/database/IDatabase.php +++ b/includes/libs/rdbms/database/IDatabase.php @@ -1208,10 +1208,10 @@ interface IDatabase { * errors which wouldn't have occurred in MySQL. * * @param string $table The table to replace the row(s) in. - * @param array $uniqueIndexes Is an array of indexes. Each element may be either - * a field name or an array of field names + * @param array $uniqueIndexes Either a list of fields that define a unique index or + * an array of such lists if there are multiple unique indexes defined in the schema * @param array $rows Can be either a single row to insert, or multiple rows, - * in the same format as for IDatabase::insert() + * in the same format as for IDatabase::insert() * @param string $fname Calling function name (use __METHOD__) for logs/profiling * @throws DBError */ @@ -1243,7 +1243,8 @@ interface IDatabase { * * @param string $table Table name. This will be passed through Database::tableName(). * @param array $rows A single row or list of rows to insert - * @param array $uniqueIndexes List of single field names or field name tuples + * @param array $uniqueIndexes Either a list of fields that define a unique index or + * an array of such lists if there are multiple unique indexes defined in the schema * @param array $set An array of values to SET. For each array element, the * key gives the field name, and the value gives the data to set that * field to. The data will be quoted by IDatabase::addQuotes(). diff --git a/includes/libs/rdbms/lbfactory/ILBFactory.php b/includes/libs/rdbms/lbfactory/ILBFactory.php index 222d7d1c96..23699c7a88 100644 --- a/includes/libs/rdbms/lbfactory/ILBFactory.php +++ b/includes/libs/rdbms/lbfactory/ILBFactory.php @@ -338,7 +338,7 @@ interface ILBFactory { /** * Append ?cpPosIndex parameter to a URL for ChronologyProtector purposes if needed * - * Note that unlike cookies, this works accross domains + * Note that unlike cookies, this works across domains * * @param string $url * @param int $index Write counter index diff --git a/includes/libs/rdbms/lbfactory/LBFactory.php b/includes/libs/rdbms/lbfactory/LBFactory.php index e47e75e178..be1a8511dc 100644 --- a/includes/libs/rdbms/lbfactory/LBFactory.php +++ b/includes/libs/rdbms/lbfactory/LBFactory.php @@ -135,6 +135,7 @@ abstract class LBFactory implements ILBFactory { 'IPAddress' => $_SERVER[ 'REMOTE_ADDR' ] ?? '', 'UserAgent' => $_SERVER['HTTP_USER_AGENT'] ?? '', // Headers application can inject via LBFactory::setRequestInfo() + 'ChronologyProtection' => null, 'ChronologyClientId' => null, // prior $cpClientId value from LBFactory::shutdown() 'ChronologyPositionIndex' => null // prior $cpIndex value from LBFactory::shutdown() ]; diff --git a/includes/libs/rdbms/loadbalancer/ILoadBalancer.php b/includes/libs/rdbms/loadbalancer/ILoadBalancer.php index 0ff6a32980..9f7d0502ae 100644 --- a/includes/libs/rdbms/loadbalancer/ILoadBalancer.php +++ b/includes/libs/rdbms/loadbalancer/ILoadBalancer.php @@ -187,7 +187,8 @@ interface ILoadBalancer { /** * Get any open connection to a given server index, local or foreign * - * Use CONN_TRX_AUTOCOMMIT to only look for connections opened with that flag + * Use CONN_TRX_AUTOCOMMIT to only look for connections opened with that flag. + * Avoid the use of begin() or startAtomic() on any such connections. * * @param int $i Server index or DB_MASTER/DB_REPLICA * @param int $flags Bitfield of CONN_* class constants @@ -202,9 +203,10 @@ interface ILoadBalancer { * (e.g. sqlite) in order to avoid deadlocks. ILoadBalancer::getServerAttributes() * can be used to check such flags beforehand. * - * If the caller uses $domain or sets CONN_TRX_AUTOCOMMIT in $flags, then it must also - * call ILoadBalancer::reuseConnection() on the handle when finished using it. + * If the caller uses $domain or sets CONN_TRX_AUTOCOMMIT in $flags, then it must + * also call ILoadBalancer::reuseConnection() on the handle when finished using it. * In all other cases, this is not necessary, though not harmful either. + * Avoid the use of begin() or startAtomic() on any such connections. * * @param int $i Server index (overrides $groups) or DB_MASTER/DB_REPLICA * @param array|string|bool $groups Query group(s), or false for the generic reader @@ -236,7 +238,8 @@ interface ILoadBalancer { * * The CONN_TRX_AUTOCOMMIT flag is ignored for databases with ATTR_DB_LEVEL_LOCKING * (e.g. sqlite) in order to avoid deadlocks. ILoadBalancer::getServerAttributes() - * can be used to check such flags beforehand. + * can be used to check such flags beforehand. Avoid the use of begin() or startAtomic() + * on any CONN_TRX_AUTOCOMMIT connections. * * @see ILoadBalancer::getConnection() for parameter information * @@ -255,7 +258,8 @@ interface ILoadBalancer { * * The CONN_TRX_AUTOCOMMIT flag is ignored for databases with ATTR_DB_LEVEL_LOCKING * (e.g. sqlite) in order to avoid deadlocks. ILoadBalancer::getServerAttributes() - * can be used to check such flags beforehand. + * can be used to check such flags beforehand. Avoid the use of begin() or startAtomic() + * on any CONN_TRX_AUTOCOMMIT connections. * * @see ILoadBalancer::getConnection() for parameter information * @@ -274,7 +278,8 @@ interface ILoadBalancer { * * The CONN_TRX_AUTOCOMMIT flag is ignored for databases with ATTR_DB_LEVEL_LOCKING * (e.g. sqlite) in order to avoid deadlocks. ILoadBalancer::getServerAttributes() - * can be used to check such flags beforehand. + * can be used to check such flags beforehand. Avoid the use of begin() or startAtomic() + * on any CONN_TRX_AUTOCOMMIT connections. * * @see ILoadBalancer::getConnection() for parameter information * @@ -292,13 +297,14 @@ interface ILoadBalancer { * The index must be an actual index into the array. If a connection to the server is * already open and not considered an "in use" foreign connection, this simply returns it. * - * Avoid using CONN_TRX_AUTOCOMMIT for databases with ATTR_DB_LEVEL_LOCKING (e.g. sqlite) in - * order to avoid deadlocks. ILoadBalancer::getServerAttributes() can be used to check + * Avoid using CONN_TRX_AUTOCOMMIT for databases with ATTR_DB_LEVEL_LOCKING (e.g. sqlite) + * in order to avoid deadlocks. ILoadBalancer::getServerAttributes() can be used to check * such flags beforehand. * - * If the caller uses $domain or sets CONN_TRX_AUTOCOMMIT in $flags, then it must also - * call ILoadBalancer::reuseConnection() on the handle when finished using it. + * If the caller uses $domain or sets CONN_TRX_AUTOCOMMIT in $flags, then it must + * also call ILoadBalancer::reuseConnection() on the handle when finished using it. * In all other cases, this is not necessary, though not harmful either. + * Avoid the use of begin() or startAtomic() on any such connections. * * @note This method throws DBAccessError if ILoadBalancer::disable() was called * @@ -350,6 +356,7 @@ interface ILoadBalancer { * Return the server info structure for a given index, or false if the index is invalid. * @param int $i * @return array|bool + * @since 1.31 */ public function getServerInfo( $i ); diff --git a/includes/libs/rdbms/loadbalancer/LoadBalancer.php b/includes/libs/rdbms/loadbalancer/LoadBalancer.php index f2f9eb0709..fbc3be96be 100644 --- a/includes/libs/rdbms/loadbalancer/LoadBalancer.php +++ b/includes/libs/rdbms/loadbalancer/LoadBalancer.php @@ -886,34 +886,7 @@ class LoadBalancer implements ILoadBalancer { $conn = $this->openForeignConnection( $i, $domain, $flags ); } else { // Connection is to the local domain - $connKey = $autoCommit ? self::KEY_LOCAL_NOROUND : self::KEY_LOCAL; - if ( isset( $this->conns[$connKey][$i][0] ) ) { - $conn = $this->conns[$connKey][$i][0]; - } else { - if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) { - throw new InvalidArgumentException( "No server with index '$i'." ); - } - // Open a new connection - $server = $this->servers[$i]; - $server['serverIndex'] = $i; - $server['autoCommitOnly'] = $autoCommit; - if ( $this->localDomain->getDatabase() !== null ) { - // Use the local domain table prefix if the local domain is specified - $server['tablePrefix'] = $this->localDomain->getTablePrefix(); - } - $conn = $this->reallyOpenConnection( $server, $this->localDomain ); - $host = $this->getServerName( $i ); - if ( $conn->isOpen() ) { - $this->connLogger->debug( - __METHOD__ . ": connected to database $i at '$host'." ); - $this->conns[$connKey][$i][0] = $conn; - } else { - $this->connLogger->warning( - __METHOD__ . ": failed to connect to database $i at '$host'." ); - $this->errorConnection = $conn; - $conn = false; - } - } + $conn = $this->openLocalConnection( $i, $flags ); } if ( $conn instanceof IDatabase && !$conn->isOpen() ) { @@ -926,12 +899,66 @@ class LoadBalancer implements ILoadBalancer { } if ( $autoCommit && $conn instanceof IDatabase ) { + if ( $conn->trxLevel() ) { // sanity + throw new DBUnexpectedError( + $conn, + __METHOD__ . ': CONN_TRX_AUTOCOMMIT handle has a transaction.' + ); + } + $conn->clearFlag( $conn::DBO_TRX ); // auto-commit mode } return $conn; } + /** + * Open a connection to a local DB, or return one if it is already open. + * + * On error, returns false, and the connection which caused the + * error will be available via $this->errorConnection. + * + * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError. + * + * @param int $i Server index + * @param int $flags Class CONN_* constant bitfield + * @return Database + */ + private function openLocalConnection( $i, $flags = 0 ) { + $autoCommit = ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT ); + + $connKey = $autoCommit ? self::KEY_LOCAL_NOROUND : self::KEY_LOCAL; + if ( isset( $this->conns[$connKey][$i][0] ) ) { + $conn = $this->conns[$connKey][$i][0]; + } else { + if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) { + throw new InvalidArgumentException( "No server with index '$i'." ); + } + // Open a new connection + $server = $this->servers[$i]; + $server['serverIndex'] = $i; + $server['autoCommitOnly'] = $autoCommit; + if ( $this->localDomain->getDatabase() !== null ) { + // Use the local domain table prefix if the local domain is specified + $server['tablePrefix'] = $this->localDomain->getTablePrefix(); + } + $conn = $this->reallyOpenConnection( $server, $this->localDomain ); + $host = $this->getServerName( $i ); + if ( $conn->isOpen() ) { + $this->connLogger->debug( + __METHOD__ . ": connected to database $i at '$host'." ); + $this->conns[$connKey][$i][0] = $conn; + } else { + $this->connLogger->warning( + __METHOD__ . ": failed to connect to database $i at '$host'." ); + $this->errorConnection = $conn; + $conn = false; + } + } + + return $conn; + } + /** * Open a connection to a foreign DB, or return one if it is already open. * @@ -1901,14 +1928,14 @@ class LoadBalancer implements ILoadBalancer { "Foreign domain connections are still in use ($domains)." ); } - $oldDomain = $this->localDomain->getId(); $this->setLocalDomain( new DatabaseDomain( $this->localDomain->getDatabase(), $this->localDomain->getSchema(), $prefix ) ); - $this->forEachOpenConnection( function ( IDatabase $db ) use ( $prefix, $oldDomain ) { + // Update the prefix for all local connections... + $this->forEachOpenConnection( function ( IDatabase $db ) use ( $prefix ) { if ( !$db->getLBInfo( 'foreign' ) ) { $db->tablePrefix( $prefix ); } diff --git a/includes/libs/stats/PrefixingStatsdDataFactoryProxy.php b/includes/libs/stats/PrefixingStatsdDataFactoryProxy.php new file mode 100644 index 0000000000..136a614c3c --- /dev/null +++ b/includes/libs/stats/PrefixingStatsdDataFactoryProxy.php @@ -0,0 +1,96 @@ +factory = $factory; + $this->prefix = rtrim( $prefix, '.' ); + } + + /** + * @param string $key + * @return string + */ + private function addPrefixToKey( $key ) { + return $this->prefix . '.' . $key; + } + + public function timing( $key, $time ) { + return $this->factory->timing( $this->addPrefixToKey( $key ), $time ); + } + + public function gauge( $key, $value ) { + return $this->factory->gauge( $this->addPrefixToKey( $key ), $value ); + } + + public function set( $key, $value ) { + return $this->factory->set( $this->addPrefixToKey( $key ), $value ); + } + + public function increment( $key ) { + return $this->factory->increment( $this->addPrefixToKey( $key ) ); + } + + public function decrement( $key ) { + return $this->factory->decrement( $this->addPrefixToKey( $key ) ); + } + + public function updateCount( $key, $delta ) { + return $this->factory->updateCount( $this->addPrefixToKey( $key ), $delta ); + } + + public function produceStatsdData( + $key, + $value = 1, + $metric = StatsdDataInterface::STATSD_METRIC_COUNT + ) { + return $this->factory->produceStatsdData( + $this->addPrefixToKey( $key ), + $value, + $metric + ); + } +} diff --git a/includes/logging/BlockLogFormatter.php b/includes/logging/BlockLogFormatter.php index 0d22382785..3762d62787 100644 --- a/includes/logging/BlockLogFormatter.php +++ b/includes/logging/BlockLogFormatter.php @@ -130,7 +130,7 @@ class BlockLogFormatter extends LogFormatter { * @param Language $lang * @return string */ - public static function formatBlockFlags( $flags, $lang ) { + public static function formatBlockFlags( $flags, Language $lang ) { $flags = trim( $flags ); if ( $flags === '' ) { return ''; // nothing to do @@ -153,7 +153,7 @@ class BlockLogFormatter extends LogFormatter { * @param Language $lang Language object to use * @return string */ - public static function formatBlockFlag( $flag, $lang ) { + public static function formatBlockFlag( $flag, Language $lang ) { static $messages = []; if ( !isset( $messages[$flag] ) ) { diff --git a/includes/logging/LogEventsList.php b/includes/logging/LogEventsList.php index f032efc5c5..a5aa6879e9 100644 --- a/includes/logging/LogEventsList.php +++ b/includes/logging/LogEventsList.php @@ -130,10 +130,13 @@ class LogEventsList extends ContextSource { !empty( $extraInputsDescriptor ) ) { $formDescriptor[ 'extra' ] = $extraInputsDescriptor; - } elseif ( is_string( $extraInputsDescriptor ) ) { + } elseif ( + is_string( $extraInputsDescriptor ) && + $extraInputsDescriptor !== '' + ) { // We'll add this to the footer of the form later $extraInputsString = $extraInputsDescriptor; - wfDeprecated( 'Using $input in LogEventsListGetExtraInputs hook', '1.32' ); + wfDeprecated( '$input in LogEventsListGetExtraInputs hook', '1.32' ); } // Title pattern, if allowed diff --git a/includes/logging/LogFormatter.php b/includes/logging/LogFormatter.php index d59c6aa1ca..e14c485147 100644 --- a/includes/logging/LogFormatter.php +++ b/includes/logging/LogFormatter.php @@ -189,6 +189,7 @@ class LogFormatter { * to avoid formatting for any particular user. * @see getActionText() * @return string Plain text + * @return-taint tainted */ public function getPlainActionText() { $this->plaintext = true; @@ -226,8 +227,6 @@ class LogFormatter { * @return string Text */ public function getIRCActionText() { - global $wgContLang; - $this->plaintext = true; $this->irctext = true; @@ -237,6 +236,7 @@ class LogFormatter { // Text of title the action is aimed at. $target = $entry->getTarget()->getPrefixedText(); $text = null; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); switch ( $entry->getType() ) { case 'move': switch ( $entry->getSubtype() ) { @@ -382,12 +382,12 @@ class LogFormatter { $rawDuration = $parameters['5::duration']; $rawFlags = $parameters['6::flags']; } - $duration = $wgContLang->translateBlockExpiry( + $duration = $contLang->translateBlockExpiry( $rawDuration, null, wfTimestamp( TS_UNIX, $entry->getTimestamp() ) ); - $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $wgContLang ); + $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $contLang ); $text = wfMessage( 'blocklogentry' ) ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped(); break; @@ -396,12 +396,13 @@ class LogFormatter { ->rawParams( $target )->inContentLanguage()->escaped(); break; case 'reblock': - $duration = $wgContLang->translateBlockExpiry( + $duration = $contLang->translateBlockExpiry( $parameters['5::duration'], null, wfTimestamp( TS_UNIX, $entry->getTimestamp() ) ); - $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'], $wgContLang ); + $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'], + $contLang ); $text = wfMessage( 'reblock-logentry' ) ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped(); break; @@ -436,6 +437,8 @@ class LogFormatter { /** * Gets the log action, including username. * @return string HTML + * phan-taint-check gets very confused by $this->plaintext, so disable. + * @return-taint onlysafefor_html */ public function getActionText() { if ( $this->canView( LogPage::DELETED_ACTION ) ) { @@ -642,13 +645,18 @@ class LogFormatter { * @param Title|null $title The page * @param array $parameters Query parameters * @param string|null $html Linktext of the link as raw html - * @throws MWException * @return string */ protected function makePageLink( Title $title = null, $parameters = [], $html = null ) { if ( !$title instanceof Title ) { - throw new MWException( 'Expected title, got null' ); + $msg = $this->msg( 'invalidtitle' )->text(); + if ( !$this->plaintext ) { + return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ], $msg ); + } else { + return $msg; + } } + if ( !$this->plaintext ) { $html = $html !== null ? new HtmlArmor( $html ) : $html; $link = $this->getLinkRenderer()->makeLink( $title, $html, [], $parameters ); @@ -702,6 +710,7 @@ class LogFormatter { * Helper method for displaying restricted element. * @param string $message * @return string HTML or wiki text + * @return-taint onlysafefor_html */ protected function getRestrictedElement( $message ) { if ( $this->plaintext ) { @@ -737,6 +746,12 @@ class LogFormatter { return $this->context->msg( $key ); } + /** + * @param User $user + * @param int $toolFlags Combination of Linker::TOOL_LINKS_* flags + * @return string wikitext or html + * @return-taint onlysafefor_html + */ protected function makeUserLink( User $user, $toolFlags = 0 ) { if ( $this->plaintext ) { $element = $user->getName(); @@ -938,6 +953,10 @@ class LegacyLogFormatter extends LogFormatter { return $this->comment; } + /** + * @return string + * @return-taint onlysafefor_html + */ protected function getActionMessage() { $entry = $this->entry; $action = LogPage::actionText( diff --git a/includes/logging/LogPage.php b/includes/logging/LogPage.php index 265a41cdaf..af99940cb1 100644 --- a/includes/logging/LogPage.php +++ b/includes/logging/LogPage.php @@ -223,10 +223,10 @@ class LogPage { public static function actionText( $type, $action, $title = null, $skin = null, $params = [], $filterWikilinks = false ) { - global $wgLang, $wgContLang, $wgLogActions; + global $wgLang, $wgLogActions; if ( is_null( $skin ) ) { - $langObj = $wgContLang; + $langObj = MediaWikiServices::getInstance()->getContentLanguage(); $langObjOrNull = null; } else { $langObj = $wgLang; @@ -294,9 +294,11 @@ class LogPage { return $title->getPrefixedText(); } - $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); + $services = MediaWikiServices::getInstance(); + $linkRenderer = $services->getLinkRenderer(); if ( $title->isSpecialPage() ) { - list( $name, $par ) = SpecialPageFactory::resolveAlias( $title->getDBkey() ); + list( $name, $par ) = $services->getSpecialPageFactory()-> + resolveAlias( $title->getDBkey() ); # Use the language name for log titles, rather than Log/X if ( $name == 'Log' ) { diff --git a/includes/logging/ProtectLogFormatter.php b/includes/logging/ProtectLogFormatter.php index 931829ab20..ba02457319 100644 --- a/includes/logging/ProtectLogFormatter.php +++ b/includes/logging/ProtectLogFormatter.php @@ -22,6 +22,8 @@ * @since 1.26 */ +use MediaWiki\MediaWikiServices; + /** * This class formats protect log entries. * @@ -146,13 +148,13 @@ class ProtectLogFormatter extends LogFormatter { } public function formatParametersForApi() { - global $wgContLang; - $ret = parent::formatParametersForApi(); if ( isset( $ret['details'] ) && is_array( $ret['details'] ) ) { + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); foreach ( $ret['details'] as &$detail ) { if ( isset( $detail['expiry'] ) ) { - $detail['expiry'] = $wgContLang->formatExpiry( $detail['expiry'], TS_ISO_8601, 'infinite' ); + $detail['expiry'] = $contLang-> + formatExpiry( $detail['expiry'], TS_ISO_8601, 'infinite' ); } } } diff --git a/includes/logging/RightsLogFormatter.php b/includes/logging/RightsLogFormatter.php index 6e527e8487..c958947b01 100644 --- a/includes/logging/RightsLogFormatter.php +++ b/includes/logging/RightsLogFormatter.php @@ -23,6 +23,8 @@ * @since 1.22 */ +use MediaWiki\MediaWikiServices; + /** * This class formats rights log entries. * @@ -30,10 +32,11 @@ */ class RightsLogFormatter extends LogFormatter { protected function makePageLink( Title $title = null, $parameters = [], $html = null ) { - global $wgContLang, $wgUserrightsInterwikiDelimiter; + global $wgUserrightsInterwikiDelimiter; if ( !$this->plaintext ) { - $text = $wgContLang->ucfirst( $title->getDBkey() ); + $text = MediaWikiServices::getInstance()->getContentLanguage()-> + ucfirst( $title->getDBkey() ); $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 ); if ( count( $parts ) === 2 ) { diff --git a/includes/mail/EmailNotification.php b/includes/mail/EmailNotification.php index 67b7142a07..314450470e 100644 --- a/includes/mail/EmailNotification.php +++ b/includes/mail/EmailNotification.php @@ -452,7 +452,7 @@ class EmailNotification { * @private */ function sendPersonalised( $watchingUser, $source ) { - global $wgContLang, $wgEnotifUseRealName; + global $wgEnotifUseRealName; // From the PHP manual: // Note: The to parameter cannot be an address in the form of // "Something ". The mail command will not parse @@ -462,14 +462,15 @@ class EmailNotification { # $PAGEEDITDATE is the time and date of the page change # expressed in terms of individual local time of the notification # recipient, i.e. watching user + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $body = str_replace( [ '$WATCHINGUSERNAME', '$PAGEEDITDATE', '$PAGEEDITTIME' ], [ $wgEnotifUseRealName && $watchingUser->getRealName() !== '' ? $watchingUser->getRealName() : $watchingUser->getName(), - $wgContLang->userDate( $this->timestamp, $watchingUser ), - $wgContLang->userTime( $this->timestamp, $watchingUser ) ], + $contLang->userDate( $this->timestamp, $watchingUser ), + $contLang->userTime( $this->timestamp, $watchingUser ) ], $this->body ); $headers = []; @@ -490,19 +491,18 @@ class EmailNotification { * @return Status|null */ function sendImpersonal( $addresses ) { - global $wgContLang; - if ( empty( $addresses ) ) { return null; } + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $body = str_replace( [ '$WATCHINGUSERNAME', '$PAGEEDITDATE', '$PAGEEDITTIME' ], [ wfMessage( 'enotif_impersonal_salutation' )->inContentLanguage()->text(), - $wgContLang->date( $this->timestamp, false, false ), - $wgContLang->time( $this->timestamp, false, false ) ], + $contLang->date( $this->timestamp, false, false ), + $contLang->time( $this->timestamp, false, false ) ], $this->body ); return UserMailer::send( $addresses, $this->from, $this->subject, $body, [ diff --git a/includes/media/BitmapMetadataHandler.php b/includes/media/BitmapMetadataHandler.php index c0dfa3a074..81c63db2e6 100644 --- a/includes/media/BitmapMetadataHandler.php +++ b/includes/media/BitmapMetadataHandler.php @@ -123,7 +123,7 @@ class BitmapMetadataHandler { */ function getMetadataArray() { // this seems a bit ugly... This is all so its merged in right order - // based on the MWG recomendation. + // based on the MWG recommendation. $temp = []; krsort( $this->metaPriority ); foreach ( $this->metaPriority as $pri ) { diff --git a/includes/media/DjVuHandler.php b/includes/media/DjVuHandler.php index 14074ef4ec..00dfb724e5 100644 --- a/includes/media/DjVuHandler.php +++ b/includes/media/DjVuHandler.php @@ -252,7 +252,7 @@ class DjVuHandler extends ImageHandler { } /** - * Get metadata, unserializing it if neccessary. + * Get metadata, unserializing it if necessary. * * @param File $file The DjVu file in question * @return string XML metadata as a string. diff --git a/includes/media/FormatMetadata.php b/includes/media/FormatMetadata.php index f647a9dd79..345b3cb60f 100644 --- a/includes/media/FormatMetadata.php +++ b/includes/media/FormatMetadata.php @@ -1003,13 +1003,12 @@ class FormatMetadata extends ContextSource { public static function flattenArrayContentLang( $vals, $type = 'ul', $noHtml = false, $context = false ) { - global $wgContLang; $obj = new FormatMetadata; if ( $context ) { $obj->setContext( $context ); } $context = new DerivativeContext( $obj->getContext() ); - $context->setLanguage( $wgContLang ); + $context->setLanguage( MediaWikiServices::getInstance()->getContentLanguage() ); $obj->setContext( $context ); return $obj->flattenArrayReal( $vals, $type, $noHtml ); @@ -1056,7 +1055,7 @@ class FormatMetadata extends ContextSource { */ switch ( $type ) { case 'lang': - // Display default, followed by ContLang, + // Display default, followed by ContentLanguage, // followed by the rest in no particular // order. @@ -1218,13 +1217,15 @@ class FormatMetadata extends ContextSource { * @return string The text content of "exif-$tag-$val" message in lower case */ private function exifMsg( $tag, $val, $arg = null, $arg2 = null ) { - global $wgContLang; - if ( $val === '' ) { $val = 'value'; } - return $this->msg( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text(); + return $this->msg( + MediaWikiServices::getInstance()->getContentLanguage()->lc( "exif-$tag-$val" ), + $arg, + $arg2 + )->text(); } /** diff --git a/includes/media/SVGMetadataExtractor.php b/includes/media/SVGMetadataExtractor.php index e00a5b380c..e52bf0b26a 100644 --- a/includes/media/SVGMetadataExtractor.php +++ b/includes/media/SVGMetadataExtractor.php @@ -325,7 +325,7 @@ class SVGReader { if ( $this->reader->getAttribute( 'viewBox' ) ) { // min-x min-y width height - $viewBox = preg_split( '/\s+/', trim( $this->reader->getAttribute( 'viewBox' ) ) ); + $viewBox = preg_split( '/\s*[\s,]\s*/', trim( $this->reader->getAttribute( 'viewBox' ) ) ); if ( count( $viewBox ) == 4 ) { $viewWidth = $this->scaleSVGUnit( $viewBox[2] ); $viewHeight = $this->scaleSVGUnit( $viewBox[3] ); @@ -380,7 +380,11 @@ class SVGReader { '' => 1.0, // "User units" pixels by default ]; $matches = []; - if ( preg_match( '/^\s*(\d+(?:\.\d+)?)(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/', $length, $matches ) ) { + if ( preg_match( + '/^\s*([-+]?\d*(?:\.\d+|\d+)(?:[Ee][-+]?\d+)?)\s*(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/', + $length, + $matches + ) ) { $length = floatval( $matches[1] ); $unit = $matches[2]; if ( $unit == '%' ) { diff --git a/includes/page/Article.php b/includes/page/Article.php index 49912c77dd..3a7b18e4c0 100644 --- a/includes/page/Article.php +++ b/includes/page/Article.php @@ -750,7 +750,7 @@ class Article implements Page { * @return array The policy that should be set * @todo actions other than 'view' */ - public function getRobotPolicy( $action, $pOutput = null ) { + public function getRobotPolicy( $action, ParserOutput $pOutput = null ) { global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy; $ns = $this->getTitle()->getNamespace(); diff --git a/includes/page/ImageHistoryList.php b/includes/page/ImageHistoryList.php index bb8ed2420b..1f87d93360 100644 --- a/includes/page/ImageHistoryList.php +++ b/includes/page/ImageHistoryList.php @@ -18,6 +18,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * Builds the image revision log shown on image pages * @@ -111,8 +113,6 @@ class ImageHistoryList extends ContextSource { * @return string */ public function imageHistoryLine( $iscur, $file ) { - global $wgContLang; - $user = $this->getUser(); $lang = $this->getLanguage(); $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() ); @@ -264,8 +264,9 @@ class ImageHistoryList extends ContextSource { $row .= '' . $this->msg( 'rev-deleted-comment' )->escaped() . ''; } else { - $row .= '' . - Linker::formatComment( $description, $this->title ) . ''; + $row .= + '' . Linker::formatComment( $description, $this->title ) . ''; } $rowClass = null; diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php index a1b2e574d1..147c9f311d 100644 --- a/includes/page/WikiPage.php +++ b/includes/page/WikiPage.php @@ -1625,7 +1625,7 @@ class WikiPage implements Page, IDBAccessObject { * @return DerivedPageDataUpdater */ private function newDerivedDataUpdater() { - global $wgContLang, $wgRCWatchCategoryMembership, $wgArticleCountMethod; + global $wgRCWatchCategoryMembership, $wgArticleCountMethod; $derivedDataUpdater = new DerivedPageDataUpdater( $this, // NOTE: eventually, PageUpdater should not know about WikiPage @@ -1633,7 +1633,7 @@ class WikiPage implements Page, IDBAccessObject { $this->getParserCache(), JobQueueGroup::singleton(), MessageCache::singleton(), - $wgContLang, + MediaWikiServices::getInstance()->getContentLanguage(), LoggerFactory::getInstance( 'SaveParse' ) ); @@ -2301,14 +2301,13 @@ class WikiPage implements Page, IDBAccessObject { * @return string */ protected function formatExpiry( $expiry ) { - global $wgContLang; - if ( $expiry != 'infinity' ) { + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); return wfMessage( 'protect-expiring', - $wgContLang->timeanddate( $expiry, false, false ), - $wgContLang->date( $expiry, false, false ), - $wgContLang->time( $expiry, false, false ) + $contLang->timeanddate( $expiry, false, false ), + $contLang->date( $expiry, false, false ), + $contLang->time( $expiry, false, false ) )->inContentLanguage()->text(); } else { return wfMessage( 'protect-expiry-indefinite' ) @@ -2366,13 +2365,13 @@ class WikiPage implements Page, IDBAccessObject { * @return string */ public function protectDescriptionLog( array $limit, array $expiry ) { - global $wgContLang; - $protectDescriptionLog = ''; + $dirMark = MediaWikiServices::getInstance()->getContentLanguage()->getDirMark(); foreach ( array_filter( $limit ) as $action => $restrictions ) { $expiryText = $this->formatExpiry( $expiry[$action] ); - $protectDescriptionLog .= $wgContLang->getDirMark() . + $protectDescriptionLog .= + $dirMark . "[$action=$restrictions] ($expiryText)"; } @@ -2841,7 +2840,7 @@ class WikiPage implements Page, IDBAccessObject { public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser, $tags = null ) { - global $wgUseRCPatrol, $wgContLang; + global $wgUseRCPatrol; $dbw = wfGetDB( DB_MASTER ); @@ -2922,13 +2921,14 @@ class WikiPage implements Page, IDBAccessObject { $targetEditorForPublic = $target->getUser( RevisionRecord::FOR_PUBLIC ); // Allow the custom summary to use the same args as the default message + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $args = [ $targetEditorForPublic ? $targetEditorForPublic->getName() : null, $currentEditorForPublic ? $currentEditorForPublic->getName() : null, $s->rev_id, - $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ), + $contLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ), $current->getId(), - $wgContLang->timeanddate( $current->getTimestamp() ) + $contLang->timeanddate( $current->getTimestamp() ) ]; if ( $summary instanceof Message ) { $summary = $summary->params( $args )->inContentLanguage()->text(); @@ -3479,7 +3479,7 @@ class WikiPage implements Page, IDBAccessObject { public function getMutableCacheKeys( WANObjectCache $cache ) { $linkCache = MediaWikiServices::getInstance()->getLinkCache(); - return $linkCache->getMutableCacheKeys( $cache, $this->getTitle()->getTitleValue() ); + return $linkCache->getMutableCacheKeys( $cache, $this->getTitle() ); } } diff --git a/includes/pager/RangeChronologicalPager.php b/includes/pager/RangeChronologicalPager.php index d3cb566823..bf36983530 100644 --- a/includes/pager/RangeChronologicalPager.php +++ b/includes/pager/RangeChronologicalPager.php @@ -45,14 +45,12 @@ abstract class RangeChronologicalPager extends ReverseChronologicalPager { try { if ( $startStamp !== '' ) { $startTimestamp = MWTimestamp::getInstance( $startStamp ); - $startTimestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) ); $startOffset = $this->mDb->timestamp( $startTimestamp->getTimestamp() ); $this->rangeConds[] = $this->mIndexField . '>=' . $this->mDb->addQuotes( $startOffset ); } if ( $endStamp !== '' ) { $endTimestamp = MWTimestamp::getInstance( $endStamp ); - $endTimestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) ); $endOffset = $this->mDb->timestamp( $endTimestamp->getTimestamp() ); $this->rangeConds[] = $this->mIndexField . '<=' . $this->mDb->addQuotes( $endOffset ); diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php index 3c47de3f45..1f5308fbdc 100644 --- a/includes/parser/CoreParserFunctions.php +++ b/includes/parser/CoreParserFunctions.php @@ -135,14 +135,13 @@ class CoreParserFunctions { } public static function ns( $parser, $part1 = '' ) { - global $wgContLang; if ( intval( $part1 ) || $part1 == "0" ) { $index = intval( $part1 ); } else { - $index = $wgContLang->getNsIndex( str_replace( ' ', '_', $part1 ) ); + $index = $parser->getContentLanguage()->getNsIndex( str_replace( ' ', '_', $part1 ) ); } if ( $index !== false ) { - return $wgContLang->getFormattedNsText( $index ); + return $parser->getContentLanguage()->getFormattedNsText( $index ); } else { return [ 'found' => false ]; } @@ -197,13 +196,11 @@ class CoreParserFunctions { } public static function lcfirst( $parser, $s = '' ) { - global $wgContLang; - return $wgContLang->lcfirst( $s ); + return $parser->getContentLanguage()->lcfirst( $s ); } public static function ucfirst( $parser, $s = '' ) { - global $wgContLang; - return $wgContLang->ucfirst( $s ); + return $parser->getContentLanguage()->ucfirst( $s ); } /** @@ -212,8 +209,7 @@ class CoreParserFunctions { * @return string */ public static function lc( $parser, $s = '' ) { - global $wgContLang; - return $parser->markerSkipCallback( $s, [ $wgContLang, 'lc' ] ); + return $parser->markerSkipCallback( $s, [ $parser->getContentLanguage(), 'lc' ] ); } /** @@ -222,8 +218,7 @@ class CoreParserFunctions { * @return string */ public static function uc( $parser, $s = '' ) { - global $wgContLang; - return $parser->markerSkipCallback( $s, [ $wgContLang, 'uc' ] ); + return $parser->markerSkipCallback( $s, [ $parser->getContentLanguage(), 'uc' ] ); } public static function localurl( $parser, $s = '', $arg = null ) { @@ -742,7 +737,6 @@ class CoreParserFunctions { * @return string */ public static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) { - global $wgContLang; static $magicWords = null; if ( is_null( $magicWords ) ) { $magicWords = $parser->getMagicWordFactory()->newArray( [ @@ -772,7 +766,7 @@ class CoreParserFunctions { if ( !$title ) { # invalid title return self::formatRaw( 0, $raw, $parser->getFunctionLang() ); } - $wgContLang->findVariantLink( $name, $title, true ); + $parser->getContentLanguage()->findVariantLink( $name, $title, true ); // Normalize name for cache $name = $title->getDBkey(); @@ -956,7 +950,8 @@ class CoreParserFunctions { } public static function special( $parser, $text ) { - list( $page, $subpage ) = SpecialPageFactory::resolveAlias( $text ); + list( $page, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + resolveAlias( $text ); if ( $page ) { $title = SpecialPage::getTitleFor( $page, $subpage ); return $title->getPrefixedText(); diff --git a/includes/parser/DateFormatter.php b/includes/parser/DateFormatter.php index 2aefc0396f..de02861b3c 100644 --- a/includes/parser/DateFormatter.php +++ b/includes/parser/DateFormatter.php @@ -21,6 +21,8 @@ * @ingroup Parser */ +use MediaWiki\MediaWikiServices; + /** * Date formatter, recognises dates in plain text and formats them according to user preferences. * @todo preferences, OutputPage @@ -131,9 +133,9 @@ class DateFormatter { * @return DateFormatter */ public static function getInstance( Language $lang = null ) { - global $wgContLang, $wgMainCacheType; + global $wgMainCacheType; - $lang = $lang ?: $wgContLang; + $lang = $lang ?? MediaWikiServices::getInstance()->getContentLanguage(); $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType ); static $dateFormatter = false; diff --git a/includes/parser/LinkHolderArray.php b/includes/parser/LinkHolderArray.php index 66fd723384..f4856be96d 100644 --- a/includes/parser/LinkHolderArray.php +++ b/includes/parser/LinkHolderArray.php @@ -282,8 +282,6 @@ class LinkHolderArray { return; } - global $wgContLang; - $colours = []; $linkCache = MediaWikiServices::getInstance()->getLinkCache(); $output = $this->parent->getOutput(); @@ -364,7 +362,7 @@ class LinkHolderArray { } # Do a second query for different language variants of links and categories - if ( $wgContLang->hasVariants() ) { + if ( $this->parent->getContentLanguage()->hasVariants() ) { $this->doVariants( $colours ); } @@ -452,7 +450,6 @@ class LinkHolderArray { * @param array &$colours */ protected function doVariants( &$colours ) { - global $wgContLang; $linkBatch = new LinkBatch(); $variantMap = []; // maps $pdbkey_Variant => $keys (of link holders) $output = $this->parent->getOutput(); @@ -480,7 +477,8 @@ class LinkHolderArray { } // Now do the conversion and explode string to text of titles - $titlesAllVariants = $wgContLang->autoConvertToAllVariants( rtrim( $titlesToBeConverted, "\0" ) ); + $titlesAllVariants = $this->parent->getContentLanguage()-> + autoConvertToAllVariants( rtrim( $titlesToBeConverted, "\0" ) ); $allVariantsName = array_keys( $titlesAllVariants ); foreach ( $titlesAllVariants as &$titlesVariant ) { $titlesVariant = explode( "\0", $titlesVariant ); @@ -521,7 +519,7 @@ class LinkHolderArray { foreach ( $output->getCategoryLinks() as $category ) { $categoryTitle = Title::makeTitleSafe( NS_CATEGORY, $category ); $linkBatch->addObj( $categoryTitle ); - $variants = $wgContLang->autoConvertToAllVariants( $category ); + $variants = $this->parent->getContentLanguage()->autoConvertToAllVariants( $category ); foreach ( $variants as $variant ) { if ( $variant !== $category ) { $variantTitle = Title::makeTitleSafe( NS_CATEGORY, $variant ); diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 2778ea6965..6bee1692c4 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -22,6 +22,7 @@ */ use MediaWiki\Linker\LinkRenderer; use MediaWiki\MediaWikiServices; +use MediaWiki\Special\SpecialPageFactory; use Wikimedia\ScopedCallback; /** @@ -51,9 +52,6 @@ use Wikimedia\ScopedCallback; * - Parser::getPreloadText() * removes sections and tags * - * Globals used: - * object: $wgContLang - * * @warning $wgUser or $wgTitle or $wgRequest or $wgLang. Keep them away! * * @par Settings: @@ -153,6 +151,9 @@ class Parser { public $mImageParams = []; public $mImageParamsMagicArray = []; public $mMarkerIndex = 0; + /** + * @var bool Whether firstCallInit still needs to be called + */ public $mFirstCall = true; # Initialised by initialiseVariables() @@ -263,13 +264,29 @@ class Parser { /** @var MagicWordFactory */ private $magicWordFactory; + /** @var Language */ + private $contLang; + + /** @var ParserFactory */ + private $factory; + + /** @var SpecialPageFactory */ + private $specialPageFactory; + /** - * @param array $conf + * @param array $conf See $wgParserConf documentation * @param MagicWordFactory|null $magicWordFactory - */ - public function __construct( $conf = [], MagicWordFactory $magicWordFactory = null ) { + * @param Language|null $contLang Content language + * @param ParserFactory|null $factory + * @param string|null $urlProtocols As returned from wfUrlProtocols() + * @param SpecialPageFactory|null $spFactory + */ + public function __construct( + array $conf = [], MagicWordFactory $magicWordFactory = null, Language $contLang = null, + ParserFactory $factory = null, $urlProtocols = null, SpecialPageFactory $spFactory = null + ) { $this->mConf = $conf; - $this->mUrlProtocols = wfUrlProtocols(); + $this->mUrlProtocols = $urlProtocols ?? wfUrlProtocols(); $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' . self::EXT_LINK_ADDR . self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F\\x{FFFD}]*?)\]/Su'; @@ -289,10 +306,14 @@ class Parser { } wfDebug( __CLASS__ . ": using preprocessor: {$this->mPreprocessorClass}\n" ); - $this->magicWordFactory = $magicWordFactory; - if ( !$magicWordFactory ) { - $this->magicWordFactory = MediaWikiServices::getInstance()->getMagicWordFactory(); - } + $services = MediaWikiServices::getInstance(); + $this->magicWordFactory = $magicWordFactory ?? + $services->getMagicWordFactory(); + + $this->contLang = $contLang ?? $services->getContentLanguage(); + + $this->factory = $factory ?? $services->getParserFactory(); + $this->specialPageFactory = $spFactory ?? $services->getSpecialPageFactory(); } /** @@ -354,9 +375,7 @@ class Parser { * @private */ public function clearState() { - if ( $this->mFirstCall ) { - $this->firstCallInit(); - } + $this->firstCallInit(); $this->mOutput = new ParserOutput; $this->mOptions->registerWatcher( [ $this->mOutput, 'recordOption' ] ); $this->mAutonumber = 0; @@ -967,6 +986,16 @@ class Parser { return $this->magicWordFactory; } + /** + * Get the content language that this Parser is using + * + * @since 1.32 + * @return Language + */ + public function getContentLanguage() { + return $this->contLang; + } + /** * Replaces all occurrences of HTML-style comments and the given tags * in the text with a random marker and returns the next text. The output @@ -2146,8 +2175,7 @@ class Parser { if ( $useLinkPrefixExtension ) { # Match the end of a line for a word that's not followed by whitespace, # e.g. in the case of 'The Arab al[[Razi]]', 'al' will be matched - global $wgContLang; - $charset = $wgContLang->linkPrefixCharset(); + $charset = $this->contLang->linkPrefixCharset(); $e2 = "/^((?>.*[^$charset]|))(.+)$/sDu"; } @@ -2508,7 +2536,7 @@ class Parser { * @return string */ public function getVariableValue( $index, $frame = false ) { - global $wgContLang, $wgSitename, $wgServer, $wgServerName; + global $wgSitename, $wgServer, $wgServerName; global $wgArticlePath, $wgScriptPath, $wgStylePath; if ( is_null( $this->mTitle ) ) { @@ -2702,10 +2730,11 @@ class Parser { $value = $this->getRevisionSize(); break; case 'namespace': - $value = str_replace( '_', ' ', $wgContLang->getNsText( $this->mTitle->getNamespace() ) ); + $value = str_replace( '_', ' ', + $this->contLang->getNsText( $this->mTitle->getNamespace() ) ); break; case 'namespacee': - $value = wfUrlencode( $wgContLang->getNsText( $this->mTitle->getNamespace() ) ); + $value = wfUrlencode( $this->contLang->getNsText( $this->mTitle->getNamespace() ) ); break; case 'namespacenumber': $value = $this->mTitle->getNamespace(); @@ -2848,15 +2877,13 @@ class Parser { * @return string */ private function getRevisionTimestampSubstring( $start, $len, $mtts, $variable ) { - global $wgContLang; - # Get the timezone-adjusted timestamp to be used for this revision $resNow = substr( $this->getRevisionTimestamp(), $start, $len ); # Possibly set vary-revision if there is not yet an associated revision if ( !$this->getRevisionObject() ) { # Get the timezone-adjusted timestamp $mtts seconds in the future $resThen = substr( - $wgContLang->userAdjust( wfTimestamp( TS_MW, time() + $mtts ), '' ), + $this->contLang->userAdjust( wfTimestamp( TS_MW, time() + $mtts ), '' ), $start, $len ); @@ -3224,7 +3251,7 @@ class Parser { && $this->mOptions->getAllowSpecialInclusion() && $this->ot['html'] ) { - $specialPage = SpecialPageFactory::getPage( $title->getDBkey() ); + $specialPage = $this->specialPageFactory->getPage( $title->getDBkey() ); // Pass the template arguments as URL parameters. // "uselang" will have no effect since the Language object // is forced to the one defined in ParserOptions. @@ -3250,8 +3277,7 @@ class Parser { $context->setUser( User::newFromName( '127.0.0.1', false ) ); } $context->setLanguage( $this->mOptions->getUserLangObj() ); - $ret = SpecialPageFactory::capturePath( - $title, $context, $this->getLinkRenderer() ); + $ret = $this->specialPageFactory->capturePath( $title, $context, $this->getLinkRenderer() ); if ( $ret ) { $text = $context->getOutput()->getHTML(); $this->mOutput->addOutputPageMetadata( $context->getOutput() ); @@ -3403,14 +3429,12 @@ class Parser { * @return array */ public function callParserFunction( $frame, $function, array $args = [] ) { - global $wgContLang; - # Case sensitive functions if ( isset( $this->mFunctionSynonyms[1][$function] ) ) { $function = $this->mFunctionSynonyms[1][$function]; } else { # Case insensitive functions - $function = $wgContLang->lc( $function ); + $function = $this->contLang->lc( $function ); if ( isset( $this->mFunctionSynonyms[0][$function] ) ) { $function = $this->mFunctionSynonyms[0][$function]; } else { @@ -3675,8 +3699,8 @@ class Parser { break; } } elseif ( $title->getNamespace() == NS_MEDIAWIKI ) { - global $wgContLang; - $message = wfMessage( $wgContLang->lcfirst( $title->getText() ) )->inContentLanguage(); + $message = wfMessage( MediaWikiServices::getInstance()->getContentLanguage()-> + lcfirst( $title->getText() ) )->inContentLanguage(); if ( !$message->exists() ) { $text = false; break; @@ -4513,19 +4537,15 @@ class Parser { * @return string */ private function pstPass2( $text, $user ) { - global $wgContLang; - - # Note: This is the timestamp saved as hardcoded wikitext to - # the database, we use $wgContLang here in order to give - # everyone the same signature and use the default one rather - # than the one selected in each user's preferences. - # (see also T14815) + # Note: This is the timestamp saved as hardcoded wikitext to the database, we use + # $this->contLang here in order to give everyone the same signature and use the default one + # rather than the one selected in each user's preferences. (see also T14815) $ts = $this->mOptions->getTimestamp(); $timestamp = MWTimestamp::getLocalInstance( $ts ); $ts = $timestamp->format( 'YmdHis' ); $tzMsg = $timestamp->getTimezoneMessage()->inContentLanguage()->text(); - $d = $wgContLang->timeanddate( $ts, false, false ) . " ($tzMsg)"; + $d = $this->contLang->timeanddate( $ts, false, false ) . " ($tzMsg)"; # Variable replacement # Because mOutputType is OT_WIKI, this will only process {{subst:xxx}} type tags @@ -4876,8 +4896,6 @@ class Parser { * @return string|callable The old callback function for this name, if any */ public function setFunctionHook( $id, callable $callback, $flags = 0 ) { - global $wgContLang; - $oldVal = isset( $this->mFunctionHooks[$id] ) ? $this->mFunctionHooks[$id][0] : null; $this->mFunctionHooks[$id] = [ $callback, $flags ]; @@ -4893,7 +4911,7 @@ class Parser { foreach ( $synonyms as $syn ) { # Case if ( !$sensitive ) { - $syn = $wgContLang->lc( $syn ); + $syn = $this->contLang->lc( $syn ); } # Add leading hash if ( !( $flags & self::SFH_NO_HASH ) ) { @@ -4914,6 +4932,7 @@ class Parser { * @return array */ public function getFunctionHooks() { + $this->firstCallInit(); return array_keys( $this->mFunctionHooks ); } @@ -5470,6 +5489,7 @@ class Parser { * @return array */ public function getTags() { + $this->firstCallInit(); return array_merge( array_keys( $this->mTransparentTagHooks ), array_keys( $this->mTagHooks ), @@ -5477,6 +5497,23 @@ class Parser { ); } + /** + * @since 1.32 + * @return array + */ + public function getFunctionSynonyms() { + $this->firstCallInit(); + return $this->mFunctionSynonyms; + } + + /** + * @since 1.32 + * @return string + */ + public function getUrlProtocols() { + return $this->mUrlProtocols; + } + /** * Replace transparent tags in $text with the values given by the callbacks. * @@ -5729,8 +5766,6 @@ class Parser { */ public function getRevisionTimestamp() { if ( is_null( $this->mRevisionTimestamp ) ) { - global $wgContLang; - $revObject = $this->getRevisionObject(); $timestamp = $revObject ? $revObject->getTimestamp() : wfTimestampNow(); @@ -5739,8 +5774,7 @@ class Parser { # Since this value will be saved into the parser cache, served # to other users, and potentially even used inside links and such, # it needs to be consistent for all visitors. - $this->mRevisionTimestamp = $wgContLang->userAdjust( $timestamp, '' ); - + $this->mRevisionTimestamp = $this->contLang->userAdjust( $timestamp, '' ); } return $this->mRevisionTimestamp; } @@ -6195,9 +6229,8 @@ class Parser { * @return Parser A parser object that is not parsing anything */ public function getFreshParser() { - global $wgParserConf; if ( $this->mInParse ) { - return new $wgParserConf['class']( $wgParserConf ); + return $this->factory->create(); } else { return $this; } diff --git a/includes/parser/ParserCache.php b/includes/parser/ParserCache.php index e6326e6c69..5e6081d33d 100644 --- a/includes/parser/ParserCache.php +++ b/includes/parser/ParserCache.php @@ -294,7 +294,13 @@ class ParserCache { * @param string|null $cacheTime TS_MW timestamp when the cache was generated * @param int|null $revId Revision ID that was parsed */ - public function save( $parserOutput, $page, $popts, $cacheTime = null, $revId = null ) { + public function save( + ParserOutput $parserOutput, + $page, + $popts, + $cacheTime = null, + $revId = null + ) { $expire = $parserOutput->getCacheExpiry(); if ( $expire > 0 && !$this->mMemc instanceof EmptyBagOStuff ) { $cacheTime = $cacheTime ?: wfTimestampNow(); diff --git a/includes/parser/ParserFactory.php b/includes/parser/ParserFactory.php new file mode 100644 index 0000000000..4238b2750a --- /dev/null +++ b/includes/parser/ParserFactory.php @@ -0,0 +1,70 @@ +conf = $conf; + $this->magicWordFactory = $magicWordFactory; + $this->contLang = $contLang; + $this->urlProtocols = $urlProtocols; + $this->specialPageFactory = $spFactory; + } + + /** + * @return Parser + * @since 1.32 + */ + public function create() : Parser { + return new Parser( $this->conf, $this->magicWordFactory, $this->contLang, $this, + $this->urlProtocols, $this->specialPageFactory ); + } +} diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index e4b064e0ca..b30c1163b8 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -968,8 +968,8 @@ class ParserOptions { * @return ParserOptions */ public static function newFromAnon() { - global $wgContLang; - return new ParserOptions( new User, $wgContLang ); + return new ParserOptions( new User, + MediaWikiServices::getInstance()->getContentLanguage() ); } /** @@ -1021,7 +1021,7 @@ class ParserOptions { * @param IContextSource|string|User|null $context * - If an IContextSource, the options are initialized based on the source's User and Language. * - If the string 'canonical', the options are initialized with an anonymous user and - * $wgContLang. + * the content language. * - If a User or null, the options are initialized for that User (or $wgUser if null). * 'userlang' is taken from the $userLang parameter, defaulting to $wgLang if that is null. * @param Language|StubObject|null $userLang (see above) @@ -1061,7 +1061,7 @@ class ParserOptions { $wgMaxArticleSize, $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth, $wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit, $wgMaxGeneratedPPNodeCount, $wgDisableLangConversion, $wgDisableTitleConversion, - $wgEnableMagicLinks, $wgContLang; + $wgEnableMagicLinks; if ( self::$defaults === null ) { // *UPDATE* ParserOptions::matches() if any of this changes as needed @@ -1115,7 +1115,7 @@ class ParserOptions { 'numberheadings' => User::getDefaultOption( 'numberheadings' ), 'thumbsize' => User::getDefaultOption( 'thumbsize' ), 'stubthreshold' => 0, - 'userlang' => $wgContLang, + 'userlang' => MediaWikiServices::getInstance()->getContentLanguage(), ]; } @@ -1329,8 +1329,8 @@ class ParserOptions { if ( !is_null( $title ) ) { $confstr .= $title->getPageLanguage()->getExtraHashOptions(); } else { - global $wgContLang; - $confstr .= $wgContLang->getExtraHashOptions(); + $confstr .= + MediaWikiServices::getInstance()->getContentLanguage()->getExtraHashOptions(); } $confstr .= $wgRenderHashAppend; diff --git a/includes/parser/Sanitizer.php b/includes/parser/Sanitizer.php index 461440228c..d885e24c25 100644 --- a/includes/parser/Sanitizer.php +++ b/includes/parser/Sanitizer.php @@ -24,6 +24,8 @@ * @ingroup Parser */ +use MediaWiki\MediaWikiServices; + /** * HTML sanitizer for MediaWiki * @ingroup Parser @@ -1657,7 +1659,6 @@ class Sanitizer { * @return string Still normalized, without entities */ public static function decodeCharReferencesAndNormalize( $text ) { - global $wgContLang; $text = preg_replace_callback( self::CHAR_REFS_REGEX, [ self::class, 'decodeCharReferencesCallback' ], @@ -1667,7 +1668,7 @@ class Sanitizer { ); if ( $count ) { - return $wgContLang->normalize( $text ); + return MediaWikiServices::getInstance()->getContentLanguage()->normalize( $text ); } else { return $text; } diff --git a/includes/password/PasswordFactory.php b/includes/password/PasswordFactory.php index bc37b48404..f7b283be71 100644 --- a/includes/password/PasswordFactory.php +++ b/includes/password/PasswordFactory.php @@ -36,6 +36,7 @@ final class PasswordFactory { /** * Mapping of password types to classes + * * @var array * @see PasswordFactory::register * @see Setup.php @@ -44,11 +45,31 @@ final class PasswordFactory { '' => [ 'type' => '', 'class' => InvalidPassword::class ], ]; + /** + * Construct a new password factory. + * Most of the time you'll want to use MediaWikiServices::getPasswordFactory instead. + * @param array $config Mapping of password type => config + * @param string $default Default password type + * @see PasswordFactory::register + * @see PasswordFactory::setDefaultType + */ + public function __construct( array $config = [], $default = '' ) { + foreach ( $config as $type => $options ) { + $this->register( $type, $options ); + } + + if ( $default !== '' ) { + $this->setDefaultType( $default ); + } + } + /** * Register a new type of password hash * - * @param string $type Unique type name for the hash - * @param array $config Array of configuration options + * @param string $type Unique type name for the hash. Will be prefixed to the password hashes + * to identify what hashing method was used. + * @param array $config Array of configuration options. 'class' is required (the Password + * subclass name), everything else is passed to the constructor of that class. */ public function register( $type, array $config ) { $config['type'] = $type; @@ -58,8 +79,11 @@ final class PasswordFactory { /** * Set the default password type * - * @throws InvalidArgumentException If the type is not registered + * This type will be used for creating new passwords when the type is not specified. + * Passwords of a different type will be considered outdated and in need of update. + * * @param string $type Password hash type + * @throws InvalidArgumentException If the type is not registered */ public function setDefaultType( $type ) { if ( !isset( $this->types[$type] ) ) { @@ -78,6 +102,8 @@ final class PasswordFactory { } /** + * @deprecated since 1.32 Initialize settings using the constructor + * * Initialize the internal static variables using the global variables * * @param Config $config Configuration object to load data from diff --git a/includes/password/PasswordPolicyChecks.php b/includes/password/PasswordPolicyChecks.php index 502f1e024c..837e959780 100644 --- a/includes/password/PasswordPolicyChecks.php +++ b/includes/password/PasswordPolicyChecks.php @@ -21,6 +21,7 @@ */ use Cdb\Reader as CdbReader; +use MediaWiki\MediaWikiServices; /** * Functions to check passwords against a policy requirement @@ -81,10 +82,12 @@ class PasswordPolicyChecks { * @return Status error if username and password match, and policy is true */ public static function checkPasswordCannotMatchUsername( $policyVal, User $user, $password ) { - global $wgContLang; $status = Status::newGood(); $username = $user->getName(); - if ( $policyVal && $wgContLang->lc( $password ) === $wgContLang->lc( $username ) ) { + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + if ( + $policyVal && $contLang->lc( $password ) === $contLang->lc( $username ) + ) { $status->error( 'password-name-match' ); } return $status; diff --git a/includes/password/commonpasswords.cdb b/includes/password/commonpasswords.cdb new file mode 100644 index 0000000000..7b7b043171 Binary files /dev/null and b/includes/password/commonpasswords.cdb differ diff --git a/includes/preferences/DefaultPreferencesFactory.php b/includes/preferences/DefaultPreferencesFactory.php index 830da0653d..07d8b0b840 100644 --- a/includes/preferences/DefaultPreferencesFactory.php +++ b/includes/preferences/DefaultPreferencesFactory.php @@ -66,7 +66,7 @@ class DefaultPreferencesFactory implements PreferencesFactory { /** @var Config */ protected $config; - /** @var Language The wiki's content language, equivalent to $wgContLang. */ + /** @var Language The wiki's content language. */ protected $contLang; /** @var AuthManager */ diff --git a/includes/registration/ExtensionProcessor.php b/includes/registration/ExtensionProcessor.php index d0a987116d..bf617792a9 100644 --- a/includes/registration/ExtensionProcessor.php +++ b/includes/registration/ExtensionProcessor.php @@ -48,7 +48,6 @@ class ExtensionProcessor implements Processor { 'RecentChangesFlags', 'RemoveCredentialsBlacklist', 'RemoveGroups', - 'ResourceLoaderLESSVars', 'ResourceLoaderSources', 'RevokePermissions', 'SessionProviders', diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index aa632c3c20..98bae24934 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -37,14 +37,11 @@ use Wikimedia\WrappedString; */ class ResourceLoader implements LoggerAwareInterface { /** @var int */ - protected static $filterCacheVersion = 7; + protected static $filterCacheVersion = 8; /** @var bool */ protected static $debugMode = null; - /** @var array */ - private $lessVars = null; - /** * Module name/ResourceLoaderModule object pairs * @var array @@ -1095,7 +1092,7 @@ MESSAGE; break; case 'styles': $styles = $content['styles']; - // We no longer seperate into media, they are all combined now with + // We no longer separate into media, they are all combined now with // custom media type groups into @media .. {} sections as part of the css string. // Module returns either an empty array or a numerical array with css strings. $strContent = isset( $styles['css'] ) ? implode( '', $styles['css'] ) : ''; @@ -1298,8 +1295,8 @@ MESSAGE; } /** - * Returns a JS call to mw.loader.state, which sets the state of a - * module or modules to a given value. Has two calling conventions: + * Returns a JS call to mw.loader.state, which sets the state of one + * ore more modules to a given value. Has two calling conventions: * * - ResourceLoader::makeLoaderStateScript( $name, $state ): * Set the state of a single module called $name to $state @@ -1307,24 +1304,19 @@ MESSAGE; * - ResourceLoader::makeLoaderStateScript( [ $name => $state, ... ] ): * Set the state of modules with the given names to the given states * - * @param string $name + * @param array|string $states * @param string|null $state * @return string JavaScript code */ - public static function makeLoaderStateScript( $name, $state = null ) { - if ( is_array( $name ) ) { - return Xml::encodeJsCall( - 'mw.loader.state', - [ $name ], - self::inDebugMode() - ); - } else { - return Xml::encodeJsCall( - 'mw.loader.state', - [ $name, $state ], - self::inDebugMode() - ); + public static function makeLoaderStateScript( $states, $state = null ) { + if ( !is_array( $states ) ) { + $states = [ $states => $state ]; } + return Xml::encodeJsCall( + 'mw.loader.state', + [ $states ], + self::inDebugMode() + ); } /** @@ -1484,16 +1476,33 @@ MESSAGE; } /** - * Wraps JavaScript code to run after startup and base modules. + * Wraps JavaScript code to run after the startup module. * * @param string $script JavaScript code * @return string JavaScript code */ public static function makeLoaderConditionalScript( $script ) { + // Adds a function to lazy-created RLQ return '(window.RLQ=window.RLQ||[]).push(function(){' . trim( $script ) . '});'; } + /** + * Wraps JavaScript code to run after a required module. + * + * @since 1.32 + * @param string|string[] $modules Module name(s) + * @param string $script JavaScript code + * @return string JavaScript code + */ + public static function makeInlineCodeWithModule( $modules, $script ) { + // Adds an array to lazy-created RLQ + return '(window.RLQ=window.RLQ||[]).push([' + . json_encode( $modules ) . ',' + . 'function(){' . trim( $script ) . '}' + . ']);'; + } + /** * Returns an HTML script tag that runs given JS code after startup and base modules. * @@ -1732,12 +1741,10 @@ MESSAGE; * Get global LESS variables. * * @since 1.27 + * @deprecated since 1.32 Use ResourceLoderModule::getLessVars() instead. * @return array Map of variable names to string CSS values. */ public function getLessVars() { - if ( $this->lessVars === null ) { - $this->lessVars = $this->config->get( 'ResourceLoaderLESSVars' ); - } - return $this->lessVars; + return []; } } diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php index b2ca2911b0..42bd66a0e8 100644 --- a/includes/resourceloader/ResourceLoaderFileModule.php +++ b/includes/resourceloader/ResourceLoaderFileModule.php @@ -460,9 +460,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { throw new MWException( __METHOD__ . ": skip function file not found: \"$localPath\"" ); } $contents = $this->stripBom( file_get_contents( $localPath ) ); - if ( $this->getConfig()->get( 'ResourceLoaderValidateStaticJS' ) ) { - $contents = $this->validateScriptFile( $localPath, $contents ); - } return $contents; } @@ -807,12 +804,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { throw new MWException( __METHOD__ . ": script file not found: \"$localPath\"" ); } $contents = $this->stripBom( file_get_contents( $localPath ) ); - if ( $this->getConfig()->get( 'ResourceLoaderValidateStaticJS' ) ) { - // Static files don't really need to be checked as often; unlike - // on-wiki module they shouldn't change unexpectedly without - // admin interference. - $contents = $this->validateScriptFile( $fileName, $contents ); - } $js .= $contents . "\n"; } return $js; @@ -959,10 +950,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING ); } - $vars = array_merge( - $context->getResourceLoader()->getLessVars(), - $this->getLessVars( $context ) - ); + $vars = $this->getLessVars( $context ); // Construct a cache key from the LESS file name, and a hash digest // of the LESS variables used for compilation. ksort( $vars ); diff --git a/includes/resourceloader/ResourceLoaderJqueryMsgModule.php b/includes/resourceloader/ResourceLoaderJqueryMsgModule.php index bef34f993d..8f4aa3b521 100644 --- a/includes/resourceloader/ResourceLoaderJqueryMsgModule.php +++ b/includes/resourceloader/ResourceLoaderJqueryMsgModule.php @@ -33,8 +33,7 @@ class ResourceLoaderJqueryMsgModule extends ResourceLoaderFileModule { $fileScript = parent::getScript( $context ); $tagData = Sanitizer::getRecognizedTagData(); - $parserDefaults = []; - $parserDefaults['allowedHtmlElements'] = array_merge( + $allowedHtmlElements = array_merge( array_keys( $tagData['htmlpairs'] ), array_diff( array_keys( $tagData['htmlsingle'] ), @@ -42,26 +41,24 @@ class ResourceLoaderJqueryMsgModule extends ResourceLoaderFileModule { ) ); - $mainDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] ); - - // Associative array mapping magic words (e.g. SITENAME) - // to their values. $magicWords = [ 'SITENAME' => $this->getConfig()->get( 'Sitename' ), ]; - Hooks::run( 'ResourceLoaderJqueryMsgModuleMagicWords', [ $context, &$magicWords ] ); - $magicWordExtendData = [ + $parserDefaults = [ + 'allowedHtmlElements' => $allowedHtmlElements, 'magic' => $magicWords, ]; - $magicWordDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ - $magicWordExtendData, - /* deep= */ true + $setDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ + $parserDefaults, + // Pass deep=true because mediawiki.jqueryMsg.js contains + // page-specific magic words that must not be overwritten. + true, ] ); - return $fileScript . $mainDataScript . $magicWordDataScript; + return $fileScript . $setDataScript; } /** diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php index 7018f16564..3bf309d9ea 100644 --- a/includes/resourceloader/ResourceLoaderModule.php +++ b/includes/resourceloader/ResourceLoaderModule.php @@ -129,9 +129,8 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { * @return bool */ public function getFlip( $context ) { - global $wgContLang; - - return $wgContLang->getDir() !== $context->getDirection(); + return MediaWikiServices::getInstance()->getContentLanguage()->getDir() !== + $context->getDirection(); } /** diff --git a/includes/resourceloader/ResourceLoaderOOUIModule.php b/includes/resourceloader/ResourceLoaderOOUIModule.php index 4228a45f28..a3f7b5b152 100644 --- a/includes/resourceloader/ResourceLoaderOOUIModule.php +++ b/includes/resourceloader/ResourceLoaderOOUIModule.php @@ -33,6 +33,7 @@ trait ResourceLoaderOOUIModule { 'icons-alerts', 'icons-content', 'icons-editing-advanced', + 'icons-editing-citation', 'icons-editing-core', 'icons-editing-list', 'icons-editing-styling', diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index a4fd71233f..2457fe8c72 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -20,6 +20,8 @@ * @author Roan Kattouw */ +use MediaWiki\MediaWikiServices; + /** * Module for ResourceLoader initialization. * @@ -53,7 +55,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { return $this->configVars[$hash]; } - global $wgContLang; $conf = $this->getConfig(); // We can't use Title::newMainPage() if 'mainpage' is in @@ -71,10 +72,11 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { * - wgNamespaceIds: Key-value pairs of all localized, canonical and aliases for namespaces. * - wgCaseSensitiveNamespaces: Array of namespaces that are case-sensitive. */ - $namespaceIds = $wgContLang->getNamespaceIds(); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $namespaceIds = $contLang->getNamespaceIds(); $caseSensitiveNamespaces = []; foreach ( MWNamespace::getCanonicalNamespaces() as $index => $name ) { - $namespaceIds[$wgContLang->lc( $name )] = $index; + $namespaceIds[$contLang->lc( $name )] = $index; if ( !MWNamespace::isCapitalized( $index ) ) { $caseSensitiveNamespaces[] = $index; } @@ -101,13 +103,13 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { 'wgServer' => $conf->get( 'Server' ), 'wgServerName' => $conf->get( 'ServerName' ), 'wgUserLanguage' => $context->getLanguage(), - 'wgContentLanguage' => $wgContLang->getCode(), + 'wgContentLanguage' => $contLang->getCode(), 'wgTranslateNumerals' => $conf->get( 'TranslateNumerals' ), 'wgVersion' => $conf->get( 'Version' ), 'wgEnableAPI' => true, // Deprecated since MW 1.32 'wgEnableWriteAPI' => true, // Deprecated since MW 1.32 'wgMainPageTitle' => $mainPage->getPrefixedText(), - 'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(), + 'wgFormattedNamespaces' => $contLang->getFormattedNamespaces(), 'wgNamespaceIds' => $namespaceIds, 'wgContentNamespaces' => MWNamespace::getContentNamespaces(), 'wgSiteName' => $conf->get( 'Sitename' ), @@ -319,17 +321,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { return true; } - /** - * @param ResourceLoaderContext $context - * @return array - */ - public function getPreloadLinks( ResourceLoaderContext $context ) { - $url = $this->getBaseModulesUrl( $context ); - return [ - $url => [ 'as' => 'script' ] - ]; - } - /** * Internal modules used by ResourceLoader that cannot be depended on. * @@ -353,10 +344,18 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { return []; } + /** + * @private For internal use by SpecialJavaScriptTest + * @since 1.32 + * @return array + */ + public function getBaseModulesInternal() { + return $this->getBaseModules(); + } + /** * Base modules implicitly available to all modules. * - * @since 1.32 * @return array */ private function getBaseModules() { @@ -370,25 +369,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { return $baseModules; } - /** - * Get the load URL of the startup modules. - * - * This is a helper for getScript(). - * - * @param ResourceLoaderContext $context - * @return string - */ - private function getBaseModulesUrl( ResourceLoaderContext $context ) { - $rl = $context->getResourceLoader(); - $derivative = new DerivativeResourceLoaderContext( $context ); - $derivative->setModules( $this->getBaseModules() ); - $derivative->setOnly( 'scripts' ); - // Must setModules() before makeVersionQuery() - $derivative->setVersion( $rl->makeVersionQuery( $derivative ) ); - - return $rl->createLoaderURL( 'local', $derivative ); - } - /** * @param ResourceLoaderContext $context * @return string JavaScript code @@ -399,35 +379,43 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { return '/* Requires only=script */'; } - $out = file_get_contents( "$IP/resources/src/startup/startup.js" ); + $startupCode = file_get_contents( "$IP/resources/src/startup/startup.js" ); - // Keep in sync with maintenance/jsduck/eg-iframe.html and, - // keep in sync with 'fileHashes' in StartUpModule::getDefinitionSummary(). + // The files read here MUST be kept in sync with maintenance/jsduck/eg-iframe.html, + // and MUST be considered by 'fileHashes' in StartUpModule::getDefinitionSummary(). $mwLoaderCode = file_get_contents( "$IP/resources/src/startup/mediawiki.js" ) . file_get_contents( "$IP/resources/src/startup/mediawiki.requestIdleCallback.js" ); if ( $context->getDebug() ) { $mwLoaderCode .= file_get_contents( "$IP/resources/src/startup/mediawiki.log.js" ); } - $pairs = array_map( function ( $value ) { + $mapToJson = function ( $value ) { $value = FormatJson::encode( $value, ResourceLoader::inDebugMode(), FormatJson::ALL_OK ); // Fix indentation $value = str_replace( "\n", "\n\t", $value ); return $value; - }, [ + }; + + // Perform replacements for mediawiki.js + $mwLoaderCode = strtr( $mwLoaderCode, [ + '$VARS.baseModules' => $mapToJson( $this->getBaseModules() ), + ] ); + + // Perform replacements for startup.js + $pairs = array_map( $mapToJson, [ '$VARS.wgLegacyJavaScriptGlobals' => $this->getConfig()->get( 'LegacyJavaScriptGlobals' ), '$VARS.configuration' => $this->getConfigSettings( $context ), - // This url may be preloaded. See getPreloadLinks(). - '$VARS.baseModulesUri' => $this->getBaseModulesUrl( $context ), ] ); + // Raw JavaScript code (not for JSON) $pairs['$CODE.registrations();'] = str_replace( "\n", "\n\t", trim( $this->getModuleRegistrations( $context ) ) ); $pairs['$CODE.defineLoader();'] = $mwLoaderCode; + $startupCode = strtr( $startupCode, $pairs ); - return strtr( $out, $pairs ); + return $startupCode; } /** diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php index b699b366d1..fe77576ced 100644 --- a/includes/resourceloader/ResourceLoaderWikiModule.php +++ b/includes/resourceloader/ResourceLoaderWikiModule.php @@ -23,6 +23,7 @@ */ use MediaWiki\Linker\LinkTarget; +use Wikimedia\Assert\Assert; use Wikimedia\Rdbms\Database; use Wikimedia\Rdbms\IDatabase; @@ -535,6 +536,8 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule { ) { static $formats = [ CONTENT_FORMAT_CSS, CONTENT_FORMAT_JAVASCRIPT ]; + Assert::parameterType( 'string', $wikiId, '$wikiId' ); + // TODO: MCR: differentiate between page functionality and content model! // Not all pages containing CSS or JS have to be modules! [PageType] if ( $old && in_array( $old->getContentFormat(), $formats ) ) { diff --git a/includes/revisiondelete/RevDelList.php b/includes/revisiondelete/RevDelList.php index cf895bae89..c5cffea505 100644 --- a/includes/revisiondelete/RevDelList.php +++ b/includes/revisiondelete/RevDelList.php @@ -207,7 +207,7 @@ abstract class RevDelList extends RevisionListBase { if ( $ok ) { $idsForLog[] = $item->getId(); - // If any item field was suppressed or unsupressed + // If any item field was suppressed or unsuppressed if ( ( $oldBits | $newBits ) & $this->getSuppressBit() ) { $logType = 'suppress'; } diff --git a/includes/search/SearchEngine.php b/includes/search/SearchEngine.php index 99bdabea7c..ad9f934730 100644 --- a/includes/search/SearchEngine.php +++ b/includes/search/SearchEngine.php @@ -234,10 +234,8 @@ abstract class SearchEngine { * @return string */ public function normalizeText( $string ) { - global $wgContLang; - // Some languages such as Chinese require word segmentation - return $wgContLang->segmentByWord( $string ); + return MediaWikiServices::getInstance()->getContentLanguage()->segmentByWord( $string ); } /** @@ -259,8 +257,8 @@ abstract class SearchEngine { * @return SearchNearMatcher */ public function getNearMatcher( Config $config ) { - global $wgContLang; - return new SearchNearMatcher( $config, $wgContLang ); + return new SearchNearMatcher( $config, + MediaWikiServices::getInstance()->getContentLanguage() ); } /** @@ -268,8 +266,9 @@ abstract class SearchEngine { * @return SearchNearMatcher */ protected static function defaultNearMatcher() { - $config = MediaWikiServices::getInstance()->getMainConfig(); - return MediaWikiServices::getInstance()->newSearchEngine()->getNearMatcher( $config ); + $services = MediaWikiServices::getInstance(); + $config = $services->getMainConfig(); + return $services->newSearchEngine()->getNearMatcher( $config ); } /** @@ -417,8 +416,6 @@ abstract class SearchEngine { $withAllKeyword = true, $withPrefixSearchExtractNamespaceHook = false ) { - global $wgContLang; - $parsed = $query; if ( strpos( $query, ':' ) === false ) { // nothing to do return false; @@ -447,7 +444,7 @@ abstract class SearchEngine { if ( !$allQuery && strpos( $query, ':' ) !== false ) { $prefix = str_replace( ' ', '_', substr( $query, 0, strpos( $query, ':' ) ) ); - $index = $wgContLang->getNsIndex( $prefix ); + $index = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $prefix ); if ( $index !== false ) { $extractedNamespace = [ $index ]; $parsed = substr( $query, strlen( $prefix ) + 1 ); @@ -627,9 +624,8 @@ abstract class SearchEngine { $results = $this->completionSearchBackendOverfetch( $search ); $fallbackLimit = 1 + $this->limit - $results->getSize(); if ( $fallbackLimit > 0 ) { - global $wgContLang; - - $fallbackSearches = $wgContLang->autoConvertToAllVariants( $search ); + $fallbackSearches = MediaWikiServices::getInstance()->getContentLanguage()-> + autoConvertToAllVariants( $search ); $fallbackSearches = array_diff( array_unique( $fallbackSearches ), [ $search ] ); foreach ( $fallbackSearches as $fbs ) { diff --git a/includes/search/SearchHighlighter.php b/includes/search/SearchHighlighter.php index 2cec241e40..5dfc4dfe40 100644 --- a/includes/search/SearchHighlighter.php +++ b/includes/search/SearchHighlighter.php @@ -21,6 +21,8 @@ * @ingroup Search */ +use MediaWiki\MediaWikiServices; + /** * Highlight bits of wikitext * @@ -49,7 +51,7 @@ class SearchHighlighter { * @return string */ public function highlightText( $text, $terms, $contextlines, $contextchars ) { - global $wgContLang, $wgSearchHighlightBoundaries; + global $wgSearchHighlightBoundaries; if ( $text == '' ) { return ''; @@ -84,7 +86,10 @@ class SearchHighlighter { if ( $key == 2 ) { // see if this is an image link $ns = substr( $val[0], 2, -1 ); - if ( $wgContLang->getNsIndex( $ns ) != NS_FILE ) { + if ( + MediaWikiServices::getInstance()->getContentLanguage()-> + getNsIndex( $ns ) != NS_FILE + ) { break; } @@ -313,9 +318,10 @@ class SearchHighlighter { * @return string */ function caseCallback( $matches ) { - global $wgContLang; if ( strlen( $matches[0] ) > 1 ) { - return '[' . $wgContLang->lc( $matches[0] ) . $wgContLang->uc( $matches[0] ) . ']'; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + return '[' . $contLang->lc( $matches[0] ) . + $contLang->uc( $matches[0] ) . ']'; } else { return $matches[0]; } @@ -480,9 +486,8 @@ class SearchHighlighter { if ( $colon === false ) { return $matches[2]; // replace with caption } - global $wgContLang; $ns = substr( $matches[1], 0, $colon ); - $index = $wgContLang->getNsIndex( $ns ); + $index = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $ns ); if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) ) { return $matches[0]; // return the whole thing } else { @@ -503,8 +508,6 @@ class SearchHighlighter { * @return string */ public function highlightSimple( $text, $terms, $contextlines, $contextchars ) { - global $wgContLang; - $lines = explode( "\n", $text ); $terms = implode( '|', $terms ); @@ -514,6 +517,7 @@ class SearchHighlighter { $lineno = 0; $extract = ""; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); foreach ( $lines as $line ) { if ( 0 == $contextlines ) { break; @@ -525,12 +529,12 @@ class SearchHighlighter { } --$contextlines; // truncate function changes ... to relevant i18n message. - $pre = $wgContLang->truncateForVisual( $m[1], - $contextchars, '...', false ); + $pre = $contLang->truncateForVisual( $m[1], - $contextchars, '...', false ); if ( count( $m ) < 3 ) { $post = ''; } else { - $post = $wgContLang->truncateForVisual( $m[3], $contextchars, '...', false ); + $post = $contLang->truncateForVisual( $m[3], $contextchars, '...', false ); } $found = $m[2]; diff --git a/includes/search/SearchMssql.php b/includes/search/SearchMssql.php index 289f925f83..0e85f9df2f 100644 --- a/includes/search/SearchMssql.php +++ b/includes/search/SearchMssql.php @@ -21,6 +21,7 @@ * @ingroup Search */ +use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\IResultWrapper; /** @@ -133,7 +134,6 @@ class SearchMssql extends SearchDatabase { * @return string */ private function parseQuery( $filteredText, $fulltext ) { - global $wgContLang; $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); $this->searchTerms = []; @@ -144,7 +144,8 @@ class SearchMssql extends SearchDatabase { if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/', $filteredText, $m, PREG_SET_ORDER ) ) { foreach ( $m as $terms ) { - $q[] = $terms[1] . $wgContLang->normalizeForSearch( $terms[2] ); + $q[] = $terms[1] . MediaWikiServices::getInstance()->getContentLanguage()-> + normalizeForSearch( $terms[2] ); if ( !empty( $terms[3] ) ) { $regexp = preg_quote( $terms[3], '/' ); diff --git a/includes/search/SearchMySQL.php b/includes/search/SearchMySQL.php index 6253b5588e..806db7deb9 100644 --- a/includes/search/SearchMySQL.php +++ b/includes/search/SearchMySQL.php @@ -24,6 +24,8 @@ * @ingroup Search */ +use MediaWiki\MediaWikiServices; + /** * Search engine hook for MySQL 4+ * @ingroup Search @@ -43,8 +45,6 @@ class SearchMySQL extends SearchDatabase { * @return array */ private function parseQuery( $filteredText, $fulltext ) { - global $wgContLang; - $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); // Minus syntax chars (" and *) $searchon = ''; $this->searchTerms = []; @@ -76,7 +76,8 @@ class SearchMySQL extends SearchDatabase { // Some languages such as Serbian store the input form in the search index, // so we may need to search for matches in multiple writing system variants. - $convertedVariants = $wgContLang->autoConvertToAllVariants( $term ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $convertedVariants = $contLang->autoConvertToAllVariants( $term ); if ( is_array( $convertedVariants ) ) { $variants = array_unique( array_values( $convertedVariants ) ); } else { @@ -87,9 +88,7 @@ class SearchMySQL extends SearchDatabase { // around problems with minimum lengths and encoding in MySQL's // fulltext engine. // For Chinese this also inserts spaces between adjacent Han characters. - $strippedVariants = array_map( - [ $wgContLang, 'normalizeForSearch' ], - $variants ); + $strippedVariants = array_map( [ $contLang, 'normalizeForSearch' ], $variants ); // Some languages such as Chinese force all variants to a canonical // form when stripping to the low-level search index, so to be sure @@ -134,10 +133,8 @@ class SearchMySQL extends SearchDatabase { } private function regexTerm( $string, $wildcard ) { - global $wgContLang; - $regex = preg_quote( $string, '/' ); - if ( $wgContLang->hasWordBreaks() ) { + if ( MediaWikiServices::getInstance()->getContentLanguage()->hasWordBreaks() ) { if ( $wildcard ) { // Don't cut off the final bit! $regex = "\b$regex"; @@ -389,8 +386,6 @@ class SearchMySQL extends SearchDatabase { * @return mixed|string */ function normalizeText( $string ) { - global $wgContLang; - $out = parent::normalizeText( $string ); // MySQL fulltext index doesn't grok utf-8, so we @@ -398,7 +393,7 @@ class SearchMySQL extends SearchDatabase { $out = preg_replace_callback( "/([\\xc0-\\xff][\\x80-\\xbf]*)/", [ $this, 'stripForSearchCallback' ], - $wgContLang->lc( $out ) ); + MediaWikiServices::getInstance()->getContentLanguage()->lc( $out ) ); // And to add insult to injury, the default indexing // ignores short words... Pad them so we can pass them diff --git a/includes/search/SearchOracle.php b/includes/search/SearchOracle.php index 6d7e988663..9cd245a860 100644 --- a/includes/search/SearchOracle.php +++ b/includes/search/SearchOracle.php @@ -24,6 +24,8 @@ * @ingroup Search */ +use MediaWiki\MediaWikiServices; + /** * Search engine hook base class for Oracle (ConText). * @ingroup Search @@ -173,7 +175,6 @@ class SearchOracle extends SearchDatabase { * @return string */ private function parseQuery( $filteredText, $fulltext ) { - global $wgContLang; $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); $this->searchTerms = []; @@ -185,7 +186,8 @@ class SearchOracle extends SearchDatabase { foreach ( $m as $terms ) { // Search terms in all variant forms, only // apply on wiki with LanguageConverter - $temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] ); + $temp_terms = MediaWikiServices::getInstance()->getContentLanguage()-> + autoConvertToAllVariants( $terms[2] ); if ( is_array( $temp_terms ) ) { $temp_terms = array_unique( array_values( $temp_terms ) ); foreach ( $temp_terms as $t ) { @@ -212,8 +214,7 @@ class SearchOracle extends SearchDatabase { } private function escapeTerm( $t ) { - global $wgContLang; - $t = $wgContLang->normalizeForSearch( $t ); + $t = MediaWikiServices::getInstance()->getContentLanguage()->normalizeForSearch( $t ); $t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{' . $t . '}' : $t; $t = preg_replace( '/^"(.*)"$/', '($1)', $t ); $t = preg_replace( '/([-&|])/', '\\\\$1', $t ); diff --git a/includes/search/SearchResultSet.php b/includes/search/SearchResultSet.php index e82779ab80..14d5c4bb6d 100644 --- a/includes/search/SearchResultSet.php +++ b/includes/search/SearchResultSet.php @@ -81,7 +81,7 @@ class SearchResultSet implements Countable, IteratorAggregate { * results available. */ public function __construct( $containedSyntax = false, $hasMoreResults = false ) { - if ( static::class === __CLASS__ ) { + if ( static::class === self::class ) { // This class will eventually be abstract. SearchEngine implementations // already have to extend this class anyways to provide the actual // search results. diff --git a/includes/search/SearchSqlite.php b/includes/search/SearchSqlite.php index 0ed477ab2f..0bc2d379a6 100644 --- a/includes/search/SearchSqlite.php +++ b/includes/search/SearchSqlite.php @@ -21,6 +21,8 @@ * @ingroup Search */ +use MediaWiki\MediaWikiServices; + /** * Search engine hook for SQLite * @ingroup Search @@ -43,7 +45,6 @@ class SearchSqlite extends SearchDatabase { * @return string */ private function parseQuery( $filteredText, $fulltext ) { - global $wgContLang; $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); // Minus syntax chars (" and *) $searchon = ''; $this->searchTerms = []; @@ -70,7 +71,8 @@ class SearchSqlite extends SearchDatabase { // Some languages such as Serbian store the input form in the search index, // so we may need to search for matches in multiple writing system variants. - $convertedVariants = $wgContLang->autoConvertToAllVariants( $term ); + $convertedVariants = MediaWikiServices::getInstance()->getContentLanguage()-> + autoConvertToAllVariants( $term ); if ( is_array( $convertedVariants ) ) { $variants = array_unique( array_values( $convertedVariants ) ); } else { @@ -82,7 +84,8 @@ class SearchSqlite extends SearchDatabase { // fulltext engine. // For Chinese this also inserts spaces between adjacent Han characters. $strippedVariants = array_map( - [ $wgContLang, 'normalizeForSearch' ], + [ MediaWikiServices::getInstance()->getContentLanguage(), + 'normalizeForSearch' ], $variants ); // Some languages such as Chinese force all variants to a canonical @@ -123,10 +126,8 @@ class SearchSqlite extends SearchDatabase { } private function regexTerm( $string, $wildcard ) { - global $wgContLang; - $regex = preg_quote( $string, '/' ); - if ( $wgContLang->hasWordBreaks() ) { + if ( MediaWikiServices::getInstance()->getContentLanguage()->hasWordBreaks() ) { if ( $wildcard ) { // Don't cut off the final bit! $regex = "\b$regex"; @@ -171,13 +172,12 @@ class SearchSqlite extends SearchDatabase { } protected function searchInternal( $term, $fulltext ) { - global $wgContLang; - if ( !$this->fulltextSearchSupported() ) { return null; } - $filteredTerm = $this->filter( $wgContLang->lc( $term ) ); + $filteredTerm = + $this->filter( MediaWikiServices::getInstance()->getContentLanguage()->lc( $term ) ); $resultSet = $this->db->query( $this->getQuery( $filteredTerm, $fulltext ) ); $total = null; diff --git a/includes/session/SessionBackend.php b/includes/session/SessionBackend.php index 58163c6f3d..f3bfb2b951 100644 --- a/includes/session/SessionBackend.php +++ b/includes/session/SessionBackend.php @@ -612,7 +612,7 @@ final class SessionBackend { * Save the session * * Update both the backend data and the associated WebRequest(s) to - * reflect the state of the the SessionBackend. This might include + * reflect the state of the SessionBackend. This might include * persisting or unpersisting the session. * * @param bool $closing Whether the session is being closed diff --git a/includes/session/SessionProvider.php b/includes/session/SessionProvider.php index ba075e0ca8..1f015b52e6 100644 --- a/includes/session/SessionProvider.php +++ b/includes/session/SessionProvider.php @@ -521,7 +521,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI if ( strlen( $hash ) < 32 ) { // Should never happen, even md5 is 128 bits // @codeCoverageIgnoreStart - throw new \UnexpectedValueException( 'Hash fuction returned less than 128 bits' ); + throw new \UnexpectedValueException( 'Hash function returned less than 128 bits' ); // @codeCoverageIgnoreEnd } if ( strlen( $hash ) >= 40 ) { diff --git a/includes/skins/Skin.php b/includes/skins/Skin.php index ff2a9eafe9..43b3ec1cad 100644 --- a/includes/skins/Skin.php +++ b/includes/skins/Skin.php @@ -449,7 +449,8 @@ abstract class Skin extends ContextSource { if ( $title->isSpecialPage() ) { $type = 'ns-special'; // T25315: provide a class based on the canonical special page name without subpages - list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() ); + list( $canonicalName ) = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + resolveAlias( $title->getDBkey() ); if ( $canonicalName ) { $type .= ' ' . Sanitizer::escapeClass( "mw-special-$canonicalName" ); } else { @@ -1306,7 +1307,7 @@ abstract class Skin extends ContextSource { [ 'checkKeys' => [ // Unless there is both no exact $code override nor an i18n definition - // in the the software, the only MediaWiki page to check is for $code. + // in the software, the only MediaWiki page to check is for $code. $msgCache->getCheckKey( $this->getLanguage()->getCode() ) ], 'lockTSE' => 30 @@ -1526,7 +1527,7 @@ abstract class Skin extends ContextSource { * should fall back to the next notice in its sequence */ private function getCachedNotice( $name ) { - global $wgRenderHashAppend, $wgContLang; + global $wgRenderHashAppend; $needParse = false; @@ -1547,7 +1548,8 @@ abstract class Skin extends ContextSource { $notice = $msg->plain(); } - $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + $services = MediaWikiServices::getInstance(); + $cache = $services->getMainWANObjectCache(); $parsed = $cache->getWithSetCallback( // Use the extra hash appender to let eg SSL variants separately cache // Key is verified with md5 hash of unparsed wikitext @@ -1559,12 +1561,13 @@ abstract class Skin extends ContextSource { } ); + $contLang = $services->getContentLanguage(); return Html::rawElement( 'div', [ 'id' => 'localNotice', - 'lang' => $wgContLang->getHtmlCode(), - 'dir' => $wgContLang->getDir() + 'lang' => $contLang->getHtmlCode(), + 'dir' => $contLang->getDir() ], $parsed ); diff --git a/includes/skins/SkinTemplate.php b/includes/skins/SkinTemplate.php index 7b2d79ebad..b44d4096d5 100644 --- a/includes/skins/SkinTemplate.php +++ b/includes/skins/SkinTemplate.php @@ -268,7 +268,7 @@ class SkinTemplate extends Skin { * @return QuickTemplate The template to be executed by outputPage */ protected function prepareQuickTemplate() { - global $wgContLang, $wgScript, $wgStylePath, $wgMimeType, $wgJsMimeType, + global $wgScript, $wgStylePath, $wgMimeType, $wgJsMimeType, $wgSitename, $wgLogo, $wgMaxCredits, $wgShowCreditsIfMax, $wgArticlePath, $wgScriptPath, $wgServer; @@ -363,7 +363,11 @@ class SkinTemplate extends Skin { // heading for the page title. Defaults to empty string. $tpl->set( 'prebodyhtml', '' ); - if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) { + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + if ( + $userLangCode !== $contLang->getHtmlCode() || + $userLangDir !== $contLang->getDir() + ) { $escUserlang = htmlspecialchars( $userLangCode ); $escUserdir = htmlspecialchars( $userLangDir ); // Attributes must be in double quotes because htmlspecialchars() doesn't @@ -655,7 +659,9 @@ class SkinTemplate extends Skin { # so it doesn't contain the original alias-with-subpage. $origTitle = Title::newFromText( $request->getText( 'title' ) ); if ( $origTitle instanceof Title && $origTitle->isSpecialPage() ) { - list( $spName, $spPar ) = SpecialPageFactory::resolveAlias( $origTitle->getText() ); + list( $spName, $spPar ) = + MediaWikiServices::getInstance()->getSpecialPageFactory()-> + resolveAlias( $origTitle->getText() ); $active = $spName == 'Contributions' && ( ( $spPar && $spPar == $this->username ) || $request->getText( 'target' ) == $this->username ); @@ -783,9 +789,8 @@ class SkinTemplate extends Skin { if ( $msg->exists() ) { $text = $msg->text(); } else { - global $wgContLang; - $text = $wgContLang->getConverter()->convertNamespace( - MWNamespace::getSubject( $title->getNamespace() ) ); + $text = MediaWikiServices::getInstance()->getContentLanguage()->getConverter()-> + convertNamespace( MWNamespace::getSubject( $title->getNamespace() ) ); } // Avoid PHP 7.1 warning of passing $this by reference diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php index 58944b4ce0..caa039b5e9 100644 --- a/includes/specialpage/ChangesListSpecialPage.php +++ b/includes/specialpage/ChangesListSpecialPage.php @@ -780,26 +780,20 @@ abstract class ChangesListSpecialPage extends SpecialPage { $out = $this->getOutput(); if ( $this->isStructuredFilterUiEnabled() && !$this->including() ) { $jsData = $this->getStructuredFilterJsData(); - $messages = []; foreach ( $jsData['messageKeys'] as $key ) { $messages[$key] = $this->msg( $key )->plain(); } - $out->addBodyClasses( 'mw-rcfilters-enabled' ); + $out->addBodyClasses( 'mw-rcfilters-enabled' ); $collapsed = $this->getUser()->getBoolOption( static::$collapsedPreferenceName ); if ( $collapsed ) { $out->addBodyClasses( 'mw-rcfilters-collapsed' ); } - $out->addHTML( - ResourceLoader::makeInlineScript( - ResourceLoader::makeMessageSetScript( $messages ), - $out->getCSPNonce() - ) - ); - + // These config and message exports should be moved into a ResourceLoader data module (T201574) $out->addJsConfigVars( 'wgStructuredChangeFilters', $jsData['groups'] ); + $out->addJsConfigVars( 'wgStructuredChangeFiltersMessages', $messages ); $out->addJsConfigVars( 'wgStructuredChangeFiltersCollapsedState', $collapsed ); $out->addJsConfigVars( diff --git a/includes/specialpage/PageQueryPage.php b/includes/specialpage/PageQueryPage.php index 7d6db0544d..ad66e319df 100644 --- a/includes/specialpage/PageQueryPage.php +++ b/includes/specialpage/PageQueryPage.php @@ -21,6 +21,7 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\IResultWrapper; use Wikimedia\Rdbms\IDatabase; @@ -50,12 +51,11 @@ abstract class PageQueryPage extends QueryPage { * @return string */ public function formatResult( $skin, $row ) { - global $wgContLang; - $title = Title::makeTitleSafe( $row->namespace, $row->title ); if ( $title instanceof Title ) { - $text = $wgContLang->convert( $title->getPrefixedText() ); + $text = MediaWikiServices::getInstance()->getContentLanguage()-> + convert( $title->getPrefixedText() ); return $this->getLinkRenderer()->makeLink( $title, $text ); } else { return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ], diff --git a/includes/specialpage/QueryPage.php b/includes/specialpage/QueryPage.php index 96f50bf62c..16a6d303d8 100644 --- a/includes/specialpage/QueryPage.php +++ b/includes/specialpage/QueryPage.php @@ -21,6 +21,7 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\IResultWrapper; use Wikimedia\Rdbms\IDatabase; use Wikimedia\Rdbms\DBError; @@ -690,8 +691,6 @@ abstract class QueryPage extends SpecialPage { * @param int $offset Paging offset */ protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) { - global $wgContLang; - if ( $num > 0 ) { $html = []; if ( !$this->listoutput ) { @@ -726,7 +725,7 @@ abstract class QueryPage extends SpecialPage { } $html = $this->listoutput - ? $wgContLang->listToText( $html ) + ? MediaWikiServices::getInstance()->getContentLanguage()->listToText( $html ) : implode( '', $html ); $out->addHTML( $html ); diff --git a/includes/specialpage/SpecialPage.php b/includes/specialpage/SpecialPage.php index 7a39b3c6fe..e18eacc093 100644 --- a/includes/specialpage/SpecialPage.php +++ b/includes/specialpage/SpecialPage.php @@ -95,7 +95,8 @@ class SpecialPage implements MessageLocalizer { * @return TitleValue */ public static function getTitleValueFor( $name, $subpage = false, $fragment = '' ) { - $name = SpecialPageFactory::getLocalNameFor( $name, $subpage ); + $name = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + getLocalNameFor( $name, $subpage ); return new TitleValue( NS_SPECIAL, $name, $fragment ); } @@ -108,7 +109,8 @@ class SpecialPage implements MessageLocalizer { * @return Title|null Title object or null if the page doesn't exist */ public static function getSafeTitleFor( $name, $subpage = false ) { - $name = SpecialPageFactory::getLocalNameFor( $name, $subpage ); + $name = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + getLocalNameFor( $name, $subpage ); if ( $name ) { return Title::makeTitleSafe( NS_SPECIAL, $name ); } else { @@ -233,7 +235,8 @@ class SpecialPage implements MessageLocalizer { */ function getLocalName() { if ( !isset( $this->mLocalName ) ) { - $this->mLocalName = SpecialPageFactory::getLocalNameFor( $this->mName ); + $this->mLocalName = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + getLocalNameFor( $this->mName ); } return $this->mLocalName; @@ -628,10 +631,9 @@ class SpecialPage implements MessageLocalizer { * @param string $summaryMessageKey Message key of the summary */ function outputHeader( $summaryMessageKey = '' ) { - global $wgContLang; - if ( $summaryMessageKey == '' ) { - $msg = $wgContLang->lc( $this->getName() ) . '-summary'; + $msg = MediaWikiServices::getInstance()->getContentLanguage()->lc( $this->getName() ) . + '-summary'; } else { $msg = $summaryMessageKey; } @@ -832,8 +834,9 @@ class SpecialPage implements MessageLocalizer { return; } - global $wgContLang; - $msg = $this->msg( $wgContLang->lc( $this->getName() ) . '-helppage' ); + $msg = $this->msg( + MediaWikiServices::getInstance()->getContentLanguage()->lc( $this->getName() ) . + '-helppage' ); if ( !$msg->isDisabled() ) { $helpUrl = Skin::makeUrl( $msg->plain() ); diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php index b3b63b008e..c6ffbe4d70 100644 --- a/includes/specialpage/SpecialPageFactory.php +++ b/includes/specialpage/SpecialPageFactory.php @@ -21,7 +21,19 @@ * @ingroup SpecialPage * @defgroup SpecialPage SpecialPage */ + +namespace MediaWiki\Special; + +use Config; +use Hooks; +use IContextSource; +use Language; use MediaWiki\Linker\LinkRenderer; +use Profiler; +use RequestContext; +use SpecialPage; +use Title; +use User; use Wikimedia\ObjectFactory; /** @@ -42,165 +54,180 @@ use Wikimedia\ObjectFactory; * SpecialPageFactory::$list. To remove a core static special page at runtime, use * a SpecialPage_initList hook. * + * @note There are two classes called SpecialPageFactory. You should use this first one, in + * namespace MediaWiki\Special, which is a service. \SpecialPageFactory is a deprecated collection + * of static methods that forwards to the global service. + * * @ingroup SpecialPage * @since 1.17 */ class SpecialPageFactory { /** * List of special page names to the subclass of SpecialPage which handles them. + * @todo Make this a const when we drop HHVM support (T192166). It can still be private in PHP + * 7.1. */ private static $coreList = [ // Maintenance Reports - 'BrokenRedirects' => BrokenRedirectsPage::class, - 'Deadendpages' => DeadendPagesPage::class, - 'DoubleRedirects' => DoubleRedirectsPage::class, - 'Longpages' => LongPagesPage::class, - 'Ancientpages' => AncientPagesPage::class, - 'Lonelypages' => LonelyPagesPage::class, - 'Fewestrevisions' => FewestrevisionsPage::class, - 'Withoutinterwiki' => WithoutInterwikiPage::class, - 'Protectedpages' => SpecialProtectedpages::class, - 'Protectedtitles' => SpecialProtectedtitles::class, - 'Shortpages' => ShortPagesPage::class, - 'Uncategorizedcategories' => UncategorizedCategoriesPage::class, - 'Uncategorizedimages' => UncategorizedImagesPage::class, - 'Uncategorizedpages' => UncategorizedPagesPage::class, - 'Uncategorizedtemplates' => UncategorizedTemplatesPage::class, - 'Unusedcategories' => UnusedCategoriesPage::class, - 'Unusedimages' => UnusedimagesPage::class, - 'Unusedtemplates' => UnusedtemplatesPage::class, - 'Unwatchedpages' => UnwatchedpagesPage::class, - 'Wantedcategories' => WantedCategoriesPage::class, - 'Wantedfiles' => WantedFilesPage::class, - 'Wantedpages' => WantedPagesPage::class, - 'Wantedtemplates' => WantedTemplatesPage::class, + 'BrokenRedirects' => \BrokenRedirectsPage::class, + 'Deadendpages' => \DeadendPagesPage::class, + 'DoubleRedirects' => \DoubleRedirectsPage::class, + 'Longpages' => \LongPagesPage::class, + 'Ancientpages' => \AncientPagesPage::class, + 'Lonelypages' => \LonelyPagesPage::class, + 'Fewestrevisions' => \FewestrevisionsPage::class, + 'Withoutinterwiki' => \WithoutInterwikiPage::class, + 'Protectedpages' => \SpecialProtectedpages::class, + 'Protectedtitles' => \SpecialProtectedtitles::class, + 'Shortpages' => \ShortPagesPage::class, + 'Uncategorizedcategories' => \UncategorizedCategoriesPage::class, + 'Uncategorizedimages' => \UncategorizedImagesPage::class, + 'Uncategorizedpages' => \UncategorizedPagesPage::class, + 'Uncategorizedtemplates' => \UncategorizedTemplatesPage::class, + 'Unusedcategories' => \UnusedCategoriesPage::class, + 'Unusedimages' => \UnusedimagesPage::class, + 'Unusedtemplates' => \UnusedtemplatesPage::class, + 'Unwatchedpages' => \UnwatchedpagesPage::class, + 'Wantedcategories' => \WantedCategoriesPage::class, + 'Wantedfiles' => \WantedFilesPage::class, + 'Wantedpages' => \WantedPagesPage::class, + 'Wantedtemplates' => \WantedTemplatesPage::class, // List of pages - 'Allpages' => SpecialAllPages::class, - 'Prefixindex' => SpecialPrefixindex::class, - 'Categories' => SpecialCategories::class, - 'Listredirects' => ListredirectsPage::class, - 'PagesWithProp' => SpecialPagesWithProp::class, - 'TrackingCategories' => SpecialTrackingCategories::class, + 'Allpages' => \SpecialAllPages::class, + 'Prefixindex' => \SpecialPrefixindex::class, + 'Categories' => \SpecialCategories::class, + 'Listredirects' => \ListredirectsPage::class, + 'PagesWithProp' => \SpecialPagesWithProp::class, + 'TrackingCategories' => \SpecialTrackingCategories::class, // Authentication - 'Userlogin' => SpecialUserLogin::class, - 'Userlogout' => SpecialUserLogout::class, - 'CreateAccount' => SpecialCreateAccount::class, - 'LinkAccounts' => SpecialLinkAccounts::class, - 'UnlinkAccounts' => SpecialUnlinkAccounts::class, - 'ChangeCredentials' => SpecialChangeCredentials::class, - 'RemoveCredentials' => SpecialRemoveCredentials::class, + 'Userlogin' => \SpecialUserLogin::class, + 'Userlogout' => \SpecialUserLogout::class, + 'CreateAccount' => \SpecialCreateAccount::class, + 'LinkAccounts' => \SpecialLinkAccounts::class, + 'UnlinkAccounts' => \SpecialUnlinkAccounts::class, + 'ChangeCredentials' => \SpecialChangeCredentials::class, + 'RemoveCredentials' => \SpecialRemoveCredentials::class, // Users and rights - 'Activeusers' => SpecialActiveUsers::class, - 'Block' => SpecialBlock::class, - 'Unblock' => SpecialUnblock::class, - 'BlockList' => SpecialBlockList::class, - 'AutoblockList' => SpecialAutoblockList::class, - 'ChangePassword' => SpecialChangePassword::class, - 'BotPasswords' => SpecialBotPasswords::class, - 'PasswordReset' => SpecialPasswordReset::class, - 'DeletedContributions' => DeletedContributionsPage::class, - 'Preferences' => SpecialPreferences::class, - 'ResetTokens' => SpecialResetTokens::class, - 'Contributions' => SpecialContributions::class, - 'Listgrouprights' => SpecialListGroupRights::class, - 'Listgrants' => SpecialListGrants::class, - 'Listusers' => SpecialListUsers::class, - 'Listadmins' => SpecialListAdmins::class, - 'Listbots' => SpecialListBots::class, - 'Userrights' => UserrightsPage::class, - 'EditWatchlist' => SpecialEditWatchlist::class, - 'PasswordPolicies' => SpecialPasswordPolicies::class, + 'Activeusers' => \SpecialActiveUsers::class, + 'Block' => \SpecialBlock::class, + 'Unblock' => \SpecialUnblock::class, + 'BlockList' => \SpecialBlockList::class, + 'AutoblockList' => \SpecialAutoblockList::class, + 'ChangePassword' => \SpecialChangePassword::class, + 'BotPasswords' => \SpecialBotPasswords::class, + 'PasswordReset' => \SpecialPasswordReset::class, + 'DeletedContributions' => \DeletedContributionsPage::class, + 'Preferences' => \SpecialPreferences::class, + 'ResetTokens' => \SpecialResetTokens::class, + 'Contributions' => \SpecialContributions::class, + 'Listgrouprights' => \SpecialListGroupRights::class, + 'Listgrants' => \SpecialListGrants::class, + 'Listusers' => \SpecialListUsers::class, + 'Listadmins' => \SpecialListAdmins::class, + 'Listbots' => \SpecialListBots::class, + 'Userrights' => \UserrightsPage::class, + 'EditWatchlist' => \SpecialEditWatchlist::class, + 'PasswordPolicies' => \SpecialPasswordPolicies::class, // Recent changes and logs - 'Newimages' => SpecialNewFiles::class, - 'Log' => SpecialLog::class, - 'Watchlist' => SpecialWatchlist::class, - 'Newpages' => SpecialNewpages::class, - 'Recentchanges' => SpecialRecentChanges::class, - 'Recentchangeslinked' => SpecialRecentChangesLinked::class, - 'Tags' => SpecialTags::class, + 'Newimages' => \SpecialNewFiles::class, + 'Log' => \SpecialLog::class, + 'Watchlist' => \SpecialWatchlist::class, + 'Newpages' => \SpecialNewpages::class, + 'Recentchanges' => \SpecialRecentChanges::class, + 'Recentchangeslinked' => \SpecialRecentChangesLinked::class, + 'Tags' => \SpecialTags::class, // Media reports and uploads - 'Listfiles' => SpecialListFiles::class, - 'Filepath' => SpecialFilepath::class, - 'MediaStatistics' => MediaStatisticsPage::class, - 'MIMEsearch' => MIMEsearchPage::class, - 'FileDuplicateSearch' => FileDuplicateSearchPage::class, - 'Upload' => SpecialUpload::class, - 'UploadStash' => SpecialUploadStash::class, - 'ListDuplicatedFiles' => ListDuplicatedFilesPage::class, + 'Listfiles' => \SpecialListFiles::class, + 'Filepath' => \SpecialFilepath::class, + 'MediaStatistics' => \MediaStatisticsPage::class, + 'MIMEsearch' => \MIMEsearchPage::class, + 'FileDuplicateSearch' => \FileDuplicateSearchPage::class, + 'Upload' => \SpecialUpload::class, + 'UploadStash' => \SpecialUploadStash::class, + 'ListDuplicatedFiles' => \ListDuplicatedFilesPage::class, // Data and tools - 'ApiSandbox' => SpecialApiSandbox::class, - 'Statistics' => SpecialStatistics::class, - 'Allmessages' => SpecialAllMessages::class, - 'Version' => SpecialVersion::class, - 'Lockdb' => SpecialLockdb::class, - 'Unlockdb' => SpecialUnlockdb::class, + 'ApiSandbox' => \SpecialApiSandbox::class, + 'Statistics' => \SpecialStatistics::class, + 'Allmessages' => \SpecialAllMessages::class, + 'Version' => \SpecialVersion::class, + 'Lockdb' => \SpecialLockdb::class, + 'Unlockdb' => \SpecialUnlockdb::class, // Redirecting special pages - 'LinkSearch' => LinkSearchPage::class, - 'Randompage' => RandomPage::class, - 'RandomInCategory' => SpecialRandomInCategory::class, - 'Randomredirect' => SpecialRandomredirect::class, - 'Randomrootpage' => SpecialRandomrootpage::class, - 'GoToInterwiki' => SpecialGoToInterwiki::class, + 'LinkSearch' => \LinkSearchPage::class, + 'Randompage' => \RandomPage::class, + 'RandomInCategory' => \SpecialRandomInCategory::class, + 'Randomredirect' => \SpecialRandomredirect::class, + 'Randomrootpage' => \SpecialRandomrootpage::class, + 'GoToInterwiki' => \SpecialGoToInterwiki::class, // High use pages - 'Mostlinkedcategories' => MostlinkedCategoriesPage::class, - 'Mostimages' => MostimagesPage::class, - 'Mostinterwikis' => MostinterwikisPage::class, - 'Mostlinked' => MostlinkedPage::class, - 'Mostlinkedtemplates' => MostlinkedTemplatesPage::class, - 'Mostcategories' => MostcategoriesPage::class, - 'Mostrevisions' => MostrevisionsPage::class, + 'Mostlinkedcategories' => \MostlinkedCategoriesPage::class, + 'Mostimages' => \MostimagesPage::class, + 'Mostinterwikis' => \MostinterwikisPage::class, + 'Mostlinked' => \MostlinkedPage::class, + 'Mostlinkedtemplates' => \MostlinkedTemplatesPage::class, + 'Mostcategories' => \MostcategoriesPage::class, + 'Mostrevisions' => \MostrevisionsPage::class, // Page tools - 'ComparePages' => SpecialComparePages::class, - 'Export' => SpecialExport::class, - 'Import' => SpecialImport::class, - 'Undelete' => SpecialUndelete::class, - 'Whatlinkshere' => SpecialWhatLinksHere::class, - 'MergeHistory' => SpecialMergeHistory::class, - 'ExpandTemplates' => SpecialExpandTemplates::class, + 'ComparePages' => \SpecialComparePages::class, + 'Export' => \SpecialExport::class, + 'Import' => \SpecialImport::class, + 'Undelete' => \SpecialUndelete::class, + 'Whatlinkshere' => \SpecialWhatLinksHere::class, + 'MergeHistory' => \SpecialMergeHistory::class, + 'ExpandTemplates' => \SpecialExpandTemplates::class, // Other - 'Booksources' => SpecialBookSources::class, + 'Booksources' => \SpecialBookSources::class, // Unlisted / redirects - 'ApiHelp' => SpecialApiHelp::class, - 'Blankpage' => SpecialBlankpage::class, - 'Diff' => SpecialDiff::class, - 'EditTags' => SpecialEditTags::class, - 'Emailuser' => SpecialEmailUser::class, - 'Movepage' => MovePageForm::class, - 'Mycontributions' => SpecialMycontributions::class, - 'MyLanguage' => SpecialMyLanguage::class, - 'Mypage' => SpecialMypage::class, - 'Mytalk' => SpecialMytalk::class, - 'Myuploads' => SpecialMyuploads::class, - 'AllMyUploads' => SpecialAllMyUploads::class, - 'PermanentLink' => SpecialPermanentLink::class, - 'Redirect' => SpecialRedirect::class, - 'Revisiondelete' => SpecialRevisionDelete::class, - 'RunJobs' => SpecialRunJobs::class, - 'Specialpages' => SpecialSpecialpages::class, - 'PageData' => SpecialPageData::class, + 'ApiHelp' => \SpecialApiHelp::class, + 'Blankpage' => \SpecialBlankpage::class, + 'Diff' => \SpecialDiff::class, + 'EditTags' => \SpecialEditTags::class, + 'Emailuser' => \SpecialEmailUser::class, + 'Movepage' => \MovePageForm::class, + 'Mycontributions' => \SpecialMycontributions::class, + 'MyLanguage' => \SpecialMyLanguage::class, + 'Mypage' => \SpecialMypage::class, + 'Mytalk' => \SpecialMytalk::class, + 'Myuploads' => \SpecialMyuploads::class, + 'AllMyUploads' => \SpecialAllMyUploads::class, + 'PermanentLink' => \SpecialPermanentLink::class, + 'Redirect' => \SpecialRedirect::class, + 'Revisiondelete' => \SpecialRevisionDelete::class, + 'RunJobs' => \SpecialRunJobs::class, + 'Specialpages' => \SpecialSpecialpages::class, + 'PageData' => \SpecialPageData::class, ]; - private static $list; - private static $aliases; + /** @var array Special page name => class name */ + private $list; + + /** @var array */ + private $aliases; + + /** @var Config */ + private $config; + + /** @var Language */ + private $contLang; /** - * Reset the internal list of special pages. Useful when changing $wgSpecialPages after - * the internal list has already been initialized, e.g. during testing. + * @param Config $config + * @param Language $contLang */ - public static function resetList() { - self::$list = null; - self::$aliases = null; + public function __construct( Config $config, Language $contLang ) { + $this->config = $config; + $this->contLang = $contLang; } /** @@ -209,8 +236,8 @@ class SpecialPageFactory { * * @return string[] */ - public static function getNames() { - return array_keys( self::getPageList() ); + public function getNames() : array { + return array_keys( $this->getPageList() ); } /** @@ -218,49 +245,44 @@ class SpecialPageFactory { * * @return array */ - private static function getPageList() { - global $wgSpecialPages; - global $wgDisableInternalSearch, $wgEmailAuthentication; - global $wgEnableEmail, $wgEnableJavaScriptTest; - global $wgPageLanguageUseDB, $wgContentHandlerUseDB; - - if ( !is_array( self::$list ) ) { - self::$list = self::$coreList; + private function getPageList() : array { + if ( !is_array( $this->list ) ) { + $this->list = self::$coreList; - if ( !$wgDisableInternalSearch ) { - self::$list['Search'] = SpecialSearch::class; + if ( !$this->config->get( 'DisableInternalSearch' ) ) { + $this->list['Search'] = \SpecialSearch::class; } - if ( $wgEmailAuthentication ) { - self::$list['Confirmemail'] = EmailConfirmation::class; - self::$list['Invalidateemail'] = EmailInvalidation::class; + if ( $this->config->get( 'EmailAuthentication' ) ) { + $this->list['Confirmemail'] = \EmailConfirmation::class; + $this->list['Invalidateemail'] = \EmailInvalidation::class; } - if ( $wgEnableEmail ) { - self::$list['ChangeEmail'] = SpecialChangeEmail::class; + if ( $this->config->get( 'EnableEmail' ) ) { + $this->list['ChangeEmail'] = \SpecialChangeEmail::class; } - if ( $wgEnableJavaScriptTest ) { - self::$list['JavaScriptTest'] = SpecialJavaScriptTest::class; + if ( $this->config->get( 'EnableJavaScriptTest' ) ) { + $this->list['JavaScriptTest'] = \SpecialJavaScriptTest::class; } - if ( $wgPageLanguageUseDB ) { - self::$list['PageLanguage'] = SpecialPageLanguage::class; + if ( $this->config->get( 'PageLanguageUseDB' ) ) { + $this->list['PageLanguage'] = \SpecialPageLanguage::class; } - if ( $wgContentHandlerUseDB ) { - self::$list['ChangeContentModel'] = SpecialChangeContentModel::class; + if ( $this->config->get( 'ContentHandlerUseDB' ) ) { + $this->list['ChangeContentModel'] = \SpecialChangeContentModel::class; } // Add extension special pages - self::$list = array_merge( self::$list, $wgSpecialPages ); + $this->list = array_merge( $this->list, $this->config->get( 'SpecialPages' ) ); // This hook can be used to disable unwanted core special pages // or conditionally register special pages. - Hooks::run( 'SpecialPage_initList', [ &self::$list ] ); + Hooks::run( 'SpecialPage_initList', [ &$this->list ] ); } - return self::$list; + return $this->list; } /** @@ -269,19 +291,18 @@ class SpecialPageFactory { * All registered special pages are guaranteed to map to themselves. * @return array */ - private static function getAliasList() { - if ( is_null( self::$aliases ) ) { - global $wgContLang; - $aliases = $wgContLang->getSpecialPageAliases(); - $pageList = self::getPageList(); + private function getAliasList() : array { + if ( is_null( $this->aliases ) ) { + $aliases = $this->contLang->getSpecialPageAliases(); + $pageList = $this->getPageList(); - self::$aliases = []; + $this->aliases = []; $keepAlias = []; // Force every canonical name to be an alias for itself. foreach ( $pageList as $name => $stuff ) { - $caseFoldedAlias = $wgContLang->caseFold( $name ); - self::$aliases[$caseFoldedAlias] = $name; + $caseFoldedAlias = $this->contLang->caseFold( $name ); + $this->aliases[$caseFoldedAlias] = $name; $keepAlias[$caseFoldedAlias] = 'canonical'; } @@ -290,24 +311,24 @@ class SpecialPageFactory { foreach ( $aliases as $realName => $aliasList ) { $aliasList = array_values( $aliasList ); foreach ( $aliasList as $i => $alias ) { - $caseFoldedAlias = $wgContLang->caseFold( $alias ); + $caseFoldedAlias = $this->contLang->caseFold( $alias ); - if ( isset( self::$aliases[$caseFoldedAlias] ) && - $realName === self::$aliases[$caseFoldedAlias] + if ( isset( $this->aliases[$caseFoldedAlias] ) && + $realName === $this->aliases[$caseFoldedAlias] ) { // Ignore same-realName conflicts continue; } if ( !isset( $keepAlias[$caseFoldedAlias] ) ) { - self::$aliases[$caseFoldedAlias] = $realName; + $this->aliases[$caseFoldedAlias] = $realName; if ( !$i ) { $keepAlias[$caseFoldedAlias] = 'first'; } } elseif ( !$i ) { wfWarn( "First alias '$alias' for $realName conflicts with " . "{$keepAlias[$caseFoldedAlias]} alias for " . - self::$aliases[$caseFoldedAlias] + $this->aliases[$caseFoldedAlias] ); } } @@ -315,7 +336,7 @@ class SpecialPageFactory { } } - return self::$aliases; + return $this->aliases; } /** @@ -326,13 +347,12 @@ class SpecialPageFactory { * @param string $alias * @return array Array( String, String|null ), or array( null, null ) if the page is invalid */ - public static function resolveAlias( $alias ) { - global $wgContLang; + public function resolveAlias( $alias ) { $bits = explode( '/', $alias, 2 ); - $caseFoldedAlias = $wgContLang->caseFold( $bits[0] ); + $caseFoldedAlias = $this->contLang->caseFold( $bits[0] ); $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias ); - $aliases = self::getAliasList(); + $aliases = $this->getAliasList(); if ( isset( $aliases[$caseFoldedAlias] ) ) { $name = $aliases[$caseFoldedAlias]; } else { @@ -354,10 +374,10 @@ class SpecialPageFactory { * @param string $name Name of a special page * @return bool True if a special page exists with this name */ - public static function exists( $name ) { - list( $title, /*...*/ ) = self::resolveAlias( $name ); + public function exists( $name ) { + list( $title, /*...*/ ) = $this->resolveAlias( $name ); - $specialPageList = self::getPageList(); + $specialPageList = $this->getPageList(); return isset( $specialPageList[$title] ); } @@ -367,17 +387,17 @@ class SpecialPageFactory { * @param string $name Special page name, may be localised and/or an alias * @return SpecialPage|null SpecialPage object or null if the page doesn't exist */ - public static function getPage( $name ) { - list( $realName, /*...*/ ) = self::resolveAlias( $name ); + public function getPage( $name ) { + list( $realName, /*...*/ ) = $this->resolveAlias( $name ); - $specialPageList = self::getPageList(); + $specialPageList = $this->getPageList(); if ( isset( $specialPageList[$realName] ) ) { $rec = $specialPageList[$realName]; if ( is_callable( $rec ) ) { // Use callback to instantiate the special page - $page = call_user_func( $rec ); + $page = $rec(); } elseif ( is_string( $rec ) ) { $className = $rec; $page = new $className; @@ -415,18 +435,14 @@ class SpecialPageFactory { * Return categorised listable special pages which are available * for the current user, and everyone. * - * @param User|null $user User object to check permissions, $wgUser will be used - * if not provided + * @param User $user User object to check permissions + * provided * @return array ( string => Specialpage ) */ - public static function getUsablePages( User $user = null ) { + public function getUsablePages( User $user ) : array { $pages = []; - if ( $user === null ) { - global $wgUser; - $user = $wgUser; - } - foreach ( self::getPageList() as $name => $rec ) { - $page = self::getPage( $name ); + foreach ( $this->getPageList() as $name => $rec ) { + $page = $this->getPage( $name ); if ( $page ) { // not null $page->setContext( RequestContext::getMain() ); if ( $page->isListed() @@ -445,10 +461,10 @@ class SpecialPageFactory { * * @return array ( string => Specialpage ) */ - public static function getRegularPages() { + public function getRegularPages() : array { $pages = []; - foreach ( self::getPageList() as $name => $rec ) { - $page = self::getPage( $name ); + foreach ( $this->getPageList() as $name => $rec ) { + $page = $this->getPage( $name ); if ( $page && $page->isListed() && !$page->isRestricted() ) { $pages[$name] = $page; } @@ -461,17 +477,13 @@ class SpecialPageFactory { * Return categorised listable special pages which are available * for the current user, but not for everyone * - * @param User|null $user User object to use or null for $wgUser + * @param User $user User object to use * @return array ( string => Specialpage ) */ - public static function getRestrictedPages( User $user = null ) { + public function getRestrictedPages( User $user ) : array { $pages = []; - if ( $user === null ) { - global $wgUser; - $user = $wgUser; - } - foreach ( self::getPageList() as $name => $rec ) { - $page = self::getPage( $name ); + foreach ( $this->getPageList() as $name => $rec ) { + $page = $this->getPage( $name ); if ( $page && $page->isListed() && $page->isRestricted() @@ -499,7 +511,7 @@ class SpecialPageFactory { * * @return bool|Title */ - public static function executePath( Title &$title, IContextSource &$context, $including = false, + public function executePath( Title &$title, IContextSource &$context, $including = false, LinkRenderer $linkRenderer = null ) { // @todo FIXME: Redirects broken due to this call @@ -511,7 +523,7 @@ class SpecialPageFactory { $par = $bits[1]; } - $page = self::getPage( $name ); + $page = $this->getPage( $name ); if ( !$page ) { $context->getOutput()->setArticleRelated( false ); $context->getOutput()->setRobotPolicy( 'noindex,nofollow' ); @@ -586,7 +598,7 @@ class SpecialPageFactory { * @param LinkRenderer|null $linkRenderer (since 1.28) * @return string HTML fragment */ - public static function capturePath( + public function capturePath( Title $title, IContextSource $context, LinkRenderer $linkRenderer = null ) { global $wgTitle, $wgOut, $wgRequest, $wgUser, $wgLang; @@ -621,7 +633,7 @@ class SpecialPageFactory { $main->setLanguage( $context->getLanguage() ); // The useful part - $ret = self::executePath( $title, $context, true, $linkRenderer ); + $ret = $this->executePath( $title, $context, true, $linkRenderer ); // Restore old globals and context $wgTitle = $glob['title']; @@ -645,16 +657,15 @@ class SpecialPageFactory { * @param string|bool $subpage * @return string */ - public static function getLocalNameFor( $name, $subpage = false ) { - global $wgContLang; - $aliases = $wgContLang->getSpecialPageAliases(); - $aliasList = self::getAliasList(); + public function getLocalNameFor( $name, $subpage = false ) { + $aliases = $this->contLang->getSpecialPageAliases(); + $aliasList = $this->getAliasList(); // Find the first alias that maps back to $name if ( isset( $aliases[$name] ) ) { $found = false; foreach ( $aliases[$name] as $alias ) { - $caseFoldedAlias = $wgContLang->caseFold( $alias ); + $caseFoldedAlias = $this->contLang->caseFold( $alias ); $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias ); if ( isset( $aliasList[$caseFoldedAlias] ) && $aliasList[$caseFoldedAlias] === $name @@ -675,7 +686,7 @@ class SpecialPageFactory { if ( strcasecmp( $name, $n ) === 0 ) { wfWarn( "Found alias defined for $n when searching for " . "special page aliases for $name. Case mismatch?" ); - return self::getLocalNameFor( $n, $subpage ); + return $this->getLocalNameFor( $n, $subpage ); } } } @@ -690,7 +701,7 @@ class SpecialPageFactory { $name = "$name/$subpage"; } - return $wgContLang->ucfirst( $name ); + return $this->contLang->ucfirst( $name ); } /** @@ -699,8 +710,8 @@ class SpecialPageFactory { * @param string $alias * @return Title|null Title or null if there is no such alias */ - public static function getTitleForAlias( $alias ) { - list( $name, $subpage ) = self::resolveAlias( $alias ); + public function getTitleForAlias( $alias ) { + list( $name, $subpage ) = $this->resolveAlias( $alias ); if ( $name != null ) { return SpecialPage::getTitleFor( $name, $subpage ); } else { diff --git a/includes/specialpage/SpecialPageFactory_deprecated.php b/includes/specialpage/SpecialPageFactory_deprecated.php new file mode 100644 index 0000000000..bc0c250b97 --- /dev/null +++ b/includes/specialpage/SpecialPageFactory_deprecated.php @@ -0,0 +1,96 @@ +getSpecialPageFactory()->getNames(); + } + + public static function resolveAlias( $alias ) : array { + return MediaWikiServices::getInstance()->getSpecialPageFactory()->resolveAlias( $alias ); + } + + public static function exists( $name ) { + return MediaWikiServices::getInstance()->getSpecialPageFactory()->exists( $name ); + } + + public static function getPage( $name ) { + return MediaWikiServices::getInstance()->getSpecialPageFactory()->getPage( $name ); + } + + public static function getUsablePages( User $user = null ) : array { + global $wgUser; + $user = $user ?? $wgUser; + return MediaWikiServices::getInstance()->getSpecialPageFactory()->getUsablePages( $user ); + } + + public static function getRegularPages() : array { + return MediaWikiServices::getInstance()->getSpecialPageFactory()->getRegularPages(); + } + + public static function getRestrictedPages( User $user = null ) : array { + global $wgUser; + $user = $user ?? $wgUser; + return MediaWikiServices::getInstance()->getSpecialPageFactory()->getRestrictedPages( $user ); + } + + public static function executePath( Title &$title, IContextSource &$context, $including = false, + LinkRenderer $linkRenderer = null + ) { + return MediaWikiServices::getInstance()->getSpecialPageFactory() + ->executePath( $title, $context, $including, $linkRenderer ); + } + + public static function capturePath( + Title $title, IContextSource $context, LinkRenderer $linkRenderer = null + ) { + return MediaWikiServices::getInstance()->getSpecialPageFactory() + ->capturePath( $title, $context, $linkRenderer ); + } + + public static function getLocalNameFor( $name, $subpage = false ) { + return MediaWikiServices::getInstance()->getSpecialPageFactory() + ->getLocalNameFor( $name, $subpage ); + } + + public static function getTitleForAlias( $alias ) { + return MediaWikiServices::getInstance()->getSpecialPageFactory() + ->getTitleForAlias( $alias ); + } + + /** + * No-op since 1.32, call overrideMwServices() instead + */ + public static function resetList() { + } +} diff --git a/includes/specials/SpecialAncientpages.php b/includes/specials/SpecialAncientpages.php index ecc030e638..ff44bda1e9 100644 --- a/includes/specials/SpecialAncientpages.php +++ b/includes/specials/SpecialAncientpages.php @@ -21,6 +21,8 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; + /** * Implements Special:Ancientpages * @@ -74,14 +76,13 @@ class AncientPagesPage extends QueryPage { * @return string */ function formatResult( $skin, $result ) { - global $wgContLang; - $d = $this->getLanguage()->userTimeAndDate( $result->value, $this->getUser() ); $title = Title::makeTitle( $result->namespace, $result->title ); $linkRenderer = $this->getLinkRenderer(); $link = $linkRenderer->makeKnownLink( $title, - $wgContLang->convert( $title->getPrefixedText() ) + MediaWikiServices::getInstance()->getContentLanguage()-> + convert( $title->getPrefixedText() ) ); return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) ); diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php index 3b25c6c2af..a60595abe1 100644 --- a/includes/specials/SpecialBlock.php +++ b/includes/specials/SpecialBlock.php @@ -858,7 +858,7 @@ class SpecialBlock extends FormSpecialPage { * suggestions * @return array */ - public static function getSuggestedDurations( $lang = null, $includeOther = true ) { + public static function getSuggestedDurations( Language $lang = null, $includeOther = true ) { $a = []; $msg = $lang === null ? wfMessage( 'ipboptions' )->inContentLanguage()->text() diff --git a/includes/specials/SpecialBooksources.php b/includes/specials/SpecialBooksources.php index 72e0b888fe..c187156bee 100644 --- a/includes/specials/SpecialBooksources.php +++ b/includes/specials/SpecialBooksources.php @@ -21,6 +21,8 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; + /** * Special page outputs information on sourcing a book with a particular ISBN * The parser creates links to this page when dealing with ISBNs in wikitext @@ -154,8 +156,6 @@ class SpecialBookSources extends SpecialPage { private function showList( $isbn ) { $out = $this->getOutput(); - global $wgContLang; - $isbn = self::cleanIsbn( $isbn ); # Hook to allow extensions to insert additional HTML, # e.g. for API-interacting plugins and so on @@ -183,7 +183,7 @@ class SpecialBookSources extends SpecialPage { # Fall back to the defaults given in the language file $out->addWikiMsg( 'booksources-text' ); $out->addHTML( '
    ' ); - $items = $wgContLang->getBookstoreList(); + $items = MediaWikiServices::getInstance()->getContentLanguage()->getBookstoreList(); foreach ( $items as $label => $url ) { $out->addHTML( $this->makeListItem( $isbn, $label, $url ) ); } diff --git a/includes/specials/SpecialBotPasswords.php b/includes/specials/SpecialBotPasswords.php index 2d3a0ccbb5..2d62d8feea 100644 --- a/includes/specials/SpecialBotPasswords.php +++ b/includes/specials/SpecialBotPasswords.php @@ -22,6 +22,7 @@ */ use MediaWiki\Logger\LoggerFactory; +use MediaWiki\MediaWikiServices; /** * Let users manage bot passwords @@ -166,8 +167,7 @@ class SpecialBotPasswords extends FormSpecialPage { } else { $linkRenderer = $this->getLinkRenderer(); - $passwordFactory = new PasswordFactory(); - $passwordFactory->init( $this->getConfig() ); + $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory(); $dbr = BotPassword::getDB( DB_REPLICA ); $res = $dbr->select( @@ -321,8 +321,7 @@ class SpecialBotPasswords extends FormSpecialPage { if ( $this->operation === 'insert' || !empty( $data['resetPassword'] ) ) { $this->password = BotPassword::generatePassword( $this->getConfig() ); - $passwordFactory = new PasswordFactory(); - $passwordFactory->init( RequestContext::getMain()->getConfig() ); + $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory(); $password = $passwordFactory->newFromPlaintext( $this->password ); } else { $password = null; diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php index 17b3201ddf..083b3c0d0f 100644 --- a/includes/specials/SpecialEditWatchlist.php +++ b/includes/specials/SpecialEditWatchlist.php @@ -535,8 +535,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { * @return HTMLForm */ protected function getNormalForm() { - global $wgContLang; - $fields = []; $count = 0; @@ -575,6 +573,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { if ( count( $fields ) > 1 && $count > 30 ) { $this->toc = Linker::tocIndent(); $tocLength = 0; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); foreach ( $fields as $data ) { # strip out the 'ns' prefix from the section name: @@ -582,7 +581,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { $nsText = ( $ns == NS_MAIN ) ? $this->msg( 'blanknamespace' )->escaped() - : htmlspecialchars( $wgContLang->getFormattedNsText( $ns ) ); + : htmlspecialchars( $contLang->getFormattedNsText( $ns ) ); $this->toc .= Linker::tocLine( "editwatchlist-{$data['section']}", $nsText, $this->getLanguage()->formatNum( ++$tocLength ), 1 ) . Linker::tocLineEnd(); } @@ -634,7 +633,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { if ( $title->getNamespace() == NS_USER && !$title->isSubpage() ) { $tools['contributions'] = $linkRenderer->makeKnownLink( SpecialPage::getTitleFor( 'Contributions', $title->getText() ), - $this->msg( 'contributions' )->text() + $this->msg( 'contribslink' )->text() ); } diff --git a/includes/specials/SpecialExport.php b/includes/specials/SpecialExport.php index 5a98bb90be..ac10c2ff0e 100644 --- a/includes/specials/SpecialExport.php +++ b/includes/specials/SpecialExport.php @@ -418,11 +418,9 @@ class SpecialExport extends SpecialPage { /** * @param Title $title - * @return array + * @return string[] */ private function getPagesFromCategory( $title ) { - global $wgContLang; - $maxPages = $this->getConfig()->get( 'ExportPagelistLimit' ); $name = $title->getDBkey(); @@ -439,13 +437,7 @@ class SpecialExport extends SpecialPage { $pages = []; foreach ( $res as $row ) { - $n = $row->page_title; - if ( $row->page_namespace ) { - $ns = $wgContLang->getNsText( $row->page_namespace ); - $n = $ns . ':' . $n; - } - - $pages[] = $n; + $pages[] = Title::makeName( $row->page_title, $row->page_namespace ); } return $pages; @@ -453,11 +445,9 @@ class SpecialExport extends SpecialPage { /** * @param int $nsindex - * @return array + * @return string[] */ private function getPagesFromNamespace( $nsindex ) { - global $wgContLang; - $maxPages = $this->getConfig()->get( 'ExportPagelistLimit' ); $dbr = wfGetDB( DB_REPLICA ); @@ -472,14 +462,7 @@ class SpecialExport extends SpecialPage { $pages = []; foreach ( $res as $row ) { - $n = $row->page_title; - - if ( $row->page_namespace ) { - $ns = $wgContLang->getNsText( $row->page_namespace ); - $n = $ns . ':' . $n; - } - - $pages[] = $n; + $pages[] = Title::makeName( $row->page_title, $row->page_namespace ); } return $pages; diff --git a/includes/specials/SpecialFewestrevisions.php b/includes/specials/SpecialFewestrevisions.php index f20829fd64..4a57c95eb3 100644 --- a/includes/specials/SpecialFewestrevisions.php +++ b/includes/specials/SpecialFewestrevisions.php @@ -21,6 +21,8 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; + /** * Special page for listing the articles with the fewest revisions. * @@ -68,8 +70,6 @@ class FewestrevisionsPage extends QueryPage { * @return string */ function formatResult( $skin, $result ) { - global $wgContLang; - $nt = Title::makeTitleSafe( $result->namespace, $result->title ); if ( !$nt ) { return Html::element( @@ -83,7 +83,8 @@ class FewestrevisionsPage extends QueryPage { ); } $linkRenderer = $this->getLinkRenderer(); - $text = $wgContLang->convert( $nt->getPrefixedText() ); + $text = MediaWikiServices::getInstance()->getContentLanguage()-> + convert( $nt->getPrefixedText() ); $plink = $linkRenderer->makeLink( $nt, $text ); $nl = $this->msg( 'nrevisions' )->numParams( $result->value )->text(); diff --git a/includes/specials/SpecialFileDuplicateSearch.php b/includes/specials/SpecialFileDuplicateSearch.php index 83e18c2d95..3115adcfa6 100644 --- a/includes/specials/SpecialFileDuplicateSearch.php +++ b/includes/specials/SpecialFileDuplicateSearch.php @@ -207,11 +207,9 @@ class FileDuplicateSearchPage extends QueryPage { * @return string HTML */ function formatResult( $skin, $result ) { - global $wgContLang; - $linkRenderer = $this->getLinkRenderer(); $nt = $result->getTitle(); - $text = $wgContLang->convert( $nt->getText() ); + $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() ); $plink = $linkRenderer->makeLink( $nt, $text diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php index 5a6bbc4dfa..3ef64f881f 100644 --- a/includes/specials/SpecialImport.php +++ b/includes/specials/SpecialImport.php @@ -79,7 +79,7 @@ class SpecialImport extends SpecialPage { } # @todo Allow Title::getUserPermissionsErrors() to take an array - # @todo FIXME: Title::checkSpecialsAndNSPermissions() has a very wierd expectation of what + # @todo FIXME: Title::checkSpecialsAndNSPermissions() has a very weird expectation of what # getUserPermissionsErrors() might actually be used for, hence the 'ns-specialprotected' $errors = wfMergeErrorArrays( $this->getPageTitle()->getUserPermissionsErrors( diff --git a/includes/specials/SpecialJavaScriptTest.php b/includes/specials/SpecialJavaScriptTest.php index b786c869fb..87bd2ed0c9 100644 --- a/includes/specials/SpecialJavaScriptTest.php +++ b/includes/specials/SpecialJavaScriptTest.php @@ -103,65 +103,56 @@ class SpecialJavaScriptTest extends SpecialPage { $query['only'] = 'scripts'; $startupContext = new ResourceLoaderContext( $rl, new FauxRequest( $query ) ); - $query['raw'] = true; - $modules = $rl->getTestModuleNames( 'qunit' ); // Disable autostart because we load modules asynchronously. By default, QUnit would start // at domready when there are no tests loaded and also fire 'QUnit.done' which then instructs - // Karma to end the run before the tests even started. + // Karma to exit the browser process before the tests even finished loading. $qunitConfig = 'QUnit.config.autostart = false;' . 'if (window.__karma__) {' // karma-qunit's use of autostart=false and QUnit.start conflicts with ours. - // Hack around this by replacing 'karma.loaded' with a no-op and call it ourselves later. - // See . + // Hack around this by replacing 'karma.loaded' with a no-op and perfom its duty of calling + // `__karma__.start()` ourselves. See . . 'window.__karma__.loaded = function () {};' . '}'; // The below is essentially a pure-javascript version of OutputPage::headElement(). - $startup = $rl->makeModuleResponse( $startupContext, [ + $code = $rl->makeModuleResponse( $startupContext, [ 'startup' => $rl->getModule( 'startup' ), ] ); - // Embed page-specific mw.config variables. - // The current Special page shouldn't be relevant to tests, but various modules (which - // are loaded before the test suites), reference mw.config while initialising. - $code = ResourceLoader::makeConfigSetScript( $out->getJSVars() ); - // Embed private modules as they're not allowed to be loaded dynamically - $code .= $rl->makeModuleResponse( $embedContext, [ - 'user.options' => $rl->getModule( 'user.options' ), - 'user.tokens' => $rl->getModule( 'user.tokens' ), - ] ); - // Catch exceptions (such as "dependency missing" or "unknown module") so that we - // always start QUnit. Re-throw so that they are caught and reported as global exceptions - // by QUnit and Karma. - $modules = Xml::encodeJsVar( $modules ); - $code .= <<getJSVars() ) + // Embed private modules as they're not allowed to be loaded dynamically + . $rl->makeModuleResponse( $embedContext, [ + 'user.options' => $rl->getModule( 'user.options' ), + 'user.tokens' => $rl->getModule( 'user.tokens' ), + ] ) + // Load all the test suites + . Xml::encodeJsCall( 'mw.loader.load', [ $modules ] ) + ); + $encModules = Xml::encodeJsVar( $modules ); + $code .= ResourceLoader::makeInlineCodeWithModule( 'mediawiki.base', <<getOutput(); $namespaceProtection = $this->getConfig()->get( 'NamespaceProtection' ); @@ -161,15 +162,17 @@ class SpecialListGroupRights extends SpecialPage { ); $linkRenderer = $this->getLinkRenderer(); ksort( $namespaceProtection ); + $validNamespaces = MWNamespace::getValidNamespaces(); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); foreach ( $namespaceProtection as $namespace => $rights ) { - if ( !in_array( $namespace, MWNamespace::getValidNamespaces() ) ) { + if ( !in_array( $namespace, $validNamespaces ) ) { continue; } if ( $namespace == NS_MAIN ) { $namespaceText = $this->msg( 'blanknamespace' )->text(); } else { - $namespaceText = $wgContLang->convertNamespace( $namespace ); + $namespaceText = $contLang->convertNamespace( $namespace ); } $out->addHTML( diff --git a/includes/specials/SpecialLockdb.php b/includes/specials/SpecialLockdb.php index fb04b90bae..a2c25305ca 100644 --- a/includes/specials/SpecialLockdb.php +++ b/includes/specials/SpecialLockdb.php @@ -21,6 +21,8 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; + /** * A form to make the database readonly (eg for maintenance purposes). * @@ -74,8 +76,6 @@ class SpecialLockdb extends FormSpecialPage { } public function onSubmit( array $data ) { - global $wgContLang; - if ( !$data['Confirm'] ) { return Status::newFatal( 'locknoconfirm' ); } @@ -92,10 +92,11 @@ class SpecialLockdb extends FormSpecialPage { } fwrite( $fp, $data['Reason'] ); $timestamp = wfTimestampNow(); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); fwrite( $fp, "\n

    " . $this->msg( 'lockedbyandtime', $this->getUser()->getName(), - $wgContLang->date( $timestamp, false, false ), - $wgContLang->time( $timestamp, false, false ) + $contLang->date( $timestamp, false, false ), + $contLang->time( $timestamp, false, false ) )->inContentLanguage()->text() . "

    \n" ); fclose( $fp ); diff --git a/includes/specials/SpecialLog.php b/includes/specials/SpecialLog.php index 216031295a..d700c397d6 100644 --- a/includes/specials/SpecialLog.php +++ b/includes/specials/SpecialLog.php @@ -64,8 +64,6 @@ class SpecialLog extends SpecialPage { $dateString = $this->getRequest()->getVal( 'wpdate' ); if ( !empty( $dateString ) ) { $dateStamp = MWTimestamp::getInstance( $dateString . ' 00:00:00' ); - $dateStamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) ); - $opts->setValue( 'year', (int)$dateStamp->format( 'Y' ) ); $opts->setValue( 'month', (int)$dateStamp->format( 'm' ) ); $opts->setValue( 'day', (int)$dateStamp->format( 'd' ) ); diff --git a/includes/specials/SpecialMIMEsearch.php b/includes/specials/SpecialMIMEsearch.php index f43ed9bd6a..18c163e138 100644 --- a/includes/specials/SpecialMIMEsearch.php +++ b/includes/specials/SpecialMIMEsearch.php @@ -22,6 +22,8 @@ * @author Ævar Arnfjörð Bjarmason */ +use MediaWiki\MediaWikiServices; + /** * Searches the database for files of the requested MIME type, comparing this with the * 'img_major_mime' and 'img_minor_mime' fields in the image table. @@ -182,11 +184,9 @@ class MIMEsearchPage extends QueryPage { * @return string */ function formatResult( $skin, $result ) { - global $wgContLang; - $linkRenderer = $this->getLinkRenderer(); $nt = Title::makeTitle( $result->namespace, $result->title ); - $text = $wgContLang->convert( $nt->getText() ); + $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() ); $plink = $linkRenderer->makeLink( Title::newFromText( $nt->getPrefixedText() ), $text diff --git a/includes/specials/SpecialMostlinkedcategories.php b/includes/specials/SpecialMostlinkedcategories.php index f238f6c086..b80e518d82 100644 --- a/includes/specials/SpecialMostlinkedcategories.php +++ b/includes/specials/SpecialMostlinkedcategories.php @@ -24,6 +24,7 @@ * @author Ævar Arnfjörð Bjarmason */ +use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\IResultWrapper; use Wikimedia\Rdbms\IDatabase; @@ -71,8 +72,6 @@ class MostlinkedCategoriesPage extends QueryPage { * @return string */ function formatResult( $skin, $result ) { - global $wgContLang; - $nt = Title::makeTitleSafe( NS_CATEGORY, $result->title ); if ( !$nt ) { return Html::element( @@ -85,7 +84,7 @@ class MostlinkedCategoriesPage extends QueryPage { ); } - $text = $wgContLang->convert( $nt->getText() ); + $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() ); $plink = $this->getLinkRenderer()->makeLink( $nt, $text ); $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped(); diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php index 0069ea1bbe..464be4faca 100644 --- a/includes/specials/SpecialMovepage.php +++ b/includes/specials/SpecialMovepage.php @@ -356,8 +356,8 @@ class MovePageForm extends UnlistedSpecialPage { [ 'label' => $this->msg( 'movetalk' )->text(), 'help' => new OOUI\HtmlSnippet( $this->msg( 'movepagetalktext' )->parseAsBlock() ), + 'helpInline' => true, 'align' => 'inline', - 'infusable' => true, 'id' => 'wpMovetalk-field', ] ); diff --git a/includes/specials/SpecialMyLanguage.php b/includes/specials/SpecialMyLanguage.php index 37d96f47cc..537db9ee1d 100644 --- a/includes/specials/SpecialMyLanguage.php +++ b/includes/specials/SpecialMyLanguage.php @@ -23,6 +23,8 @@ * @copyright Copyright © 2010-2013 Niklas Laxström, Siebrand Mazeland */ +use MediaWiki\MediaWikiServices; + /** * Unlisted special page just to redirect the user to the translated version of * a page, if it exists. @@ -90,17 +92,17 @@ class SpecialMyLanguage extends RedirectSpecialArticle { $base = $page->getRedirectTarget(); } - $uiCode = $this->getLanguage()->getCode(); - $wikiLangCode = $this->getConfig()->get( 'LanguageCode' ); + $uiLang = $this->getLanguage(); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); - if ( $uiCode === $wikiLangCode ) { + if ( $uiLang->equals( $contLang ) ) { // Short circuit when the current UI language is the // wiki's default language to avoid unnecessary page lookups. return $base; } // Check for a subpage in current UI language - $proposed = $base->getSubpage( $uiCode ); + $proposed = $base->getSubpage( $uiLang->getCode() ); if ( $proposed && $proposed->exists() ) { return $proposed; } @@ -111,9 +113,9 @@ class SpecialMyLanguage extends RedirectSpecialArticle { } // Check for fallback languages specified by the UI language - $possibilities = Language::getFallbacksFor( $uiCode ); + $possibilities = $uiLang->getFallbackLanguages(); foreach ( $possibilities as $lang ) { - if ( $lang !== $wikiLangCode ) { + if ( $lang !== $contLang->getCode() ) { $proposed = $base->getSubpage( $lang ); if ( $proposed && $proposed->exists() ) { return $proposed; diff --git a/includes/specials/SpecialNewimages.php b/includes/specials/SpecialNewimages.php index 693b8aa90e..7526c3e756 100644 --- a/includes/specials/SpecialNewimages.php +++ b/includes/specials/SpecialNewimages.php @@ -21,6 +21,8 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; + class SpecialNewFiles extends IncludableSpecialPage { /** @var FormOptions */ protected $opts; @@ -213,13 +215,15 @@ class SpecialNewFiles extends IncludableSpecialPage { * Send the text to be displayed above the options */ function setTopText() { - global $wgContLang; - $message = $this->msg( 'newimagestext' )->inContentLanguage(); if ( !$message->isDisabled() ) { + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $this->getOutput()->addWikiText( Html::rawElement( 'p', - [ 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ], + [ + 'lang' => $contLang->getHtmlCode(), + 'dir' => $contLang->getDir() + ], "\n" . $message->plain() . "\n" ), /* $lineStart */ false, diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php index b8dfc04348..5ba7c88e01 100644 --- a/includes/specials/SpecialNewpages.php +++ b/includes/specials/SpecialNewpages.php @@ -229,13 +229,6 @@ class SpecialNewpages extends IncludableSpecialPage { $ut = Title::makeTitleSafe( NS_USER, $username ); $userText = $ut ? $ut->getText() : ''; - // Store query values in hidden fields so that form submission doesn't lose them - $hidden = []; - foreach ( $this->opts->getUnconsumedValues() as $key => $value ) { - $hidden[] = Html::hidden( $key, $value ); - } - $hidden = implode( "\n", $hidden ); - $formDescriptor = [ 'namespace' => [ 'type' => 'namespaceselect', @@ -272,6 +265,12 @@ class SpecialNewpages extends IncludableSpecialPage { ]; $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ); + + // Store query values in hidden fields so that form submission doesn't lose them + foreach ( $this->opts->getUnconsumedValues() as $key => $value ) { + $htmlForm->addHiddenField( $key, $value ); + } + $htmlForm ->setMethod( 'get' ) ->setFormIdentifier( 'newpagesform' ) @@ -288,7 +287,7 @@ class SpecialNewpages extends IncludableSpecialPage { 'div', null, $this->filterLinks() - ) . $hidden ) + ) ) ->show(); $out->addModuleStyles( 'mediawiki.special' ); } diff --git a/includes/specials/SpecialPrefixindex.php b/includes/specials/SpecialPrefixindex.php index 2a8a09d266..f7906dbb29 100644 --- a/includes/specials/SpecialPrefixindex.php +++ b/includes/specials/SpecialPrefixindex.php @@ -48,8 +48,6 @@ class SpecialPrefixindex extends SpecialAllPages { * @param string $par Becomes "FOO" when called like Special:Prefixindex/FOO (default null) */ function execute( $par ) { - global $wgContLang; - $this->setHeaders(); $this->outputHeader(); @@ -65,7 +63,7 @@ class SpecialPrefixindex extends SpecialAllPages { $this->hideRedirects = $request->getBool( 'hideredirects', $this->hideRedirects ); $this->stripPrefix = $request->getBool( 'stripprefix', $this->stripPrefix ); - $namespaces = $wgContLang->getNamespaces(); + $namespaces = MediaWikiServices::getInstance()->getContentLanguage()->getNamespaces(); $out->setPageTitle( ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) ) ? $this->msg( 'prefixindex-namespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) @@ -143,15 +141,13 @@ class SpecialPrefixindex extends SpecialAllPages { * @param string|null $from List all pages from this name (default false) */ protected function showPrefixChunk( $namespace, $prefix, $from = null ) { - global $wgContLang; - if ( $from === null ) { $from = $prefix; } $fromList = $this->getNamespaceKeyAndText( $namespace, $from ); $prefixList = $this->getNamespaceKeyAndText( $namespace, $prefix ); - $namespaces = $wgContLang->getNamespaces(); + $namespaces = MediaWikiServices::getInstance()->getContentLanguage()->getNamespaces(); $res = null; $n = 0; $nextRow = null; diff --git a/includes/specials/SpecialRandompage.php b/includes/specials/SpecialRandompage.php index e3b567d7fe..7e5a73fb08 100644 --- a/includes/specials/SpecialRandompage.php +++ b/includes/specials/SpecialRandompage.php @@ -22,6 +22,8 @@ * @author Rob Church , Ilmari Karonen */ +use MediaWiki\MediaWikiServices; + /** * Special page to direct the user to a random page * @@ -54,12 +56,11 @@ class RandomPage extends SpecialPage { } public function execute( $par ) { - global $wgContLang; - if ( is_string( $par ) ) { // Testing for stringiness since we want to catch // the empty string to mean main namespace only. - $this->setNamespace( $wgContLang->getNsIndex( $par ) ); + $this->setNamespace( + MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $par ) ); } $title = $this->getRandomTitle(); @@ -85,17 +86,17 @@ class RandomPage extends SpecialPage { * @return string */ private function getNsList() { - global $wgContLang; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $nsNames = []; foreach ( $this->namespaces as $n ) { if ( $n === NS_MAIN ) { $nsNames[] = $this->msg( 'blanknamespace' )->plain(); } else { - $nsNames[] = $wgContLang->getNsText( $n ); + $nsNames[] = $contLang->getNsText( $n ); } } - return $wgContLang->commaList( $nsNames ); + return $contLang->commaList( $nsNames ); } /** diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index 2496192b2f..983f74cd82 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -578,10 +578,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage { * @param FormOptions $opts Unused */ function setTopText( FormOptions $opts ) { - global $wgContLang; - $message = $this->msg( 'recentchangestext' )->inContentLanguage(); if ( !$message->isDisabled() ) { + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); // Parse the message in this weird ugly way to preserve the ability to include interlanguage // links in it (T172461). In the future when T66969 is resolved, perhaps we can just use // $message->parse() instead. This code is copied from Message::parseText(). @@ -592,7 +591,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { // Message class sets the interface flag to false when parsing in a language different than // user language, and this is wiki content language /*interface*/false, - $wgContLang + $contLang ); $content = $parserOutput->getText( [ 'enableSectionEditLinks' => false, @@ -601,8 +600,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $this->getOutput()->addParserOutputMetadata( $parserOutput ); $langAttributes = [ - 'lang' => $wgContLang->getHtmlCode(), - 'dir' => $wgContLang->getDir(), + 'lang' => $contLang->getHtmlCode(), + 'dir' => $contLang->getDir(), ]; $topLinksAttributes = [ 'class' => 'mw-recentchanges-toplinks' ]; diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index f595b19172..86dcb721f8 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -279,8 +279,6 @@ class SpecialSearch extends SpecialPage { * @param string $term */ public function showResults( $term ) { - global $wgContLang; - if ( $this->searchEngineType !== null ) { $this->setExtraParam( 'srbackend', $this->searchEngineType ); } @@ -291,7 +289,8 @@ class SpecialSearch extends SpecialPage { $this->searchConfig, $this->getSearchProfiles() ); - $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':'; + $filePrefix = MediaWikiServices::getInstance()->getContentLanguage()-> + getFormattedNsText( NS_FILE ) . ':'; if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) { // Empty query -- straight view of search form if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) { @@ -721,9 +720,10 @@ class SpecialSearch extends SpecialPage { */ public function getSearchEngine() { if ( $this->searchEngine === null ) { + $services = MediaWikiServices::getInstance(); $this->searchEngine = $this->searchEngineType ? - MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $this->searchEngineType ) : - MediaWikiServices::getInstance()->newSearchEngine(); + $services->getSearchEngineFactory()->create( $this->searchEngineType ) : + $services->newSearchEngine(); } return $this->searchEngine; diff --git a/includes/specials/SpecialSpecialpages.php b/includes/specials/SpecialSpecialpages.php index 4f29082227..00aa543a88 100644 --- a/includes/specials/SpecialSpecialpages.php +++ b/includes/specials/SpecialSpecialpages.php @@ -21,6 +21,8 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; + /** * A special page that lists special pages * @@ -50,7 +52,8 @@ class SpecialSpecialpages extends UnlistedSpecialPage { } private function getPageGroups() { - $pages = SpecialPageFactory::getUsablePages( $this->getUser() ); + $pages = MediaWikiServices::getInstance()->getSpecialPageFactory()-> + getUsablePages( $this->getUser() ); if ( !count( $pages ) ) { # Yeah, that was pointless. Thanks for coming. diff --git a/includes/specials/SpecialUnwatchedpages.php b/includes/specials/SpecialUnwatchedpages.php index 0ea7dfae14..a3a9bc6f91 100644 --- a/includes/specials/SpecialUnwatchedpages.php +++ b/includes/specials/SpecialUnwatchedpages.php @@ -24,6 +24,7 @@ * @author Ævar Arnfjörð Bjarmason */ +use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\IResultWrapper; use Wikimedia\Rdbms\IDatabase; @@ -109,15 +110,14 @@ class UnwatchedpagesPage extends QueryPage { * @return string */ function formatResult( $skin, $result ) { - global $wgContLang; - $nt = Title::makeTitleSafe( $result->namespace, $result->title ); if ( !$nt ) { return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ], Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) ); } - $text = $wgContLang->convert( $nt->getPrefixedText() ); + $text = MediaWikiServices::getInstance()->getContentLanguage()-> + convert( $nt->getPrefixedText() ); $linkRenderer = $this->getLinkRenderer(); diff --git a/includes/specials/SpecialWantedcategories.php b/includes/specials/SpecialWantedcategories.php index d323c9e2b9..2accef6f74 100644 --- a/includes/specials/SpecialWantedcategories.php +++ b/includes/specials/SpecialWantedcategories.php @@ -23,6 +23,8 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; + /** * A querypage to list the most wanted categories - implements Special:Wantedcategories * @@ -88,10 +90,8 @@ class WantedCategoriesPage extends WantedQueryPage { * @return string */ function formatResult( $skin, $result ) { - global $wgContLang; - $nt = Title::makeTitle( $result->namespace, $result->title ); - $text = $wgContLang->convert( $nt->getText() ); + $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() ); if ( !$this->isCached() ) { // We can assume the freshest data diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 5b48f4ef46..908183d25a 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -493,9 +493,10 @@ class SpecialWatchlist extends ChangesListSpecialPage { $dbr = $this->getDB(); $user = $this->getUser(); $output = $this->getOutput(); + $services = MediaWikiServices::getInstance(); # Show a message about replica DB lag, if applicable - $lag = MediaWikiServices::getInstance()->getDBLoadBalancer()->safeGetLag( $dbr ); + $lag = $services->getDBLoadBalancer()->safeGetLag( $dbr ); if ( $lag > 0 ) { $output->showLagWarning( $lag ); } @@ -535,7 +536,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { if ( $this->getConfig()->get( 'RCShowWatchingUsers' ) && $user->getOption( 'shownumberswatching' ) ) { - $watchedItemStore = MediaWikiServices::getInstance()->getWatchedItemStore(); + $watchedItemStore = $services->getWatchedItemStore(); } $s = $list->beginRecentChangesList(); diff --git a/includes/specials/formfields/Licenses.php b/includes/specials/formfields/Licenses.php index 0b6c1659fb..51e63d9dd0 100644 --- a/includes/specials/formfields/Licenses.php +++ b/includes/specials/formfields/Licenses.php @@ -23,6 +23,8 @@ * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason */ +use MediaWiki\MediaWikiServices; + /** * A License class for use on Special:Upload */ @@ -57,8 +59,6 @@ class Licenses extends HTMLFormField { * @return string */ protected static function getMessageFromParams( $params ) { - global $wgContLang; - if ( !empty( $params['licenses'] ) ) { return $params['licenses']; } @@ -72,7 +72,8 @@ class Licenses extends HTMLFormField { // Also see https://phabricator.wikimedia.org/T3495 $defaultMsg = wfMessage( 'licenses' )->inContentLanguage(); if ( !$defaultMsg->exists() || $defaultMsg->plain() === '-' ) { - $defaultMsg = wfMessage( 'licenses' )->inLanguage( $wgContLang ); + $defaultMsg = wfMessage( 'licenses' )->inLanguage( + MediaWikiServices::getInstance()->getContentLanguage() ); } return $defaultMsg->plain(); diff --git a/includes/specials/forms/UploadForm.php b/includes/specials/forms/UploadForm.php index e37200f60f..da4398ad9f 100644 --- a/includes/specials/forms/UploadForm.php +++ b/includes/specials/forms/UploadForm.php @@ -260,12 +260,11 @@ class UploadForm extends HTMLForm { $file = null; } if ( $file ) { - global $wgContLang; - $mto = $file->transform( [ 'width' => 120 ] ); if ( $mto ) { $this->addHeaderText( - '
    ' . + '
    ' . Html::element( 'img', [ 'src' => $mto->getUrl(), 'class' => 'thumbimage', diff --git a/includes/specials/helpers/ImportReporter.php b/includes/specials/helpers/ImportReporter.php index 63addb8772..c79e87c36e 100644 --- a/includes/specials/helpers/ImportReporter.php +++ b/includes/specials/helpers/ImportReporter.php @@ -158,15 +158,13 @@ class ImportReporter extends ContextSource { $logEntry->setComment( $this->reason ); $logEntry->setPerformer( $this->getUser() ); $logEntry->setParameters( $logParams ); - $logid = $logEntry->insert(); + // Make sure the null revision will be tagged as well + $logEntry->setAssociatedRevId( $nullRevId ); if ( count( $this->logTags ) ) { $logEntry->setTags( $this->logTags ); } - // Make sure the null revision will be tagged as well - $logEntry->setAssociatedRevId( $nullRevId ); - + $logid = $logEntry->insert(); $logEntry->publish( $logid ); - } else { $this->getOutput()->addHTML( "
  • " . $linkRenderer->makeKnownLink( $title ) . " " . $this->msg( 'import-nonewrevisions' )->escaped() . "
  • \n" ); diff --git a/includes/specials/pagers/AllMessagesTablePager.php b/includes/specials/pagers/AllMessagesTablePager.php index 5addd9c269..6d5f64b7a2 100644 --- a/includes/specials/pagers/AllMessagesTablePager.php +++ b/includes/specials/pagers/AllMessagesTablePager.php @@ -19,6 +19,7 @@ * @ingroup Pager */ +use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\FakeResultWrapper; /** @@ -27,8 +28,6 @@ use Wikimedia\Rdbms\FakeResultWrapper; * * @ingroup Pager */ -use MediaWiki\MediaWikiServices; - class AllMessagesTablePager extends TablePager { protected $filter, $prefix, $langcode, $displayPrefix; @@ -45,7 +44,7 @@ class AllMessagesTablePager extends TablePager { */ public $custom; - function __construct( $page, $conds, $langObj = null ) { + function __construct( $page, $conds, Language $langObj = null ) { parent::__construct( $page->getContext() ); $this->mIndexField = 'am_title'; $this->mPage = $page; @@ -54,13 +53,12 @@ class AllMessagesTablePager extends TablePager { $this->mDefaultDirection = IndexPager::DIR_DESCENDING; $this->mLimitsShown = [ 20, 50, 100, 250, 500, 5000 ]; - global $wgContLang; - $this->talk = $this->msg( 'talkpagelinktext' )->escaped(); - $this->lang = $langObj ?: $wgContLang; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $this->lang = $langObj ?? $contLang; $this->langcode = $this->lang->getCode(); - $this->foreign = !$this->lang->equals( $wgContLang ); + $this->foreign = !$this->lang->equals( $contLang ); $request = $this->getRequest(); diff --git a/includes/tidy/RemexCompatMunger.php b/includes/tidy/RemexCompatMunger.php index ab2ba46de9..78a11045ed 100644 --- a/includes/tidy/RemexCompatMunger.php +++ b/includes/tidy/RemexCompatMunger.php @@ -89,11 +89,19 @@ class RemexCompatMunger implements TreeHandler { 'u' => true, ]; + /** @var Serializer */ + private $serializer; + + /** @var bool */ + private $trace; + /** * @param Serializer $serializer + * @param bool $trace */ - public function __construct( Serializer $serializer ) { + public function __construct( Serializer $serializer, $trace = false ) { $this->serializer = $serializer; + $this->trace = $trace; } public function startDocument( $fragmentNamespace, $fragmentName ) { @@ -184,7 +192,9 @@ class RemexCompatMunger implements TreeHandler { } private function trace( $msg ) { - // echo "[RCM] $msg\n"; + if ( $this->trace ) { + wfDebug( "[RCM] $msg" ); + } } /** @@ -245,12 +255,11 @@ class RemexCompatMunger implements TreeHandler { ) { list( $parent, $newRef ) = $this->getParentForInsert( $preposition, $refElement ); $parentData = $parent->snData; - $parentNs = $parent->namespace; - $parentName = $parent->name; $elementName = $element->htmlName; $inline = isset( self::$onlyInlineElements[$elementName] ); $under = $preposition === TreeBuilder::UNDER; + $elementToEnd = null; if ( $under && $parentData->isPWrapper && !$inline ) { // [B/b] The element is non-inline and the parent is a p-wrapper, @@ -262,7 +271,6 @@ class RemexCompatMunger implements TreeHandler { $pElement = $parentData->childPElement; $parentData->childPElement = null; $newRef = $refElement->userData; - $this->endTag( $pElement, $sourceStart, 0 ); } elseif ( $under && $parentData->isSplittable && (bool)$parentData->ancestorPNode !== $inline ) { @@ -350,7 +358,6 @@ class RemexCompatMunger implements TreeHandler { $root = $serializer->getRootNode(); $nodes = []; $removableNodes = []; - $haveContent = false; while ( $node !== $cloneEnd ) { $nextParent = $serializer->getParentNode( $node ); if ( $nextParent === $root ) { diff --git a/includes/tidy/RemexDriver.php b/includes/tidy/RemexDriver.php index e02af88fd9..803369a654 100644 --- a/includes/tidy/RemexDriver.php +++ b/includes/tidy/RemexDriver.php @@ -3,37 +3,50 @@ namespace MediaWiki\Tidy; use RemexHtml\Serializer\Serializer; +use RemexHtml\Serializer\SerializerWithTracer; use RemexHtml\Tokenizer\Tokenizer; use RemexHtml\TreeBuilder\Dispatcher; use RemexHtml\TreeBuilder\TreeBuilder; use RemexHtml\TreeBuilder\TreeMutationTracer; class RemexDriver extends TidyDriverBase { - private $trace; + private $treeMutationTrace; + private $serializerTrace; + private $mungerTrace; private $pwrap; public function __construct( array $config ) { $config += [ 'treeMutationTrace' => false, + 'serializerTrace' => false, + 'mungerTrace' => false, 'pwrap' => true ]; - $this->trace = $config['treeMutationTrace']; + $this->treeMutationTrace = $config['treeMutationTrace']; + $this->serializerTrace = $config['serializerTrace']; + $this->mungerTrace = $config['mungerTrace']; $this->pwrap = $config['pwrap']; parent::__construct( $config ); } public function tidy( $text ) { + $traceCallback = function ( $msg ) { + wfDebug( "RemexHtml: $msg" ); + }; + $formatter = new RemexCompatFormatter; - $serializer = new Serializer( $formatter ); + if ( $this->serializerTrace ) { + $serializer = new SerializerWithTracer( $formatter, null, $traceCallback ); + } else { + $serializer = new Serializer( $formatter ); + } if ( $this->pwrap ) { - $munger = new RemexCompatMunger( $serializer ); + $munger = new RemexCompatMunger( $serializer, $this->mungerTrace ); } else { $munger = $serializer; } - if ( $this->trace ) { - $tracer = new TreeMutationTracer( $munger, function ( $msg ) { - wfDebug( "RemexHtml: $msg" ); - } ); + if ( $this->treeMutationTrace ) { + $tracer = new TreeMutationTracer( $munger, $traceCallback ); } else { $tracer = $munger; } @@ -48,6 +61,7 @@ class RemexDriver extends TidyDriverBase { 'ignoreNulls' => true, 'skipPreprocess' => true, ] ); + $tokenizer->execute( [ 'fragmentNamespace' => \RemexHtml\HTMLData::NS_HTML, 'fragmentName' => 'body' diff --git a/includes/title/MediaWikiTitleCodec.php b/includes/title/MediaWikiTitleCodec.php index 890a870a2a..15f8ff0997 100644 --- a/includes/title/MediaWikiTitleCodec.php +++ b/includes/title/MediaWikiTitleCodec.php @@ -112,18 +112,16 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser { * @return string */ public function formatTitle( $namespace, $text, $fragment = '', $interwiki = '' ) { - if ( $namespace !== false ) { + if ( $namespace !== 0 && $namespace !== false ) { // Try to get a namespace name, but fallback - // to empty string if it doesn't exist + // to empty string if it doesn't exist. And + // assume that ns 0 is the empty string. try { $nsName = $this->getNamespaceName( $namespace, $text ); } catch ( InvalidArgumentException $e ) { $nsName = ''; } - - if ( $namespace !== 0 ) { - $text = $nsName . ':' . $text; - } + $text = $nsName . ':' . $text; } if ( $fragment !== '' ) { @@ -149,7 +147,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser { * @throws MalformedTitleException * @return TitleValue */ - public function parseTitle( $text, $defaultNamespace ) { + public function parseTitle( $text, $defaultNamespace = NS_MAIN ) { // NOTE: this is an ugly cludge that allows this class to share the // code for parsing with the old Title class. The parser code should // be refactored to avoid this. @@ -176,7 +174,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser { * @return string $title->getText() */ public function getText( LinkTarget $title ) { - return $this->formatTitle( false, $title->getText(), '' ); + return $title->getText(); } /** diff --git a/includes/title/NaiveForeignTitleFactory.php b/includes/title/NaiveForeignTitleFactory.php index 44cf90d8da..307050b7ee 100644 --- a/includes/title/NaiveForeignTitleFactory.php +++ b/includes/title/NaiveForeignTitleFactory.php @@ -18,6 +18,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * A parser that translates page titles on a foreign wiki into ForeignTitle * objects, with no knowledge of the namespace setup on the foreign site. @@ -42,8 +44,6 @@ class NaiveForeignTitleFactory implements ForeignTitleFactory { public function createForeignTitle( $title, $ns = null ) { $pieces = explode( ':', $title, 2 ); - global $wgContLang; - /** * Can we assume that the part of the page title before the colon is a * namespace name? @@ -56,9 +56,10 @@ class NaiveForeignTitleFactory implements ForeignTitleFactory { * ID, we fall back to using the local wiki's namespace names to resolve * this -- better than nothing, and mimics the old crappy behavior */ - $isNamespacePartValid = is_null( $ns ) ? - ( $wgContLang->getNsIndex( $pieces[0] ) !== false ) : - $ns != 0; + $isNamespacePartValid = is_null( $ns ) + ? MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $pieces[0] ) !== + false + : $ns != 0; if ( count( $pieces ) === 2 && $isNamespacePartValid ) { list( $namespaceName, $pageName ) = $pieces; diff --git a/includes/title/NaiveImportTitleFactory.php b/includes/title/NaiveImportTitleFactory.php index 5cb6112014..4da939511c 100644 --- a/includes/title/NaiveImportTitleFactory.php +++ b/includes/title/NaiveImportTitleFactory.php @@ -18,6 +18,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * A class to convert page titles on a foreign wiki (ForeignTitle objects) into * page titles on the local wiki (Title objects), using a default namespace @@ -39,8 +41,6 @@ class NaiveImportTitleFactory implements ImportTitleFactory { * @return Title|null */ public function createTitleFromForeignTitle( ForeignTitle $foreignTitle ) { - global $wgContLang; - if ( $foreignTitle->isNamespaceIdKnown() ) { $foreignNs = $foreignTitle->getNamespaceId(); @@ -53,7 +53,8 @@ class NaiveImportTitleFactory implements ImportTitleFactory { // Do we have a local namespace by the same name as the foreign // namespace? - $targetNs = $wgContLang->getNsIndex( $foreignTitle->getNamespaceName() ); + $targetNs = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( + $foreignTitle->getNamespaceName() ); if ( $targetNs !== false ) { return Title::makeTitleSafe( $targetNs, $foreignTitle->getText() ); } diff --git a/includes/title/TitleFormatter.php b/includes/title/TitleFormatter.php index 4551d75a51..8859066aa5 100644 --- a/includes/title/TitleFormatter.php +++ b/includes/title/TitleFormatter.php @@ -50,7 +50,7 @@ interface TitleFormatter { /** * Returns the title text formatted for display, without namespace of fragment. * - * @note Only minimal normalization is applied. Consider using TitleValue::getText() directly. + * @note Consider using LinkTarget::getText() directly, it's identical. * * @param LinkTarget $title The title to format * diff --git a/includes/title/TitleParser.php b/includes/title/TitleParser.php index de65be8529..ddffed6789 100644 --- a/includes/title/TitleParser.php +++ b/includes/title/TitleParser.php @@ -43,5 +43,5 @@ interface TitleParser { * @throws MalformedTitleException If the text is not a valid representation of a page title. * @return TitleValue */ - public function parseTitle( $text, $defaultNamespace ); + public function parseTitle( $text, $defaultNamespace = NS_MAIN ); } diff --git a/includes/title/TitleValue.php b/includes/title/TitleValue.php index 3e133006d0..43a399ab1c 100644 --- a/includes/title/TitleValue.php +++ b/includes/title/TitleValue.php @@ -22,6 +22,7 @@ */ use MediaWiki\Linker\LinkTarget; use Wikimedia\Assert\Assert; +use Wikimedia\Assert\ParameterTypeException; /** * Represents a page (or page fragment) title within MediaWiki. @@ -76,10 +77,18 @@ class TitleValue implements LinkTarget { * @throws InvalidArgumentException */ public function __construct( $namespace, $dbkey, $fragment = '', $interwiki = '' ) { - Assert::parameterType( 'integer', $namespace, '$namespace' ); - Assert::parameterType( 'string', $dbkey, '$dbkey' ); - Assert::parameterType( 'string', $fragment, '$fragment' ); - Assert::parameterType( 'string', $interwiki, '$interwiki' ); + if ( !is_int( $namespace ) ) { + throw new ParameterTypeException( '$namespace', 'int' ); + } + if ( !is_string( $dbkey ) ) { + throw new ParameterTypeException( '$dbkey', 'string' ); + } + if ( !is_string( $fragment ) ) { + throw new ParameterTypeException( '$fragment', 'string' ); + } + if ( !is_string( $interwiki ) ) { + throw new ParameterTypeException( '$interwiki', 'string' ); + } // Sanity check, no full validation or normalization applied here! Assert::parameter( !preg_match( '/^_|[ \r\n\t]|_$/', $dbkey ), '$dbkey', @@ -149,7 +158,7 @@ class TitleValue implements LinkTarget { * @return string */ public function getText() { - return str_replace( '_', ' ', $this->getDBkey() ); + return str_replace( '_', ' ', $this->dbkey ); } /** diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php index 4e40dce27f..8ddbd04686 100644 --- a/includes/upload/UploadStash.php +++ b/includes/upload/UploadStash.php @@ -325,7 +325,7 @@ class UploadStash { ); // store the insertid in the class variable so immediate retrieval - // (possibly laggy) isn't necesary. + // (possibly laggy) isn't necessary. $this->fileMetadata[$key]['us_id'] = $dbw->insertId(); # create the UploadStashFile object for this file. diff --git a/includes/user/BotPassword.php b/includes/user/BotPassword.php index 960a48644d..2228feb3fe 100644 --- a/includes/user/BotPassword.php +++ b/includes/user/BotPassword.php @@ -250,8 +250,7 @@ class BotPassword implements IDBAccessObject { return PasswordFactory::newInvalidPassword(); } - $passwordFactory = new \PasswordFactory(); - $passwordFactory->init( \RequestContext::getMain()->getConfig() ); + $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory(); try { return $passwordFactory->newFromCiphertext( $password ); } catch ( PasswordError $ex ) { diff --git a/includes/user/CentralIdLookup.php b/includes/user/CentralIdLookup.php index 2a86f4a891..1d7f380822 100644 --- a/includes/user/CentralIdLookup.php +++ b/includes/user/CentralIdLookup.php @@ -67,6 +67,7 @@ abstract class CentralIdLookup implements IDBAccessObject { /** * Reset internal cache for unit testing + * @codeCoverageIgnore */ public static function resetCache() { if ( !defined( 'MW_PHPUNIT_TEST' ) ) { diff --git a/includes/user/User.php b/includes/user/User.php index 5e57a18891..7bebe80715 100644 --- a/includes/user/User.php +++ b/includes/user/User.php @@ -986,13 +986,13 @@ class User implements IDBAccessObject, UserIdentity { * @return bool */ public static function isValidUserName( $name ) { - global $wgContLang, $wgMaxNameChars; + global $wgMaxNameChars; if ( $name == '' || self::isIP( $name ) || strpos( $name, '/' ) !== false || strlen( $name ) > $wgMaxNameChars - || $name != $wgContLang->ucfirst( $name ) + || $name != MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $name ) ) { return false; } @@ -1228,8 +1228,7 @@ class User implements IDBAccessObject, UserIdentity { */ public static function getCanonicalName( $name, $validate = 'valid' ) { // Force usernames to capital - global $wgContLang; - $name = $wgContLang->ucfirst( $name ); + $name = MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $name ); # Reject names containing '#'; these will be cleaned up # with title normalisation, but then it's too late to @@ -1761,24 +1760,29 @@ class User implements IDBAccessObject, UserIdentity { * @return array Array of String options */ public static function getDefaultOptions() { - global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin; + global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgDefaultSkin; static $defOpt = null; static $defOptLang = null; - if ( $defOpt !== null && $defOptLang === $wgContLang->getCode() ) { - // $wgContLang does not change (and should not change) mid-request, - // but the unit tests change it anyway, and expect this method to - // return values relevant to the current $wgContLang. + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + if ( $defOpt !== null && $defOptLang === $contLang->getCode() ) { + // The content language does not change (and should not change) mid-request, but the + // unit tests change it anyway, and expect this method to return values relevant to the + // current content language. return $defOpt; } $defOpt = $wgDefaultUserOptions; // Default language setting - $defOptLang = $wgContLang->getCode(); + $defOptLang = $contLang->getCode(); $defOpt['language'] = $defOptLang; foreach ( LanguageConverter::$languagesWithVariants as $langCode ) { - $defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode; + if ( $langCode === $contLang->getCode() ) { + $defOpt['variant'] = $langCode; + } else { + $defOpt["variant-$langCode"] = $langCode; + } } // NOTE: don't use SearchEngineConfig::getSearchableNamespaces here, @@ -5453,8 +5457,6 @@ class User implements IDBAccessObject, UserIdentity { * @param array|null $data Rows for the current user out of the user_properties table */ protected function loadOptions( $data = null ) { - global $wgContLang; - $this->load(); if ( $this->mOptionsLoaded ) { @@ -5468,7 +5470,7 @@ class User implements IDBAccessObject, UserIdentity { // There's no need to do it for logged-in users: they can set preferences, // and handling of page content is done by $pageLang->getPreferredVariant() and such, // so don't override user's choice (especially when the user chooses site default). - $variant = $wgContLang->getDefaultVariant(); + $variant = MediaWikiServices::getInstance()->getContentLanguage()->getDefaultVariant(); $this->mOptions['variant'] = $variant; $this->mOptions['language'] = $variant; $this->mOptionsLoaded = true; diff --git a/includes/utils/AutoloadGenerator.php b/includes/utils/AutoloadGenerator.php index b437653975..511b67346b 100644 --- a/includes/utils/AutoloadGenerator.php +++ b/includes/utils/AutoloadGenerator.php @@ -258,7 +258,7 @@ EOD; * @return string */ public function getAutoload( $commandName = 'AutoloadGenerator' ) { - // We need to check whether an extenson.json or skin.json exists or not, and + // We need to check whether an extension.json or skin.json exists or not, and // incase it doesn't, update the autoload.php file. $fileinfo = $this->getTargetFileinfo(); diff --git a/includes/utils/UIDGenerator.php b/includes/utils/UIDGenerator.php index d184e92034..52740c9952 100644 --- a/includes/utils/UIDGenerator.php +++ b/includes/utils/UIDGenerator.php @@ -365,7 +365,7 @@ class UIDGenerator { $counter = null; // post-increment persistent counter value // Use APC/etc if requested, available, and not in CLI mode; - // Counter values would not survive accross script instances in CLI mode. + // Counter values would not survive across script instances in CLI mode. $cache = null; if ( ( $flags & self::QUICK_VOLATILE ) && !wfIsCLI() ) { $cache = MediaWikiServices::getInstance()->getLocalServerObjectCache(); diff --git a/includes/widget/search/BasicSearchResultSetWidget.php b/includes/widget/search/BasicSearchResultSetWidget.php index 8521e68f00..1a885b0136 100644 --- a/includes/widget/search/BasicSearchResultSetWidget.php +++ b/includes/widget/search/BasicSearchResultSetWidget.php @@ -2,6 +2,7 @@ namespace MediaWiki\Widget\Search; +use MediaWiki\MediaWikiServices; use Message; use SearchResultSet; use SpecialSearch; @@ -42,8 +43,6 @@ class BasicSearchResultSetWidget { SearchResultSet $titleResultSet = null, SearchResultSet $textResultSet = null ) { - global $wgContLang; - $hasTitle = $titleResultSet ? $titleResultSet->numRows() > 0 : false; $hasText = $textResultSet ? $textResultSet->numRows() > 0 : false; $hasSecondary = $textResultSet @@ -95,7 +94,7 @@ class BasicSearchResultSetWidget { // Convert the whole thing to desired language variant // TODO: Move this up to Special:Search? - return $wgContLang->convert( $out ); + return MediaWikiServices::getInstance()->getContentLanguage()->convert( $out ); } /** @@ -118,9 +117,8 @@ class BasicSearchResultSetWidget { * @return string HTML */ protected function renderResultSet( SearchResultSet $resultSet, $offset ) { - global $wgContLang; - - $terms = $wgContLang->convertForSearchResult( $resultSet->termMatches() ); + $terms = MediaWikiServices::getInstance()->getContentLanguage()-> + convertForSearchResult( $resultSet->termMatches() ); $hits = []; foreach ( $resultSet as $result ) { diff --git a/includes/widget/search/InterwikiSearchResultSetWidget.php b/includes/widget/search/InterwikiSearchResultSetWidget.php index b4e3414857..79380def75 100644 --- a/includes/widget/search/InterwikiSearchResultSetWidget.php +++ b/includes/widget/search/InterwikiSearchResultSetWidget.php @@ -65,12 +65,10 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget { $iwResults = []; foreach ( $resultSets as $resultSet ) { - $result = $resultSet->next(); - while ( $result ) { + foreach ( $resultSet as $result ) { if ( !$result->isBrokenTitle() ) { $iwResults[$result->getTitle()->getInterwiki()][] = $result; } - $result = $resultSet->next(); } } diff --git a/includes/widget/search/SearchFormWidget.php b/includes/widget/search/SearchFormWidget.php index 2302177f28..7eb92fdfd6 100644 --- a/includes/widget/search/SearchFormWidget.php +++ b/includes/widget/search/SearchFormWidget.php @@ -4,6 +4,7 @@ namespace MediaWiki\Widget\Search; use Hooks; use Html; +use MediaWiki\MediaWikiServices; use MediaWiki\Widget\SearchInputWidget; use MWNamespace; use SearchEngineConfig; @@ -50,7 +51,8 @@ class SearchFormWidget { $offset, $isPowerSearch ) { - return Xml::openElement( + return '
    ' . + Xml::openElement( 'form', [ 'id' => $isPowerSearch ? 'powersearch' : 'search', @@ -67,7 +69,8 @@ class SearchFormWidget { "
    " . "
    " . $this->optionsHtml( $term, $isPowerSearch, $profile ) . - ''; + '' . + '
    '; } /** @@ -169,11 +172,10 @@ class SearchFormWidget { * @return bool */ protected function startsWithImage( $term ) { - global $wgContLang; - $parts = explode( ':', $term ); return count( $parts ) > 1 - ? $wgContLang->getNsIndex( $parts[0] ) === NS_FILE + ? MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $parts[0] ) === + NS_FILE : false; } @@ -234,17 +236,16 @@ class SearchFormWidget { * @return string HTML */ protected function powerSearchBox( $term, array $opts ) { - global $wgContLang; - $rows = []; $activeNamespaces = $this->specialSearch->getNamespaces(); + $langConverter = MediaWikiServices::getInstance()->getContentLanguage()->getConverter(); foreach ( $this->searchConfig->searchableNamespaces() as $namespace => $name ) { $subject = MWNamespace::getSubject( $namespace ); if ( !isset( $rows[$subject] ) ) { $rows[$subject] = ""; } - $name = $wgContLang->getConverter()->convertNamespace( $namespace ); + $name = $langConverter->convertNamespace( $namespace ); if ( $name === '' ) { $name = $this->specialSearch->msg( 'blanknamespace' )->text(); } diff --git a/jsduck.json b/jsduck.json index 28473aacb5..6e96945af7 100644 --- a/jsduck.json +++ b/jsduck.json @@ -13,7 +13,6 @@ "resources/src/jquery.tablesorter", "resources/src/jquery.tipsy", "resources/src/jquery/jquery.color.js", - "resources/src/jquery/jquery.expandableField.js", "resources/src/jquery/jquery.highlightText.js", "resources/src/jquery/jquery.mw-jump.js", "resources/src/mediawiki.legacy", diff --git a/languages/FakeConverter.php b/languages/FakeConverter.php index 22377c28be..c4ec6382e5 100644 --- a/languages/FakeConverter.php +++ b/languages/FakeConverter.php @@ -37,7 +37,7 @@ class FakeConverter { */ public $mLang; - function __construct( $langobj ) { + function __construct( Language $langobj ) { $this->mLang = $langobj; } diff --git a/languages/Language.php b/languages/Language.php index 453a610d42..eab09a1d1b 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -550,7 +550,7 @@ class Language { * Get a namespace value by key * * - * $mw_ns = $wgContLang->getNsText( NS_MEDIAWIKI ); + * $mw_ns = $lang->getNsText( NS_MEDIAWIKI ); * echo $mw_ns; // prints 'MediaWiki' * * @@ -568,7 +568,7 @@ class Language { * producing output. * * - * $mw_ns = $wgContLang->getFormattedNsText( NS_MEDIAWIKI_TALK ); + * $mw_ns = $lang->getFormattedNsText( NS_MEDIAWIKI_TALK ); * echo $mw_ns; // prints 'MediaWiki talk' * * @@ -3014,7 +3014,7 @@ class Language { * * @return string */ - function normalize( $s ) { + public function normalize( $s ) { global $wgAllUnicodeFixes; $s = UtfNormal\Validator::cleanUp( $s ); if ( $wgAllUnicodeFixes ) { diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index dcc2cf335f..c098518a96 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -85,7 +85,7 @@ class LanguageConverter { * @param array $flags Defining the custom strings that maps to the flags * @param array $manualLevel Limit for supported variants */ - public function __construct( $langobj, $maincode, $variants = [], + public function __construct( Language $langobj, $maincode, $variants = [], $variantfallbacks = [], $flags = [], $manualLevel = [] ) { global $wgDisabledVariants; @@ -250,7 +250,7 @@ class LanguageConverter { * @return mixed Variant if one found, null otherwise */ protected function getUserVariant() { - global $wgUser, $wgContLang; + global $wgUser; // memoizing this function wreaks havoc on parserTest.php /* @@ -266,7 +266,10 @@ class LanguageConverter { return false; } if ( $wgUser->isLoggedIn() ) { - if ( $this->mMainLanguageCode == $wgContLang->getCode() ) { + if ( + $this->mMainLanguageCode == + MediaWikiServices::getInstance()->getContentLanguage()->getCode() + ) { $ret = $wgUser->getOption( 'variant' ); } else { $ret = $wgUser->getOption( 'variant-' . $this->mMainLanguageCode ); diff --git a/languages/classes/LanguageAr.php b/languages/classes/LanguageAr.php index efdf5a2713..f2ce1788e3 100644 --- a/languages/classes/LanguageAr.php +++ b/languages/classes/LanguageAr.php @@ -40,7 +40,7 @@ class LanguageAr extends Language { * * @return string */ - function normalize( $s ) { + public function normalize( $s ) { global $wgFixArabicUnicode; $s = parent::normalize( $s ); if ( $wgFixArabicUnicode ) { diff --git a/languages/classes/LanguageCrh.php b/languages/classes/LanguageCrh.php index e652a52751..27af14bdd5 100644 --- a/languages/classes/LanguageCrh.php +++ b/languages/classes/LanguageCrh.php @@ -63,7 +63,7 @@ class CrhConverter extends LanguageConverter { * @param array $variantfallbacks * @param array $flags */ - function __construct( $langobj, $maincode, + function __construct( Language $langobj, $maincode, $variants = [], $variantfallbacks = [], $flags = [] ) { diff --git a/languages/classes/LanguageGan.php b/languages/classes/LanguageGan.php index d6f90df633..f315473601 100644 --- a/languages/classes/LanguageGan.php +++ b/languages/classes/LanguageGan.php @@ -32,7 +32,7 @@ class GanConverter extends LanguageConverter { * @param array $flags * @param array $manualLevel */ - function __construct( $langobj, $maincode, + function __construct( Language $langobj, $maincode, $variants = [], $variantfallbacks = [], $flags = [], diff --git a/languages/classes/LanguageKk.php b/languages/classes/LanguageKk.php index 1a1438c6b2..dc8a9f892f 100644 --- a/languages/classes/LanguageKk.php +++ b/languages/classes/LanguageKk.php @@ -44,7 +44,7 @@ class KkConverter extends LanguageConverter { * @param array $variantfallbacks * @param array $flags */ - function __construct( $langobj, $maincode, + function __construct( Language $langobj, $maincode, $variants = [], $variantfallbacks = [], $flags = [] ) { diff --git a/languages/classes/LanguageMl.php b/languages/classes/LanguageMl.php index cf45762ea8..176c64c135 100644 --- a/languages/classes/LanguageMl.php +++ b/languages/classes/LanguageMl.php @@ -41,7 +41,7 @@ class LanguageMl extends Language { * * @return string */ - function normalize( $s ) { + public function normalize( $s ) { global $wgFixMalayalamUnicode; $s = parent::normalize( $s ); if ( $wgFixMalayalamUnicode ) { diff --git a/languages/classes/LanguageZh.php b/languages/classes/LanguageZh.php index e1099f8867..27d6972cd2 100644 --- a/languages/classes/LanguageZh.php +++ b/languages/classes/LanguageZh.php @@ -33,7 +33,7 @@ class ZhConverter extends LanguageConverter { * @param array $flags * @param array $manualLevel */ - function __construct( $langobj, $maincode, + function __construct( Language $langobj, $maincode, $variants = [], $variantfallbacks = [], $flags = [], diff --git a/languages/data/Names.php b/languages/data/Names.php index 277bd021fe..a5b01885b3 100644 --- a/languages/data/Names.php +++ b/languages/data/Names.php @@ -203,6 +203,7 @@ class Names { 'hu' => 'magyar', # Hungarian 'hu-formal' => "magyar (formal)\u{200E}", # Hungarian formal address 'hy' => 'Հայերեն', # Armenian + 'hyw' => 'արեւմտահայերէն', # Western Armenian, T201276 'hz' => 'Otsiherero', # Herero 'ia' => 'interlingua', # Interlingua (IALA) 'id' => 'Bahasa Indonesia', # Indonesian @@ -298,6 +299,7 @@ class Names { 'ml' => 'മലയാളം', # Malayalam 'mn' => 'монгол', # Halh Mongolian (Cyrillic) (ISO 639-3: khk) 'mni' => 'মেইতেই লোন্', # Manipuri/Meitei + 'mnw' => 'ဘာသာ မန်', # Mon, T201583 'mo' => 'молдовеняскэ', # Moldovan, deprecated 'mr' => 'मराठी', # Marathi 'mrj' => 'кырык мары', # Hill Mari @@ -372,7 +374,7 @@ class Names { 'rw' => 'Kinyarwanda', # Kinyarwanda, should possibly be Kinyarwandi 'sa' => 'संस्कृतम्', # Sanskrit 'sah' => 'саха тыла', # Sakha - 'sat' => 'Santali', # Santali + 'sat' => 'ᱥᱟᱱᱛᱟᱲᱤ', # Santali 'sc' => 'sardu', # Sardinian 'scn' => 'sicilianu', # Sicilian 'sco' => 'Scots', # Scots diff --git a/languages/data/README.md b/languages/data/README.md deleted file mode 100644 index 8a13fdcd0d..0000000000 --- a/languages/data/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## normalize-ar.phpc - -Generated by `maintenance/language/generateNormalizerDataAr.php`. - -## normalize-ml.php - -Generated by `maintenance/language/generateNormalizerDataMl.php`. diff --git a/languages/data/ZhConversion.php b/languages/data/ZhConversion.php index c773b48a38..617545dbbc 100644 --- a/languages/data/ZhConversion.php +++ b/languages/data/ZhConversion.php @@ -3215,7 +3215,10 @@ public static $zh2Hant = [ '9只' => '9隻', '9余' => '9餘', '·范' => '·范', +'’m' => '’m', +'’re' => '’re', '’s' => '’s', +'’t' => '’t', '、面点' => '、麵點', '。个中' => '。箇中', '〇周后' => '〇周後', @@ -4025,6 +4028,7 @@ public static $zh2Hant = [ '债累累' => '債纍纍', '傻里傻气' => '傻裡傻氣', '仅余' => '僅餘', +'像赞' => '像讚', '仆人' => '僕人', '仆使' => '僕使', '仆仆' => '僕僕', @@ -4302,8 +4306,6 @@ public static $zh2Hant = [ '劉佳怜' => '劉佳怜', '刘芸后' => '劉芸后', '劉芸后' => '劉芸后', -'力拼' => '力拚', -'力拼众敌' => '力拼眾敵', '力争上游' => '力爭上遊', '功勋' => '功勳', '加氢精制' => '加氫精制', @@ -4319,6 +4321,7 @@ public static $zh2Hant = [ '勾干' => '勾幹', '勾心斗角' => '勾心鬥角', '勾魂荡魄' => '勾魂蕩魄', +'包干' => '包幹', '包括' => '包括', '包准' => '包準', '包谷' => '包穀', @@ -4752,6 +4755,7 @@ public static $zh2Hant = [ '寿面' => '壽麵', '夏于乔' => '夏于喬', '夏于喬' => '夏于喬', +'夏后氏' => '夏后氏', '夏历' => '夏曆', '夏历史' => '夏歷史', '夏游' => '夏遊', @@ -5579,7 +5583,6 @@ public static $zh2Hant = [ '恋恋不舍' => '戀戀不捨', '成于思' => '成於思', '戬谷' => '戩穀', -'截发' => '截髮', '战天斗地' => '戰天鬥地', '战栗' => '戰慄', '战斗' => '戰鬥', @@ -5636,7 +5639,6 @@ public static $zh2Hant = [ '打卡钟' => '打卡鐘', '打吨' => '打吨', '打干' => '打幹', -'打拼' => '打拚', '打断发' => '打斷發', '打卤' => '打滷', '打谷' => '打穀', @@ -5693,20 +5695,13 @@ public static $zh2Hant = [ '拔须' => '拔鬚', '拗别' => '拗彆', '拙朴' => '拙樸', -'拼却' => '拚卻', -'拼命' => '拚命', -'拼舍' => '拚捨', -'拼死' => '拚死', -'拼生尽死' => '拚生盡死', -'拼绝' => '拚絕', -'拼老命' => '拚老命', -'拼斗' => '拚鬥', +'拚舍' => '拚捨', '拜托' => '拜託', '括发' => '括髮', '拭干' => '拭乾', '拮据' => '拮据', '拳局' => '拳跼', -'拼死拼活' => '拼死拼活', +'拼斗' => '拼鬥', '拾沈' => '拾瀋', '拿准' => '拿準', '拿破仑' => '拿破崙', @@ -5936,6 +5931,7 @@ public static $zh2Hant = [ '摄制' => '攝製', '支干' => '支幹', '支配欲' => '支配慾', +'收回' => '收回', '收获' => '收穫', '改制成' => '改制成', '改征' => '改徵', @@ -6569,7 +6565,6 @@ public static $zh2Hant = [ '卤鸭' => '滷鴨', '卤鹅' => '滷鵝', '卤面' => '滷麵', -'满拼自尽' => '滿拚自盡', '满满当当' => '滿滿當當', '满头洋发' => '滿頭洋髮', '漂荡' => '漂蕩', @@ -6641,7 +6636,6 @@ public static $zh2Hant = [ '火并非' => '火並非', '火并' => '火併', '火山里' => '火山裡', -'火拼' => '火拚', '火折子' => '火摺子', '火签' => '火籤', '灰蒙' => '灰濛', @@ -7473,6 +7467,7 @@ public static $zh2Hant = [ '舌干唇焦' => '舌乾唇焦', '舍入口' => '舍入口', '舒卷' => '舒捲', +'舞台风格' => '舞台風格', '舞后' => '舞后', '航海历' => '航海曆', '航海历史' => '航海歷史', @@ -7678,7 +7673,6 @@ public static $zh2Hant = [ '蟻后' => '蟻后', '蚃干' => '蠁幹', '蛮干' => '蠻幹', -'血拼' => '血拚', '血余' => '血餘', '行事历' => '行事曆', '行事历史' => '行事歷史', @@ -8621,6 +8615,7 @@ public static $zh2Hant = [ '鉴赏' => '鑑賞', '長几' => '長几', '长几' => '長几', +'长得丑' => '長得醜', '长历' => '長曆', '长历史' => '長歷史', '长发公主' => '長髮公主', @@ -9812,7 +9807,6 @@ public static $zh2Hans = [ '嗩' => '唢', '嗶' => '哔', '嗹' => '𪡏', -'嘅' => '慨', '嘆' => '叹', '嘍' => '喽', '嘑' => '呼', @@ -13575,6 +13569,7 @@ public static $zh2Hans = [ '乾陵' => '乾陵', '乾隆' => '乾隆', '乾音' => '乾音', +'乾顺' => '乾顺', '乾顧' => '乾顾', '乾顾' => '乾顾', '乾風' => '乾风', @@ -13692,6 +13687,8 @@ public static $zh2Hans = [ '山崎闇斋' => '山崎闇斋', '山崎闇齋' => '山崎闇斋', '岳託' => '岳讬', +'峯會' => '峰会', +'巔峯' => '巅峰', '巨著' => '巨著', '乾乾淨淨' => '干干净净', '乾乾脆脆' => '干干脆脆', @@ -13751,9 +13748,12 @@ public static $zh2Hans = [ '承乾' => '承乾', '拉鍊' => '拉链', '拙著' => '拙著', -'拚命' => '拚命', -'拚搏' => '拚搏', -'拚死' => '拚死', +'拚却' => '拚却', +'拚卻' => '拚却', +'拚弃' => '拚弃', +'拚棄' => '拚弃', +'拚生尽死' => '拚生尽死', +'拚生盡死' => '拚生尽死', '拾瀋' => '拾渖', '挨剋' => '挨剋', '提昇' => '提升', @@ -13858,6 +13858,8 @@ public static $zh2Hans = [ '氾濫' => '泛滥', '洗鍊' => '洗练', '瀋液' => '渖液', +'满拚自尽' => '满拚自尽', +'滿拚自盡' => '满拚自尽', '薰習' => '熏习', '薰心' => '熏心', '薰沐' => '熏沐', @@ -14007,6 +14009,7 @@ public static $zh2Hans = [ '讎正' => '雠正', '讎問' => '雠问', '雪鍊' => '雪链', +'頂峯' => '顶峰', '項鍊' => '项链', '飛昇' => '飞升', '飭令' => '飭令', @@ -14284,6 +14287,10 @@ public static $zh2TW = [ '希拉莉' => '希拉蕊', '希拉里' => '希拉蕊', '希特拉' => '希特勒', +'傷殘奧林匹克' => '帕拉林匹克', +'残疾人奥林匹克' => '帕拉林匹克', +'残奥会' => '帕運會', +'殘奧會' => '帕運會', '巴尔米拉环礁' => '帕邁拉環礁', '帕劳' => '帛琉', '希拉克' => '席哈克', @@ -14666,7 +14673,6 @@ public static $zh2TW = [ '劳拉' => '蘿拉', '荧光' => '螢光', '荧屏' => '螢屏', -'屏幕' => '螢幕', '行人路权' => '行人路權', '行人路權' => '行人路權', '流動作業系統' => '行動作業系統', @@ -14805,6 +14811,8 @@ public static $zh2TW = [ '馬里共和國' => '馬利共和國', '马里共和国' => '馬利共和國', '马拉维' => '馬拉威', +'馬勒當拿' => '馬拉度納', +'马拉多纳' => '馬拉度納', '馬斯特里赫特' => '馬斯垂克', '马斯特里赫特' => '馬斯垂克', '马耳他' => '馬爾他', @@ -14927,6 +14935,7 @@ public static $zh2HK = [ '伴著者' => '伴著者', '伴著述' => '伴著述', '伴著錄' => '伴著錄', +'服务器' => '伺服器', '布下了' => '佈下了', '布下的' => '佈下的', '布光' => '佈光', @@ -15174,6 +15183,7 @@ public static $zh2HK = [ '侵占' => '侵佔', '促著' => '促着', '俄占' => '俄佔', +'奧勒岡' => '俄勒岡', '保障著' => '保障着', '保障著作' => '保障著作', '保障著名' => '保障著名', @@ -15245,6 +15255,8 @@ public static $zh2HK = [ '備著者' => '備著者', '備著述' => '備著述', '備著錄' => '備著錄', +'帕拉林匹克' => '傷殘奧林匹克', +'残疾人奥林匹克' => '傷殘奧林匹克', '傻里傻气' => '傻裏傻氣', '雇员' => '僱員', '雇用' => '僱用', @@ -16359,6 +16371,7 @@ public static $zh2HK = [ '历史里' => '歷史裏', '死里求生' => '死裏求生', '死里逃生' => '死裏逃生', +'帕運會' => '殘奧會', '殺著' => '殺着', '殺著作' => '殺著作', '殺著名' => '殺著名', @@ -17157,7 +17170,6 @@ public static $zh2HK = [ '蘸著錄' => '蘸著錄', '蜜里调油' => '蜜裏調油', '荧屏' => '螢屏', -'屏幕' => '螢幕', '人行道' => '行人路', '行家里手' => '行家裏手', '首席执行官' => '行政總裁', @@ -17775,6 +17787,8 @@ public static $zh2HK = [ '糊口' => '餬口', '馬里蘭' => '馬利蘭', '马里兰' => '馬利蘭', +'馬拉度納' => '馬勒當拿', +'马拉多纳' => '馬勒當拿', '马拉特·萨芬' => '馬拉特·沙芬', '馬斯垂克' => '馬斯特里赫特', '馬爾地夫' => '馬爾代夫', @@ -18092,6 +18106,7 @@ public static $zh2CN = [ '可攜式' => '便携式', '攜帶型' => '便携式', '促著' => '促着', +'奧勒岡' => '俄勒冈', '保護著' => '保护着', '保鑣' => '保镖', '保障著' => '保障着', @@ -18654,7 +18669,6 @@ public static $zh2CN = [ '尼日爾' => '尼日尔', '區域網' => '局域网', '區域網路' => '局域网络', -'螢幕' => '屏幕', '展著' => '展着', '展著書' => '展著书', '展著作' => '展著作', @@ -19308,6 +19322,9 @@ public static $zh2CN = [ '梵谷' => '梵高', '欠帳' => '欠账', '死帳' => '死账', +'帕運會' => '残奥会', +'傷殘奧林匹克' => '残疾人奥林匹克', +'帕拉林匹克' => '残疾人奥林匹克', '庇里牛斯' => '比利牛斯', '披索' => '比索', '畢卡索' => '毕加索', @@ -20511,6 +20528,8 @@ public static $zh2CN = [ '營運長,' => '首席运营官,', '馬爾地夫' => '马尔代夫', '萌島' => '马恩岛', +'馬勒當拿' => '马拉多纳', +'馬拉度納' => '马拉多纳', '馬拉威' => '马拉维', '馬斯垂克' => '马斯特里赫特', '馬爾他' => '马耳他', diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index a6273c5d23..65562a1d50 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -424,6 +424,9 @@ "customcssprotected": "أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.", "customjsonprotected": "ليست لديك صلاحية تحرير صفحة جسون هذه لأنها تحتوي على إعدادات شخصية لمستخدم آخر.", "customjsprotected": "أنت لا تمتلك السماح لتعديل صفحة الجافاسكريبت هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.", + "sitecssprotected": "ليست لديك صلاحية تعديل صفحة CSS هذه لأنها قد تؤثر على جميع الزوار", + "sitejsonprotected": "ليست لديك صلاحية تعديل صفحة جسون هذه لأنها قد تؤثر على جميع الزوار", + "sitejsprotected": "ليست لديك صلاحية تعديل صفحة جافا سكريبت هذه لأنها قد تؤثر على جميع الزوار", "mycustomcssprotected": "ليس لديك صلاحية تعديل هذه الصفحة للطرز المتراصة.", "mycustomjsonprotected": "ليست لديك صلاحية تحرير صفحة جسون هذه", "mycustomjsprotected": "ليس لديك صلاحية تعديل صفحة جافاسكربت هذه.", @@ -432,6 +435,7 @@ "ns-specialprotected": "الصفحات الخاصة لا يمكن تعديلها.", "titleprotected": "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.\nالسبب المعطى هو $2.", "filereadonlyerror": "تعذر تعديل الملف \"$1\" لأن مستودع الملف \"$2\" في وضع القراءة فقط. \n\nإداري النظام الذي قام بغلقه قدم التفسير التالي: \"$3\".", + "invalidtitle": "عنوان غير صالح", "invalidtitle-knownnamespace": "عنوان غير صالح في النطاق «$2» مع نص «$3»", "invalidtitle-unknownnamespace": "عنوان غير صالح ذو نطاق غير معروف رقم $1 ونص «$2»", "exception-nologin": "غير مسجل الدخول", @@ -1291,10 +1295,11 @@ "grant-createaccount": "إنشاء حسابات", "grant-createeditmovepage": "إنشاء وتعديل ونقل الصفحات", "grant-delete": "حذف الصفحات والمراجعات ومدخلات السجلات", - "grant-editinterface": "تعديل نطاق ميدياويكي وCSS/جافا سكريت المستخدم", + "grant-editinterface": "تعديل نطاق ميدياويكي وجسون على مستوى الموقع/المستخدم", "grant-editmycssjs": "تعديل CSS/جافا سكريت/جسون الخاصة بحسابك", "grant-editmyoptions": "تعديل تفضيلاتك", "grant-editmywatchlist": "تعديل قائمة مراقبتك", + "grant-editsiteconfig": "عدل CSS/JS على مستوى الموقع والمستخدم", "grant-editpage": "تعديل صفحات موجودة", "grant-editprotected": "تعديل صفحات محمية", "grant-highvolume": "تعديل كبير الحجم", @@ -1775,7 +1780,7 @@ "uploadstash-zero-length": "الملف طوله صفر.", "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.", + "img-auth-nopathinfo": "معلومات المسار مفقودة;\nيجب إعداد خادمك لتمرير المتغير REQUEST_URI و/أو PATH_INFO variables،\nإذا كان كذلك، فحاول تمكين $wgUsePathInfo،\nانظر https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", "img-auth-notindir": "المسار المطلوب غير موجود في مجلد الرفع المضبوط.", "img-auth-badtitle": "تعذر تشكيل عنوان صالح من \"$1\".", "img-auth-nologinnWL": "لست والجا و\"$1\" ليست في القائمة البيضاء.", @@ -1791,6 +1796,7 @@ "http-timed-out": "انتهت مهلة طلب HTTP.", "http-curl-error": "فشل جلب المسار: $1", "http-bad-status": "ثمة مشكلة أثناء طلب HTTP: $1 $2", + "http-internal-error": "خطأ HTTP داخلي.", "upload-curl-error6": "لم يتمكن من الوصول للمسار", "upload-curl-error6-text": "لم يمكن الوصول إلى المسار الذي حددته.\nمن فضلك راجع صحة المسار مرة أخرى وأن الموقع يعمل.", "upload-curl-error28": "انتهاء مهلة الرفع", @@ -2115,7 +2121,7 @@ "cachedspecial-refresh-now": "استعرض آخر نسخة", "categories": "تصنيفات", "categories-submit": "أظهر", - "categoriespagetext": "{{PLURAL:$1|التصنيف التالي يحتوي|التصنيفات التالية تحتوي}} على صفحات أو وسائط.\n[[Special:UnusedCategories|التصنيفات غير المستخدمة]] غير معروضة هنا.\nانظر أيضاً [[Special:WantedCategories|التصنيفات المطلوبة]].", + "categoriespagetext": "{{PLURAL:$1|التصنيف التالي|التصنيفات التالية}} موجودة في الويكي، وقد تكون مستخدمة أو غير مستخدمة،\nانظر أيضا [[Special:WantedCategories|التصنيفات المطلوبة]].", "categoriesfrom": "اعرض التصنيفات ابتداء من:", "deletedcontributions": "مساهمات المستخدم المحذوفة", "deletedcontributions-title": "مساهمات المستخدم المحذوفة", @@ -4185,6 +4191,7 @@ "edit-error-long": "الأخطاء:\n\n$1", "revid": "المراجعة $1", "pageid": "معرف الصفحة $1", + "interfaceadmin-info": "$1\n\nتم فصل صلاحيات تحرير ملفات CSS/JS/JSON على مستوى الموقع مؤخرً من صلاحية editinterface، إذا لم تفهم سبب حصولك على هذا الخطأ، فراجع [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "لا يمكن استخدام وسوم <html> خارج الصفحات العادية.", "gotointerwiki": "ترك {{SITENAME}}", "gotointerwiki-invalid": "العنوان المحدد غير صحيح.", @@ -4205,5 +4212,6 @@ "passwordpolicies-policy-passwordcannotmatchusername": "لا يمكن أن تكون كلمة المرور هي نفس اسم المستخدم", "passwordpolicies-policy-passwordcannotmatchblacklist": "لا يمكن أن تتطابق كلمة المرور مع كلمات المرور المدرجة على القائمة السوداء تحديدا", "passwordpolicies-policy-maximalpasswordlength": "يجب أن يكون طول كلمة المرور أقل من $1 {{PLURAL:$1|حرف|أحرف}}", - "passwordpolicies-policy-passwordcannotbepopular": "لا يمكن أن تكون كلمة المرور {{PLURAL:$1|كلمة المرور الشائعة|في قائمة كلمات المرور الشائعة الـ$1}}" + "passwordpolicies-policy-passwordcannotbepopular": "لا يمكن أن تكون كلمة المرور {{PLURAL:$1|كلمة المرور الشائعة|في قائمة كلمات المرور الشائعة الـ$1}}", + "easydeflate-invaliddeflate": "المحتوى المقدم لا يتم تفريغه بشكل صحيح" } diff --git a/languages/i18n/arc.json b/languages/i18n/arc.json index 9c910c2914..1e98162dcd 100644 --- a/languages/i18n/arc.json +++ b/languages/i18n/arc.json @@ -84,6 +84,20 @@ "oct": "ܬܫܪܝܢ ܩܕܡ", "nov": "ܬܫܪܝܢ ܐܚܪܝ", "dec": "ܟܢܘܢ ܩܕܡ", + "january-date": "ܟܢܘܢ ܬܪܝܢܐ $1", + "february-date": "ܫܒܛ $1", + "march-date": "ܐܕܪ $1", + "april-date": "ܢܝܣܢ $1", + "may-date": "ܐܝܪ $1", + "june-date": "ܚܙܝܪܢ $1", + "july-date": "ܬܡܘܙ $1", + "august-date": "ܐܒ $1", + "september-date": "ܐܝܠܘܠ $1", + "october-date": "ܬܫܪܝܢ ܩܕܡܝܐ $1", + "november-date": "ܬܫܪܝܢ ܬܪܝܢܐ $1", + "december-date": "ܟܢܘܢ ܩܕܡܝܐ $1", + "period-am": "ܩܕܡ ܛܗܪܐ", + "period-pm": "ܒܬܪ ܛܗܪܐ", "pagecategories": "{{PLURAL:$1|ܣܕܪܐ|ܣܕܪ̈ܐ}}", "category_header": "ܦܐܬܬ̈ܐ ܒܣܕܪܐ ܕ \"$1\"", "subcategories": "ܣܕܪ̈ܐ ܦܪ̈ܥܝܐ", @@ -105,7 +119,7 @@ "moredotdotdot": "ܝܬܝܪ...", "mypage": "ܦܐܬܐ", "mytalk": "ܡܡܠܠܐ", - "anontalk": "ܡܡܠܠܐ ܕܗܢܐ ܐܝ ܦܝ (IP)", + "anontalk": "ܡܡܠܠܐ", "navigation": "ܐܠܦܪܘܬܐ", "and": " ܘ", "faq": "ܫܘܐܠ̈ܐ ܬܢܝ̈ܐ", @@ -123,11 +137,13 @@ "searcharticle": "ܙܠ", "history": "ܬܫܥܝܬܐ ܕܦܐܬܐ", "history_short": "ܬܫܥܝܬܐ", + "history_small": "ܬܫܥܝܬܐ", "updatedmarker": "ܐܬܚܕܬ ܗܐ ܡܢ ܙܒܢܐ ܕܣܘܥܪܢܝ ܐܚܪܝܐ", "printableversion": "ܨܚܚܐ ܡܬܛܒܥܢܐ", "permalink": "ܐܣܘܪܐ ܦܝܘܫܐ", "print": "ܛܒܘܥ", "view": "ܚܘܝ", + "view-foreign": "ܚܙܝ ܒ$1", "edit": "ܫܚܠܦ", "create": "ܒܪܝ", "delete": "ܫܘܦ", @@ -171,6 +187,7 @@ "disclaimers": "ܠܐ ܡܫܬܐܠܢܘܬܐ", "disclaimerpage": "Project:ܠܐ ܡܫܬܐܠܢܘܬܐ ܓܘܢܝܬܐ", "edithelp": "ܥܘܕܪܢܐ ܠܫܚܠܦܬܐ", + "helppage-top-gethelp": "ܥܘܕܪܢܐ", "mainpage": "ܦܐܬܐ ܪܝܫܝܬܐ", "mainpage-description": "ܦܐܬܐ ܪܝܫܝܬܐ", "policy-url": "Project:ܦܘܪܢܣܐ", @@ -198,6 +215,8 @@ "hidetoc": "ܛܫܝ", "collapsible-collapse": "ܐܟܪܟ", "collapsible-expand": "ܐܪܘܚ", + "confirmable-yes": "ܐܝܢ", + "confirmable-no": "ܠܐ", "viewdeleted": "ܚܙܝ $1؟", "restorelink": "{{PLURAL:$1|ܚܕ ܫܘܚܠܦܐ ܫܝܦܐ|$1 ܫܘܚܠܦ̈ܐ ܫܝܦ̈ܐ}}", "site-atom-feed": "$1 ܛܥܝܡܘܬܐ ܕܐܛܘܡ", @@ -216,10 +235,12 @@ "nstab-template": "ܩܠܒܐ", "nstab-help": "ܦܐܬܐ ܕܥܘܕܪܢܐ", "nstab-category": "ܣܕܪܐ", + "mainpage-nstab": "ܕܦܐ ܪܝܫܝܐ", "nosuchaction": "ܠܝܬ ܗܟܘܬ ܥܒܕܐ", "nosuchspecialpage": "ܠܝܬ ܗܟܘܬ ܦܐܬܐ ܕܝܠܢܝܬܐ", "error": "ܦܘܕܐ", "databaseerror": "ܦܘܕܐ ܒܐܣ ܝܕ̈ܥܬܐ", + "databaseerror-error": "ܦܘܕܐ: $1", "missingarticle-rev": "(ܡܢܝܢܐ ܕܬܢܝܬܐ: $1)", "missingarticle-diff": "(ܦܘܪܫܐ: $1, $2)", "internalerror": "ܦܘܕܐ ܓܘܝܐ", @@ -231,7 +252,8 @@ "viewsource": "ܚܙܝ ܡܒܘܥܐ", "viewsource-title": "ܚܙܝ ܡܒܘܥܐ ܕ $1", "actionthrottled": "ܠܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗܝ ܠܡܥܒܕ ܝܬܝܪ ܡܢ ܗܢܐ ܥܒܕܐ", - "viewsourcetext": "ܡܨܐ ܐܢܬ ܕܬܚܙܐ ܘܬܢܣܚ ܠܡܒܘ̈ܥܐ ܕܗܕܐ ܦܐܬܐ:", + "viewsourcetext": "ܡܨܐ ܐܢܬ ܕܬܚܙܐ ܘܬܢܣܚ ܠܡܒܘ̈ܥܐ ܕܕܦܐ ܗܢܐ.", + "viewyourtext": "ܡܨܐ ܐܢܬ ܕܬܚܙܐ ܘܬܢܣܚ ܠܡܒܘ̈ܥܐ ܕܫܘܚ̈ܠܦܐ ܕܝܠܟ ܒܕܦܐ ܗܢܐ.", "protectedinterface": "ܗܕܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ ܒܗܢܐ ܘܝܩܝ, ܘܐܝܬܝܗܝ ܢܛܪܬܐ ܠܡܘܢܥ ܚܘܒܠܐ.\nܠܡܘܣܦ ܐܘ ܫܘܚܠܦ ܬܘܪ̈ܓܡܐ ܕܟܠܗܘܢ ܘܝܩܝ، ܐܦܠܚ [https://translatewiki.net/ translatewiki.net]، ܬܪܡܝܬܐ ܕܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ.", "editinginterface": "'''ܙܘܗܪܐ:''' ܐܢܬ ܬܫܚܠܦ ܦܐܬܐ ܕܡܬܦܠܚܬ ܒܚܙܝܐ ܟܬܝܒܝܐ ܕܬܚܪܙܬܐ.\nܟܠ ܫܘܚܠܦܐ ܒܦܐܬܐ ܗܕܐ ܢܗܘܐ ܠܗ ܡܥܒܕܢܘܬܐ ܥܠ ܐܣܟܡ ܦܐܬܐ ܕܡܦܠܚܢܐ ܕܡܦܠܚܢ̈ܐ ܐܚܪ̈ܢܐ ܒܘܝܩܝ ܗܢܐ.\nܠܡܘܣܦ ܐܘ ܫܘܚܠܦ ܬܘܪ̈ܓܡܐ ܕܟܠܗܘܢ ܘܝܩܝ، ܐܦܠܚ [https://translatewiki.net/ translatewiki.net]، ܬܪܡܝܬܐ ܕܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ.", "namespaceprotected": "ܠܝܬ ܠܟ ܦܣܣܐ ܠܫܚܠܦܬܐ ܕܦܐܬܬ̈ܐ ܒܚܩܠܐ ܕ'''$1'''.", diff --git a/languages/i18n/ast.json b/languages/i18n/ast.json index d49e1c5f7d..aaea4c7dca 100644 --- a/languages/i18n/ast.json +++ b/languages/i18n/ast.json @@ -362,6 +362,9 @@ "customcssprotected": "Nun tienes permisu pa editar esta páxina CSS porque contien preferencies personales d'otru usuariu.", "customjsonprotected": "Nun tienes permisu pa editar esta páxina JSON porque contien preferencies personales d'otru usuariu.", "customjsprotected": "Nun tienes permisu pa editar esta páxina de JavaScript porque contien preferencies personales d'otru usuariu.", + "sitecssprotected": "Nun tienes permisu pa editar esta páxina de CSS porque puede afeutar a tolos visitantes", + "sitejsonprotected": "Nun tienes permisu pa editar esta páxina en JSON porque puede afeutar a tolos visitantes", + "sitejsprotected": "Nun tienes permisu para editar esta páxina de JavaScript porque puede afeutar a tolos visitantes", "mycustomcssprotected": "Nun tien permisu pa editar esta páxina CSS.", "mycustomjsonprotected": "Nun tien permisu pa editar esta páxina JSON.", "mycustomjsprotected": "Nun tien permisu pa editar esta páxina JavaScript.", @@ -370,6 +373,7 @@ "ns-specialprotected": "Les páxines especiales nun se puen editar.", "titleprotected": "Esti títulu ta protexíu escontra creación por [[User:$1|$1]].\nEl motivu conseñáu ye $2.", "filereadonlyerror": "Nun pudo camudase'l ficheru «$1» porque l'estoyu de ficheros «$2» ta en mou de sólo llectura.\n\nL'alministrador del sistema que lu bloquió dio esti motivu: «$3».", + "invalidtitle": "Títulu inválidu", "invalidtitle-knownnamespace": "Títulu inválidu col espaciu de nomes «$2» ya'l testu «$3»", "invalidtitle-unknownnamespace": "Títulu inválidu col númberu $1 d'espaciu de nomes desconocíu ya'l testu «$2»", "exception-nologin": "Nun aniciasti sesión", @@ -770,6 +774,7 @@ "converter-manual-rule-error": "Detectóse un error na regla de conversión manual de llingua", "undo-success": "La edición se pue esfacer.\nPor favor comprueba la comparanza d'abaxo pa confirmar que ye eso lo que quies facer, y depués guarda los cambios p'acabar d'esfacer la edición.", "undo-failure": "Nun pudo esfacese la edición por aciu d'ediciones intermedies conflictives.", + "undo-main-slot-only": "Nun pudo desfacese'l cambiu porque tien conteníu fora del slot principal.", "undo-norev": "Nun pudo desfacese la edición porque nun esiste o se desanició.", "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]])", @@ -917,6 +922,8 @@ "diff-paragraph-moved-toold": "Treslladóse'l párrafu. Pulsia pa saltar al allugamientu anterior.", "difference-missing-revision": "{{PLURAL:$2|Nun s'alcontró|Nun s'alcontraron}} {{PLURAL:$2|una revisión|$2 revisiones}} d'esta diferencia ($1).\n\nDe vezu la causa d'esto ye siguir un enllaz de diferencia antiguu a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].", "searchresults": "Resultaos de la busca", + "search-filter-title-prefix": "Buscar solo nes páxines con títulos qu'empiecen por «$1»", + "search-filter-title-prefix-reset": "Buscar en toles páxines", "searchresults-title": "Resultaos de buscar \"$1\"", "titlematches": "Coincidencies de los títulos de la páxina", "textmatches": "Coincidencies del testu de la páxina", @@ -1118,6 +1125,7 @@ "group-autoconfirmed": "Usuarios autoconfirmaos", "group-bot": "Bots", "group-sysop": "Alministradores", + "group-interface-admin": "Alministradores de la interfaz", "group-bureaucrat": "Burócrates", "group-suppress": "Supresores", "group-all": "(toos)", @@ -1125,12 +1133,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|usuariu auto-confirmáu|usuaria auto-confirmada}}", "group-bot-member": "{{GENDER:$1|bot}}", "group-sysop-member": "{{GENDER:$1|alministrador|alministradora}}", + "group-interface-admin-member": "{{GENDER:$1|alministrador|alministradora}} de la interfaz", "group-bureaucrat-member": "{{GENDER:$1|burócrata}}", "group-suppress-member": "{{GENDER:$1|supresor|supresora}}", "grouppage-user": "{{ns:project}}:Usuarios", "grouppage-autoconfirmed": "{{ns:project}}:Usuarios autoconfirmaos", "grouppage-bot": "{{ns:project}}:Bots", "grouppage-sysop": "{{ns:project}}:Alministradores", + "grouppage-interface-admin": "{{ns:project}}: Alministradores de la interfaz", "grouppage-bureaucrat": "{{ns:project}}:Burócrates", "grouppage-suppress": "{{ns:project}}:Supresores", "right-read": "Lleer páxines", @@ -1181,6 +1191,9 @@ "right-editusercss": "Editar los ficheros CSS d'otros usuarios", "right-edituserjson": "Editar los ficheros JSON d'otros usuarios", "right-edituserjs": "Editar los ficheros JavaScript d'otros usuarios", + "right-editsitecss": "Editar CSS global del sitiu", + "right-editsitejson": "Editar JSON global del sitiu", + "right-editsitejs": "Editar JavaScript global del sitiu", "right-editmyusercss": "Editar los propios ficheros CSS d'usuariu", "right-editmyuserjson": "Editar los ficheros JSON d'usuariu propios", "right-editmyuserjs": "Editar los propios ficheros JavaScript d'usuariu", @@ -1222,10 +1235,11 @@ "grant-createaccount": "Crear cuentes", "grant-createeditmovepage": "Crear, editar y mover páxines", "grant-delete": "Desaniciar páxines, revisiones y entraes del rexistru", - "grant-editinterface": "Editar l'espaciu de nomes MediaWiki y los CSS/JSON/JavaScript d'usuariu", + "grant-editinterface": "Editar l'espaciu de nomes MediaWiki y los JSON del sitiu o d'usuariu", "grant-editmycssjs": "Editar los CSS/JSON/JavaScript d'usuariu propios", "grant-editmyoptions": "Editar les preferencies d'usuariu propies", "grant-editmywatchlist": "Editar la llista de vixilancia propia", + "grant-editsiteconfig": "Editar les páxines CSS/JS del sitiu o d'usuariu", "grant-editpage": "Editar páxines esistentes", "grant-editprotected": "Editar páxines protexíes", "grant-highvolume": "Ediciones de gran volume", @@ -1323,6 +1337,8 @@ "rcfilters-activefilters": "Filtros activos", "rcfilters-activefilters-hide": "Tapecer", "rcfilters-activefilters-show": "Amosar", + "rcfilters-activefilters-hide-tooltip": "Anubrir l'área de Filtros activos", + "rcfilters-activefilters-show-tooltip": "Amosar l'área de Filtros activos", "rcfilters-advancedfilters": "Filtros avanzaos", "rcfilters-limit-title": "Resultancies qu'amosar", "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cambiu|$1 cambios}}, $2", @@ -1705,7 +1721,7 @@ "uploadstash-zero-length": "El ficheru tien tamañu cero.", "invalid-chunk-offset": "Allugamientu inválidu del fragmentu", "img-auth-accessdenied": "Accesu denegáu", - "img-auth-nopathinfo": "Falta PATH_INFO.\nEl to sirvidor nun ta configuráu pa pasar esta información.\nPue tar basáu en CGI y nun tener sofitu pa img_auth.\nVer https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization", + "img-auth-nopathinfo": "Falta la información de ruta.\nEl to sirvidor tien de configurase pa pasar les variables REQUEST_URI y/o PATH_INFO.\nSi yá ta fecho, tenta activar $wgUsePathInfo.\nVer https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization", "img-auth-notindir": "El camín solicitáu nun ta nel direutoriu de xubíes configuráu.", "img-auth-badtitle": "Nun se pue construir un títulu validu dende \"$1\".", "img-auth-nologinnWL": "Nun tas coneutáu y \"$1\" nun ta na llista blanca.", @@ -1721,6 +1737,7 @@ "http-timed-out": "La llamada HTTP escosó'l tiempu.", "http-curl-error": "Error al baxar la URL: $1", "http-bad-status": "Hebo un problema demientres la llamada HTTP: $1 $2", + "http-internal-error": "Error internu d'HTTP.", "upload-curl-error6": "Nun se pudo acceder a la URL", "upload-curl-error6-text": "Nun pudo algamase la URL dada.\nComprueba que la URL ye correuta y que'l sitiu ta activu.", "upload-curl-error28": "Escosó'l tiempu d'espera de la carga", @@ -1765,9 +1782,9 @@ "filehist-filesize": "Tamañu del ficheru", "filehist-comment": "Comentariu", "imagelinks": "Usu del ficheru", - "linkstoimage": "{{PLURAL:$1|La páxina siguiente enllacia|Les páxines siguientes enllacien}} a esti ficheru:", - "linkstoimage-more": "Más de $1 {{PLURAL:$1|páxina enllacia|páxines enllacien}} a esti ficheru.\nLa llista siguiente amuesa{{PLURAL:$1|'l primer enllaz de páxina| los primeros $1 enllaces de páxina}} a esti ficheru namái.\nHai disponible una [[Special:WhatLinksHere/$2|llista completa]].", - "nolinkstoimage": "Nun hai páxines qu'enllacien a esti ficheru.", + "linkstoimage": "{{PLURAL:$1|La páxina siguiente usa|Les páxines siguientes usen}} esti ficheru:", + "linkstoimage-more": "Más de $1 {{PLURAL:$1|páxina usa|páxines usen}} esti ficheru.\nLa llista siguiente amuesa {{PLURAL:$1|la primer páxina qu'usa|les $1 primeres páxines qu'usen}} esti ficheru namái.\nHai disponible una [[Special:WhatLinksHere/$2|llista completa]].", + "nolinkstoimage": "Nun hai páxines qu'usen esti ficheru.", "morelinkstoimage": "Ver [[Special:WhatLinksHere/$1|más enllaces]] a esti ficheru.", "linkstoimage-redirect": "$1 (redireición de ficheru) $2", "duplicatesoffile": "{{PLURAL:$1|El siguiente ficheru ye un duplicáu|Los $1 ficheros siguientes son duplicaos}} d'esti ([[Special:FileDuplicateSearch/$2|más detalles]]):", @@ -2013,6 +2030,9 @@ "speciallogtitlelabel": "Oxetivu (títulu o {{ns:user}}:nome d'usuariu):", "log": "Rexistros", "logeventslist-submit": "Amosar", + "logeventslist-more-filters": "Amosar más rexistros:", + "logeventslist-patrol-log": "Rexistru de revisiones", + "logeventslist-tag-log": "Rexistru d'etiquetes", "all-logs-page": "Tolos rexistros públicos", "alllogstext": "Vista combinada de tolos rexistros disponibles de {{SITENAME}}.\nPues filtrar la vista seleicionando una triba de rexistru, el nome d'usuariu (sensible a mayúscules y minúscules), o la páxina afeutada (tamién sensible a mayúscules y minúscules).", "logempty": "Nun hai coincidencies nel rexistru.", @@ -2040,7 +2060,7 @@ "cachedspecial-refresh-now": "Ver la más nueva.", "categories": "Categoríes", "categories-submit": "Amosar", - "categoriespagetext": "{{PLURAL:$1|La siguiente categoría contién|Les siguientes categoríes contienen}} páxines o ficheros multimedia.\nLes [[Special:UnusedCategories|categoríes nun usaes]] nun s'amuesen equí.\nVer tamién les [[Special:WantedCategories|categoríes más buscaes]].", + "categoriespagetext": "{{PLURAL:$1|La siguiente categoría existe|Les siguientes categoríes existen}} na wiki, y pueden tar usándose o non.\nVer tamién les [[Special:WantedCategories|categoríes más buscaes]].", "categoriesfrom": "Amosar les categoríes qu'empiecen por:", "deletedcontributions": "Contribuciones d'usuariu desaniciaes", "deletedcontributions-title": "Contribuciones d'usuariu desaniciaes", @@ -2366,6 +2386,7 @@ "uctop": "(actual)", "month": "Dende'l mes (y anteriores):", "year": "Dende l'añu (y anteriores):", + "date": "Dende la fecha (y anteriores):", "sp-contributions-newbies": "Amosar namái les contribuciones de cuentes nueves", "sp-contributions-newbies-sub": "Pa cuentes nueves", "sp-contributions-newbies-title": "Contribuciones d'usuariu pa cuentes nueves", @@ -3998,6 +4019,7 @@ "edit-error-long": "Errores:\n\n$1", "revid": "revisión $1", "pageid": "ID de páxina $1", + "interfaceadmin-info": "$1\n\nLos permisos pa editar los ficheros CSS, JS y JSON globales del sitiu fueron apocayá dixebraos del permisu editinterface. Si nun entiendes por qué recibes esti error, por favor llei [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "Les etiquetes <html> nun pueden usase fuera de les páxines normales.", "gotointerwiki": "Dexando {{SITENAME}}", "gotointerwiki-invalid": "El títulu especificáu nun ye válidu.", @@ -4018,5 +4040,6 @@ "passwordpolicies-policy-passwordcannotmatchusername": "La contraseña nun puede ser la mesma que'l nome d'usuariu", "passwordpolicies-policy-passwordcannotmatchblacklist": "La contraseña nun puede casar con contraseñes torgaes específicamente", "passwordpolicies-policy-maximalpasswordlength": "La llonxitú de la contraseña tien de ser menor que {{PLURAL:$1|1 caráuter|$1 caráuteres}}", - "passwordpolicies-policy-passwordcannotbepopular": "La contraseña nun puede {{PLURAL:$1|ser la contraseña más popular|tar na llista de $1 contraseñes populares}}" + "passwordpolicies-policy-passwordcannotbepopular": "La contraseña nun puede {{PLURAL:$1|ser la contraseña más popular|tar na llista de $1 contraseñes populares}}", + "easydeflate-invaliddeflate": "El conteníu dau nun ta comprimíu correutamente" } diff --git a/languages/i18n/azb.json b/languages/i18n/azb.json index f3b60a1b25..52de5f7a12 100644 --- a/languages/i18n/azb.json +++ b/languages/i18n/azb.json @@ -22,7 +22,8 @@ "Ilğım", "ییلماز", "Saraiki", - "Fitoschido" + "Fitoschido", + "SajjadHKH" ] }, "tog-underline": "باغلانتی‌لارین آلتینی خطله:", @@ -337,14 +338,18 @@ "title-invalid-empty": "آختاردیٛغیٛنیٛز صفحه‌‌نین آدیٛ بوْشدۇر و یا آدلارفضاسیٛندا یالنیٛز آدیٛ وار.", "title-invalid-utf8": "ایسته‌نیلن صفحه‌نین آدیندا بیر یانلیش UTF-8 کاراکتِری وار.", "title-invalid-interwiki": "آختاردیٛغیٛنیٛز صفحه‌ آدیٛیٛندا بیر ایستیفاده‌ اوْلۇنا بیلمه‌‌ین اینتئر ویکی باغلانتیٛسیٛ وار.", + "title-invalid-talk-namespace": "ایسته دیینیز صفحه آرتیق وار اولمایان بیر \"دانیشیق صفحه\" سینه ایشاره ادیر", "title-invalid-characters": "ایسته‌نیلن صفحه‌نین آدیندا، یانلیش کاراکتِرلر وار: «$1»", + "title-invalid-magic-tilde": "ایسته دیینیز صفحه ده دوغرو اولمایان \"تیلد\" کاراکترلری واردیر\n(~~~).", + "title-invalid-too-long": "ایسته دیینیز عنوان چوخ اوزوندور. عنواننیز $1 {{PLURAL:$1|byte|bytes}} کارکتردن داها چوخ UTF-8 کاراکترینه صاحیب اولمامالیدیر.", + "title-invalid-leading-colon": "ایسته دیینیز عنوان دوغرو اولمایان \"کولون\" کاراکتری ایله باشلانیر.", "perfcached": "بو دئیتا، کَش اولوب‌دور و اولا بیلر آپدیت اولماسین. چوخو {{PLURAL:$1|بیر نتیجه|$1 نتیجه}} کَش‌ده‌دیر.", "perfcachedts": "بو دئیتا کَش اولوب‌دور، سون دفعه $1 واختیندا آپدین اولونوبدور. چوخو {{PLURAL:$4|بیر نتیجه|$4 نتیجه}} کَش‌ده‌دیر.", "querypage-no-updates": "بو صفحه ده آپدیت ائتمک ایندی باغلانیب‌دیر.\nبورداکی دئیتا یئنی‌لشمیه‌جکلر.", "viewsource": "قایناغا باخ", "viewsource-title": "$1 اوچون قایناغا باخین", "actionthrottled": "سیزین چالیشمانیزین قاباغی آلیندی", - "actionthrottledtext": "آنتی-ایسپام حرکت‌لری گؤره، بیر حرکتی قیسا بیر زامان آرالیغیندا چوخئتمه‌نیز انگللندی، و سیز حدی آشمیسینیز. لطفاً بیر نئچه دقیقه سونرا یئنی‌دن یوخلایین.", + "actionthrottledtext": "سوءاستفاده لرین قاباقین آلماخ اوچون، بیر حرکتی قیسا بیر زامان آرالیغیندا چوخئتمه‌نیز انگللندی، و سیز حدی آشمیسینیز. لطفاً بیر نئچه دقیقه سونرا یئنی‌دن یوخلایین.", "protectedpagetext": "بو صحیفه دیَیشدیرمک و باشقا ایشلر اوچون باغلی‌دیر.", "viewsourcetext": "سیز بو صفحه‌نین قایناغینی گؤروب و کؤچوره بیلرسینیز.", "viewyourtext": "سیز بو صفحه‌ده اؤز دَییشیکلیکلرینیزین قایناغینی گؤروب و کوپی ائده بیلرسینیز.", @@ -354,14 +359,20 @@ "cascadeprotected": "بو صحیفه دَییشیکلیکلر قاباغیندا قورونوب‌دور، چونکو بو آشاغیداکی، آبشاری {{PLURAL:$1|سئچمه‌سی|سئچمه‌لری}} سئچیلن، قورونان {{PLURAL:$1|صحیفه|صحیفه‌لر}} ایچینده‌دیر:\n$2", "namespaceprotected": "سیز '''$1''' آدفضاسینداکی صحیفه‌لرین دَییشمه‌سینه ایجازه‌نیز یوخدور.", "customcssprotected": "سیز بو CSS صفحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور نییه کی اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.", + "customjsonprotected": "سیزین بو JSON صفحه‌سینی دَییشمه‌ حقیز یوخدور، نییه کی اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.", "customjsprotected": "سیز بو جاوااسکریپت صفحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور، نییه کی اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.", + "sitecssprotected": "سیز بو CSS صفحه سینی دئیشه بیلمه سیز چونکی دئیشدیینیز موردلر بوتون ایشلدن لره تاثیر قویا بیلر.", + "sitejsonprotected": "سیزین بو JSON صفحه‌سینی دَییشمه‌ حقیز یوخدور، نییه کی دییشملرینیز بوتون ایشلدن لره تاثیر قویا بیلر.", + "sitejsprotected": "سیزین بو JavaScript صفحه‌سینی دَییشمه‌ حقیز یوخدور، نییه کی دییشملرینیز بوتون ایشلدن لره تاثیر قویا بیلر.", "mycustomcssprotected": "بو CSS صحیفه‌سینی دَییشدیرمگه ایجازه‌نیز یوخدور.", + "mycustomjsonprotected": "سیزین بو JSON صفحه‌سینی دَییشمه‌ حقیز یوخدور.", "mycustomjsprotected": "بو جاوااسکریپت صحیفه‌سینی دَییشدیرمگه ایجازه‌نیز یوخدور.", "myprivateinfoprotected": "اؤز گیزلی بیلگیلرینیزی دَییشدیرمگه ایجازه‌نیز یوخدور.", "mypreferencesprotected": "اؤز ترجیحلرینیزی دَییشدیرمگه ایجازه‌نیز یوخدور.", "ns-specialprotected": "اؤزل یارپاقلاری دَییشمک اولماز.", "titleprotected": "بو آددا یارپاغین یارادیلماسی [[User:$1|$1]] ایشلدن طرفیندن باغلانیب‌دیر.\nاونون نَدَن‌لیگی بودور: $2.", "filereadonlyerror": "«$2» آنباری‌نین تکجه-اوخومالی دوروموندا اولدوغونا گؤره، «$1»-ی دَییشمک اولماز.\n\nاونو باغلایان ایداره‌چی بو ایضاحی وئریب‌دیر: $3", + "invalidtitle": "گئچرسیز عنوان", "invalidtitle-knownnamespace": "«$2» آدآلان‌لی و «$3» یازی‌لی یانلیش باشلیق", "invalidtitle-unknownnamespace": "تانینمامیش $1 نومره‌لی آدآلان و «$2» یازی‌لی یانلیش باشلیق", "exception-nologin": "گیریش ائتمه‌میسینیز", @@ -393,6 +404,7 @@ "cannotloginnow-title": "ایندی گیریش اوْلونمازدیر", "cannotloginnow-text": "$1-ی ایشلدرکن گیریش اوْلونمازدیر", "cannotcreateaccount-title": "حساب یاراتماق اوْلمور", + "cannotcreateaccount-text": "مستقیم آد یازدیرماق بو ویکی ده فعال ادیلمیب.", "yourdomainname": "سیزین دامنه:", "password-change-forbidden": "بو ویکی‌ده رمزلری دَییشه بیلنمه‌سینیز.", "externaldberror": "بیر دیتابیس دوغرولاما خطاسی اولدو، یوخسا سیزین ائشیک حسابینیزی گونجل‌لدمگه ایجازه‌نیز یوخدور.", @@ -415,6 +427,7 @@ "createacct-email-ph": "ایمیل آدرسینیزی یازین", "createacct-another-email-ph": "ایمیل آدرسینیزی یازین", "createaccountmail": "بیر گئچیجی راست‌گله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر", + "createaccountmail-help": "بیر آیری ایشلدنه گئچیش یازی سین بیلمه دن آد یازدیرماق ایچین دیر", "createacct-realname": "دوغرو آد (ایستگه باغلی)", "createacct-reason": "سبب", "createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز", @@ -428,6 +441,7 @@ "createacct-benefit-body2": "{{PLURAL:$1|صفحه}}", "createacct-benefit-body3": "سون {{PLURAL:$1|قاتیلان|قاتیلانلار}}", "badretype": "یازدیغینیز رمزلر بیر دئییل‌لر.", + "usernameinprogress": "بو اسم ده بیر ایشلده نین آد یازدیرماق مرحله سی داها اونجه دن باشلامیشدیر.\nلطفا صبیرلی اولون.", "userexists": "یازدیغینیز آد، اؤنجه‌دن ایشده‌دیر.\nلوطفاً باشقا بیر آد سئچین.", "loginerror": "گیریش خطاسی", "createacct-error": "حساب یاراتما خطاسی", @@ -435,17 +449,19 @@ "nocookiesnew": "ایستیفاده‌چی حسابی یارادیلدی، اما سیز گیرمه‌میسینیز.\n{{SITENAME}} ایستیفاده‌چیلری گیردیرمک اوچون، کوکی‌لری ایشلدیر.\nسیزین کوکی‌لریز باغلانیب‌دیر.\nلوطفاً اونلاری آچین و سونرا یئنی ایستیفاده‌چی آدی و رمزینیزله گیریش ائدین.", "nocookieslogin": "{{SITENAME}} ایشلدنلری گیردیرمک اوچون، کوکی‌لری ایشلدیر.\nسیزین کوکی‌لریز باغلانیب‌دیر.\nلوطفا اونلاری آچین و یئنی‌دن چالیشین.", "nocookiesfornew": "قایناغینی دوغرو اولدوغونو بیلمه‌مک اوچون، ایشلدن حسابی یارادیلمادی.\nکوکی‌لرینیزین آچیق اولدوغون دان آرخایین اولوب، بو یارپاغی یئنی‌دن یوکله‌ییب، یئنی‌دن چالیشین.", + "createacct-loginerror": "ایشله دنین آد یازدیریلماسی قوتولوبدور، آنجاق سیز اتوماتیک اولاراخ ایشله دن صفحه سینه گیریش اده بیلمه دینیز. لطفا بوردان [[Special:UserLogin|manual login]] دووام ادینیز.", "noname": "گئچرلی ایستیفاده‌چی آدی وئرمه‌دینیز.", "loginsuccesstitle": "گیریلدینیز", "loginsuccess": "'''سیز ایندی {{SITENAME}} سایتینا، «$1» آدی‌له گیرمیسینیز.'''", - "nosuchuser": "«$1» آدلا ایستیفاده‌چی یوخدور.\nایستیفاده‌چی آدلاری، حرفلرین بؤیوک/کیچیک‌لیگینه حساس‌دیلار.\nیازدیغینیزا یئنی‌دن باخین، یوخسا [[Special:CreateAccount|یئنی بیر حساب آچین]].", + "nosuchuser": "«$1» آدلا ایشله دن یوخدور.\nایشله دن آدلاری، حرفلرین بؤیوک/کیچیک‌لیگینه حساس‌دیلار.\nیازدیغینیزا یئنی‌دن باخین، یوخسا [[Special:CreateAccount|یئنی بیر حساب آچین]].", "nosuchusershort": "\"$1\" آدلا ایستیفاده‌چی یوخدور.\nدوزگون یازدیغینیزدان آرخایین اولون.", "nouserspecified": "بیر ایستیفاده‌چی آدی وئرمه‌لیسینیز.", "login-userblocked": "بو ایستیفاده چی باغلانیب‌دیر. گیریشه ایجازه یوخدور.", - "wrongpassword": "غلط رمز وئریلدی.\nیئنی‌دن یازین.", + "wrongpassword": "غلط ایشله دن آد یا دا گیریش رمزی وئریلدی.\nیئنی‌دن یازین.", "wrongpasswordempty": "بوش رمز وئردینیز.\nیئنی‌دن یازین.", "passwordtooshort": "رمز، آزی {{PLURAL:$1|بیر|$1}} کاراکتئر اولمالی‌دیر.", "passwordtoolong": "رمز،سوزو چوخلوغو {{PLURAL:$1|۱ سوز|$1 سوز}} کاراکتئر اولمامالی‌دیر.", + "passwordtoopopular": "معمول ایستیفاده اولان گیریش کدلارین دان ایستفاده اده بیلمه سیز. لطفا داها زور اولان بیز گیریش کدی یازینیز.", "password-name-match": "رمزینیز ایستیفاده‌چی آدینیزلا فرق‌لی اولمالی‌دیر.", "password-login-forbidden": "بو ایستیفاده‌چی آدی و رمزی ایشلدمک، قاداغان اولوب‌دور.", "mailmypassword": "یئنی رمزی ایمیل ایله گؤندر", @@ -495,7 +511,10 @@ "changepassword-throttled": "سیزین چوخ گیریش چالیشماغینیز اولوب‌دور.\nلوطفاً یئنی‌دن چالیشماق‌دان اؤنجه $1 دؤزون.", "botpasswords": "روبات رمزی", "botpasswords-disabled": "روبات پسووْردلاری ایشلدن سالینیبدیر.", + "botpasswords-existing": "وار اولان \"بات\" گیریش کدلاری", "botpasswords-createnew": "روبات رمزی یارات", + "botpasswords-editexisting": "وار اولان بیر گیریش کدی دئیشتیر", + "botpasswords-label-needsreset": "(گیریش کدونو دئیشتیرماق احتیاجی وار)", "botpasswords-label-appid": "روبات آدی:", "botpasswords-label-create": "یارات", "botpasswords-label-update": "آپدیت ائت", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index f0b219c719..0c51bfe6d7 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -376,6 +376,7 @@ "ns-specialprotected": "Немагчыма рэдагаваць спэцыяльныя старонкі.", "titleprotected": "Стварэньне старонкі з такой назвай было забароненае {{GENDER:$1|ўдзельнікам|ўдзельніцай}} [[User:$1|$1]].\nПрычына забароны: $2.", "filereadonlyerror": "Немагчыма зьмяніць файл «$1», бо файлавае сховішча «$2» знаходзіцца ў рэжыме толькі для чытаньня.\n\nСыстэмны адміністратар, які абмежаваў доступ, пазначыў прычыну: «$3».", + "invalidtitle": "Няслушная назва", "invalidtitle-knownnamespace": "Няслушны загаловак з прасторай назваў «$2» і тэкстам «$3»", "invalidtitle-unknownnamespace": "Няслушны загаловак зь невядомым нумарам прасторы назваў $1 і тэкстам «$2»", "exception-nologin": "Вы не ўвайшлі ў сыстэму", @@ -1133,12 +1134,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|аўтаматычна пацьверджаны ўдзельнік|аўтаматычна пацьверджаная ўдзельніца}}", "group-bot-member": "{{GENDER:$1|робат}}", "group-sysop-member": "{{GENDER:$1|адміністратар|адміністратарка}}", + "group-interface-admin-member": "{{GENDER:$1|адміністратар|адміністратарка}} інтэрфэйсу", "group-bureaucrat-member": "{{GENDER:$1|бюракрат|бюракратка}}", "group-suppress-member": "{{GENDER:$1|падаўляльнік|падаўляльніца}} вэрсіяў", "grouppage-user": "{{ns:project}}:Удзельнікі", "grouppage-autoconfirmed": "{{ns:project}}:Аўтаматычна пацьверджаныя ўдзельнікі", "grouppage-bot": "{{ns:project}}:Робаты", "grouppage-sysop": "{{ns:project}}:Адміністрацыя", + "grouppage-interface-admin": "{{ns:project}}:Адміністратары інтэрфэйсу", "grouppage-bureaucrat": "{{ns:project}}:Бюракраты", "grouppage-suppress": "{{ns:project}}:Падаўляльнікі_вэрсіяў", "right-read": "Прагляд старонак", @@ -1189,6 +1192,9 @@ "right-editusercss": "Рэдагаваньне CSS-файлаў іншых удзельнікаў", "right-edituserjson": "Рэдагаваньне JSON-файлаў іншых удзельнікаў", "right-edituserjs": "Рэдагаваньне JavaScript-файлаў іншых удзельнікаў", + "right-editsitecss": "Рэдагаваньне агульнасайтавага CSS", + "right-editsitejson": "Рэдагаваньне агульнасайтавага JSON", + "right-editsitejs": "Рэдагаваньне агульнасайтавага JavaScript", "right-editmyusercss": "Рэдагаваць свае карыстальніцкія CSS-файлы", "right-editmyuserjson": "Рэдагаваньне вашых уласных JSON-файлаў", "right-editmyuserjs": "Рэдагаваць свае карыстальніцкія JavaScript-файлы", @@ -1234,6 +1240,7 @@ "grant-editmycssjs": "Рэдагаваньне вашага CSS/JSON/JavaScript", "grant-editmyoptions": "Рэдагаваньне вашых наладаў удзельніка", "grant-editmywatchlist": "Рэдагаваньне вашага сьпісу назіраньня", + "grant-editsiteconfig": "Рэдагаваньне агульнасайтавага і карыстальніцкага CSS/JS", "grant-editpage": "Рэдагаваньне існых старонак", "grant-editprotected": "Рэдагаваньне абароненых старонак", "grant-highvolume": "Рэдагаваньне з высокай інтэнсіўнасьцю", @@ -1611,12 +1618,12 @@ "upload-proto-error": "Няслушны пратакол", "upload-proto-error-text": "Аддаленая загрузка файлаў патрабуе URL-адрас, які пачынаецца з http:// альбо ftp://.", "upload-file-error": "Унутраная памылка", - "upload-file-error-text": "Адбылася ўнутраная памылка пад час спробы стварыць часовы файл на сэрвэры.\nКалі ласка, зьвярніцеся да [[Special:ListUsers/sysop|адміністратара]].", + "upload-file-error-text": "Адбылася ўнутраная памылка пры стварэньні часовага файлу на сэрвэры.\nКалі ласка, зьвярніцеся да [[Special:ListUsers/sysop|адміністратара]].", "upload-misc-error": "Невядомая памылка загрузкі", - "upload-misc-error-text": "Адбылася невядомая памылка пад час загрузкі.\nКалі ласка, упэўніцеся, што URL-адрас слушны, і паспрабуйце ізноў.\nКалі памылка паўтарыцца, зьвярніцеся да [[Special:ListUsers/sysop|адміністратара]].", + "upload-misc-error-text": "Адбылася невядомая памылка падчас загрузкі.\nКалі ласка, упэўніцеся, што URL-адрас слушны, і паспрабуйце ізноў.\nКалі памылка паўторыцца, зьвярніцеся да [[Special:ListUsers/sysop|адміністратара]].", "upload-too-many-redirects": "URL-адрас утрымлівае зашмат перанакіраваньняў", "upload-http-error": "Узьнікла памылка HTTP: $1", - "upload-copy-upload-invalid-domain": "Капіяваньне загрузак не дазволенае ў гэтым дамэне.", + "upload-copy-upload-invalid-domain": "Капіяваньне загрузак не дазволенае з гэтага дамэну.", "upload-foreign-cant-upload": "Гэтая вікі не наладжаная для загрузкі файлаў у запытанае вонкавае сховішча файлаў.", "upload-foreign-cant-load-config": "Не атрымалася загрузіць канфігурацыю для загрузкі файлаў у вонкавае сховішча.", "upload-dialog-disabled": "Загрузка файлаў з дапамогай гэтага дыялёгу адключаная ў гэтай вікі.", @@ -1638,7 +1645,7 @@ "upload-form-label-infoform-date": "Дата", "upload-form-label-own-work-message-generic-local": "Я пацьвярджаю, што загружаю гэты файл згодна з правіламі і ліцэнзійнай палітыкай {{GRAMMAR:родны|{{SITENAME}}}}.", "upload-form-label-not-own-work-message-generic-local": "Калі вы ня можаце загрузіць файл у адпаведнасьці з правіламі {{GRAMMAR:родны|{{SITENAME}}}}, калі ласка, закрыйце гэтае акно і паспрабуйце іншы мэтад.", - "upload-form-label-not-own-work-local-generic-local": "Вы таксама можаце паспрабаваць [[Special:Upload|старонку загрузкі па змоўчаньні]].", + "upload-form-label-not-own-work-local-generic-local": "Вы таксама можаце паспрабаваць [[Special:Upload|стандартную старонку загрузкі]].", "upload-form-label-own-work-message-generic-foreign": "Я разумею, што загружаю гэты файл у агульнае сховішча. Я пацьвярджаю, што раблю гэта ў адпаведнасьці з умовамі выкарыстаньня і ліцэнзійнай палітыкай.", "upload-form-label-not-own-work-message-generic-foreign": "Калі вы ня можаце загрузіць гэты файл паводле правілаў агульнага сховішча, калі ласка, закрыйце гэты дыялёг і паспрабуйце іншы мэтад.", "upload-form-label-not-own-work-local-generic-foreign": "Вы можаце паспрабаваць скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі гэты файл можна туды загрузіць згодна з правіламі.", @@ -1774,9 +1781,9 @@ "filehist-filesize": "Памер файла", "filehist-comment": "Камэнтар", "imagelinks": "Выкарыстаньне файла", - "linkstoimage": "{{PLURAL:$1|1=Наступная старонка спасылаецца|Наступныя старонкі спасылаюцца}} на гэты файл:", - "linkstoimage-more": "Больш чым $1 {{PLURAL:$1|старонка спасылаецца|старонкі спасылаюцца|старонак спасылаюцца}} на гэты файл.\nУ гэтым сьпісе толькі $1 {{PLURAL:$1|спасылка|спасылкі|спасылак}} на гэты файл.\nДаступны таксама [[Special:WhatLinksHere/$2|поўны сьпіс]].", - "nolinkstoimage": "Ніводная старонка не спасылаецца на гэты файл.", + "linkstoimage": "{{PLURAL:$1|1=Наступная старонка выкарыстоўвае|Наступныя старонкі выкарыстоўваюць}} гэты файл:", + "linkstoimage-more": "Больш чым $1 {{PLURAL:$1|старонка выкарыстоўвае|старонкі выкарыстоўваюць|старонак выкарыстоўваюць}} гэты файл.\nУ гэтым сьпісе толькі $1 {{PLURAL:$1|старонка, якая выкарыстоўвае|старонкі, якія выкарыстоўваюць|старонак, якія выкарыстоўваюць}} гэты файл.\nДаступны таксама [[Special:WhatLinksHere/$2|поўны сьпіс]].", + "nolinkstoimage": "Ніводная старонка не выкарыстоўвае гэты файл.", "morelinkstoimage": "Паказаць [[Special:WhatLinksHere/$1|болей спасылак]] на гэты файл.", "linkstoimage-redirect": "$1 (перанакіраваньне на файл) $2", "duplicatesoffile": "{{PLURAL:$1|1=Наступны файл дублюе|Наступныя файлы дублююць}} гэты файл ([[Special:FileDuplicateSearch/$2|падрабязнасьці]]):", @@ -2053,7 +2060,7 @@ "cachedspecial-refresh-now": "Пабачыць апошнюю вэрсію.", "categories": "Катэгорыі", "categories-submit": "Паказаць", - "categoriespagetext": "{{PLURAL:$1|1=Наступная катэгорыя зьмяшчае|Наступныя катэгорыі зьмяшчаюць}} старонкі альбо мэдыяфайлы.\nТут не паказаныя [[Special:UnusedCategories|катэгорыі, якія не выкарыстоўваюцца]].\nГлядзіце таксама [[Special:WantedCategories|сьпіс запатрабаваных катэгорыяў]].", + "categoriespagetext": "{{PLURAL:$1|1=Наступная катэгорыя існуе ў вікі і можа|Наступныя катэгорыі існуюць у вікі і могуць}} выкарыстоўвацца ці не выкарыстоўвацца.\nГлядзіце таксама [[Special:WantedCategories|сьпіс запатрабаваных катэгорыяў]].", "categoriesfrom": "Паказаць катэгорыі, пачынаючы з:", "deletedcontributions": "Выдалены ўнёсак удзельніка", "deletedcontributions-title": "Выдалены ўнёсак удзельніка", @@ -4018,6 +4025,7 @@ "edit-error-long": "Памылкі:\n\n$1", "revid": "вэрсія $1", "pageid": "Ідэнтыфікатар старонкі $1", + "interfaceadmin-info": "$1\n\nДазволы на рэдагаваньне агульнасайтавых CSS/JS/JSON-файлаў былі нядаўна вылучаныя з права editinterface. Калі вы не разумееце, чаму атрымліваеце гэтую памылку, глядзіце [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "<html>-тэгі ня могуць быць выкарыстаныя па-за звычайнымі старонкамі.", "gotointerwiki": "Пакідаем {{grammar:вінавальны|{{SITENAME}}}}", "gotointerwiki-invalid": "Пазначаная назва зьяўляецца няслушнай.", @@ -4038,5 +4046,6 @@ "passwordpolicies-policy-passwordcannotmatchusername": "Пароль ня можа супадаць зь імем ўдзельніка", "passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль ня можа супадаць з паролямі з чорнага сьпісу", "passwordpolicies-policy-maximalpasswordlength": "Пароль мусіць быць даўжынёй менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}", - "passwordpolicies-policy-passwordcannotbepopular": "Пароль ня можа {{PLURAL:$1|супадаць з самым папулярным паролем|быць зь сьпісу $1 папулярных пароляў}}" + "passwordpolicies-policy-passwordcannotbepopular": "Пароль ня можа {{PLURAL:$1|супадаць з самым папулярным паролем|быць зь сьпісу $1 папулярных пароляў}}", + "easydeflate-invaliddeflate": "Пададзены зьмест ня сьціснуты адпаведным чынам" } diff --git a/languages/i18n/bg.json b/languages/i18n/bg.json index 505af107a9..3e02cea81e 100644 --- a/languages/i18n/bg.json +++ b/languages/i18n/bg.json @@ -1165,7 +1165,7 @@ "right-block": "Спиране на достъпа до редактиране", "right-blockemail": "Блокиране на потребители да изпращат писма по е-поща", "right-hideuser": "Блокиране и скриване на потребителско име", - "right-ipblock-exempt": "Пренебрегване на блокирания по IP blocks, автоматични блокирания и блокирани IP интервали", + "right-ipblock-exempt": "Пренебрегване на блокирания по IP, автоматични блокирания и блокирани IP интервали", "right-unblockself": "Собствено отблокиране", "right-protect": "Променяне на нивото на защита и редактиране на каскадно-защитените страници", "right-editprotected": "Редактиране на страници защитени като „{{int:protect-level-sysop}}“", @@ -1910,6 +1910,9 @@ "speciallogtitlelabel": "Цел (заглавие или {{ns:user}}:потребителско име за потребител):", "log": "Дневници", "logeventslist-submit": "Показване", + "logeventslist-more-filters": "Показване на още дневници:", + "logeventslist-patrol-log": "Дневник на патрула", + "logeventslist-tag-log": "Дневник на етикетите", "all-logs-page": "Всички публични дневници", "alllogstext": "Смесено показване на записи от всички налични дневници в {{SITENAME}}.\nМожете да ограничите прегледа, като изберете вид на дневника, потребителско име или определена страница.", "logempty": "Дневникът не съдържа записи, отговарящи на избрания критерий.", diff --git a/languages/i18n/bn.json b/languages/i18n/bn.json index f07c2c3602..2e7eb737dd 100644 --- a/languages/i18n/bn.json +++ b/languages/i18n/bn.json @@ -1951,7 +1951,7 @@ "protectedpages-timestamp": "সময়বার্তা", "protectedpages-page": "পাতা", "protectedpages-expiry": "মেয়াদোত্তীর্ণ হবে", - "protectedpages-performer": "ব্যবহারকারীকে সুরক্ষিত করা হচ্ছে", + "protectedpages-performer": "সুরক্ষা যোগ করেছেন", "protectedpages-params": "সুরক্ষা প্যারামিটার", "protectedpages-reason": "কারণ", "protectedpages-submit": "পাতা প্রদর্শন করুন", @@ -2039,7 +2039,7 @@ "magiclink-tracking-isbn": "আইএসবিএন জাদু সংযোগ ব্যবহার করা পাতা", "magiclink-tracking-isbn-desc": "এই পাতাটি আইএসবিএন যাদু সংযোগ ব্যবহার করে। কিভাবে মাইগ্রেট করবেন জানতে [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] দেখুন।", "specialloguserlabel": "সম্পাদক:", - "speciallogtitlelabel": "লক্ষ্য (ব্যবহারকারীর জন্য শিরোনাম বা {{ns:user}}:ব্যবহারকারী নাম):", + "speciallogtitlelabel": "লক্ষ্য (পাতার নাম বা {{ns:user}}:ব্যবহারকারী নাম):", "log": "লগগুলি", "logeventslist-submit": "দেখাও", "logeventslist-more-filters": "অতিরিক্ত লগ দেখান:", @@ -2315,7 +2315,7 @@ "protect-cascadeon": "এই পাতাটি বর্তমানে সুরক্ষিত আছে, কারণ পাতাটি নিচের {{PLURAL:$1|পাতায়|পাতাগুলিতে}} অন্তর্ভুক্ত, {{PLURAL:$1|যাতে|যেগুলিতে}} প্রপাতাকার সুরক্ষা চালু আছে। আপনি এই পাতাটির সুরক্ষা স্তর পরিবর্তন করতে পারেন, তবে এটি প্রপাতাকার সুরক্ষাটিতে কোন পরিবর্তন সাধন করবে না।", "protect-default": "সমস্ত ব্যবহারকারীর জন্য", "protect-fallback": "\"$1\" অধিকার রয়েছে এমন ব্যবহারকারীদের জন্য অনুমতি", - "protect-level-autoconfirmed": "শুধুমাত্র স্বয়ং পরীক্ষিত ব্যবহারকারীদের জন্য", + "protect-level-autoconfirmed": "শুধুমাত্র স্বয়ংনিশ্চিতকৃত ব্যবহারকারীদের জন্য", "protect-level-sysop": "কেবল প্রশাসকদের জন্য অনুমতি", "protect-summary-cascade": "প্রপাতাকার", "protect-expiring": "মেয়াদোত্তীর্ণ হবার তারিখ $1 (ইউটিসি)", @@ -3779,7 +3779,7 @@ "logentry-patrol-patrol": "$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন", "logentry-patrol-patrol-auto": "$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন", "logentry-newusers-newusers": "$1 ব্যবহারকারী অ্যাকাউন্টটি {{GENDER:$2|তৈরি করা}} হয়েছে", - "logentry-newusers-create": "ব্যবহারকারী অ্যাকাউন্ট $1 {{GENDER:$2|তৈরী করা}} হয়েছে", + "logentry-newusers-create": "ব্যবহারকারী অ্যাকাউন্ট $1 {{GENDER:$2|তৈরি করা}} হয়েছে", "logentry-newusers-create2": "$1 ব্যবহারকারী $3 নামের অ্যাকাউন্টটি {{GENDER:$2|তৈরী}} করেছেন", "logentry-newusers-byemail": "$1, $3 ব্যবহারকরী অ্যাকাউন্টটি {{GENDER:$2|তৈরী করেছেন}} এবং পাসওয়ার্ড ইমেইলের মাধ্যমে পাঠানো হয়েছে", "logentry-newusers-autocreate": "$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে {{GENDER:$2|তৈরি}} হয়েছে", diff --git a/languages/i18n/ca.json b/languages/i18n/ca.json index 38f6b80ec2..e9577e115a 100644 --- a/languages/i18n/ca.json +++ b/languages/i18n/ca.json @@ -421,6 +421,7 @@ "ns-specialprotected": "No es poden modificar les pàgines especials.", "titleprotected": "La creació d'aquesta pàgina està protegida per [[User:$1|$1]].\nEls seus motius han estat: $2.", "filereadonlyerror": "No s'ha pogut modificar el fitxer «$1» perquè el repositori de fitxers «$2» està en mode només de lectura.\nL'administrador de sistema que l'ha blocat ha donat aquesta explicació: «$3».", + "invalidtitle": "Títol no vàlid", "invalidtitle-knownnamespace": "El títol amb l'espai de noms «$2» i text «$3» no és vàlid", "invalidtitle-unknownnamespace": "Títol no vàlid amb espai de noms desconegut de número «$1» i text «$2»", "exception-nologin": "No has iniciat sessió", @@ -1188,7 +1189,7 @@ "grouppage-bureaucrat": "{{ns:project}}:Buròcrates", "grouppage-suppress": "{{ns:project}}:Supressors de Flow", "right-read": "Llegir pàgines", - "right-edit": "Modificar pàgines", + "right-edit": "Modifica les pàgines", "right-createpage": "Crear pàgines (que no són de discussió)", "right-createtalk": "Crear pàgines de discussió", "right-createaccount": "Crear nous comptes", @@ -1389,6 +1390,7 @@ "rcfilters-savedqueries-defaultlabel": "Filtres desats", "rcfilters-savedqueries-rename": "Reanomena", "rcfilters-savedqueries-setdefault": "Defineix per defecte", + "rcfilters-savedqueries-unsetdefault": "Suprimeix per defecte", "rcfilters-savedqueries-remove": "Suprimeix", "rcfilters-savedqueries-new-name-label": "Nom", "rcfilters-savedqueries-new-name-placeholder": "Descriviu el propòsit del filtre", @@ -2032,7 +2034,8 @@ "speciallogtitlelabel": "Objectiu (títol o «{{ns:user}}:nom d’usuari» per a un usuari):", "log": "Registres", "logeventslist-submit": "Mostra", - "logeventslist-more-filters": "Més filtres:", + "logeventslist-more-filters": "Mostra els registres addicionals:", + "logeventslist-patrol-log": "Registre de patrulla", "logeventslist-tag-log": "Registre d'etiquetes", "all-logs-page": "Tots els registres públics", "alllogstext": "Presentació combinada de tots els registres disponibles de {{SITENAME}}.\nPodeu reduir l'extensió seleccionant el tipus de registre, el nom d'usuari realitzador (distingeix entre majúscules i minúscules), o la pàgina objectiu (també en distingeix).", diff --git a/languages/i18n/cdo.json b/languages/i18n/cdo.json index 251688906b..4f58d1982d 100644 --- a/languages/i18n/cdo.json +++ b/languages/i18n/cdo.json @@ -154,7 +154,7 @@ "cancel": "取消", "moredotdotdot": "固価...", "morenotlisted": "茲萆單單𣍐完整", - "mypage": "Nguāi gì hiĕk-miêng", + "mypage": "hiĕk-miêng", "mytalk": "我其討論", "anontalk": "攀講", "navigation": "Dô̤-hòng", @@ -499,7 +499,7 @@ "newarticle": "(新)", "newarticletext": "汝已經跟鏈接跟遘無存在其頁面了。\n卜想創建頁面,敆下底其框框𡅏拍字(覷蜀覷[$1 幫助頁面]有無更更価其幫助)。\n如果汝是無注意來遘茲蜀萆頁面,篤囇汝其瀏覽器上其「返回」按鈕。", "anontalkpagetext": "茲是未登錄其用戶討論頁面。\n故此儂家著使數字IP來確定伊。\n總款其IP地址會乞雅価用戶共享。\n如果蜀隻未登錄其用戶見覺無關係其評論指向汝,起動[[Special:CreateAccount|開賬戶]]或者[[Special:UserLogin|登錄]]來避免以後共其它未登錄其用戶混蜀堆。", - "noarticletext": "現在敆茲蜀頁𡅏無文字。汝會使敆其它其頁面𡅏[[Special:Search/{{PAGENAME}}|討蜀討茲蜀萆標題]],[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 討相關其記錄],或者[{{fullurl:{{FULLPAGENAME}}|action=edit}}創建茲蜀頁]。", + "noarticletext": "現在敆茲蜀頁𡅏無文字。汝會使敆其它其頁面𡅏[[Special:Search/{{PAGENAME}}|討蜀討茲蜀萆標題]],[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 討相關其記錄],或者[{{fullurl:{{FULLPAGENAME}}|action=edit}} 創建茲蜀頁]。", "clearyourcache": "'''注意:'''保存以後,汝可能固著刷新汝其瀏覽器緩存來看遘變化。\n* '''火狐/Safari:'''擪下''Shift''篤蜀篤''重新載入'',或者擪蜀擪''Ctrl+F5''或者''Ctrl+R'' (''⌘-R''敆Mac懸頂)\n* '''Google Chrome:'''擪''Ctrl+Shift+R''(敆Mac𡅏使''⌘-Shift-R'')\n* '''Internet Explorer:'''擪''Ctrl''其時候篤蜀篤''刷新'',或者擪''Ctrl+F5''\n* '''Opera:'''敆''工具→首選項''𡅏清除緩存", "note": "注意:", "previewnote": "'''記定茲若是蜀萆預覽。'''\n汝其改變固𡅏未保存!", diff --git a/languages/i18n/ce.json b/languages/i18n/ce.json index 2913625ff2..a74dd08b02 100644 --- a/languages/i18n/ce.json +++ b/languages/i18n/ce.json @@ -814,6 +814,7 @@ "diff-multi-sameuser": "(ца {{PLURAL:$1|гайтина юккъера цхьа верси|гайтина юккъера цхьа версеш}} оьцу декъашхочун)", "diff-multi-otherusers": "(ца {{PLURAL:$1|гайтина юккъера верси|гайтина юккъера версеш}} {{PLURAL:$2|кхин цхьан декъашхочун|$2 декъашхойн}})", "diff-multi-manyusers": "({{PLURAL:$1|гайтина яц $1 юккъера верси, йина|гайтина яц $1 юккъера версеш, йина}} {{PLURAL:$2|$2 декъашхочо|$2 декъашхоша}})", + "difference-missing-revision": "{{PLURAL:$2|Цакарий}} {{PLURAL:$2|$2 верси}} ($1) дустарна.\n\nИштта хуьлу хьажорг шира хилча, дӀаяьккхина йолу.\nМадарра хила мега [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дӀадаьхнарш долу тéптар] чохь.", "searchresults": "Карийнарш", "searchresults-title": "Лахар «$1»", "titlematches": "АгӀонийн цӀерш цхьаьнанисялар", @@ -1009,12 +1010,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|автотӀелаьцна декъашхо}}", "group-bot-member": "{{GENDER:$1|бот}}", "group-sysop-member": "{{GENDER:$1|куьйгалхо}}", + "group-interface-admin-member": "{{GENDER:$1|интерфейсан куьйгалхой}}", "group-bureaucrat-member": "{{GENDER:$1|бюрократхо}}", "group-suppress-member": "{{GENDER:$1|ревизор}}", "grouppage-user": "{{ns:project}}:Декъашхой", "grouppage-autoconfirmed": "{{ns:project}}:АвтотӀелаьцна декъашхой", "grouppage-bot": "{{ns:project}}:Боташ", "grouppage-sysop": "{{ns:project}}:Куьйгалхой", + "grouppage-interface-admin": "{{ns:project}}:Интерфейсан куьйгалхой", "grouppage-bureaucrat": "{{ns:project}}:Бюрократаш", "grouppage-suppress": "{{ns:project}}:Ревизораш", "right-read": "агӀонашка хьажар", @@ -1630,6 +1633,7 @@ "protectedtitles-submit": "Гайта кортош", "listusers": "Декъашхойн могӀам", "listusers-editsonly": "Цхаъ мукъане а хийцам бина декъашхой гайта", + "listusers-temporarygroupsonly": "Декъашхойн тобана, ханна юкъа тоьхна декъашхой гайта", "listusers-creationsort": "Кхоьллина хене хьаьжжина нисъяр", "listusers-desc": "Харжа кӀезиг хиларца", "usereditcount": "$1 {{PLURAL:$1|нисдар|нисдарш}}", diff --git a/languages/i18n/ckb.json b/languages/i18n/ckb.json index 1e849138fc..8e2621e34f 100644 --- a/languages/i18n/ckb.json +++ b/languages/i18n/ckb.json @@ -745,7 +745,7 @@ "revdelete-text-file": "وەشانە سڕاوەکانی پەڕگە ھێشتا لە مێژووی پەڕگەدا دەردەکەوێت بەڵام بەشێک لە ناوەرۆکەکەیان بۆ ھەمووان لەبەر دەست دەبێت.", "logdelete-text": "ڕووداوە سڕاوەکانی لۆگ ھێشتا لە لۆگەکاندا دەردەکەوێت بەڵام بەشێک لە ناوەرۆکەکەیان بۆ ھەمووان لەبەر دەست دەبێت.", "revdelete-text-others": "بەڕێوەبەرانی تر ھێشتا دەتوانن ناوەرۆکی شاردراو ببینن و بیھێننەوە، مەگەر سنووردارکردنی تر ڕێک بخرێت.", - "revdelete-confirm": "تکایە پشتڕاست بکەوە دەتەوێ ئەمە بکەیت و لە ئاکامەکەی ئاگاداریت و ئەمە بە پێی [[{{MediaWiki:Policy-url}}|سیاسەتنامە]] دەکەیت.", + "revdelete-confirm": "تکایە پشتڕاست بکەوە دەتەوێ ئەمە بکەیت و لە ئاکامەکەی ئاگاداریت و ئەمە بە پێی [[{{MediaWiki:Policy-url}}|سیاسەتەکان و ڕێساکان]] دەکەیت.", "revdelete-suppress-text": "بەرگری دەبێ تەنها بۆ ئەم بابەتانە بەکاربهێندرێت:\n* سووکایەتیکردن بە کەسایەتییەک
    \n* بڵاوکردنەوەی زانیاریی تاکەکەسی نەگونجاو
    \n*: ناونیشانی ماڵ یا ژمارە تەلەفۆن و وەک ئەمانە.", "revdelete-legend": "ڕێکخستنی سنووردارکردنی دیاریکردن", "revdelete-hide-text": "دەقی پێداچوونەوە", @@ -772,7 +772,7 @@ "revdelete-show-no-access": "هەڵە لە نیشان‌دانی بابەتی ڕیکەوتی $1، کات $2: ئەم بابەتە وەک \"بەرگیراو\"‌ نیشانکراوە.\nدەسەڵاتی دەستپێگەیشتنی ئەوەت نیە.", "revdelete-modify-no-access": "هەڵە لە چاکسازی بابەتی ڕیکەوتی $1، کات $2: ئەم بابەتە وەک \"بەرگیراو\"‌ نیشان‌ کراوە.\nدەسەڵاتی دەستپێگەیشتنی ئەوەت نیە.", "revdelete-modify-missing": "هەڵە لە چاکسازی بابەت خاوەن پێناسەی $1: لە بنکەدراو ون بووە !", - "revdelete-no-change": "'''ئاگاداری:''' بابەتی ڕێکەوتی $2، کات $1، لە پێش‌دا خاوەن داخوازی هەلبژاردەکانی بیندرانە.", + "revdelete-no-change": "'''ئاگاداری:''' بابەتی ڕێکەوتی $2، کات $1، خاوەن داخوازی هەلبژاردەکانی بیندرانە.", "revdelete-concurrent-change": "هەڵە لە چاکسازی بابەتی ڕێکەوتی $2 کات $1: لەوانەیە کاتێ تۆ هەوڵی چاکسازیت ئەدا، کەسێکی‌تر دۆخەکەی گۆڕابێت.\nتکایە چاو لە لۆگەکەی بکە.", "revdelete-only-restricted": "ھەڵە لە شاردنەوەی بابەتی ڕێکەوتی $2ی $1: ناتوانی لە بینینی بابەتەکان لە لایەن بەڕێوبەرانەوە بەرگری بکەیت، مەگەر یەکێکی تر لە ھەڵبژاردەکانی بەرچاوکەوتن ھەڵبژێریت.", "revdelete-reason-dropdown": "*ھۆکارە باوەکانی سڕینەوە\n** لادان لە مافی لەبەرگرتنەوە\n** بۆچوون یان زانیاریی تاکەکەسیی نەشیاو\n** ناوی بەکارھێنەریی نەشیاو\n** زانیارییەک کە دەتوانێ بوختاناوی بێت", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index 7e824a6478..207ced90a6 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -400,6 +400,7 @@ "ns-specialprotected": "Stránky ve jmenném prostoru {{ns:special}} nelze editovat.", "titleprotected": "Stránku s tímto názvem nelze založit, protože název {{GENDER:$1|zamkl|zamkla|zamkl uživatel}} [[User:$1|$1]].\nUdaným důvodem bylo $2.", "filereadonlyerror": "Nelze změnit soubor „$1“, protože úložiÅ¡tě souborů „$2“ je pouze pro čtení.\n\nSprávce serveru, který úložiÅ¡tě zamkl, poskytl toto zdůvodnění: „$3“.", + "invalidtitle": "Neplatný název", "invalidtitle-knownnamespace": "Neplatný název se jmenným prostorem „$2“ a textem „$3“", "invalidtitle-unknownnamespace": "Neplatný název s neznámým číslem jmenného prostoru $1 a textem „$2“", "exception-nologin": "Nejste přihlášen(a)", @@ -1217,9 +1218,9 @@ "right-editusercss": "Editace CSS souborů jiných uživatelů", "right-edituserjson": "Editace souborů s JSONem jiných uživatelů", "right-edituserjs": "Editace JavaScriptových souborů jiných uživatelů", - "right-editsitecss": "Editovat celoprojektové CSS", - "right-editsitejson": "Editovat celoprojektový JSON", - "right-editsitejs": "Editovat celoprojektový JavaScript", + "right-editsitecss": "Editace celoprojektového CSS", + "right-editsitejson": "Editace celoprojektového JSONu", + "right-editsitejs": "Editace celoprojektového JavaScriptu", "right-editmyusercss": "Editace vlastních uživatelských CSS souborů", "right-editmyuserjson": "Editace vlastních uživatelských souborů s JSONem", "right-editmyuserjs": "Editace vlastních uživatelských JavaScriptových souborů", @@ -1803,9 +1804,9 @@ "filehist-filesize": "Velikost souboru", "filehist-comment": "Komentář", "imagelinks": "Využití souboru", - "linkstoimage": "Na soubor {{PLURAL:$1|odkazuje tato stránka|odkazují tyto $1 stránky|odkazuje těchto $1 stránek}}:", - "linkstoimage-more": "Na tento soubor {{PLURAL:$1|odkazuje více stránek|odkazují více než $1 stránky|odkazuje více než $1 stránek}}.\nNásledující seznam zobrazuje pouze {{PLURAL:$1|tu první|první $1|prvních $1}}.\nMůžete si prohlédnout [[Special:WhatLinksHere/$2|úplný seznam]].", - "nolinkstoimage": "Na tento soubor neodkazuje žádná stránka.", + "linkstoimage": "Tento soubor {{PLURAL:$1|používá následující stránka|používají následující $1 stránky|používá následujících $1 stránek}}:", + "linkstoimage-more": "Tento soubor {{PLURAL:$1|používá více stránek|používají více než $1 stránky|používá více než $1 stránek}}.\nNásledující seznam zobrazuje pouze {{PLURAL:$1|tu první|první $1|prvních $1}}.\nMůžete si prohlédnout [[Special:WhatLinksHere/$2|úplný seznam]].", + "nolinkstoimage": "Tento soubor nepoužívá žádná stránka.", "morelinkstoimage": "Zobrazit [[Special:WhatLinksHere/$1|další odkazy]] na tento soubor.", "linkstoimage-redirect": "$1 (přesměrování) $2", "duplicatesoffile": "{{PLURAL:$1|Následující soubor je duplikát|Následující $1 soubory jsou duplikáty|Následujících $1 souborů jsou duplikáty}} tohoto souboru ([[Special:FileDuplicateSearch/$2|podrobnosti]]):", @@ -2081,7 +2082,7 @@ "cachedspecial-refresh-now": "Zobrazit nejnovější.", "categories": "Kategorie", "categories-submit": "Zobrazit", - "categoriespagetext": "Následující kategorie {{PLURAL:$1|obsahuje|obsahují}} stránky nebo soubory.\nNezobrazují se tu [[Special:UnusedCategories|nepoužívané kategorie]].\nPodívejte se také na [[Special:WantedCategories|žádané kategorie]].", + "categoriespagetext": "Na této wiki {{PLURAL:$1|existuje|existují}} následující kategorie, {{PLURAL:$1|která může i nemusí být použitá|které mohou i nemusejí být použité}}.\nPodívejte se také na [[Special:WantedCategories|žádané kategorie]].", "categoriesfrom": "Zobrazit kategorie počínaje od:", "deletedcontributions": "Smazané editace uživatele", "deletedcontributions-title": "Smazané editace uživatele", diff --git a/languages/i18n/cv.json b/languages/i18n/cv.json index 3a3478c11f..fc87478fce 100644 --- a/languages/i18n/cv.json +++ b/languages/i18n/cv.json @@ -277,6 +277,7 @@ "yourname": "Усă куракан ят:", "userlogin-yourname": "Усă куракан ят", "yourpassword": "Вăрттăн сăмах:", + "userlogin-yourpassword": "Пароль", "yourpasswordagain": "Вăрттăн сăмах тепре çырăр:", "yourdomainname": "Сирĕн доменă:", "login": "Кĕрĕр", @@ -370,6 +371,7 @@ "accmailtext": "$1 вăрттăн сăмахне кунта леçрĕмĕр: $2.", "newarticle": "(Çĕнни)", "newarticletext": "Ссылка урлă эсир халлĕхе çук статья çине куçрăр.\nÇĕнĕ статьяна кĕртес тесен аяларах вырнаçнă чӳречере текста çырăр.\n(тĕплĕнрех пĕлес тесен [$1 пулăшу страниципе] паллашăр).\nЕнчен те эсир кунта йăнăшпа лекнĕ пулсан — сирĕн браузерăн Каялла кнопка çине пусăр.", + "userpage-userdoesnotexist-view": "\"$1\" аккаунтне туман.", "usercsspreview": "'''Ан манăр, эсир сирĕн css файл епле пулассине çеç куратăр, ăна халлĕхе çырса хуман!'''", "userjspreview": "'''Астăвăр, ку сирĕн javascript-файлăн малтанхи курăмĕ кăна, ăна хальлĕхе çырса хуман!'''", "updated": "(Çĕнелнĕ)", @@ -392,6 +394,7 @@ "templatesusedsection": "Ку пайĕнче усă куракан {{PLURAL:$1|шаблон|шаблонсем}}:", "template-protected": "(сыхланă)", "template-semiprotected": "(пĕр пайне сыхланă)", + "content-model-wikitext": "викитекст", "expensive-parserfunction-category": "Кунта эсир чылай ресурс ыйтакан функцисемпе нумай ĕçлекен страницăсене куратăр", "post-expand-template-argument-category": "Шаблон аргуменчĕсене сиктерсе хăварнă страницăсем", "undo-norev": "Ку тӳрлетĕве пăрахăçлама май çук — вăл е пулман та, е ăна кăларса пăрахнă.", @@ -433,6 +436,7 @@ "suppressionlog": "Пытару журналĕ", "history-title": "\"$1\" улшăннисен историйĕ", "lineno": "$1-мĕш йĕрке:", + "compareselectedversions": "Суйланă версисене танлаштар", "editundo": "унчченхи", "searchresults": "Шыранă результачĕсем", "searchresults-title": "\"$1\" шыраса тупни", @@ -718,6 +722,7 @@ "notargettitle": "Тĕллевне кăтартман", "pager-newer-n": "{{PLURAL:$1|çĕнĕреххисене 1|$1 çĕнĕреххисене}}", "pager-older-n": "{{PLURAL:$1|кивĕреххисене 1|$1 кивĕреххисене}}", + "apihelp-no-such-module": "\"$1\" модульĕ тупăнмарĕ.", "booksources": "Кĕнекесен çăлкуçĕсем", "booksources-search": "Туп", "specialloguserlabel": "Хутшăнакан:", @@ -804,6 +809,7 @@ "protect-level-sysop": "Администраторсене кăна юрать", "pagesize": "(байт)", "restriction-edit": "Тӳрлет", + "restriction-move": "Ятне улăштарни", "undelete": "Кăларса пăрахнă страницăсене пăх", "viewdeletedpage": "Кăларса пăрахнă страницăсене пăх", "undeleterevisions": "$1 {{PLURAL:$1|верси|версисене}} пăса утнă", @@ -819,6 +825,7 @@ "mycontris": "Хушни", "anoncontribs": "Хушни", "contribsub2": "{{GENDER:$3|$1}} валли ($2)", + "contributions-userdoesnotexist": "\"$1\" аккаунтне туман.", "uctop": "(хальхи)", "month": "Уйăхран (маларах та):", "year": "Çултан (маларах та):", @@ -862,7 +869,8 @@ "block-log-flags-anononly": "анонимлă хутшăнакансем кăна", "block-log-flags-nocreate": "хутшăнакансене регистрациленме чарнă", "block-log-flags-noemail": "çыру яма чарнă", - "move-page-legend": "Страницăна куçарнă", + "move-page": "$1 ятне улăштарни", + "move-page-legend": "Страницăна куçарни", "newtitle": "Çĕнĕ ят", "move-watch": "Ку страницăна сăнамаллисем шутне хуш", "movepagebtn": "Страницăн ятне улăштар", @@ -885,7 +893,7 @@ "allmessages-filter-submit": "Куç", "allmessages-filter-translate": "Куçар", "thumbnail-more": "Пысăклатмалли", - "filemissing": "Файл тупăнмарĕ", + "filemissing": "Файлĕ тупăнмарĕ", "thumbnail_error": "Пĕчĕк ӳкерчĕке тăваймарăмăр: $1", "thumbnail_invalid_params": "Пĕчĕк ӳкерчĕкĕн параметрĕ йăнăш", "import": "Страницăсене импортласси", @@ -1014,6 +1022,7 @@ "fileduplicatesearch": "Пĕр пек файлсен шыравĕ", "fileduplicatesearch-filename": "Файл ячĕ:", "fileduplicatesearch-submit": "Туп", + "fileduplicatesearch-noresults": "\"$1\" ятлă файл тупăнмарĕ.", "specialpages": "Ятарлă страницăсем", "specialpages-group-maintenance": "Техника обслуживанийĕн отчечĕсем", "specialpages-group-other": "Ытти ятарлă страницăсем", @@ -1022,6 +1031,7 @@ "specialpages-group-media": "Медиа-материалсемпе тултарăшсем", "specialpages-group-users": "Хутшăнакансем тата правасем", "specialpages-group-highuse": "Нумай усă куракан страницăсем", + "tag-filter": "[[Special:Tags|Тегсен]] фильтрĕ:", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Тег|Тегсем}}]]: $2)", "tags-title": "Тегсем", "compare-submit": "Танлаштар", @@ -1038,5 +1048,6 @@ "pagelang-select-lang": "Чĕлхе суйлăр", "mediastatistics-header-audio": "Аудио", "mediastatistics-header-video": "Видеосем", - "special-characters-group-symbols": "Символсем" + "special-characters-group-symbols": "Символсем", + "authmanager-userdoesnotexist": "\"$1\" аккаунтне туман." } diff --git a/languages/i18n/da.json b/languages/i18n/da.json index ef2234cc4b..43af650d9a 100644 --- a/languages/i18n/da.json +++ b/languages/i18n/da.json @@ -415,13 +415,18 @@ "namespaceprotected": "Du har ikke rettigheder til at redigere sider i $1-navnerummet.", "customcssprotected": "Du har ikke tilladelse til at redigere denne CSS-side, da den indeholder en anden brugers personlige indstillinger.", "customjsprotected": "Du har ikke tilladelse til at redigere denne JavaScript-side, da den indeholder en anden brugers personlige indstillinger.", + "sitecssprotected": "Du har ikke tilladelse til at redigere denne CSS-side fordi det kan pÃ¥virke alle besøgende", + "sitejsonprotected": "Du har ikke tilladelse til at redigere denne JSON-side fordi det kan pÃ¥virke alle besøgende", + "sitejsprotected": "Du har ikke tilladelse til at redigere denne JavaScript-side fordi det kan pÃ¥virke alle besøgende", "mycustomcssprotected": "Du har ikke rettigheder til at redigere denne CSS-side.", + "mycustomjsonprotected": "Du har ikke rettigheder til at redigere denne JSON-side.", "mycustomjsprotected": "Du har ikke rettigheder til at redigere denne JavaScript-side.", "myprivateinfoprotected": "Du har ikke rettigheder til at redigere dine private oplysninger.", "mypreferencesprotected": "Du har ikke rettigheder til at redigere dine indstillinger.", "ns-specialprotected": "Sider i navnerummet {{ns:special}} kan ikke redigeres.", "titleprotected": "Dette sidenavn er blevet beskyttet mod oprettelse af [[User:$1|$1]]. Begrundelsen for beskyttelsen er $2.", "filereadonlyerror": "Ude af stand til at redigere filen \"$1\", fordi fildatabasen \"$2\" er skrivebeskyttet.\n\nSystemadministratoren, som skrivebeskyttede den, gav denne begrundelse: \"$3\".", + "invalidtitle": "Ugyldig titel", "invalidtitle-knownnamespace": "Ugyldig titel med navnerummet \"$2\" og teksten \"$3\"", "invalidtitle-unknownnamespace": "Ugyldig titel med ukendt navnerum nummer $1 og tekst \"$2\"", "exception-nologin": "Ikke logget pÃ¥", @@ -510,12 +515,12 @@ "wrongpasswordempty": "Du glemte at indtaste adgangskode. Prøv igen.", "passwordtooshort": "Adgangskoden skal mindst være pÃ¥ $1 {{PLURAL:$1|tegn|tegn}}.", "passwordtoolong": "Adgangskoden mÃ¥ ikke være længere end {{PLURAL:$1|et tegn|$1 tegn}}.", - "passwordtoopopular": "Almindeligt brugte adgangskoder, kan ikke bruges. Vælg venligst en mere unik adgangskode.", + "passwordtoopopular": "Almindeligt brugte adgangskoder, kan ikke bruges. Vælg venligst en adgangskode der er sværere at gætte.", "password-name-match": "Adgangskoden mÃ¥ ikke være det samme som brugernavnet.", "password-login-forbidden": "Brugen af dette brugernavn og adgangskode er blevet forbudt.", "mailmypassword": "Nulstil adgangskode", "passwordremindertitle": "Ny midlertidig adgangskode til {{SITENAME}}", - "passwordremindertext": "Nogen (sandsynligvis dig, fra IP-adressen $1)\nhar bedt om at vi sender dig en ny adgangskode til at logge pÃ¥ {{SITENAME}} ($4).\nEn midlertidig adgangskode for bruger \"$2\" er blevet lavet, den er \"$3\".\nHvis dette var din mening, skal du logge pÃ¥ og vælge en ny adgangskode nu.\nDin midlertidige adgangskode vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\n\nHvis en anden har bestilt den nye adgangskode, eller hvis du er kommet i tanke om din gamle adgangskode og ikke længere vil ændre den,\nkan du bare ignorere denne e-mail og fortsætte med at bruge din gamle adgangskode.", + "passwordremindertext": "Nogen (sandsynligvis dig, fra IP-adressen $1)\nhar bedt om at vi sender dig en ny adgangskode til at logge pÃ¥ {{SITENAME}} ($4).\nEn midlertidig adgangskode for bruger \"$2\" er blevet lavet, den er \"$3\".\nHvis dette var din mening, skal du logge pÃ¥ og vælge en ny adgangskode nu.\nDin midlertidige adgangskode vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\n\nHvis en anden har bestilt den nye adgangskode, eller hvis du er kommet i tanke om din gamle adgangskode og ikke længere vil ændre den,\nkan du bare ignorere denne besked og fortsætte med at bruge din gamle adgangskode.", "noemail": "Der er ikke oplyst en e-mailadresse for bruger \"$1\".", "noemailcreate": "Du skal angive en gyldig e-mailadresse", "passwordsent": "En ny adgangskode er sendt til e-mailadressen, som er registreret for \"$1\".\nDu bør logge pÃ¥ og ændre din adgangskode straks efter du har modtaget e-mailen.", @@ -566,6 +571,7 @@ "botpasswords-existing": "Eksisterende bot adgangskoder", "botpasswords-createnew": "Opret en ny bot adgangskode", "botpasswords-editexisting": "Redigere en eksisterende bot adgangskode", + "botpasswords-label-needsreset": "(adgangskoden skal nulstilles)", "botpasswords-label-appid": "Botnavn:", "botpasswords-label-create": "Opret", "botpasswords-label-update": "Opdatér", @@ -949,6 +955,7 @@ "diff-multi-manyusers": "({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af mere end $2 {{PLURAL:$2|bruger|brugere}} ikke vist)", "difference-missing-revision": "{{PLURAL:$2|En revision|$2 revisioner}} af denne forskel ($1) {{PLURAL:$2|blev|blev}} ikke fundet.\n\nDette skyldes normalt et forældet diff link til en side der er slettet.\nDetaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletningsloggen].", "searchresults": "Søgeresultater", + "search-filter-title-prefix-reset": "Søg i alle sider", "searchresults-title": "Søgeresultater for \"$1\"", "titlematches": "Artikeltitler der opfyldte forespørgslen", "textmatches": "Artikeltekster der opfyldte forespørgslen", @@ -1038,7 +1045,7 @@ "stub-threshold-disabled": "Deaktiveret", "recentchangesdays": "Antal dage som skal vises i seneste ændringer:", "recentchangesdays-max": "(maks. $1 {{PLURAL:$1|dag|dage}})", - "recentchangescount": "Antal redigeringer som skal vises som standard:", + "recentchangescount": "Antal redigeringer som skal vises som standard i sidste ændringer, sidehistorikker og logger:", "prefs-help-recentchangescount": "Det gælder for seneste ændringer, historikker og logger.", "prefs-help-watchlist-token2": "Dette er den hemmelige nøgle til web-feed af din overvÃ¥gningsliste.\nHvis andre kender den, vil man være i stand til at læse din overvÃ¥gningsliste, sÃ¥ del den ikke.\n[[Special:ResetTokens|Klik her]] hvis du har brug at nulstille den.", "savedprefs": "Dine indstillinger er blevet gemt.", @@ -1068,7 +1075,7 @@ "prefs-files": "Filer", "prefs-custom-css": "Personlig CSS", "prefs-custom-js": "Personlig JavaScript", - "prefs-common-config": "Fælles CSS/JS for alle udseender:", + "prefs-common-config": "Fælles CSS/JSON/JavaScript for alle udseender:", "prefs-reset-intro": "Du kan bruge denne side til at tilbagestille alle dine indstillinger til standardindstillingerne.\nDet kan ikke gøres om.", "prefs-emailconfirm-label": "Bekræftelse af e-mail:", "youremail": "Din e-mailadresse:", @@ -1100,6 +1107,7 @@ "prefs-dateformat": "Formatering af datoer", "prefs-timeoffset": "Tidsforskel", "prefs-advancedediting": "Generelle indstillinger", + "prefs-developertools": "Udviklerværktøjer", "prefs-editor": "Redigeringsprogrammet", "prefs-preview": "ForhÃ¥ndsvisning", "prefs-advancedrc": "Avancerede indstillinger", @@ -1161,7 +1169,7 @@ "grouppage-bureaucrat": "{{ns:project}}:Bureaukrater", "grouppage-suppress": "{{ns:project}}:Undertryk", "right-read": "Se sider", - "right-edit": "Redigere sider", + "right-edit": "Rediger sider", "right-createpage": "Oprette andre sider end diskussionssider", "right-createtalk": "Oprette diskussionssider", "right-createaccount": "Oprette nye brugere", @@ -1207,6 +1215,9 @@ "right-editinterface": "Ændre brugergrænsefladens tekster", "right-editusercss": "Ændre andre brugeres CSS filer", "right-edituserjs": "Ændre andre brugeres JS filer", + "right-editsitecss": "Rediger CSS for hele siden", + "right-editsitejson": "Rediger JSON for hele siden", + "right-editsitejs": "Rediger JavaScript for hele siden", "right-editmyusercss": "Redigere dine egne CSS-filer", "right-editmyuserjs": "Redigere dine egne JavaScript-filer", "right-viewmywatchlist": "Se din egen overvÃ¥gningsliste", @@ -1247,8 +1258,8 @@ "grant-createaccount": "Oprette af konti", "grant-createeditmovepage": "Oprette, redigere og flytte sider", "grant-delete": "Slette sider, revisioner og logposter", - "grant-editinterface": "Redigere MediaWiki-navnerummet og bruger-CSS/JavaScript", - "grant-editmycssjs": "Redigere din bruger-CSS/JavaScript", + "grant-editinterface": "Redigere MediaWiki-navnerummet og bruger/side JSON", + "grant-editmycssjs": "Redigere din bruger-CSS/JSON/JavaScript", "grant-editmyoptions": "Redigere dine brugerindstillinger", "grant-editmywatchlist": "Redigere din overvÃ¥gningsliste", "grant-editpage": "Redigere eksisterende sider", @@ -1370,12 +1381,12 @@ "rcfilters-restore-default-filters": "Gendan standardfiltre", "rcfilters-clear-all-filters": "Ryd alle filtre", "rcfilters-show-new-changes": "Vis seneste ændringer", - "rcfilters-search-placeholder": "Filtrer seneste ændringer (gennemse eller begynd at taste)", + "rcfilters-search-placeholder": "Filtrer ændringer (brug menuen eller eller søg pÃ¥ filternavn)", "rcfilters-invalid-filter": "Ugyldigt filter", "rcfilters-empty-filter": "Ingen aktive filtre. All bidrag vises.", "rcfilters-filterlist-title": "Filtre", "rcfilters-filterlist-whatsthis": "Hvordan virker disse?", - "rcfilters-filterlist-feedbacklink": "Fortæl os hvad du synes om disse (nye) filtreringsværktøjer", + "rcfilters-filterlist-feedbacklink": "Fortæl os hvad du synes om disse filtreringsværktøjer", "rcfilters-highlightbutton-title": "Fremhæv resultater", "rcfilters-highlightmenu-title": "Vælg en farve", "rcfilters-highlightmenu-help": "Vælg en farve for at fremhæve denne egenskab", @@ -1439,13 +1450,19 @@ "rcfilters-filter-previousrevision-label": "Ikke den seneste revision", "rcfilters-filter-previousrevision-description": "Alle ændringer som ikke er »seneste revision«.", "rcfilters-filter-excluded": "Ekskluderet", + "rcfilters-tag-prefix-namespace-inverted": ":ikke $1", + "rcfilters-exclude-button-off": "Ekskluder valgte", + "rcfilters-exclude-button-on": "Ekskluderer valgte", "rcfilters-view-tags": "Mærkede redigeringer", "rcfilters-view-namespaces-tooltip": "Filtrer resultater efter navnerum", + "rcfilters-liveupdates-button": "Live-opdateringer", + "rcfilters-liveupdates-button-title-on": "Sluk for live opdateringer", "rcfilters-liveupdates-button-title-off": "Vis nye ændringer nÃ¥r de sker", "rcfilters-watchlist-markseen-button": "Marker alle ændringer som set", "rcfilters-watchlist-edit-watchlist-button": "Rediger din liste med overvÃ¥gede sider", "rcfilters-watchlist-showupdated": "Ændringer til sider du ikke har besøgt siden ændringerne blev gjort vises med fed, med faste markører.", "rcfilters-preference-label": "Skjul den forbedrede verson af Seneste ændringer", + "rcfilters-filter-showlinkedto-label": "Vis ændringer pÃ¥ sider der linker til", "rcfilters-target-page-placeholder": "Indtast et sidenavn (eller en kategori)", "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.", "rclistfromreset": "Nulstil datovalg", @@ -1871,6 +1888,7 @@ "deadendpages": "Blindgydesider", "deadendpagestext": "De følgende sider henviser ikke til andre sider i denne wiki.", "protectedpages": "Skrivebeskyttede sider", + "protectedpages-filters": "Filtre:", "protectedpages-indef": "Kun beskyttelser pÃ¥ ubestemt tid", "protectedpages-summary": "Denne side indeholder en liste over eksisterende sider, der i øjeblikket er beskyttet. For en liste over titler, der er beskyttet fra oprettelse, se [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].", "protectedpages-cascade": "Kun nedarvende beskyttelser", @@ -1927,6 +1945,7 @@ "apisandbox-dynamic-parameters-add-placeholder": "Parameternavn", "apisandbox-dynamic-error-exists": "En parameter navngivet »$1« findes allerede.", "apisandbox-deprecated-parameters": "Forældede parametre", + "apisandbox-add-multi": "Tilføj", "apisandbox-submit-invalid-fields-title": "Nogle felter er ugyldige", "apisandbox-results": "Resultater", "apisandbox-sending-request": "Sender API-forespørgsel ...", @@ -1934,6 +1953,7 @@ "apisandbox-results-error": "Der opstod en fejl under indlæsning af API-forespørgelsessvaret: $1.", "apisandbox-request-format-url-label": "Adresseforepørgselsstreng", "apisandbox-request-url-label": "Forespurgt URL:", + "apisandbox-request-json-label": "Anmod om JSON:", "apisandbox-request-time": "Forespørgselstid: {{PLURAL:$1|$1 ms}}", "apisandbox-alert-page": "Felter pÃ¥ denne side er ugyldige.", "apisandbox-alert-field": "Værdien af dette felt er ugyldigt.", @@ -1953,6 +1973,7 @@ "speciallogtitlelabel": "MÃ¥l (titel eller {{ns:user}}:brugernavn for bruger):", "log": "Loglister", "logeventslist-submit": "Vis", + "logeventslist-more-filters": "Vis flere logs:", "all-logs-page": "Alle offentlige logger", "alllogstext": "Samlet visning af alle loggene pÃ¥ {{SITENAME}}.\nDu kan afgrænse visningen ved at vælge en logtype, brugernavn eller pÃ¥virket side. Der skelnes mellem smÃ¥ og store bogstaver for bÃ¥de bruger- og sidenavne.", "logempty": "Intet passende fundet.", @@ -2117,7 +2138,7 @@ "enotif_body_intro_moved": "{{SITENAME}} siden $1 er blevet flyttet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle revision.", "enotif_body_intro_restored": "{{SITENAME}} siden $1 er blevet gendannet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.", "enotif_body_intro_changed": "{{SITENAME}}-siden $1 er blevet ændret den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.", - "enotif_lastvisited": "GÃ¥ til $1 for at se alle ændringer siden dit sidste besøg.", + "enotif_lastvisited": "GÃ¥ til $1 for at se alle ændringer siden dit sidste besøg", "enotif_lastdiff": "For at se denne ændring, se $1", "enotif_anon_editor": "anonym bruger $1", "enotif_body": "Kære $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nBidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt bidragyderen:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu vil ikke modtage flere beskeder om yderligere aktivitet medmindre du besøger denne side. PÃ¥ din overvÃ¥gningsliste kan du ogsÃ¥ nulstille alle markeringer for de sider, du overvÃ¥ger.\n\n Med venlig hilsen {{SITENAME}}s informationssystem\n\n--\nFor at ændre dine indstillinger for e-mail-meddelelser, besøg\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor at ændre indstillingerne for din overvÃ¥gningsliste, besøg\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor at slette siden fra din overvÃ¥gningsliste, besøg\n$UNWATCHURL\n\nTilbagemelding og yderligere hjælp:\n$HELPPAGE", @@ -2252,7 +2273,7 @@ "undeleteviewlink": "vis", "undeleteinvert": "Omvend valget af versioner", "undeletecomment": "Begrundelse:", - "cannotundelete": "Gendannelse mislykkedes:\n$1", + "cannotundelete": "Gendannelse mislykkedes for nogle eller alle:\n$1", "undeletedpage": "'''$1''' blev gendannet.\n\nI [[Special:Log/delete|slette-loggen]] findes en oversigt over de nyligt slettede og gendannede sider.", "undelete-header": "Se [[Special:Log/delete|slette-loggen]] for nyligt slettede og gendannede sider.", "undelete-search-title": "Søg i slettede sider", @@ -2366,6 +2387,7 @@ "autoblocklist": "Autoblokeringer", "autoblocklist-submit": "Søg", "autoblocklist-legend": "Vis autoblokeringer", + "autoblocklist-localblocks": "{{PLURAL:$1|Lokal autoblokering|Lokale autoblokeringer}}", "autoblocklist-total-autoblocks": "Samlet antal automatiske blokeringer: $1", "autoblocklist-empty": "Autoblokeringslisten er tom.", "autoblocklist-otherblocks": "Andre {{PLURAL:$1|autoblokering|autoblokeringer}}", @@ -2553,6 +2575,7 @@ "thumbnail_dest_directory": "Kataloget kan ikke oprettes.", "thumbnail_image-type": "Billedtypen understøttes ikke", "thumbnail_gd-library": "Ufuldstændig konfiguration af GD-biblioteket: funktionen $1 mangler", + "thumbnail_image-size-zero": "Filstørrelsen til billedet ser ud til at være nul.", "thumbnail_image-missing": "Filen $1 ser til at mangle", "import": "Importer sider", "importinterwiki": "Import fra en anden wiki", @@ -2745,6 +2768,7 @@ "pageinfo-category-subcats": "Antal underkategorier", "pageinfo-category-files": "Antal filer", "pageinfo-user-id": "Bruger-id", + "pageinfo-file-hash": "Hash værdi", "markaspatrolleddiff": "Markér som patruljeret", "markaspatrolledtext": "Markér denne side som patruljeret", "markaspatrolledtext-file": "Markér denne filversion som patruljeret", @@ -3272,6 +3296,7 @@ "version-specialpages": "Specialsider", "version-parserhooks": "Parserfunktioner", "version-variables": "Variabler", + "version-editors": "Skribenter", "version-antispam": "Spamforebyggelse", "version-other": "Andet", "version-mediahandlers": "SpecialhÃ¥ndtering af mediefiler", @@ -3292,6 +3317,7 @@ "version-ext-colheader-credits": "Forfattere", "version-license-title": "Licens for $1", "version-license-not-found": "Ingen detaljerede licensoplysninger blev fundet for denne udvidelse.", + "version-credits-title": "Anerkendelser for $1", "version-credits-not-found": "Ingen detaljeret information om bidragyderen blev fundet for denne udvidelse.", "version-poweredby-credits": "Denne wiki er drevet af '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.", "version-poweredby-others": "andre", @@ -3356,7 +3382,9 @@ "tag-mw-removed-redirect": "Fjernede omdirigering", "tag-mw-changed-redirect-target": "OmdigeringsmÃ¥l ændret", "tag-mw-blank": "Sidetømning", + "tag-mw-blank-description": "Redigeringer som tømmer en side", "tag-mw-replace": "Erstattet", + "tag-mw-replace-description": "Redigeringer som fjerner mere end 90% af indholdet pÃ¥ en side", "tag-mw-rollback": "Tilbagerulning", "tag-mw-undo": "Omgjort", "tags-title": "Tags", @@ -3390,6 +3418,7 @@ "tags-delete-title": "Slet mærke", "tags-delete-explanation-initial": "Du er ved at slette mærket »$1« fra databasen.", "tags-delete-reason": "Årsag:", + "tags-delete-not-found": "Tagget \"$1\" findes ikke.", "tags-activate-title": "Aktiver mærke", "tags-activate-question": "Du er ved at aktivere mærket »$1«.", "tags-activate-reason": "Årsag:", @@ -3424,7 +3453,11 @@ "compare-invalid-title": "Den titel, du har angivet, er ugyldig.", "compare-title-not-exists": "Den titel, du har angivet, findes ikke.", "compare-revision-not-exists": "Den version, du har angivet, findes ikke.", - "diff-form": "et '''skema'''", + "diff-form": "Forskelle", + "diff-form-submit": "Vis forskelle", + "permanentlink": "Permanent link", + "permanentlink-revid": "Versions-ID", + "permanentlink-submit": "GÃ¥ til version", "dberr-problems": "Undskyld! Siden har tekniske problemer.", "dberr-again": "Prøv at vente et par minutter og opdater sÃ¥ siden igen.", "dberr-info": "(Kan ikke tilgÃ¥ databasen: $1)", @@ -3451,10 +3484,16 @@ "htmlform-date-placeholder": "ÅÅÅÅ-MM-DD", "htmlform-time-placeholder": "TT:MM:SS", "htmlform-datetime-placeholder": "ÅÅÅÅ-MM-DD TT:MM:SS", + "htmlform-title-badnamespace": "[[:$1]] er ikke i \"{{ns:$2}}\" navnerummet.", "htmlform-title-not-exists": "$1 findes ikke.", + "htmlform-user-not-exists": "$1 findes ikke.", + "htmlform-user-not-valid": "$1 er ikke et gyldigt brugernavn.", "logentry-delete-delete": "$1 {{GENDER:$2|slettede}} siden $3", "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettede}} omdirigering $3 ved overskrivning", "logentry-delete-restore": "$1 {{GENDER:$2|gendannede}} siden $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|gendannede}} siden $3", + "restore-count-revisions": "{{PLURAL:$1|1 version|$1 versioner}}", + "restore-count-files": "{{PLURAL:$1|1 fil|$1 filer}}", "logentry-delete-event": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|ændrede}} synligheden af loghændelser for siden $3", @@ -3492,12 +3531,13 @@ "logentry-protect-protect-cascade": "$1 {{GENDER:$2|beskyttede}} $3 $4 [kaskaderende]", "logentry-protect-modify": "$1 {{GENDER:$2|ændrede}} beskyttelsesniveau for $3 $4", "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ændrede}} beskyttelsesniveau for $3 $4 [kaskaderende]", - "logentry-rights-rights": "$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3 fra $4 til $5", + "logentry-rights-rights": "$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for {{GENDER:$6|$3}} fra $4 til $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3", "logentry-rights-autopromote": "$1 blev automatisk {{GENDER:$2|forfremmet}} fra $4 til $5", "logentry-upload-upload": "$1 {{GENDER:$2|lagde}} $3 op", "logentry-upload-overwrite": "$1 {{GENDER:$2|lagde}} en ny udgave af $3 op", "logentry-upload-revert": "$1 {{GENDER:$2|lagde}} $3 op", + "logentry-managetags-create": "$1 {{GENDER:$2|oprettede}} tagget \"$4\"", "rightsnone": "(-)", "rightslogentry-temporary-group": "$1 (midlertidig, indtil $2)", "feedback-adding": "Tilføjer kommentar til side...", @@ -3550,7 +3590,7 @@ "expandtemplates": "Udfold skabeloner", "expand_templates_intro": "Denne specialside tager en tekst og udfolder alle benyttede skabeloner rekursivt.\nDen udfolder ogsÃ¥ understøttede parserfunktioner sÃ¥ som\n{{#language:…}} og variabler sÃ¥ som \n{{CURRENTDAY}}\nFaktisk udfolder den stort set alt i dobbelte tuborgklammer.", "expand_templates_title": "Sammenhængstitel, for {{FULLPAGENAME}} osv.:", - "expand_templates_input": "Inputtekst:", + "expand_templates_input": "Input wikitekst:", "expand_templates_output": "Resultat", "expand_templates_xml_output": "XML-kode", "expand_templates_html_output": "RÃ¥ HTML-output", @@ -3567,7 +3607,10 @@ "pagelang-select-lang": "Vælg sprog", "pagelang-reason": "Begrundelse", "pagelang-submit": "Indsend", + "pagelang-nonexistent-page": "Siden $1 findes ikke.", + "pagelang-unchanged-language": "Siden $1 er allerede sat til sproget $2.", "right-pagelang": "Ændre sidesproget", + "action-pagelang": "ændre sidesproget", "mediastatistics": "Mediestatistik", "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)", "mediastatistics-table-mimetype": "MIME-type", @@ -3649,6 +3692,7 @@ "log-action-filter-protect-move_prot": "Flyttede beskyttelse", "log-action-filter-upload-upload": "Ny overførsel", "authmanager-create-from-login": "For at oprette din konto, sÃ¥ udfyld venligst felterne.", + "authmanager-authplugin-setpass-failed-title": "Ændring af adgangskode mislykkedes", "authmanager-authplugin-setpass-bad-domain": "Ugyldig domæne.", "authmanager-userdoesnotexist": "Brugerkontoen \"$1\" er ikke registreret.", "authmanager-email-label": "E-post", @@ -3657,6 +3701,9 @@ "authmanager-realname-help": "Brugerens egentlige navn", "authmanager-provider-temporarypassword": "Midlertidig adgangskode", "authprovider-resetpass-skip-label": "Spring over", + "authprovider-resetpass-skip-help": "Spring over nulstilling af adgangskoden.", + "authform-notoken": "Mangler nøgle", + "authform-wrongtoken": "Forkert nøgle", "specialpage-securitylevel-not-allowed-title": "Ikke tilladt", "cannotauth-not-allowed-title": "Adgang nægtet", "cannotauth-not-allowed": "Du har ikke tilladelse til at bruge denne side", @@ -3668,5 +3715,13 @@ "credentialsform-account": "Kontonavn:", "edit-error-short": "Fejl: $1", "edit-error-long": "Fejl:\n\n$1", - "pagedata-bad-title": "Ugyldig titel: $1" + "revid": "version $1", + "pageid": "side id: $1", + "gotointerwiki": "Forlader {{SITENAME}}", + "gotointerwiki-invalid": "Den angivne titel er ikke gyldig.", + "pagedata-title": "Sidedata", + "pagedata-bad-title": "Ugyldig titel: $1", + "passwordpolicies": "Password politikker", + "passwordpolicies-group": "Gruppe", + "passwordpolicies-policies": "Politikker" } diff --git a/languages/i18n/de.json b/languages/i18n/de.json index 8d4d08d361..89eb5d7116 100644 --- a/languages/i18n/de.json +++ b/languages/i18n/de.json @@ -226,8 +226,8 @@ "category-file-count": "{{PLURAL:$2|Diese Kategorie enthält nur folgende Datei.|Folgende {{PLURAL:$1|Datei ist|$1 Dateien sind}} in dieser Kategorie, von $2 insgesamt.}}", "category-file-count-limited": "Folgende {{PLURAL:$1|Datei ist|$1 Dateien sind}} in dieser Kategorie enthalten:", "listingcontinuesabbrev": "(Fortsetzung)", - "index-category": "Indexierte Seiten", - "noindex-category": "Nichtindexierte Seiten", + "index-category": "Seiten, die indexiert werden können", + "noindex-category": "Seiten, die nicht indexiert werden können", "broken-file-category": "Seiten mit defekten Dateilinks", "about": "Über", "article": "Seite", @@ -453,6 +453,7 @@ "ns-specialprotected": "Spezialseiten können nicht bearbeitet werden.", "titleprotected": "Eine Seite mit diesem Namen kann nicht angelegt werden.\nDie Sperre wurde durch [[User:$1|$1]] mit der Begründung $2 eingerichtet.", "filereadonlyerror": "Die Datei „$1“ kann nicht verändert werden, da auf das Dateirepositorium „$2“ nur Lesezugriff möglich ist.\n\nDer Systemadministrator, der den Schreibzugriff sperrte, gab folgenden Grund an: „$3“.", + "invalidtitle": "Ungültiger Titel", "invalidtitle-knownnamespace": "Ungültiger Titel mit Namensraum „$2“ und Text „$3“", "invalidtitle-unknownnamespace": "Ungültiger Titel mit unbekannter Namensraumnummer $1 und Text „$2“", "exception-nologin": "Nicht angemeldet", @@ -832,7 +833,7 @@ "post-expand-template-inclusion-warning": "Warnung: Die Größe eingebundener Vorlagen ist zu groß, einige Vorlagen können nicht eingebunden werden.", "post-expand-template-inclusion-category": "Seiten, in denen die maximale Größe eingebundener Vorlagen überschritten ist", "post-expand-template-argument-warning": "'''Warnung:''' Diese Seite enthält mindestens einen Parameter in einer Vorlage, der expandiert zu groß ist. Diese Parameter werden ignoriert.", - "post-expand-template-argument-category": "Seiten mit ignorierten Vorlagenparametern", + "post-expand-template-argument-category": "Seiten, die ignorierte Vorlagenparameter enthalten", "parser-template-loop-warning": "Vorlagenschleife entdeckt: [[$1]]", "template-loop-category": "Seiten mit Vorlagenschleifen", "template-loop-category-desc": "Die Seite enthält eine Vorlagenschleife, z. B. eine Vorlage, die sich selbst rekursiv aufruft.", @@ -1866,8 +1867,8 @@ "filehist-comment": "Kommentar", "imagelinks": "Dateiverwendung", "linkstoimage": "Die {{PLURAL:$1|folgende Seite verwendet|folgenden $1 Seiten verwenden}} diese Datei:", - "linkstoimage-more": "Mehr als {{PLURAL:$1|eine Seite verlinkt|$1 Seiten verlinken}} auf diese Datei.\nDie folgende Liste zeigt nur {{PLURAL:$1|den ersten Link|die ersten $1 Links}} auf diese Datei.\nEine [[Special:WhatLinksHere/$2|vollständige Liste]] ist verfügbar.", - "nolinkstoimage": "Diese Datei wird auf keiner Seite verwendet.", + "linkstoimage-more": "Mehr als {{PLURAL:$1|eine Seite verwendet|$1 Seiten verwenden}} diese Datei.\nDie folgende Liste zeigt nur die {{PLURAL:$1|erste Verwendung|ersten $1 Verwendungen}} dieser Datei.\nEine [[Special:WhatLinksHere/$2|vollständige Liste]] ist verfügbar.", + "nolinkstoimage": "Keine Seiten verwenden diese Datei.", "morelinkstoimage": "[[Special:WhatLinksHere/$1|Weitere Links]] auf diese Datei.", "linkstoimage-redirect": "$1 (Dateiweiterleitung) $2", "duplicatesoffile": "Die {{PLURAL:$1|folgende Datei ist ein Duplikat|folgenden $1 Dateien sind Duplikate}} dieser Datei ([[Special:FileDuplicateSearch/$2|weitere Details]]):", diff --git a/languages/i18n/el.json b/languages/i18n/el.json index a199a90c3d..b0ea8784a1 100644 --- a/languages/i18n/el.json +++ b/languages/i18n/el.json @@ -414,6 +414,7 @@ "ns-specialprotected": "Η επεξεργασία σελίδων στον τομέα {{ns:special}} δεν είναι δυνατή.", "titleprotected": "Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].\nΟ λόγος που δίνεται είναι $2.", "filereadonlyerror": "Δεν είναι δυνατή η τροποποίηση του αρχείου «$1» επειδή το αποθετήριο αρχείων «$2» είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.\n\nΟ διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: «$3».", + "invalidtitle": "Άκυρος τίτλος", "invalidtitle-knownnamespace": "Μη έγκυρος τίτλος με χώρο ονομάτων «$2» και κείμενο «$3»", "invalidtitle-unknownnamespace": "Μη έγκυρος τίτλος με άγνωστο αριθμό χώρου ονομάτων $1 και κείμενο «$2»", "exception-nologin": "Δεν έχετε συνδεθεί", @@ -999,10 +1000,10 @@ "search-nonefound": "Δεν υπάρχουν αποτελέσματα που να ικανοποιούν το ερώτημα.", "search-nonefound-thiswiki": "Δεν υπάρχουν αποτελέσματα που να ικανοποιούν το ερώτημα σε αυτόν τον ιστότοπο.", "powersearch-legend": "Αναλυτική αναζήτηση", - "powersearch-ns": "Αναζήτηση στις περιοχές ονομάτων:", + "powersearch-ns": "Αναζήτηση στους ονοματοχώρους:", "powersearch-togglelabel": "Έλεγχος:", - "powersearch-toggleall": "Όλες", - "powersearch-togglenone": "Καμία", + "powersearch-toggleall": "Όλοι", + "powersearch-togglenone": "Κανένας", "powersearch-remember": "Διατήρηση επιλογής για μελλοντικές αναζητήσεις", "search-external": "Εξωτερική αναζήτηση", "searchdisabled": "Η αναζήτηση για τον ιστότοπο \"{{SITENAME}}\" είναι απενεργοποιημένη. Μπορείτε να αναζητήσετε μέσω του Google εν τω μεταξύ. Σημειώστε ότι οι κατάλογοί τους για το περιεχόμενο του ιστοτόπου \"{{SITENAME}}\" μπορεί να είναι απαρχαιωμένοι.", @@ -1735,6 +1736,7 @@ "http-timed-out": "Ο χρόνος του αιτήματος HTTP έληξε.", "http-curl-error": "Σφάλμα κατά τη λήψη του URL: $1", "http-bad-status": "Υπήρξε πρόβλημα κατά τη διάρκεια του αιτήματος HTTP: $1 $2", + "http-internal-error": "Εσωτερικό σφάλμα HTTP.", "upload-curl-error6": "Το URL δεν ήταν προσβάσιμο", "upload-curl-error6-text": "Το παρεχόμενο URL δεν μπόρεσε να προσπελαστεί. Παρακαλώ εξετάστε διπλά, ότι το URL είναι ορθό και ότι ο ιστότοπος είναι διαθέσιμος.", "upload-curl-error28": "Λήξη χρόνου αναμονής (timeout) για το ανέβασμα", @@ -1779,9 +1781,9 @@ "filehist-filesize": "Μέγεθος", "filehist-comment": "Σχόλιο", "imagelinks": "Χρήση αρχείου", - "linkstoimage": "{{PLURAL:$1|Η ακόλουθη σελίδα έχει σύνδεσμο|Οι ακόλουθες $1 σελίδες έχουν συνδέσμους}} προς αυτό το αρχείο:", - "linkstoimage-more": "Περισσότεροι από $1 {{PLURAL:$1|σύνδεσμο|σύνδεσμοι}} συνδέονται με αυτό το αρχείο.\nΗ ακόλουθη λίστα δείχνει {{PLURAL:$1|την πρώτη σελίδα που συνδέεται|τις πρώτες $1 σελίδες που συνδέονται}} με αυτό το αρχείο μονοσήμαντα.\nΗ [[Special:WhatLinksHere/$2|πλήρης λίστα]] είναι διαθέσιμη.", - "nolinkstoimage": "Δεν υπάρχουν σελίδες με συνδέσμους προς αυτό το αρχείο.", + "linkstoimage": "{{PLURAL:$1|Η ακόλουθη σελίδα χρησιμοποιεί|Οι ακόλουθες $1 σελίδες χρησιμοποιούν}} προς αυτό το αρχείο:", + "linkstoimage-more": "Περισσότεροι από $1 {{PLURAL:$1|σελίδα χρησιμοποιεί|σελίδες χρησιμοποιούν}} αυτό το αρχείο.\nΗ ακόλουθη λίστα δείχνει {{PLURAL:$1|την πρώτη σελίδα που συνδέεται|τις πρώτες $1 σελίδες που συνδέονται}} με αυτό το αρχείο μονοσήμαντα.\nΗ [[Special:WhatLinksHere/$2|πλήρης λίστα]] είναι διαθέσιμη.", + "nolinkstoimage": "Δεν υπάρχουν σελίδες που χρησιμοποιούν αυτό το αρχείο.", "morelinkstoimage": "Δείτε [[Special:WhatLinksHere/$1|περισσότερους συνδέσμους]] προς αυτό το αρχείο.", "linkstoimage-redirect": "$1 (ανακατεύθυνση του αρχείου) $2", "duplicatesoffile": "{{PLURAL:$1|Το ακόλουθο αρχείο είναι διπλότυπο|Τα $1 ακόλουθα αρχεία είναι διπλότυπα}} αυτού του αρχείου ([[Special:FileDuplicateSearch/$2|περισσότερες λεπτομέρειες]]):", diff --git a/languages/i18n/en.json b/languages/i18n/en.json index 0948136f6b..47747b6090 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -376,6 +376,7 @@ "ns-specialprotected": "Special pages cannot be edited.", "titleprotected": "This title has been protected from creation by [[User:$1|$1]].\nThe reason given is $2.", "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe system administrator who locked it offered this explanation: \"$3\".", + "invalidtitle": "Invalid title", "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"", "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"", "exception-nologin": "Not logged in", @@ -1855,9 +1856,9 @@ "filehist-filesize": "File size", "filehist-comment": "Comment", "imagelinks": "File usage", - "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:", - "linkstoimage-more": "More than $1 {{PLURAL:$1|page links|pages link}} to this file.\nThe following list shows the {{PLURAL:$1|first page link|first $1 page links}} to this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.", - "nolinkstoimage": "There are no pages that link to this file.", + "linkstoimage": "The following {{PLURAL:$1|page uses|$1 pages uses}} this file:", + "linkstoimage-more": "More than $1 {{PLURAL:$1|page uses|pages use}} this file.\nThe following list shows the {{PLURAL:$1|first page|first $1 pages}} that use this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.", + "nolinkstoimage": "There are no pages that use this file.", "morelinkstoimage": "View [[Special:WhatLinksHere/$1|more links]] to this file.", "linkstoimage-redirect": "$1 (file redirect) $2", "duplicatesoffile": "The following {{PLURAL:$1|file is a duplicate|$1 files are duplicates}} of this file ([[Special:FileDuplicateSearch/$2|more details]]):", diff --git a/languages/i18n/es.json b/languages/i18n/es.json index 82eb62aa7a..b06bcc78f9 100644 --- a/languages/i18n/es.json +++ b/languages/i18n/es.json @@ -171,7 +171,8 @@ "La Mantis", "Amaia", "Tiberius1701", - "Astroemi" + "Astroemi", + "Jelou" ] }, "tog-underline": "Subrayar los enlaces:", @@ -370,7 +371,7 @@ "redirectedfrom": "(Redirigido desde «$1»)", "redirectpagesub": "Página de redirección", "redirectto": "Redirige a:", - "lastmodifiedat": "Se editó esta página por última vez el $1 a las $2.", + "lastmodifiedat": "Esta página se editó por última vez el $1 a las $2.", "viewcount": "Esta página ha recibido {{PLURAL:$1|una visita|$1 visitas}}.", "protectedpage": "Página protegida", "jumpto": "Saltar a:", @@ -378,7 +379,7 @@ "jumptosearch": "buscar", "view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios tratando de ver esta página.\nEspera un momento antes de intentar acceder de nuevo a esta página.\n\n$1", "generic-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios tratando de ver este recurso.\nEspera un momento antes de intentar acceder de nuevo a este recurso.", - "pool-timeout": "Se agotó el tiempo de espera al cierre de exclusión mutua", + "pool-timeout": "Se agotó el tiempo de espera para el bloqueo", "pool-queuefull": "La cola de trabajo está llena", "pool-errorunknown": "Error desconocido", "pool-servererror": "El servicio de gestión de procesos agrupados no está disponible ($1).", @@ -398,7 +399,7 @@ "policy-url": "Project:Políticas", "portal": "Portal de la comunidad", "portal-url": "Project:Portal de la comunidad", - "privacy": "Normativa de privacidad", + "privacy": "Política de privacidad", "privacypage": "Project:Normativa de privacidad", "badaccess": "Error de permisos", "badaccess-group0": "No estás autorizado a ejecutar la acción solicitada.", @@ -430,13 +431,13 @@ "thisisdeleted": "¿Ver o restaurar $1?", "viewdeleted": "¿Quieres ver $1?", "restorelink": "{{PLURAL:$1|una edición borrada|$1 ediciones borradas}}", - "feedlinks": "Suministro:", + "feedlinks": "Sindicación:", "feed-invalid": "La suscripción no es válida para el tipo de sindicación.", "feed-unavailable": "Los canales de sindicación no están disponibles", "site-rss-feed": "Suministro RSS de $1", - "site-atom-feed": "Suministro Atom de $1", - "page-rss-feed": "Suministro RSS de «$1»", - "page-atom-feed": "Suministro Atom de «$1»", + "site-atom-feed": "Canal Atom de $1", + "page-rss-feed": "Canal RSS de «$1»", + "page-atom-feed": "Canal Atom de «$1»", "feed-atom": "Atom", "red-link-title": "$1 (la página no existe)", "sort-descending": "Orden descendente", @@ -519,6 +520,9 @@ "customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.", "customjsonprotected": "No tienes permiso para editar esta página JSON porque contiene configuraciones personales de otro usuario.", "customjsprotected": "No tienes permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.", + "sitecssprotected": "No tienes permiso para editar esta página CSS porque puede afectar a todos los visitantes", + "sitejsonprotected": "No tienes permiso para editar esta página JSON porque puede afectar a todos los visitantes", + "sitejsprotected": "No tienes permiso para editar esta página de JavaScript porque puede afectar a todos los visitantes", "mycustomcssprotected": "No tienes permiso para editar esta página CSS.", "mycustomjsonprotected": "No tienes permiso para editar esta página JSON.", "mycustomjsprotected": "No tienes permiso para editar esta página JavaScript.", @@ -607,7 +611,7 @@ "noname": "No se ha especificado un nombre de usuario válido.", "loginsuccesstitle": "Has accedido", "loginsuccess": "Has accedido a {{SITENAME}} como «$1».", - "nosuchuser": "No existe ninguna cuenta llamada «$1».\nLos nombres de usuario distinguen mayúsculas y minúsculas.\nComprueba tu escritura o [[Special:CreateAccount|crea una cuenta nueva]].", + "nosuchuser": "No existe ninguna cuenta llamada «$1».\nLos nombres de usuario distinguen mayúsculas y minúsculas.\nComprueba que lo has escrito correctamente o [[Special:CreateAccount|crea una cuenta nueva]].", "nosuchusershort": "No existe ningún usuario llamado «$1». Comprueba que lo has escrito correctamente.", "nouserspecified": "Debes especificar un nombre de usuario.", "login-userblocked": "No puedes iniciar sesión porque tu cuenta está bloqueada.", @@ -664,11 +668,11 @@ "resetpass_submit": "Establecer contraseña e iniciar sesión", "changepassword-success": "Se modificó la contraseña.", "changepassword-throttled": "Has intentado acceder demasiadas veces recientemente.\nEspera $1 antes de intentarlo de nuevo.", - "botpasswords": "Contraseñas de bots", + "botpasswords": "Contraseñas de robots", "botpasswords-summary": "Las contraseñas de bots permiten el acceso a una cuenta de usuario mediante la API sin usar las credenciales principales de la cuenta. Los derechos de un usuario mientras haya iniciado sesión con una contraseña de bot pueden estar restringidos.\n\nSi no sabes por qué querrías hacer esto, probablemente no deberías hacerlo. Nadie debería pedirte que generes una de estas claves y que se la entregues.", "botpasswords-disabled": "Las contraseñas de robot están desactivadas.", "botpasswords-no-central-id": "Para usar una contraseña de bot, debes estar conectado a una cuenta centralizada.", - "botpasswords-existing": "Contraseñas de bots existentes", + "botpasswords-existing": "Contraseñas de bot existentes", "botpasswords-createnew": "Crear una contraseña de robot nueva", "botpasswords-editexisting": "Editar una contraseña de robot existente", "botpasswords-label-needsreset": "(la contraseña debe restablecerse)", @@ -684,18 +688,18 @@ "botpasswords-bad-appid": "El nombre del robot «$1» no es válido.", "botpasswords-insert-failed": "No se pudo agregar el nombre del bot \"$1\". ¿Ya ha sido añadido?", "botpasswords-update-failed": "No se pudo actualizar el nombre del bot \"$1\". ¿Ha sido borrado?", - "botpasswords-created-title": "Se creó la contraseña de robot", - "botpasswords-created-body": "Se creó la contraseña del robot «$1» perteneciente {{GENDER:$2|al usuario|a la usuaria}} «$2».", - "botpasswords-updated-title": "Se actualizó la contraseña de robot", + "botpasswords-created-title": "Se creó la contraseña de bot", + "botpasswords-created-body": "Se creó la contraseña del bot «$1» perteneciente {{GENDER:$2|al usuario|a la usuaria}} «$2».", + "botpasswords-updated-title": "Se actualizó la contraseña de bot", "botpasswords-updated-body": "Se actualizó la contraseña del robot «$1» perteneciente {{GENDER:$2|al usuario|a la usuaria}} «$2».", - "botpasswords-deleted-title": "Se eliminó la contraseña de robot", - "botpasswords-deleted-body": "Se eliminó la contraseña del robot «$1» perteneciente {{GENDER:$2|al usuario|a la usuaria}} «$2».", + "botpasswords-deleted-title": "Se eliminó la contraseña del bot", + "botpasswords-deleted-body": "Se eliminó la contraseña del bot «$1» perteneciente {{GENDER:$2|al usuario|a la usuaria}} «$2».", "botpasswords-newpassword": "La contraseña nueva para acceder con $1 es $2. Guarda esta información para su consulta futura.
    (En caso de robots antiguos que requieren que el nombre de acceso coincida con el de usuario, también puedes utilizar $3 como nombre de usuario y $4 como contraseña.)", "botpasswords-no-provider": "BotPasswordsSessionProvider no está disponible.", "botpasswords-restriction-failed": "Las restricciones de la contraseña de bot impiden este inicio de sesión.", "botpasswords-invalid-name": "El nombre de usuario especificado no contiene el separador de contraseña de bot (\"$1\").", "botpasswords-not-exist": "El usuario \"$1\" no tiene una contraseña de bot llamada \"$2\".", - "botpasswords-needs-reset": "Se debe restablecer la contraseña del robot «$2», propiedad {{GENDER:$1|del usuario|de la usuaria}} «$1».", + "botpasswords-needs-reset": "Se debe restablecer la contraseña del bot «$2», propiedad {{GENDER:$1|del usuario|de la usuaria}} «$1».", "resetpass_forbidden": "No se pueden cambiar las contraseñas", "resetpass_forbidden-reason": "Las contraseñas no pueden cambiarse: $1", "resetpass-no-info": "Debes iniciar sesión para acceder directamente a esta página.", @@ -733,7 +737,7 @@ "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:", - "changeemail-newemail-help": "Este campo debería dejarse en blanco si quieres quitar tu dirección de correo electrónico. No podrás restablecer una contraseña olvidada y no recibirás correos de esta wiki si se quita la dirección de correo electrónico.", + "changeemail-newemail-help": "Este campo debería dejarse en blanco si quieres eliminar tu dirección de correo electrónico. No podrás restablecer una contraseña olvidada y no recibirás correos de esta wiki si se quita la dirección de correo electrónico.", "changeemail-none": "(ninguna)", "changeemail-password": "Tu contraseña en {{SITENAME}}:", "changeemail-submit": "Cambiar correo electrónico", @@ -789,9 +793,9 @@ "missingcommentheader": "Atención: no has escrito un asunto para este comentario.\nSi haces clic nuevamente en \"$1\" tu edición se grabará sin él.", "summary-preview": "Previsualización del resumen de edición:", "subject-preview": "Previsualización del asunto:", - "previewerrortext": "Se ha producido un error al intentar la vista previa de los cambios.", + "previewerrortext": "Se ha producido un error al intentar previsualizar tus cambios.", "blockedtitle": "El usuario está bloqueado", - "blockedtext": "Tu nombre de usuario o dirección IP ha sido bloqueada.\n\nEl bloqueo fue realizado por $1.\nLa razón dada es $2.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nNo puedes utilizar la función «{{int:emailuser}}» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y el bloqueo no haya deshabilitado también esta posibilidad.\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.", + "blockedtext": "Tu nombre de usuario o dirección IP ha sido bloqueada.\n\nEl bloqueo fue realizado por $1.\nEl motivo dado es el siguiente: $2.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nObserva que no puedes utilizar la función «{{int:emailuser}}» a menos que hayas registrado una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\nTu dirección IP actual es $3, y el identificador del bloqueo es n.º #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.", "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\nEl motivo dado es el siguiente:\n\n:$2\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nObserva que no puedes utilizar la función «{{int:emailuser}}» a menos que hayas registrado una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es n.º $5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.", "systemblockedtext": "Tu nombre de usuario o dirección IP ha sido bloqueado automáticamente por el software MediaWiki.\nLa razón dada es:\n\n:$2\n\n* Inicio del bloqueo: $8\n* Caducidad de bloqueo: $6\n* Destinatario del bloqueo: $7\n\nTu dirección IP actual es $3.\nPor favor, incluye todos los datos aquí mostrados en cualquier consulta que hagas.", "blockednoreason": "no se ha especificado el motivo", @@ -1140,7 +1144,7 @@ "prefs-user-pages": "Páginas de usuario", "prefs-personal": "Perfil de usuario", "prefs-rc": "Cambios recientes", - "prefs-watchlist": "Seguimiento", + "prefs-watchlist": "Lista de seguimiento", "prefs-editwatchlist": "Editar lista de seguimiento", "prefs-editwatchlist-label": "Editar entradas de tu lista de seguimiento:", "prefs-editwatchlist-edit": "Ver y quitar los títulos de tu lista de seguimiento", @@ -1267,7 +1271,7 @@ "userrights-expiry-none": "No caduca", "userrights-expiry": "Caduca:", "userrights-expiry-existing": "Fecha de caducidad actual: $2 a las $3", - "userrights-expiry-othertime": "Otro tiempo:", + "userrights-expiry-othertime": "En otro momento:", "userrights-expiry-options": "1 día:1 day,1 semana:1 week,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year", "userrights-invalid-expiry": "El tiempo de caducidad del grupo \"$1\" no es válido.", "userrights-expiry-in-past": "El tiempo de caducidad del grupo \"$1\" está en el pasado.", @@ -1276,21 +1280,24 @@ "group": "Grupo:", "group-user": "Usuarios", "group-autoconfirmed": "Autoconfirmados", - "group-bot": "Robots", + "group-bot": "Bots", "group-sysop": "Administradores", + "group-interface-admin": "Administradores de la interfaz", "group-bureaucrat": "Burócratas", "group-suppress": "Supresores de Flow", "group-all": "(todos)", "group-user-member": "{{GENDER:$1|usuario|usuaria}}", "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmado|autoconfirmada}}", - "group-bot-member": "{{GENDER:$1|robot}}", + "group-bot-member": "{{GENDER:$1|bot}}", "group-sysop-member": "{{GENDER:$1|administrador|administradora}}", + "group-interface-admin-member": "{{GENDER:$1|administrador|administradora}} de la interfaz", "group-bureaucrat-member": "{{GENDER:$1|burócrata}}", "group-suppress-member": "{{GENDER:$1|supresor|supresora}} de Flow", "grouppage-user": "{{ns:project}}:Usuarios", "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmados", - "grouppage-bot": "{{ns:project}}:Robots", + "grouppage-bot": "{{ns:project}}:Bots", "grouppage-sysop": "{{ns:project}}:Administradores", + "grouppage-interface-admin": "{{ns:project}}:Administradores de la interfaz", "grouppage-bureaucrat": "{{ns:project}}:Burócratas", "grouppage-suppress": "{{ns:project}}:Supresores de Flow", "right-read": "Leer páginas", @@ -1313,7 +1320,7 @@ "right-upload_by_url": "Subir un archivo a traves de un URL", "right-purge": "Purgar la antememoria de una página sin confirmación", "right-autoconfirmed": "No resultar afectado por los límites de frecuencia de edición para las IP", - "right-bot": "Ser tratado como un programa automático", + "right-bot": "Ser tratado como un proceso automático", "right-nominornewtalk": "No accionar el aviso de mensajes nuevos al realizar ediciones menores en páginas de discusión", "right-apihighlimits": "Usar límites más altos en peticiones a través de la API", "right-writeapi": "Hacer uso de la API de escritura", @@ -1341,6 +1348,9 @@ "right-editusercss": "Editar las páginas de CSS de otros usuarios", "right-edituserjson": "Editar archivos JSON de otros usuarios", "right-edituserjs": "Editar las páginas de JavaScript de otros usuarios", + "right-editsitecss": "Editar CSS global del sitio", + "right-editsitejson": "Editar JSON global del sitio", + "right-editsitejs": "Editar JavaScript global del sitio", "right-editmyusercss": "Editar tus archivos CSS", "right-editmyuserjson": "Editar tus propias páginas en formato JSON", "right-editmyuserjs": "Editar tus archivos JavaScript", @@ -1350,7 +1360,7 @@ "right-editmyprivateinfo": "Editar su propia información privada (ej.: correo electrónico, nombre real)", "right-editmyoptions": "Editar tus preferencias", "right-rollback": "Revertir rápidamente las ediciones del último usuario que modificó una página en particular", - "right-markbotedits": "Marcar las reversiones como ediciones de robot", + "right-markbotedits": "Marcar las reversiones como ediciones de un bot", "right-noratelimit": "No resultar afectado por los límites de frecuencia de edición", "right-import": "Importar páginas desde otras wikis", "right-importupload": "Importar páginas desde un archivo", @@ -1382,10 +1392,11 @@ "grant-createaccount": "Crear cuentas", "grant-createeditmovepage": "Crear, editar y trasladar páginas", "grant-delete": "Borrar páginas, revisiones y entradas del registro", - "grant-editinterface": "Editar el espacio de nombres MediaWiki y el CSS/JSON/JavaScript de los usuarios", + "grant-editinterface": "Editar el espacio de nombres MediaWiki y las páginas CSS/JSON/JavaScript del sitio y de los usuarios", "grant-editmycssjs": "Editar tu CSS/JSON/JavaScript", "grant-editmyoptions": "Editar tus preferencias de usuario", "grant-editmywatchlist": "Editar tu lista de seguimiento", + "grant-editsiteconfig": "Editar páginas de configuración CSS/JS del sitio", "grant-editpage": "Editar páginas existentes", "grant-editprotected": "Editar páginas protegidas", "grant-highvolume": "Gran cantidad de ediciones", @@ -1498,7 +1509,7 @@ "rcfilters-quickfilters-placeholder-description": "Para guardar tus ajustes de filtro y reutilizarlos más tarde, pulsa en el icono del marcador en el área de Filtro activo que se encuentra a continuación.", "rcfilters-savedqueries-defaultlabel": "Filtros guardados", "rcfilters-savedqueries-rename": "Cambiar nombre", - "rcfilters-savedqueries-setdefault": "Predeterminar", + "rcfilters-savedqueries-setdefault": "Marcar como predeterminado", "rcfilters-savedqueries-unsetdefault": "Desmarcar como predeterminado", "rcfilters-savedqueries-remove": "Eliminar", "rcfilters-savedqueries-new-name-label": "Nombre", @@ -1510,7 +1521,7 @@ "rcfilters-savedqueries-already-saved": "Ya se guardaron estos filtros. Modifica tu configuración para crear un filtro guardado nuevo.", "rcfilters-restore-default-filters": "Restaurar filtros predeterminados", "rcfilters-clear-all-filters": "Borrar todos los filtros", - "rcfilters-show-new-changes": "Ver cambios más recientes", + "rcfilters-show-new-changes": "Ver los cambios más recientes", "rcfilters-search-placeholder": "Filtrar cambios (utiliza el menú o busca el nombre de un filtro)", "rcfilters-invalid-filter": "Filtro no válido", "rcfilters-empty-filter": "No hay filtros activos. Se muestran todas las contribuciones.", @@ -1531,7 +1542,7 @@ "rcfilters-filter-editsbyother-description": "Todos los cambios, excepto los tuyos.", "rcfilters-filtergroup-userExpLevel": "Registro de usuario y experiencia", "rcfilters-filter-user-experience-level-registered-label": "Registrados", - "rcfilters-filter-user-experience-level-registered-description": "Usuarios registrados.", + "rcfilters-filter-user-experience-level-registered-description": "Usuarios conectados.", "rcfilters-filter-user-experience-level-unregistered-label": "No registrados", "rcfilters-filter-user-experience-level-unregistered-description": "Editores no conectados.", "rcfilters-filter-user-experience-level-newcomer-label": "Recién llegados", @@ -1541,9 +1552,9 @@ "rcfilters-filter-user-experience-level-experienced-label": "Usuarios experimentados", "rcfilters-filter-user-experience-level-experienced-description": "Editores registrados con más de 500 ediciones y 30 días de actividad.", "rcfilters-filtergroup-automated": "Contribuciones automatizadas", - "rcfilters-filter-bots-label": "Robot", + "rcfilters-filter-bots-label": "Bot", "rcfilters-filter-bots-description": "Ediciones realizadas por herramientas automatizadas.", - "rcfilters-filter-humans-label": "Ser humano (no robot)", + "rcfilters-filter-humans-label": "Ser humano (no bot)", "rcfilters-filter-humans-description": "Ediciones realizadas por editores humanos.", "rcfilters-filtergroup-reviewstatus": "Estado de revisión", "rcfilters-filter-reviewstatus-unpatrolled-description": "Ediciones no marcadas como revisadas manual o automáticamente.", @@ -1601,10 +1612,10 @@ "rcfilters-watchlist-markseen-button": "Marcar todos los cambios como vistos", "rcfilters-watchlist-edit-watchlist-button": "Edita tu lista de seguimiento", "rcfilters-watchlist-showupdated": "Los cambios hechos a páginas que no has visitado desde que se efectuaron aparecen en negrita, acompañados de marcadores sólidos.", - "rcfilters-preference-label": "Ocultar la versión mejorada de Cambios recientes", - "rcfilters-preference-help": "Revierte el rediseño de interfaz de 2017 e indisponibiliza todas las herramientas añadidas desde entonces.", + "rcfilters-preference-label": "Ocultar la versión mejorada de cambios recientes", + "rcfilters-preference-help": "Revierte el rediseño de la interfaz de 2017 y desactiva todas las herramientas añadidas desde entonces.", "rcfilters-watchlist-preference-label": "Ocultar la versión mejorada de la lista de seguimiento", - "rcfilters-watchlist-preference-help": "Revierte el rediseño de la interfaz de 2017 e indisponibiliza todas las herramientas añadidas desde entonces.", + "rcfilters-watchlist-preference-help": "Revierte el rediseño de la interfaz de 2017 y desactiva todas las herramientas añadidas desde entonces.", "rcfilters-filter-showlinkedfrom-label": "Mostrar cambios en páginas enlazadas desde", "rcfilters-filter-showlinkedfrom-option-label": "Páginas enlazadas desde la página seleccionada", "rcfilters-filter-showlinkedto-label": "Mostrar cambios en páginas que enlazan a", @@ -1690,7 +1701,7 @@ "filename-toolong": "Los nombres de archivo no pueden tener más de 240 bytes.", "badfilename": "Se ha cambiado el nombre del archivo a «$1».", "filetype-mime-mismatch": "La extensión de archivo «.$1» no coincide con el tipo MIME detectado en el archivo ($2).", - "filetype-badmime": "No se permite subir archivos de tipo MIME «$1».", + "filetype-badmime": "No se permite subir archivos MIME de tipo «$1».", "filetype-bad-ie-mime": "No se puede subir este archivo porque Internet Explorer podría considerarlo como «$1», que es un tipo de archivo no autorizado y potencialmente peligroso.", "filetype-unwanted-type": "«.$1» no está entre los tipos de archivo aconsejados.\n{{PLURAL:$3|El único tipo aconsejado es|Los tipos aconsejados son}} $2.", "filetype-banned-type": "{{PLURAL:$4|El tipo de archivo|Los tipos de archivo}} \".$1\" no {{PLURAL:$4|está permitido|están permitidos}}.\n{{PLURAL:$3|El único tipo de archivo permitido es|Los tipos de archivos permitidos son}} $2.", @@ -1849,11 +1860,11 @@ "uploadstash-bad-path-invalid": "La ruta no es válida.", "uploadstash-bad-path-unknown-type": "El tipo «$1» es desconocido.", "uploadstash-bad-path-unrecognized-thumb-name": "No se reconoce el nombre de la miniatura.", - "uploadstash-bad-path-no-handler": "No se encontró ningún manipulador para el MIME $1 del archivo $2.", + "uploadstash-bad-path-no-handler": "No se encontró ningún manejador para el MIME $1 del archivo $2.", "uploadstash-bad-path-bad-format": "El formato de la clave «$1» es incorrecto.", "uploadstash-file-not-found": "No se encuentra la clave «$1» en el almacén provisional.", "uploadstash-file-not-found-no-thumb": "No se pudo obtener la miniatura.", - "uploadstash-file-not-found-no-local-path": "Ningun mood local para objeto escalado.", + "uploadstash-file-not-found-no-local-path": "Sin ruta local para el elemento escalado.", "uploadstash-file-not-found-no-object": "No se pudo crear el objeto del archivo local para la miniatura.", "uploadstash-file-not-found-no-remote-thumb": "Falló la recuperación de miniaturas: $1\nURL = $2", "uploadstash-file-not-found-missing-content-type": "Una etiqueta de contenido falta", @@ -1913,7 +1924,7 @@ "listfiles-latestversion-no": "No", "file-anchor-link": "Archivo", "filehist": "Historial del archivo", - "filehist-help": "Haz clic sobre una fecha/hora para ver el\narchivo a esa fecha.", + "filehist-help": "Haz clic sobre una fecha y hora para ver el\narchivo tal como apareció en ese momento.", "filehist-deleteall": "borrar todo", "filehist-deleteone": "borrar", "filehist-revert": "revertir", @@ -1956,7 +1967,7 @@ "filerevert-identical": "La versión actual del archivo ya es idéntica a la seleccionada.", "filedelete": "Borrar $1", "filedelete-legend": "Borrar archivo", - "filedelete-intro": "Estás por borrar el archivo [[Media:$1|$1]] así como todo su historial.", + "filedelete-intro": "Estás a punto de borrar el archivo [[Media:$1|$1]] así como todo su historial.", "filedelete-intro-old": "Estás borrando la versión de [[Media:$1|$1]] del [$4 $2 a las $3].", "filedelete-comment": "Motivo:", "filedelete-submit": "Eliminar", @@ -2010,7 +2021,7 @@ "pageswithprop-legend": "Páginas con una propiedad de página", "pageswithprop-text": "Esta página muestra las páginas que usan una determinada propiedad de página.", "pageswithprop-prop": "Nombre de la propiedad:", - "pageswithprop-reverse": "Ordenar en inversa", + "pageswithprop-reverse": "Ordenar en modo inverso", "pageswithprop-sortbyvalue": "Ordenar por valor de propiedad", "pageswithprop-submit": "Ir", "pageswithprop-prophidden-long": "hay un largo valor en la propiedad texto oculta ($1)", @@ -2024,7 +2035,7 @@ "brokenredirectstext": "Las siguientes redirecciones enlazan a páginas que no existen:", "brokenredirects-edit": "editar", "brokenredirects-delete": "borrar", - "withoutinterwiki": "Páginas sin interwikis", + "withoutinterwiki": "Páginas sin enlaces interlingüísticos", "withoutinterwiki-summary": "Las siguientes páginas no enlazan a versiones en otros idiomas:", "withoutinterwiki-legend": "Prefijo", "withoutinterwiki-submit": "Mostrar", @@ -2062,7 +2073,7 @@ "mostlinkedcategories": "Categorías más enlazadas", "mostlinkedtemplates": "Páginas más transcluidas", "mostcategories": "Páginas con más categorías", - "mostimages": "Imágenes más usadas", + "mostimages": "Archivos más enlazados", "mostinterwikis": "Páginas con más interwikis", "mostrevisions": "Artículos con más ediciones", "prefixindex": "Todas las páginas con prefijo", @@ -2080,7 +2091,7 @@ "protectedpages-cascade": "Solo protecciones en cascada", "protectedpages-noredirect": "Ocultar redirecciones", "protectedpagesempty": "Actualmente no hay ninguna página protegida con esos parámetros.", - "protectedpages-timestamp": "Fecha y hora", + "protectedpages-timestamp": "Marca de tiempo", "protectedpages-page": "Página", "protectedpages-expiry": "Expira", "protectedpages-performer": "Protección de usuario", @@ -2112,8 +2123,8 @@ "notargettext": "No has especificado sobre qué página deseas llevar a cabo esta acción.", "nopagetitle": "No existe la página destino", "nopagetext": "La página destino que has especificado no existe.", - "pager-newer-n": "{{PLURAL:$1|1 siguiente|$1 siguientes}}", - "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}", + "pager-newer-n": "{{PLURAL:$1|$1 más nuevo|$1 más nuevos}}", + "pager-older-n": "{{PLURAL:$1|$1 más antiguo|$1 más antiguos}}", "suppress": "Supresor", "querypage-disabled": "Esta página especial está deshabilitada por motivos de rendimiento.", "apihelp": "Ayuda de la API", @@ -2134,7 +2145,7 @@ "apisandbox-dynamic-parameters-add-label": "Añadir parámetro:", "apisandbox-dynamic-parameters-add-placeholder": "Nombre del parámetro", "apisandbox-dynamic-error-exists": "Ya existe un parámetro llamado \"$1\".", - "apisandbox-deprecated-parameters": "Parámetros desaconsejados", + "apisandbox-deprecated-parameters": "Parámetros en desuso", "apisandbox-fetch-token": "Rellenar la ficha automáticamente", "apisandbox-add-multi": "Añadir", "apisandbox-submit-invalid-fields-title": "Algunos campos no son válidos", @@ -2146,8 +2157,8 @@ "apisandbox-results-login-suppressed": "Esta petición ha sido procesada como un usuario sin sesión iniciada puesto que se podría usar para circunvenir la seguridad del navegador. Tenga en cuenta que la gestión del token automático del API sandbox no funciona correctamente con tales peticiones, por favor rellenalas manualmente.", "apisandbox-request-selectformat-label": "Mostrar los datos de la petición como:", "apisandbox-request-format-url-label": "Cadena de consulta de la URL", - "apisandbox-request-url-label": "URL solicitante:", - "apisandbox-request-json-label": "JSON de la solicitud:", + "apisandbox-request-url-label": "Petición URL:", + "apisandbox-request-json-label": "Petición JSON:", "apisandbox-request-time": "Tiempo de solicitud: {{PLURAL:$1|$1 ms}}", "apisandbox-results-fixtoken": "Corrige el token y vuelve a enviar", "apisandbox-results-fixtoken-fail": "No fue posible recuperar el token \"$1\".", @@ -2204,7 +2215,7 @@ "cachedspecial-refresh-now": "Ver la más reciente.", "categories": "Categorías", "categories-submit": "Mostrar", - "categoriespagetext": "Las siguientes {{PLURAL:$1|categoría contiene|categorías contienen}} páginas o medios.\nNo se muestran aquí las [[Special:UnusedCategories|categorías sin uso]].\nVéanse también las [[Special:WantedCategories|categorías requeridas]].", + "categoriespagetext": "{{PLURAL:$1|La siguiente categoría existe|Las siguientes $1 categorías existen}} en la wiki y pueden o no estar sin uso.\nVéase también las [[Special:WantedCategories|Categorías requeridas]].", "categoriesfrom": "Mostrar categorías que empiecen por:", "deletedcontributions": "Contribuciones borradas de usuario", "deletedcontributions-title": "Contribuciones borradas de usuario", @@ -2213,7 +2224,7 @@ "linksearch-pat": "Patrón de búsqueda:", "linksearch-ns": "Espacio de nombres:", "linksearch-ok": "Buscar", - "linksearch-text": "Se pueden usar caracteres comodín como \"*.wikipedia.org\".\nEs necesario, por lo menos, un dominio de alto nivel, por ejemplo \"*.org\".
    \n{{PLURAL:$2|Protocolo soportado|Protocolos soportados}}: $1 (si no se especifica ninguno, el predeterminado es http://).", + "linksearch-text": "Se pueden usar caracteres comodín como «*.wikipedia.org».\nEs necesario, por lo menos, un dominio de alto nivel, por ejemplo «*.org».
    \n{{PLURAL:$2|Protocolo admitido|Protocolos admitidos}}: $1 (si no se especifica ninguno, el predeterminado es http://).", "linksearch-line": "$1 enlazado desde $2", "linksearch-error": "Los comodines solo pueden aparecer al principio del nombre de sitio.", "listusersfrom": "Mostrar usuarios que empiecen por:", @@ -2294,7 +2305,7 @@ "emailsenttext": "Se ha enviado tu mensaje de correo electrónico.", "emailuserfooter": "Este correo electrónico fue {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} a través de la función «{{int:emailuser}}» en {{SITENAME}}. Si {{GENDER:$2|respondes}}, tu correo electrónico se enviará directamente {{GENDER:$1|al emisor|a la emisora}} original, y {{GENDER:$1|le}} revelará {{GENDER:$2|tu}} dirección de correo electrónico.", "usermessage-summary": "Dejando un mensaje de sistema.", - "usermessage-editor": "Mensajero del sistema", + "usermessage-editor": "Sistema de mensajería", "watchlist": "Lista de seguimiento", "mywatchlist": "Lista de seguimiento", "watchlistfor2": "Para $1 $2", @@ -2311,11 +2322,11 @@ "removedwatchtext-short": "La página \"$1\" ha sido eliminada de tu lista de seguimiento.", "watch": "Vigilar", "watchthispage": "Vigilar esta página", - "unwatch": "Dejar de vigilar", + "unwatch": "Desmarcar", "unwatchthispage": "Dejar de vigilar", "notanarticle": "No es una página de contenido", "notvisiblerev": "La última revisión de un usuario diferente ha sido borrada", - "watchlist-details": "Hay {{PLURAL:$1|$1 página|$1 páginas}} en tu lista de seguimiento (más las páginas de discusión).", + "watchlist-details": "Hay {{PLURAL:$1|una página|$1 páginas}} en tu lista de seguimiento (más las páginas de discusión).", "wlheader-enotif": "La notificación por correo está activada.", "wlheader-showupdated": "Las páginas modificadas desde tu última visita aparecen en negrita.", "wlnote": "A continuación {{PLURAL:$1|se muestra el último cambio|se muestran los últimos $1 cambios}} en {{PLURAL:$2|la última hora|las últimas $2 horas}} a fecha de $4 $3.", @@ -2349,7 +2360,7 @@ "enotif_lastvisited": "Consulta $1 para ver todos los cambios desde tu última visita", "enotif_lastdiff": "Consulta $1 para ver este cambio", "enotif_anon_editor": "usuario anónimo $1", - "enotif_body": "Hola, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumen del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacta al editor:\ncorreo: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo enviaremos más notificaciones si ocurre más actividad, a menos que visites esta página con la sesión iniciada. También puedes restablecer los estados de notificación para todas las páginas en tu lista de seguimiento.\n\nAtentamente, el sistema de notificaciones de {{SITENAME}}\n\n--\nPara cambiar tus ajustes de notificación por correo, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara cambiar los ajustes de tu lista de seguimiento, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara quitar la página de tu lista de seguimiento, visita\n$UNWATCHURL\n\nPara ayuda y comentarios:\n$HELPPAGE", + "enotif_body": "Hola, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumen del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacta con el editor:\ncorreo: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo enviaremos más notificaciones si ocurre más actividad, a menos que visites esta página con la sesión iniciada. También puedes restablecer los estados de notificación para todas las páginas en tu lista de seguimiento.\n\nAtentamente, el sistema de notificaciones de {{SITENAME}}\n\n--\nPara cambiar tus ajustes de notificación por correo, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara cambiar los ajustes de tu lista de seguimiento, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara quitar la página de tu lista de seguimiento, visita\n$UNWATCHURL\n\nPara ayuda y comentarios:\n$HELPPAGE", "enotif_minoredit": "Esta es una edición menor", "created": "creada", "changed": "modificada", @@ -2418,7 +2429,7 @@ "logentry-contentmodel-change-revertlink": "revertir", "logentry-contentmodel-change-revert": "revertir", "protectlogpage": "Registro de protección", - "protectlogtext": "Abajo se presenta una lista de protección y desprotección de página.\nVéase [[Special:ProtectedPages|la lista de páginas protegidas]] para ver las protecciones activas en páginas.", + "protectlogtext": "A continuación se muestra una lista de cambios en la protección de páginas.\nConsulta [[Special:ProtectedPages|la lista de páginas protegidas]] para ver la lista de páginas actualmente protegidas.", "protectedarticle": "protegió «[[$1]]»", "modifiedarticleprotection": "cambió el nivel de protección de «[[$1]]»", "unprotectedarticle": "desprotegió la página «[[$1]]»", @@ -2435,8 +2446,8 @@ "protect-norestrictiontypes-title": "Página no protegible", "protect-legend": "Confirmar protección", "protectcomment": "Motivo:", - "protectexpiry": "Caducidad:", - "protect_expiry_invalid": "Tiempo de caducidad incorrecto.", + "protectexpiry": "Expira:", + "protect_expiry_invalid": "Tiempo de expiración incorrecto.", "protect_expiry_old": "El tiempo de expiración está en el pasado.", "protect-unchain-permissions": "Desbloquear opciones de protección adicionales", "protect-text": "Aquí puedes ver y modificar el nivel de protección de la página $1.", @@ -2449,13 +2460,13 @@ "protect-level-autoconfirmed": "Solo usuarios autoconfirmados", "protect-level-sysop": "Solo administradores", "protect-summary-cascade": "en cascada", - "protect-expiring": "caduca el $1 (UTC)", - "protect-expiring-local": "caduca el $1", + "protect-expiring": "expira el $1 (UTC)", + "protect-expiring-local": "expira el $1", "protect-expiry-indefinite": "indefinido", "protect-cascade": "Protección en cascada - proteger todas las páginas incluidas en ésta.", "protect-cantedit": "No puedes cambiar el nivel de protección de esta página porque no tienes permiso para editarla.", - "protect-othertime": "Especificar caducidad:", - "protect-othertime-op": "otra (especificar)", + "protect-othertime": "En otro momento:", + "protect-othertime-op": "en otro momento", "protect-existing-expiry": "Fecha de caducidad actual: $2 a las $3", "protect-existing-expiry-infinity": "Tiempo de caducidad existente: infinito", "protect-otherreason": "Otra razón:", @@ -2530,6 +2541,7 @@ "uctop": "(edición actual)", "month": "Desde el mes (y anteriores):", "year": "Desde el año (y anteriores):", + "date": "Desde el día (y anteriores):", "sp-contributions-newbies": "Mostrar solo las contribuciones de usuarios nuevos", "sp-contributions-newbies-sub": "Para cuentas nuevas", "sp-contributions-newbies-title": "Contribuciones de usuarios nuevos", @@ -2581,7 +2593,7 @@ "ipbemailban": "Impedir que el usuario envíe correo electrónico", "ipbenableautoblock": "Bloquear automáticamente la última dirección IP usada por este usuario y cualquier IP posterior desde la cual intente editar", "ipbsubmit": "Bloquear a este usuario", - "ipbother": "Especificar caducidad", + "ipbother": "Otra duración o fecha:", "ipboptions": "2 horas:2 hours,1 día:1 day,3 días:3 days,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year,para siempre:infinite", "ipbhidename": "Ocultar nombre de usuario de ediciones y listas", "ipbwatchuser": "Vigilar las páginas de usuario y de discusión de este usuario", @@ -2621,7 +2633,7 @@ "blocklist-tempblocks": "Ocultar bloqueos temporales", "blocklist-addressblocks": "Ocultar bloqueos de una sola dirección IP", "blocklist-rangeblocks": "Ocultar bloqueos por intervalo", - "blocklist-timestamp": "Fecha y hora", + "blocklist-timestamp": "Marca de tiempo", "blocklist-target": "Destino", "blocklist-expiry": "Caduca", "blocklist-by": "Administrador que realizó el bloqueo", @@ -3544,7 +3556,7 @@ "watchlistedit-raw-removed": "{{PLURAL:$1|Una página ha sido borrada|$1 páginas han sido borradas}}:", "watchlistedit-clear-title": "Vaciar la lista de seguimiento", "watchlistedit-clear-legend": "Vaciar la lista de seguimiento", - "watchlistedit-clear-explain": "Se quitarán todos los títulos de la lista de seguimiento", + "watchlistedit-clear-explain": "Se quitarán todos los títulos de tu lista de seguimiento", "watchlistedit-clear-titles": "Títulos:", "watchlistedit-clear-submit": "Vaciar la lista de seguimiento (¡permanente!)", "watchlistedit-clear-done": "Se ha vaciado tu lista de seguimiento.", @@ -3570,7 +3582,7 @@ "version-editors": "Editores", "version-antispam": "Prevención de spam", "version-other": "Otro", - "version-mediahandlers": "Manipuladores multimedia", + "version-mediahandlers": "Manejadores de medios", "version-hooks": "Extensiones", "version-parser-extensiontags": "Etiquetas de extensiones sintácticas", "version-parser-function-hooks": "Extensiones de funciones sintácticas", @@ -4177,6 +4189,7 @@ "edit-error-long": "Errores:\n\n$1", "revid": "revisión $1", "pageid": "ID de página $1", + "interfaceadmin-info": "$1\n\nLos permisos para editar las páginas de configuración con formato CSS, JS y JSON han sido recientemente segregados del permiso editinterface. Si no comprendes por qué recibes este error, por favor lee [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "No se pueden emplear las etiquetas <html> si no es en las páginas normales.", "gotointerwiki": "Salir de {{SITENAME}}", "gotointerwiki-invalid": "El título especificado no es válido.", diff --git a/languages/i18n/eu.json b/languages/i18n/eu.json index e425e94c9e..7248b62c1d 100644 --- a/languages/i18n/eu.json +++ b/languages/i18n/eu.json @@ -380,6 +380,9 @@ "customcssprotected": "Ez duzu baimenik CSS orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.", "customjsonprotected": "Ez duzu baimenik JSON orrialde hau editatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.", "customjsprotected": "Ez duzu baimenik JavaScript orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.", + "sitecssprotected": "Ez daukazu CSS orri hau aldatzeko baimenik bisitari guztiei eragin diezaiekeelako", + "sitejsonprotected": "Ez daukazu JSON orri hau aldatzeko baimenik bisitari guztiei eragin diezaiekeelako", + "sitejsprotected": "Ez daukazu JavaScript orri hau aldatzeko baimenik bisitari guztiei eragin diezaiekeelako", "mycustomcssprotected": "Ez duzu baimenik CSS orrialde hau aldatzeko.", "mycustomjsonprotected": "Ez duzu baimenik JSON orrialde hau aldatzeko.", "mycustomjsprotected": "Ez duzu baimentik JavaScript orrialdea aldatzeko.", @@ -1139,6 +1142,7 @@ "group-autoconfirmed": "Lankide autokonfirmatuak", "group-bot": "Bot-ak", "group-sysop": "Administratzaileak", + "group-interface-admin": "Interfazeko administratzaileak", "group-bureaucrat": "Burokratak", "group-suppress": "Gainikupenak", "group-all": "(guztiak)", @@ -1146,12 +1150,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|baieztatutako lankidea}}", "group-bot-member": "{{GENDER:$1|bot-a}}", "group-sysop-member": "{{GENDER:$1|administratzailea}}", + "group-interface-admin-member": "{{GENDER:$1|interfazeko administratzailea}}", "group-bureaucrat-member": "{{GENDER:$1|burokrata}}", "group-suppress-member": "{{GENDER:$1|ezabatzailea}}", "grouppage-user": "{{ns:project}}:Lankideak", "grouppage-autoconfirmed": "{{ns:project}}:Erabiltzaile autokonfirmatuak", "grouppage-bot": "{{ns:project}}:Bot-ak", "grouppage-sysop": "{{ns:project}}:Administratzaileak", + "grouppage-interface-admin": "{{ns:project}}:Interfazeko administratzaileak", "grouppage-bureaucrat": "{{ns:project}}:Burokratak", "grouppage-suppress": "{{ns:project}}:Ezabatzea", "right-read": "Irakurri orriak", @@ -1742,6 +1748,7 @@ "http-timed-out": "HTTP eskaera iraungi da.", "http-curl-error": "Errorea URLa bilatzerakoan: $1", "http-bad-status": "Arazo bat egon da HTTP eskaera bitartean: $1 $2", + "http-internal-error": "HTTP barneko errorea.", "upload-curl-error6": "Ezin izan da URLa eskuratu", "upload-curl-error6-text": "Ezin da emandako URLa eskuratu. Mesedez, ziurtatu URLa zuzena dela eta gunea eskuragarri dagoela.", "upload-curl-error28": "Denbora gehiegi igotzerakoan", diff --git a/languages/i18n/fi.json b/languages/i18n/fi.json index bd1e00a76b..c55acd3369 100644 --- a/languages/i18n/fi.json +++ b/languages/i18n/fi.json @@ -418,6 +418,7 @@ "ns-specialprotected": "Toimintosivuja ei voi muokata.", "titleprotected": "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.\nSuojauksen syy on: $2.", "filereadonlyerror": "Tiedostoa \"$1\" ei voida muuttaa, koska jaettu mediavarasto \"$2\" on asetettu tilaan ''vain lukeminen sallittu''.\n\nTietokannan lukinneen palvelinjärjestelmän ylläpitäjän antama selitys on: $3.", + "invalidtitle": "Virheellinen sivun nimi", "invalidtitle-knownnamespace": "Virheellinen sivunimi, nimiavaruus \"$2\" ja teksti \"$3\"", "invalidtitle-unknownnamespace": "Virheellinen sivunimi, tuntematon nimiavaruus numero $1 ja teksti \"$2\"", "exception-nologin": "Et ole kirjautunut sisään", @@ -1235,9 +1236,9 @@ "right-editusercss": "Muokata toisten käyttäjien CSS-tiedostoja", "right-edituserjson": "Muokata toisten käyttäjien JSON-tiedostoja", "right-edituserjs": "Muokata toisten käyttäjien JavaScript-tiedostoja", - "right-editsitecss": "muokata CSS-koodia koko sivustolla", - "right-editsitejson": "muokata JSON-koodia koko sivustolla", - "right-editsitejs": "muokata JavaScriptiä koko sivustolla", + "right-editsitecss": "Muokata CSS-koodia koko sivustolla", + "right-editsitejson": "Muokata JSON-koodia koko sivustolla", + "right-editsitejs": "Muokata JavaScriptiä koko sivustolla", "right-editmyusercss": "Muokata omia CSS-tiedostoja", "right-editmyuserjson": "Muokkaa omia JSON-tiedostoja", "right-editmyuserjs": "Muokata omia JavaScript-tiedostoja", @@ -1411,7 +1412,7 @@ "rcfilters-clear-all-filters": "Tyhjennä kaikki suodattimet", "rcfilters-show-new-changes": "Näytä uusimmat muutokset", "rcfilters-search-placeholder": "Suodata muutoksia (käytä valikkoa tai etsi suodattimen nimeä)", - "rcfilters-invalid-filter": "Virheellinen suodatin", + "rcfilters-invalid-filter": "Kelvoton suodatin", "rcfilters-empty-filter": "Ei aktiivisia suodattimia. Kaikki muutokset näytetään.", "rcfilters-filterlist-title": "Suodattimet", "rcfilters-filterlist-whatsthis": "Miten nämä toimivat?", @@ -1451,10 +1452,10 @@ "rcfilters-filter-reviewstatus-manual-label": "Manuaalisesti partioitu", "rcfilters-filter-reviewstatus-auto-description": "Muutokset edistyneiltä käyttäjiltä joiden työ on automaattisesti merkitty partioiduksi.", "rcfilters-filter-reviewstatus-auto-label": "Automaattisesti partioitu", - "rcfilters-filtergroup-significance": "Merkitys", + "rcfilters-filtergroup-significance": "Oleellisuus", "rcfilters-filter-minor-label": "Pienet muutokset", "rcfilters-filter-minor-description": "Muokkaukset, jotka on merkitty pieniksi.", - "rcfilters-filter-major-label": "Ei-pienet muutokset", + "rcfilters-filter-major-label": "Muut kuin pienet muutokset", "rcfilters-filter-major-description": "Muokkaukset, joita ei ole merkitty pieniksi.", "rcfilters-filtergroup-watchlist": "Tarkkailulistalla olevat sivut", "rcfilters-filter-watchlist-watched-label": "Tarkkailulistalla", @@ -1474,7 +1475,7 @@ "rcfilters-filter-newpages-label": "Sivujen luonnit", "rcfilters-filter-newpages-description": "Muokkaukset, joilla on luotu uusia sivuja.", "rcfilters-filter-categorization-label": "Luokkamuutokset", - "rcfilters-filter-categorization-description": "Tulokset sivuista, joita on lisätty tai poistettu luokista.", + "rcfilters-filter-categorization-description": "Tulokset sivuista, joita on lisätty luokkiin tai poistettu luokista.", "rcfilters-filter-logactions-label": "Lokitoiminnot", "rcfilters-filter-logactions-description": "Ylläpidolliset toimet, tunnusten luonnit, sivujen poistot, tiedostolataukset…", "rcfilters-hideminor-conflicts-typeofchange-global": "\"Pienet muutokset\" -suodatin on ristiriidassa yhden tai useamman Muutoksen tyyppi suodattimen kanssa, koska joitain muutostyyppejä ei voida pitää \"pieninä\". Ristiriidassa oleva suodatin on merkittynä Aktiivisissa suodattimissa, yläpuolella.", @@ -1484,7 +1485,7 @@ "rcfilters-filter-lastrevision-label": "Viimeisin versio", "rcfilters-filter-lastrevision-description": "Vain viimeisin muutos sivuun.", "rcfilters-filter-previousrevision-label": "Ei viimeisin muutos", - "rcfilters-filter-previousrevision-description": "Kaikki muutokset, jotka eivät ole viimeisin versio.", + "rcfilters-filter-previousrevision-description": "Kaikki muutokset, jotka eivät ole \"viimeisin versio\".", "rcfilters-filter-excluded": "Poissuljettu", "rcfilters-tag-prefix-namespace-inverted": ":ei $1", "rcfilters-exclude-button-off": "Poissulje valitut", @@ -1765,7 +1766,7 @@ "uploadstash-zero-length": "Tiedoston pituus on nolla.", "invalid-chunk-offset": "Kelpaamaton siirtymä lohkoissa", "img-auth-accessdenied": "Pääsy estetty", - "img-auth-nopathinfo": "PATH_INFO puuttuu.\nPalvelintasi ei ole asetettu välittämään tätä tietoa.\nSe saattaa olla CGI-pohjainen eikä voi tukea img_authia.\nLisätietoja löytyy sivulta https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", + "img-auth-nopathinfo": "Polkutiedot puuttuvat.\nPalvelimesi tulee olla määritelty välittämään REQUEST_URI- ja/tai PATH_INFO-muuttujat.\nJos näin on, kokeile ottaa $wgUsePathInfo käyttöön.\nLisätietoja löytyy sivulta https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", "img-auth-notindir": "Pyydetty polku ei ole asetuksissa tiedostojen tallennushakemistona.", "img-auth-badtitle": "”$1” ei kelpaa oikean otsikon muodostamiseen.", "img-auth-nologinnWL": "Et ole kirjautunut sisään ja tiedosto ”$1” ei ole sallittujen tiedostojen luettelossa.", @@ -2105,7 +2106,7 @@ "cachedspecial-refresh-now": "Näytä uusin versio.", "categories": "Luokat", "categories-submit": "Näytä", - "categoriespagetext": "{{PLURAL:$1|Seuraava luokka sisältää|Seuraavat luokat sisältävät}} sivuja tai mediatiedostoja.\n[[Special:UnusedCategories|Käyttämättömiä luokkia]] ei näytetä.\nKatso myös [[Special:WantedCategories|halutut luokat]].", + "categoriespagetext": "{{PLURAL:$1|Seuraava luokka on|Seuraavat luokat ovat}} olemassa wikissä, ja saattavat olla käytettyjä tai käyttämättömiä.\nKatso myös [[Special:WantedCategories|halutut luokat]].", "categoriesfrom": "Näytä alkaen luokasta", "deletedcontributions": "Poistetut muokkaukset", "deletedcontributions-title": "Poistetut muokkaukset", diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json index 92d6ee5bb1..cdc118c866 100644 --- a/languages/i18n/fr.json +++ b/languages/i18n/fr.json @@ -530,6 +530,7 @@ "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 $2.", "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": "Titre non valide", "invalidtitle-knownnamespace": "Titre non valide avec l’espace de noms « $2 » et l’intitulé « $3 »", "invalidtitle-unknownnamespace": "Titre non valide avec le numéro d’espace de noms $1 inconnu et l’intitulé « $2 »", "exception-nologin": "Non connecté", @@ -1495,7 +1496,7 @@ "recentchanges-legend-plusminus": "(''±123'')", "recentchanges-submit": "Lister", "rcfilters-tag-remove": "Supprimer « $1 »", - "rcfilters-legend-heading": "Liste des abréviations : ", + "rcfilters-legend-heading": "Liste des abréviations : ", "rcfilters-other-review-tools": "Autres outils de relecture", "rcfilters-group-results-by-page": "Grouper les résultats par page", "rcfilters-activefilters": "Filtres actifs", @@ -1949,8 +1950,8 @@ "filehist-comment": "Commentaire", "imagelinks": "Utilisation du fichier", "linkstoimage": "{{PLURAL:$1|La page suivante utilise|Les $1 pages suivantes utilisent}} ce fichier :", - "linkstoimage-more": "Plus {{PLURAL:$1|d'une page utilise|de $1 pages utilisent}} ce fichier.\nLa liste suivante affiche seulement {{PLURAL:$1|la première page qui utilise|les $1 premières pages qui utilisent}} ce fichier.\nUne [[Special:WhatLinksHere/$2|liste complète]] est disponible.", - "nolinkstoimage": "Aucune page n'utilise ce fichier.", + "linkstoimage-more": "Plus {{PLURAL:$1|d’une page utilise|de $1 pages utilisent}} ce fichier.\nLa liste suivante affiche seulement {{PLURAL:$1|la première page qui utilise|les $1 premières pages qui utilisent}} ce fichier.\nUne [[Special:WhatLinksHere/$2|liste complète]] est disponible.", + "nolinkstoimage": "Aucune page n’utilise ce fichier.", "morelinkstoimage": "Voir [[Special:WhatLinksHere/$1|plus de liens]] vers ce fichier.", "linkstoimage-redirect": "$1 (redirection de fichier) $2", "duplicatesoffile": "{{PLURAL:$1|Le fichier suivant est un doublon|Les $1 fichiers suivants sont des doublons}} de celui-ci ([[Special:FileDuplicateSearch/$2|plus de détails]]) :", @@ -2229,7 +2230,7 @@ "cachedspecial-refresh-now": "Voir le plus récent.", "categories": "Liste des catégories", "categories-submit": "Lister", - "categoriespagetext": "{{PLURAL:$1|La catégorie suivante est utilisée|Les catégories suivantes sont utilisées}} par des pages ou fichiers.\n[[Special:UnusedCategories|Les catégories inutilisées]] ne sont pas affichées ici.\nVoyez aussi [[Special:WantedCategories|les catégories demandées]].", + "categoriespagetext": "Sur le wiki, {{PLURAL:$1|la catégorie suivante existe et peut ou non être inutilisée|Les catégories suivantes existent et peuvent ou non être inutilisées}}.\nVoir aussi [[Special:WantedCategories|Les catégories demandées]].", "categoriesfrom": "Afficher les catégories à partir de :", "deletedcontributions": "Contributions supprimées", "deletedcontributions-title": "Contributions supprimées", @@ -2982,7 +2983,7 @@ "lastmodifiedatby": "Cette page a été modifiée pour la dernière fois le $1 à $2 par $3.", "othercontribs": "Basé sur le travail de $1.", "others": "autres", - "siteusers": "{{PLURAL:$2|{{GENDER:$1|l’utilisateur|l’utilisatrice}}|{{Gender:$1|les utilisateurs|les utilisatrices}}}} $1 de {{SITENAME}}", + "siteusers": "{{PLURAL:$2|{{GENDER:$1|l’utilisateur|l’utilisatrice}}|{{GENDER:$1|les utilisateurs|les utilisatrices}}}} $1 de {{SITENAME}}", "anonusers": "{{PLURAL:$2|l'utilisateur anonyme|les utilisateurs anonymes}} $1 de {{SITENAME}}", "creditspage": "Crédits de la page", "nocredits": "Il n'y a pas d'informations d'attribution disponibles pour cette page.", diff --git a/languages/i18n/frr.json b/languages/i18n/frr.json index dffd28bafa..adda095842 100644 --- a/languages/i18n/frr.json +++ b/languages/i18n/frr.json @@ -50,7 +50,7 @@ "tog-watchlisthideminor": "Letj feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg", "tog-watchlisthideliu": "Feranrangen faan uunmeldet brükern bi sidjen, diar ik uun't uug behual wal, fersteeg", "tog-watchlistreloadautomatically": "List mä sidjen, diar dü uun't uug behual wel, nei loose, wan en filter anert wurden as (brükt JavaScript)", - "tog-watchlistunwatchlinks": "Direkt ferwisangen tu Uunlukin/Ei uunlukin bi iindracher uun det list faan sidjen, diar dü uun't uug behual wel (brükt JavaScript)", + "tog-watchlistunwatchlinks": "Direkt ferwisangen tu {{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}} bi iindracher uun det list faan sidjen, diar dü uun't uug behual wel (brükt JavaScript)", "tog-watchlisthideanons": "Feranrangen faan anonüüm brükern (IPs) bi sidjen, diar ik uun't uug behual wal, fersteeg", "tog-watchlisthidepatrolled": "Kontroliaret feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg", "tog-watchlisthidecategorization": "Kategorisiarang faan sidjen fersteeg", @@ -455,7 +455,7 @@ "nosuchusershort": "Diar as nään brüker mä di nööm \"$1\".\nHeest dü ham uk rocht skrewen?", "nouserspecified": "Dü skel en brükernööm uundu.", "login-userblocked": "Didiar brüker as speret wurden. Hi mut ham ei uunmelde.", - "wrongpassword": "Det paaswurd as ferkiard.\nWees so gud an ferschük det noch ans.", + "wrongpassword": "Di brükernööm of det paaswurd as ferkiard.\nWees so gud an ferschük det noch ans.", "wrongpasswordempty": "Dü heest nian paaswurd iinden.\nFerschük det man noch ans.", "passwordtooshort": "Paaswurden skel tumanst {{PLURAL:$1|1 tiaken|$1 tiakens}} lung wees.", "passwordtoolong": "Paaswurden kön ei linger üs {{PLURAL:$1|1 tiaken|$1 tiakens}} wees.", @@ -464,7 +464,7 @@ "password-login-forbidden": "Didiar brükernööm mä detdiar paaswurd as ei tuläät.", "mailmypassword": "Paaswurd turagsaat", "passwordremindertitle": "Nei tidjwiis paaswurd för {{SITENAME}}", - "passwordremindertext": "En brüker (woorskiinelk dü, faan IP adres $1) hää am en nei paaswurd för {{SITENAME}} ($4) fraaget.\nEn nei paaswurd för di brüker \"$2\" as maaget wurden an het nü \"$3\".\n\nWan dü det würelk so haa wel, do melde di nü uun an feranere det paaswurd. Det nei paaswurd täält för {{PLURAL:$5|ään dai|$5 daar}}.\n\nWan dü ei salew am en nei paaswurd fraaget heest, do säärst dü di am niks widjer komre. Do könst dü din ual paaswurd widjer brük.", + "passwordremindertext": "En brüker (faan IP adres $1) hää am en nei paaswurd för {{SITENAME}} ($4) fraaget.\nEn nei paaswurd för di brüker \"$2\" as maaget wurden an het nü \"$3\".\n\nWan dü det würelk so haa wel, do melde di nü uun an feranere det paaswurd. Det nei paaswurd täält för {{PLURAL:$5|ään dai|$5 daar}}.\n\nWan dü ei salew am en nei paaswurd fraaget heest, do säärst dü di am niks widjer komre. Do könst dü din ual paaswurd widjer brük.", "noemail": "Diar as nian e-mail adres bekäänd för di brüker \"$1\".", "noemailcreate": "Dü skel en rocht e-mail adres uundu.", "passwordsent": "En nei tidjwiis paaswurd as tu det e-mail-adres faan di brüker \"$1\" schüürd wurden.\nMelde di diarmä uun, wan dü det füngen heest. Det ual paaswurd blaft iarst ans bestunen.", @@ -548,8 +548,8 @@ "resetpass-temp-password": "Tidjwiis paaswurd:", "resetpass-abort-generic": "Det paaswurd-anerang as ferhanert wurden.", "resetpass-expired": "Din paaswurd as uflepen. Wees so gud an lei en nei paaswurd fääst.", - "resetpass-expired-soft": "Din paaswurd as uflepen an skal turagsaat wurd. Wees so gud an lei en nei paaswurd fääst of trak üüb \"{{int:authprovider-resetpass-skip-label}}\", am det leeder turag tu saaten.", - "resetpass-validity-soft": "Din paaswurd gongt ei: $1\n\nWees so gud an lei en nei paaswurd fääst, of trak üüb \"{{int:authprovider-resetpass-skip-label}}\" am det leeder turag tu saaten.", + "resetpass-expired-soft": "Din paaswurd as uflepen an skal feranert wurd. Wees so gud an lei en nei paaswurd fääst of trak üüb \"{{int:authprovider-resetpass-skip-label}}\", am det leeder tu feranrin.", + "resetpass-validity-soft": "Din paaswurd gongt ei: $1\n\nWees so gud an lei en nei paaswurd fääst, of trak üüb \"{{int:authprovider-resetpass-skip-label}}\" am det leeder tu feranrin.", "passwordreset": "Paaswurd turagsaat", "passwordreset-text-one": "Fal detheer formulaar ütj, am din paaswurd turag tu saaten.", "passwordreset-text-many": "{{PLURAL:$1|Fal ian faan jodiat fialen ütj, am en tidjwiis paaswurd tuschüürd tu fun.}}", @@ -619,14 +619,14 @@ "anonpreviewwarning": "\"Dü beest ei uunmeldet. Bi't seekrin woort din IP-adres uun a ferluup faan werjuunen aptiakent.\"", "missingsummary": "'''Paase üüb:''' Dü heest det ei tuupfaadet.\nWan dü det sidj seekerst, woort det saner en kurtfaadet beskriiwang auernimen.", "selfredirect": "Paase üüb: Dü feerst detheer sidj tu detsalew sidj widjer.\nDü heest was det ferkiard mual uunden, of dü bewerkest det ferkiard sidj.\nWan dü noch ans üüb „$1“ trakst, woort det widjerfeerang likes iinracht.", - "missingcommenttext": "Faade det oner tuup.", + "missingcommenttext": "Skriiw en komentaar.", "missingcommentheader": "Paase üüb: Dü heest nian teemo uunden. Wan dü noch ans üüb „$1“ trakst, woort din feranrang saner auerskraft seekert.", "summary-preview": "Föörskau faan det tuupfaadang:", "subject-preview": "Föörskau faan det auerskraft:", "previewerrortext": "Diar as wat skiaf gingen, üs en föörskau faan din feranrangen wiset wurd skul.", "blockedtitle": "Brüker as speret", - "blockedtext": "'''Dan brükernööm of din IP-adres as speret wurden.'''\n\nDet as maaget wurden faan $1.\nDi grünj as ''$2''.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun 'E-mail tu didiar brüker' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.", - "autoblockedtext": "'''Din IP-adres as speret wurden, auer det faan en öödern spereten brüker brükt wurden as.'''\n\nDi grünj as:\n: ''$2''.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun 'E-mail tu didiar brüker' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.", + "blockedtext": "Dan brükernööm of din IP-adres as speret wurden.\n\nDet as maaget wurden faan $1.\nDi grünj as $2.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun '{{int:emailuser}}' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.", + "autoblockedtext": "'''Din IP-adres as speret wurden, auer det faan en öödern spereten brüker brükt wurden as.'''\n\nDi grünj as:\n: $2.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun '{{int:emailuser}}' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.", "blockednoreason": "nään grünj uunden", "whitelistedittext": "Dü skel di $1, am sidjen tu bewerkin.", "confirmedittext": "Dü skel iarst din e-mail-adres gudkään, iar dü began könst tu werkin. Maage det üüb det sidj mä din persöönelk [[Special:Preferences|iinstelangen]].", @@ -653,7 +653,7 @@ "userjspreview": "'''Seenk diaram, dat det bluas en föörskau faan din JavaScript as.'''\n'''Det as noch ei seekert wurden!'''", "sitecsspreview": "Paase üüb! Det as bluas en föörskau faan't CSS. Det as noch ei seekert wurden!", "sitejspreview": "Paase üüb! Det as bluas en föörskau faan di JavaScript code. Det as noch ei seekert wurden!", - "userinvalidconfigtitle": "''Paase üüb:''' Skak \"$1\" jaft at ei.\nSeenk diaram, dat faan en brüker iinracht .css- an .js-sidjen mä en letjen buksteew began skel. Bispal:\n''{{ns:user}}:Münsterkjarl/vector.css'' uunsteed faan ''{{ns:user}}:Münsterkjarl/Vector.css''.", + "userinvalidconfigtitle": "Paase üüb: Skak \"$1\" jaft at ei.\nSeenk diaram, dat faan en brüker iinracht .css-, .json an .js-sidjen mä en letjen buksteew began skel. Bispal:\n''{{ns:user}}:Münsterkjarl/vector.css'' uunsteed faan ''{{ns:user}}:Münsterkjarl/Vector.css''.", "updated": "(Feranert)", "note": "'''Paase üüb:'''", "previewnote": "'''Heer könst dü sä, hü det sidj wurd skal.'''\nDet sidj as oober noch ei seekert!", @@ -680,7 +680,7 @@ "longpageerror": "'''Error: Dan tekst as {{PLURAL:$1|ian kilobyte|$1 kilobytes}} lung, hi mut oober ei linger wees üs {{PLURAL:$2|ian kilobyte|$2 kilobytes}}.'''Hi koon ei ufspiikerd wurd.", "readonlywarning": "Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd. Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.\n\nGrünj för det sper: $1", "protectedpagewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det bewerke.'''\nUun't logbuk stäänt muar diartu:", - "semiprotectedpagewarning": "'''Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.'''\nUun't logbuk stäänt muar diartu:", + "semiprotectedpagewarning": "Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.\nUun't logbuk stäänt muar diartu:", "cascadeprotectedwarning": "Paase üüb: Detdiar sidj koon bluas faan brükern mä [[Special:ListGroupRights|aparte rochten]] bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaadensper seekert {{PLURAL:$1|as|san}}:", "titleprotectedwarning": "'''Paase üüb: \"Detdiar sidj mä didiar nööm koon ei faan arken bewerket wurd. Bluas enkelt brükern mä [[Special:ListGroupRights|was brükerrochten]] kön detdiar sidj nei maage of bewerke.'''\nUun't logbuk stäänt muar diartu:", "templatesused": "{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} üüb detdiar sidj brükt:", @@ -981,8 +981,8 @@ "recentchangesdays": "Soföl daar skel a „leetst feranrangen“ uunwise:", "recentchangesdays-max": "Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}", "recentchangescount": "Soföl feranrangen skel uunwiset wurd:", - "prefs-help-recentchangescount": "Det san a leetst feranrangen, werjuunen an logbuken.", - "prefs-help-watchlist-token2": "Detdiar as di hiamelk kai för't webfeed mä sidjen, diar dü uun't uug behual wel.\nMä didiar kai koon arken jodiar sidjen beluke, diaram skulst dü ham ei widjerdu.\n[[Special:ResetTokens|Trak diar]], wan dü ham turagsaat wel.", + "prefs-help-recentchangescount": "Maximaal uuntaal: 1000", + "prefs-help-watchlist-token2": "Detdiar as di hiamelk kai för't webfeed mä sidjen, diar dü uun't uug behual wel.\nMä didiar kai koon arken jodiar sidjen beluke, diaram skulst dü ham ei widjerdu.\nWan nuadag, [[Special:ResetTokens|trak diar]], wan dü ham turagsaat wel.", "savedprefs": "Din iinstelangen san seekert wurden.", "savedrights": "A brükersköölen faan {{GENDER:$1|$1}} san seekert wurden.", "timezonelegend": "Tidjsoon:", @@ -1010,7 +1010,7 @@ "prefs-files": "Datein", "prefs-custom-css": "Salew maaget CSS", "prefs-custom-js": "Salew maaget JavaScript", - "prefs-common-config": "CSS / JavaScript för arke skak:", + "prefs-common-config": "CSS/Jason/JavaScript för arke skak:", "prefs-reset-intro": "Üüb detdiar sidj könst dü weder a normool iinstelangen iinracht.\nDo san jo ual iinstelangen wech.", "prefs-emailconfirm-label": "E-Mail gudkäänd:", "youremail": "E-mail:", @@ -1086,6 +1086,7 @@ "group-autoconfirmed": "Registriaret brükern", "group-bot": "Bots", "group-sysop": "Administratooren", + "group-interface-admin": "Skakadministratooren", "group-bureaucrat": "Bürokraaten", "group-suppress": "Fersteeger", "group-all": "(Aal a)", @@ -1093,12 +1094,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|Registriaret brüker}}", "group-bot-member": "{{GENDER:$1|Bot}}", "group-sysop-member": "{{GENDER:$1|Administraator}}", + "group-interface-admin-member": "{{GENDER:$1|Skakadministraator}}", "group-bureaucrat-member": "{{GENDER:$1|Bürokraat}}", "group-suppress-member": "{{GENDER:$1|Fersteeger}}", "grouppage-user": "{{ns:project}}:Brükern", "grouppage-autoconfirmed": "{{ns:project}}:Registriaret brükern", "grouppage-bot": "{{ns:project}}:Bots", "grouppage-sysop": "{{ns:project}}:Administratooren", + "grouppage-interface-admin": "{{ns:project}}:Skakadministratooren", "grouppage-bureaucrat": "{{ns:project}}:Bürokraaten", "grouppage-suppress": "{{ns:project}}:Fersteeg", "right-read": "Sidjen lees", @@ -1293,7 +1296,7 @@ "recentchangeslinked-feed": "Feranrangen bi ferlinket sidjen", "recentchangeslinked-toolbox": "Feranrangen bi ferlinket sidjen", "recentchangeslinked-title": "Feranrangen bi sidjen, huar faan \"$1\" üüb ferwiset woort", - "recentchangeslinked-summary": "Skriiw en sidjennööm hen, am feranrangen üüb sidjen tu sen, diar üüb det sidj henwise of faan det sidj wechwise.\nAm iindracher uun en kategorii tu sen, skriiw 'Kategorie:Nööm faan't kategorii' hen.\nFeranrangen bi sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, san fäät skrewen.", + "recentchangeslinked-summary": "Skriiw en sidjennööm hen, am feranrangen üüb sidjen tu sen, diar üüb det sidj henwise of faan det sidj wechwise.\nAm iindracher uun en kategorii tu sen, skriiw '{{ns:category}}:Nööm faan't kategorii' hen.\nFeranrangen bi sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, san fäät skrewen.", "recentchangeslinked-page": "Sidjennööm:", "recentchangeslinked-to": "Wise feranrangen üüb sidjen, diar heerhen ferwise.", "recentchanges-page-added-to-category": "[[:$1]] tu kategorii saat", @@ -1435,7 +1438,7 @@ "lockmanager-fail-closelock": "Det sperdatei för „$1“ küd ei slööden wurd.", "lockmanager-fail-deletelock": "Det sperdatei för „$1“ küd ei stregen wurd.", "lockmanager-fail-acquirelock": "Det sper för „$1“ küd ei ufrepen wurd.", - "lockmanager-fail-openlock": "Det sperdatei för „$1“ küd ei eeben maaget wurd.", + "lockmanager-fail-openlock": "Det sperdatei för „$1“ küd ei eeben maaget wurd. Stel seeker, dat din fertiaknis för't huuchloosin rocht iinracht as, an dat dan webserver diar üüb tugrip mut. Luke diar: https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory wan dü muar wed wel.", "lockmanager-fail-releaselock": "Det sper för „$1“ küd ei apliaset wurd.", "lockmanager-fail-db-bucket": "Mä $1 küd ei nooch ferbinjangen tu sperdootenbeenken iinracht wurd.", "lockmanager-fail-db-release": "A speren uun't dootenbeenk $1 küd ei apliaset wurd.", @@ -1454,7 +1457,7 @@ "uploadstash-refresh": "List mä datein aktualisiare.", "invalid-chunk-offset": "Di began as diar ei tuläät.", "img-auth-accessdenied": "Tugrip ei mögelk", - "img-auth-nopathinfo": "Diar as nään PATH_INFO.\nDi server koon detdiar informatjuun ei widjerdu.\nFerlicht as det uun CGI iinbünjen an komt diaram uk ei mä „img_auth“ turocht.\nÜüb det sidj https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (ingelsk) stäänt diar muar auer.", + "img-auth-nopathinfo": "Diar as nian informatjuun auer di wai.\nDan server skal so iinracht wees, dat a wariaabeln REQUEST_URI an/of PATH_INFO auerden wurd.\nWan det tudraapt, aktiwiare $wgUsePathInfo.\nÜüb det sidj https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (ingelsk) stäänt diar muar auer.", "img-auth-notindir": "Detdiar fertiaknis as ei föörsen tu huuchschüüren.", "img-auth-badtitle": "Mä „$1“ küd nään tiitel maaget wurd.", "img-auth-nologinnWL": "Dü beest ei uunmeldet, an „$1“ stäänt ei uun't whitelist.", @@ -1601,7 +1604,7 @@ "doubleredirects": "Dobelt widjerfeerangen", "doubleredirectstext": "Detheer list feert widjerfeerangen ap, diar üüb widjerfeerangen widjer feer.\nUun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det sidj, huar det ööder widjerfeerang üüb ferwiset. Trochstregen iindracher san al bewerket wurden.", "double-redirect-fixed-move": "[[$1]] as fersköwen wurden. Hat feert nü widjer tu [[$2]].", - "double-redirect-fixed-maintenance": "Dobelt widjerfeerang faan [[$1]] tu [[$2]] as apredet wurden.", + "double-redirect-fixed-maintenance": "Dobelt widjerfeerang faan [[$1]] tu [[$2]] as apredet wurden", "double-redirect-fixer": "Bot för widjerfeerangen", "brokenredirects": "Uunstaken widjerfeerangen", "brokenredirectstext": "Jodiar widjerfeerangen ferwise üüb en sidj, diar't goorei jaft:", @@ -1725,7 +1728,7 @@ "cachedspecial-viewing-cached-ts": "Dü lukest en werjuun uun a cache uun. Det as ferlicht ei üüb a leetst stant.", "cachedspecial-refresh-now": "Neist werjuun uunluke.", "categories": "Kategoriin", - "categoriespagetext": "{{PLURAL:$1|Detdiar kategorii häält|Jodiar kategoriin hual}} sidjen of datein.\n[[Special:UnusedCategories|Leesag kategoriin]] wurd heer ei uunwiset.\nLuke uk bi det list faan [[Special:WantedCategories|nuadag kategoriin]].", + "categoriespagetext": "{{PLURAL:$1|Detdiar kategorii häält|Jodiar kategoriin hual}} sidjen of datein an koon brükt wurd of uk ei.\nLuke uk bi det list faan [[Special:WantedCategories|nuadag kategoriin]].", "categoriesfrom": "Wise kategoriin mä began üüb:", "deletedcontributions": "Stregen bidracher", "deletedcontributions-title": "Stregen bidracher", @@ -1890,7 +1893,7 @@ "revertpage-nouser": "Feranrangen faan en ferbürgenen brüker turagsaat an det leetst werjuun faan {{GENDER:$1|[[User:$1|$1]]}} weder iinsteld.", "rollback-success": "Feranrangen faan {{GENDER:$3|$1}} san turagsaat an det leetst werjuun faan {{GENDER:$4|$2}} as weder iinsteld wurden.", "sessionfailure-title": "session feeler", - "sessionfailure": "Diar as wat skiaf gingen bi't auerdreegen faan din brükerdooten.\nAm dat diar ei noch muar skiaf gongt, as det aktjuun ufbreegen wurden.\nGung turag, an began faan föören.", + "sessionfailure": "Diar as wat skiaf gingen bi't auerdreegen faan din brükerdooten.\nAm dat diar ei noch muar skiaf gongt, as det aktjuun ufbreegen wurden.\nWees so gud, an schüür det formulaar noch ans uf.", "changecontentmodel": "Det muude faan det sidj feranre", "changecontentmodel-legend": "Det muude feranre", "changecontentmodel-title-label": "Sidjennööm", @@ -2223,7 +2226,7 @@ "fix-double-redirects": "Efter't fersküüwen aal a widjerfeerangen hen tu det ual sidj ferbeedre", "move-leave-redirect": "Widjerfeerang iinracht", "protectedpagemovewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det fersküüw.'''\nUun't logbuk stäänt muar diartu:", - "semiprotectedpagemovewarning": "'''Paase üüb:''' Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det fersküüw.\nUun't logbuk stäänt muar diartu:", + "semiprotectedpagemovewarning": "Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det fersküüw.\nUun't logbuk stäänt muar diartu:", "move-over-sharedrepo": "[[:$1]] stäänt uun en gemiansoom brükt archiif. Det fersküüwen üüb didiar nööm auerskraft det gemiansoom brükt datei.", "file-exists-sharedrepo": "Didiar dateinööm woort al uun en gemiansoom archiif brükt. Wees so gud, an nem en öödern nööm.", "export": "Sidjen eksportiare", @@ -2997,7 +3000,7 @@ "version-poweredby-others": "öödern", "version-poweredby-translators": "Auersaatern faan translatewiki.net", "version-credits-summary": "Wi besoonke üs bi jodiar persuunen för hör bidracher tu [[Special:Version|MediaWiki]].", - "version-license-info": "MediaWiki 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\nMediaWiki 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.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING 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 or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].", + "version-license-info": "MediaWiki 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\nMediaWiki 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.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING 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 or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].", "version-software": "Instaliird software", "version-software-product": "Produkt", "version-software-version": "Werjuun", @@ -3055,6 +3058,7 @@ "tag-mw-new-redirect-description": "Feranrangen, diar en nei widjerfeerang iinracht.", "tag-mw-removed-redirect": "Widjerfeerang wechnimen", "tag-mw-changed-redirect-target": "Widjerfeerang feranert", + "tag-mw-blank": "Leesag maaget", "tag-mw-rollback": "Turagsaat", "tag-mw-undo": "Turag saaten", "tags-title": "Kääntiaken", @@ -3263,9 +3267,9 @@ "limitreport-expansiondepth": "Maksimaal ütjwidjangsjipde", "limitreport-expensivefunctioncount": "Taal faan apwendag parser-funktjuunen", "expandtemplates": "Föörlaagen ütjwidje", - "expand_templates_intro": "Üüb detdiar spezial-sidj wurd a föörlaagen faan di tekst rekursiif ütjwidjet.\nUk parser-funktjuunen liküs {{#language:…}} an wariaabeln liküs {{CURRENTDAY}} wurd ferwerket - det ment ales, wat tesken dobelt sleufen stäänt.", + "expand_templates_intro": "Üüb detdiar spezial-sidj wurd a föörlaagen faan di wikitekst rekursiif ütjwidjet.\nUk parser-funktjuunen liküs {{#language:…}} an wariaabeln liküs {{CURRENTDAY}} wurd ferwerket - det ment ales, wat tesken dobelt sleufen stäänt.", "expand_templates_title": "Kontekst-tiitel, för {{FULLPAGENAME}} asw.:", - "expand_templates_input": "Skriiwfial:", + "expand_templates_input": "Skriiw wikitext:", "expand_templates_output": "Resultaat", "expand_templates_xml_output": "XML-resultaat", "expand_templates_html_output": "Rä HTML-ütjgoow", diff --git a/languages/i18n/gcr.json b/languages/i18n/gcr.json index a7eb5abf39..261420e2a2 100644 --- a/languages/i18n/gcr.json +++ b/languages/i18n/gcr.json @@ -32,7 +32,7 @@ "tog-oldsig": "Zòt signatir atchwèl :", "tog-fancysig": "Trété signatir-a kou di wikitèks (san lyen otomatik)", "tog-uselivepreview": "Afiché apèrsou san roucharjé paj-a", - "tog-forceeditsummary": "Avèrti mo lò mo pa spésifyé di rézimé di modifikasyon", + "tog-forceeditsummary": "Avèrti mo lòské mo pa èspésifyé di rézimen di modifikasyon", "tog-watchlisthideown": "Maské mo pròp modifikasyon annan lis di swivi", "tog-watchlisthidebots": "Maské modifikasyon-yan ki fè pa dé robo annan lis di swivi", "tog-watchlisthideminor": "Maské modifikasyon-yan minò annan lis di swivi", @@ -47,7 +47,7 @@ "tog-showhiddencats": "Afiché katégori-ya ki kaché", "tog-norollbackdiff": "Pa afiché diff aprè révoké", "tog-useeditwarning": "Avèrti mo lò mo ka kité roun paj an kour di modifikasyon san sovgardé", - "tog-prefershttps": "Toujou itilizé roun konèksyon sékirizé lò mo konèkté", + "tog-prefershttps": "Toujou itilizé roun konnègsyon sékirizé lò mo konnègté", "underline-always": "Toujou", "underline-never": "Janmè", "underline-default": "Valò pa défo di tenm oben di navigatò", @@ -78,7 +78,7 @@ "july": "jwiyé", "august": "out", "september": "sèptanm", - "october": "òktòb", + "october": "ògtòb", "november": "novanm", "december": "désanm", "january-gen": "janvyé", @@ -90,7 +90,7 @@ "july-gen": "jwiyé", "august-gen": "out", "september-gen": "sèptanm", - "october-gen": "òktòb", + "october-gen": "ògtòb", "november-gen": "novanm", "december-gen": "désanm", "jan": "janv.", @@ -114,7 +114,7 @@ "july-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} jwiyé", "august-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} out", "september-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} sèptanm", - "october-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} òktòb", + "october-date": "{{PLURAL:$1|1=1é|$1}} ògtòb", "november-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} novanm", "december-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} désanm", "period-am": "AM", @@ -136,10 +136,12 @@ "index-category": "Paj endèksé", "noindex-category": "Paj ki pa endèksé", "broken-file-category": "Paj ké dé lyen di fiché brizé", - "about": "À propo", + "categoryviewer-pagedlinks": "($1) ($2)", + "category-header-numerals": "$1–$2", + "about": "Apropo", "article": "Paj di kontni", "newwindow": "(Ka ouvri so kò andan roun nouvèl finèt)", - "cancel": "Anilé", + "cancel": "Annilé", "moredotdotdot": "Plis...", "morenotlisted": "Sa lis pouvé fika enkonplèt", "mypage": "Paj", @@ -155,15 +157,15 @@ "errorpagetitle": "Érò", "returnto": "Rouvini kot paj-a $1.", "tagline": "Di {{SITENAME}}", - "help": "Èd", + "help": "Lèd", "search": "Sasé", "search-ignored-headings": " #
    \n# Tit dé sèksyon ki ké fika ignoré pa sasé-a.\n# Chanjman-yan ki éfèktchwé isi ka pran léfè lò ki paj-a ké tit-a sa endèksé.\n# Zòt pouvé fòrsé réyendèksasyon di paj-a an éfèktchwan roun modifikasyon vid.\n# Sentaks-a sa swivant-a :\n#   * Tousa ki ka swiv roun « # » jouk finisman-an di lign-an sa roun koumantèr.\n#   * Tout lign ki pa-vid sa tit ègzak-a pou ignoré, kas konprann osi.\nRéférans\nLyen ègstèrn\nWè osi\n #
    ", "searchbutton": "Sasé", "go": "Konsilté", "searcharticle": "Kontinwé", - "history": "Istorik di paj-a", - "history_short": "Istorik", - "history_small": "istorik", + "history": "Listorik di paj-a", + "history_short": "Listorik", + "history_small": "listorik", "updatedmarker": "modifyé dipi mo dannyé vizit", "printableversion": "Vèrsyon enprimab", "permalink": "Lyen pèrmanan", @@ -213,21 +215,21 @@ "pool-errorunknown": "Éròr enkonèt", "pool-servererror": "Sèrvis di rézèrvasyon pa disponib ($1).", "poolcounter-usage-error": "Éròr di itilizasyon : $1", - "aboutsite": "À propo di {{SITENAME}}", - "aboutpage": "Project:À propo di", + "aboutsite": "Apropo di {{SITENAME}}", + "aboutpage": "Project:Apropo di", "copyright": "Kontni-a sa disponib anba lisans $1 sof mansyon kontrèr.", "copyrightpage": "{{ns:project}}:Copyrights", "currentevents": "Atchwalité", "currentevents-url": "Project:Atchwalité", "disclaimers": "Panga", "disclaimerpage": "Project:Panga jénéral", - "edithelp": "Èd pou modifikasyon", - "helppage-top-gethelp": "Èd", + "edithelp": "Lèd pou modifikasyon-an", + "helppage-top-gethelp": "Lèd", "mainpage": "Paj Prensipal", "mainpage-description": "Paj prensipal", "policy-url": "Project:Larèl", - "portal": "Pòrtay konminotèr", - "portal-url": "Project:Pòrtay konminotèr", + "portal": "Kouminoté", + "portal-url": "Project:Pòrtay kouminotèr", "privacy": "Politik di konfidansyalité", "privacypage": "Project:Politik di konfidansyalité", "badaccess": "Éròr di pèrmisyon", @@ -236,6 +238,9 @@ "versionrequired": "Vèrsyon $1 di MediaWiki nésésèr", "versionrequiredtext": "Vèrsyon $1 di MediaWiki sa nésésèr pou itilizé sa paj.\nKonsilté [[Special:Version|paj di vèrsyon-yan]].", "ok": "Validé", + "pagetitle": "$1 — {{SITENAME}}", + "pagetitle-view-mainpage": "{{SITENAME}}", + "backlinksubtitle": "← $1", "retrievedfrom": "Rékipéré di « $1 »", "youhavenewmessages": "{{PLURAL:$3|Zòt gen}} $1 ($2).", "youhavenewmessagesfromusers": "{{PLURAL:$4|Zòt gen}} $1 {{PLURAL:$3|di rounòt itilizatò|di $3 ròt itilizatò}} ($2).", @@ -267,6 +272,8 @@ "site-atom-feed": "Flux Atom di $1", "page-rss-feed": "Flux RSS di « $1 »", "page-atom-feed": "Flux Atom di « $1 »", + "feed-atom": "Atom", + "feed-rss": "RSS", "red-link-title": "$1 (paj pa ka ègzisté)", "sort-descending": "Tri dékrwasan", "sort-ascending": "Tri krwasan", @@ -274,11 +281,11 @@ "nstab-user": "Paj di {{GENDER:{{ROOTPAGENAME}}|itilizatò|itilizatris}}", "nstab-media": "Médja", "nstab-special": "Paj èspésyal", - "nstab-project": "À propo", + "nstab-project": "Paj di projè", "nstab-image": "Fiché", "nstab-mediawiki": "Mésaj", "nstab-template": "Modèl", - "nstab-help": "Èd", + "nstab-help": "Lèd", "nstab-category": "Katégori", "mainpage-nstab": "Paj prensipal", "nosuchaction": "Aksyon enkonèt", @@ -287,20 +294,20 @@ "nospecialpagetext": "Zòt doumandé oun paj èspésyal ki pa ka ègzisté.\n\nOun lis dé paj èspésyal valid ka trouvé so kò asou [[Special:SpecialPages|{{int:specialpages}}]].", "error": "Érò", "databaseerror": "Érò di baz-a di data", - "databaseerror-text": "Oun érò di rékèt di baz di doné aparèt.\nSala pouvé provini di roun anomali annan lojisyèl-a.", - "databaseerror-textcl": "Oun érò di rékèt di baz di doné aparèt.", + "databaseerror-text": "Oun lérò di rékèt di baz di data prodjwi so kò.\nSala pouvé provini di roun annomali annan lojisyèl-a.", + "databaseerror-textcl": "Oun lérò di rékèt di baz di data prodjwi so kò.", "databaseerror-query": "Rékèt : $1", "databaseerror-function": "Fonksyon : $1", "databaseerror-error": "Érò : $1", - "transaction-duration-limit-exceeded": "Pou évité roun tròp fò ogmantasyon di délè di réplikasyon, sa tranzaksyon té anilé piskétan douré di ékritir ($1) dépasé limit-a di $2 ségonn. Si zòt ka sasé modifyé oun gran nonm di éléman similtanéman, éséyé plito di éfèktchwé opérasyon-an an plizyò étap pli piti.", + "transaction-duration-limit-exceeded": "Pou évité roun tròp fò ogmantasyon di délè di réplikasyon, sa tranzagsyon té annilé pas douré-a di ékritir ($1) dépasé limit-a di $2 ségonn. Si zòt ka sasé à modifyé oun gran nonm di éléman similtanéman, éséyé plito di éfègtchwé lopérasyon-an an plizyò létap pli piti.", "laggedslavemode": "Panga, sa paj pa pouvé kontni tout dannyé modifikasyon éfèktchwé", "readonly": "Baz di data vérouyé", "enterlockreason": "Endiké rézon-an di vérouyaj ensi ki roun èstimasyon di so douré", - "readonlytext": "Ajou ké mizajou di baz di doné sa atchwèlman bloké, probabman pou pèrmèt mentnans di baz-a, aprè sa, tout bagaj ké rantré andan lòrd.\n\nAdministratò sistèm ki vérouyé baz di doné té fourni èksplikasyon swivant :
    $1", + "readonlytext": "Ajou ké mizajou di baz di data sa atchwèlman bloké, probabman pou pèrmèt mentnans di baz-a, aprè sa, tout bagaj ké rantré annan lòrd.\n\nAdministratò sistenm-an ki vérouyé baz di data fourni èsplikasyon-an ki ka swiv :
    $1", "missing-article": "Baz-a di data pa trouvé tèks-a di roun paj ki li té divèt trouvé, ki entitilé « $1 » $2.\n\nJénéralman, sala ka sirvini an swivan roun lyen bò'd roun diff périmé oben bò'd listorik di roun paj souprimé.\n\nSi a pa sa ki la, zòt pitèt trouvé roun annonmali annan progranm-an.\nSouplé, signalé li à roun [[Special:ListUsers/sysop|administratò]] é pa bliyé di endiké li URL-a di paj-a.", "missingarticle-rev": "(niméro di vèrsyon : $1)", "missingarticle-diff": "(diff : $1, $2)", - "readonly_lag": "Baz-a di doné té otomatikman vérouyé pannan ki sèrvò-ya ségondèr ka réyaligné yé kò asou sèrvò prensipal", + "readonly_lag": "Baz-a di data té otonmatikman vérouyé pannan ki sèrvò-ya ségondèr ka réyaligné yé kò asou sèrvò prensipal-a", "nonwrite-api-promise-error": "Ankèt-a HTTP « Promise-Non-Write-API-Action: » té voyé mè rékèt-a té fè à oun modjoul di ékritir di API-a.", "internalerror": "Érò entèrn", "internalerror_info": "Érò entèrn : $1", @@ -317,7 +324,7 @@ "badarticleerror": "Sa aksyon pa pouvé fika éfèktchwé asou sa paj.", "cannotdelete": "Enposib di souprimé paj-a oben fiché-a « $1 ».\nSouprésyon-an pitèt ja té éfèktchwé pa rounòt moun.", "cannotdelete-title": "Enposib di souprimé paj-a « $1 »", - "delete-hook-aborted": "Souprésyon anilé pa roun ègstansyon.\nPyès èksplikasyon té bay.", + "delete-hook-aborted": "Souprésyon annilé pa roun ègstansyon.\nPyès èsplikasyon té bay.", "no-null-revision": "Enposib di kréyé roun nouvèl révizyon vid pou paj-a « $1 »", "badtitle": "Movè tit", "badtitletext": "Tit di paj doumandé pa valid, vid, oben mal fòrmé si a roun tit entèr-lanng oben entèr-projè.\nI ka kontni pitèt oun oben plizyò karaktèr ki pa pouvé fika itilizé annan tit-ya.", @@ -330,9 +337,9 @@ "title-invalid-magic-tilde": "Tit di paj doumandé ka kontni roun sékans di tilde majik ki pa valid (~~~).", "title-invalid-too-long": "Tit di paj doumandé tròp lonng. Li pa divèt dépasé $1 {{PLURAL:$1|òktè}} annan ankodaj-a UTF-8.", "title-invalid-leading-colon": "Tit di paj doumandé ka kontni roun dé-pwen envalid o koumansman.", - "perfcached": "Doné-ya ki ka swiv sa an kach é pa pouvé mizajou. Oun maximum di {{PLURAL:$1|1=roun rézilta|$1 rézilta}} sa disponib annan kach-a.", - "perfcachedts": "Doné-ya ki ka swiv sa an kach é té mizajou pou dannyè fwè $1. Oun maximum di {{PLURAL:$4|1=roun rézilta sa disponib|$4 rézilta sa disponib}} annan kach-a.", - "querypage-no-updates": "Mizajou-yan pou sa paj sa atchwèlman dézaktivé.\nDoné-ya anba pa ké mizajou.", + "perfcached": "Data-ya ki ka swiv sa an kach é pa pouvé fika mizajou. Oun magsimonm di {{PLURAL:$1|1=roun rézilta|$1 rézilta}} sa disponib annan kach-a.", + "perfcachedts": "Data-ya ki ka swiv sa an kach é té mizajou pou dannyè fwè-a $1-a. Oun magsimonm di {{PLURAL:$4|1=roun rézilta sa disponib|$4 rézilta sa disponib}} annan kach-a.", + "querypage-no-updates": "Mizajou-ya pou sa paj sa atchwèlman dézagtivé.\nData-ya ki anba pa ké fika mizajou.", "viewsource": "Wè tèks sours", "viewsource-title": "Wè sours-a di $1", "actionthrottled": "Aksyon limité", @@ -356,17 +363,18 @@ "ns-specialprotected": "Paj èspésyal-ya pa pouvé fika modifyé.", "titleprotected": "Sa tit té protéjé kont tout kréyasyon pa [[User:$1|$1]].\nMotif fourni sa $2.", "filereadonlyerror": "Enposib di modifyé fiché-a « $1 » pas répèrtwar-a di fiché « $2 » sa an lèktir sèl.\n\nAdministratò sistèm ki li vérouyé té fourni sa motif : « $3 ».", + "invalidtitle": "Tit pa valid", "invalidtitle-knownnamespace": "Tit pa valid ké lèspas di non « $2 » é entitilé-a « $3 »", "invalidtitle-unknownnamespace": "Tit pa valid ké niméro-a di lèspas di non $1 enkonèt é entitilé-a « $2 »", - "exception-nologin": "Pa konèkté", - "exception-nologin-text": "Souplé, konèkté zòt kò pou aksédé à sa paj oben sa aksyon.", + "exception-nologin": "Pa konnègté", + "exception-nologin-text": "Souplé, konnègté zòt kò pou agsédé à sa paj oben sa agsyon.", "exception-nologin-text-manual": "Souplé zòt $1 pou aksédé à sa paj oben sa aksyon.", "virus-badscanner": "Movèz konfigirasyon : analizò di viris enkonèt : $1", "virus-scanfailed": "échèk di analiz-a (kod $1)", "virus-unknownscanner": "antiviris enkonèt :", - "logouttext": "Zòt atchwèlman dékonèkté.\n\nNoté ki sèrtenn paj pouvé fika òkò afiché kou si zòt toujou konèkté, jouk zòt désidé di éfasé kach-a di zòt navigatò.", - "cannotlogoutnow-title": "Enposib di konèkté so kò atchwèlman", - "cannotlogoutnow-text": "Dékonèksyon-an pa posib an itilizan $1.", + "logouttext": "Zòt atchwèlman dékonnègté.\n\nNoté ki sèrten paj pouvé fika òkò afiché kou si zòt toujou konnègté, jouk zòt désidé di éfasé kach-a di zòt navigatò.", + "cannotlogoutnow-title": "Enposib di dékonnègté so kò atchwèlman", + "cannotlogoutnow-text": "Dékonnègsyon-an pa posib an itilizan $1.", "welcomeuser": "Bèlvini, $1 !", "welcomecreation-msg": "Zòt kont té kréyé.\nZòt pouvé modifyé [[Special:Preferences|zòt préférans]] pou {{SITENAME}} si zòt swété.", "yourname": "Non di itilizatò :", @@ -381,28 +389,28 @@ "createacct-yourpasswordagain": "Konfirmé mo di pas", "createacct-yourpasswordagain-ph": "Antré òkò menm mo di pas", "userlogin-remembermypassword": "Gardé mo sésyon aktiv", - "userlogin-signwithsecure": "Itilizé roun konèksyon sékirizé", - "cannotlogin-title": "Enposib di konèkté so kò", - "cannotlogin-text": "Konèksyon-an pa posib", - "cannotloginnow-title": "Enposib di konèkté so kò atchwèlman", - "cannotloginnow-text": "Konèksyon-an pa posib an itilizan $1.", + "userlogin-signwithsecure": "Itilizé roun konnègsyon sékirizé", + "cannotlogin-title": "Enposib di konnègté so kò", + "cannotlogin-text": "Konnègsyon-an pa posib", + "cannotloginnow-title": "Enposib di konnègté so kò atchwèlman", + "cannotloginnow-text": "Konnègsyon-an pa posib an itilizan $1.", "cannotcreateaccount-title": "Kréyasyon di kont enposib", "cannotcreateaccount-text": "Kréyasyon-an dirèk di kont itilizatò pa aktivé asou sa wiki.", "yourdomainname": "Zòt domenn :", "password-change-forbidden": "Zòt pa pouvé modifyé mo di pas asou sa wiki.", - "externaldberror": "Swé roun érò prodjwi so kò asou baz di doné di otantifikasyon, swé zòt pa otorizé à mété à jou zòt kont èkstèrn.", - "login": "Konèksyon", + "externaldberror": "Swé roun lérò prodjwi so kò asou baz-a di data d'otantifikasyon, swé zòt pa otorizé à mété à jou zòt kont ègstèrn.", + "login": "Konnègsyon", "login-security": "Vérifyé zòt idantité", - "nav-login-createaccount": "Kréyé roun kont oben konèkté so kò", - "logout": "Dékonèkté so kò", - "userlogout": "Dékonèksyon", - "notloggedin": "Pa konèkté", + "nav-login-createaccount": "Kréyé roun kont oben konnègté so kò", + "logout": "Dékonnègté so kò", + "userlogout": "Dékonnègsyon", + "notloggedin": "Pa konnègté", "userlogin-noaccount": "Zòt pa gen roun kont ?", "userlogin-joinproject": "Roujwenn {{SITENAME}}", "createaccount": "Kréyé roun kont", "userlogin-resetpassword-link": "Zòt bliyé zòt mo di pas ?", - "userlogin-helplink2": "Èd pou konèkté so kò", - "userlogin-loggedin": "Zòt ja konèkté an tan ki $1.\nItilizé fòrmilèr-a ki anba pou konèkté zòt kò ké rounòt kont itilizatò.", + "userlogin-helplink2": "Lèd pou konnègté so kò", + "userlogin-loggedin": "Zòt déja konnègté an tan ki $1.\nItilizé fòrmilèr-a ki anba pou konnègté zòt kò ké rounòt kont itilizatò.", "userlogin-reauth": "Zòt divèt roukonèkté zòt kò pou vérifyé ki zòt sa {{GENDER:$1|$1}}.", "userlogin-createanother": "Kréyé rounòt kont", "createacct-emailrequired": "Adrès di kouryé", @@ -426,20 +434,21 @@ "badretype": "Mo di pas ki zòt sézi pa ka korèsponn.", "usernameinprogress": "Oun kréyasyon di kont pou sa non d'itilizatò ja an kour.\nSouplé, pasyanté.", "userexists": "Non d'itilizatò sézi ja itilizé.\nSouplé, chwézi roun non diféran.", - "loginerror": "Érò di konèksyon", + "loginerror": "Lérò di konnègsyon", "createacct-error": "Érò lò kréyasyon-an di kont", "createaccounterror": "Enposib di kréyé kont-a : $1", - "nocookiesnew": "Kont itilizatò té kréyé, mè zòt pa konèkté.\n{{SITENAME}} ka itilizé dé témwen (''cookies'') pou konsèrvé konèksyon-an mè zòt dézaktivé yé.\nSouplé, aktivé yé é roukonèkté zòt kò ké menm non é menm mo di pas.", - "nocookieslogin": "{{SITENAME}} itilizé dé témwen (''cookies'') pou konsèrvé konèksyon-an mè zòt dézaktivé yé.\nSouplé, aktivé yé é roukonèkté zòt kò.", + "nocookiesnew": "Kont itilizatò fin kréyé, mé zòt pa konnègté.\n{{SITENAME}} ka itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò ké menm non é menm modipas.", + "nocookieslogin": "{{SITENAME}} itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò.", "nocookiesfornew": "Kont itilizatò pa té kréyé, pas nou pa té pouvé idantifyé so lorijin.\nVérifyé ki zòt aktivé témwen-yan (''cookies''), roucharjé paj-a é éséyé òkò.", - "createacct-loginerror": "Kont-a té byen kréyé mè zòt pa pouvé konèkté zòt kò otomatikman.\nSouplé, [[Special:UserLogin|konèkté zòt kò manwèlman]].", + "nocookiesforlogin": "{{int:nocookieslogin}}", + "createacct-loginerror": "Kont-a byen fin kréyé mé zòt pa pouvé konnègté zòt kò otonmatikman.\nSouplé, [[Special:UserLogin|konnègté zòt kò manniyèlman]].", "noname": "Zòt pa sézi roun non d'itilizatò valid.", - "loginsuccesstitle": "Konèkté", - "loginsuccess": "Zòt atchwèl konèkté à {{SITENAME}} antan ki « $1 ».", + "loginsuccesstitle": "Konnègté", + "loginsuccess": "Zòt sa atchwèlman konnègté à {{SITENAME}} antan ki « $1 ».", "nosuchuser": "Itilizatò « $1 » pa ka ègzisté.\nNon d'itilizatò-ya sa sansib à lakas.\nVérifyé lòrtograf, oben [[Special:CreateAccount|kréyé roun kont nòv]].", "nosuchusershort": "I pa gen kontribitò ké non-an « $1 ».\nSouplé, vérifyé lòrtograf.", "nouserspecified": "Zòt divèt sézi roun non d'itilizatò.", - "login-userblocked": "{{GENDER:$1|Sa itilizatò|Sa itilizatris}} bloké. Konèksyon-an pa otorizé.", + "login-userblocked": "{{GENDER:$1|Sa itilizatò}} bloké. Konnègsyon-an pa otorizé.", "wrongpassword": "Non d'itilizatò oben mo di pas enkorèk.\nSouplé, éséyé òkò.", "wrongpasswordempty": "Zòt pa antré pyès mo di pas.\nSouplé, éséyé òkò.", "passwordtooshort": "Zòt mo di pas divèt kontni omwen $1 karaktèr{{PLURAL:$1|}}.", @@ -449,7 +458,7 @@ "password-login-forbidden": "Itilizasyon-an di sa non d'itilizatò oben di sa mo di pas té entèrdit.", "mailmypassword": "Réyinisyalizé mo di pas", "passwordremindertitle": "Nouvèl mo di pas tanporèr pou {{SITENAME}}", - "passwordremindertext": "Tchèk moun (dipi adrès IP $1) doumandé roun mo di pas nòv pou {{SITENAME}} ($4). Oun mo di pas tanporèr pou itilizatò-a\n« $2 » té kréyé é sa « $3 ». Si sala té zòt entansyon,\nzòt divèt konèkté zòt kò é chwézi roun mo di pas nòv.\nZòt mo di pas tanporèr ké èkspiré andan $5 jou{{PLURAL:}}.\n\nSi zòt pa lotò di sa doumann, oben si zòt ka souvni zòt kò atchwèlman di zòt mo di pas é zòt pli ka swété an chanjé, zòt pouvé ignoré sa mésaj é kontinwé di itilizé zòt ansyen mo di pas.", + "passwordremindertext": "Tchèk moun (dipi adrès IP-a $1) doumandé roun modipas nòv pou {{SITENAME}} ($4). Oun modipas tanporèr pou itilizatò-a\n« $2 » fin kréyé é sa « $3 ». Si sala té zòt entansyon,\nzòt divèt konnègté zòt kò é chwézi roun modipas nòv.\nZòt modipas tanporèr ké èspiré annan $5 jou{{PLURAL:}}.\n\nSi zòt pa lotò di sa doumann, oben si zòt ka souvni zòt kò atchwèlman di zòt modipas é zòt pli ka swété an chanjé, zòt pouvé ignoré sa mésaj é kontinwé di itilizé zòt ansyen modipas.", "noemail": "Pyès adrès di kouryé té anréjistré pou itilizat{{GENDER:$1|ò|ris}}-a « $1 ».", "noemailcreate": "Zòt divèt fourni roun adrès di kouryé valid", "passwordsent": "Roun nouvèl mo di pas té voyé kot adrès-a di kouryé di itilizat{{GENDER:$1|ò|ris}} « $1 ».\nSouplé, roukonèkté zòt kò aprè ki zòt rousouvri li.", @@ -469,40 +478,42 @@ "accountcreatedtext": "Kont itilizatò pou [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskisyon]]) té kréyé.", "createaccount-title": "Kréyasyon di roun kont pou {{SITENAME}}", "createaccount-text": "Tchèk moun kréyé roun kont pou zòt adrès di kouryé asou {{SITENAME}} ($4) entitilé « $2 », ké mo di pas « $3 ».\nZòt divèt ouvri roun sésyon é atchwèlman modifyé zòt mo di pas.\n\nIgnoré sa mésaj si sa kont té kréyé pa érò.", - "login-throttled": "Zòt tanté dèrnyèrman roun nonm tròp élvé di konèksyon.\nSouplé, antann $1 anvan di éséyé òkò.", - "login-abort-generic": "Zòt échwé zòt tantativ di konèksyon", + "login-throttled": "Zòt tanté dannyéman roun nonm tròp élvé di konnègsyon.\nSouplé, antann $1 anvan di éséyé òkò.", + "login-abort-generic": "Zòt échwé zòt tantativ di konnègsyon", "login-migrated-generic": "Zòt kont té migré, é zòt non d'itilizatò pa ka ègzisté òkò asou sa wiki.", "loginlanguagelabel": "Lanng : $1", - "suspicious-userlogout": "Zòt doumann di konèksyon té réfizé pas i sanblé ki li té voyé pa roun navigatò défèktyé oben dipi kach-a di roun sèrvis mandatèr.", + "suspicious-userlogout": "Zòt doumann di konnègsyon té roufizé pas i sanblé ki li té voyé pa roun navigatò défègtché oben dipi kach-a di roun sèrvis mandatèr.", "createacct-another-realname-tip": "Véritab non sa òpsyonèl.\nSi zòt désidé di fourni li, i ké fika itilizé pou krédité lotò di so travay.", - "pt-login": "Konèkté so kò", - "pt-login-button": "Konèkté so kò", - "pt-login-continue-button": "Kontinwé konèksyon-an", + "pt-login": "Konnègté so kò", + "pt-login-button": "Konnègté so kò", + "pt-login-continue-button": "Kontinwé konnègsyon-an", "pt-createaccount": "Kréyé roun kont", - "pt-userlogout": "Dékonèkté so kò", + "pt-userlogout": "Dékonnègté so kò", "php-mail-error-unknown": "Érò enkonèt annan fonksyon-an mail() di PHP.", "user-mail-no-addy": "Enposib di voyé roun kouryé san adrès di kouryé.", "user-mail-no-body": "Ésè di voyé di roun kouryé ké roun kò vid oben anòrmalman kour.", "changepassword": "Chanjé di mo di pas", "resetpass_announce": "Pou tèrminé zòt enskripsyon, zòt divèt fourni roun mo di pas nòv.", + "resetpass_text": "", "resetpass_header": "Chanjé mo di pas di kont", "oldpassword": "Ansyen mo di pas :", "newpassword": "Mo di pas nòv :", "retypenew": "Konfirmé mo di pas nòv :", - "resetpass_submit": "Chanjé mo di pas é konèkté so kò.", + "resetpass_submit": "Chanjé modipas-a é konnègté so kò.", "changepassword-success": "Zòt mo di pas té modifyé !", - "changepassword-throttled": "Zòt fè tròp di tantativ di konèksyon résaman. \nSouplé, antann $1 anvan di rééséyé.", + "changepassword-throttled": "Zòt fè tròp di tantativ di konnègsyon résaman. \nSouplé, antann $1 anvan di réyéséyé.", "botpasswords": "Mo di pas di robo", - "botpasswords-summary": "Mo di pas di robo ka pèrmèt di aksédé à roun kont itilizatò via API-a san itilizé idantifyan-yan di konèksyon prensipal. Drwè itilizatò disponib lò to konèkté ké roun mo di pas robo pouvé fika rédjwi.\n\nSi zòt wè pou kisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmè doumandé zòt di jénéré roun é di bay li.", + "botpasswords-summary": "Modipas-ya di robo ka pèrmèt di agsédé à roun kont itilizatò vya API-a san itilizé idantifyan-yan di konnègsyon prensipal. Drwè itilizatò disponib lò to konnègté ké roun modipas robo pouvé fika rédjwi.\n\nSi zòt pa ka wè poukisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmen doumandé zòt di an jénéré roun é di bay li.", "botpasswords-disabled": "Mo di pas di robo sa dézaktivé.", - "botpasswords-no-central-id": "Pou itilizé mo di pas di robo, zòt divèt fika konèkté à roun kont santralizé.", + "botpasswords-no-central-id": "Pou itilizé modipas-ya di robo, zòt divèt fika konnègté à roun kont ki santralizé.", "botpasswords-existing": "Mo di pas di robo ègzistan", "botpasswords-createnew": "Kréyé roun mo di pas nòv di robo", "botpasswords-editexisting": "Modifyé roun mo di pas di robo ègzistan", + "botpasswords-label-needsreset": "(Modipas-a divèt fika réyinisyalizé)", "botpasswords-label-appid": "Non di robo :", "botpasswords-label-create": "Kréyé", "botpasswords-label-update": "Mété à jou", - "botpasswords-label-cancel": "Anilé", + "botpasswords-label-cancel": "Annilé", "botpasswords-label-delete": "Souprimé", "botpasswords-label-resetpassword": "Réyinisyalizé mo di pas", "botpasswords-label-grants": "Drwè aplikab :", @@ -517,22 +528,22 @@ "botpasswords-updated-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té mizajou.", "botpasswords-deleted-title": "Mo di pas di robo souprimé", "botpasswords-deleted-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té souprimé.", - "botpasswords-newpassword": "Mo di pas nòv pou konèkté so kò à$1 sa $2. Souplé, anréjistré li pou fè référans di li iltèryèrman.
    (Pou ansyen robo ki ka nésésité ki non fourni pou konèksyon-an ka fika menm-an ki non di itilizasyon évantchwèl, zòt pouvé osi itilizé $3 kou non di itilizatò é $4 kou mo di pas).", + "botpasswords-newpassword": "Nouvèl modipas-a pou konnègté so kò à$1 sa $2. Souplé, anréjistré li pou fè référans asou li iltèryèrman.
    (Pou ansyen robo ki ka nésésité ki non fourni pou konnègsyon-an ka fika menm-an ki non di itilizasyon évantchwèl, zòt pouvé osi itilizé $3 kou non di itilizatò é $4 kou modipas).", "botpasswords-no-provider": "BotPasswordsSessionProvider pa disponib.", - "botpasswords-restriction-failed": "Rèstriksyon-yan di mo di pas di robo ka anpéché sa konèksyon.", + "botpasswords-restriction-failed": "Rèstrigsyon-yan di modipas di robo ka anpéché sa konnègsyon.", "botpasswords-invalid-name": "Non-an d'itilizatò spésifyé pa ka kontni di séparatò di mo di pas di robo (« $1 »).", "botpasswords-not-exist": "{{GENDER:$1|Itilizatò|Itilizatris}}-a « $1 » pa gen di mo di pas di robo nonmen « $2 ».", "resetpass_forbidden": "Mo di pas pa pouvé fika chanjé.", "resetpass_forbidden-reason": "Mo di pas pa pouvé fika modifyé : $1", - "resetpass-no-info": "Zòt divèt fika konèkté pou aksédé dirèkman à sa paj.", + "resetpass-no-info": "Zòt divèt fika konnègté pou agsédé dirèkman à sa paj.", "resetpass-submit-loggedin": "Chanjé di mo di pas", - "resetpass-submit-cancel": "Anilé", + "resetpass-submit-cancel": "Annilé", "resetpass-wrong-oldpass": "Mo di pas atchwèl oben tanporèr envalid.\nZòt pitèt ja chanjé zòt mo di pas oben doumandé roun mo di pas nòv tanporèr.", - "resetpass-recycled": "Souplé, réyinisyalizé zòt mo di pas an tchèk kichoz di ròt ki atchwèl-a.", - "resetpass-temp-emailed": "Zòt konèkté ké roun kod tanporèr fourni pa kouryé.\nPou tèrminé konèksyon-an, zòt divèt fourni roun mo di pas nòv isi :", + "resetpass-recycled": "Souplé, réyinisyalizé zòt modipas an tchèk kichoz di ròt ki atchwèl-a.", + "resetpass-temp-emailed": "Zòt konnègté ké roun kod tanporèr ki fourni pa kouryé.\nPou tèrminé konnègsyon-an, zòt divèt fourni roun nouvèl modipas isi :", "resetpass-temp-password": "Mo di pas tanporèr :", - "resetpass-expired-soft": "Zòt mo di pas èkspiré, é divèt fika réyinisyalizé. Souplé, chwézi roun nouvèl atchwèlman oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou fè li plita.", - "resetpass-validity-soft": "Zòt mo di pas pa valid : $1\n\nSouplé, chwézi roun mo di pas nòv atchwèlman, oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou réyinisyalizé li plita.", + "resetpass-expired-soft": "Zòt modipas èspiré, é divèt fika réyinisyalizé. Souplé, chwézi roun nouvèl atchwèlman oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou fè li plita.", + "resetpass-validity-soft": "Zòt modipas pa valid : $1\n\nSouplé, chwézi roun modipas nòv atchwèlman, oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou réyinisyalizé li plita.", "passwordreset": "Réyinisyalizasyon di mo di pas", "passwordreset-text-one": "Ranplisé sa fòrmilèr pou zòt mo di pas.", "passwordreset-emaildisabled": "Fonksyonalité-ya di kouryé té dézaktivé asou sa wiki.", @@ -546,13 +557,13 @@ "passwordreset-invalidemail": "Adrès di mésajri envalid", "passwordreset-nodata": "Pyès non d'itilizatò oben adrès di mésajri té fourni", "changeemail": "Chanjé oben souprimé adrès di kouryé", - "changeemail-no-info": "Zòt divèt fika konèkté pou aksédé dirèkman à sa paj.", + "changeemail-no-info": "Zòt divèt fika konnègté pou agsédé dirèkman à sa paj.", "changeemail-oldemail": "Adrès di kouryé atchwèl :", "changeemail-newemail": "Nouvèl adrès di kouryé :", "changeemail-none": "(pyès)", "changeemail-password": "Zòt mo di pas asou {{SITENAME}} :", "changeemail-submit": "Chanjé adrès di kouryé", - "changeemail-throttled": "Zòt fè tròp di tantativ di konèksyon. \nSouplé, antann $1 anvan di rééséyé.", + "changeemail-throttled": "Zòt fè tròp tantativ di konnègsyon. \nSouplé, antann $1 anvan di réyéséyé.", "changeemail-nochange": "Souplé, sézi roun nouvèl adrès di kouryé diférant di présédant-a.", "resettokens": "Réyinisyalizé jéton-yan.", "resettokens-no-tokens": "I pa gen pyès jéton pou réyinisyalizé.", @@ -577,7 +588,7 @@ "media_tip": "Lyen bò'd roun fiché médja", "sig_tip": "Zòt signatir ké dat", "hr_tip": "Lign orizontal (pa an abizé)", - "summary": "Rézimé :", + "summary": "Rézimen :", "subject": "Sijè :", "minoredit": "Sa modifikasyon sa minò.", "watchthis": "Swiv sa paj", @@ -592,15 +603,15 @@ "preview": "Prévizwalizasyon", "showpreview": "Prévizwalizé", "showdiff": "Wè modifikasyon-yan", - "anoneditwarning": "Panga : zòt pa konèkté. Zòt adrès IP ké fika vizib pa tout moun si zòt ka fè dé modifikasyon. Si zòt [$1 ka konèkté zòt kò] oben [$2 kréyé roun kont], zòt modifikasyon ké fika atribiyé à zòt pròp non di itilizatò é zòt ké gen ròt avantaj.", + "anoneditwarning": "Panga : zòt pa konnègté. Zòt adrès IP ké vizib pa tout moun si zòt ka fè dé modifikasyon. Si zòt [$1 ka konnègté zòt kò] oben [$2 kréyé roun kont], zòt modifikasyon ké fika atribiyé à zòt pròp non di itilizatò é zòt ké gen ròt avantaj.", "blockedtext": "Zòt kont itilizatò oben zòt adrès IP bloké.\n\nBlokaj té éfèktchwé pa $1.\nRézon-an ki évoké ka swiv : $2.\n\n* Koumansman di blokaj : $8\n* Èspirasyon di blokaj : $6\n* Kont bloké : $7.\n\nZòt pouvé kontakté $1 oben rounòt [[{{MediaWiki:Grouppage-sysop}}|administratò]] pou an diskité.\nZòt pa pouvé itilizé fonksyon-an « {{int:emailuser}} » rounso si oun adrès di kouryé valid sa èspésifyé andan zòt [[Special:Preferences|préférans]] é rounso si sa fonksyonalité pa bloké.\nZòt adrès IP atchwèl sa $3 é zòt idantifyan di blokaj sa $5.\nSouplé, enkli tout détay-ya lasou'l annan chakin dé rékèt ki zòt ké fè.", - "loginreqlink": "konèkté so kò", + "loginreqlink": "konnègté so kò", "newarticletext": "Zòt té ka swiv roun lyen bò'd roun paj ki pa ka ègzisté òkò. \nAfen di kréyé sa paj, antré zòt tèks annan bwèt ki aprè (zòt pouvé konsilté [$1 paj di lèd-a] pou plis d'enfòrmasyon).\nSi zòt vini{{GENDER:|}} isi pa éròr, kliké asou bouton Routour di zòt navigatò.", - "anontalkpagetext": "----\nZòt asou paj di diskisyon di roun itilizatò anonim ki pa òkò kréyé di kont oben ki pa ka an itilizé.\nPou sa rézon, nou divèt itilizé so adrès IP pou idantifyé li.\nOun adrès IP pouvé fika partajé pa plizyò itilizatò.\nSi zòt roun itiliza{{GENDER:|ò|ris}} anonim é si zòt ka kontasté ki dé koumantèr ki pa ka konsèrné zòt sa adrèsé pou zòt, zòt pouvé [[Special:CreateAccount|kréyé roun kont]] oben [[Special:UserLogin|konèkté zòt kò]] atò di évité tout konfizyon fitir ké ròt kontribitò anonim.", + "anontalkpagetext": "----\nZòt asou paj di diskisyon di roun itilizatò annonnim ki pa òkò kréyé di kont oben ki pa ka an itilizé.\nPou sa rézon, nou divèt itilizé so adrès IP pou idantifyé li.\nOun adrès IP pouvé fika patajé pa plizyò itilizatò.\nSi zòt roun itiliza{{GENDER:|ò}} annonnim é si zòt ka kontasté ki dé koumantèr ki pa ka konsèrné zòt sa adrèsé pou zòt, zòt pouvé [[Special:CreateAccount|kréyé roun kont]] oben [[Special:UserLogin|konnègté zòt kò]] atò di évité tout konfizyon fitir ké ròt kontribitò annonnim.", "noarticletext": "I pa gen atchwèlman pyès tèks asou sa paj.\nZòt pouvé [[Special:Search/{{PAGENAME}}|lansé oun sasé asou sa tit]] annan ròt paj-ya,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sasé annan opérasyon ki lyannen]\noben [{{fullurl:{{FULLPAGENAME}}|action=edit}} kréyé sa paj].", "noarticletext-nopermission": "I pa gen atchwèlman pyès tèks asou sa paj.\nZòt pouvé [[Special:Search/{{PAGENAME}}|fè roun sasé asou sa tit]] andan ròt paj-ya,\noben [{{fullurl:{{#Special:Log}}|paj={{FULLPAGENAMEE}}}} sasé annan journal asosyé], mè zòt pa gen pèrmisyon di kréyé sa paj.", "userpage-userdoesnotexist-view": "Kont itilizatò-a « $1 » pa anréjistré.", - "clearyourcache": "Nòt : aprè zòt anréjistré zòt modifikasyon, zòt divèt fòrsé roucharjman konplè di kach di zòt navigatò pou wè chanjman-yan.\n* Firefox / Safari : mentné touch-a Maj (Shift) an klikan asou bouton-an Atchwalizé oben présé Ctrl-F5 oben Ctrl-R (⌘-R asou roun Mac) \n* Google Chrome : apiyé asou Ctrl-Maj-R (⌘-Shift-R asou roun Mac) \n* Internet Explorer : mentni touch-a Ctrl an klikan asou bouton-an Atchwalizé oben présé Ctrl-F5 \n* Opera : alé annan Menu → Settings (Opera → Préférences asou roun Mac) é answit à Konfidansyalité & sékrité → Éfasé doné d'èsplorasyon-yan → Imaj ké fiché an kach.", + "clearyourcache": "Nòt : aprè zòt anréjistré zòt modifikasyon, zòt divèt fòrsé richarjman konplè di kach di zòt navigatò pou wè chanjman-yan.\n* Firefox / Safari : mentni touch-a Maj (Shift) an klikan asou bouton-an Atchwalizé oben présé Ctrl-F5 oben Ctrl-R (⌘-R asou roun Mac) \n* Google Chrome : apiyé asou Ctrl-Maj-R (⌘-Shift-R asou roun Mac) \n* Internet Explorer : mentni touch-a Ctrl an klikan asou bouton-an Atchwalizé oben présé Ctrl-F5 \n* Opera : alé annan Menu → Settings (Opera → Préférences asou roun Mac) é answit à Konfidansyalité & sékrité → Éfasé data d'èsplorasyon-yan → Zimaj ké fiché an kach.", "previewnote": "Raplé-zòt ki a jis roun prévizwalizasyon.\nZòt modifikasyon pa òkò anréjistré !", "continue-editing": "Alé kot zonn di modifikasyon", "editing": "Modifikasyon di $1", @@ -630,16 +641,16 @@ "history-fieldset-title": "Sasé dé révizyon", "histfirst": "Pli ansyenn", "histlast": "Pli résant", - "history-feed-title": "Istorik dé vèrsyon", - "history-feed-description": "Istorik dé vèrsyon pou sa paj asou wiki", + "history-feed-title": "Listorik dé vèrsyon", + "history-feed-description": "Listorik dé vèrsyon pou sa paj asou wiki-a", "history-feed-item-nocomment": "$1 à $2", "rev-delundel": "afiché/maské", "mergelog": "Journal dé fizyon", - "history-title": "$1 : Istorik é vèrsyon", + "history-title": "$1 : Listorik dé vèrsyon", "difference-title": "$1 : Diférans ant vèrsyon", "lineno": "Lign $1 :", "compareselectedversions": "Konparé vèrsyon-yan sélèksyoné", - "editundo": "anilé", + "editundo": "annilé", "diff-empty": "(Pyès diférans)", "diff-multi-sameuser": "({{PLURAL:$1|Oun révizyon entermédyèr pa menm itilizatò pa afiché|$1}})", "diff-multi-otherusers": "({{PLURAL:$1|Oun révizyon entèrmédyèr|$1}} pa {{PLURAL:$2|rounòt itilizatò|$2}} pa {{PLURAL:$1|afiché|}})", @@ -680,7 +691,7 @@ "rightslog": "Journal dé modifikasyon di drwè di itilizatò", "action-edit": "modifyé sa paj", "action-createaccount": "kréyé sa kont itilizatò", - "enhancedrc-history": "istorik", + "enhancedrc-history": "listorik", "recentchanges": "Modifikasyon résant", "recentchanges-legend": "Lòpsyon dé modifikasyon résant", "recentchanges-summary": "Swiv chanjman-yan pli résan wiki asou sa paj.", @@ -736,7 +747,7 @@ "imgfile": "fiché", "listfiles": "Lis di fiché", "file-anchor-link": "Fiché", - "filehist": "Istorik di fiché", + "filehist": "Listorik di fiché", "filehist-help": "Kliké asou roun dat ké lò pou wè fiché-a tèl ki li té yé à sa moman.", "filehist-revert": "rétablir", "filehist-current": "atchwèl", @@ -755,7 +766,7 @@ "sharedupload-desc-here": "Sa fiché ka provini di $1. Li pouvé fika itilizé pa ròt projè.\nSo dèskripsyon asou so [$2 paj di dèskripsyon] sa afiché anba.", "filepage-nofile": "Pyès fiché di sa non ka ègzisté.", "upload-disallowed-here": "Zòt pa pouvé ranplasé sa fiché.", - "randompage": "Paj o azò", + "randompage": "Paj an azò", "statistics": "Èstatistik", "double-redirect-fixer": "Korèktò di roudirèksyon", "nbytes": "$1 {{PLURAL:$1|òktè}}", @@ -862,14 +873,14 @@ "tooltip-pt-preferences": "{{GENDER:|Zòt}} préférans", "tooltip-pt-watchlist": "Oun lis dé paj don zòt ka swiv modifikasyon", "tooltip-pt-mycontris": "Oun lis di {{GENDER:|zòt}} kontribisyon", - "tooltip-pt-login": "Nou ka ankourajé zòt à konèkté zòt kò ; soupannan, i pa obligatwar", - "tooltip-pt-logout": "Dékonèkté so kò", - "tooltip-pt-createaccount": "Nou ka ankourajé zòt à kréyé roun kont itilizatò é konèkté zòt kò ; soupannan, i pa obligatwar", + "tooltip-pt-login": "Nou ka ankourajé zòt à konnègté zòt kò ; soupannan, zòt pa blijé di fè li", + "tooltip-pt-logout": "Dékonnègté so kò", + "tooltip-pt-createaccount": "Nou ka ankourajé zòt à kréyé roun kont itilizatò é konnègté zòt kò ; soupannan, zòt pa blijé di fè li", "tooltip-ca-talk": "Diskisyon o sijè di sa paj di kontni", "tooltip-ca-edit": "Modifyé wikikod-a", "tooltip-ca-addsection": "Koumansé roun nouvèl sèksyon", "tooltip-ca-viewsource": "Sa paj sa protéjé.\nZòt pouvé toutfwè vizwalizé sours-a.", - "tooltip-ca-history": "Istorik vèrsyon-yan di sa paj", + "tooltip-ca-history": "Listorik dé vèrsyon di sa paj", "tooltip-ca-protect": "Protéjé sa paj", "tooltip-ca-delete": "Souprimé sa paj", "tooltip-ca-move": "Rounonmen sa paj", @@ -881,10 +892,10 @@ "tooltip-p-logo": "Vizité paj prensipal-a", "tooltip-n-mainpage": "Vizité paj prensipal-a di sit", "tooltip-n-mainpage-description": "Paj prensipal jénéral", - "tooltip-n-portal": "À propo di projè, sa ki zòt pouvé fè, koté trouvé enfòrmasyon-yan", + "tooltip-n-portal": "Apropo di projè, sa ki zòt pouvé fè, koté trouvé enfòrmasyon-yan", "tooltip-n-currentevents": "Trouvé plis d'enfòrmasyon asou atchwalité an kour", "tooltip-n-recentchanges": "Lis di modifikasyon résant asou wiki-a", - "tooltip-n-randompage": "Afiché roun paj o azò", + "tooltip-n-randompage": "Afiché roun paj an azò", "tooltip-n-help": "Aksè à lèd", "tooltip-t-whatlinkshere": "Lis dé paj ki lyannen ki ka pwenté asou sala", "tooltip-t-recentchangeslinked": "Lis di modifikasyon résant liyé à sa paj", @@ -909,13 +920,13 @@ "tooltip-diff": "Afiché modifikasyon-yan ki zòt apòrté andan tèks-a.", "tooltip-compareselectedversions": "Afiché diférans-ya ant dé vèrsyon-yan sélèksyoné di sa paj", "tooltip-watch": "Ajouté sa paj annan zòt lis di swivi", - "tooltip-rollback": "« Révoké » ka anilé an roun klik modifikasyon(-an oben yan) di sa paj ki réyalizé pa so dannyé kontribitò", - "tooltip-undo": "« Anilé » ka rétabli modifikasyon présédant é ka ouvri lafinèt di modifikasyon an mòd prévizwalizasyon. I posib di ajouté roun rézon annan rézimé-a.", - "tooltip-summary": "Antré roun brèf rézimé", + "tooltip-rollback": "« Révoké » ka annilé an roun klik modifikasyon(-an oben -yan) di sa paj ki réyalizé pa so dannyé kontribitò", + "tooltip-undo": "« Annilé » ka rétabli modifikasyon-an ki ka présédé é ka ouvri lafinèt di modifikasyon an mòd prévizwalizasyon. I posib di ajouté roun rézon annan rézimen-an.", + "tooltip-summary": "Antré roun brèf rézimen", "simpleantispam-label": "Vérifikasyon anti-pouryèl.\nPa enskri anyen isi !", "pageinfo-title": "Enfòrmasyon pou « $1 »", "pageinfo-header-basic": "Enfòrmasyon di baz", - "pageinfo-header-edits": "Istorik dé modifikasyon", + "pageinfo-header-edits": "Listorik dé modifikasyon", "pageinfo-header-restrictions": "Protèksyon di paj-a", "pageinfo-header-properties": "Propriyété di paj-a", "pageinfo-display-title": "Tit afiché", diff --git a/languages/i18n/gl.json b/languages/i18n/gl.json index 3af4877b43..1ebf800a34 100644 --- a/languages/i18n/gl.json +++ b/languages/i18n/gl.json @@ -27,7 +27,8 @@ "Hamilton Abreu", "Athena in Wonderland", "Navhy", - "PokéDex Nacional" + "PokéDex Nacional", + "Maria zaos" ] }, "tog-underline": "Subliñar as ligazóns:", @@ -392,6 +393,7 @@ "ns-specialprotected": "Non se poden editar as páxinas no espazo de nomes \"{{ns:special}}\".", "titleprotected": "Este título foi protexido da creación por [[User:$1|$1]].\nO motivo achegado é $2.", "filereadonlyerror": "Non se puido modificar o ficheiro \"$1\" porque o repositorio \"$2\" está en modo de só lectura.\n\nO administrador do sistema que bloqueou o repositorio achegou este motivo: \"$3\".", + "invalidtitle": "Título non válido", "invalidtitle-knownnamespace": "Título inválido co espazo de nomes \"$2\" e o texto \"$3\"", "invalidtitle-unknownnamespace": "Título inválido cun número de espazo de nomes, $1, descoñecido e o texto \"$2\"", "exception-nologin": "Non accedeu ao sistema", @@ -1039,7 +1041,7 @@ "recentchangescount": "Número de edicións a amosar por defecto nos cambios recentes, nos historiais de páxina e nos rexistrosː", "prefs-help-recentchangescount": "Número máximo: 1000", "prefs-help-watchlist-token2": "Esta é a clave secreta da fonte de novas web para a súa lista de vixilancia.\nCalquera persoa que a saiba poderá ler a súa lista de vixilancia; non comparta esta clave.\nSe o precisa, [[Special:ResetTokens|pode restablecela]].", - "prefs-help-tokenmanagement": "Podes ver e restaurar a chave secreta para a túa conta que pode acceder á fonte web da túa lista de vixiancia. Calquera que coñeza a chave poderá leer a túa lista de vixiancia, non a comparta.", + "prefs-help-tokenmanagement": "Pode ver e restaurar a chave secreta da súa conta, que permite acceder á fonte web da súa lista de vixiancia. Calquera que coñeza a chave poderá ler a súa lista de vixilancia, así que non a comparta.", "savedprefs": "Gardáronse as súas preferencias.", "savedrights": "Gardáronse os grupos de {{GENDER:$1|usuario|usuaria}} de $1.", "timezonelegend": "Fuso horario:", @@ -2092,7 +2094,7 @@ "cachedspecial-refresh-now": "Ir á versión máis recente.", "categories": "Categorías", "categories-submit": "Amosar", - "categoriespagetext": "{{PLURAL:$1|A seguinte categoría contén|As seguintes categorías conteñen}} páxinas ou contidos multimedia.\nAquí non se mostran as [[Special:UnusedCategories|categorías sen uso]].\nOlle tamén as [[Special:WantedCategories|categorías requiridas]].", + "categoriespagetext": "{{PLURAL:$1|A seguinte categoría existe|As seguintes categorías existen}} na wiki, e poden ou non estar sen utilizar.\nOlle tamén as [[Special:WantedCategories|categorías requiridas]].", "categoriesfrom": "Mostrar as categorías que comecen por:", "deletedcontributions": "Contribucións borradas do usuario", "deletedcontributions-title": "Contribucións borradas do usuario", @@ -4111,6 +4113,7 @@ "edit-error-long": "Erros:\n\n$1", "revid": "revisión $1", "pageid": "identificador de páxina $1", + "interfaceadmin-info": "$1\n\nOs permisos para editar ficheiros globais de CSS/JS/JSON separáronse recentemente do dereito editinterface. Se non comprende porqué está vendo este erro, vexa [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "As marcas <html> non poden usarse fóra das páxinas normais.", "gotointerwiki": "Deixando {{SITENAME}}", "gotointerwiki-invalid": "O título especificado non é válido.", diff --git a/languages/i18n/gor.json b/languages/i18n/gor.json index a5dd902282..89892eb858 100644 --- a/languages/i18n/gor.json +++ b/languages/i18n/gor.json @@ -289,7 +289,7 @@ "nosuchaction": "Diya'a huhutu boyito", "nosuchactiontext": "Huhutu u hepohile lo URL ja valid.\nYi'o lotalawa lopotuwoto lo URL, meyalo lodudu'a wumbuta u ja banari.\nUtiye olo kira-kira tuwotiyo woluwo bug to pilaakasi u hepomake {{SITENAME}}", "nosuchspecialpage": "Diya'a halaman istimewa boyito", - "nospecialpagetext": "Yi'o hemohile halaman istimewa u ja sah.\n\nDaputari halaman istimewa mowali bilehela to [[Special:SpecialPages| {{int:specialpages}}]]", + "nospecialpagetext": "Yi'o hemohile halaman istimewa u ja sah.\n\nDaputari halaman istimewa mowali bilehela to [[Special:SpecialPages|{{int:specialpages}}]]", "error": "Tilala aba", "databaseerror": "Tilala tuwango data", "databaseerror-text": "Ma tilala tuwawu basis kueri.\nUtiya kira-kira tuwotiyo woluwo bug to pilaakasi moluluhi'o.", @@ -492,7 +492,7 @@ "noarticletext-nopermission": "!Sa'ati botiye diya'a teks to halaman boptiye.\nYi'o mowali [[Special:Search/{{PAGENAME}}|mololohu judul halaman botiye]] to halaman-halaman uweewo, meyalo [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mololohu log a'ayita], dabo Yi'o ja o ijin mohutu halaman botiye.", "userpage-userdoesnotexist-view": "Ta ohu'uwo \"$1\" diyaalu to daputari.", "clearyourcache": "Tuladu:Yilapato tilahu, yi'o musti lumawode to cache browser web bolo mo'oonto u yiloboli'a.\n* Firefox/Safari: Tahan Shift to'u yiloduto Reload, meyalo woduta Ctrl-F5 meyalo Ctrl-R (⌘-R di Mac)\n* Google Chrome: Woduta Ctrl-Shift-R (⌘-Shift-R di Mac)\n* Internet Explorer: Woduta Ctrl to'u yiloduto Refresh, meyalo woduta Ctrl-F5\n* Opera: Pergi ke Menu → Settings (Opera → Preferences di Mac) lalu ke Privacy & security → Clear browsing data → Cached images and files.", - "previewnote": "Elayi utiye bo mopobilohu.\nU biloli'umu diipo tilahu!", + "previewnote": "Elayi utiye bo mopobilohu.\nU biloli'umu diipo tilahu!", "continue-editing": "Ntali ode area momoli'o", "editing": "Momoli'o $1", "creating": "Mohutu $1", @@ -505,7 +505,7 @@ "hiddencategories": "Halaman botiye woluwo anggota {{PLURAL:$1|1 kategori wanto-wanto'o $1}}:", "permissionserrors": "Tilala haku momu'o", "permissionserrorstext-withaction": "Yi'o ja haku akses $2, sababu {{PLURAL:$1|alasani}} botiya:", - "recreate-moveddeleted-warn": "Mopo'ota: Yi'o lohutu ulangi hlaman u ma yiluluto.\n\nPopotimbangiyapo huhutumu botiye delo mowali poturusiyolo.\nBotiya log piloluluta wawu piloheyiya halaman botiye.", + "recreate-moveddeleted-warn": "Mopo'ota: Yi'o lohutu ulangi hlaman u ma yiluluto.\n\nPopotimbangiyapo huhutumu botiye delo mowali poturusiyolo.\nBotiya log piloluluta wawu piloheyiya halaman botiye.", "moveddeleted-notice": "Halaman botiye ma yiluluto.\nLog piloluluta, pilodahawa wawu piloheyiya halaman botiye woluwo to tibawa pohutu referensi.", "postedit-confirmation-saved": "Biloli'umu ma tilahu.", "edit-already-exists": "Ja mowali mohutu halaman bohu. Ma woluwo.", @@ -545,8 +545,8 @@ "nextn-title": "$1 {{PLURAL:$1|hasili}}lapatiyoma'o", "shown-title": "Popobilohe $1 {{PLURAL:$1|haasili}} per halaman", "viewprevnext": "Bilohi ($1 {{int:pipe-separator}} $2) ($3)", - "searchmenu-exists": "Woluwo halaman otanggula \"[[:$1]]\" to wiki botiye. {{PLURAL: $2|0=|Bilohi olo u yilotapu uweewo.}}", - "searchmenu-new": "mohutu halaman \"[[:$1]]\" to wiki botiya! {{PLURAL:$2|0=Bilohi halaman u yilotapu yilolohumu.|Bilohi hasili u yilotapu to'u yilolohu}}", + "searchmenu-exists": "Woluwo halaman otanggula \"[[:$1]]\" to wiki botiye. {{PLURAL:$2|0=|Bilohi olo u yilotapu uweewo.}}", + "searchmenu-new": "Mohutu halaman \"[[:$1]]\" to wiki botiya! {{PLURAL:$2|0=Bilohi halaman u yilotapu yilolohumu.|Bilohi hasili u yilotapu to'u yilolohu}}", "searchprofile-articles": "Tuwango halaman", "searchprofile-images": "Multimedia", "searchprofile-everything": "Nga'amila", @@ -735,7 +735,7 @@ "whatlinkshere": "Wumbuta", "whatlinkshere-title": "Halaman botiye o wumbuta ode \"$1\"", "whatlinkshere-page": "Halaman", - "linkshere": "Halaman botiye woluwo wumbuta ode $2:", + "linkshere": "Halaman botiye woluwo wumbuta ode $2:", "nolinkshere": "Diya'a halaman wumbuta ode $2", "isredirect": "halaman pilobaleyalo", "istemplate": "tranklusi", diff --git a/languages/i18n/gu.json b/languages/i18n/gu.json index 7efe8d28db..a955d651a9 100644 --- a/languages/i18n/gu.json +++ b/languages/i18n/gu.json @@ -553,7 +553,9 @@ "headline_tip": "બીજા ક્રમનું મથાળું", "nowiki_sample": "ફોર્મેટ કર્યા વગરનું લખાણ અહીં ઉમેરો", "nowiki_tip": "વિકિ ફોર્મેટીંગને અવગણો", + "image_sample": "Example.jpg", "image_tip": "અંદર વણાયેલી (Embedded) ફાઇલ", + "media_sample": "Example.ogg", "media_tip": "ફાઇલની કડી", "sig_tip": "સમયછાપ સાથે તમારા હસ્તાક્ષર", "hr_tip": "આડી લીટી (શક્ય તેટલો ઓછો ઉપયોગ કરો)", @@ -637,6 +639,7 @@ "template-protected": "(સુરક્ષિત)", "template-semiprotected": "(અર્ધ-સુરક્ષિત)", "hiddencategories": "આ પાનું {{PLURAL:$1|૧ છુપી શ્રેણી|$1 છુપી શ્રેણીઓ}}નું સભ્ય છે:", + "edittools": "", "nocreatetext": "{{SITENAME}}માં નવું પાનુ બનાવવા ઉપર નિયંત્રણ આવી ગયું છે.\n
    આપ પાછા જઇને હયાત પાનામાં ફેરફાર કરી શકો છો, નહિતર [[Special:UserLogin|પ્રવેશ કરો કે નવું ખાતું ખોલો]].", "nocreate-loggedin": "તમને નવાં પાનાં બનાવવાની પરવાનગી નથી.", "sectioneditnotsupported-title": "ખંડીય સંપાદન શક્ય નથી", @@ -1098,7 +1101,7 @@ "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|છેલ્લી મુલાકાતથી}}", "enhancedrc-history": "ઇતિહાસ", "recentchanges": "તાજા ફેરફારો", - "recentchanges-legend": "હાલમાં થયેલા ફેરફારોના વિકલ્પ", + "recentchanges-legend": "તાજા ફેરફારોના વિકલ્પો", "recentchanges-summary": "વિકિમાં તાજેતરમાં થયેલા ફેરફારો પર અહીંથી નજર રાખો.", "recentchanges-noresult": "આપેલા સમયગાળા દરમિયાન આ માપદંડો માટે કોઇ ફેરફારો મળ્યા નહી.", "recentchanges-feed-description": "આ ફીડ દ્વારા વિકિમાં થયેલા તાજા ફેરફારો પર ધ્યાન રાખો.", @@ -1109,6 +1112,7 @@ "recentchanges-label-plusminus": "પાનાનું કદ આપેલા અંકો જેટલાં બાઈટ્સ જેટલું બદલ્યુ છે.", "recentchanges-legend-heading": "કળ:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)", + "recentchanges-legend-plusminus": "(±૧૨૩)", "recentchanges-submit": "બતાવો", "rcfilters-legend-heading": "સંક્ષેપોની યાદી:", "rcfilters-other-review-tools": "અન્ય ચકાસણી સાધનો", @@ -1119,7 +1123,7 @@ "rcfilters-savedqueries-cancel-label": "રદ કરો", "rcfilters-show-new-changes": "તાજેતરના ફેરફારો દર્શાવો", "rcnotefrom": "નીચે $3, $4 થી {{PLURAL:$5|ફેરફાર|ફેરફારો}} દર્શાવેલ છે ($1 સુધી દર્શાવેલ છે).", - "rclistfrom": "$3 $2 બાદ થયેલા નવા ફેરફારો બતાવો", + "rclistfrom": "$2, $3 પછી થયેલા નવા ફેરફારો બતાવો", "rcshowhideminor": "નાના ફેરફારો $1", "rcshowhideminor-show": "બતાવો", "rcshowhideminor-hide": "છુપાવો", @@ -1361,9 +1365,9 @@ "filehist-filesize": "ફાઇલનું કદ", "filehist-comment": "ટિપ્પણી", "imagelinks": "ફાઇલનો વપરાશ", - "linkstoimage": "આ ફાઇલ સાથે {{PLURAL:$1|નીચેનું પાનું જોડાયેલું|$1 નીચેનાં પાનાઓ જોડાયેલાં}} છે", - "linkstoimage-more": "$1 કરતાં વધુ {{PLURAL:$1|પાનું|પાનાં}} આ ફાઇલ સાથે જોડાય છે.\nનીચે જણાવેલ યાદી ફક્ત આ ફાઇલ સાથે જોડાયેલ {{PLURAL:$1|પ્રથમ પાનાની કડી|પ્રથમ $1 પાનાંની કડીઓ}} બતાવે છે.\nઅહીં [[Special:WhatLinksHere/$2|પુરી યાદી]] મળશે.", - "nolinkstoimage": "આ ફાઇલ સાથે કોઇ પાનાં જોડાયેલાં નથી.", + "linkstoimage": "આ ફાઇલ માં {{PLURAL:$1|નીચેનું પાનું વપરાયેલું|$1 નીચેનાં પાનાઓ વપરાયેલાં}} છે:", + "linkstoimage-more": "$1 કરતાં વધુ {{PLURAL:$1|પાનું|પાનાં}} આ ફાઇલને વાપરે છે.\nનીચે જણાવેલ યાદી ફક્ત આ ફાઇલ સાથે જોડાયેલ {{PLURAL:$1|પ્રથમ પાનાની કડી|પ્રથમ $1 પાનાંની કડીઓ}} બતાવે છે.\nઅહીં [[Special:WhatLinksHere/$2|પુરી યાદી]] મળશે.", + "nolinkstoimage": "આ ફાઇલને કોઇ પાનાં વાપરતા નથી.", "morelinkstoimage": "આ ફાઇલ સાથે જોડાયેલ [[Special:WhatLinksHere/$1|વધુ કડીઓ]] જુઓ.", "linkstoimage-redirect": "$1 (ફાઈલ) $2 (પર નિર્દેશિત)", "duplicatesoffile": "નીચે જણાવેલ {{PLURAL:$1|ફાઇલ|$1 ફાઇલો}} આ ફાઇલની નકલ છે. ([[Special:FileDuplicateSearch/$2|વધુ વિગતો]])", @@ -1375,6 +1379,7 @@ "uploadnewversion-linktext": "આ ફાઇલની નવી આવૃત્તિ ચઢાવો", "shared-repo-from": "$1 થી", "shared-repo": "સાંઝો ભંડાર", + "shared-repo-name-wikimediacommons": "વિકિમિડીયા કોમન્સ", "upload-disallowed-here": "તમે આ ફાઇલ ઉપર લખી શકતા નથી.", "filerevert": "$1 હતું તેવું કરો", "filerevert-legend": "ફાઇલ હતી તેવી કરો", diff --git a/languages/i18n/ha.json b/languages/i18n/ha.json index 07c5c5b769..cf1ce58751 100644 --- a/languages/i18n/ha.json +++ b/languages/i18n/ha.json @@ -5,10 +5,11 @@ "아라", "DonCamillo", "Koavf", - "Ammarpad" + "Ammarpad", + "Mojaam" ] }, - "tog-underline": "Link underlining:", + "tog-underline": "Zana layin link", "tog-hideminor": "A ɓoye ƙananan gyare-gyare na baya-bayan nan", "tog-hidepatrolled": "A ɓoye gyare-gyaren kan ido a cikin gyare-gyare bayan-bayan nan", "tog-newpageshidepatrolled": "A ɓoye shafuna kan ido a cikin sabbin shafuna", diff --git a/languages/i18n/he.json b/languages/i18n/he.json index bb27dcc79e..c379bd308e 100644 --- a/languages/i18n/he.json +++ b/languages/i18n/he.json @@ -397,6 +397,7 @@ "ns-specialprotected": "לא ניתן לערוך דפים מיוחדים.", "titleprotected": "[[User:$1|$1]] {{GENDER:$1|הפעיל|הפעילה}} על הדף הזה הגנה מפני יצירה.\nהסיבה שניתנה להגנה היא: $2.", "filereadonlyerror": "לא ניתן לשנות את הקובץ \"$1\" כיוון שמאגר הקבצים \"$2\" במצב קריאה בלבד.\n\nמנהל המערכת שנעל את המאגר סיפק את ההסבר הבא: \"$3\".", + "invalidtitle": "כותרת בלתי תקינה", "invalidtitle-knownnamespace": "כותרת בלתי־תקינה עם מרחב השם \"$2\" ועם שם הדף \"$3\"", "invalidtitle-unknownnamespace": "כותרת בלתי־תקינה עם מרחב שם בלתי־ידוע מספר $1 ועם שם הדף \"$2\"", "exception-nologin": "לא בחשבון", @@ -1804,7 +1805,7 @@ "filehist-comment": "הערה", "imagelinks": "שימוש בקובץ", "linkstoimage": "{{PLURAL:$1|הדף הבא משתמש|הדפים הבאים משתמשים}} בקובץ זה:", - "linkstoimage-more": "יותר {{PLURAL:$1|מדף אחד מקשר|מ־$1 דפים מקשרים}} לקובץ זה.\nהרשימה הבאה מראה רק את {{PLURAL:$1|הדף הראשון שמקשר|$1 הדפים הראשונים שמקשרים}} לקובץ זה.\nניתן לצפות ב[[Special:WhatLinksHere/$2|רשימה המלאה]].", + "linkstoimage-more": "יותר {{PLURAL:$1|מדף אחד משתמש|מ־$1 דפים משתמשים}} בקובץ זה.\nהרשימה הבאה מראה רק את {{PLURAL:$1|הדף הראשון שמשתמש|$1 הדפים הראשונים שמשתמשים}} בקובץ.\nניתן לצפות ב[[Special:WhatLinksHere/$2|רשימה המלאה]].", "nolinkstoimage": "אין דפים המשתמשים בקובץ זה.", "morelinkstoimage": "ישנם [[Special:WhatLinksHere/$1|דפים נוספים]] שמשתמשים בקובץ זה.", "linkstoimage-redirect": "$1 (הפניה של קובץ) $2", @@ -2083,7 +2084,7 @@ "cachedspecial-refresh-now": "צפייה באחרון.", "categories": "קטגוריות", "categories-submit": "הצגה", - "categoriespagetext": "{{PLURAL:$1|הקטגוריה הבאה כוללת|הקטגוריות הבאות כוללות}} דפים או קובצי מדיה.\n[[Special:UnusedCategories|קטגוריות שאינן בשימוש]] לא מוצגות כאן.\nניתן לעיין גם ב[[Special:WantedCategories|רשימת הקטגוריות המבוקשות]].", + "categoriespagetext": "{{PLURAL:$1|הקטגוריה הבאה קיימת|הקטגוריות הבאות קיימות}} באתר הוויקי, {{PLURAL:$1|והיא עשויה|והן עשויות}} להיות בשימוש או לא להיות בשימוש.\nניתן לעיין גם ב[[Special:WantedCategories|רשימת הקטגוריות המבוקשות]].", "categoriesfrom": "הצגת קטגוריות החל מ:", "deletedcontributions": "תרומות משתמש מחוקות", "deletedcontributions-title": "תרומות משתמש מחוקות", @@ -4138,7 +4139,7 @@ "edit-error-long": "שגיאות:\n\n$1", "revid": "גרסה $1", "pageid": "מזהה דף $1", - "interfaceadmin-info": "$1\n\nההרשאות לעריכה של קובצי CSS/JS/JSON עבור כל האתר הופרדו לאחרונה מההרשאה editinterface. אם לא ברור לך מדוע קיבלת את השגיאה הזאת, ר' [[mw:MediaWiki_1.32/interface-admin]].", + "interfaceadmin-info": "$1\n\nההרשאות לעריכת קובצי CSS/JS/JSON של האתר כולו הופרדו לאחרונה מההרשאה editinterface. אם לא ברור לך מדוע קיבלת את הודעת השגיאה הזאת, ר' [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "לא ניתן להשתמש בתגיות <html> מחוץ לדפים רגילים.", "gotointerwiki": "עזיבת {{SITENAME}}", "gotointerwiki-invalid": "הכותרת שצוינה אינה תקינה.", diff --git a/languages/i18n/hi.json b/languages/i18n/hi.json index 5d111427b0..7da330fbfe 100644 --- a/languages/i18n/hi.json +++ b/languages/i18n/hi.json @@ -1060,7 +1060,7 @@ "prefsnologintext2": "अपनी वरीयताओं को बदलने के लिए कृपया लॉग इन करें।", "prefs-skin": "त्वचा", "skin-preview": "झलक", - "datedefault": "खा़स पसंद नहीं", + "datedefault": "ख़ास पसंद नहीं", "prefs-labs": "लैब विशेषताएँ", "prefs-user-pages": "सदस्य पृष्ठ", "prefs-personal": "सदस्य व्यक्तिरेखा", diff --git a/languages/i18n/hr.json b/languages/i18n/hr.json index 938791d073..4c31ab0400 100644 --- a/languages/i18n/hr.json +++ b/languages/i18n/hr.json @@ -1642,7 +1642,7 @@ "listfiles_date": "Datum", "listfiles_name": "Naziv slike", "listfiles_user": "Suradnik", - "listfiles_size": "Veličina (u bajtovima)", + "listfiles_size": "Veličina", "listfiles_description": "Opis", "listfiles_count": "Inačice", "listfiles-show-all": "Uključujući starije inačice datoteka", @@ -3455,7 +3455,7 @@ "htmlform-datetime-invalid": "Ne mogu prepoznati uneseno oblikovanje za datum i vrijeme. Pokušajte rabiti oblik GGGG-MM-DD HH:MM:SS.", "htmlform-date-toolow": "Navedena je vrijednost prije najranijega dopuštenog nadnevka – $1.", "htmlform-datetime-toohigh": "Uneseni datum i vrijeme su veći od $1", - "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3", + "logentry-delete-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je stranicu $3", "logentry-delete-delete_redir": "$1 premještanjem je {{GENDER:$2|pobrisao|pobrisala}} preusmjeravanje $3", "logentry-delete-restore": "$1 {{GENDER:$2|vratio|vratila}} je stranicu $3 ($4)", "logentry-delete-restore-nocount": "$1 {{GENDER:$2|vratio|vratila}} je stranicu $3", diff --git a/languages/i18n/ht.json b/languages/i18n/ht.json index 5769b9faed..6c537a70a5 100644 --- a/languages/i18n/ht.json +++ b/languages/i18n/ht.json @@ -10,7 +10,8 @@ "Tisave", "Bfpage", "Macofe", - "Lucas" + "Lucas", + "LeGuyanaisPure" ] }, "tog-underline": "Souliyen lyen yo :", diff --git a/languages/i18n/hu.json b/languages/i18n/hu.json index ed27e301d7..d252c7de71 100644 --- a/languages/i18n/hu.json +++ b/languages/i18n/hu.json @@ -50,7 +50,8 @@ "Urbalazs", "Bencemac", "Rodrigo", - "Tothasze" + "Tothasze", + "David92003" ] }, "tog-underline": "Hivatkozások aláhúzása:", @@ -410,6 +411,7 @@ "ns-specialprotected": "A speciális lapok nem szerkeszthetők.", "titleprotected": "Ilyen címmel nem lehet szócikket készíteni, [[User:$1|$1]] letiltotta.\nAz indoklás: $2.", "filereadonlyerror": "A(z) „$1” fájl nem módosítható, mert a(z) „$2” fájltároló csak olvasható módban üzemel.\n\nA lezárást végrehajtó rendszeradminisztrátor az alábbi indoklást adta meg: „$3”.", + "invalidtitle": "Érvénytelen cím", "invalidtitle-knownnamespace": "Érvénytelen cím „$2” névtérrel és „$3” szöveggel", "invalidtitle-unknownnamespace": "Érvénytelen cím az ismeretlen $1 névtérszámmal és „$2” szöveggel", "exception-nologin": "Nem vagy bejelentkezve.", @@ -1155,6 +1157,7 @@ "group-autoconfirmed": "automatikusan megerősített szerkesztők", "group-bot": "botok", "group-sysop": "adminisztrátorok", + "group-interface-admin": "felületadminisztrátorok", "group-bureaucrat": "bürokraták", "group-suppress": "adatvédelmi biztosok", "group-all": "(mind)", @@ -1162,16 +1165,18 @@ "group-autoconfirmed-member": "{{GENDER:$1|automatikusan megerősített felhasználó}}", "group-bot-member": "{{GENDER:$1|bot}}", "group-sysop-member": "{{GENDER:$1|adminisztrátor}}", + "group-interface-admin-member": "{{GENDER:$1|felületadminisztrátor}}", "group-bureaucrat-member": "{{GENDER:$1|bürokrata}}", "group-suppress-member": "{{GENDER:$1|adatvédelmi biztos}}", "grouppage-user": "{{ns:project}}:Felhasználók", "grouppage-autoconfirmed": "{{ns:project}}:Munkatársak#Automatikusan megerősített szerkesztők", "grouppage-bot": "{{ns:project}}:Botok", "grouppage-sysop": "{{ns:project}}:Adminisztrátorok", + "grouppage-interface-admin": "{{ns:project}}:Felületadminisztrátorok", "grouppage-bureaucrat": "{{ns:project}}:Bürokraták", "grouppage-suppress": "{{ns:project}}:Adatvédelmi biztosok", "right-read": "lapok olvasása", - "right-edit": "lapok szerkesztése", + "right-edit": "Lapok szerkesztése", "right-createpage": "lapok készítése (nem vitalapok)", "right-createtalk": "vitalapok készítése", "right-createaccount": "új felhasználói fiók készítése", @@ -2048,7 +2053,7 @@ "speciallogtitlelabel": "Cél (cím vagy felhasználóhoz {{ns:user}}:felhasználói név):", "log": "Rendszernaplók", "logeventslist-submit": "Mutat", - "logeventslist-more-filters": "További szűrők:", + "logeventslist-more-filters": "Egyéb naplók megjelenítése:", "logeventslist-patrol-log": "Ellenőrzési napló (patrol)", "logeventslist-tag-log": "Címkenapló", "all-logs-page": "Minden nyilvános napló", @@ -2404,6 +2409,7 @@ "uctop": "(aktuális)", "month": "E hónap végéig:", "year": "Eddig az évig:", + "date": "Eddig a dátumig:", "sp-contributions-newbies": "Csak a nemrég regisztrált szerkesztők közreműködéseinek mutatása", "sp-contributions-newbies-sub": "Új szerkesztők lapjai", "sp-contributions-newbies-title": "Új szerkesztők közreműködései", diff --git a/languages/i18n/hy.json b/languages/i18n/hy.json index c1deea2db2..7602df50fd 100644 --- a/languages/i18n/hy.json +++ b/languages/i18n/hy.json @@ -1434,7 +1434,7 @@ "exbeforeblank": "պարունակությունը մինչև մաքրումը. «$1»", "delete-confirm": "$1 ― ջնջում", "delete-legend": "Ջնջում", - "historywarning": "Զգուշացում. էջը, որը դուք պատրաստվում եք ջնջել ունի փոփոխությունների պատմություն։", + "historywarning": "Զգուշացում. էջը, որը դուք պատրաստվում եք ջնջել, ունի փոփոխությունների պատմություն։", "historyaction-submit": "Ցուցադրել", "confirmdeletetext": "Դուք պատրաստվում եք ընդմիշտ ջնջել էջը կամ պատկերը տվյալների բազայից իր փոփոխությունների պատմությամբ հանդերձ։ Խնդրում ենք հաստատել, որ դուք իրոք մտադրված եք դա անել, հասկանում եք դրա հետևանքները և գործում եք [[{{MediaWiki:Policy-url}}|կանոնադրության]] սահմաններում։", "actioncomplete": "Գործողությունն ավարտված է", diff --git a/languages/i18n/ia.json b/languages/i18n/ia.json index 48828ae6e6..65fe679119 100644 --- a/languages/i18n/ia.json +++ b/languages/i18n/ia.json @@ -364,6 +364,9 @@ "customcssprotected": "Tu non ha le permission de modificar iste pagina de CSS perque illo contine le configuration personal de un altere usator.", "customjsonprotected": "Tu non ha le permission de modificar iste pagina JSON perque illo contine le configuration personal de un altere usator.", "customjsprotected": "Tu non ha le permission de modificar iste pagina de JavaScript perque illo contine le configuration personal de un altere usator.", + "sitecssprotected": "Tu non ha le permission de modificar iste pagina CSS perque isto pote affectar tote le visitantes", + "sitejsonprotected": "Tu non ha le permission de modificar iste pagina JSON perque isto pote affectar tote le visitantes", + "sitejsprotected": "Tu non ha le permission de modificar iste pagina JavaScript perque isto pote affectar tote le visitantes", "mycustomcssprotected": "Tu non ha le permission de modificar iste pagina de CSS.", "mycustomjsonprotected": "Tu non ha le permission de modificar iste pagina JSON.", "mycustomjsprotected": "Tu non ha le permission de modificar iste pagina de JavaScript.", @@ -372,6 +375,7 @@ "ns-specialprotected": "Le paginas special non es modificabile.", "titleprotected": "Iste titulo ha essite protegite contra creation per [[User:$1|$1]].\nLe motivo specificate es $2.", "filereadonlyerror": "Impossibile modificar le file \"$1\" perque le repositorio de files \"$2\" es in modo de lectura sol.\n\nLe administrator de systema qui lo blocava offereva iste explication: \"$3\".", + "invalidtitle": "Titulo invalide", "invalidtitle-knownnamespace": "Titulo invalide con spatio de nomines \"$2\" e texto \"$3\"", "invalidtitle-unknownnamespace": "Titulo invalide con spatio de nomines incognite $1 e texto \"$2\"", "exception-nologin": "Non identificate", @@ -920,6 +924,8 @@ "diff-paragraph-moved-toold": "Le paragrapho ha essite displaciate. Clicca pro saltar al ancian position.", "difference-missing-revision": "{{PLURAL:$2|Un version|$2 versiones}} de iste differentia ($1) non ha essite trovate.\n\nIsto es generalmente causate per sequer un ligamine de diff obsolete a un pagina que ha essite delite.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].", "searchresults": "Resultatos del recerca", + "search-filter-title-prefix": "Cercar solmente in paginas de que le titulo comencia per \"$1\"", + "search-filter-title-prefix-reset": "Cercar in tote le paginas", "searchresults-title": "Resultatos del recerca de \"$1\"", "titlematches": "Correspondentias in le titulos de paginas", "textmatches": "Resultatos in le texto de paginas", @@ -1121,6 +1127,7 @@ "group-autoconfirmed": "Usatores autoconfirmate", "group-bot": "Bots", "group-sysop": "Administratores", + "group-interface-admin": "Administratores del interfacie", "group-bureaucrat": "Bureaucrates", "group-suppress": "Suppressores", "group-all": "(totes)", @@ -1128,12 +1135,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|usator|usatrice|usator}} autoconfirmate", "group-bot-member": "{{GENDER:$1|robot}}", "group-sysop-member": "{{GENDER:$1|administrator|administratrice|administrator}}", + "group-interface-admin-member": "{{GENDER:$1|administrator|administratrice}} del interfacie", "group-bureaucrat-member": "{{GENDER:$1|bureaucrate}}", "group-suppress-member": "{{GENDER:$1|suppressor}}", "grouppage-user": "{{ns:project}}:Usatores", "grouppage-autoconfirmed": "{{ns:project}}:Usatores autoconfirmate", "grouppage-bot": "{{ns:project}}:Bots", "grouppage-sysop": "{{ns:project}}:Administratores", + "grouppage-interface-admin": "{{ns:project}}:Administratores del interfacie", "grouppage-bureaucrat": "{{ns:project}}:Bureaucrates", "grouppage-suppress": "{{ns:project}}:Suppressores", "right-read": "Leger paginas", @@ -1184,6 +1193,9 @@ "right-editusercss": "Modificar le files CSS de altere usatores", "right-edituserjson": "Modificar le files JSON de altere usatores", "right-edituserjs": "Modificar le files JS de altere usatores", + "right-editsitecss": "Modificar le CSS global del sito", + "right-editsitejson": "Modificar le JSON global del sito", + "right-editsitejs": "Modificar le JavaScript global del sito", "right-editmyusercss": "Modificar le proprie files CSS de usator", "right-editmyuserjson": "Modificar le files JSON del proprie usator", "right-editmyuserjs": "Modificar le files JavaScript del proprie usator", @@ -1225,10 +1237,11 @@ "grant-createaccount": "Crear contos", "grant-createeditmovepage": "Crear, modificar e renominar paginas", "grant-delete": "Deler paginas, versiones e entratas de registro", - "grant-editinterface": "Modificar le spatio de nomines MediaWiki e le CSS/JSON/JavaScript de usatores", + "grant-editinterface": "Modificar le spatio de nomines MediaWiki e le JSON del sito e del usatores", "grant-editmycssjs": "Modificar le CSS/JSON/JavaScript del proprie usator", "grant-editmyoptions": "Modificar tu preferentias de usator", "grant-editmywatchlist": "Modificar tu observatorio", + "grant-editsiteconfig": "Modificar le CSS/JS del sito e del usatores", "grant-editpage": "Modificar paginas existente", "grant-editprotected": "Modificar paginas protegite", "grant-highvolume": "Modification in massa", @@ -1710,7 +1723,7 @@ "uploadstash-zero-length": "Le file ha un grandor de zero.", "invalid-chunk-offset": "Position de segmento invalide", "img-auth-accessdenied": "Accesso refusate", - "img-auth-nopathinfo": "PATH_INFO manca.\nLe servitor non ha essite configurate pro passar iste information.\nIllo pote esser basate super CGI e non pote supportar img_auth.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", + "img-auth-nopathinfo": "Le information sur le percurso manca.\nLe servitor debe esser configurate pro passar le variabiles REQUEST_URI e/o PATH_INFO.\nSi illo lo es, essaya activar $wgUsePathInfo.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", "img-auth-notindir": "Le cammino requestate non es in le directorio de incargamentos configurate.", "img-auth-badtitle": "Impossibile construer un titulo valide ex \"$1\".", "img-auth-nologinnWL": "Tu non ha aperite un session e \"$1\" non es in le lista blanc.", @@ -1726,6 +1739,7 @@ "http-timed-out": "Le requesta HTTP ha expirate.", "http-curl-error": "Error al obtener datos del URL: $1", "http-bad-status": "Un problema occurreva durante le requesta HTTP: $1 $2", + "http-internal-error": "Error interne de HTTP.", "upload-curl-error6": "Non poteva acceder al URL", "upload-curl-error6-text": "Le adresse URL fornite es inaccessibile.\nPer favor reverifica que le adresse URL sia correcte e que le sito sia in operation.", "upload-curl-error28": "Le incargamento se prolongava troppo", @@ -1770,9 +1784,9 @@ "filehist-filesize": "Dimension del file", "filehist-comment": "Commento", "imagelinks": "Uso de iste file", - "linkstoimage": "Le sequente {{PLURAL:$1|pagina ha un ligamine|$1 paginas ha ligamines}} verso iste file:", - "linkstoimage-more": "Plus de $1 {{PLURAL:$1|pagina ha un ligamine|paginas ha ligamines}} verso iste file.\nLe sequente lista monstra le {{PLURAL:$1|prime pagina|prime $1 paginas}} que puncta a iste file specific.\nUn [[Special:WhatLinksHere/$2|lista complete]] es disponibile.", - "nolinkstoimage": "Nulle pagina usa iste file.", + "linkstoimage": "Le sequente {{PLURAL:$1|pagina|$1 paginas}} usa iste file:", + "linkstoimage-more": "Plus de $1 {{PLURAL:$1|pagina|paginas}} usa iste file.\nLe sequente lista monstra le {{PLURAL:$1|prime pagina|prime $1 paginas}} que usa iste file solmente.\nUn [[Special:WhatLinksHere/$2|lista complete]] es disponibile.", + "nolinkstoimage": "Il non ha paginas que usa iste file.", "morelinkstoimage": "Vider [[Special:WhatLinksHere/$1|plus ligamines]] a iste file.", "linkstoimage-redirect": "$1 (redirection de file) $2", "duplicatesoffile": "Le sequente {{PLURAL:$1|file es un duplicato|$1 files es duplicatos}} de iste file ([[Special:FileDuplicateSearch/$2|plus detalios]]):", @@ -2017,7 +2031,7 @@ "speciallogtitlelabel": "Objectivo (titulo o {{ns:user}}:nomine de usator):", "log": "Registros", "logeventslist-submit": "Monstrar", - "logeventslist-more-filters": "Altere filtros:", + "logeventslist-more-filters": "Monstrar altere registros:", "logeventslist-patrol-log": "Registro de patrulia", "logeventslist-tag-log": "Registro de etiquettas", "all-logs-page": "Tote le registros public", @@ -2047,7 +2061,7 @@ "cachedspecial-refresh-now": "Vider le plus recente.", "categories": "Categorias", "categories-submit": "Monstrar", - "categoriespagetext": "Le sequente {{PLURAL:$1|categoria|categorias}} contine paginas o multimedia.\nLe [[Special:UnusedCategories|categorias non usate]] non se monstra hic.\nVide etiam le [[Special:WantedCategories|categorias desirate]].", + "categoriespagetext": "Le sequente {{PLURAL:$1|categoria|categorias}} existe sur iste wiki, e pote esser o non esser usate.\nVide etiam le [[Special:WantedCategories|categorias desirate]].", "categoriesfrom": "Monstrar categorias a partir de:", "deletedcontributions": "Contributiones delite de usatores", "deletedcontributions-title": "Contributiones delite de usatores", @@ -3995,6 +4009,7 @@ "edit-error-long": "Errores:\n\n$1", "revid": "version $1", "pageid": "ID de pagina $1", + "interfaceadmin-info": "$1\n\nLe permissiones pro modificar le files CSS/JS/JSON global del sito ha recentemente essite separate ab le derecto editinterface. Si tu non comprende proque tu incontra iste error, vide [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "Etiquettas <html> non pote esser usate foras de paginas normal.", "gotointerwiki": "Quitar {{SITENAME}}", "gotointerwiki-invalid": "Le titulo specificate non es valide.", @@ -4015,5 +4030,6 @@ "passwordpolicies-policy-passwordcannotmatchusername": "Le contrasigno non pote esser identic al nomine de usator", "passwordpolicies-policy-passwordcannotmatchblacklist": "Le contrasigno non pote corresponder a contrasignos in le lista nigre", "passwordpolicies-policy-maximalpasswordlength": "Le contrasigno debe continer minus de $1 {{PLURAL:$1|character|characteres}}", - "passwordpolicies-policy-passwordcannotbepopular": "Le contrasigno non pote esser {{PLURAL:$1|le contrasigno le plus popular|in le lista de $1 contrasignos popular}}" + "passwordpolicies-policy-passwordcannotbepopular": "Le contrasigno non pote esser {{PLURAL:$1|le contrasigno le plus popular|in le lista de $1 contrasignos popular}}", + "easydeflate-invaliddeflate": "Le contento fornite non es correctemente comprimite" } diff --git a/languages/i18n/io.json b/languages/i18n/io.json index 9b69a6295f..e62f91d18d 100644 --- a/languages/i18n/io.json +++ b/languages/i18n/io.json @@ -370,6 +370,7 @@ "ns-specialprotected": "On ne povas redaktar speciala pagini.", "titleprotected": "Ita titulo es protektita de kreado da [[User:$1|$1]].\nLa motivo es $2.", "filereadonlyerror": "La dosiero \"$1\" ne es modifikebla nam la depozeyo di dosieri \"$2\" esas nur lektebla.\n\nLa sistem-administrero qua klozis ol ofris ita klarigo: \"$3\".", + "invalidtitle": "Nevalida titulo", "invalidtitle-knownnamespace": "Ne-valida titulo kun nomaro \"$2\" e texto \"$3\"", "invalidtitle-unknownnamespace": "Nevalida titulo kun nekonocata nombro di limitilo 'namespace' $1 e texto \"$2\"", "exception-nologin": "Vu ne eniris", @@ -458,12 +459,12 @@ "wrongpasswordempty": "Vu ne skribis pasovorto. Probez nove.", "passwordtooshort": "Pasovorti mustas kontenar adminime {{PLURAL:$1|1 signo|$1 signi}}.", "passwordtoolong": "Pasovorti ne mustas esar plu longa kam {{PLURAL:$1|1 litero|$1 literi}}.", - "passwordtoopopular": "Voluntez selektar plu unika pasovorto.", + "passwordtoopopular": "Pasovorti tre facila ne povas uzesar. Voluntez selektar pasovorto nefacila por divinar.", "password-name-match": "Pasovorto mustas diferar de vua uzeronomo.", "password-login-forbidden": "La uzo di ita uzeronomo e pasovorto es interdiktita.", "mailmypassword": "Sendez nova pasovorto per e-posto", "passwordremindertitle": "Nova provizora pasovorto por {{SITENAME}}", - "passwordremindertext": "Ulu (probable tu, del IP-adreso $1) solicitis nova pasovorto de {{SITENAME}} ($4). Provizora pasovorto por l'uzero \"$2\" kreesis e sendesis a \"$3\". Se to esis tua volunto, tu mustas facar 'log in' e selektar nova pasovorto nun.\nTua tempala pasovorto expiros en {{PLURAL:$5|un dio|$5 dii}}.\n\nSe altra persono facis la demando, o se tu rimemoris tua anciena pasovorto e ne bezonas modifikar ol, tu povas ignorar ica mesajo e durar l'uzo di tua anciena pasovorto.", + "passwordremindertext": "Ulu (probable tu, del IP-adreso $1) solicitis nova pasovorto de {{SITENAME}} ($4). Provizora pasovorto por l'uzero \"$2\" kreesis e sendesis a \"$3\". Se to esis tua volunto, tu mustas facar 'log in' e selektar nova pasovorto nun.\nTua tempala pasovorto expiros en {{PLURAL:$5|un dio|$5 dii}}.\n\nSe ul altra persono facis la demando, o se tu rimemoris tua anciena pasovorto e ne bezonas modifikor ol, ignorez ica mesajo e durez uzar tua anciena pasovorto.", "noemail": "Ne esas e-adreso konservita por la uzero \"$1\".", "noemailcreate": "Tu mustas informar valida e-posto", "passwordsent": "Nova pasovorto sendesis a la e-adreso registragita por \"$1\".\nVoluntez enirar altrafoye pos recevar ol.", @@ -513,6 +514,7 @@ "botpasswords-existing": "\"bot\"-pasovorti existanta", "botpasswords-createnew": "Krear nova \"bot\"-pasovorto", "botpasswords-editexisting": "Modifikar \"bot\"-pasovorto existanta", + "botpasswords-label-needsreset": "(la pasovorto bezonas riestablisesar)", "botpasswords-label-appid": "Nomo dil \"bot\"", "botpasswords-label-create": "Krear", "botpasswords-label-update": "Aktualigar", @@ -522,6 +524,7 @@ "botpasswords-label-grants": "Uzebla grantaji:", "botpasswords-label-grants-column": "Permisita", "botpasswords-bad-appid": "La nomo \"$1\" por la bot-programo esas nevalida.", + "botpasswords-insert-failed": "L'adjunto di nova nomo \"$1\" por la 'bot' faliis. Ka ol ja adjuntesis?", "botpasswords-created-title": "Kreita pasovorto por la 'bot'", "botpasswords-created-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.", "botpasswords-updated-title": "La pasovorto dil 'bot' aktualigesis", @@ -533,13 +536,16 @@ "resetpass-submit-loggedin": "Chanjar pasovorto", "resetpass-submit-cancel": "Anular", "resetpass-wrong-oldpass": "Nevalida provizora od aktuala pasovorto.\nForsan vu ja chanjis vua pasovorto o demandis nova provizora pasovorto.", - "resetpass-recycled": "Voluntez chanjar vua pasovorto ad ulo diferanta de vua aktuala pasovorto.", + "resetpass-recycled": "Voluntez modifikar vua pasovorto per altra diferanta de vua nuna pasovorto.", "resetpass-temp-emailed": "Vu eniris uzante provizora pasovorto.\nPor parkompletigar enirado, vu mustas krear nova pasovorto hike:", "resetpass-temp-password": "Provizora pasovorto:", "resetpass-abort-generic": "La modifiko dil pasovorto interuptesis per ula 'extension'.", "resetpass-expired": "Vua pasovorto perdis la valideso. Voluntez krear nova pasovorto por facar 'log in'.", + "resetpass-expired-soft": "Vua pasovorto perdis la valideso e mustas modifikesar. Voluntez selektar nova pasovorto, o kliktez \"{{int:authprovider-resetpass-skip-label}}\" por modifikar ol pose.", + "resetpass-validity-soft": "Vua pasovorto esas nevalida: $1\n\nVoluntez selektar nova pasovorto, o kliktez \"{{int:authprovider-resetpass-skip-label}}\" por modifikar ol pose.", "passwordreset": "Sendez nova pasovorto per e-posto", "passwordreset-text-one": "Garnisez ica formulario por recevar provizora pasovorto per vua e-posto.", + "passwordreset-text-many": "{{PLURAL:$1|Skribez en un ek la texto-buxi por recevar tempala pasovorto per e-posto.}}", "passwordreset-username": "Uzantonomo:", "passwordreset-domain": "Interreto-domeno:", "passwordreset-email": "E-postal adreso:", @@ -593,12 +599,18 @@ "savechanges": "Konservez la chanji", "publishpage": "Publikigar pagino", "publishchanges": "Publikigar chanji", + "savearticle-start": "Registragar pagino", + "savechanges-start": "Konservez modifikuri...", + "publishpage-start": "Publikigar pagino...", + "publishchanges-start": "Publikigar chanji...", "preview": "Previdar", "showpreview": "Previdar", "showdiff": "Montrez chanji", "blankarticle": "Averto: La pagino quon vu kreis es vakua.\nSe vu ri-selektos \"$1\", la pagino kreesos sen irga kontenajo.", "anoneditwarning": "Averto: Vu ne eniris.\nVua IP-adreso esos videbla publike se vu redaktos. Se vu [$1 enirus] od [$2 kreus konto], vua redakti atribuesos a vua uzeronomo, kune kun altra bonaji.", "anonpreviewwarning": "Vu ne eniris. Konservar chanji registragos vua IP-adreso en la redakto-historio di ta pagino.", + "missingsummary": "Atencez: Vu ne furnisis titulo por ica komento.\nSe vu itere kliktos \"$1\", vua editado salveskos sen ula titulo.", + "selfredirect": "Atencez: Vu ridirektis ica pagino ad ol ipsa.\nPosible vu informis nekorekta skopo por la ridirekturo, o vu skribabas che nekorekta pagino.\nSe vu iter kliktos \"$1\", la ridirekturo kreesos, irgamaniere.", "missingcommenttext": "Voluntez skribar komento.", "missingcommentheader": "Atencez: Vu ne furnisis titulo por ica komento.\nSe vu itere kliktos \"$1\", vua editado salveskos sen ula titulo.", "summary-preview": "Previdado di la rezumo:", @@ -606,15 +618,17 @@ "previewerrortext": "Eventis eroro kande on probis krear previdado pri vua modifikuri.", "blockedtitle": "La uzero esas blokusita", "blockedtext": "Vua uzantonomo od IP-adreso blokusesis.\n\n$1 blokusis vu.\nLa motivo esis $2.\n\n* Komenco di la blokuso: $8\n* Fino di la blokuso: $6\n* Motivo dil blokuso: $7\n\nVu povas kontaktar $1 od altra [[{{MediaWiki:Grouppage-sysop}}|administrero]] por diskutar la blokuso.\nVu ne povas uzar \"email this user\" por sendar e-posto ecepte se valida email indikesis en tua [[Special:Preferences|preferaji dil uzanto]], e se vu ne blokusesis por uzar ol.\nVua nuna IP-adreso esas $3, e la ID dil blokuso esas #$5.\nVoluntez inkluzor omna detali adsupre en omna demandi quin vu facos.", - "autoblockedtext": "Vua uzantonomo od IP-adreso blokusesis.\n\n$1 blokusis vu.\nLa motivo esis $2.\n\n* Komenco di la blokuso: $8\n* Fino di la blokuso: $6\n* Motivo dil blokuso: $7\n\nVu povas kontaktar $1 od altra [[{{MediaWiki:Grouppage-sysop}}|administrero]] por diskutar la blokuso.\nVu ne povas uzar \"email this user\" por sendar e-posto ecepte se valida email indikesis en tua [[Special:Preferences|preferaji dil uzanto]], e se vu ne blokusesis por uzar ol.\nVua nuna IP-adreso esas $3, e la ID dil blokuso esas #$5.\nVoluntez inkluzor omna detali adsupre en omna demandi quin vu facos.", + "autoblockedtext": "Vua uzantonomo od IP-adreso blokusesis.\n\n$1 blokusis vu.\nLa motivo esis $2.\n\n* Komenco di la blokuso: $8\n* Fino di la blokuso: $6\n* Persono blokusata: $7\n\nVu povas kontaktar $1 od altra [[{{MediaWiki:Grouppage-sysop}}|administrero]] por diskutar pri la blokuso.\nVu ne povas uzar \"email this user\" por sendar e-posto, ecepte se valida email indikesis en tua [[Special:Preferences|preferaji dil uzero]], e se vu ne blokusesis por uzar ol.\nVua nuna IP-adreso esas $3, e la ID dil blokuso esas #$5.\nVoluntez inkluzor omna detali adsupre en omna demandi quin vu facos.", + "systemblockedtext": "Vua uzero-nomo od IP-adreso blokusabis automatale da MediaWiki.\nLa motivo esas:\n\n:$2\n\n* Komenco di la blokuso: $8\n* Fino di la blokuso: $6\n* Persono blokuzata: $7\n\nVua nuna IP-adreso esas $3.\nVoluntez inkluzar omna detalii furnisita adsupre, en irga demandi quin vu facos.", "blockednoreason": "nula motivo donesis", "whitelistedittext": "Vu mustas $1 por redaktar pagini.", "nosuchsectiontitle": "On ne povis trovar la seciono", + "nosuchsectiontext": "Vu probis redaktar seciono qua na existas.\nOl posible movesis od efacesis dum ke vu vidabis la pagino.", "loginreqtitle": "Eniro esas postulata", "loginreqlink": "enirar", "loginreqpagetext": "Vu mustas $1 por vidar altra pagini.", "accmailtitle": "Pasovorto sendita.", - "accmailtext": "Hazarde genitita pasovorto por [[User talk:$1|$1]] sendesis ad $2.\n\nLa pasovorto por ica nova konto povas chanjesar che la ''[[Special:ChangePassword|chanjar pasovorto]]'' pagino pos on eniras.", + "accmailtext": "Hazarde kreita pasovorto por [[User talk:$1|$1]] sendesis ad $2. Ol povas chanjesar che la pagino [[Special:ChangePassword|chanjar pasovorto]] pos vua 'login'.", "newarticle": "(nova)", "newarticletext": "Vu sequis ligilo a pagino qua ne existas ankore.\nPor krear ica pagino, voluntez startar skribar en la infra buxo.\n(regardez la [$1 helpo] por plusa informo).\nSe vu esas hike erore, kliktez sur la butono por retrovenar en vua navigilo.", "anontalkpagetext": "----\nYen la diskuto-pagino por anonima uzero, qua ankore ne kreabas konto, o se kreis ne uzas ol.\nDo, ni mustas uzar la IP-adreso por identifikar ilu/elu.\nTala IP-adreso povas uzesar da multa uzeri.\nSe vu esas anonima uzero e kreas ke nerelevanta komenti sendesis a vu, voluntez [[Special:CreateAccount|krear konto]], o [[Special:UserLogin|facar 'log in']] por preventar futura konfundo kun altra anonima uzeri.", @@ -659,6 +673,10 @@ "edit-conflict": "Konflikto di editi.", "postedit-confirmation-created": "La pagino kreesis.", "postedit-confirmation-saved": "Vua redakto konservesis", + "postedit-confirmation-published": "Vua redakturo publikigesis.", + "edit-already-exists": "Ne povis krear nova pagino.\nOl ja existas.", + "defaultmessagetext": "Ordinara mesajo-texto", + "invalid-content-data": "Nevalida kontenajo", "content-model-wikitext": "texto Wiki", "content-model-javascript": "JavaScript", "content-json-empty-object": "vakua objekto", @@ -668,6 +686,7 @@ "parser-unstrip-loop-warning": "Renkontresis nefinita procedo ('loop') en la funciono \"Unstrip\"", "undo-success": "La redakto ne povas desfacesar.\nVerifikez adinfre per komparo inter la du versioni se to esas fakte quon vu deziras facar; pose 'salvez' la modifiki por kompletigar la redakto.", "undo-failure": "Ne povis nuligar la redakto pro konflikti kun intermeza redakti.", + "undo-summary-username-hidden": "Desfacar revizo $1 facita da celita uzero", "cantcreateaccount-text": "La kreo di konto de ica adreso IP ($1) blokusesis da [[User:$3|$3]].\n\nLa motivo, segun $3, esas $2", "viewpagelogs": "Videz registrari por ca pagino", "nohistory": "Ne esas redakto-historio por ica pagino.", @@ -685,7 +704,7 @@ "page_last": "finala", "histlegend": "Selektado por diferi: markizez la versioni por komparar e presez 'Enter' o la butono adinfre.
    \nSurskriburo: '''({{int:cur}})''' = diferi kun la nuna versiono,\n'''({{int:last}})''' = diferi kun l'antea versiono,\n'''{{int:minoreditletter}}''' = mikra redakturo.", "history-fieldset-title": "Serchar revizi", - "history-show-deleted": "Nur efacita", + "history-show-deleted": "Revizo nure efacita", "histfirst": "Maxim anciena", "histlast": "Maxim nova", "historysize": "({{PLURAL:$1|1 bicoko|$1 bicoki}})", @@ -705,6 +724,7 @@ "revdelete-hide-image": "Celar kontenajo dil arkivo", "revdelete-hide-comment": "Rezumo di redakto", "revdelete-hide-user": "uzeronomo di redaktanto/IP-adreso", + "revdelete-radio-same": "(ne modifikez)", "revdelete-radio-set": "Celita", "revdelete-radio-unset": "Videbla", "revdelete-log": "Motivo:", @@ -713,11 +733,13 @@ "deletedhist": "Efacita versionaro", "revdelete-otherreason": "Altra/suplementala motivo:", "revdelete-reasonotherlist": "Altra motivo", + "mergehistory-empty": "Nula revizuri povas mixesar.", "mergehistory-reason": "Motivo:", "mergelog": "Protokolo pri kunfuzo", "revertmerge": "Desmixar", "history-title": "Version-historio di \"$1\"", "difference-title": "Diferi inter la revizi di $1", + "difference-multipage": "(Difero inter pagini)", "lineno": "Lineo $1:", "compareselectedversions": "Komparar selektita versioni", "showhideselectedversions": "Modifikez la videbleso di la selektita versioni", @@ -726,6 +748,7 @@ "diff-multi-sameuser": "(ne montresas {{PLURAL:$1|1 meza revizo|$1 meza revizi}} facita da la sama uzero)", "diff-multi-otherusers": "(ne montresas {{PLURAL:$1|1 intermeza revizo|$1 intermeza revizi}} facita da {{PLURAL:$2|altra uzero|$2 altra uzeri}})", "searchresults": "Rezultaji dil sercho", + "search-filter-title-prefix-reset": "Traserchar pagini", "searchresults-title": "Sercho-rezultaji por \"$1\"", "titlematches": "Koincidi de titulo di artiklo", "textmatches": "Koincidi de texto di artiklo", @@ -733,6 +756,7 @@ "prevn": "antea {{PLURAL:$1|$1}}", "nextn": "sequanta {{PLURAL:$1|$1}}", "prev-page": "Antea pagino", + "next-page": "sequanta pagino", "prevn-title": "Antea $1 {{PLURAL:$1|rezultajo|rezultaji}}", "nextn-title": "Sequanta $1 {{PLURAL:$1|rezultajo|rezultaji}}", "shown-title": "Montrez $1 {{PLURAL:$1|rezulto|rezulti}} per pagino", @@ -751,25 +775,32 @@ "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membri}} ({{PLURAL:$2|1 subkategorio|$2 subkategorii}}, {{PLURAL:$3|1 arkivo|$3 arkivi}})", "search-redirect": "(Ridirektita de $1)", "search-section": "(seciono $1)", + "search-category": "(kategorio $1)", "search-file-match": "(kongruanta kun la kontenajo)", "search-suggest": "Ka vu volis dicar: $1", "search-rewritten": "Yen la rezulti por \"$1\". Serchez vice por \"$2\".", - "search-interwiki-caption": "Altra projekti", + "search-interwiki-caption": "Rezulti de fratala projeti", "search-interwiki-default": "Rezultaji de $1:", "search-interwiki-more": "(plusa)", + "search-interwiki-more-results": "plusa rezultajo", + "search-relatedarticle": "Relatata", + "searchrelated": "relatata", "searchall": "omna", "showingresults": "Montrante infre {{PLURAL:$1|'''1''' rezulto|'''$1''' rezulti}}, qui komencas kun numero #'''$2'''.", "showingresultsinrange": "Infre montresas {{PLURAL:$1|1 rezulto|$1 rezulti}}, en l'intervalo #$2 til #$3.", "search-showingresults": "{{PLURAL:$4|Rezulto $1 de $3|rezulti $1 – $2 de $3}}", "search-nonefound": "Nula rezulto trovesis por vua serchado.", + "search-nonefound-thiswiki": "Nula rezulto trovesis por vua serchado.", "powersearch-legend": "Avancita sercho", "powersearch-ns": "Serchez en nomari:", + "powersearch-togglelabel": "Selektez:", "powersearch-toggleall": "Omna", "powersearch-togglenone": "Nula", "powersearch-remember": "Memorez la selektajo por futura serchi", "search-external": "Extera sercho", "searchdisabled": "La sercho en la kompleta texto desaktivigesis temporale pro superkargo dil servanto. Ni esperas riaktivigar ol pos facar ula proxima aktualigi. Dum ica tempo, vu povas serchar per Google.", "search-error": "Eventis eroro dum serchado: $1", + "search-warning": "Eventis eroro dum serchado: $1", "preferences": "Preferaji", "mypreferences": "Preferaji", "prefs-edits": "Nombro di redaktaji:", @@ -777,10 +808,12 @@ "prefs-skin": "Pelo", "skin-preview": "Pre-videz", "datedefault": "Sen prefero", + "prefs-user-pages": "Uzeropagini", "prefs-personal": "Personala informo", "prefs-rc": "Recenta chanji", "prefs-watchlist": "Surveyo-listo", "prefs-editwatchlist": "Modifikez surveyo-listo", + "prefs-editwatchlist-label": "Facez modifikuri en vua surveyo-listo:", "prefs-editwatchlist-edit": "Vidar e removar tituli de vua surveyo-listo", "prefs-editwatchlist-raw": "Modifikez vua surveyo-listo en formo di texto", "prefs-editwatchlist-clear": "Efacar vua surveyo-listo", @@ -823,6 +856,7 @@ "prefs-namespaces": "Nomari", "default": "Ordinara ('default')", "prefs-files": "Arkivi", + "prefs-custom-js": "Ordinara JavaScript", "prefs-emailconfirm-label": "Konfirmado dil e-posto (e-mail):", "youremail": "Vua e-adreso:", "username": "{{GENDER:$1|Uzeronomo}}:", @@ -845,14 +879,21 @@ "prefs-info": "Bazala informo", "prefs-i18n": "Internacioniigo", "prefs-signature": "Signaturo", + "prefs-dateformat": "Formato di la dato", "prefs-timeoffset": "Registro dil tempo", + "prefs-advancedediting": "Ordinara selekti", + "prefs-developertools": "Utensili por la kreero", "prefs-editor": "Redaktilo", "prefs-preview": "Previdar", "prefs-advancedrc": "Progresiva selektaji (advanced options)", "prefs-advancedrendering": "Progresiva selektaji (advanced options)", "prefs-advancedsearchoptions": "Progresiva selektaji (advanced options)", "prefs-advancedwatchlist": "Progresiva selektaji (advanced options)", + "prefs-tokenwatchlist": "Token", "prefs-diffs": "Diferi", + "prefs-help-prefershttps": "Ica preferajo efektigesos dum vua sequanta 'login'.", + "userrights": "Yuri dil uzero", + "userrights-lookup-user": "Selektez uzero", "userrights-user-editname": "Skribez uzantonomo:", "editusergroup": "Charjez grupi dil uzero", "userrights-groupsmember": "Membro di:", @@ -875,6 +916,9 @@ "grouppage-bureaucrat": "{{ns:project}}:Burokrati", "right-read": "Lektar pagini", "right-edit": "Redaktar pagini", + "right-createpage": "Krear pagini (qui ne esas diskuto-pagini)", + "right-createtalk": "Krear diskuto-pagini", + "right-createaccount": "Krear nova uzero-konti", "right-move": "Movar pagini", "right-movefile": "Movar arkivi", "right-upload": "Adkargar arkivi", @@ -1000,7 +1044,7 @@ "recentchangeslinked-feed": "Relatanta chanji", "recentchangeslinked-toolbox": "Relatanta chanji", "recentchangeslinked-title": "Chanji pri \"$1\"", - "recentchangeslinked-summary": "Skribez la nomo di ula pagino por vidar la modifikuri en pagini ligita ad ol. (Por vidar la membri di ula kategoriio, skribez Kategorio:Nomo di la kategorio). Chanji en la pagini qui esas en [[Special:Watchlist|vua surveryo-listo]] aparos en dika literi.", + "recentchangeslinked-summary": "Skribez la nomo di ula pagino por vidar la modifikuri en la pagini ligita ad ol. (Por vidar la kompozanti di ula kategoriio, skribez {{ns:category}}:Nomo di la kategorio). Chanji en la pagini qui esas en [[Special:Watchlist|vua surveryo-listo]] aparos en dika literi.", "recentchangeslinked-page": "Nomo di la pagino:", "recentchangeslinked-to": "Montrez chanji a pagini ligita a la specigita pagino vice", "recentchanges-page-added-to-category": "[[:$1]] adjuntita a kategorio", @@ -1385,6 +1429,7 @@ "ipb-hardblock": "Impedar redakturi e modifikuri de uzeri qui facas 'login' de ica IP-adreso", "ipbcreateaccount": "Preventez kreo di konti", "ipbemailban": "Impedar l'uzero sendar e-posto", + "ipbenableautoblock": "Automatale blokusar la lasta IP-adreso uzita da ica uzero, ed altra sequanta IP-adresi quin ilu probus uzar por redaktar", "ipbsubmit": "Blokusar ica uzero", "ipbother": "Altra tempo:", "ipboptions": "2 hori:2 hours,1 dio:1 day,3 dii:3 days,1 semano:1 week,2 semani:2 weeks,1 monato:1 month,3 monati:3 months,6 monati:6 months,1 yaro:1 year,nefinita:infinite", @@ -1627,6 +1672,7 @@ "exif-gpslatitude": "Latitudo", "exif-gpslongitude": "Longitudo", "exif-gpsaltitude": "Altitudo", + "exif-label": "Etiketo", "exif-unknowndate": "Nesavata dato", "exif-orientation-1": "Normala", "exif-exposureprogram-1": "Manuala", @@ -1729,6 +1775,7 @@ "tags-edit": "redaktar", "tags-hitcount": "$1 {{PLURAL:$1|chanjo|chanji}}", "tags-create-explanation": "Segun predefino, la nova etiketi kreita divenos disponebla por uzado, sive da uzeri, sive da informatikoprogrami 'bot'.", + "tags-create-tag-name": "Nomo dil etiketo:", "tags-create-warnings-above": "La sequanta {{PLURAL:$2|avizo|avizi}} renkontresis, probante kreir l'etiketo \"$1\":", "tags-delete-not-found": "L'etiketo \"$1\" ne existas.", "tags-delete-too-many-uses": "L'etiketo \"$1\" uzesas en plua kam $2 {{PLURAL:$2|revizo|revizi}}, do ol ne povas eskartesar.", @@ -1752,6 +1799,7 @@ "logentry-move-move": "$1 {{GENDER:$2|movis}} la pagino $3 a $4", "logentry-move-move-noredirect": "$1 {{GENDER:$2|movis}} la pagino $3 a $4 sen lasar ridirektilo", "logentry-move-move_redir": "$1 {{GENDER:$2|movis}} la pagino $3 a $4 sen lasar ridirekto", + "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|movis}} la pagino $3 a $4 super antea ridirekto sen lasar ridirekto", "logentry-patrol-patrol-auto": "$1 automatale {{GENDER:$2|indikis}} ke la revizo $4 de la pagino $3 surveyesas", "logentry-newusers-create": "La konto dil uzero $1 kreesis.", "logentry-newusers-autocreate": "L'uzanto $1 {{GENDER:$2|kreesis}} automatale", diff --git a/languages/i18n/is.json b/languages/i18n/is.json index f14b8457ce..69bb50474f 100644 --- a/languages/i18n/is.json +++ b/languages/i18n/is.json @@ -64,7 +64,7 @@ "tog-watchlisthideminor": "Ekki sýna minniháttar breytingar á vaktlistanum", "tog-watchlisthideliu": "Ekki sýna breytingar innskráðra notenda á vaktlistanum", "tog-watchlistreloadautomatically": "Endurhlaða vaktlista sjálfkrafa þegar síu er breytt (krefst JavaScript)", - "tog-watchlistunwatchlinks": "Bæta við beinum vakta/ekki vakta tenglum við færslur á vöktunarlista (krefst JavaScript til að víxla af/á)", + "tog-watchlistunwatchlinks": "Bæta við beinum vakta/ekki vakta tenglum ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) við færslur á vöktunarlista (krefst JavaScript til að víxla af/á)", "tog-watchlisthideanons": "Ekki sýna breytingar óþekktra notenda á vaktlistanum", "tog-watchlisthidepatrolled": "Fela yfirfarnar breytingar í vaktlistanum", "tog-watchlisthidecategorization": "Fela flokkun á síðum", @@ -387,6 +387,7 @@ "ns-specialprotected": "Kerfissíðum er ekki hægt að breyta.", "titleprotected": "Þessi titill hefur verið verndaður fyrir sköpun af [[User:$1|$1]].\nÁstæðan sem gefin var ''$2''.", "filereadonlyerror": "Ekki var hægt að breyta skránni \"$1\" því skráin í skráarsafninu \"$2\" er engöngu hægt að lesa.\n\nKerfisstjórinn sem læsti skránni gaf þessa ástæðu: \"$3\".", + "invalidtitle": "Ógildur titill", "invalidtitle-knownnamespace": "Ógildur titill í nafnrými \"$2\" og með textann \"$3\"", "invalidtitle-unknownnamespace": "Ógildur titill með óþekkt nafnrými númer $1 og texta \"$2\"", "exception-nologin": "Ekki skráð/ur inn", @@ -476,12 +477,12 @@ "wrongpasswordempty": "Lykilorðsreiturinn var auður. Reyndu aftur.", "passwordtooshort": "Lykilorð skal vera að minnsta kosti $1 {{PLURAL:$1|stafur|stafir}}.", "passwordtoolong": "Lykilorð geta ekki verið lengri en $1 {{PLURAL:$1|stafur|stafir}}.", - "passwordtoopopular": "Ekki má nota títt valin lykilorð. Vinsamlegast velja lykilorð sem erfiðara er að giska á.", + "passwordtoopopular": "Ekki má nota algeng lykilorð. Veldu eitthvað lykilorð sem erfiðara er að giska á.", "password-name-match": "Þarf að lykilorð þitt sé öðruvísi notandanafni þínu", "password-login-forbidden": "Notkun þessa notandanafns og lykilorðs er ekki leyfileg.", "mailmypassword": "Endurstilla lykilorð", "passwordremindertitle": "Nýtt bráðabirgðalykilorð fyrir {{SITENAME}}", - "passwordremindertext": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um að fá nýtt\nlykilorð fyrir {{SITENAME}} ($4). Tímabundið lykilorð fyrir notandann „$2“\nhefur verið búið til og er núna „$3“. Ef þetta er það sem þú vildir, þarfu að skrá\nþig inn og velja nýtt lykilorð. Þetta tímabundna lykilorð rennur út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það var ekki þú sem fórst fram á þetta, eða ef þú manst lykilorðið þitt,\nog vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og\nhalda áfram að nota gamla lykilorðið.", + "passwordremindertext": "Einhver (á vistfanginu $1) hefur beðið um að fá nýtt\nlykilorð fyrir {{SITENAME}} ($4). Tímabundið lykilorð fyrir notandann „$2“\nhefur verið búið til og er núna „$3“. Ef þetta er það sem þú vildir, þarfu að skrá\nþig inn og velja nýtt lykilorð. Þetta tímabundna lykilorð rennur út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það var ekki þú sem fórst fram á þetta, eða ef þú manst lykilorðið þitt,\nog vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og\nhalda áfram að nota gamla lykilorðið.", "noemail": "Það er ekkert netfang skráð fyrir notandan \"$1\".", "noemailcreate": "Þú verður að skrá gilt netfang", "passwordsent": "Nýtt lykilorð var sent á netfangið sem er skráð á „$1“.\nSkráðu þig inn á ný þegar þú hefur móttekið það.", @@ -552,8 +553,8 @@ "resetpass-temp-password": "Bráðabirgðalykilorð:", "resetpass-abort-generic": "Breytingum á lykilorðum hefur verið hætt með viðbót.", "resetpass-expired": "Lykilorðið þitt er útrunnið. Skráðu nýtt lykilorð til að skrá þig inn.", - "resetpass-expired-soft": "Lykilorðið þitt er útrunnið og þarf að endurstilla það. Veldu núna nýtt lykilorð, eða smelltu á \"{{int:authprovider-resetpass-skip-label}}\" til að endurstilla það síðar.", - "resetpass-validity-soft": "Lykilorðið þitt er ekki lengur gilt: $1\n\nVeldu núna nýtt lykilorð, eða smelltu á \"{{int:authprovider-resetpass-skip-label}}\" til að endurstilla það síðar.", + "resetpass-expired-soft": "Lykilorðið þitt er útrunnið og þarf að endurstilla það. Veldu núna nýtt lykilorð, eða smelltu á \"{{int:authprovider-resetpass-skip-label}}\" til að breyta því síðar.", + "resetpass-validity-soft": "Lykilorðið þitt er ekki lengur gilt: $1\n\nVeldu núna nýtt lykilorð, eða smelltu á \"{{int:authprovider-resetpass-skip-label}}\" til að breyta því síðar.", "passwordreset": "Endurstilla lykilorð", "passwordreset-text-one": "Útfylltu þetta eyðublað til þess að endursetja lykilorðið.", "passwordreset-text-many": "{{PLURAL:$1|Fylltu í einn af reitunum hér fyrir neðan til að fá tölvupóst með bráðabirgðalykilorði.}}", @@ -662,7 +663,7 @@ "userjspreview": "'''Mundu að þú ert aðeins að prófa/forskoða JavaScript-kóðann þinn.'''\n'''Hann hefur ekki enn verið vistaður!'''", "sitecsspreview": "'''Mundu að þú ert aðeins að forskoða CSS-kóðann þinn.'''\n'''Hann hefur ekki enn verið vistaður!'''", "sitejspreview": "'''Mundu að þú ert aðeins að prófa/forskoða JavaScript-kóðann.'''\n'''Hann hefur ekki enn verið vistaður!'''", - "userinvalidconfigtitle": "Viðvörun: Skinnið \"$1\" er ekki til. Sérsniðin CSS og JavaScript útlit nota lágstafi, t.d. {{ns:user}}:Foo/vector.css en alls ekki {{ns:user}}:Foo/Vector.css.", + "userinvalidconfigtitle": "Aðvörun: Skinnið \"$1\" er ekki til. Sérsniðnar .css, .json og .js síður nota lágstafi, t.d. {{ns:user}}:Foo/vector.css en alls ekki {{ns:user}}:Foo/Vector.css.", "updated": "(Uppfært)", "note": "'''Athugið:'''", "previewnote": "'''Það sem sést hér er aðeins forskoðun og hefur ekki enn verið vistað!'''", @@ -688,7 +689,7 @@ "longpageerror": "VILLA: Textinn sem þú sendir inn er $1 {{PLURAL:$1|eitt kílóbæti|$1 kílóbæti}} að lengd, en hámarkið er $2 {{PLURAL:$2|eitt kílóbæti|$2 kílóbæti}}.Ekki er hægt að vista textann.", "readonlywarning": "AÐVÖRUN: Gagnagrunninum hefur verið læst til að unnt sé að framkvæma viðhaldsaðgerðir, svo þú getur ekki vistað breytingar þínar núna.\nÞú ættir að klippa og líma textann yfir í textaskjal til þess að geyma hann til seinni tíma.\n\nKerfisstjórinn sem læsti honum gaf þessa skýringu: $1", "protectedpagewarning": "'''Viðvörun: Þessari síðu hefur verið læst svo aðeins notendur með möppudýraréttindi geti breytt henni.'''\nSíðasta færsla síðunnar úr verndunarskrá er sýnd til skýringar:", - "semiprotectedpagewarning": "'''Athugið''': Þessari síðu hefur verið læst þannig að aðeins innskráðir notendur geti breytt henni.\nSíðasta færsla síðunnar úr verndunarskrá er sýnd til skýringar:", + "semiprotectedpagewarning": "Athugaðu: Þessari síðu hefur verið læst þannig að aðeins staðfestir notendur geti breytt henni.\nSíðasta færsla síðunnar úr verndunarskrá er sýnd til skýringar:", "cascadeprotectedwarning": "Viðvörun: Þessari síðu hefur verið læst þannig að aðeins notendur með [[Special:ListGroupRights|sérstök réttindi]] geta breytt henni, því hún er ítengd keðjuvörn eftirfarandi {{PLURAL:$1|síðu|síðna}}:", "titleprotectedwarning": "''VIÐVÖRUN: Þessari síðu hefur verið læst svo aðeins [[Special:ListGroupRights|sérstakir notendur]] geta breytt henni.'''\nVerndunarskrá síðunnar er gefin fyrir neðan til tilvísunar.", "templatesused": "Sniðmát {{PLURAL:$1|notað|notuð}} á þessari síðu:", @@ -1188,7 +1189,7 @@ "grant-createeditmovepage": "Búa til, breyta og færa síður", "grant-delete": "Eyða síðum, yfirferðum og annálsfærslum", "grant-editinterface": "Breyta nafnrými MediaWiki og CSS/JavaScript notanda", - "grant-editmycssjs": "Breyta þínum eigin CSS/JavaScript", + "grant-editmycssjs": "Breyta þínum eigin CSS/JSON/JavaScript", "grant-editmyoptions": "Breyta notandastillingunum þínum", "grant-editmywatchlist": "Breyta vaktlistanum þínum", "grant-editpage": "Breyta fyrirliggjandi síðum", @@ -1315,7 +1316,7 @@ "rcfilters-empty-filter": "Engar virkar síur. Öll framlög eru sýnileg.", "rcfilters-filterlist-title": "Síur", "rcfilters-filterlist-whatsthis": "Hvernig virkar þetta?", - "rcfilters-filterlist-feedbacklink": "Láttu okkur vita hvað þér finnst um þessi (nýju) síuverkfæri", + "rcfilters-filterlist-feedbacklink": "Láttu okkur vita hvað þér finnst um þessi síuverkfæri", "rcfilters-highlightbutton-title": "Áherslulita niðurstöður", "rcfilters-highlightmenu-title": "Veldu lit", "rcfilters-highlightmenu-help": "Veldu lit til að merkja þetta einkenni með", @@ -1438,7 +1439,7 @@ "recentchangeslinked-feed": "Skyldar breytingar", "recentchangeslinked-toolbox": "Skyldar breytingar", "recentchangeslinked-title": "Breytingar tengdar \"$1\"", - "recentchangeslinked-summary": "Settu inn heiti á síðu til að sjá breytingar á síðum sem tengt er í frá þeirri síðu. (Til að sjá meðlimi í ákveðnum flokki, settu inn Flokkur:Nafn á flokki). \nBreytingar á síðum á [[Special:Watchlist|vaktlistanum þínum]] eru feitletraðar.", + "recentchangeslinked-summary": "Settu inn heiti á síðu til að sjá breytingar á síðum sem tengt er í frá þeirri síðu. (Til að sjá meðlimi í ákveðnum flokki, settu inn {{ns:category}}:Nafn á flokki). \nBreytingar á síðum á [[Special:Watchlist|vaktlistanum þínum]] eru feitletraðar.", "recentchangeslinked-page": "Síðutitill:", "recentchangeslinked-to": "Sýna breytingar á síðum sem tengjast uppgefinni síðu í staðinn", "recentchanges-page-added-to-category": "[[:$1]] bætt við flokk", @@ -1675,9 +1676,9 @@ "filehist-filesize": "Stærð skráar", "filehist-comment": "Athugasemd", "imagelinks": "Skráartenglar", - "linkstoimage": "Eftirfarandi {{PLURAL:$1|síða tengist|$1 síður tengjast}} í þessa skrá:", - "linkstoimage-more": "Fleiri en $1 {{PLURAL:$1|síða tengist|síður tengjast}} þessari skrá.\nEftirfarandi listi sýnir {{PLURAL:$1|fyrsta myndatengilinn|fyrstu $1 myndatenglana}}.\n[[Special:WhatLinksHere/$2|Tæmandi listi]] er til staðar.", - "nolinkstoimage": "Engar síður tengja í þessa skrá.", + "linkstoimage": "Eftirfarandi {{PLURAL:$1|síða notar|$1 síður nota}} þessa skrá:", + "linkstoimage-more": "Fleiri en $1 {{PLURAL:$1|síða notar|síður nota}} þessa skrá.\nEftirfarandi listi sýnir {{PLURAL:$1|fyrstu síðuna|fyrstu $1 síðurnar}} sem nota eingöngu þessa skrá.\n[[Special:WhatLinksHere/$2|Tæmandi listi]] er til staðar.", + "nolinkstoimage": "Það eru engar síður sem nota þessa skrá.", "morelinkstoimage": "Skoða [[Special:WhatLinksHere/$1|fleiri myndatengla]] á þessa skrá.", "linkstoimage-redirect": "$1 (tilvísun) $2", "duplicatesoffile": "Eftirfarandi $2 {{PLURAL:$1|skrá er afrit|skrár eru afrit}} af þessari skrá ([[Special:FileDuplicateSearch/$2|Frekari upplýsingar]]):", @@ -2593,7 +2594,7 @@ "tooltip-ca-nstab-category": "Sýna efnisflokkasíðuna", "tooltip-minoredit": "Merkja þessa breytingu sem minniháttar", "tooltip-save": "Vista breytingar þínar", - "tooltip-publish": "Gefa út breytingar þínar", + "tooltip-publish": "Gefa út breytingarnar þínar", "tooltip-preview": "Forskoða breytingarnar þínar. Gerðu þetta áður en þú vistar.", "tooltip-diff": "Sýna hvaða breytingar þú gerðir á textanum.", "tooltip-compareselectedversions": "Sjá breytingarnar á þessari grein á milli útgáfanna sem þú valdir.", diff --git a/languages/i18n/it.json b/languages/i18n/it.json index 1babfda9ab..7a3e68d57a 100644 --- a/languages/i18n/it.json +++ b/languages/i18n/it.json @@ -1015,6 +1015,8 @@ "diff-paragraph-moved-toold": "Il paragrafo è stato spostato. Clicca per passare alla vecchia posizione.", "difference-missing-revision": "{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.\n\nQuesto si verifica solitamente seguendo un collegamento obsoleto di un diff a una pagina cancellata.\nI dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].", "searchresults": "Risultati della ricerca", + "search-filter-title-prefix": "Ricerca effettuata solo nelle pagine con titolo che inizia con \"$1\"", + "search-filter-title-prefix-reset": "Cerca in tutte le pagine", "searchresults-title": "Risultati della ricerca di \"$1\"", "titlematches": "Corrispondenze nel titolo delle pagine", "textmatches": "Corrispondenze nel testo delle pagine", @@ -1854,9 +1856,9 @@ "filehist-filesize": "Dimensione del file", "filehist-comment": "Commento", "imagelinks": "Utilizzo del file", - "linkstoimage": "{{PLURAL:$1|La seguente pagina contiene|Le seguenti $1 pagine contengono}} collegamenti a questo file:", - "linkstoimage-more": "Più di $1 {{PLURAL:$1|pagina punta|pagine puntano}} a questo file.\nDi seguito sono elencate solo {{PLURAL:$1|la prima pagina che punta|le prime $1 pagine che puntano}} a questo file.\nÈ disponibile un [[Special:WhatLinksHere/$2|elenco completo]].", - "nolinkstoimage": "Nessuna pagina contiene collegamenti al file.", + "linkstoimage": "{{PLURAL:$1|La seguente pagina usa|Le seguenti $1 pagine usano}} questo file:", + "linkstoimage-more": "Più di $1 {{PLURAL:$1|pagina usa|pagine usano}} questo file.\nDi seguito sono elencate solo {{PLURAL:$1|la prima pagina che usa|le prime $1 pagine che usano}} questo file.\nÈ disponibile un [[Special:WhatLinksHere/$2|elenco completo]].", + "nolinkstoimage": "Nessuna pagina utilizza questo file.", "morelinkstoimage": "Visualizza [[Special:WhatLinksHere/$1|altri collegamenti]] a questo file.", "linkstoimage-redirect": "$1 (reindirizzamento file) $2", "duplicatesoffile": "{{PLURAL:$1|Il seguente file è un duplicato|I seguenti $1 file sono duplicati}} di questo file ([[Special:FileDuplicateSearch/$2|ulteriori dettagli]]):", @@ -2128,7 +2130,7 @@ "cachedspecial-refresh-now": "Mostra la più recente.", "categories": "Categorie", "categories-submit": "Mostra", - "categoriespagetext": "{{PLURAL:$1|La categoria indicata di seguito contiene|Le categorie indicate di seguito contengono}} pagine o file multimediali.\nLe [[Special:UnusedCategories|categorie vuote]] non sono mostrate qui.\nVedi anche le [[Special:WantedCategories|categorie richieste]].", + "categoriespagetext": "{{PLURAL:$1|La categoria indicata di seguito esiste|Le categorie indicate di seguito esistono}} nel wiki, e potrebbero o no essere inutilizzate.\nVedi anche le [[Special:WantedCategories|categorie richieste]].", "categoriesfrom": "Mostra le categorie a partire da:", "deletedcontributions": "Contributi utente cancellati", "deletedcontributions-title": "Contributi utente cancellati", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index ca6445d8d4..b955139dbd 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -90,7 +90,9 @@ "Suzukaze-c", "Kkairri", "Yusuke1109", - "Afaz" + "Afaz", + "Oxbqskeptzwizkgdcxakhnrb", + "Suyama" ] }, "tog-underline": "リンクの下線:", @@ -444,6 +446,9 @@ "customcssprotected": "この CSS ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。", "customjsonprotected": "この JSON ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。", "customjsprotected": "この JavaScript ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。", + "sitecssprotected": "すべての訪問者に影響する可能性があるためこのCSSページを編集する権限がありません", + "sitejsonprotected": "すべての訪問者に影響する可能性があるためこのJSONページを編集する権限がありません", + "sitejsprotected": "すべての訪問者に影響する可能性があるためこのJavaScriptページを編集する権限がありません", "mycustomcssprotected": "あなたにはこの CSS ページを編集する権限がありません。", "mycustomjsonprotected": "あなたにはこの JSON ページを編集する権限がありません。", "mycustomjsprotected": "あなたにはこの JavaScript ページを編集する権限がありません。", @@ -452,6 +457,7 @@ "ns-specialprotected": "特別ページは編集できません。", "titleprotected": "[[User:$1|$1]]によりこのページ名を持つページの作成は保護されています。\n理由は$2です。", "filereadonlyerror": "ファイルリポジトリ「$2」が読み取り専用の状態にあるため、ファイル「$1」を変更できません。\n\n読み取り専用に設定したシステム管理者からの説明: 「$3」", + "invalidtitle": "無効なページ名", "invalidtitle-knownnamespace": "名前空間名「$2」と名前「$3」の組み合わせはページ名として無効です", "invalidtitle-unknownnamespace": "不明な名前空間番号 $1 と名前「$2」の組み合わせはページ名として無効です", "exception-nologin": "ログインしていません", @@ -857,7 +863,7 @@ "undo-summary-username-hidden": "秘匿された利用者による版 $1 を取り消し", "cantcreateaccount-text": "この IP アドレス ($1) からのアカウント作成は、[[User:$3|$3]] によってブロックされています。\n\n$3 が示した理由: $2", "cantcreateaccount-range-text": "この IP アドレス ($4) を含む、IP アドレス範囲 $1 からのアカウント作成は、[[User:$3|$3]] によってブロックされています。\n\n$3 が示した理由: $2", - "viewpagelogs": "このページの記録を閲覧", + "viewpagelogs": "このページの記録を表示", "nohistory": "このページには編集履歴がありません。", "currentrev": "最新版", "currentrev-asof": "$1時点における最新版", @@ -999,6 +1005,7 @@ "diff-paragraph-moved-toold": "文章は移動しました。クリックすると元の場所が開きます。", "difference-missing-revision": "指定された{{PLURAL:$2|$2版}}の差分 ($1) が見つかりませんでした。\n\n通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 \n詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。", "searchresults": "検索結果", + "search-filter-title-prefix-reset": "すべてのページを検索", "searchresults-title": "「$1」の検索結果", "titlematches": "ページ名と一致", "textmatches": "ページ本文と一致", @@ -1140,7 +1147,7 @@ "badsig": "署名用のソースが正しくありません。\nHTMLタグを見直してください。", "badsiglength": "署名が長すぎます。\n$1 {{PLURAL:$1|文字}}以下である必要があります。", "yourgender": "表示に使用する性別", - "gender-unknown": "あなたに言及する時、ソフトウェアは可能な限り、性別が中性の単語を使おうとします。", + "gender-unknown": "このソフトウェアがあなたに言及する際、できるだけ性別不問の言葉を使用します。", "gender-male": "男", "gender-female": "女", "prefs-help-gender": "この項目の設定は省略できます。\nソフトウェアが利用者向けの画面表示であなたに言及する際に、適切な文法的性を選択するために使用されます。\nこの情報は公開されます。", @@ -1205,6 +1212,7 @@ "group-autoconfirmed": "自動承認された利用者", "group-bot": "ボット", "group-sysop": "管理者", + "group-interface-admin": "インターフェース管理者", "group-bureaucrat": "ビューロクラット", "group-suppress": "秘匿者", "group-all": "(全員)", @@ -1212,6 +1220,7 @@ "group-autoconfirmed-member": "{{GENDER:$1|自動承認された利用者}}", "group-bot-member": "{{GENDER:$1|ボット}}", "group-sysop-member": "{{GENDER:$1|管理者}}", + "group-interface-admin-member": "{{GENDER:$1|インターフェース管理者}}", "group-bureaucrat-member": "{{GENDER:$1|ビューロクラット}}", "group-suppress-member": "{{GENDER:$1|秘匿者}}", "grouppage-user": "{{ns:project}}:登録利用者", @@ -1268,6 +1277,9 @@ "right-editusercss": "他の利用者のCSSファイルを編集", "right-edituserjson": "他の利用者のJSONファイルを編集", "right-edituserjs": "他の利用者のJavaScriptファイルを編集", + "right-editsitecss": "サイト全体のCSSを編集", + "right-editsitejson": "サイト全体のJSONを編集", + "right-editsitejs": "サイト全体のJavaScriptを編集", "right-editmyusercss": "自身のCSSファイルを編集", "right-editmyuserjson": "自身のJSONファイルを編集", "right-editmyuserjs": "自身のJavaScriptファイルを編集", @@ -1294,7 +1306,7 @@ "right-managechangetags": "[[Special:Tags|タグ]]の作成、有効化および無効化", "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する", "right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除", - "right-deletechangetags": "データベースから[[Special:Tags|タグ]]を削除します", + "right-deletechangetags": "データベースから[[Special:Tags|タグ]]を削除", "grant-generic": "「$1」の権限バンドル", "grant-group-page-interaction": "ページとの相互作用", "grant-group-file-interaction": "メディアとの相互作用", @@ -1309,10 +1321,11 @@ "grant-createaccount": "アカウントを作成", "grant-createeditmovepage": "ページを作成、編集、および移動", "grant-delete": "ページ、版、記録項目を削除", - "grant-editinterface": "MediaWiki 名前空間および利用者 CSS/JOSN/JavaScript を編集", + "grant-editinterface": "MediaWiki 名前空間およびサイト全体 JSON、利用者 JSON を編集", "grant-editmycssjs": "あなた自身の利用者 CSS/JSON/JavaScript を編集", "grant-editmyoptions": "あなたの個人設定を編集", "grant-editmywatchlist": "あなたのウォッチリストを編集", + "grant-editsiteconfig": "サイト全体と利用者のCSS/JSを編集", "grant-editpage": "既存のページを編集", "grant-editprotected": "保護されたページを編集", "grant-highvolume": "多量の編集", @@ -1531,10 +1544,11 @@ "rcfilters-watchlist-showupdated": "最終訪問以降に変更されたページは、塗りつぶされた丸印と一緒に、太字で表示されます。", "rcfilters-preference-label": "最近の更新の改善版を隠す", "rcfilters-preference-help": "2017年のインターフェース更新およびそれ以降に追加された新しいツールを無効化します。", - "rcfilters-filter-showlinkedfrom-label": "リンク先ページの変更を表示する", - "rcfilters-filter-showlinkedfrom-option-label": "選択されているページからリンクされているページ", - "rcfilters-filter-showlinkedto-label": "リンク先ページの変更を表示する", - "rcfilters-filter-showlinkedto-option-label": "選択されているページにリンクしているページ", + "rcfilters-watchlist-preference-label": "ウォッチリストの改善版を隠す", + "rcfilters-filter-showlinkedfrom-label": "指定されたページのリンク先の変更を表示", + "rcfilters-filter-showlinkedfrom-option-label": "指定されたページからリンクされているページ", + "rcfilters-filter-showlinkedto-label": "指定されたページのリンク元の変更を表示", + "rcfilters-filter-showlinkedto-option-label": "指定されたページにリンクしているページ", "rcfilters-target-page-placeholder": "ページ名(またはカテゴリ名)を入力", "rcnotefrom": "以下は$3 $4以降の{{PLURAL:$5|更新です}} (最大 $1 件)。", "rclistfromreset": "日時指定をリセット", @@ -1580,7 +1594,7 @@ "recentchangeslinked-feed": "関連ページの更新状況", "recentchangeslinked-toolbox": "関連ページの更新状況", "recentchangeslinked-title": "「$1」と関連する変更", - "recentchangeslinked-summary": "ページ名を入力すると、リンク関係 (そのページのリンク先もしくは他のページからのリンク) の最近の変更を調べることができます。 (下位カテゴリを参照するには、カテゴリ:カテゴリ名 (Category:Name of category) を入力)。[[Special:Watchlist|自分のウォッチリスト]]にあるページの変更は太字で表示されます。", + "recentchangeslinked-summary": "リンク元またはリンク先の変更を表示したいページ名を入力してください。(\"Category:カテゴリ名\"と入力すると下位カテゴリを参照できます)。[[Special:Watchlist|自分のウォッチリスト]]にあるページの変更は太字で表示されます。", "recentchangeslinked-page": "ページ名:", "recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え", "recentchanges-page-added-to-category": "[[:$1]]をカテゴリに追加", @@ -1809,6 +1823,7 @@ "http-timed-out": "HTTP要求がタイムアウトしました。", "http-curl-error": "URLからの取得に失敗しました: $1", "http-bad-status": "HTTP リクエストで問題が発生しました: $1 $2", + "http-internal-error": "HTTP 内部エラー。", "upload-curl-error6": "URLに到達できませんでした", "upload-curl-error6-text": "指定したURLに到達できませんでした。\nURLが正しいものであり、ウェブサイトが稼働していることを再度確認してください。", "upload-curl-error28": "アップロードのタイムアウト", @@ -1853,9 +1868,9 @@ "filehist-filesize": "ファイルサイズ", "filehist-comment": "コメント", "imagelinks": "ファイルの使用状況", - "linkstoimage": "以下の{{PLURAL:$1|ページ|​ $1 ページ}}がこのファイルにリンクしています:", - "linkstoimage-more": "このファイルへは $1 を超える数のページからリンクがあります。\n以下の一覧ではこのファイルにリンクしている最初の $1 ページのみを表示しています。\n[[Special:WhatLinksHere/$2|完全な一覧]]も参照してください。", - "nolinkstoimage": "このファイルへリンクしているページはありません。", + "linkstoimage": "以下の{{PLURAL:$1|ページ|​ $1 ページ}}がこのファイルを使用しています:", + "linkstoimage-more": "このファイルへは $1 を超える数のページで使用されています。\n以下の一覧ではこのファイルを使用している最初の $1 ページのみを表示しています。\n[[Special:WhatLinksHere/$2|完全な一覧]]も参照してください。", + "nolinkstoimage": "このファイルを使用しているページはありません。", "morelinkstoimage": "このファイルへの[[Special:WhatLinksHere/$1|リンク元を更に]]を表示する。", "linkstoimage-redirect": "$1 (リダイレクト) $2", "duplicatesoffile": "以下の $1 {{PLURAL:$1|ファイル}}が、このファイルと重複しています ([[Special:FileDuplicateSearch/$2|詳細]]):", @@ -2022,6 +2037,7 @@ "protectedtitles-submit": "タイトルを表示", "listusers": "利用者一覧", "listusers-editsonly": "投稿記録のある利用者のみを表示", + "listusers-temporarygroupsonly": "この利用者グループに一時的に属している利用者のみを表示", "listusers-creationsort": "作成日順に並べ替え", "listusers-desc": "降順に並べ替える", "usereditcount": "$1 {{PLURAL:$1|回編集}}", @@ -2099,9 +2115,12 @@ "magiclink-tracking-isbn": "ISBNマジックリンクを使用しているページ", "magiclink-tracking-isbn-desc": "このページはISBNマジックリンクを使用しています。移行方法について[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org]を参照してください。", "specialloguserlabel": "実行者:", - "speciallogtitlelabel": "対象 (ページ名または利用者の場合、{{ns:user}}:利用者名):", + "speciallogtitlelabel": "対象 (ページ名または\"{{ns:user}}:利用者名\"):", "log": "記録", "logeventslist-submit": "表示", + "logeventslist-more-filters": "付加記録を表示:", + "logeventslist-patrol-log": "巡回記録", + "logeventslist-tag-log": "タグ記録", "all-logs-page": "すべての公開記録", "alllogstext": "{{SITENAME}}の取得できる記録をまとめて表示しています。\n記録の種類、実行した利用者 (大文字小文字は区別)、影響を受けたページ (大文字小文字は区別) による絞り込みができます。", "logempty": "該当する記録はありません。", @@ -2461,6 +2480,7 @@ "uctop": "(最新)", "month": "この月以前:", "year": "この年以前:", + "date": "この日以前:", "sp-contributions-newbies": "新規利用者の投稿のみ表示", "sp-contributions-newbies-sub": "新規利用者のみ", "sp-contributions-newbies-title": "新規利用者の投稿記録", @@ -4126,7 +4146,7 @@ "special-characters-title-endash": "en ダッシュ", "special-characters-title-emdash": "em ダッシュ", "special-characters-title-minus": "マイナス記号", - "mw-widgets-dateinput-no-date": "日付未選択", + "mw-widgets-dateinput-no-date": "日付が選択されていません", "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD", "mw-widgets-dateinput-placeholder-month": "YYYY-MM", "mw-widgets-mediasearch-input-placeholder": "メディアを検索", @@ -4135,8 +4155,8 @@ "mw-widgets-titleinput-description-redirect": "$1 へのリダイレクト", "mw-widgets-categoryselector-add-category-placeholder": "カテゴリを追加...", "mw-widgets-usersmultiselect-placeholder": "さらに追加", - "date-range-from": "開始日:", - "date-range-to": "終了日:", + "date-range-from": "この日から:", + "date-range-to": "この日まで:", "sessionmanager-tie": "複数の要求の認証方法を組み合わせることはできません: $1。", "sessionprovider-generic": "$1 セッション", "sessionprovider-mediawiki-session-cookiesessionprovider": "Cookie ベースのセッション", @@ -4162,7 +4182,7 @@ "log-action-filter-contentmodel-new": "標準でないコンテンツ・モデルによるページの作成", "log-action-filter-delete-delete": "ページの削除", "log-action-filter-delete-delete_redir": "転送の上書き", - "log-action-filter-delete-restore": "ページの復帰", + "log-action-filter-delete-restore": "ページの復元", "log-action-filter-delete-event": "記録の削除", "log-action-filter-delete-revision": "版指定削除", "log-action-filter-import-interwiki": "ウィキ間の取り込み", @@ -4276,10 +4296,11 @@ "edit-error-long": "エラー:\n\n\n\n$1", "revid": "版 $1", "pageid": "ページID $1", + "interfaceadmin-info": "$1\n\nサイト全体のCSS/JS/JSONの編集における許可は、最近までeditinterface権限と分けられていました。なぜこのエラーが表示されるのかわからない場合は、[[mw:MediaWiki_1.32/interface-admin]]をご覧ください。", "rawhtml-notallowed": "<html>タグは通常ページ以外では使用できません。", "gotointerwiki": "{{SITENAME}}を離れる", "gotointerwiki-invalid": "指定したページは無効です。", - "gotointerwiki-external": "{{SITENAME}}を離れ、別のウェブサイトである[[$2]]を訪れようとしています。\n\n'''[$1 $1に行く]'''", + "gotointerwiki-external": "\"{{SITENAME}}\"を離れ別のウェブサイト\"[[$2]]\"へ移動しようとしています。\n\n'''[$1 $1 へ移動する]'''", "undelete-cantedit": "このページを編集する許可がないため復元できません。", "undelete-cantcreate": "同名のページが存在せず、このページを作成する許可がないため復元できません。", "pagedata-title": "ページ・データ", diff --git a/languages/i18n/jv.json b/languages/i18n/jv.json index 66df3aa0a9..083fd5f458 100644 --- a/languages/i18n/jv.json +++ b/languages/i18n/jv.json @@ -213,10 +213,10 @@ "categorypage": "Deleng kaca kategori", "viewtalkpage": "Deleng parembugan", "otherlanguages": "Ing basa liyané", - "redirectedfrom": "(Dilih saka $1)", + "redirectedfrom": "(Kaelih saka $1)", "redirectpagesub": "Alih kaca", "redirectto": "Ngalih menyang:", - "lastmodifiedat": "Kaca iki dibesut kèri dhéwé dhèk $1, pukul $2.", + "lastmodifiedat": "Kaca iki binesut pungkasan nalika $1, pukul $2.", "viewcount": "Kaca iki wis diaksès ping {{PLURAL:$1|siji|$1}}.", "protectedpage": "Kaca kareksa", "jumpto": "Jujug:", @@ -660,7 +660,7 @@ "permissionserrors": "Masalah idin", "permissionserrorstext": "Panjengan ora kagungan idin kanggo nglakoni sing panjenengan gayuh amerga {{PLURAL:$1|alesan|alesan-alesan}} iki:", "permissionserrorstext-withaction": "Panjenengan ora diidinaké $2 amarga {{PLURAL:$1|alasan|alasan}} ing ngisor iki:", - "recreate-moveddeleted-warn": "'''Pènget: Panjenengan gawé manèh sawijining kaca sing wis tau dibusak.'''\n\nMangga digagas manèh apa pantes nerusaké nyunting kaca iki.\nIng ngisor iki kapacak log pambusakan lan pamindhahan saka kaca iki:", + "recreate-moveddeleted-warn": "Pélik: Panjenengan nggawé manèh kaca kang tau kabusak.\n\nPanjenengan kudu nglelimbang apa pantes nerusaké mbesut kaca iki.\nIng isor iki kapacak log pambusak lan pangalih saka kaca iki:", "moveddeleted-notice": "Kaca iki wis dibusak.\nLog busak, reksa, lan alih bab kacané cumepak ing ngisor minangka rujukan.", "log-fulllog": "Deleng cathetan wutuh", "edit-hook-aborted": "Besutan diwurungaké déning cangkolan.\nOra ana katerangané.", @@ -872,7 +872,7 @@ "showingresults": "Ing ngisor iki dituduhaké {{PLURAL:$1|'''1''' kasil|'''$1''' kasil}}, wiwitané saking #$2.", "showingresultsinrange": "Nuduhaké nganti {{PLURAL:$1|1 kasil|$1 kasil}} sajeroning penthangan #$2 tekan #$3.", "search-showingresults": "{{PLURAL:$4|Asil $1 saka $3|Asil $1 – $2 saka $3}}", - "search-nonefound": "Ora ana kasil sing mathuk karo pitakoné.", + "search-nonefound": "Ora ana asil kang mathuk kuwèri.", "search-nonefound-thiswiki": "Ora ana kasil sing jumbuh karo panjalukan ing situs iki.", "powersearch-legend": "Panggolèkan sabanjuré (''advance search'')", "powersearch-ns": "Golèk ing mandala aran:", @@ -1336,12 +1336,12 @@ "rc-enhanced-hide": "Dhelikaké princèn", "rc-old-title": "kawitané digawé minangka \"$1\"", "recentchangeslinked": "Owahan magepokan", - "recentchangeslinked-feed": "Owah-owahan sing gegayutan", + "recentchangeslinked-feed": "Owah-owahan kang magepokan", "recentchangeslinked-toolbox": "Owahan magepokan", - "recentchangeslinked-title": "Owah-owahan sing magepokan \"$1\"", + "recentchangeslinked-title": "Owah-owahan kang magepokan \"$1\"", "recentchangeslinked-summary": "Iki pratélaning owah-owahan sing mentas digawé tumrap ing kaca-kaca sing nggayut sawijining kaca (utawa kaca-kaca anggotaning sawijining kategori).\nKaca ing [[Special:Watchlist|pawawangané panjenegan]] dikandeli.", "recentchangeslinked-page": "Jeneng kaca:", - "recentchangeslinked-to": "Nuduhaké owah-owahan kaca-kaca sing nggayut kaca iki", + "recentchangeslinked-to": "Tuduhaké owahané kaca kang nggayut kaca iki", "recentchanges-page-added-to-category": "[[:$1]] ditambahaké ing kategori", "recentchanges-page-added-to-category-bundled": "[[:$1]] ditambahaké ing kategori, [[Special:WhatLinksHere/$1|kaca iki kalebu ing njeroné kaca liyané]]", "recentchanges-page-removed-from-category": "[[:$1]] dibusak saka kategori", @@ -1560,7 +1560,7 @@ "imagelinks": "Panggunaning barkas", "linkstoimage": "{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki nggayut barkas iki:", "linkstoimage-more": "Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.\nDhaftar ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.\n[[Special:WhatLinksHere/$2|dhaftar pepak]] uga ana.", - "nolinkstoimage": "Ora ana kaca sing nggayut menyang barkas iki.", + "nolinkstoimage": "Ora ana kaca kang nganggo barkas iki.", "morelinkstoimage": "Ndeleng [[Special:WhatLinksHere/$1|luwih akèh pranala]] menyang berkas iki.", "linkstoimage-redirect": "$1 (alihan barkas) $2", "duplicatesoffile": "{{PLURAL:$1|berkas ing ngisor arupa duplikat|$1 berkas ing ngisor arupa duplikat}} saka berkas iki ([[Special:FileDuplicateSearch/$2|luwih rinci]]):", @@ -1787,7 +1787,7 @@ "logeventslist-submit": "Tuduhaké", "all-logs-page": "Kabèh log umum", "alllogstext": "Pitontonan gabungan log-log sing ana ing {{SITENAME}}.\nPanjenengan bisa nyiyutaké sesawangané kanthi milih sawijining jinis log, jeneng panganggo (sènsitif-case), utawa kaca sing gegayutan (uga sènsitif-case).", - "logempty": "Ora ditemokaké èntri log sing pas.", + "logempty": "Ora tinemu wiji kang cocog ing log", "log-title-wildcard": "Golèk sesirah sing diwiwiti tulisan iki", "showhideselectedlogentries": "Owah pakatonané èntri log sing dipilih", "log-edit-tags": "Besut tag saka isian log sing dipilih", @@ -2437,13 +2437,13 @@ "tooltip-p-logo": "Menyang tepas", "tooltip-n-mainpage": "Menyang tepas", "tooltip-n-mainpage-description": "Menyang tepas", - "tooltip-n-portal": "Bab proyèk, apa sing bisa panjenengan garap, lan ing endi saprelu golèk apa-apa", + "tooltip-n-portal": "Bab proyèk, apa kang bisa panjenengan garap, lan ing endi saprelu golèk apa-apa", "tooltip-n-currentevents": "Golèk katerangan latar wuri saka kadadéan saiki", "tooltip-n-recentchanges": "Pratélaning owah-owahan anyar sajeroning wiki.", "tooltip-n-randompage": "Mot sembarang kaca", "tooltip-n-help": "Papan kanggo golèk pitulung", "tooltip-t-whatlinkshere": "Pratélan kabèh kaca wiki kang nggayut mréné", - "tooltip-t-recentchangeslinked": "Owah-owahan anyar saka kaca-kaca sing nggayut kaca iki", + "tooltip-t-recentchangeslinked": "Owah-owahan anyar saka kaca-kaca kang nggayut kaca iki", "tooltip-feed-rss": "''RSS feed'' kanggo kaca iki", "tooltip-feed-atom": "Pakan atom tumrap kaca iki", "tooltip-t-contributions": "Pratélaning pisumbanging {{GENDER:$1|panganggo iki}}", @@ -2456,7 +2456,7 @@ "tooltip-ca-nstab-main": "Deleng kaca kontèn", "tooltip-ca-nstab-user": "Deleng kaca panganggo", "tooltip-ca-nstab-media": "Deleng kaca médhia", - "tooltip-ca-nstab-special": "Iki kaca mirunggan lan ora bisa dibesut", + "tooltip-ca-nstab-special": "Iki kaca mirunggan lan ora bisa kabesut", "tooltip-ca-nstab-project": "Deleng kaca proyèk", "tooltip-ca-nstab-image": "Deleng kaca barkas", "tooltip-ca-nstab-mediawiki": "Deleng layang sistem", @@ -2467,14 +2467,14 @@ "tooltip-save": "Simpen owah-owahaning panjenengan", "tooltip-publish": "Babar owahané panjenengan", "tooltip-preview": "Pratuduhana owah-owahaning panjenengan. Tulung ayahana iku sadurungé nyimpen.", - "tooltip-diff": "Tuduhaké owah-owahan endi sing panjenengan gawé tumrap tulisan iki", + "tooltip-diff": "Tuduhaké owahan endi kang panjenengan gawé tumrap tulisané", "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki sing dipilih.", "tooltip-watch": "Wuwuh kaca iki menyang pawawangané panjenengan", "tooltip-watchlistedit-normal-submit": "Busak sesirah", "tooltip-watchlistedit-raw-submit": "Anyari daptar pangawasan", "tooltip-recreate": "Gawéa kaca iki manèh senadyan tau dibusak", "tooltip-upload": "Wiwit ngunggah", - "tooltip-rollback": "\"Balèkaké\" bakal murungaké besutané wong sing nyumbang kèri dhéwé tumrap kacané sarana ngeklik pisan", + "tooltip-rollback": "\"Balèkaké\" bakal murungaké besutané kang nyumbang pungkasan ing kaca iki sarana ngeklik pisan", "tooltip-undo": "\"Wurung\" mbalèkaké besutan iki lan mbukak blangko besutan sarana modhe pratuduh. Alesan kena diwuwuhaké ing babagan ringkesan.", "tooltip-preferences-save": "Simpen préperensi", "tooltip-summary": "Isinen ringkesan cekak", @@ -2515,16 +2515,16 @@ "pageinfo-robot-noindex": "Ora éntuk", "pageinfo-watchers": "Cacahing sing ngawasi kaca", "pageinfo-visiting-watchers": "Cacahé pandeleng kaca sing nekani besutan anyar", - "pageinfo-few-watchers": "{{PLURAL:$1|Sing niliki|Sing niliki}} kurang saka $1", + "pageinfo-few-watchers": "{{PLURAL:$1|Kang ndeleng|Kang ndeleng}} kurang saka $1", "pageinfo-redirects-name": "Cacahing alihan menyang kaca iki", "pageinfo-subpages-name": "Cacahing anak kaca saka kaca iki", "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|alihan|alihan}}; $3 {{PLURAL:$3|non-alihan|non-alihan}})", - "pageinfo-firstuser": "Sing nggawé kaca", + "pageinfo-firstuser": "Kang nggawé kaca", "pageinfo-firsttime": "Tanggal panggawéning kaca", - "pageinfo-lastuser": "Sing mbesut kèri dhéwé", + "pageinfo-lastuser": "Kang wekasan mbesut", "pageinfo-lasttime": "Tanggal besutan kèri dhéwé", "pageinfo-edits": "Gunggunging besutan", - "pageinfo-authors": "Gunggunging sing nganggit", + "pageinfo-authors": "Gunggung kang nganggit", "pageinfo-recent-edits": "Cacahé besutan saiki (ing dalem $1 pungkasan)", "pageinfo-recent-authors": "Cacahing sing nganggit dinané iki", "pageinfo-magic-words": "{{PLURAL:$1|Tembung|Tembung}} mujarab ($1)", @@ -2573,7 +2573,7 @@ "file-info": "ukuran barkas: $1, jinis MIME: $2", "file-info-size": "$1 × $2 piksel, ukuran barkas: $3, jinis MIME: $4", "file-info-size-pages": "$1 × $2 piksel, gedhéné berkas: $3, jinisé MIME: $4, $5 {{PLURAL:$5|kaca|kaca}}", - "file-nohires": "Ora ana résolusi sing luwih dhuwur.", + "file-nohires": "Ora ana résolusi kang luwih dhuwur.", "svg-long-desc": "Barkas SVG, nominal $1 × $2 piksel, gedhéning barkas: $3", "svg-long-desc-animated": "Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3", "svg-long-error": "Berkas SVG ora sah: $1", @@ -2618,11 +2618,11 @@ "sunday-at": "Minggu jam $1", "yesterday-at": "Dhek wingi jam $1", "bad_image_list": "Formaté kaya mengkéné:\n\nNamung butir daftar (baris sing diawali mawa tandha *) sing mèlu diitung. Pranala kapisan ing sawijining baris kudu pranala ing berkas sing ala.\nPranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian'', yaiku artikel sing bisa nuduhaké berkas iku.", - "metadata": "Métadata", + "metadata": "Métadhatah", "metadata-help": "Barkas iki ngemu katerangan tambahan, bokmanawa asalé saka kodhak dhigital utawa sekèner sing dienggo metha utawa ndhigitalisasi barkas iku. \nYèn barkasé wis diowahi saka asliné, sawenèh rerincèn mungkin ora sawutuhé mèmper karo barkas owahané.", "metadata-expand": "Tuduhaké rerincèn tambahan", "metadata-collapse": "Dhelikaké rerincèn tambahan", - "metadata-fields": "Babagan-babagan métadhata gambar sing kapacak ing layang iki bakal dimot nyang pitontonan kaca gambar nalika métadhata diciyutaké.\nLiyané bakal kadhelikaké kanthi baku.\n* panggawé\n* gagrag\n* tanggalwayahasli\n* wayahpaparan\n* angkaf\n* bijibanteriso\n* dawafocal\n* artis\n* hakcipta\n* pratélangambar\n* latitudgps\n* longitudgps\n* altitudgps", + "metadata-fields": "Babagan-babagan métadhata gambar kang kapacak ing layang iki bakal kamot menyang pitontonan kaca gambar nalika métadhata diciyutaké.\nLiyané bakal kadhelikaké kanthi gawan.\n* panggawé\n* gagrag\n* tanggalwayahasli\n* wayahpaparan\n* angkaf\n* bijibanteriso\n* dawafocal\n* artis\n* hakcipta\n* pratélangambar\n* latitudgps\n* longitudgps\n* altitudgps", "exif-imagewidth": "Jembar", "exif-imagelength": "Dhuwur", "exif-bitspersample": "Bit per komponèn", @@ -2648,7 +2648,7 @@ "exif-imagedescription": "Sesirah gambar", "exif-make": "Prodhusèn kodhak", "exif-model": "Modhèl kaméra", - "exif-software": "Piranti alus sing dianggo", + "exif-software": "Piranti alus kang kaanggo", "exif-artist": "Prodhusèn", "exif-copyright": "Sing ndarbèni hak cipta", "exif-exifversion": "Vèrsi Exif", diff --git a/languages/i18n/ka.json b/languages/i18n/ka.json index 64a68cc2cb..70add70ea0 100644 --- a/languages/i18n/ka.json +++ b/languages/i18n/ka.json @@ -1992,6 +1992,9 @@ "speciallogtitlelabel": "მიზანი (სათაური, ან {{ns:user}}:მომხმარებლის სახელი):", "log": "ჟურნალები", "logeventslist-submit": "ჩვენება", + "logeventslist-more-filters": "დამატებითი ჟურნალების ჩვენება:", + "logeventslist-patrol-log": "პატრულირების ჟურნალი", + "logeventslist-tag-log": "ტეგის ჟურნალი", "all-logs-page": "ყველა საზოგადო ჟურნალი", "alllogstext": "{{SITENAME}}-ის ყველა არსებული ჩანაწერის კომბინირებული ჩვენება.\nშეგიძლიათ გაცხრილოთ იგი ჩანაწერის ტიპის, მომხმარებლის სახელის, ან დაკავშირებული გვერდის შერჩევით.", "logempty": "შედეგები არ არის სიაში.", @@ -2347,6 +2350,7 @@ "uctop": "(მიმდინარე)", "month": "თვე:", "year": "წელი:", + "date": "თარიღიდან (და უფრო ადრე):", "sp-contributions-newbies": "მხოლოდ ახალი მომხმარებლების წვლილის ჩვენება", "sp-contributions-newbies-sub": "ახალბედებისთვის", "sp-contributions-newbies-title": "ბოლოს დარეგისტრირებულ მომხმარებელთა წვლილი", diff --git a/languages/i18n/kn.json b/languages/i18n/kn.json index 4e3b59445d..50389693b0 100644 --- a/languages/i18n/kn.json +++ b/languages/i18n/kn.json @@ -972,6 +972,17 @@ "recentchanges-label-plusminus": "ಪುಟದ ಗಾತ್ರವು ಇಷ್ಟು ಸಂಖ್ಯೆಯ ಬೈಟ್‍ಗಳಿಂದ ಬದಲಾಯಿಸಲ್ಪಟ್ಟಿದೆ", "recentchanges-legend-heading": "ಪರಿವಿಡಿ:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|ಹೊಸ ಪುಟಗಳ ಪಟ್ಟಿ]]ಯನ್ನೂ ನೋಡಿ)", + "rcfilters-legend-heading": " ಸಂಕ್ಷೇಪಣಗಳ ಪಟ್ಟಿ:", + "rcfilters-activefilters": "ಸಕ್ರಿಯ ಸೋಸುಕಗಳು", + "rcfilters-activefilters-hide-tooltip": "ಸಕ್ರಿಯ ಶೋಧಕಗಳ ಪ್ರದೇಶ ಅಡಗಿಸಿ", + "rcfilters-advancedfilters": "ಸುಧಾರಿಸಿದ ಶೋಧಕಗಳು", + "rcfilters-days-title": "ಇತ್ತೀಚಿನ ದಿನಗಳು", + "rcfilters-days-show-days": "$1 {{PLURAL:$1|ದಿನ|ದಿನಗಳು}}", + "rcfilters-quickfilters": "ಉಳಿಸಲಾದ ಶೋಧಕಗಳು", + "rcfilters-savedqueries-defaultlabel": "ಉಳಿಸಲಾದ ಶೋಧಕಗಳು", + "rcfilters-restore-default-filters": "ಪೂರ್ವನಿಯೋಜಿತ ಶೋಧಕಗಳನ್ನು ಮರುಹೊಂದಿಸಿ", + "rcfilters-empty-filter": "ಸಕ್ರಿಯ ಶೋಧಕಗಳಿಲ್ಲ. ಎಲ್ಲಾ ಕೊಡುಗೆಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ.", + "rcfilters-filterlist-noresults": "ಶೋಧಕಗಳು ಲಭ್ಯವಿಲ್ಲ", "rcfilters-target-page-placeholder": "ಒಂದು ಪುಟದ ಹೆಸರನ್ನು ನಮೂದಿಸಿ (ಅಥವಾ ವಿಭಾಗ)", "rcnotefrom": "'''$2''' ಇಂದ ಆಗಿರುವ ಬದಲಾವಣೆಗಳು ಕೆಳಗಿವೆ (ಕೊನೆಯ '''$1'''ರವರೆಗೆ ತೋರಿಸಲಾಗಿದೆ).", "rclistfrom": "$2,$3 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ", @@ -1225,6 +1236,7 @@ "deadendpages": "ಕೊನೆಯಂಚಿನ ಪುಟಗಳು", "deadendpagestext": "ಈ ಕೆಳಗಿನ ಪುಟಗಳು {{SITENAME}} ಅಲ್ಲಿ ಇರುವ ಇತರ ಪುಟಗಳಿಗೆ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿಲ್ಲ.", "protectedpages": "ಸಂರಕ್ಷಿತ ಪುಟಗಳು", + "protectedpages-filters": "ಶೋಧಕಗಳುː", "protectedpages-indef": "ಅನಿಯಮಿತ ಸಂರಕ್ಷಣೆಗಳು ಮಾತ್ರ", "protectedpages-noredirect": "ಪುನರ್ನಿದೇಶನಗಳನ್ನು ಅಡಗಿಸಿ", "protectedpagesempty": "ಈ ನಿಯಮಾವಳಿಗಳಲ್ಲಿ ಯಾವ ಪುಟವೂ ಸಂರಕ್ಷಿತವಾಗಿಲ್ಲ.", @@ -1662,7 +1674,7 @@ "siteusers": "{{SITENAME}} {{PLURAL:$2|ಸದಸ್ಯ|ಸದಸ್ಯರು}} $1", "creditspage": "ಪುಟದ ಗೌರವಗಳು", "simpleantispam-label": "ಆಂಟಿ-ಸ್ಪ್ಯಾಮ್ ಪರೀಕ್ಷೆ.\nಇದನ್ನು ತುಂಬ ಬೇಡಿ!", - "pageinfo-title": "ಮಹಿತಿ \"$1\"", + "pageinfo-title": "ಮಾಹಿತಿ \"$1\"", "pageinfo-header-basic": "ಮೂಲಭೂತ ಮಾಹಿತಿ", "pageinfo-header-edits": "ಇತಿಹಾಸ ಸಂಪಾದಿಸಿ", "pageinfo-header-restrictions": "ಪುಟ ರಕ್ಷಣೆ", @@ -1708,6 +1720,7 @@ "ilsubmit": "ಹುಡುಕು", "bydate": "ದಿನಾಂಕಕ್ಕನುಗುಣವಾಗಿ", "sp-newimages-showfrom": "$2, $1 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಹೊಸ ಫೈಲುಗಳನ್ನು ತೋರು", + "days": "{{PLURAL:$1|$1 ದಿನ|$1 ದಿನಗಳು}}", "just-now": "ಇದೀಗ", "monday-at": "ಸೋಮವಾರ $1", "tuesday-at": "ಮಂಗಳವಾರ $1", diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json index 9230c36a4c..f7ab4f807f 100644 --- a/languages/i18n/ko.json +++ b/languages/i18n/ko.json @@ -429,6 +429,7 @@ "ns-specialprotected": "특수 문서는 편집할 수 없습니다.", "titleprotected": "[[User:$1|$1]]님이 문서 만들기를 보호했습니다.\n이유는 다음과 같습니다. $2", "filereadonlyerror": "\"$2\" 파일 저장소가 읽기 전용이기 때문에 \"$1\" 파일을 바꿀 수 없습니다.\n\n파일 저장소를 잠근 시스템 관리자가 다음과 같은 설명을 남겼습니다: \"$3\".", + "invalidtitle": "잘못된 제목", "invalidtitle-knownnamespace": "제목 오류: \"$2\" 이름공간과 \"$3\" 텍스트", "invalidtitle-unknownnamespace": "제목 오류: 알 수 없는 $1 이름공간 번호와 \"$2\" 텍스트", "exception-nologin": "로그인하지 않음", @@ -1774,7 +1775,7 @@ "uploadstash-zero-length": "파일 길이가 0입니다.", "invalid-chunk-offset": "청크 오프셋이 잘못되었습니다.", "img-auth-accessdenied": "접근이 거부됨", - "img-auth-nopathinfo": "PATH_INFO를 잃었습니다.\n서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.\n이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization을 참조하십시오.", + "img-auth-nopathinfo": "경로 정보가 없습니다.\n서버가 REQUEST_URI 및 PATH_INFO 변수를 넘길 수 있도록 설정되어야 합니다.\n이러한 경우 $wgUsePathInfo를 활성화해 보십시오.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 를 참고하십시오.", "img-auth-notindir": "요청한 경로가 설정한 올리기 디렉터리에 없습니다.", "img-auth-badtitle": "\"$1\"에서 올바른 제목을 만들 수 없습니다.", "img-auth-nologinnWL": "로그인하지 않았으며 \"$1\" 파일은 화이트리스트에 존재하지 않습니다.", @@ -1835,8 +1836,8 @@ "filehist-filesize": "파일 크기", "filehist-comment": "설명", "imagelinks": "이 파일을 사용하는 문서", - "linkstoimage": "다음 {{PLURAL:$1|문서 $1개}}가 이 파일을 가리키고 있습니다:", - "linkstoimage-more": "$1개 이상의 {{PLURAL:$1|문서}}가 이 파일을 가리키고 있습니다.\n다음 목록은 이 파일을 {{PLURAL:$1|가리키는 처음 문서 $1개}}만 보여주고 있습니다.\n이 파일을 가리키는 [[Special:WhatLinksHere/$2|모든 문서 목록]]을 볼 수 있습니다.", + "linkstoimage": "다음 {{PLURAL:$1|문서 $1개}}가 이 파일을 사용하고 있습니다:", + "linkstoimage-more": "$1개 이상의 {{PLURAL:$1|문서}}가 이 파일을 사용하고 있습니다.\n다음 목록은 이 파일을 {{PLURAL:$1|사용하는 처음 문서 $1개}}만 보여주고 있습니다.\n이 파일을 사용하는 [[Special:WhatLinksHere/$2|모든 문서 목록]]을 볼 수 있습니다.", "nolinkstoimage": "이 파일을 사용하는 문서가 없습니다.", "morelinkstoimage": "이 파일이 쓰이고 있는 문서 목록 [[Special:WhatLinksHere/$1|더 보기]].", "linkstoimage-redirect": "$1 (파일 넘겨주기) $2", @@ -2115,7 +2116,7 @@ "cachedspecial-refresh-now": "최신판을 봅니다.", "categories": "분류 목록", "categories-submit": "보이기", - "categoriespagetext": "문서나 자료를 {{PLURAL:$1|포함하고 있는 분류}} 목록입니다.\n[[Special:UnusedCategories|사용되지 않는 분류]]는 여기에 보이지 않습니다.\n[[Special:WantedCategories|필요한 분류]]도 참조하세요.", + "categoriespagetext": "위키에 다음의 {{PLURAL:$1|분류가 존재}}하며 사용되거나 사용되지 않을 수 있습니다.\n[[Special:WantedCategories|필요한 분류]]도 참고하십시오.", "categoriesfrom": "검색어와 같거나 검색어보다 뒤에 오는 분류 표시:", "deletedcontributions": "삭제된 사용자 기여", "deletedcontributions-title": "삭제된 사용자 기여", @@ -3764,10 +3765,10 @@ "logentry-patrol-patrol": "$1님이 $3 문서의 $4판을 점검한 것으로 {{GENDER:$2|표시했습니다}}", "logentry-patrol-patrol-auto": "$1님이 자동으로 $3 문서의 $4판을 점검한 것으로 {{GENDER:$2|표시했습니다}}", "logentry-newusers-newusers": "$1 사용자 계정을 {{GENDER:$2|만들었습니다}}", - "logentry-newusers-create": "$1 사용자 계정을 {{GENDER:$2|만들었습니다}}", + "logentry-newusers-create": "$1 계정이 {{GENDER:$2|생성되었습니다}}", "logentry-newusers-create2": "$3 사용자 계정을 $1님이 {{GENDER:$2|만들었습니다}}", "logentry-newusers-byemail": "$3 사용자 계정을 $1님이 {{GENDER:$2|만들었고}} 비밀번호는 이메일로 보냈습니다", - "logentry-newusers-autocreate": "$1 사용자 계정을 자동으로 {{GENDER:$2|만들었습니다}}", + "logentry-newusers-autocreate": "$1 계정이 자동으로 {{GENDER:$2|생성되었습니다}}", "logentry-protect-move_prot": "$1님이 보호 설정을 $4에서 $3으로 {{GENDER:$2|이동했습니다}}", "logentry-protect-unprotect": "$1님이 $3 문서의 보호를 {{GENDER:$2|해제했습니다}}", "logentry-protect-protect": "$1님이 $3 문서를 {{GENDER:$2|보호했습니다}} $4", @@ -4090,6 +4091,7 @@ "edit-error-long": "오류:\n\n$1", "revid": "$1 판", "pageid": "페이지 ID $1", + "interfaceadmin-info": "$1\n\n사이트 전체에 쓰이는 CSS/JS/JSON 파일의 편집 권한이 최근 editinterface에서 분리되었습니다. 왜 이 오류를 겪는지 이해가 되지 않는다면, [[mw:MediaWiki_1.32/interface-admin]]을 참고하십시오.", "rawhtml-notallowed": "<html> 태그는 일반 페이지 밖에서는 사용할 수 없습니다.", "gotointerwiki": "{{SITENAME}}을(를) 떠납니다", "gotointerwiki-invalid": "지정된 제목이 올바르지 않습니다.", diff --git a/languages/i18n/kum.json b/languages/i18n/kum.json index 4ec03ed28e..fdf96e6b7b 100644 --- a/languages/i18n/kum.json +++ b/languages/i18n/kum.json @@ -78,7 +78,7 @@ "hidden-categories": "{{PLURAL:$1|Яшырылгъан категория|Яшырылгъан категориялар}}‎", "category-subcat-count": "{{PLURAL:$2|Бу категорияда тек сонггъу гелеген тюпкатегориясы бар.|Бу категорияда {{PLURAL:$1|тюпкатегория|$1 тюпкатегориялар}} бар, жамда $2 тюпкатегориядан.}}", "category-article-count": "{{PLURAL:$2|Бу категорияда янгыз гелеген бир сагьифа бар.|Бу категориядагъы $2 {{PLURAL:$1|сагьифасы}} гёрсетилген.}}", - "category-file-count": "{{PLURAL:$2|Бу категорияда бир тек сонггъу гелеген сапламы бар.|Сонггъу гелеген {{PLURAL:$1|саплам|$1 сапламлар}}{{PLURAL:$2|категориядадыр|категориядадырлар}}}}.", + "category-file-count": "{{PLURAL:$2|Бу категорияда бир тек сонгра гелеген сапламы бар.|Сонгра гелеген {{PLURAL:$1|саплам|$1 сапламлар}} бу категориядадыр, жамы $2 санавундан.}}", "listingcontinuesabbrev": "давам", "noindex-category": "Индексленмейген сагьифалар", "broken-file-category": "Ишлеймейген саплам байланывлары булан сагьифалар", @@ -313,7 +313,7 @@ "template-semiprotected": "(ярты-къорулгъан)", "hiddencategories": "Бу сагьифа {{PLURAL:$1|1 яшырылгъан категориягъа}} янаша:", "permissionserrors": "Гириш ихтиярланы хатасы", - "permissionserrorstext-withaction": "Бугъар $2 гелеген {{PLURAL:$1|себепге|себеплеге}} гёре ихтиярынг ёкъ:", + "permissionserrorstext-withaction": "Бугъар $2 {{PLURAL:$1|бу себеп|бу себеплеге}} гёре ихтиярынг ёкъ:", "recreate-moveddeleted-warn": "Тергев бер: Алдын тайдырылгъан сагьифаны ярашдырма айланасан.\n\nБашлап тергеп къара, гертиден де тарыкъмы экен ол сагьифаны ярашдырмагъа.\nТайдырыв ва атын алышдырыв гюнделиги тюпде берилген:", "moveddeleted-notice": "Бу сагьифа тайдырылгъан эди.\nБу сагьифаны тайдырыв, къорув ва атянгыртыв гюнделиги маълюмат саялы тюпде гёрсетилген.", "content-model-wikitext": "викиматын", @@ -327,7 +327,7 @@ "nextrevision": "Сонггъу тюрю →", "currentrevisionlink": "Ахырынчы тюрю", "cur": "гьал.", - "next": "гелеген", + "next": "сонггъу", "last": "ингкъ.", "page_first": "биринчи", "page_last": "ахырынчы", @@ -364,9 +364,9 @@ "prevn": "алдагъы {{PLURAL:$1|$1}}", "nextn": "сонггъу {{PLURAL:$1|$1}}", "prev-page": "алдагъы сагьифа", - "next-page": "гелеген сагьифа", + "next-page": "сонггъу сагьифа", "prevn-title": "Алдагъы $1 {{PLURAL:$1|гьасил}}", - "nextn-title": "Гелеген $1 {{PLURAL:$1|гьасил|гьасиллер}}", + "nextn-title": "Сонггъу $1 {{PLURAL:$1|гьасил|гьасиллер}}", "shown-title": "Айры бир сагьифада $1 {{PLURAL:$1|языв|язывланы}} гёрсетмек", "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) къарамакъ", "searchmenu-exists": "Бу викиде \"[[:$1]]\" деп аты булан сагьифа бар. {{PLURAL:$2|0=|Дагъы да табылгъан натижалагъа да къара.}}", @@ -428,7 +428,7 @@ "grouppage-bot": "{{ns:project}}:Ботлар", "grouppage-sysop": "{{ns:project}}:Башчылар", "right-read": "Сагьифа охув", - "right-edit": "Сагьифа тюзлев", + "right-edit": "Сагьифаланы тюзлемек", "right-writeapi": "Языв учун API‎ къоллав", "right-delete": "Сагьифа тайдырыв", "newuserlogpage": "Янгы къоллавчу тизме гюнделиги", @@ -547,9 +547,9 @@ "filehist-filesize": "Саплам гёлеми", "filehist-comment": "Ёрум", "imagelinks": "Сапламны къоллаву", - "linkstoimage": "Шундан сонггъу {{PLURAL:$1|сагьифа|$1 сагьифалар}} бу сапламгъа байлангъан:", - "linkstoimage-more": "$1 {{PLURAL:$1|сагьифадан}} артыкъ иг сапламгъа байланывлу.\nБу тизме янгыз бу сапламгъа {{PLURAL:$1|first page link|биринчи $1 байланывлу сагьифаны}} гёрсете.\n[[Special:WhatLinksHere/$2|Толу тизме де]] бар.", - "nolinkstoimage": "Бу сапламгъа байлавлу сагьифалар ёкъдур", + "linkstoimage": "Шундан сонгра гелеген {{PLURAL:$1|сагьифа|$1 сагьифалар}} бу сапламны къоллай:", + "linkstoimage-more": "$1 {{PLURAL:$1|сагьифадан}} артыкъ бу сапламны къоллай.\nБу тизме янгыз бу сапламны къоллайгъан {{PLURAL:$1|биринчи сагьифаны|биринчи $1 сагьифаланы}} гёрсете.\n[[Special:WhatLinksHere/$2|Толу тизме де]] бар.", + "nolinkstoimage": "Бу сапламны къоллайгъан сагьифалар ёкъд", "linkstoimage-redirect": "$1 (саплам ёллав) $2", "sharedupload-desc-here": "Бу саплам $1 проектдендир, ва башгъасында да къолланма бола. Ону [$2 тасвир сагьифасындан] маълюматы тюпде бериле.‎", "filepage-nofile": "Булай аты булан саплам ёкъдур.", @@ -651,7 +651,7 @@ "whatlinkshere": "Бери байланылгъан", "whatlinkshere-title": "\"$1\" бетге байлангъан сагьифалар", "whatlinkshere-page": "Сагьифа:", - "linkshere": "Гелеген сагьифалар бугъар байлавлу $2:", + "linkshere": "Сонгра гёрсетилген сагьифалар бугъар байлавлу $2:", "nolinkshere": "Бугъар байлавлу сагьифалар ёкъ $2:", "isredirect": "ёллав-сагьифа", "istemplate": "къошув", @@ -796,7 +796,7 @@ "exif-orientation-1": "Нормал", "namespacesall": "бары да", "monthsall": "бары да", - "imgmultipagenext": "гелеген сагьифа →", + "imgmultipagenext": "сонггъу сагьифа →", "imgmultigo": "Гечмек!", "imgmultigoto": "Сагьифагъа гечмек $1", "watchlisttools-clear": "Тергев тизмени тазаламакъ", diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index 817e647936..a7450a5278 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -367,6 +367,7 @@ "ns-specialprotected": "Spezialsäite kënnen net verännert ginn.", "titleprotected": "Dësen Titel gouf vum [[User:$1|$1]] esou gespaart datt en net kann ugeluecht ginn. De Grond deen ugi gouf ass $2", "filereadonlyerror": "De Fichier \"$1\" konnt net geännert ginn well de Repertoire vun de Fichieren \"$2\" nëmme gelies däerf ginn.\n\nDe System-Administrateur deen d'Schreiwe gespaart huet, huet dës Erklärung uginn: \"$3\"", + "invalidtitle": "Net valabelen Titel", "invalidtitle-knownnamespace": "Net valabelen Titel mam Nummraum \"$2\" a mam Text \"$3\"", "invalidtitle-unknownnamespace": "Net valabelen Titel mat der onbekannter Nummraum-Zuel $1 a mam Text \"$2\"", "exception-nologin": "Net ageloggt", @@ -888,6 +889,7 @@ "diff-paragraph-moved-toold": "Den Abschnitt gouf geréckelt. Klickt fir op déi al Plaz ze sprangen.", "difference-missing-revision": "{{PLURAL:$2|Eng Versioun|$2 Versioune}} vun dëser Differenz ($1) {{PLURAL:$2|gouf|goufen}} net fonnt.\n\nDat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].", "searchresults": "Resultat vum Sichen", + "search-filter-title-prefix": "Nëmmen a Säite sichen deenen hiren titel mat \"$1\" ufänkt", "search-filter-title-prefix-reset": "Op all de Säite sichen", "searchresults-title": "Resultater vum Sichen no \"$1\"", "titlematches": "Iwwereneestëmmungen am Säitentitel", @@ -1666,7 +1668,7 @@ "imagelinks": "Benotze vu Fichieren", "linkstoimage": "Dës {{PLURAL:$1|Säit benotzt|Säite benotzen}} dëse Fichier:", "linkstoimage-more": "Méi wéi {{PLURAL:$1|eng Säit ass|$1 Säite si}} mat dësem Fichier verlinkt.\nDës Lëscht weist nëmmen {{PLURAL:$1|den éischte Link|déi éischt $1 Linken}} op dëse Fichier.\nEng [[Special:WhatLinksHere/$2|komplett Lëscht]] ass disponibel.", - "nolinkstoimage": "Keng Säit benotzt dëse Fichier.", + "nolinkstoimage": "Et gëtt keng Säiten déi dëse Fichier benotzen.", "morelinkstoimage": "Weis [[Special:WhatLinksHere/$1|méi Linken]] op dëse Fichier.", "linkstoimage-redirect": "$1 (Fichier-Viruleedung) $2", "duplicatesoffile": "{{PLURAL:$1|De Fichier ass een Doublon|Dës Fichiere sinn Doublone}} vum Fichier ([[Special:FileDuplicateSearch/$2|méi Detailer]]):", diff --git a/languages/i18n/mai.json b/languages/i18n/mai.json index d4c3e75800..a693c65ffc 100644 --- a/languages/i18n/mai.json +++ b/languages/i18n/mai.json @@ -1879,7 +1879,7 @@ "deleteprotected": "अहाँ इ पन्ना नै मेटा सकए छी कियाकि ई सुरक्षण कएल गेल अछि", "deleting-backlinks-warning": "चेतावनी: जे पृष्ठ अहाँ मेटाबै लेल जा रहल छी ओ [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठसभ]] सँ जुडल अछि अथवा ट्रान्सक्ल्युड करैत अछि।", "rollback": "प्रत्यावर्तित सम्पादन", - "rollbacklink": "प्रत्यावर्तन", + "rollbacklink": "पूर्ववत्", "rollbacklinkcount": "$1 {{PLURAL:$1|सम्पादन}} पूर्ववत करी", "rollbacklinkcount-morethan": "$1 सँ अधिक {{PLURAL:$1|सम्पादन}} पूर्ववत करू", "rollbackfailed": "प्रत्यावर्तन असफल", @@ -2209,7 +2209,7 @@ "movesubpagetext": "नीचां $1 {{PLURAL:$1| पन्ना देखाओल गएल अछि, जे अहि पन्नाकऽ उप पन्ना अछि|पन्ना देखावोल गएल अछि, जे अहि पन्नाकऽ उप पन्ना अछि}}।", "movenosubpage": "अहि पन्ना कऽ कोनो उप पन्ना नहि अछि।", "movereason": "कारण:", - "revertmove": "फेरसँ वएह", + "revertmove": "पूर्ववत्", "delete_and_move_text": "लक्ष्य पृष्ठ \"[[:$1]]\" पहिने सँ अस्तित्वमे अछि।\nअहाँ एकरा स्थानान्तरण करै लेल एकरा मेटाबैलेल चाहै छी?", "delete_and_move_confirm": "हँ, पन्ना मेटाउ", "delete_and_move_reason": "\"[[$1]]\" सँ घसकेबा लेल जगह बनेबा लेल मेटाएल गेल", diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json index 55ce3fefc3..64fbb7cc1e 100644 --- a/languages/i18n/mk.json +++ b/languages/i18n/mk.json @@ -385,6 +385,7 @@ "ns-specialprotected": "Службени страници не може да се уредуваат.", "titleprotected": "Овој наслов од страна на [[User:$1|$1]] е заштитен и не може да се создаде.\nПричината за тоа е: $2.", "filereadonlyerror": "Не можам да ја изменам податотеката „$1“ бидејќи складиштето „$2“ е во незаписен режим.\n\t\nАдминистраторот што ја заклучи го понуди следново образложение: „''$3''“.", + "invalidtitle": "Погрешен наслов", "invalidtitle-knownnamespace": "Неважечки наслов со именски простор „$2“ и текст „$3“", "invalidtitle-unknownnamespace": "Неважечки наслов со именски простор бр. $1 и текст „$2“", "exception-nologin": "Не сте најавени", @@ -2077,7 +2078,7 @@ "cachedspecial-refresh-now": "Погл. најновата.", "categories": "Категории", "categories-submit": "Прикажи", - "categoriespagetext": "{{PLURAL:$1|Следната категорија содржи|Следните категории содржат}} страници или мултимедијални податотеки.\n[[Special:UnusedCategories|Неискористените категории]] не се прикажани овде.\nПогледајте ги и [[Special:WantedCategories|потребните категории]].", + "categoriespagetext": "На викито {{PLURAL:$1|постои следнава категорија, и истата може да е неискористена|постојат следниве категории, и истите можат да се неискористени}} или не.\nПогледајте ги и [[Special:WantedCategories|потребните категории]].", "categoriesfrom": "Приказ на категории почнувајќи од:", "deletedcontributions": "Избришани кориснички придонеси", "deletedcontributions-title": "Избришани кориснички придонеси", @@ -3920,7 +3921,7 @@ "duration-hours": "{{PLURAL:$1|еден час|$1 часа}}", "duration-days": "{{PLURAL:$1|еден ден|$1 дена}}", "duration-weeks": "$1 {{PLURAL:$1|недела|недели}}", - "duration-years": "{{PLURAL:$1|година|години}}", + "duration-years": "{{PLURAL:$1|$1 година|$1 години}}", "duration-decades": "$1 {{PLURAL:$1|деценија|децении}}", "duration-centuries": "$1 {{PLURAL:$1|век|века}}", "duration-millennia": "$1 {{PLURAL:$1|милениум|милениуми}}", diff --git a/languages/i18n/mni.json b/languages/i18n/mni.json index 5f22f95cbe..a2253071af 100644 --- a/languages/i18n/mni.json +++ b/languages/i18n/mni.json @@ -76,7 +76,7 @@ "may_long": "ꯃꯦ", "june": "ꯖꯨꯟ", "july": "ꯖꯨꯂꯥꯏ", - "august": "ꯑꯥꯒꯥꯁꯇ", + "august": "ꯑꯒꯥꯁꯇ", "september": "ꯁꯦꯄꯇꯦꯝꯕꯔ", "october": "ꯑꯣꯛꯇꯣꯕꯔ", "november": "ꯅꯣꯕꯦꯝꯕꯔ", @@ -119,7 +119,7 @@ "december-date": "$1 ꯗꯤꯁꯦꯝꯕꯔ", "period-am": "ꯑꯦ ꯑꯦꯝ", "period-pm": "ꯄꯤ ꯑꯦꯝ", - "pagecategories": "{{PLURAL:$1|Category|Categories}}", + "pagecategories": "{{PLURAL:$1|ꯃꯆꯥꯈꯥꯏꯕ|ꯃꯆꯥꯈꯥꯏꯕꯁꯤꯡ}}", "category_header": "$1 ꯗꯥ ꯂꯩꯕꯥ ꯂꯥꯃꯥꯏꯒꯤ ꯃꯆꯥꯈꯥꯏꯕꯥ", "subcategories": "ꯃꯆꯥꯈꯥꯏꯕꯥ ꯃꯆꯥ", "category-media-header": "$1 ꯗꯥ ꯂꯩꯕꯥ ꯃꯦꯗꯤꯌꯥꯒꯤ ꯃꯆꯥꯈꯥꯏꯕꯥ", @@ -146,7 +146,7 @@ "mytalk": "ꯉꯥꯡꯐꯝ", "anontalk": "ꯉꯥꯡꯐꯝ", "navigation": "ꯆꯠꯄꯥ", - "and": "꯱ꯁꯪ #꯳꯲; ꯑꯃꯁꯨꯪ", + "and": "ꯑꯃꯁꯨꯡ #꯳꯲; ꯑꯃꯁꯨꯪ", "faq": "FAQ", "actions": "Actions", "namespaces": "ꯃꯥꯃꯤꯡꯒꯤ ꯃꯐꯝ", @@ -158,7 +158,7 @@ "help": "ꯃꯥꯇꯦꯡ", "search": "ꯊꯤꯕꯥ", "search-ignored-headings": " #
    \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 #
    ", - "searchbutton": "ꯇꯤꯕꯥ", + "searchbutton": "ꯊꯤꯕꯥ", "go": "ꯆꯠꯂꯨ", "searcharticle": "ꯆꯠꯂꯨ", "history": "ꯂꯥꯃꯥꯏꯒꯤ ꯄꯨꯋꯥꯔꯤ", @@ -223,13 +223,13 @@ "disclaimerpage": "Project:ꯃꯌꯥꯝꯒꯤ ꯑꯣꯏꯅꯥ ꯌꯥꯅꯤꯡꯗꯕꯥ ꯐꯣꯡꯗꯣꯔꯛꯄꯥ", "edithelp": "ꯁꯦꯝꯒꯠꯅꯕꯥ ꯃꯥꯇꯦꯡ", "helppage-top-gethelp": "ꯃꯥꯇꯦꯡ", - "mainpage": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯃꯥꯏ", + "mainpage": "ꯃꯔꯨꯑꯣꯏꯕ ꯂꯃꯥꯏ", "mainpage-description": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯃꯥꯏ", "policy-url": "Project:ꯈꯣꯡꯊꯥꯡ", "portal": "ꯃꯤꯌꯥꯝꯒꯤ ꯄꯣꯔꯇꯦꯜ", "portal-url": "Project:ꯃꯤꯌꯥꯝꯒꯤ ꯄꯣꯔꯇꯦꯜ", "privacy": "ꯑꯔꯣꯟꯕꯥ ꯊꯧꯔꯥꯡ", - "privacypage": "Project:ꯑꯔꯣꯟꯕꯥ ꯊꯧꯔꯥꯡ", + "privacypage": "Project:ꯑꯔꯣꯟꯕ ꯊꯧꯔꯥꯡ", "badaccess": "ꯑꯌꯥꯕꯥꯗꯨ ꯁꯣꯏꯔꯦ", "badaccess-group0": "ꯅꯪ ꯍꯧꯖꯤꯛ ꯑꯦꯛꯁꯟ ꯂꯧꯈꯠꯄꯥ ꯌꯥꯗꯔꯤ ꯅꯪꯅꯥ ꯍꯪꯒꯠꯆꯔꯤꯕꯗꯨꯒꯤ ꯃꯇꯥꯡꯗ", "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.", @@ -280,7 +280,7 @@ "nstab-template": "ꯇꯦꯝꯄꯂꯦꯠ", "nstab-help": "ꯂꯥꯃꯥꯏꯒꯤ ꯃꯇꯦꯂꯧꯐꯝ", "nstab-category": "ꯃꯥꯆꯥꯛꯈꯥꯏꯕꯥ", - "mainpage-nstab": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯃꯥꯏ", + "mainpage-nstab": "ꯃꯔꯨꯑꯣꯏꯕ ꯂꯃꯥꯏ", "nosuchaction": "ꯃꯁꯤꯒꯨꯕꯥ ꯃꯥꯑꯣꯡꯁꯤ ꯅꯠꯇꯦ", "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.", "nosuchspecialpage": "ꯃꯁꯤꯒꯥ ꯃꯥꯟꯅꯕꯥ ꯑꯈꯟꯅꯕꯥ ꯂꯥꯃꯥꯏ ꯂꯩꯇꯦ", @@ -431,6 +431,7 @@ "botpasswords": "ꯕꯣꯇ ꯄꯥꯁꯋꯔꯇ", "botpasswords-summary": "Bot passwords allow access to a user account via the API without using the account's main login credentials. The user rights available when logged in with a bot password may be restricted.\n\nIf you don't know why you might want to do this, you should probably not do it. No one should ever ask you to generate one of these and give it to them.", "botpasswords-disabled": "ꯕꯣꯇ ꯄꯥꯁꯋꯔꯇ ꯌꯥꯉꯟꯗꯕꯥ", + "botpasswords-label-appid": "ꯕꯣꯠ ꯃꯃꯤꯡ:", "botpasswords-label-create": "ꯁꯥꯕꯥ", "botpasswords-label-update": "ꯅꯧꯊꯣꯛꯍꯟꯕꯥ", "botpasswords-label-cancel": "ꯀꯛꯊꯠꯄꯥ", @@ -447,6 +448,7 @@ "resetpass-submit-cancel": "ꯀꯛꯊꯠꯄꯥ", "resetpass-wrong-oldpass": "ꯃꯇꯝ ꯈꯔꯥꯒꯤ ꯑꯣꯏꯅꯥ ꯀꯔꯤꯝꯇꯥ ꯌꯥꯎꯗꯦ ꯅꯠꯇꯔꯒꯥ ꯍꯧꯖꯤꯧꯀꯤ ꯄꯥꯁꯋ꯭ꯔꯇ꯫\nꯅꯪꯅꯥ ꯄꯥꯁꯋꯑꯔꯇ ꯍꯥꯟꯅꯗꯒꯤ ꯍꯣꯡꯂꯝꯂꯅꯤ ꯅꯠꯇꯔꯒꯥ ꯍꯪꯒꯠꯂꯨ ꯉꯥꯏꯍꯥꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯄꯥꯁꯋ꯭ꯔꯇ", "resetpass-temp-password": "ꯉꯩꯍꯥꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯄꯥꯁꯋ꯭ꯔꯇ", + "resetpass-expired": "ꯅꯪꯒꯤ ꯄꯥꯁꯋ꯭ꯔꯇ ꯁꯤ ꯌꯥꯗꯔꯦ ꯫ ꯆꯥꯟꯕꯤꯗꯨꯅ ꯑꯅꯧꯕ ꯱ ꯁꯦꯝꯃꯣ ꯂꯣꯒ ꯏꯟ ꯇꯧꯅꯕ ꯫", "passwordreset": "ꯄꯥꯁꯋ꯭ꯇ ꯁꯦꯝꯗꯣꯛꯄꯥ", "passwordreset-username": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ ꯃꯃꯤꯡ", "passwordreset-domain": "ꯗꯣꯃꯦꯟ", @@ -455,6 +457,8 @@ "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.", "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.", "passwordreset-emailelement": "$1 ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ\n$2 ꯉꯩꯍꯥꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯄꯥꯁꯋꯔꯇ", + "changeemail-oldemail": "ꯍꯧꯖꯤꯛꯀꯤ ꯏꯃꯦꯜ ꯑꯦꯗ꯭ꯔꯦꯁ:", + "changeemail-newemail": "ꯑꯅꯧꯕ ꯏꯃꯦꯜ ꯑꯦꯗ꯭ꯔꯦꯁ:", "changeemail-none": "ꯑꯃꯥꯇꯥ ꯅꯠꯇꯦ", "changeemail-password": "ꯅꯪꯒꯤ {{SITENAME}} ꯄꯥꯁꯋ꯭ꯔꯇ:", "changeemail-submit": "ꯏ-ꯃꯦꯜ ꯍꯣꯡꯕꯥ", @@ -500,6 +504,8 @@ "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs], but you do not have permission to create this page.", "missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].", "userpage-userdoesnotexist-view": "$1 ꯁꯤꯖꯤꯅꯅꯔꯤꯕ ꯑꯦꯀꯥꯎꯅ ꯁꯤ ꯃꯤꯡ ꯆꯟꯗꯔꯤ", + "updated": "(ꯅꯧꯊꯣꯛꯍꯟꯂꯦ)", + "note": "<ꯑꯀꯟꯕ>ꯏꯁꯤꯟꯒꯗꯕ:", "continue-editing": "ꯁꯦꯝꯒꯠꯄꯒꯤ ꯃꯐꯝꯗꯨꯗꯥ ꯆꯠꯂꯨ", "editing": "$1 ꯁꯦꯝꯒꯠꯂꯤ", "creating": "Creating $1", @@ -515,11 +521,13 @@ "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:", "moveddeleted-notice": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯀꯛꯊꯠꯈꯔꯦ. \nꯀꯛꯊꯠꯄꯥ, ꯉꯥꯛꯊꯣꯛꯄꯥ ꯑꯃꯗꯤ ꯂꯣꯒ ꯂꯦꯡꯍꯟꯕꯥ ꯂꯥꯃꯥꯏꯒꯤꯗꯃꯛ ꯇꯨ ꯃꯈꯥꯒꯤ ꯁꯤꯗꯥ ꯔꯤꯐꯔꯦꯟꯁ ꯎꯨꯠꯂꯦ", "edit-conflict": "ꯁ‍ꯦꯝꯒꯠꯐꯝꯒꯤ ꯈꯠꯅ ꯆꯩꯅꯕꯥ", + "postedit-confirmation-saved": "ꯅꯪꯒꯤ ꯁꯦꯝꯒꯠꯄꯗꯨ ꯇꯨꯡꯁꯤꯟꯈꯔꯦ ꯫", + "postedit-confirmation-published": "ꯅꯪꯒꯤ ꯁꯦꯝꯒꯠꯄꯗꯨ ꯐꯣꯡꯗꯣꯛꯈꯔꯦ ꯫", "content-model-wikitext": "ꯋꯤꯀꯤ ꯋꯥꯍꯩ ꯋꯥꯇꯥ", "content-json-empty-object": "ꯑꯍꯥꯡꯕꯥ ꯄꯣꯠꯁꯛ", "viewpagelogs": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤꯒꯤ ꯅꯧꯅ ꯆꯪꯉꯨ", "currentrev-asof": "$1 ꯒꯤ ꯅꯧꯅꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ ꯃꯤꯠꯌꯦꯡ", - "revisionasof": "Revision as of $1", + "revisionasof": " $1 ꯒꯤ ꯑꯃꯨꯛ ꯍꯟꯅ ꯌꯦꯡꯕ", "revision-info": "Revision as of $1 by {{GENDER:$6|$2}}$7", "previousrevision": "ꯑꯔꯤꯕꯥ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ", "nextrevision": "ꯑꯅꯧꯕꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ", @@ -566,14 +574,55 @@ "search-redirect": "(redirect from $1)", "search-section": "(section $1)", "search-suggest": "$1 ꯁꯤꯔꯥ ꯅꯪꯅꯥ ꯍꯥꯏꯅꯤꯡꯂꯤꯕꯥꯁꯤ", + "search-interwiki-more-results": "ꯑꯍꯦꯟꯕ ꯐꯣꯜ ꯁꯤꯡ", + "search-relatedarticle": "ꯃꯔꯤꯂꯩꯅꯔꯦ", + "searchrelated": "ꯃꯔꯤꯂꯩꯅꯔꯦ", "searchall": "ꯄꯨꯂꯞ", "search-showingresults": "{{PLURAL:$4|Result $1 of $3|Results $1 – $2 of $3}}", "search-nonefound": "ꯃꯁꯤꯒꯤ ꯐꯣꯜꯁꯤꯒꯥ ꯆꯥꯟꯅꯕꯥ ꯂꯩꯇꯦ", + "powersearch-togglelabel": "ꯑꯁꯣꯏ ꯑꯔꯥꯟ ꯌꯥꯎꯕꯔ ꯌꯦꯡꯕ:", + "powersearch-toggleall": "ꯄꯨꯂꯞ", + "powersearch-togglenone": "ꯌꯥꯎꯗꯦ", + "powersearch-remember": "ꯍꯥꯌꯦꯡꯋꯥꯏ ꯊꯤꯅꯕꯥ ꯀꯥꯎꯒꯅꯨ ꯍꯧꯖꯤꯛ ꯈꯟꯕꯥ", + "search-external": "ꯃꯄꯥꯟꯒ ꯃꯔꯤꯂꯩꯅꯕ ꯊꯤꯕ", + "preferences": "ꯀꯔꯝꯕ ꯈꯟꯒꯅꯤ", "mypreferences": "Preferences", + "prefs-edits": "ꯁꯦꯝꯒꯠꯄꯒꯤ ꯃꯁꯤꯡ:", + "prefs-skin": "ꯎꯨꯟꯁꯥ", + "prefs-user-pages": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯂꯃꯥꯏꯁꯤꯡ", + "prefs-personal": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯄꯔꯣꯐꯥꯏꯜ", + "prefs-rc": "ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯁꯤꯡ", + "prefs-watchlist": "ꯌꯦꯡꯂꯤꯕ ꯄꯥꯥꯔꯦꯡ", + "prefs-editwatchlist": "ꯌꯦꯡꯂꯤꯕ ꯄꯥꯔꯦꯡꯗꯨ ꯁꯦꯝꯒꯠꯂꯨ", + "prefs-editwatchlist-label": "ꯅꯪꯅ ꯌꯦꯡꯉꯤꯕ ꯄꯔꯦꯡꯗꯨ ꯏꯁꯤꯟꯗꯨꯅ ꯁꯦꯝꯒꯠꯂꯨ:", + "saveprefs": "ꯇꯨꯡꯁꯤꯟꯂꯕ", + "prefs-editing": "ꯁꯦꯝꯒꯠꯂꯤ", + "searchresultshead": "ꯊꯤꯕꯥ", + "stub-threshold-sample-link": "ꯃꯑꯣꯡ", + "stub-threshold-disabled": "ꯌꯥꯍꯟꯗꯔꯗ", + "timezonelegend": "ꯃꯇꯝꯒꯤ ꯃꯐꯝ:", + "localtime": "ꯂꯩꯀꯥꯏꯒꯤ ꯃꯇꯝ:", + "timezoneregion-africa": "ꯑꯐꯔꯤꯀ", + "timezoneregion-america": "ꯑꯃꯦꯔꯤꯀ", + "timezoneregion-antarctica": "ꯑꯟꯇꯥꯔꯇꯤꯀ", + "timezoneregion-arctic": "ꯑꯥꯔꯇꯤꯛ", + "timezoneregion-asia": "ꯑꯦꯁꯤꯌꯥ", + "timezoneregion-atlantic": "ꯑꯇꯂꯥꯟꯇꯛ ꯏꯄꯥꯛ", + "timezoneregion-australia": "ꯑꯨꯁꯇꯔꯦꯂꯤꯌꯥ", + "timezoneregion-europe": "ꯏꯌꯨꯔꯣꯞ", + "timezoneregion-indian": "ꯏꯟꯗꯤꯌꯥꯟ ꯏꯄꯥꯛ", + "timezoneregion-pacific": "ꯄꯦꯁꯤꯐꯤꯛ ꯏꯄꯥꯛ", + "allowemail": "ꯑꯇꯣꯞꯄ ꯌꯨꯁꯔꯁꯤꯡ ꯅꯥ ꯏꯃꯦꯜ ꯊꯥꯕ ꯌꯥꯍꯟꯕ ꯑꯩꯉꯣꯟꯗ", + "prefs-searchoptions": "ꯊꯤꯕꯥ", + "prefs-namespaces": "ꯃꯃꯤꯡ", + "default": "ꯑꯃꯥ ꯍꯦꯛꯇꯥ", + "prefs-files": "ꯐꯥꯏꯜꯁꯤꯡ", + "youremail": "ꯏꯃꯦꯜ:", + "yournick": "ꯑꯅꯧꯕ ꯈꯨꯠꯌꯦꯛ:", "group-bot": "ꯕꯣꯇꯁꯤꯡ", "group-sysop": "ꯆꯨꯞꯂꯤ ꯄꯥꯏꯔꯤꯕꯁꯤꯡ", "grouppage-bot": "{{ns:project}}:ꯕꯣꯠꯁꯤꯡ", - "grouppage-sysop": "ꯉꯥꯛ ꯁꯦꯟꯂꯤꯕ {{ns:project}}", + "grouppage-sysop": "{{ns:project}}:ꯆꯨꯞꯂꯤ ꯄꯥꯏꯔꯤꯕꯁꯤꯡ", "right-writeapi": "API sijinaduna eba", "newuserlogpage": "User creation log", "action-edit": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯁꯦꯝꯒꯠꯂꯨ", @@ -645,8 +694,8 @@ "filehist-dimensions": "ꯄꯥꯛ ꯆꯥꯎꯕꯥ", "filehist-comment": "ꯑꯄꯥꯝꯕꯥ ꯐꯣꯡꯗꯣꯛ ꯎ", "imagelinks": "ꯐꯥꯏꯜꯒꯤ ꯁꯤꯖꯤꯟꯅꯐꯝ", - "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:", - "nolinkstoimage": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤꯒꯥ ꯃꯔꯤ ꯂꯩꯅꯕꯥ ꯁꯝꯅꯐꯝ ꯐꯥꯏꯜ ꯂꯩꯇꯦ", + "linkstoimage": "ꯃꯇꯨꯡ ꯏꯟꯕ {{PLURAL:$1|ꯂꯥꯃꯥꯏꯁꯤꯖꯤꯟꯅꯕ|$1ꯂꯥꯃꯥꯏ ꯁꯤꯖꯤꯟꯅꯕ}} ꯃꯁꯤꯒꯤ ꯐꯥꯏꯜ:", + "nolinkstoimage": "ꯃꯁꯤꯒꯤ ꯐꯥꯏꯜ ꯁꯤ ꯁꯤꯖꯤꯟꯅꯕ ꯂꯥꯃꯥꯏꯁꯤꯡ ꯂꯩꯇꯦ ꯫", "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.", "filepage-nofile": "ꯃꯁꯤꯒꯤ ꯐꯥꯏꯜ ꯃꯃꯤꯡ ꯁꯤ ꯒꯥ ꯃꯥꯟꯅꯕ ꯂꯩꯇꯦ", "upload-disallowed-here": "ꯃꯁꯤꯒꯤ ꯐꯥꯏꯜꯁꯤ ꯅꯪꯅꯥ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯏꯕꯥ ꯌꯥꯔꯣꯏ", @@ -693,12 +742,13 @@ "tooltip-invert": "Akhannaba maming gi manungda page tungi ahongba lotnaba oopu du yeng ngoo", "namespace_association": "Maming eefam ga marileinaba", "tooltip-namespace_association": "Oopu du yengoo maming eefam gi hiramga mari leinaba khangatlaba maming eefam amadi wa ngangfam manung channaba", - "blanknamespace": "ꯃꯔꯨꯑꯣꯏꯕꯥ", + "blanknamespace": "ꯃꯔꯨꯑꯣꯏꯕ", "contributions": "{{GENDER:$1|User}} ꯈꯣꯝꯒꯠꯂꯛꯄꯁꯤꯡ", "contributions-title": "$1 ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯁꯤꯅ ꯈꯣꯝꯖꯤꯜꯂꯛꯄꯁꯤꯡ", "mycontris": "ꯈꯣꯝꯒꯠꯂꯛꯂꯤꯕꯁꯤꯡ", "anoncontribs": "ꯈꯣꯝꯒꯠꯂꯛꯂꯤꯕꯁꯤꯡ", "contribsub2": "{{GENDER:$3|$1}}$2 ꯒꯤ", + "nocontribs": "ꯃꯁꯤꯗ ꯆꯪꯂꯤꯕꯁꯤꯒ ꯆꯥꯟꯅꯕ ꯑꯍꯣꯡꯕ ꯂꯩꯇꯦ ꯫", "uctop": "ꯍꯧꯖꯤꯛ", "month": "ꯃꯗꯨꯒꯤ ꯊꯥꯗꯒꯤ (ꯑꯃꯗꯤ ꯅꯧꯔꯤꯕꯥ)", "year": "ꯃꯗꯨꯒꯤ ꯆꯥꯍꯤꯗꯒꯤ (ꯑꯃꯗꯤ ꯅꯧꯔꯤꯕꯥ)", @@ -726,12 +776,13 @@ "whatlinkshere-hidelinks": "$1 ꯁꯝꯅꯐꯝ", "whatlinkshere-hideimages": "$1 ꯒꯤ ꯐꯥꯏꯜ ꯁꯝꯅꯐꯝ", "whatlinkshere-filters": "ꯁꯦꯡꯇꯣꯛꯐꯝ", - "ipboptions": "ꯄꯨꯪ ꯲:2 hours, ꯅꯣꯡꯃ:1 day, ꯅꯨꯃꯤꯠ ꯳ꯅꯤ:3 days, ꯆꯥꯌꯣꯜ ꯱: 1 week, ꯆꯥꯌꯣꯜ ꯲: 2weeks, ꯊꯥ ꯱: 1 month, ꯊꯥ ꯳: 3 months, ꯊꯥ ꯶: 6 months, ꯆꯥꯍꯤ ꯱: 1 year, ꯃꯁꯤꯡꯊꯤꯉꯝꯗꯅ:infinite ‌.", + "ipboptions": "2 ꯄꯨꯡ:2 hours,1 ꯅꯨꯃꯤꯠ:1 day,3 ꯅꯨꯃꯤꯠꯁꯤꯡ:3 days,1 ꯆꯥꯌꯣꯜ:1 week,2 ꯆꯥꯌꯣꯜꯁꯤꯡ:2 weeks,1 ꯊꯥ: 1 month,3 ꯊꯥꯁꯤꯡ:3 months,6 ꯊꯥꯁꯤꯡ:6 months,1 ꯆꯥꯍꯤ:1 year,ꯃꯁꯤꯡꯊꯤꯉꯝꯗꯕ:infinite ‌.", "infiniteblock": "ꯃꯁꯤꯡ ꯊꯤꯉꯝꯗꯅ", "blocklink": "ꯊꯤꯡꯕ", "contribslink": "ꯈꯣꯝ", "blocklogpage": "ꯆꯪꯁꯤꯟꯕꯥ ꯊꯤꯡꯕꯥ", "reblock-logentry": "[[$1]] ꯒꯤ ꯁꯦꯝꯐꯝꯒꯤ ꯑꯍꯣꯡꯕꯗꯨ ꯊꯤꯡꯉꯨ $2 $3 ꯒꯤ ꯑꯍꯦꯟꯕ ꯃꯇꯝꯒ ꯂꯣꯏꯅꯅ", + "block-log-flags-nocreate": "ꯑꯩꯀꯥꯎꯟ ꯁꯦꯝꯕ ꯕꯥꯍꯟꯗꯕ", "movelogpage": "ꯂꯣꯒ ꯁꯤ ꯂꯦꯡꯍꯟꯂꯨ", "export": "ꯂꯥꯃꯥꯏꯁꯤꯡ ꯄꯨꯊꯣꯛꯈꯣ", "thumbnail-more": "ꯆꯥꯑꯣꯍꯟꯕꯥ", @@ -826,9 +877,9 @@ "file-info-size-pages": "$1 × $2 pixels, ꯐꯥꯏꯜ ꯆꯥꯎꯕꯒꯤ ꯆꯥꯡ: $3, MIME type: $4, $5 {{PLURAL:$5|ꯂꯥꯃꯥꯏ|ꯂꯥꯃꯥꯏꯁꯤꯡ}}", "file-nohires": "ꯃꯁꯤꯗꯒꯤ ꯍꯦꯟꯅꯥ ꯁꯦꯡꯕꯥ ꯂꯩꯇꯔꯦ", "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3", - "show-big-image": "File Asengba", + "show-big-image": "ꯐꯥꯏꯜ ꯑꯁꯦꯡꯕ", "show-big-image-preview": "Size of this preview: $1.", - "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.", + "show-big-image-other": "ꯑꯇꯩ {{PLURAL:$2|resolution|ꯁꯦꯡꯅ ꯌꯦꯡꯕ ꯌꯥꯕ}}: $1.", "show-big-image-size": "$1 × $2 pixels", "metadata": "ꯃꯦꯇꯥꯗꯥꯇꯥ", "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.", @@ -863,7 +914,7 @@ "redirect-revision": "ꯂꯥꯃꯥꯏ ꯑꯃꯨꯧꯍꯟꯅ ꯌꯦꯡꯕ", "redirect-file": "ꯐꯥꯏꯜ ꯃꯃꯤꯡ", "specialpages": "ꯑꯈꯟꯅꯕ ꯂꯥꯃꯥꯏꯁꯤꯡ", - "tag-filter": "[[Special:Tags|Tag]] filter:", + "tag-filter": "[[Special:Tags|ꯊꯦꯡꯕ]] ꯁꯦꯡꯇꯣꯛꯄ:", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)", "tags-active-yes": "ꯍꯣꯏ", "tags-active-no": "ꯅꯠꯇꯦ", diff --git a/languages/i18n/mnw.json b/languages/i18n/mnw.json new file mode 100644 index 0000000000..b51843c428 --- /dev/null +++ b/languages/i18n/mnw.json @@ -0,0 +1,635 @@ +{ + "@metadata": { + "authors": [ + "Dr Lotus Black", + "Htawmonzel" + ] + }, + "tog-underline": "လေန် မတာပၞောန်သၟဝ်", + "tog-hideminor": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဟွံဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်", + "tog-hidepatrolled": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဇၞော်ဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်", + "tog-hidecategorization": "ပၞုက် အရာမဖျေဟ်ကဏ္ဍ ကုမုက်လိက်", + "sunday": "တ္ၚဲအဒိုက်", + "monday": "တ္ၚဲစန်", + "tuesday": "တ္ၚဲအၚာ", + "wednesday": "တ္ၚဲဗုဒ္ဓဝါ", + "thursday": "တ္ၚဲအၚာ", + "friday": "တ္ၚဲသိုက်", + "saturday": "တ္ၚဲသ္ၚိသဝ်", + "sun": "အဒိုက်", + "mon": "စန်", + "tue": "အ္ၚာ", + "wed": "ဗုဒ္ဓ", + "thu": "ဗြဴ", + "fri": "သိုက်", + "sat": "သဝ်", + "january": "ဇာန်နဝါရဳ", + "february": "ဖေဖဝ်ဝါရဳ", + "march": "မာတ်", + "april": "ဨပြဳ", + "may_long": "မေ", + "june": "ဂျောန်", + "july": "ဂျူလာင်", + "august": "အဝ်ဂေတ်", + "september": "သေပ်တေမ်ပါ", + "october": "အံက်တဝ်ပါ", + "november": "နဝ်ဝေမ်ပါ", + "december": "ဒဳဇြေန်ပါ", + "january-gen": "ဇာန်နဝါရဳ", + "february-gen": "ဖေဖဝ်ဝါရဳ", + "march-gen": "မာတ်", + "april-gen": "ဨပြဳ", + "may-gen": "မေ", + "june-gen": "ဂျန်", + "july-gen": "ဂျူလာင်", + "august-gen": "အဝ်ဂေတ်", + "september-gen": "သေပ်တေမ်ပါ", + "october-gen": "အံက်တဝ်ပါ", + "november-gen": "နဝ်ဝေမ်ပါ", + "december-gen": "ဒဳဇြေန်ပါ", + "jan": "ဇာန်နဝါရဳ", + "feb": "ဖေ", + "mar": "မာတ်", + "apr": "ဨ", + "may": "မေ", + "jun": "ဂျန်", + "jul": "ဂျူ", + "aug": "အဝ်", + "sep": "သေတ်", + "oct": "အံက်", + "nov": "နဝ်", + "dec": "ဒဳ", + "pagecategories": "{{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍဂမၠိုင်}}", + "category_header": "မုက်လိက်ဂမၠိုင် ပ္ဍဲ ကဏ္ဍ \"$1\"", + "subcategories": "ကဏ္ဍလစှ်ေဂမၠိုင်", + "category-media-header": "မဳဒဳယာ စပ်ကဵု ကဏ္ဍ \"$1\"", + "category-empty": "ကဏ္ဍဏအ် ပြဟ်ဟ်ဏအ် ဟွံမဲ ကု မုက်လိက် ဟွံသေင်မ္ဂး ပရူမွဲမွဲဏီရ", + "hidden-categories": "{{PLURAL:$1|ကဏ္ဍ မပၞုက်|ကဏ္ဍ မပၞုက်ဂမၠိုင်}}", + "category-subcat-count": "{{PLURAL:$2|ကဏ္ဍဏအ်ဂှ် ကဏ္ဍလစှ်ေ နွံဆ အတိုင်ဗွဲသၟဝ်ဝွံရ၊၊|ကဏ္ဍဏအ် နွံဆအတိုင် ဗွဲသၟဝ်ဝွံရ၊၊ {{PLURAL:$1|ကဏ္ဍလစှ်ေ|$1 ကဏ္ဍလစှ်ေဂမၠိုင်}}, ပၞောဝ်ကဵု $2 သီုဖအိုတ်}}", + "category-article-count": "{{PLURAL:$2|ကဏ္ဍဏအ် နွံဆၜိုတ် အတိုင်ဗွဲသၟဝ်ဏအ်ရ.| ဗွဲသၟဝ်ဏအ်ဂှ် {{PLURAL:$1| ဒှ်လၟိဟ် မုက်လိက်| ဒှ်လၟိဟ် မုက်လိက်ဂမၠိုင် $1 }} စပ် ကုကဏ္ဍဏအ်ရ၊၊ သီုဖအိုတ် နွံ $2}}", + "category-file-count": "{{PLURAL:$2|ကဏ္ဍဏအ် နွံဆၜိုတ် ဝှာင်|အတိုင် ဗွဲသၟဝ်ဏအ်ရ {{PLURAL:$1|ဝှာင် ဂှ်|$1 ဝှာင်တအ် ဂှ်}} ပ္ဍဲကဏ္ဍဏအ် သီုဖအိုတ် နွံ $2 ၊၊}}", + "listingcontinuesabbrev": "ဆက်", + "noindex-category": "မုက်လိက် မသက္ကုလိက်", + "broken-file-category": "မုက်လိက် နကဵုလေန် ဝှာင်မလီုလာ်ဂမၠိုင်", + "about": "ပရူ", + "newwindow": "(ပံက် ပ္ဍဲ မုက်ဗတင် တၟိ)", + "cancel": "တးပဲါ", + "mytalk": "ဓရီုကျာ", + "navigation": "သ္ၚိအင်", + "and": " ကေုာံ", + "namespaces": "ဒၞာဲယၟု", + "variants": "မူတၞဟ်", + "navigation-heading": "သ္ၚိအင် မေန်နူ", + "returnto": "ကလေင်အာ ဇရေင် $1", + "tagline": "နူ {{SITENAME}}", + "help": "ရီု", + "search": "ဂၠာဲ", + "searchbutton": "ဂၠာဲ", + "searcharticle": "အာ", + "history": "ဝှာင် လၟေင်အပြံင်အလှာဲ", + "history_short": "အရာမဗှ်လဝ်တုဲ", + "printableversion": "မူလိက် မပြေန်ပ္တိတ်ဂွံ", + "permalink": "ဌာန်ဒတန်လေန် လၟိုန်", + "view": "ဗဗဵု", + "view-foreign": "ဗဵု ပ္ဍဲ $1", + "edit": "ပလေဝ်ဒါန်", + "create": "ခၞံကၠောန်", + "create-local": "စုတ် ပရူပရာဒေသ", + "delete": "ပလီု", + "newpage": "မုက်လိက် တၟိ", + "talkpagelinktext": "ဓရီုကျာ", + "personaltools": "ကြိယာ သွက်ပူဂဵု", + "talk": "သဳကၠဳ", + "views": "ထ္ၜး", + "toolbox": "ကြိယာ", + "otherlanguages": "နကဵု အရေဝ်ဘာသာ တၞဟ်", + "redirectedfrom": "(ကလေင်ထ္ၜး နူ $1)", + "redirectpagesub": "မုက်လိက် ကလေင်ပညုင်", + "redirectto": "ကလေင်စၞောန်ပညုင်လဝ် နူကဵု-", + "lastmodifiedat": "မုက်လိက်ဏအ် လက္ကရဴအိုတ် ပလေဝ်ဒါန်လဝ် ပ္ဍဲ $1 ပ္ဍဲ $2", + "jumpto": "ဒံင် လုပ်", + "jumptonavigation": "သ္ၚိအင်", + "jumptosearch": "ဂၠာဲ", + "aboutsite": "ပရူ {{SITENAME}}", + "aboutpage": "Project:ပရူ", + "copyright": "လိက်ဂှ် မံက် ပ္ဍဲ $1 ယဝ်ရတင်ယောင်ယာ မွဲမွဲ ဟွံမွဲမ္ဂး၊၊", + "copyrightpage": "{{ns:project}}:Copyrights", + "currentevents": "သဘင် လၟုဟ်ဂမၠိုင်", + "currentevents-url": "Project:သဘင် လၟုဟ်ဂမၠိုင်", + "disclaimers": "ဒဒှ်မဟွံဆက်စပ်", + "disclaimerpage": "Project:ဒဒှ်မဟွံဆက်စပ် နာနာ", + "edithelp": "အရီုအဗင် ပ္ဍဲအရာမပလေဝ်ဒါန်", + "mainpage": "မုက်လိက်တမ်", + "mainpage-description": "မုက်လိက်တမ်", + "portal": "ပါင်မုက် ဂကောံ", + "portal-url": "Project:ပါင်မုက် ဂကောံ", + "privacy": "ပဝ်လသဳ မဆေင်ကဵု အခေါင်အရာပူဂဵု", + "privacypage": "Project:ပဝ်လသဳ အခေါင်ပူဂဵု", + "retrievedfrom": "ကလေင်သီကေတ်လဝ် နူ \"$1\"", + "youhavenewmessages": "{{PLURAL:$3|မၞး ကလိဂွံ}} $1 ($2).", + "youhavenewmessagesfromusers": "{{PLURAL:$4|မၞး ကလိဂွံ}} $1 နူ {{PLURAL:$3| မဒှ် ညးလွပ်တၞဟ်မွဲ|$3 ညးလွပ်ဂမၠိုင်}} ($2).", + "newmessageslinkplural": "{{PLURAL:$1|ပရိုင်မေတ်သုက် တၟိ|999=ပရိုင်မေတ်သုက်တၟိဂမၠိုင်}}", + "newmessagesdifflinkplural": "လက္ကရဴအိုတ် {{PLURAL:$1|အပြံင်အလှာဲ|999=အပြံင်အလှာဲဂမၠိုင်}}", + "editsection": "ပလေဝ်ဒါန်", + "editold": "ပလေဝ်ဒါန်", + "viewsourceold": "ထ္ၜး တမ်ရိုဟ်", + "editlink": "ပလေဝ်ဒါန်", + "viewsourcelink": "ထ္ၜး တမ်ရိုဟ်", + "editsectionhint": "ဒၞာဲ မပလေဝ်ဒါန် - $1", + "toc": "မာတိကာ", + "site-atom-feed": "$1 ဒၞာဲ ဗလးပတိတ်", + "page-atom-feed": "\"$1\" ဒၞာဲ ဗလးပတိတ်", + "red-link-title": "$1(မုက်လဝ်ဏအ် ဟွံပြာကတ်)", + "nstab-main": "မုက်လိက်", + "nstab-user": "မုက်လိက် ညးလွပ်", + "nstab-special": "မုက်လိက် တၟေင်", + "nstab-project": "မုက်လိက် ပရဝ်ဂျေတ်", + "nstab-image": "ဝှာင်", + "nstab-mediawiki": "ပရိုင်မေတ်သုက်", + "nstab-template": "Template", + "nstab-category": "ကဏ္ဍ", + "mainpage-nstab": "မုက်လိက်တမ်", + "nosuchspecialpage": "မုက်လိက် တၟေင် ညံင်ရဴဏအ် ဟွံမဲ", + "nospecialpagetext": "မၞး အာတ်မိက်လဝ် မုက်လိက်တၟေင် မဟွံမဲမွဲရ၊၊\n\nစရင် မုက်လိက်တၟေင် မနွံတအ်ဂှ် ဂွံဆဵုကေတ် ပ္ဍဲ [[Special:SpecialPages|{{int:specialpages}}]].", + "badtitle": "က္ဍိုပ်လိက် ဟွံခိုဟ်", + "badtitletext": "မုက်လိက် မအာတ်မိက်လဝ်ဂှ် ဟွံသၟဟ်အစောမ်၊ သၠာတ်သၠးဒၟံင် ဟွံသေင်မ္ဂး ဆက်စၠောအ်လေန်လဝ် ကုအရေဝ်ဘာသာနာနာ ဟွံသေင်မ္ဂး က္ဍိုပ်လိက် အပ္ဍဲအကြာဝဳကဳ ဟွံဒးရ၊၊\nဟိုတ်နူ စကာလဝ် မလိက် နဒဒှ်က္ဍိုပ်လိက်ဟွံဂွံ ပါလုပ်ဒၟံင် မွဲမ ဟွံသေင်မ္ဂး မဂၠိုင် ကုမ လေဝ် ဒှ်မာန်ရ၊၊", + "viewsource": "ထ္ၜး တမ်ရိုဟ်", + "viewsource-title": "ဗဵု တမ်ရိုဟ် သွက် $1", + "viewsourcetext": "မၞး ဗဵု ကေုာံ စၠောအ်ကပ်ပဳကေတ် တမ်ရိုဟ် မုက်လိက်ဏအ် ဂွံရ၊၊", + "userlogin-yourname": "ယၟုညးလွပ်", + "userlogin-yourname-ph": "စုတ် ယၟုညးလွပ်", + "userlogin-yourpassword": "မလိက်ပၞုက်", + "userlogin-yourpassword-ph": "စုတ် မလိက်ပၞုက် မၞးညိ", + "createacct-yourpassword-ph": "စုတ် မလိက်ပၞုက် မွဲညိ", + "createacct-yourpasswordagain": "ပဒတန် မလိက်ပၞုက်ညိ", + "createacct-yourpasswordagain-ph": "စုတ် မလိက်ပၞုက် မွဲဝါပၠန်ညိ", + "userlogin-remembermypassword": "လုပ်လံက်အေန်လဝ် အဲညိ၊၊", + "login": "လုပ်လံက်အေန်", + "userlogin-noaccount": "ဟွံကလိဂွံ အကံက်ဏီ?", + "userlogin-joinproject": "လုပ်ပံင်တောဲ {{SITENAME}}", + "createaccount": "ခၞံကၠောန် အကံက်", + "userlogin-resetpassword-link": "ဝိုတ်စ မလိက်ပၞုက် မၞးဟာ?", + "userlogin-helplink2": "အရီုအဗင် သွက်ဂွံ လုပ်လံက်အေန်", + "createacct-emailoptional": "ဌာန်ဒၟံင် အဳမေဝ် (သ္ဒးစုတ်ဟေင်)", + "createacct-email-ph": "စုတ် ဌာန်ဒၟံင် အဳမေဝ် မၞးညိ", + "createacct-submit": "ခၞံကၠောန် အကံက် မၞးညိ", + "createacct-benefit-heading": "{{SITENAME}} ဂှ် ကၠောန်လဝ် နကဵု မၞိဟ် ညံင်ရဴမၞးကီုရ၊၊", + "createacct-benefit-body1": "{{PLURAL:$1|တင်ပလေဝ်ဒါန်|တင်ပလေဝ်ဒါန်ဂမၠိုင်}}", + "createacct-benefit-body2": "{{PLURAL:$1|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}", + "createacct-benefit-body3": "ခြာဟွံလအ် {{PLURAL:$1|ညးမခၞံကၠောန်|ညးမခၞံကၠောန်ဂမၠိုင်}}", + "loginlanguagelabel": "အရေဝ်ဘာသာ- $1", + "pt-login": "လုပ်လံက်အေန်", + "pt-login-button": "လုပ်လံက်အေန်", + "pt-createaccount": "ခၞံကၠောန် အကံက်", + "pt-userlogout": "တိတ်", + "passwordreset": "ကလေင်စုတ် မလိက်ပၞုက်", + "bold_sample": "မလိက် တီု", + "bold_tip": "မလိက် တီု", + "italic_sample": "မလိက်ဓစေင်", + "italic_tip": "မလိက်ဓစေင်", + "link_sample": "လေန် က္ဍိုပ်လိက်", + "link_tip": "လေန် ဗွဲအပ္ဍဲ", + "extlink_sample": "http://www.example.com လေန် က္ဍိုပ်လိက်", + "extlink_tip": "လေန် ဗွဲမ္ၚး (remember http:// prefix)", + "headline_sample": "မလိက် က္ဍိုပ်လိက်", + "headline_tip": "က္ဍိုပ်လိက် ကဆံင် ၂", + "nowiki_sample": "စုတ် မလိက် ဟွံ-ဖျေဟ်ဗီုပြင်ဏီ ပ္ဍဲဒၞာဲဏအ်", + "nowiki_tip": "Ignore wiki formatting", + "image_tip": "Embedded file", + "media_tip": "လေန် ဝှာင်", + "sig_tip": "စၟတ်တဲ မၞး နကဵု တဆိပ်အခိင်", + "hr_tip": "လာင် ဗွဲလနေင်", + "summary": "သကေမ်", + "minoredit": "ဣဏအ်ဂှ် ဒှ်အရာ မပလေဝ်ဒါန် ညိည", + "watchthis": "မင်မဲ မုက်လိက်ဏအ်", + "savearticle": "ဂိုင်သိပ် မုက်လိက်", + "preview": "နမူနာ", + "showpreview": "ထ္ၜး နမူနာ", + "showdiff": "ထ္ၜး အရာမပြံင်လှာဲ", + "anoneditwarning": "သတိ မၞး ဟွံဂွံ လုပ်လံက်အေန်လဝ်ရ၊၊ IP address မၞး မံက်ဒၟံင်ရောင် ယဝ်ရ မၞးကၠောန်သ္ပ ပရေင်ပလေဝ်ပလေတ်မွဲမွဲမ္ဂး၊၊ ယဝ်ရ [$1 လုပ်လံက်အေန်] ဟွံသေင်မ္ဂး [$2 ခၞံကၠောန် အကံက်မွဲ]မ္ဂး၊ ပရေင်ပလေဝ်ဒါန်မၞး တြးပတိတ် နကဵု ယၟုသုင်စောဲ မၞးရောင်၊၊", + "blockedtext": "ယၟုညးလွပ် ဟွံသေင်မ္ဂး ဌာန်ဒၟံင်အာင်ဒဳမၞး ဒးဒုင်ကၟာတ်စဵုဒၞာလဝ်\n\nပွမကၟာတ်စဵုဒၞာဂှ် ကၠောန်လဝ် နကဵု $1.\nဟိုတ်မဂွံကၟာတ်စဵုဒၞာဂှ် $2.\n\n* အခိင်မစကၟာတ်စဵုဒၞာ- $8\n* အခိင်မကၟာတ်စဵုဒၞာအိုတ်- $6\n* မရန်တၟအ် blockee- $7\n\nမၞး ဆက်ကဵု $1 ဟွံသေင်မ္ဂး ညးတၞဟ်သအာင် [[{{MediaWiki:Grouppage-sysop}}|administrator]] ယဝ်ရ မိက်ဂွံ ပတိုန်ဂလာန် စပ်ကဵု မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ်ဂွံရ၊၊\nမၞး စကာ အဳမေလ် \"{{int:emailuser}}\" ဟွံဂွံရ၊၊ ဆဂး ယဝ်ရ ဌာန်ဒၟံင်အဳမေလ်ဂှ် ဒှ်အရာတၟေင် ပ္ဍဲ [[Special:Preferences|account preferences]] မၞး ကေုာံ မၞးဟွံဒးဒုင် ကၟာတ်စဵုဒၞာလဝ် နကဵုအဳမေဝ်ဂှ်မ္ဂး ဂွံမာန်ရ၊၊\nIP address မၞး လၟုဟ်ဂှ် ဒှ် $3, တုဲ ID မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ် ဒှ် #$5 ရ၊၊ \nယဝ်ရ မၞးမိက်ဂွံ သၟာန်မ္ဂး တင်ဂၞင် ဗွဲလတူတအ် သီုဖအိုတ်ဂှ် ဗၟံက်ထ္ၜးကဵုညိ၊၊", + "loginreqlink": "လုပ်လံက်အေန်", + "newarticletext": "မၞး စိုပ်အာ ဇရေင် မုက်လိက်လေန် မဟွံဂွံကၠောန်လဝ်ဏီရ၊၊\nသွက်ဂွံ ခၞံကၠောန် မုက်လိက်ဏအ်ဂှ် ပ္ဍဲခံက်အင် ဗွဲသၟဝ်ဏအ်ဂှ် စတက်စုတ် မလိက်ညိ\n(မိက်ဂွံ ဆက်တီ ပရူဏအ်မ္ဂး ဆက်ကျောဝ် ပ္ဍဲ[$1မုက်လိက်အရီုအဗင်]ညိ)။ ဟိုတ်နူဗၠေတ်တုဲ မၞး စိုပ်ကၠုင် ပ္ဍဲဒၞာဲဏအ်မ္ဂး ဍဵု back တုဲ ကလေင်အာ ဒၞာဲတြေံညိ၊၊", + "anontalkpagetext": "----\nမုက်လိက်ဏအ်ဂှ် ဒှ်ဒၞာဲ သွက်မၞိဟ် မဟွံဗမံက်ယၟု၊ မၞိဟ်ဟွံဂွံကၠောန်လဝ် အကံက်တအ်ဏီ ဂွံပတိုန်လညာတ် ပါ်ပဲါရ၊၊\nဟိုတ်ဂှ်ရ ပိုယ်ဒးစကာ မဂၞန် IP address သွက်ဂွံ တီညးတအ်ရ၊၊ IP address ဗီုဏအ်မွဲမွဲဂှ် ပါ်ပရအ်ဂွံ ညးလွပ် ဗွဲမဂၠိုင်ရ၊၊ ယဝ်ရ မၞးဂှ် ဒှ်ညးလွပ် မဟွံဗမံက်ယၟုမွဲ စှ်ေစိုတ် တင်ဂလာန်တအ်ဏအ်ဂှ် ဒှ်ဟွံထေက်မ္ဂး ပဂုန်တုဲ [[Special:CreateAccount|ခၞံကၠောန် အကံက်မွဲ]] ဟွံသေင်မ္ဂး [[Special:UserLogin|လုပ်လံက်အေန်]] သွက်ဂွံ ဝေင်ပဲါ ညးလွပ် မဟွံဗမံက်ယၟုတအ်တၞဟ်တအ်ရ၊၊", + "noarticletext": "ပ္ဍဲမုက်လိက်ဏအ် လိက်ဟွံမွဲဏီရ၊၊\nမၞး ဂၠာဲကေတ် [[Special:Search/{{PAGENAME}}|search for this page title]] ပ္ဍဲမုက်လိက်တၞဟ်မ္ဂး ကလိဂွံမာန်ရောင်၊၊\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nဟွံသေင်မ္ဂး [{{fullurl:{{FULLPAGENAME}}|action=edit}} ခၞံကၠောန် လိက်မုက်ဏအ်ညိ၊၊].", + "noarticletext-nopermission": "ပ္ဍဲမုက်လိက်ဏအ် လိက်ဟွံမဲဏီရ၊၊ မၞး ဂၠာဲကေတ် [[Special:Search/{{PAGENAME}}|search for this page title]] ပ္ဍဲမုက်လိက်တၞဟ်၊ဟွံသေင်မ္ဂး ကလိဂွံမာန်ရ၊၊ [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs], ဆဂး မၞးအခေါင် ခၞံကၠောန် မုက်လိက်ဏအ် ဟွံမဲ၊၊", + "userpage-userdoesnotexist-view": "အကံက် ညးလွပ် \"$1\" ဂှ် ဟွံဂွံပၠောပ်လဝ် စရင်၊၊", + "clearyourcache": "Note: After saving, you may have to bypass your browser's cache to see the changes.\n* Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)\n* Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)\n* Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5\n* Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.", + "previewnote": "မုက်ဏအ်ဂှ် ဆကိုပ်ဗဗဵုဟေင်ရောင်ဂှ် ကဵုဂွံသတိညိ\nအရာမၞး မပြံင်လှာဲလဝ်တအ်ဂှ် ဟွံဂွံ ဂိုင်သိပ် ဏီရ!", + "continue-editing": "အာ ဇရေင် ဒၞာဲမပလေဝ်ဒါန်", + "editing": " $1 ပလေဝ်ဒါန်ဒၟံင်", + "creating": "မခၞံကၠောန်ဒၟံင် $1", + "editingsection": "ပလေဝ်ဒါန်ဒၟံင် (ဒကုတ်) $1", + "templatesused": "{{PLURAL:$1|Template|Templates}} မသုင်စောဲ ပ္ဍဲ မုက်လိက်ဏအ်:", + "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} မစကာလဝ် ပ္ဍဲနမူနာဏအ်-", + "template-protected": "(စဵုဒၞာလဝ်)", + "template-semiprotected": "(မစဵုဒၞာလဝ်-ကဝက်)", + "hiddencategories": "မုက်လိက်ဏအ်ဂှ် ဒှ်ဂကောံ ကု{{PLURAL:$1|1 hidden category|$1 hidden categories}}:", + "permissionserrors": "တင်သၠးအခေါင် ဗၠေတ်", + "permissionserrorstext-withaction": "မၞး ဟွံကလိဂွံလဝ် အခေါင် သွက် $2, အတိုင်ဗွဲသၟဝ်ဏအ်ရ၊၊ {{PLURAL:$1|ဟိုတ်|ဟိုတ်ဂမၠိုင်}}:$1", + "recreate-moveddeleted-warn": "သတိ - မုက်လိက် မဒးဒုင်ပလီုလဝ်တုဲ ခြာဟွံလအ်ဂှ် မၞး ကလေင်ခၞံကၠောန်ဒၟံင်ရ၊၊\nမုက်လိက်ဂှ် မၞးကလေင်ပလေဝ်ဒါန်ကၠောန် ထေက် ဟွံထေက်ဂှ် မၞးထေက် ကဵုဒးဗစာရဏာရ၊၊\n\nသွက်မၞး ဂွံဆဵုကေတ်မာန်ဂှ် တင်စၟတ်သမ္တီ ဒဒှ်မပလီု ကေုာံ မပြံင်ပဆုဲတအ်ဂှ် ထ္ၜးကဵုလဝ် ပ္ဍဲဒၞာဲဏအ်ရ၊၊", + "moveddeleted-notice": "မုက်လိက်ဏအ် ဒးဒုင် ပလီုထောအ်လဝ်ရ၊၊\nတင်စၟတ်သမ္တီ အရာမပလီု၊ မစဵုဒၞာ၊ မပြံင်လဝ် မုက်လိက်တအ်ဂှ် ဗၟံက်ထ္ၜးလဝ် ဗွဲသၟဝ်ဏအ် သွက်ဂွံနိဿဲ၊၊", + "content-model-wikitext": "ဖျုန်လိက်ဝဳကဳ", + "undo-failure": "ပရေင်ပလေဝ်ဒါန်ဂှ် ပတုဲဟွံဂွံ ဟိုတ်တုန် ဒၟာနူ မၞုံ ကုအခက်အခုဲ ပရေင်ပလေဝ်ဒါန် ဗွဲအပ္ဍဲ၊၊", + "viewpagelogs": "ဗဵု တင်စၟတ်သမ္တီ မုက်လိက်ဏအ်", + "currentrev-asof": "မူမဒါန်လဝ် လက္ကရဴအိုတ် နကဵု $1", + "revisionasof": "မူလိက်မပလေဝ်လဝ် နဒဒှ် $1", + "revision-info": "မူပလေဝ်ဒါန်လဝ် ပ္ဍဲ စၟတ်တ္ၚဲ နကဵု {{GENDER:$6|$2}}$7", + "previousrevision": "← မူလိက်မပလေဝ်လဝ် တြေံ", + "nextrevision": "မူမဒါန်လဝ် တၟိနူဂှ် →", + "currentrevisionlink": "မူမဒါန်လဝ် လက္ကရဴအိုတ်", + "cur": "ပစ္စုပ္ပန်", + "last": "ကိုပ်ကၠာ", + "histlegend": "တၞဟ်န ဂွံပတောအ်ၜတ် အကြာမူမပလေဝ်ဒါန်လဝ်တအ်ဂှ် ကဵုစၟတ် ပ္ဍဲခံက်အင်ရေဒဳယော radio boxes တုဲ ဍဵုenter ဟွံသေင်မ္ဂး ဍဵု ကောန်ဍေင် သၟဝ်ဂှ်ညိ၊၊
    Legend: ({{int:cur}}) = အရာမတၞဟ်ခြာ ကုမူလက္ကရဴအိုတ် ({{int:last}}) = အရာမတၞဟ်ခြာ ကုမူကၠာနူဂှ်၊၊ {{int:minoreditletter}} = မပလေဝ်ဒါန်လဝ် ညိည၊၊", + "history-fieldset-title": "ဂၠာဲ မူတြေံဂမၠိုင်", + "histfirst": "တြေံအိုတ်", + "histlast": "တၟိအိုတ်", + "history-feed-title": "လၟေင်အပြံင်အလှာဲ မူလိက်", + "history-feed-description": "လၟေင်အပြံင်အလှာဲ မပလေဝ်ဒါန်လဝ် ပ္ဍဲမုက်လိက်ဏအ် ပ္ဍဲကဵု ဝဳကဳ", + "history-feed-item-nocomment": "$1 ပ္ဍဲ $2", + "rev-delundel": "ပြံင်လှာဲ ဗီုပြင်မဂွံညာတ်ကေတ်", + "mergelog": "တင်စၟတ်သမ္တီ အရာမပံင်ပကောံလဝ်", + "history-title": "လၟေင်အပြံင်အလှာဲ မူမပလေဝ်ဒါန်လဝ် \"$1\"", + "difference-title": "အရာမတၞဟ်ခြာ အကြာ မူတၞဟ်ဂမၠိုင် \"$1\"", + "lineno": "လာင် $1-", + "compareselectedversions": "ၜတ်ကၞာတ် မူတၞဟ်ခြာ မရုဲစှ်လဝ်ဂမၠိုင်", + "editundo": "ဟွံပ", + "diff-empty": "(ဟွံ တၞဟ်ခြာ)", + "diff-multi-sameuser": "({{PLURAL:$1|မူတၞဟ် မၞုံအကြာ မွဲ|$1 မူတၞဟ် မၞုံအကြာဂမၠိုင်}} မခၞံကၠောန်လဝ် နကဵု ညးလွပ် တုပ်ပ်တအ်ဂှ် ဟွံထ္ၜးလဝ်ရ၊၊)", + "diff-multi-otherusers": "({{PLURAL:$1|မူတၞဟ် မၞုံအကြာ မွဲ|$1 မူတၞဟ် မၞုံအကြာဂမၠိုင်}} မခၞံကၠောဝန်လဝ် နကဵု{{PLURAL:$2|ညးလွပ်တၞဟ် မွဲ|$2 ညးလွပ်တၞဟ်ဂမၠိုင်}}ဂှ် ဟွံထ္ၜးလဝ်ရ၊၊)", + "searchresults": "သွဟ် မဂၠာဲ", + "searchresults-title": "သွဟ် မဂၠာဲ သွက် \"$1\"", + "prevn": "ကၠာ {{PLURAL:$1|$1}}", + "nextn": "ဂတ {{PLURAL:$1|$1}}", + "prevn-title": "မတုဲကၠုင် $1 {{PLURAL:$1|သွဟ်|သွဟ်ဂမၠိုင်}}", + "nextn-title": "ဆက်တုဲ $1 {{PLURAL:$1|သွဟ်|သွဟ်ဂမၠိုင်}}", + "shown-title": "ထ္ၜး $1 {{PLURAL:$1|သွဟ်|သွဟ်ဂမၠိုဟ်}} နကဵု မုက်လိက်", + "viewprevnext": "ဗဗဵု ($1 {{int:pipe-separator}} $2) ($3)", + "searchmenu-exists": "မုက်လိက် ယၟု\"[[:$1]]\" မွဲ ပ္ဍဲဝဳကဳ၊၊ {{PLURAL:$2|0=|ရံင် ပ္ဍဲသွဟ် မဂၠာဲဆဵု တၞဟ်တအ်ကီုညိ၊၊}}", + "searchmenu-new": "ခၞံကၠောန် မုက်လိက်ဏအ် \"[[:$1]]\" ပ္ဍဲဝဳကဳ! {{PLURAL:$2|0=|ကျောဝ် သီုကဵု မုက်လိက် မဂွံဆဵုကေတ် အတိုင်မၞးမဂၠာဲ| ကျောဝ် သီုကဵု သွဟ် မကလိဂွံ နူကဵု မဂၠာဲသ္ၚေဝ်}}", + "searchprofile-articles": "မုက်လိက် မာတိကာဂမၠိုင်", + "searchprofile-images": "မဳဒဳယာနာနာ", + "searchprofile-everything": "ဇၟာပ်ပ်အရာ", + "searchprofile-advanced": "ဆက်ဂၠာဲ", + "searchprofile-articles-tooltip": "ဂၠာဲ ပ္ဍဲ $1", + "searchprofile-images-tooltip": "ဂၠာဲ ဝှာင်", + "searchprofile-everything-tooltip": "ဂၠာဲ လိက် သီုဖအိုတ် (သီုကဵု နူ မုက်လိက်ဓရီုကျာ)", + "searchprofile-advanced-tooltip": "ဂၠာဲ ပ္ဍဲ ဒၞာဲယၟု", + "search-result-size": "$1 ({{PLURAL:$2|1 မလိက်|$2 မလိက်ဂမၠိုင်}})", + "search-result-category-size": "{{PLURAL:$1|1 ကောန်ဂကောံ|$1 ကောန်ဂကောံဂမၠိုင်}} ({{PLURAL:$2|1 ကဏ္ဍလစှ်ေ|$2 ကဏ္ဍလစှ်ေဂမၠိုင်}}, {{PLURAL:$3|1 ဝှာင်|$3 ဝှာင်ဂမၠိုင်}})", + "search-redirect": "(ကလေင်ထ္ၜး နူ $1)", + "search-section": "(သကုတ် $1)", + "search-file-match": "(ဝှာင် မကိတ်ညဳ ကုပရူပရာ)", + "search-suggest": "မၞး မိက်ဂွံဟီုဂှ် - $1", + "searchall": "သီုဖအိုတ်", + "search-showingresults": "{{PLURAL:$4|သွဟ် $1 ကု $3|သွဟ်ဂမၠိုင်$1 – $2 ကု $3}}", + "search-nonefound": "အရာမဂၠာဲသ္ၚေဝ်တအ်ဂှ် ဟွံဂွံဆဵုကေတ်", + "mypreferences": "မဒးဂၞပ်စိုတ်", + "group-bot": "ဗောတ်ဂမၠိုင်", + "group-sysop": "မၞိဟ်မကောပ်ကာဲဂမၠိုင်", + "grouppage-bot": "{{ns:project}}:ဗောတ်ဂမၠိုင်", + "grouppage-sysop": "{{ns:project}}:မၞိဟ်မကောပ်ကာဲဂမၠိုင်", + "right-writeapi": "အခေါင်အရာ ညးမချူ API", + "newuserlogpage": "စၟတ်သမ္တီ ညးလွပ် မခၞံကၠောန်လဝ်", + "rightslog": "တင်စၟတ်သမ္တီ အခေါင်အရာ ညးလွပ်", + "action-edit": "ပလေဝ်ဒါန် မုက်လိက် ဏအ်", + "action-createaccount": "ခၞံကၠောန် အကံက် ညးလွပ်ဏအ်", + "enhancedrc-history": "လၟေင်မပြံင်လှာဲလဝ်", + "recentchanges": "မပပြံင်လှာဲ လၟုဟ်", + "recentchanges-legend": "အရာမရုဲစှ် မပြံင်လှာဲ ပြဟ်ဟ်ဏအ်", + "recentchanges-summary": "ကလေင်သ္ၚေဝ်မဲ အရာမပြံင်လှာဲ ဂၠိုင်အိုတ် ပ္ဍဲ ဝဳကဳ ပ္ဍဲမုက်လိက်ဏအ်၊၊", + "recentchanges-noresult": "အပ္ဍဲ အပိုင်အခြာအခိင် မကဵုလဝ်ဂှ် ပရေင်ပြံင်လှာဲ မကိတ်ညဳ ကုကဆံင်မပိုင်ခြာလဝ် ဟွံမဲ၊၊", + "recentchanges-feed-description": "ကလေင်သ္ၚေဝ်မဲ အရာမပြံင်လှာဲ ဂၠိုင်အိုတ် ပ္ဍဲ ဝဳကဳ ပ္ဍဲ feed ဏအ်၊၊", + "recentchanges-label-newpage": "ပလေဝ်ဒါန်ဏအ် ခၞံဗဒှ်လဝ် မုက်လိက်တၟိ", + "recentchanges-label-minor": "ဣဏအ်ဂှ် ဒှ်အရာ မပလေဝ်ဒါန် ညိည", + "recentchanges-label-bot": "ပရေင်ပလေဝ်ပလေတ်ဏအ် ကၠောန်လဝ် နကဵု စက်ဗန်", + "recentchanges-label-unpatrolled": "အရာပလေဝ်ဒါန်ဏအ်ဂှ် ဟွံဂွံ စၟဳစၟတ်ဏီ", + "recentchanges-label-plusminus": "ဇမၞော် မုက်လိက်ဏအ် သၠာဲအာ နကဵု လၟိဟ်လျိုင်ဗာက်", + "recentchanges-legend-heading": "Legend:", + "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])", + "rcfilters-filter-user-experience-level-registered-description": "လော့အင် ဝင်ထားသော တည်းဖြတ်သူများ", + "rcfilters-filter-user-experience-level-unregistered-description": "လော့အင် မဝင်ထားသော တည်းဖြတ်သူများ", + "rcfilters-filter-minor-label": "အသေးစား တည်းဖြတ်မှုများ", + "rcfilters-filtergroup-changetype": "ပြောင်းလဲမှု အမျိုးအစား", + "rcfilters-filter-pageedits-label": "စာမျက်နှာ တည်းဖြတ်မှုများ", + "rcnotefrom": "ဗွဲသၟဝ်ဝွံ {{PLURAL:$5|ဒှ် အရာမပြံင်လှာဲ|ဒှ် အရာမပြံင်လှာဲဂမၠိုင်}} စနူ$3, $4 (စဵုကဵု $1 ဂှ် ထ္ၜးလဝ်ရ)၊၊", + "rclistfrom": "ထ္ၜး အရာမပြံင်လှာဲတၟိတၟိ စနူ $2, $3", + "rcshowhideminor": "$1 ပလေဝ်ဒါန်လဝ် ညိည", + "rcshowhideminor-show": "ထ္ၜး", + "rcshowhideminor-hide": "ဗဒန်", + "rcshowhidebots": "$1 bots", + "rcshowhidebots-show": "ထ္ၜး", + "rcshowhidebots-hide": "ဗဒန်", + "rcshowhideliu": "$1 ညးလွပ် မစၟတ်သမ္တီလဝ်တုဲဂမၠိုင်", + "rcshowhideliu-show": "ထ္ၜး", + "rcshowhideliu-hide": "ဗဒန်", + "rcshowhideanons": "$1 ညးလွပ် ဟွံဗမံက်ယၟု", + "rcshowhideanons-show": "ထ္ၜး", + "rcshowhideanons-hide": "ဗဒန်", + "rcshowhidepatr": "$1 သွက်ဂွံ ပလေဝ်ဒါန်မင်မဲ", + "rcshowhidemine": "$1 ပလေဝ်ဒါန်လဝ် နကဵုအဲ", + "rcshowhidemine-show": "ထ္ၜး", + "rcshowhidemine-hide": "ဗဒန်", + "rclinks": "ထ္ၜး အောန်အိုတ် $1 ပြံင်လှာဲလဝ် မတုဲကၠုင် $2 တ္ၚဲ", + "diff": "တၞဟ်ခြာ", + "hist": "တင်ဂၞင်မတုဲကၠုင်", + "hide": "ဗဒန်", + "show": "ထ္ၜး", + "minoreditletter": "m", + "newpageletter": "N", + "boteditletter": "b", + "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ကြဴနူ ပြံင်ထောအ်တုဲ", + "rc-old-title": "တမ်မူလဂှ် ခၞံကၠောန်လဝ် နကဵုယၟု \"$1\"", + "recentchangeslinked": "အရာမဆက်စပ် ကု အပြံင်အလှာဲ", + "recentchangeslinked-feed": "တြးပတိတ် အပြံင်အလှာဲ", + "recentchangeslinked-toolbox": "တြးပတိတ် အပြံင်အလှာဲ", + "recentchangeslinked-title": "အရာမပြံင်လှာဲဂှ် ဆက်စပ်ဒၟံင် ကု \"$1\"", + "recentchangeslinked-summary": "စုတ် ယၟု မိက်လိက်မွဲ သွက်ဂွံဆဵု အရာမပြံင်လှာဲ ပ္ဍဲ လေန်မုက်လိက် ဟွံသေင်မ္ဂး နူကဵု မုက်လိက်ဏအ်၊၊ (သွက်ဂွံ ဆဵု ကောန်ဂကောံဂမၠိုင် ပ္ဍဲကဏ္ဍမွဲ၊ စုတ် {{ns:category}}:ယၟု ကဏ္ဍ). သၠာဲ ပ္ဍဲမုက်လိက် ပ္ဍဲ [[Special:Watchlist|your Watchlist]] ဒှ် ပ္ဍဲ bold.", + "recentchangeslinked-page": "ယၟု မုက်လိက်-", + "recentchangeslinked-to": "ထ္ၜး အရာပြံင်လှာဲ ပ္ဍဲလေန်မုက်လိက် သွက်ဂွံကဵု မုက်လိက် မၞးဒၞာဲ", + "upload": "ပတိုန်ပၠောပ် ဝှာင်", + "uploadlogpage": "တင်စၟတ်သမ္တီ အရာမ Upload ပတိုန်လဝ်", + "filedesc": "သကေမ်", + "license": "မစၟတ်သမ္တီလာင်ဇြေန်-", + "license-header": "မသ္ဂုတ်သွာတ်လာင်ဇြေန်", + "imgfile": "ဝှာင်", + "listfiles": "စရင်ဝှာင်", + "file-anchor-link": "ဝှာင်", + "filehist": "ဝှာင် လၟေင်အပြံင်အလှာဲ", + "filehist-help": "ဍဵု လတူ စၟတ်တ္ၚဲ/အခိင် မွဲမွဲ သွက်ဂွံ ထ္ၜးကဵု ဝှာင် မကတဵုဒှ်လဝ် ပ္ဍဲအခိင်ဂှ်၊၊", + "filehist-revert": "ကလေင်ပြံင်", + "filehist-current": "လၟုဟ်", + "filehist-datetime": "စၟတ်တ္ၚဲ/အခိင်", + "filehist-thumb": "ဗီုပြင်နမူနာ", + "filehist-thumbtext": "ဍဵုသၞေမ်ၝောအ်တဲ သွက်မူလိက် နကဵု $1", + "filehist-nothumb": "ဗီုပြင်နမူနာ ဟွံမဲ", + "filehist-user": "ညးလွပ်", + "filehist-dimensions": "ပမာဏ", + "filehist-comment": "တင်ပသောင်ကလး", + "imagelinks": "ဝှာင် ဗီုဂွံစကာ", + "linkstoimage": "အရာမဆက်ဗက်ကၠုင် {{PLURAL:$1|page links|$1 pages link}} ကုဝှာင်ဏအ် ဂမၠိုင်ဂှ် -", + "linkstoimage-more": "ဂၠိုင် နူ $1 {{PLURAL:$1|မုက်လိက် မဆက်စပ်|မုက်လိက် အဆက်စပ်ဂမၠိုင်}} ကုဝှာင်ဏအ်၊၊\nစရင်သၟဝ်ဏအ် ထ္ၜး{{PLURAL:$1|မုက်လိက် အဆက်စပ် ပထမ|ကၠာအိုတ် $1 မုက်လိက် အဆက်စပ်ဂမၠိုင်}} ကု ဝှာင်ဏအ်ဟေင်၊၊\nA [[Special:WhatLinksHere/$2|စရင် သီုဖအိုတ်လေဝ်]] ကလိဂွံမာန်ရ၊၊", + "nolinkstoimage": "မုက်လိက် မရပ်စပ် ဝှာင်ဏအ် ဟွံမဲ၊၊", + "linkstoimage-redirect": "$1 (ဝှာင် ကလေင်ပညုင်) $2", + "sharedupload-desc-here": "ဝှာင်ဏအ် ဒှ်ဝှာင် နူကဵု $1 တုဲ မဒှ်ဝှာင် မသုင်စောဲလဝ် နကဵုပရဝ်ဂျေတ် တၞဟ်လေဝ် ဒှ်မာန်ရ၊၊\nအရာမလဴထ္ၜး ပ္ဍဲဝှာင်တအ်ဂှ် [$2 မုက်လိက် မလဴထ္ၜး ဝှာင်] ထ္ၜးကဵုလဝ် အတိုင်ဗွဲသၟဝ်ဝွံရ၊၊", + "filepage-nofile": "ဝှာင် နကဵု ယၟုဏအ် ဟွံမွဲ၊၊", + "upload-disallowed-here": "မၞး ထပ်ချူစုတ် ပ္ဍဲ ဝှာင်ဏအ် ဟွံဂွံ၊၊", + "randompage": "မုက်လိက် ဇဟောမ်", + "statistics": "စရင်အင်", + "double-redirect-fixer": "ညးမပလေဝ် အရာမကလေင်စၞောန်ပညုင်", + "nbytes": "$1 {{PLURAL:$1|byte|bytes}}", + "nmembers": "$1 {{PLURAL:$1|ကောန်ဂကောံ|ကောန်ဂကောံဂမၠိုင်}}", + "prefixindex": "မုက်လိက် သီုဖအိုတ် နကဵု prefix", + "listusers": "စရင် ညးလွပ်", + "newpages": "မုက်လိက် တၟိ", + "move": "ပြံင်ပဆုဲ", + "pager-newer-n": "{{PLURAL:$1|တၟိနူ 1|တၟိနူ $1}}", + "pager-older-n": "{{PLURAL:$1|တြေံနူ 1|တြေံနူ $1}}", + "booksources": "လိက်ကၞပ် မနိဿဲဂမၠိုင်", + "booksources-search-legend": "ဂၠာဲ သွက် တမ်ရိုဟ် လိက်ကၞပ်", + "booksources-search": "ဂၠာဲ", + "specialloguserlabel": "ညးမရေင်တၠုင် -", + "speciallogtitlelabel": "တင်မရန်တၟအ် (က္ဍိုပ်လိက် ဟွံသေင်မ္ဂး {{ns:user}}:ယၟုညးလွပ် သွက် ညးလွပ်):", + "log": "လံက်", + "all-logs-page": "တင်စၟတ်သမ္တီ မပတိတ်တြး သီုဖအိုတ်", + "alllogstext": "{{SITENAME}}ဏအ်ဂှ် ဒှ်တင်သမ္တီ မပံင်ပ္ကောံလဝ် ၜိုတ်မကလိဂွံမာန်ရ၊၊\nနကဵု မရုဲစှ် ဂကူစၟတ်သမ္တီ၊ ယၟုညးလွပ် ဟွံသေင်မ္ဂး မုက်လိက် မစိုပ်တရဴတအ်တုဲ မၞးဖ္ဍန်ဖျေဟ် အရာမထ္ၜးတအ်မာန်ရ၊၊", + "logempty": "အရာမကိတ်ညဳ ပ္ဍဲ တင်စၟတ်သမ္တီ ဟွံမဲ၊၊", + "allpages": "မုက်လိက် သီုဖအိုတ်", + "allarticles": "မုက်လိက် သီုဖအိုတ်", + "allpagessubmit": "အာ", + "allpages-hide-redirects": "ပၞုက် အရာမကလေင်ပညုင်ဂမၠိုင်ညိ", + "categories": "ကဏ္ဍဂမၠိုင်", + "listgrouprights-members": "(စရင် ကောန်ဂကောံ)", + "emailuser": "ပလံင် အဳမေလ် ကုညးလွပ်ဏအ်", + "usermessage-editor": "သၞောတ် ပရိုင်မေတ်သေန်ဂျာ", + "watchlist": "စရင်မမင်မဲ", + "mywatchlist": "စရင်မမင်မဲ", + "watchlistfor2": "သွက် $1 $2", + "watch": "မင်မဲ", + "unwatch": "ဟွံမင်မဲ", + "watchlist-details": "{{PLURAL:$1|$1 မုက်လိက်ဂှ် နွံ|$1 မုက်လိက်တအ်ဂှ် နွံ}} ပ္ဍဲ စရင်မမင်မဲ မၞး (သီုကဵု မုက်လိက် ဓရီုကျာဂမၠိုင်).", + "wlheader-showupdated": "မုက်လိက် မပြံင်လှာဲလဝ် ကြဴနူ မၞးမလုပ်ဝေင်လဝ်တုဲတအ်ဂှ် ထ္ၜးလဝ် နကဵု အက္ခရ်တီုတီု.", + "wlnote": "ဗွဲသၟဝ်ဝွံ {{PLURAL:$1|ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ရ၊၊| ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ဂမၠိုင်ရ၊၊ $1 အပြံင်အလှာဲ}} ပ္ဍဲအခိင် မအောန် နူ {{PLURAL:$2|နာဍဳ|$2 နာဍဳ}}, ကု $3, $4.", + "wlshowlast": "လက္ကရဴအိုတ် $1 နာဍဳ $2 တ္ၚဲ ဂှ် ထ္ၜးညိ", + "watchlist-options": "အရာမရုဲစှ် သွက် စရင်မမင်မဲ", + "enotif_reset": "ကဵုစၟတ် ကုမုက်လိက် မဗဵုစိုပ်လဝ်တုဲ သီုဖအိုတ်", + "dellogpage": "တင်စၟတ်သမ္တီ အရာမဇိုတ်ပလီုလဝ်", + "rollbacklink": "ကလေင်", + "rollbacklinkcount": "ကလေင်အာ $1 {{PLURAL:$1|ပလေဝ်ဒါန်|ပလေဝ်ဒါန်ဂမၠိုင်}}", + "protectlogpage": "တင်စၟတ်သမ္တီ အရာမစဵုဒၞာဂမၠိုင်", + "protectedarticle": "မစဵုဒၞာလဝ် \"[[$1]]\"", + "modifiedarticleprotection": "ပြံင်လှာဲ ကဆံင်မစဵုဒၞာ သွက် မုက်လိက် \"[[$1]]\"", + "protect-default": "ကဵုအခေါင် ညးလွပ် သီုဖအိုတ်", + "restriction-edit": "ပလေဝ်ဒါန်", + "restriction-move": "ပြံင်ပဆုဲ", + "namespace": "ဒၞာဲယၟု", + "invert": "ဂတးထောအ် အရာမရုဲစှ်လဝ်", + "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)", + "namespace_association": "မပံင်ဗစိုပ် ကုဒၞာဲယၟု", + "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace", + "blanknamespace": "(တမ်)", + "contributions": "{{GENDER:$1|User}} ပတိတ်တြး", + "contributions-title": "အရာမကၠောန်ဗဒှ် ညးလွပ် သွက် $1", + "mycontris": "အရာမကၠောန်လဝ်ဂမၠိုင်", + "anoncontribs": "အရာမကၠောန်လဝ်ဂမၠိုင်", + "contribsub2": "သွက် {{GENDER:$3|$1}} ($2)", + "nocontribs": "အရာမပလေဝ်ဒါန် မကိတ်ညဳ ကုတင်ဂၞင်တအ်ဂှ် ဟွံဂွံဆဵုကေတ်၊၊", + "uctop": "(လၟုဟ်)", + "month": "နူ ဂိတု (ကေုာံ ပြဟ်နူ)", + "year": "နူ သၞာံ (ကေုာံ ပြဟ်နူ):", + "sp-contributions-newbies": "ထ္ၜး အရာမကၠောန်ခၞံ နူကဵု အကံက်တၟိ ဟေင်", + "sp-contributions-blocklog": "စၟတ်သမ္တီ အရာမကၟာတ်ဗလံက်လဝ်", + "sp-contributions-uploads": "ပတိုန်ပၠောပ်", + "sp-contributions-logs": "တင်စၟတ်သမ္တီဂမၠိုင်", + "sp-contributions-talk": "ဓရီုကျာ", + "sp-contributions-search": "ဂၠာဲ သွက် အရာမရီုဗင်ကၠောန်ဂမၠိုင်", + "sp-contributions-username": "IP address ဟွံသေင်မ္ဂး ယၟုမသုင်စောဲ:", + "sp-contributions-toponly": "ထ္ၜး အရာမပလေဝ်ဒါန်လဝ် လက္ကရဴအိုတ်ဂှ် ဟေင်ညိ", + "sp-contributions-newonly": "ထ္ၜး မုက်လိက်မခၞံကၠောန်လဝ် ကၠာအိုတ်ဂှ် ဟေင်ညိ", + "sp-contributions-submit": "ဂၠာဲ", + "whatlinkshere": "မု အဆက်အစပ် ကုအရာဂှ်", + "whatlinkshere-title": "မုက်လိက် မဆက်လေန်လဝ် ကု \"$1\"", + "whatlinkshere-page": "မုက်လိက် -", + "linkshere": "မုက်လိက် ဗွဲသၟဝ်ဝွံ ဆက်စပ် ကဵု$2:", + "nolinkshere": "မုက်လိက် ဆက်စပ် ကု $2 ဟွံမဲ၊၊", + "isredirect": "မုက်လိက် မကလေင်ထ္ၜး", + "istemplate": "အရာမထပ်ဗပေင်ပၠောပ်လဝ်", + "isimage": "လေန် ဝှာင်", + "whatlinkshere-prev": "{{PLURAL:$1|ကလေင်|ကလေင် $1}}", + "whatlinkshere-next": "{{PLURAL:$1|ဂတ|ဂတ $1}}", + "whatlinkshere-links": "← လေန်", + "whatlinkshere-hideredirs": "$1 ကလေင်ထ္ၜး", + "whatlinkshere-hidetrans": "$1 အရာမထပ်ဗပေင်ပၠောပ်လဝ်", + "whatlinkshere-hidelinks": "$1 လေန်", + "whatlinkshere-hideimages": "$1 ဝှာင်အဆက်အစပ်", + "whatlinkshere-filters": "ဖဍိုဟ်", + "ipboptions": "၂ နာဍဳ:2 hours,၁ တ္ၚဲ:1 day,၃တ္ၚဲ:3 days,၁ သတ္တဟ:1 week,၂သတ္တဟ:2 weeks,၁ ဂိတု:1 month,၃ ဂိတု:3 months,၆ ဂိတု:6 months,၁ သၞာံ:1 year,ဟွံချိုတ်ပၠိုတ်:infinite", + "infiniteblock": "မဟွံမဲကုအပိုင်အခြာ", + "blocklink": "ကၟာတ်ဗလံက်", + "contribslink": "တြးပတိတ်", + "blocklogpage": "စၟတ်သမ္တီ အရာမကၟာတ်ဗလံက်လဝ်", + "blocklogentry": "ကၟာတ်ဗလံက်လဝ် [[$1]] နကဵု အပိုင်အခြာအခိင် $2 ဟိုတ်နူ $3", + "reblock-logentry": "ဒဒှ်မကၟာတ်လဒဵု ညးလွပ် [[$1]] ဂှ် ပြံင်လှာဲလဝ် နကဵု တ္ၚဲလက္ကရဴအိုတ် $2 $3", + "block-log-flags-nocreate": "ပွမခၞံကၠောန် အကံက်ဂှ် ဟွံသၟဟ်ရထ", + "proxyblocker": "ညးမကၟာတ်စဵု proxy", + "movelogpage": "ပြံင်ပဆုဲ တင်စၟတ်သမ္တီ", + "export": "ပတိတ်တြး မုက်လိက်တအ်", + "thumbnail-more": "ဇၞော်ပတိုန်", + "importlogpage": "တင်စၟတ်သမ္တီ မပၠောပ်စုတ်", + "tooltip-pt-userpage": "မုက်လိက် {{GENDER:|မၞးမသုင်စောဲ}}", + "tooltip-pt-mytalk": "{{GENDER:|မုက်လိက် မၞး}} မဓရီုကျာ", + "tooltip-pt-preferences": "{{GENDER:|မၞး}} မဒးဂၞပ်စိုတ်ဂမၠိုင်", + "tooltip-pt-watchlist": "စရင် မုက်လိက် မၞး မင်မဲဒၟံင် သွက်ဂွံပြံင်လှာဲ", + "tooltip-pt-mycontris": "စရင် {{GENDER:|မၞး}} မကၠောန်ပတိတ်လဝ်ဂမၠိုင်", + "tooltip-pt-login": "မၞးဂှ် ဒးဒုင်အာတ်မိက် ကဵုလုပ်လံက်အေန်၊ ဆဂး ဒးကၠောန်တွဵု ဟွံသေင်ရ၊၊", + "tooltip-pt-logout": "တိတ်", + "tooltip-pt-createaccount": "မၞးဂှ် ဒးဒုင်အာတ်မိက် ကဵုခၞံကၠောန်အကံက်မွဲ ဆဂး ဒးကၠောန်တွဵု ဟွံသေင်ရ၊၊", + "tooltip-ca-talk": "သဳကၠဳ ပရူ မုက်လိက်မာတိကာ", + "tooltip-ca-edit": "ပလေဝ်ဒါန် မုက်လိက် ဏအ်", + "tooltip-ca-addsection": "စ ဒကုတ် တၟိမွဲ", + "tooltip-ca-viewsource": "မုက်လိက်ဏအ် စဵုဒၞာလဝ်၊၊\nမၞး ဗဵု တမ်ရိုဟ်ဍေဟ် ဂွံ", + "tooltip-ca-history": "အရာမပလေဝ်ဒါန်ကၠုင် မုက်လိက်ဏအ်", + "tooltip-ca-protect": "စဵုဒၞာ မုက်လိက်ဏအ်", + "tooltip-ca-delete": "ပလီု မုက်လိက်ဏအ်", + "tooltip-ca-move": "ပြံင်ပဆုဲ မုက်လိက်ဏအ်", + "tooltip-ca-watch": "စုတ် မုက်လိက်ဏအ် ပ္ဍဲစရင်မမင်မဲမၞး", + "tooltip-ca-unwatch": "ပတိတ်ထောအ် မုက်လိက်ဏအ် ပ္ဍဲစရင်မမင်မဲမၞး", + "tooltip-search": "ဂၠာဲ {{SITENAME}}", + "tooltip-search-go": "အတိုင်ယၟုဏအ် ယဝ်ရ နွံမ္ဂး အာ ဇရေင် မုက်လိက်ဂှ်", + "tooltip-search-fulltext": "ဂၠာဲ ပ္ဍဲမုက်လိက် နကဵု လိက်ဏအ်", + "tooltip-p-logo": "အာ မုက်လိက် တမ်", + "tooltip-n-mainpage": "အာ မုက်လိက် တမ်", + "tooltip-n-mainpage-description": "အာ မုက်လိက် တမ်", + "tooltip-n-portal": "ပရူပရဝ်ဂျေက်၊ မု မၞး မပဂွံ၊ အလဵု မၞး ဂွံဂၠာဲ အရာတအ်", + "tooltip-n-currentevents": "ဂၠာဲ တင်ဂၞင်ပရိုင် စပ်ကဵု သဘင်ဏအ်", + "tooltip-n-recentchanges": "စရင် မပလေဝ်လဝ် ပြဟ်ဟ်ဏအ် ပ္ဍဲ ဝဳကဳ", + "tooltip-n-randompage": "ပံက် မုက်လိက် ဇယောမ်", + "tooltip-n-help": "ဒၞာဲ သွက်ဂွံ ဂၠာဲ", + "tooltip-t-whatlinkshere": "စရင် မုက်လိက် ဝဳကဳ မဆက်စပ် ကု ပရူဏအ် သီုဖအိုတ်", + "tooltip-t-recentchangeslinked": "မပြံင်လှာဲ လၟုဟ် ပ္ဍဲမုက်လိက်ဏအ်ဂှ် ဆက်စပ်ဒၟံင် ကုမုက်လိက်ဏအ်", + "tooltip-feed-atom": "ဒၞာဲဗလးပတိတ် မုက်လိက်ဏအ်", + "tooltip-t-contributions": "စရင် မကၠောန်လဝ် နကဵု {{GENDER:$1|ညးလွပ်ဏအ်}}", + "tooltip-t-emailuser": "ပလံင် အဳမေလ် ကု {{GENDER:$1|မဒှ် ညးလွပ်ဏအ်}}", + "tooltip-t-upload": "ပတိုန်ပၠောပ် ဝှာင်", + "tooltip-t-specialpages": "စရင် မုက်လိက် တၟေင် သီုဖအိုတ်", + "tooltip-t-print": "မူမုက်လိက် မပြေန်ပ္တိတ်ဂွံ", + "tooltip-t-permalink": "ဌာန်ဒၟံင်လေန် လၟိုန် မုက်လိက် မကလေင်ပလေဝ်ဏအ်", + "tooltip-ca-nstab-main": "ဗဵု မုက်လိက် မာတိကာ", + "tooltip-ca-nstab-user": "ဗဵု မုက်လိက် ညးလွပ်", + "tooltip-ca-nstab-special": "မုက်လိက်ဏအ်ဂှ် ဒှ်မုက် တၟေင်၊ ဟိုတ်ဂှ်ရ ပလေဝ် ဟွံဂွံ", + "tooltip-ca-nstab-project": "ဗဵု မုက်လိက် ပရဝ်ဂျေတ်", + "tooltip-ca-nstab-image": "ဗဵု မုက်လိက် ဝှာင်", + "tooltip-ca-nstab-mediawiki": "ကျောဝ်ဗဵု သၞောတ် ပရိုင်မေတ်သုက်", + "tooltip-ca-nstab-template": "ကျောဝ်ဗဵု template", + "tooltip-ca-nstab-category": "ဗဵု မုက်လိက်ကဏ္ဍ", + "tooltip-minoredit": "ကဵုစၟတ် အရာဏအ် ဒဒှ်ရ မဒှ် အရာမပလေဝ်ဒါန် ညိည", + "tooltip-save": "ဂိုင်သိပ် အရာမၞး မပြံင်လှာဲလဝ်", + "tooltip-preview": "ဗဵုနမူနာ အရာမၞး မပြံင်လှာဲလဝ်၊၊ ပဂုန်တုဲ ကၠာဟွံဂွံဂိုင်သိပ်ဂှ် ကၠောန်ကၠာညိ၊၊", + "tooltip-diff": "ထ္ၜး ဒၞာဲ မလိက် မၞးမပြံင်လှာဲလဝ်ဂှ်ညိ", + "tooltip-compareselectedversions": "ရံင် ဗီုတၞဟ်ခြာ အကြာ မူမပလေဝ်ဒါန်လဝ် ပ္ဍဲမုက်လိက်ဏအ် ဒၞာဲမရုဲစှ်လဝ် ၜါဂှ်", + "tooltip-watch": "စုတ် မုက်လိက်ဏအ် ပ္ဍဲစရင်မမင်မဲ မၞး", + "tooltip-rollback": "\"Rollback\" reverts the last contributor's edit(s) to this page in one click", + "tooltip-undo": "\"ဟွံကၠောန်\" ဂှ် ဒှ်အရာ မဟွံကၠောန်တုဲ ကလေင်အာ ဗီုအတိုင်တြေံ ကၠာဟွံဂွံစ ပလေဝ်လဝ်ဂှ်ရ၊၊ မုဟိုတ် ကလေင်အာ အတိုင်ဗီုတြေံပၠန်ဂှ် ချူစၟတ်သမ္တီ သကေံ မာန်ရ၊၊", + "tooltip-summary": "စုတ် သကေမ် summary ဇမၠေအ်", + "simpleantispam-label": "စၟဳစၟတ် အရာမပလီုပလာ်\nလ္ပ စုတ် ပ္ဍဲဏအ်ညိ!", + "pageinfo-title": "ပရိုင်တင်ဂၞင် သွက် \"$1\"", + "pageinfo-header-basic": "ပရိုင်တင်ဂၞင် သဇိုင်", + "pageinfo-header-edits": "လၟေင်စၟတ်သမ္တီ မပလေဝ်ဒါန်လဝ်", + "pageinfo-header-restrictions": "ပရေင်စဵုဒၞာ မုက်လိက်", + "pageinfo-header-properties": "ဒြပ်ရတ် မုက်လိက်", + "pageinfo-display-title": "က္ဍိုပ်ပရိုင် မထ္ၜးပျး", + "pageinfo-default-sort": "ရုဲစှ် ဂကူအဓိကတင်ဂၞင်", + "pageinfo-length": "ဇမၠိင် မုက်လိက် (နကဵု ဘာက်)", + "pageinfo-article-id": "မုက်လိက် ID", + "pageinfo-language": "မုက်လိက် အရေဝ်ဘာသာ ဖျုန်လိက်", + "pageinfo-content-model": "မုက်လိက် မဝ်ဒေလ် မာတိက", + "pageinfo-robot-policy": "ကၠောန်မာတိကာ index နကဵု စက်ရဝ်ဗတ်", + "pageinfo-robot-index": "မသၠးကဵုလဝ်အခေါင်", + "pageinfo-robot-noindex": "ဟွံကဵုလဝ်အခေါင်", + "pageinfo-watchers": "လၟိဟ် ပၟင်ပၟဲ မုက်လိက်", + "pageinfo-few-watchers": "အောန်နူ $1 {{PLURAL:$1|ပၟင်ပၟဲ|ပၟင်ပၟဲဂမၠိုင်}}", + "pageinfo-redirects-name": "လၟိဟ် မကလေင်ပညုင် ကုမုက်လိက်ဏအ်", + "pageinfo-subpages-name": "လၟိဟ် မုက်လိက်လစှ်ေ ဒဒက်တဴ ကုမုက်လိက်ဏအ်", + "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|အရာမကလေင်ပညုင်|အရာမကလေင်ပညုင်ဂမၠိုင်}}; $3 {{PLURAL:$3|ဟွံမဲ-အရာမကလေင်ပညုင်|ဟွံမဲ-အရာမကလေင်ပညုင်ဂမၠိုင်}})", + "pageinfo-firstuser": "ညးမခၞံဗဒှ် မုက်လိက်", + "pageinfo-firsttime": "စၟတ်တ္ၚဲ မခၞံဗဒှ်လဝ် မုက်လိက်", + "pageinfo-lastuser": "မပလေဝ်ဒါန်လဝ် လက္ကရဴအိုတ်", + "pageinfo-lasttime": "စၟတ်တ္ၚဲ မပလေဝ်ဒါန်လဝ် လက္ကရဴအိုတ်", + "pageinfo-edits": "လၟိဟ် မပလေဝ်ဒါန်လဝ် သီုဖအိုတ်", + "pageinfo-authors": "လၟိဟ် အစာချူလိက် သီုဖအိုတ်", + "pageinfo-recent-edits": "လၟိဟ် အရာမပလေဝ်ဒါန်လဝ် ပြဟ်ဟ်ဏအ် (အပ္ဍဲ $1)", + "pageinfo-recent-authors": "လၟိဟ် အစာချူလိက် ပြဟ်ဟ်ဏအ်", + "pageinfo-magic-words": "မှဝ် {{PLURAL:$1|မလိက်|မလိက်ဂမၠိုင်}} ($1)", + "pageinfo-hidden-categories": "ပၞုက် {{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍဂမၠိုင်}} ($1)", + "pageinfo-templates": "မကၠောန် Transcluded လဝ် {{PLURAL:$1|template|templates}} ($1)", + "pageinfo-toolboxlink": "မုက်လိက် ပရိုင်တင်ဂၞင်", + "pageinfo-contentpage": "ရိုဟ်လၟိဟ် နဒဒှ် မုက်လိက် မာတိကာ", + "pageinfo-contentpage-yes": "ယွံ", + "patrol-log-page": "တင်စၟတ်သမ္တီ အရာမစဳစောတ်ကောပ်ကာဲ", + "previousdiff": "← အရာမပလေဝ်ဒါန်လဝ် တြေံ", + "nextdiff": "မပလေဝ်ဒါန်လဝ် တၟိနူဂှ် →", + "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}", + "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4", + "file-info-size-pages": "$1 × $2 pixels, ဇမၞော် ဝှာင်: $3, MIME ဂကူ: $4, $5 {{PLURAL:$5|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}", + "file-nohires": "resolution ခိုဟ် နူဏအ် ဟွံဂွံဆဵုရ၊၊", + "svg-long-desc": "SVG ဝှာင်, မိက်ကဵုကသပ် $1 × $2 pixels, ဇမၞော် ဝှာင်: $3", + "show-big-image": "ဝှာင် တမ်မူလ", + "show-big-image-preview": "ဇမၞော် နမူနာ ဏအ် - $1", + "show-big-image-other": "တၞဟ် {{PLURAL:$2|resolution|resolutions}}: $1.", + "show-big-image-size": "$1 × $2 pixels", + "metadata": "Metadata", + "metadata-help": "ပ္ဍဲဝှာင်ဏအ်ဂှ် နွံဒၟံင် နကဵုအရာမဗပေင်စုတ်လဝ်ရ၊၊ မဒှ်အရာ မဗပေင်စုတ်လဝ် နူကဵု ကမ္မရာ ဒဳဂျဳတေဝ် ဟွံသေင်မ္ဂး နူသကေန်နာ မွဲမွဲ ဒှ်မာန်ရ၊၊\nယဝ်ရ ဝှာင်ဂှ် ဒးဒုင်ပလေဝ်ပလေတ် နူတမ်မူလဍေဟ်မ္ဂး၊ အရာလ္ၚဵုတအ်ဂှ် ဟွံမံက် ပ္ဍဲဝှာင်ဂှ် ဒှ်မာန်ရ၊၊", + "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude", + "exif-orientation": "ဒဒှ်မဖျေဟ်ဗီုပြင်မုက်", + "exif-xresolution": "သွဟ် ဂၠံင်လၞင်", + "exif-yresolution": "သွဟ် ဂၠံင်စှ်ေ", + "exif-datetime": "ဝှာင် ပြံင်လှာဲ စၟတ်တ္ၚဲ ကေုာံ အခိင်", + "exif-make": "ညးမကၠောန်ပတိတ် ကမ္မရာ", + "exif-model": "မဝ်ဒေလ် ကမ္မရာ", + "exif-software": "သပ်ဝဴ မစကာလဝ်", + "exif-exifversion": "Exif version", + "exif-colorspace": "ဒၞာဲ အသာ်", + "exif-datetimeoriginal": "စၟတ်တ္ၚဲ ကေုာံ အခိင် မခၞံဗဒှ် ဒါတာ", + "exif-datetimedigitized": "စၟတ်တ္ၚဲ ကေုာံ အခိင် မပြံင်လှာဲ နကဵုဒဳဂျဳတေဝ်", + "exif-orientation-1": "ဓမ္မတာ", + "namespacesall": "သီုဖအိုတ်", + "monthsall": "သီုဖအိုတ်", + "imgmultipagenext": "မုက်လိက်ဂတ →", + "imgmultigo": "အာ!", + "imgmultigoto": "အာ ဇရေင် မုက်လိက် $1", + "watchlisttools-clear": "ဖအး စရင်မမင်မွဲဂှ်", + "watchlisttools-view": "ဗဵု အရာမပြံင်လှာဲထေက်တအ်", + "watchlisttools-edit": "ဗဵု ကေုာံ ပလေဝ် စရင်မမင်မဲ", + "watchlisttools-raw": "ပလေဝ် စရင်မမင်မဲ အပြောမ်", + "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ဓရီု]])", + "redirect": "ကလေင်စၞောန်ပညုင်လဝ် နကဵု ဝှာင်၊ ညးလွပ်၊ မုက်လိက်၊ မူမပလေဝ်ဒန်လဝ် ဟွံသေင်မ္ဂး အာင်ဒဳ", + "redirect-summary": "မုက်လိက်တၟေင်ဏအ် ကလေင်စၞောန် ကဵု ဝှာင်(မကဵုလဝ်ယၟု), မုက်လိက်မွဲ (given a revision ID or page ID), မုက်လိက် ညးမသုင်စောဲမွဲ (given a numeric user ID), ဟွံသေင်မ္ဂး တင်စၟတ်သမ္တီမွဲ (given the log ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].", + "redirect-submit": "အာ", + "redirect-lookup": "ဂၠာဲသ္ၚေဝ်", + "redirect-value": "ၚုဟ်မး -", + "redirect-user": "အာင်ဒဳ ညးလွပ်", + "redirect-page": "မုက်လိက် အာင်ဒဳ", + "redirect-revision": "မုက်လိက် မူမပလေဝ်ဒါန်", + "redirect-file": "ယၟုဝှာင်", + "specialpages": "မုက်လိက် တၟေင်", + "tag-filter": "[[Special:Tags|Tag]] ဝှာင်ဂမၠိုင်:", + "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)", + "tags-active-yes": "ယွံ", + "tags-active-no": "ဟအှ်ေ", + "tags-hitcount": "$1 {{PLURAL:$1|ပြံင်လှာဲ|ပြံင်လှာဲဂမၠိုင်}}", + "logentry-delete-delete": "$3 မုက်လိက်ဂှ် $1 {{GENDER:$2|ပလီုထောအ်လဝ်ရ}}", + "logentry-delete-restore": "$1 {{GENDER:$2|ကလေင်ပ္တန်}} မုက်လိက် $3 ($4)", + "logentry-delete-revision": "ပ္ဍဲမုက်လိက် $3: $4 ဂှ် $1 {{GENDER:$2|ပြံင်လှာဲလဝ်}} ဗီုပြင် မုက်လိက် {{PLURAL:$5|မူလိက်မဒါန်လဝ် မွဲ|$5 မူလိက်မဒါန်လဝ်ဂမၠိုင်}}", + "revdelete-content-hid": "ဒဒှ် မပၞုက် ပရူပရာ", + "logentry-move-move": "$1 {{GENDER:$2|ပြံင်ပဆုဲလဝ်}} မုက်လိက် $3 ဇရေင် $4", + "logentry-move-move-noredirect": "$1 {{GENDER:$2|ပြံင်ပဆုဲလဝ်}} မုက်လိက် $3 ဇရေင် $4 သီုကဵု ဟွံဂွံ ဂိုင်စွံလဝ် မကလေင်ပညုင်", + "logentry-move-move_redir": "$1 {{GENDER:$2|ပြံင်ပဆုဲလဝ်}} မုက်လိက် $3 ဇရေင် $4 နကဵု မကလေင်ပညုင်", + "logentry-patrol-patrol-auto": "ပရေင်ပလေဝ်ဒါန် $3 ပ္ဍဲ $4 ဂှ် $1 ညးမင်သ္ၚေဝ်မဲဒၟံင် {{GENDER:$2|မကဵုစၟတ်}}အလဵုလဵုရ၊၊", + "logentry-newusers-create": "အကံက် ညးလွပ် $1 ဂှ် {{GENDER:$2|ခၞံကၠောန်လဝ်}}", + "logentry-newusers-autocreate": "အကံက် ညးလွပ် $1 ဂှ် {{GENDER:$2|ခၞံကၠောန်လဝ်}} အလဵုအလဵုရ၊၊", + "logentry-upload-upload": "$1 {{GENDER:$2|ပတိုန်ပၠောပ်လဝ်}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|ပလံင်ပၠောပ်လဝ်}} မူလိက် $3ဏအ် တၟိမွဲ", + "searchsuggest-search": "ဂၠာဲ {{SITENAME}}", + "duration-days": "$1 {{PLURAL:$1|တ္ၚဲ|တ္ၚဲဂမၠိုင်}}", + "randomrootpage": "တမ် မုက်လိက် ဇဟောမ်" +} diff --git a/languages/i18n/mr.json b/languages/i18n/mr.json index 57e3609ba3..7b5d04bfeb 100644 --- a/languages/i18n/mr.json +++ b/languages/i18n/mr.json @@ -1115,6 +1115,7 @@ "group-autoconfirmed": "स्वयंशाबीत सदस्य", "group-bot": "सांगकामे", "group-sysop": "प्रचालक", + "group-interface-admin": "तांत्रिक प्रचालक", "group-bureaucrat": "स्विकृती अधिकारी", "group-suppress": "झापडबंद", "group-all": "(सर्व)", @@ -1213,7 +1214,7 @@ "grant-createaccount": "खाते तयार करा", "grant-createeditmovepage": "पाने बनवा,संपादा व स्थानांतरण करा", "grant-delete": "पाने, आवृत्त्या व नोंदी वगळा", - "grant-editinterface": "मिडियाविकि नामविश्व व सदस्यांची CSS/JS संपादा", + "grant-editinterface": "मिडियाविकि नामविश्व व संकेतस्थळावरची/सदस्यांचीJS संपादा", "grant-editmycssjs": "आपली सदस्य CSS/JavaScript संपादित करा", "grant-editmyoptions": "आपला सदस्य पसंतीक्रम संपादा", "grant-editmywatchlist": "आपली निरीक्षणयादी संपादित करा", @@ -1844,6 +1845,7 @@ "protectedtitles-submit": "शीर्षके दर्शवा", "listusers": "सदस्यांची यादी", "listusers-editsonly": "फक्त संपादनांसहित सदस्य दाखवा", + "listusers-temporarygroupsonly": "फक्त तात्पुरत्या सदस्यगटात असणारे सदस्यच दाखवा", "listusers-creationsort": "निर्मितीच्या तारखेप्रमाणे लावा", "listusers-desc": "उतरत्या क्रमाने निवडा", "usereditcount": "$1 {{PLURAL:$1|संपादन|संपादने}}", diff --git a/languages/i18n/my.json b/languages/i18n/my.json index cf3cc7f5fc..f1a5324bef 100644 --- a/languages/i18n/my.json +++ b/languages/i18n/my.json @@ -24,10 +24,11 @@ "Penguinlay", "Nemo bis", "Stephanecbisson", - "Fitoschido" + "Fitoschido", + "Dr Lotus Black" ] }, - "tog-underline": "လင့်ကို မျဉ်းသားသည့် ပုံစံ -", + "tog-underline": "လင့်ကို မျဉ်းသားသည့် ပုံစံ:", "tog-hideminor": "အရေးမကြီးသော တည်းဖြတ်မှုများကို လတ်တလော အပြောင်းအလဲများမှ ဝှက်ရန်", "tog-hidepatrolled": "လတ်တလော အပြောင်းအလဲများတွင် ကင်းလှည့်တည်းဖြတ်မှုများကို ဝှက်ရန်", "tog-newpageshidepatrolled": "စာမျက်နှာသစ်စာရင်းတွင် ကင်းလှည့်စာမျက်နှာများကို ဝှက်ရန်", @@ -142,7 +143,7 @@ "period-pm": "ညနေ", "pagecategories": "{{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍများ}}", "category_header": "ကဏ္ဍ \"$1\" မှ စာမျက်နှာများ", - "subcategories": "ကဏ္ဍခွဲ", + "subcategories": "ကဏ္ဍခွဲများ", "category-media-header": "ကဏ္ဍ \"$1\" မှ မီဒီယာ", "category-empty": "ဤကဏ္ဍသည် လက်ရှိတွင် စာမျက်နှာများ သို့မဟုတ် မီဒီယာများ မရှိပါ။", "hidden-categories": "{{PLURAL:$1|ဝှက်ထားသော ကဏ္ဍ|ဝှက်ထားသော ကဏ္ဍများ}}", @@ -158,8 +159,8 @@ "noindex-category": "အက္ခရာမစဉ်ထားသော စာမျက်နှာများ", "broken-file-category": "ကျိုးပျက်နေသော ဖိုင်လင့်များပါသည့် စာမျက်နှာများ", "about": "အကြောင်း", - "article": "စာမျက်နှာ", - "newwindow": "(ဝင်းဒိုးအသစ်တခုကိုဖွင့်ရန်)", + "article": "မာတိကာစာမျက်နှာ", + "newwindow": "(ဝင်းဒိုးအသစ်တစ်ခုတွင် ဖွင့်ရန်)", "cancel": "မ​လုပ်​တော့​", "moredotdotdot": "နောက်ထပ်...", "morenotlisted": "ဤစာရင်းမှာ မပြည့်စုံနိုင်ပါ။", @@ -185,7 +186,7 @@ "history_short": "ရာဇဝင်", "history_small": "ရာဇဝင်", "updatedmarker": "နောက်ဆုံးကြည့်ပြီးသည့်နောက်ပိုင်း တည်းဖြတ်ထားသည်။", - "printableversion": "ပရင့်ထုတ်ရန်", + "printableversion": "ပရင့်ထုတ်နိုင်သော ဗားရှင်း", "permalink": "ပုံ​သေ​လိပ်​စာ​", "print": "ပရင့်", "view": "ကြည့်ရန်", @@ -216,7 +217,7 @@ "viewhelppage": "အကူအညီစာမျက်နှာကို ကြည့်ရန်", "categorypage": "ကဏ္ဍစာမျက်နှာကို ကြည့်ရန်", "viewtalkpage": "ဆွေးနွေးမှုကို ကြည့်ရန်", - "otherlanguages": "အခြား ဘာသာဖြင့်", + "otherlanguages": "အခြား ဘာသာစကားများဖြင့်", "redirectedfrom": "($1 မှ ပြန်ညွှန်းထားသည်)", "redirectpagesub": "ပြန်ညွှန်းသော စာမျက်နှာ", "redirectto": "ပြန်ညွှန်းရန် -", @@ -330,12 +331,15 @@ "viewsourcetext": "ဤစာမျက်နှာ၏ ရင်းမြစ်ကို ကြည့်ရှု၍ ကူးယူနိုင်သည်။", "viewyourtext": "ဤစာမျက်နှာရှိ သင့်တည်းဖြတ်မှုများ၏ ရင်းမြစ်ကို ကြည့်ရှုပြီး ကူးယူနိုင်သည်။", "editinginterface": "သတိပေးချက်။ သင်သည် ဆော့ဖ်ဝဲလ်၏ အသွင်အပြင်စာသားများကို အထောက်အကူပြုရာတွင် သုံးသော စာမျက်နှာအား တည်းဖြတ်နေသည်။\nဤစာမျက်နှာတွင် ပြောင်းလဲမှုများသည် ဤဝီကီရှိ အခြားအသုံးပြုသူများ၏ အသုံးပြုသူ အသွင်အပြင်များအပေါ် အကျိုးသက်ရောက်ပါလိမ့်မည်။", + "translateinterface": "ဝီကီများအားလုံးအတွက် ဘာသာပြန်များကို ပေါင်းထည့်၊ ပြင်ဆင်ရန်အတွက် မီဒီယာဝီကီ၏ ဒေသတွင်းပြုမှု ပရောဂျက် [https://translatewiki.net/ translatewiki.net] ကို အသုံးပြုပါ။", "namespaceprotected": "'''$1''' စာညွှန်းဖြင့် စာမျက်နှာကို တည်းဖြတ်ရန် ခွင့်ပြုချက် မရှိပါ။", "mycustomcssprotected": "ဤ CSS စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။", "mycustomjsprotected": "ဤ JavaScript စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။", "myprivateinfoprotected": "သင်သည် သင်၏ ပုဂ္ဂိုလ်ရေးရာ အချက်အလက်များကို ပြင်ဆင်ခွင့် မရှိပါ။", "mypreferencesprotected": "သင်သည် သင်၏ ရွေးချယ်စရာများကို ပြင်ဆင်ခွင့်မရှိပါ။", "ns-specialprotected": "အထူးစာမျက်နှာများကို တည်းဖြတ်မရနိုင်ပါ။", + "titleprotected": "ဤခေါင်းစဉ်ကို ဖန်တီးခြင်းမှ [[User:$1|$1]]က ကာကွယ်ထားသည်။ ပေးထားသော အကြောင်းပြချက်မှာ $2 ဖြစ်သည်။", + "invalidtitle": "မဆီလျော်သော ခေါင်းစဉ်", "exception-nologin": "အကောင့် မဝင်ထားပါ", "exception-nologin-text": "ဤစာမျက်နှာကို ကြည့်ရှုနိုင်ရန် သို့မဟုတ် အခြားလုပ်ဆောင်ချက်များ ခွင့်ပြုချက်ရရှိရန် ကျေးဇူးပြု၍ အကောင့်ဝင်ပါ။", "exception-nologin-text-manual": "ဤစာမျက်နှာကို ဝင်ရောက်နိုင်ရန် သို့မဟုတ် အခြားလုပ်ဆောင်ချက်များ ရရှိနိုင်ရန် ကျေးဇူးပြု၍ $1 ပါ။", @@ -345,7 +349,7 @@ "cannotlogoutnow-text": "$1 ကိုအသုံးပြုနေစဉ်အတွင်း အကောင့်ထွက်ရန် မဖြစ်နိုင်ပါ။", "welcomeuser": "ကြိုဆိုပါတယ် $1!", "welcomecreation-msg": "သင့်အကောင့်အား ဖန်တီးပြီးပါပြီ။\nသင် ဆန္ဒရှိပါက {{SITENAME}} [[Special:Preferences|ပုဂ္ဂိုလ်ရေးအချက်အလက်များ]]ကို ပြောင်းလဲနိုင်ပါသည်။", - "yourname": "အသုံးပြုသူအမည် -", + "yourname": "အသုံးပြုသူအမည်:", "userlogin-yourname": "အသုံးပြုသူအမည်", "userlogin-yourname-ph": "သင်၏ အသုံးပြုသူအမည် ရိုက်ထည့်ပါ", "createacct-another-username-ph": "အသုံးပြုသူအမည် ရိုက်ထည့်ပါ", @@ -359,10 +363,15 @@ "userlogin-remembermypassword": "Log in ဝင်ထားမည်", "userlogin-signwithsecure": "လုံခြုံသော ဆက်သွယ်မှုကို သုံးမည်", "cannotlogin-title": "လော့ဂ်အင် မဝင်ရောက်နိုင်ပါ", + "cannotlogin-text": "အကောင့်ထဲ ဝင်ရောက်ခြင်းမှာ မဖြစ်နိုင်ပါ", + "cannotloginnow-title": "ယခု လော့ဂ်အင်ဝင်၍ မရနိုင်ပါ", + "cannotloginnow-text": "$1 ကို အသုံးပြုနေစဉ် အကောင့်ထဲ ဝင်ရောက်ခြင်းမှာ မဖြစ်နိုင်ပါ", "cannotcreateaccount-title": "အကောင့်များ ဖန်တီးမရနိုင်ပါ", + "cannotcreateaccount-text": "တိုက်ရိုက် အကောင့်ဖန်တီးခြင်းအား ဤဝီကီပေါ်၌ ဖွင့်မထားပါ။", "yourdomainname": "သင့်ဒိုမိန်း -", "password-change-forbidden": "ဤဝီကီတွင် စကားဝှက်များကို ပြောင်းလဲ၍ မရပါ။", "login": "Log in ဝင်ရန်", + "login-security": "သင်၏ အထောက်အထားကို အတည်ပြုပါ", "nav-login-createaccount": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်", "logout": "ထွက်ရန်", "userlogout": "ထွက်ရန်", @@ -373,6 +382,7 @@ "userlogin-resetpassword-link": "စကားဝှက် မေ့နေသလား။", "userlogin-helplink2": "log in အကူအညီ", "userlogin-loggedin": "သင်သည် {{GENDER:$1|$1}} အနေဖြင့် လော့အင်ဝင်ထားပြီး ဖြစ်သည်။ အခြားအသုံးပြုသူ အနေဖြင့် ဝင်ရောက်ရန် အောက်ပါပုံစံကို အသုံးပြုပါ။", + "userlogin-reauth": "သင်သည် {{GENDER:$1|}} ဖြစ်ကြောင်း အတည်ပြုရန်အတွက် အကောင့်ထဲ ထပ်မံဝင်ရောက်ရပါမည်။", "userlogin-createanother": "အခြားအကောင့် ဖန်တီးရန်", "createacct-emailrequired": "အီးမေး လိပ်စာ", "createacct-emailoptional": "အီးမေး လိပ်စာ (ဖြည့်လိုက)", @@ -382,6 +392,7 @@ "createacct-realname": "နာမည်ရင်း (ဖြည့်လိုက)", "createacct-reason": "အကြောင်းပြချက်", "createacct-reason-ph": "သင်ဘာကြောင့် အခြားအကောင့် ဖန်တီးချင်တာလဲ", + "createacct-reason-help": "အကောင့်ဖန်တီးခြင်း မှတ်တမ်းရှိ ပြသထားသော မက်ဆေ့", "createacct-submit": "သင့်အကောင့်ကို ဖန်တီးရန်", "createacct-another-submit": "အကောင့် ဖန်တီးရန်", "createacct-continue-submit": "အကောင့်ဖန်တီးမှု ဆက်သွားမည်", @@ -399,12 +410,15 @@ "noname": "တရားဝင် အသုံးပြုသူအမည်ကို မသတ်မှတ်ရသေးပါ။", "loginsuccesstitle": "လော့ဂ်အင်ဝင်ပြီးပြီ", "loginsuccess": "'''သင်သည် {{SITENAME}} သို့ \"$1\" အဖြစ် Login ဝင်ပြီးဖြစ်သည်။'''", + "nosuchuser": "\"$1\" နာမည်ဖြင့် အသုံးပြုသူ မရှိပါ။ အသုံးပြုသူအမည်သည် စာလုံးအကြီးအသေးကို အမှားမခံပါ။ သင်၏စာလုံးပေါင်းကို စစ်ဆေးပါ သို့မဟုတ် [[Special:CreateAccount|အကောင့်သစ်တစ်ခု ဖန်တီးပါ]]။", "nosuchusershort": "\"$1\" အမည်ဖြင့် အသုံးပြုသူမရှိပါ။\nစာလုံးပေါင်း ပြန်စစ်ပေးပါရန်။", "nouserspecified": "အသုံးပြုသူအမည်ကို ဖော်ပြရမည်ဖြစ်သည်။", "login-userblocked": "ဤအသုံးပြုသူကို ပိတ်ပင်ထားသည်။ Login ဝင်ခြင်း ခွင့်မပြုပါ။", "wrongpassword": "အသုံးပြုသူအမည် သို့မဟုတ် စကားဝှက် မှားယွင်းထည့်ထားသည်။\nကျေးဇူးပြု၍ ပြန်ကြိုးစားကြည့်ပါ။", "wrongpasswordempty": "စကားဝှက်ထည့်ရမည်နေရာ ဗလာဖြစ်နေသည်။\nကျေးဇူးပြု၍ ပြန်ကြိုးစားကြည့်ပါ။", "passwordtooshort": "စကားဝှက်တွင် စကားလုံး အနည်းဆုံး {{PLURAL:$1|တစ်လုံး|$1 လုံး}} ရှိရမည်။", + "passwordtoolong": "စကားဝှက်တွင် စကားလုံး {{PLURAL:$1|တစ်လုံး|$1 လုံး}} ထက်မပိုရပါ။", + "passwordtoopopular": "ယေဘုယျရွေးချယ်ထားသော စကားဝှက်များကို အသုံးမပြုနိုင်ပါ။ ခန့်မှန်းရန်ခက်ခဲသော စကားဝှက်တစ်ခုကို ရွေးချယ်ပါ။", "password-name-match": "သင့်စကားဝှက်သည် အသုံးပြုသူအမည်နှင့် အတူတူမဖြစ်စေရဘဲ ကွဲပြားရမည်။", "password-login-forbidden": "ဤအသုံးပြုသူအမည်နှင့် စကားဝှက်အား အသုံးပြုခြင်းကို တားမြစ်ထားသည်။", "mailmypassword": "စကားဝှက်ကို ပြန်ချိန်ရန်", @@ -412,20 +426,27 @@ "passwordremindertext": "တစ်စုံတစ်ယောက် ($1 အိုင်ပီလိပ်စာမှ) သည် {{SITENAME}} ($4) အတွက် စကားဝှက်အသစ်ကို တောင်းဆိုခဲ့သည်။ \nအသုံးပြုသူ \"$2\" အတွက် ယာယီစကားဝှက်အသစ်ကို ဖန်တီးပြီး \"$3\" အဖြစ် သတ်မှတ်လိုက်သည်။ \nဤအရာကို သင်ရည်ရွယ်သည်ဆိုပါက လော့ဂ်အင်ဝင်ရန်ပြီး စကားဝှက်အသစ် ရွေးချယ်ရန် လိုအပ်ပါသည်။ \nသင်၏ ယာယီစကားဝှက်သည် {{PLURAL:$5|တစ်ရက်|$5 ရက်}}အတွင်း သက်တမ်းကုန်ပါလိမ့်မည်။\n\nအကယ်၍ တစ်စုံတစ်ယောက်က ဤတောင်းဆိုမှုကို ပြုလုပ်ခဲ့ပါက၊ သို့မဟုတ် သင်သည် သင့်စကားဝှက်အား မှတ်မိပြီး \nပြောင်းလဲရန် ဆန္ဒမရှိပါ ဤစာလွှာကို မျက်ကွယ်ပြုပြီး စကားဝှက်အဟောင်းဖြင့် ဆက်လက်သုံးစွဲနိုင်ပါသည်။", "noemail": "အသုံးပြုသူ \"$1\" အတွက် မည်သည့်အီးမေးလိပ်စာမှ မှတ်သားထားခြင်း မရှိပါ။", "noemailcreate": "တရာဝင်အီးမေးလိပ်စာ ပေးရန် လိုအပ်သည်", + "passwordsent": "$1 အတွက် မှတ်ပုံတင်ထားသော အီးမေးလ်လိပ်စာဆီသို့ စကားဝှက်အသစ်တစ်ခုကို ပို့ထားလိုက်ပါပြီ။ သင် လက်ခံပြီးပါက ထပ်မံ၍ လော့အင်ဝင်ရောက်ပါ။", + "blocked-mailpassword": "သင်၏ အိုင်ပီလိပ်စာကို တည်းဖြတ်ခြင်းမှ ပိတ်ပင်တားဆီးထားပါသည်။ အလွဲသုံးစားပြုလုပ်ခြင်းမှ ကာကွယ်ရန်အတွက် ဤအိုင်ပီလိပ်စာမှ စကားဝှက်အား ပြန်လည်ဆယ်ယူခြင်းကို ခွင့်မပြုထားပါ။", "mailerror": "မေးပို့ခြင်း အမှား - $1", "emailauthenticated": "သင့်အီးမေးလိပ်စာကို $2 နေ့ $3 အချိန်တွင် အတည်ပြုပြီး ဖြစ်သည်။", "emailconfirmlink": "အီးမေးကိုအတည်ပြုပါ", + "cannotchangeemail": "ဤဝီကီတွင် အကောင့်အီးမေးလ်လိပ်စာကို မပြောင်းလဲနိုင်ပါ။", + "emaildisabled": "ဤဆိုဒ်သည် အီးမေးလ်များ ပို၍မရနိုင်ပါ။", "accountcreated": "အကောင့်ဖန်တီးပြီးပါပြီ", "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ဆွေးနွေး]]) အတွက် အကောင့်ကို ဖန်တီးပြီး ဖြစ်သည်။", "createaccount-title": "{{SITENAME}} အတွက် အကောင့်ပြုလုပ်ခြင်း", "login-throttled": "သင်သည် login ဝင်ရန် အကြိမ်မြောက်မြားစွာ အားထုတ်ခဲ့ပြီးဖြစ်သည်။\nကျေးဇူးပြု၍ ထပ်မဝင်ခင် $1 စောင့်ပေးပါ။", "login-abort-generic": "လော့ဂ်အင်ဝင်ခြင်း မအောင်မြင်ပါ - ဖျက်သိမ်းပြီး", + "login-migrated-generic": "သင်၏အကောင့်သည် ပေါင်းစပ်လိုက်ပြီးဖြစ်သည်၊ သင်၏ အသုံးပြုသူအမည်မှာ ဤဝီကီတွင် မတည်ရှိတော့ပါ။", "loginlanguagelabel": "ဘာသာစကား: $1", + "createacct-another-realname-tip": "နာမည်ရင်းကို ထည့်သွင်းလိုက ထည့်နိုင်သည်။ ထည့်သွင်းရန် ရွေးချယ်ပါက အသုံးပြုသူတို့၏ အလုပ်အတွက် ထည့်သွင်းတွက်ချက်ရာတွင် အသုံးပြုပါလိမ့်မည်။", "pt-login": "အကောင့်ဝင်ရန်", "pt-login-button": "အကောင့်ဝင်ရန်", "pt-login-continue-button": "ဆက်လက် ဝင်ရောက်ပါ", "pt-createaccount": "အကောင့် ဖန်တီးရန်", "pt-userlogout": "အကောင့်ထွက်ရန်", + "user-mail-no-addy": "အီးမေးလ်လိပ်စာမရှိဘဲ အီးမေးလ်ပို့ကြည့်ခဲ့သည်။", "changepassword": "စကားဝှက် ပြောင်းရန်", "resetpass_announce": "လော့ဂ်အင်ဝင်ရောက်ခြင်း ပြီးမြောက်ရန် စကားဝှက်အသစ် ပေးရမည် ဖြစ်သည်။", "resetpass_header": "အကောင့်စကားဝှက်ပြောင်းရန်", @@ -434,7 +455,9 @@ "retypenew": "စကားဝှက် အသစ်ကို ထပ်ရိုက်ပါ -", "resetpass_submit": "စကားဝှက်ကို သတ်မှတ်ပြီးနောက် Log in ဝင်ရန်", "changepassword-success": "သင့်စကားဝှက်ကို ပြောင်းလဲပြီးပါပြီ!", + "changepassword-throttled": "သင်သည် login ဝင်ရန် အကြိမ်ပေါင်းများစွာ အားထုတ်ခဲ့ပြီးဖြစ်သည်။ ကျေးဇူးပြု၍ ထပ်မဝင်ခင် $1 စောင့်ပေးပါ။", "botpasswords": "ဘော့ စကားဝှက်များ", + "botpasswords-disabled": "ဘော့ စကားဝှက်များကို ပိတ်ထားပါသည်။", "botpasswords-existing": "ရှိနှင့်ပြီးသော ဘော့စကားဝှက်များ", "botpasswords-createnew": "ဘော့စကားဝှက်အသစ်တစ်ခု ဖန်တီးရန်", "botpasswords-editexisting": "ရှိနှင့်ပြီးသော ဘော့စကားဝှက်ကို ပြင်ဆင်ရန်", @@ -444,6 +467,7 @@ "botpasswords-label-cancel": "မလုပ်တော့ပါ", "botpasswords-label-delete": "ဖျက်", "botpasswords-label-resetpassword": "စကားဝှက်ကို ပြန်ချိန်ရန်", + "botpasswords-label-grants-column": "အပ်နှင်းပြီး", "botpasswords-bad-appid": "ဘော့အမည် \"$1\" သည် မရေရာပါ။", "botpasswords-insert-failed": "ဘော့အမည် \"$1\" ကို ထည့်သွင်းရန် မဖြစ်ပါ။ ထည့်ပြီးသားလား?", "botpasswords-created-title": "ဘော့စကားဝှက် ဖန်တီးပြီးပါပြီ", @@ -453,14 +477,21 @@ "botpasswords-deleted-title": "ဘော့စကားဝှက် ဖျက်ပြီးပါပြီ", "botpasswords-deleted-body": "{{GENDER:$2|အသုံးပြုသူ}} \"$2\" ၏ ဘော့အမည် \"$1\" အတွက် ဘော့စကားဝှက်ကို ဖျက်ပြီးပါပြီ။", "resetpass_forbidden": "စကားဝှက် ပြောင်းမရနိုင်ပါ", + "resetpass_forbidden-reason": "စကားဝှက်များ ပြောင်းမရနိုင်ပါ: $1", "resetpass-no-info": "ဤစာမျက်နှာကို တိုက်ရိုက်အသုံးပြုနိုင်ရန်အတွက် Log in ဝင်ထားရပါမည်။", "resetpass-submit-loggedin": "စကားဝှက်ပြောင်းရန်", "resetpass-submit-cancel": "မလုပ်တော့ပါ", - "resetpass-temp-password": "ယာယီစကားဝှက် -", + "resetpass-recycled": "သင်၏ လက်ရှိစကားဝှက်ထက် အခြားစကားဝှက်တစ်ခုခုကို ပြောင်းလဲပေးပါ။", + "resetpass-temp-emailed": "ယာယီစကားဝှက်ကုဒ်ဖြင့် ဝင်ထားပါသည်၊ အပြီးသတ်ရန် စကားဝှက်အသစ်တစ်ခု ဤနေရာတွင် ဆောင်ရွက်ရပါမည်။", + "resetpass-temp-password": "ယာယီစကားဝှက်:", + "resetpass-expired": "သင်၏ စကားဝှက် သက်တမ်းကုန်သွားပါသည်။ လော့အင်ဝင်ရန် စကားဝှက်အသစ် သတ်မှတ်ပါ။", "passwordreset": "စကားဝှက်အသစ် ပြုလုပ်ရန်", - "passwordreset-username": "အသုံးပြုသူအမည် :", - "passwordreset-email": "အီးမေး လိပ်စာ :", + "passwordreset-emaildisabled": "အီးမေးလ် ကြန်အင်လက္ခဏာများကို ဤဝီကီတွင် ပိတ်ထားခဲ့သည်။", + "passwordreset-username": "အသုံးပြုသူအမည်:", + "passwordreset-domain": "ဒိုမိန်း:", + "passwordreset-email": "အီးမေးလ် လိပ်စာ:", "passwordreset-emailtitle": "{{SITENAME}} ရှိ အကောင့် အသေးစိတ်", + "passwordreset-emailelement": "အသုံးပြုသူအမည်:\n$1\n\nယာယီ စကားဝှက်:\n$2", "passwordreset-invalidemail": "တရားမဝင်သော အီးမေးလ်လိပ်စာ", "changeemail": "အီးမေးလိပ်စာ ပြင်ဆင် သို့ ဖယ်ရှားရန်", "changeemail-oldemail": "လက်ရှိ အီးမေးလ်လိပ်စာ:", @@ -470,6 +501,7 @@ "changeemail-submit": "အီးမေးလ်ပြောင်းလဲရန်", "changeemail-throttled": "သင်သည် login ဝင်ရန် အကြိမ်မြောက်မြားစွာ ပြုလုပ်ခဲ့ပြီးဖြစ်သည်။\nကျေးဇူးပြု၍ ထပ်မဝင်ခင် $1 စောင့်ပေးပါ။", "changeemail-nochange": "မတူညီသော အီးမေးလ်လိပ်စာအသစ်ကို ကျေးဇူးပြု၍ ရိုက်ထည့်ပါ။", + "resettokens-token-label": "$1 (လက်ရှိတန်ဖိုး: $2)", "bold_sample": "စာလုံးမည်း", "bold_tip": "စာလုံးမည်း", "italic_sample": "စာလုံး အစောင်း", @@ -494,21 +526,30 @@ "savechanges": "ပြောင်းလဲမှုများကို သိမ်းရန်", "publishpage": "စာမျက်နှာကို လွှင့်တင်ရန်", "publishchanges": "ပြောင်းလဲမှုများကို လွှင့်တင်ရန်", + "savearticle-start": "စာမျက်နှာကို သိမ်းရန်...", + "savechanges-start": "ပြောင်းလဲမှုများကို သိမ်းရန်...", + "publishpage-start": "စာမျက်နှာကို လွှင့်တင်ရန်...", + "publishchanges-start": "ပြောင်းလဲမှုများကို လွှင့်တင်ရန်...", "preview": "နမူနာ", "showpreview": "န​မူ​နာ​ပြ​ရန်", "showdiff": "ပြင်​ဆင်​ထား​သည်​များ​ကို​ ပြရန်", + "blankarticle": "သတိပေးချက်: သင် ဖန်တီးနေသော စာမျက်နှာသည် ဗလာဖြစ်နေသည်။ အကယ်၍ \"$1\" ကိုထပ်မံနှိပ်ပါက စာမျက်နှာသည် မည်သည့်အကြောင်းအရာမျှမပါဘဲ ဖန်တီးသွားပါလိမ့်မည်။", "anoneditwarning": "သတိပေးချက် - သင်သည် လော့ဂ်အင် ဝင်မထားပါ။ သင်တည်းဖြတ်မှု ပြုလုပ်ပါက သင့်အိုင်ပီလိပ်စာကို မည်သူမဆို တွေ့မြင်နိုင်မည်။ အကယ်၍ သင် [$1 လော့ဂ်အင်ဝင်] သို့မဟုတ် [$2 အကောင့်တစ်ခု ဖန်တီး]ပါက၊ သင့်တည်းဖြတ်မှုများသည် သင့်အမည်နှင့် တွဲဖက်မှတ်သားမည် ဖြစ်သည်။", "anonpreviewwarning": "သင်သည် logged in ဝင်မထားပါ။ သိမ်းဆည်းမည် ဆိုပါက သင်၏IP အား ဤစာမျက်နှာ မှတ်တမ်းတွင် မှတ်သားထားမည်ဖြစ်ပါသည်။", + "missingsummary": "ပြန်လည်အသိပေးချက်: သင်သည် တည်းဖြတ်မှုအကျဉ်းချုပ်ကို ရေးသွင်းမထားပါ။ အကယ်၍ \"$1\" ကိုထပ်မံနှိပ်လိုက်ပါက တည်းဖြတ်မှုအကျဉ်းချုပ်မပါဘဲ သိမ်းဆည်းသွားမည်ဖြစ်သည်။", + "selfredirect": "သတိပေးချက်: သင်သည် ဤစာမျက်နှာကိုပင် ပြန်ညွှန်းနေပါသည်။ ပြန်ညွှန်းအတွက် မှားယွင်းသည့်ဦးတည်ချက်ကို သတ်မှတ်မိသည်မျိုး ဖြစ်နိုင်သည်၊ သို့မဟုတ် မှားယွင်းသော စာမျက်နှာကို တည်းဖြတ်မိသည်မျိုးလည်း ဖြစ်နိုင်သည်။ အကယ်၍ \"$1\" ကိုထပ်မံနှိပ်လိုက်ပါက ပြန်ညွှန်းသည် ဖန်တီးလိုက်မည်သာဖြစ်သည်။", "missingcommenttext": "ကျေးဇူးပြု၍ မှတ်ချက်တစ်ခုရေးပါ။", + "missingcommentheader": "ပြန်လည်အသိပေးချက်: ဤမှတ်ချက်အတွက် အကြောင်းအရာတစ်ခု မထည့်သွင်းထားပါ။ အကယ်၍ \"$1\" ကို ထပ်မံနှိပ်လိုက်ပါက အကြောင်းအရာမပါဘဲ ဖန်တီးသွားမည်ဖြစ်သည်။", "summary-preview": "တည်းဖြတ်အကျဉ်းချုပ် နမူနာ:", "subject-preview": "အကြောင်းအရာ နမူနာ:", + "previewerrortext": "သင်၏ ပြောင်းလဲချက်များကို အစမ်းကြည့်ရန် ဆောင်ရွက်နေစဉ် အမှားတစ်ခု ဖြစ်ပွားခဲ့သည်။", "blockedtitle": "အသုံးပြုသူကို ပိတ်ပင်ထားသည်", "blockedtext": "သင်၏ အသုံးပြုသူအမည် သို့မဟုတ် အိုင်ပီလိပ်စာသည် ပိတ်ပင်ခြင်း ခံထားရသည်။\n\nဤပိတ်ပင်မှုအား $1 က ဆောင်ရွက်ခဲ့သည်။\nအကြောင်းရင်းမှာ $2 ဖြစ်သည်။\n\n* ပိတ်ပင်ခြင်း စတင်ချိန်: $8\n* ပိတ်ပင်ခြင်း သက်တမ်းကုန်ချိန်: $6\n* ရည်ရွယ်ရာ blockee: $7\n\nသင်သည် ပိတ်ပင်မှုအတွက် ဆွေးနွေးရန် $1 သို့မဟုတ် အခြား [[{{MediaWiki:Grouppage-sysop}}|စီမံခန့်ခွဲသူ]] အား ဆက်သွယ်နိုင်သည်။\nသင့်အနေဖြင့် [[Special:Preferences|အကောင့်၏ ရွေးချယ်စရာများ]]ထဲတွင် ရေရာသော အီးမေးလိပ်စာအား မထည့်သွင်းထားပါက \"{{int:emailuser}}\" လုပ်ဆောင်ချက်ကို အသုံးပြုနိုင်မည် မဟုတ်ပါ။ အလားတူ ယင်းလုပ်ဆောင်ချက်ကို ပိတ်ပင်မခံရမှ လုပ်ဆောင်နိုင်မည်ဖြစ်သည်။\nသင်၏ လက်ရှိ အိုင်ပီလိပ်စာမှာ $3 ဖြစ်ပြီး၊ ပိတ်ပင်မှုအိုင်ဒီမှာ #$5 ဖြစ်သည်။\nသင်ပြုလုပ်မည့် စုံစမ်းမေးမြန်းမှုများတွင် အထက်ပါ အချက်များ အားလုံး ပါဝင်နေပါစေ။", "blockednoreason": "အကြောင်းပြချက် မပေးထားပါ", "whitelistedittext": "စာမျက်နှာများကို တည်းဖြတ်ရန် $1ရမည်။", "nosuchsectiontitle": "အပိုင်းကို ရှာမရနိုင်ပါ", "loginreqtitle": "login ဝင်ထားရန် လိုသည်", - "loginreqlink": "log in ဝင်", + "loginreqlink": "အကောင့်ဝင်ရန်", "loginreqpagetext": "အခြားစာမျက်နှာများကို ကြည့်ရန် $1ရမည်။", "accmailtitle": "စကားဝှက်ကို ပို့ပြီးပြီ", "newarticle": "(အသစ်)", @@ -516,10 +557,12 @@ "anontalkpagetext": "----\nဤသည်မှာ အကောင့်မဖန်တီးသော သို့မဟုတ် အကောင့်မရှိသော အမည်မသိ အသုံးပြုသူတစ်ဦးအတွက် ဆွေးနွေးချက် စာမျက်နှာ ဖြစ်သည်။\nသို့အတွက် ကျွန်ုပ်တို့အနေဖြင့် အိုင်ပီလိပ်စာဂဏန်းကိုသာ သူ/သူမ အားခွဲခြားနိုင်ရန် အသုံးပြုရပါသည်။\nထိုသို့သော အိုင်ပီလိပ်စာများကို အသုံးပြုသူများစွာမှ မျှဝေသုံးစွဲနေနိုင်ပါသည်။\nသင်သည် အမည်မသိ အသုံးပြုသူတစ်ဦးဖြစ်ပြီး မသက်ဆိုင်သော သုံးသပ်ဆွေးနွေးချက်များက သင့်အား အနှောက်အယှက်ဖြစ်စေပါက၊ ကျေးဇူးပြု၍ [[Special:CreateAccount|အကောင့်တစ်ခု ဖန်တီးပါ]] သို့မဟုတ် [[Special:UserLogin|လော့ဂ်အင်ဝင်ရောက်ပြီး]] အခြား အမည်မသိအသုံးပြုသူများနှင့် ရောထွေးနေနိုင်ခြင်းကို ရှောင်ကြဉ်နိုင်ပါသည်။", "noarticletext": "ဤစာမျက်နှာတွင် ယခုလက်ရှိတွင် မည်သည့်စာသားမှ မရှိပါ။\nသင်သည် အခြားစာမျက်နှာများတွင် [[Special:Search/{{PAGENAME}}|ဤစာမျက်နှာ၏ ခေါင်းစဉ်ကို ရှာနိုင်သည်]]၊ [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ဆက်စပ်ရာ မှတ်တမ်းများကို ရှာနိုင်သည်]၊ သို့မဟုတ် [{{fullurl:{{FULLPAGENAME}}|action=edit}} ဤစာမျက်နှာကို ဖန်တီးနိုင်သည်]။", "noarticletext-nopermission": "ဤစာမျက်နှာတွင် ယခုလက်ရှိတွင် မည်သည့်စာသားမှ မရှိပါ။\nသင်သည် အခြားစာမျက်နှာများတွင် [[Special:Search/{{PAGENAME}}|ဤစာမျက်နှာ၏ ခေါင်းစဉ်ကို ရှာနိုင်သည်]]၊ သို့မဟုတ် [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ဆက်စပ်ရာ Logs များကို ရှာနိုင်သည်]။ သို့သော် ဤစာမျက်နှာကို ဖန်တီးရန် သင့်တွင် အခွင့်အရေး မရှိပါ။", + "userpage-userdoesnotexist": "အသုံးပြုသူအကောင့် \"$1\" ကို မှတ်ပုံတင် မလုပ်ရသေးပါ။ ဤစာမျက်နှာကို ဖန်တီး/တည်းဖြတ်လိုပါက ကျေးဇူးပြု၍ စစ်ဆေးပေးပါ။", "userpage-userdoesnotexist-view": "အသုံးပြုသူအကောင့် \"$1\" သည် မှတ်ပုံမတင်ထားပါ။", "blocked-notice-logextract": "ဤအသုံးပြုသူအား လတ်တလောတွင် ပိတ်ပင်ထားသည်။\nနောက်ဆုံးပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။", "clearyourcache": "မှတ်ချက်။ သိမ်းဆည်းလိုက်ပြီးသည့်နောက် ပြောင်းလဲမှုများ မြင်ရနိုင်ရန် သင့်အနေဖြင့် ဘရောက်ဇာ၏ cache အား ဖြတ်ကျော်နိုင်ရန် လိုအပ်ပါသည်။\n* Firefox / Safari: Reload ကို နှိပ်နေစဉ်အတွင်း Shift ကို ဖိထားပါ၊ သို့မဟုတ် Ctrl-F5 သို့ Ctrl-R (Mac တွင် ⌘-R) ကို နှိပ်ပါ။\n* Google Chrome: Ctrl-Shift-R (Mac တွင် ⌘-Shift-R) ကို နှိပ်ပါ။\n* Internet Explorer: Refresh ကို နှိပ်နေစဉ်အတွင်း Ctrl ကို ဖိထားပါ၊ သို့မဟုတ် Ctrl-F5 ကို နှိပ်ပါ။\n* Opera: Menu → Settings (Mac တွင် Opera → Preferences) သို့ သွားပြီး Privacy & security → Clear browsing data → Cached images and files ကို ပြုလုပ်ပါ။", - "note": "'''မှတ်ချက် -'''", + "updated": "(မွမ်းမံပြီး)", + "note": "မှတ်စု:", "previewnote": "ဤသည်မှာ နမူနာ ကြည့်နေခြင်းသာဖြစ်ကြောင်း မမေ့ပါနှင့်။\nသင်ပြောင်းလဲထားသည်များကို မသိမ်းရသေးပါ။", "continue-editing": "တည်းဖြတ်ဧရိယာသို့ သွားရန်", "editing": "$1 ကို တည်းဖြတ်နေသည်", @@ -532,6 +575,7 @@ "yourdiff": "ကွဲပြားချက်များ", "copyrightwarning": "{{SITENAME}} တွင် ရေးသားမှုအားလုံးကို $2 အောက်တွင် ဖြန့်ဝေရန် ဆုံးဖြတ်ပြီး ဖြစ်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။။ (အသေးစိတ်ကို $1 တွင်ကြည့်ပါ။)\nအကယ်၍ သင့်ရေးသားချက်များကို အညှာအတာမရှိ တည်းဖြတ်ခံရခြင်း၊ စိတ်တိုင်းကျ ဖြန့်ဝေခံရခြင်းတို့ကို အလိုမရှိပါက ဤနေရာတွင် မတင်ပါနှင့်။
    \nသင်သည် ဤဆောင်းပါးကို သင်ကိုယ်တိုင်ရေးသားခြင်း၊ သို့မဟုတ် အများပြည်သူဆိုင်ရာဒိုမိန်းများ၊ ယင်းကဲ့သို့ လွတ်လပ်သည့် ရင်းမြစ်မှ ကူးယူထားခြင်း ဖြစ်ကြောင်းလည်း ဝန်ခံ ကတိပြုပါသည်။\nမူပိုင်ခွင့်ရှိသော စာ၊ပုံများကို ခွင့်ပြုချက်မရှိဘဲ မတင်ပါနှင့်။", "copyrightwarning2": "{{SITENAME}} တွင် ရေးသားမှုအားလုံးသည် အခြားပုံပိုးသူများ၏ တည်းဖြတ်၊ ပြောင်းလဲ၊ ဖယ်ရှားခံရနိုင်သည်ကို သတိပြုပါ။\nအကယ်၍ သင့်ရေးသားချက်များကို အညှာအတာမရှိ တည်းဖြတ်ခံရခြင်း၊ စိတ်တိုင်းကျ ဖြန့်ဝေခံရခြင်းတို့ကို အလိုမရှိပါက ဤနေရာတွင် မတင်ပါနှင့်။
    \nသင်သည် ဤဆောင်းပါးကို သင်ကိုယ်တိုင်ရေးသားခြင်း၊ သို့မဟုတ် အများပြည်သူဆိုင်ရာဒိုမိန်းများ၊ ယင်းကဲ့သို့ လွတ်လပ်သည့် ရင်းမြစ်မှ ကူးယူထားခြင်း ဖြစ်ကြောင်းလည်း ဝန်ခံ ကတိပြုပါသည် (အသေးစိတ်ကို $1 တွင်ကြည့်ပါ)။\nမူပိုင်ခွင့်ရှိသော စာ၊ပုံများကို ခွင့်ပြုချက်မရှိဘဲ မတင်ပါနှင့်။", + "editpage-cannot-use-custom-model": "ဤစာမျက်နှာ၏ မာတိကာမော်ဒယ်ကို မပြောင်းလဲနိုင်ခဲ့ပါ။", "protectedpagewarning": "သတိပေးချက်။ ဤစာမျက်နှာအား စီမံခန့်ခွဲသူအဆင့်ရှိသူများသာ ပြင်ဆင်နိုင်ရန် ကာကွယ်ထားသည်။\nနောက်ဆုံးမှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။", "semiprotectedpagewarning": "မှတ်ချက်။ ဤစာမျက်နှာအား အလိုအလျောက် အတည်ပြုထားသော အသုံးပြုသူအဆင့်ရှိသူများသာ တည်းဖြတ်နိုင်ရန် ကာကွယ်ထားသည်။\nနောက်ဆုံးမှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။", "titleprotectedwarning": "သတိပေးချက်။ ဤစာမျက်နှာကို ကာကွယ်ထားပြီး ဖန်တီးနိုင်ရန်အတွက် [[Special:ListGroupRights|အထူး အခွင့်အရေးများ]]ရှိထားရန် လိုအပ်သည်။\nနောက်ဆုံးမှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။", @@ -541,6 +585,7 @@ "template-protected": "(ကာကွယ်ထားသည်)", "template-semiprotected": "(တစ်စိတ်တစ်ပိုင်း ကာကွယ်ထားသည်)", "hiddencategories": "ဤစာမျက်နှာသည် {{PLURAL:$1|ဝှက်ထားသော ကဏ္ဍတစ်ခု|ဝှက်ထားသော ကဏ္ဍ $1 ခု}} ၏ အဖွဲ့ဝင် ဖြစ်သည်။", + "nocreatetext": "{{SITENAME}} သည် စာမျက်နှာသစ်များ ဖန်တီးနိုင်စွမ်းကို ကန့်သတ်ထားသည်။ သင်သည် နောက်ပြန်သွားပြီး ရှိနှင့်ပြီးသား စာမျက်နှာများကို တည်းဖြတ်နိုင်သည်၊ သို့မဟုတ် [[Special:UserLogin|အကောင့်တစ်ခုထဲဝင်ရောက် သို့ ဖန်တီးနိုင်သည်]]", "nocreate-loggedin": "သင်သည် စာမျက်နှာအသစ် ဖန်တီးခွင့်မရှိပါ။", "sectioneditnotsupported-title": "ခေါင်းစဉ်ခွဲအလိုက် တည်းဖြတ်ခြင်းကို မထောက်ပံ့ထားပါ", "sectioneditnotsupported-text": "အပိုင်းလိုက်တည်းဖြတ်ခြင်းကို ဤစာမျက်နှာတွင် မရနိုင်ပါ။", @@ -549,6 +594,7 @@ "permissionserrorstext-withaction": "အောက်ပါ အကြောင်းပြချက် {{PLURAL:$1|ခု|ခု}} ကြောင့် $2 အတွက် ခွင့်ပြုချက်မရှိပါ -", "recreate-moveddeleted-warn": "'''သတိပေးချက်။ သင်သည် ယခင်က ဖျက်ထားသော စာမျက်နှာတစ်ခုကို ပြန်လည်ဖန်တီးနေသည်။'''\n\nသင့်အနေနှင့် ဤစာမျက်နှာကို ဆက်လက်တည်းဖြတ်ရန် သင့်တော်မည် မသင့်တော်မည်ကို စဉ်းစားသင့်သည်။\nဖျက်ထားခြင်း နှင့် ရွှေ့ထားခြင်းတို့၏ မှတ်တမ်းကို သင့်အတွက် အလွယ်တကူ ကိုးကားနိုင်ရန် ဖော်ပြထားသည်။", "moveddeleted-notice": "ဤစာမျက်နှာကို ဖျက်ထားသည်။\nဖျက်ထားခြင်း၊ ကာကွယ်ထားခြင်းနှင့် ရွှေ့ပြောင်းထားခြင်းတို့နှင့် ပတ်သက်သော မှတ်တမ်းကို ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။", + "moveddeleted-notice-recent": "စိတ်မကောင်းပါ၊ ဤစာမျက်နှာ မကြာသေးခင်က (လွန်ခဲ့သော ၂၄ နာရီအတွင်း) ဖျက်ပစ်ခဲ့သည်။ စာမျက်နှာအတွက် ဖျက်ပစ်ခြင်း၊ ကာကွယ်ခြင်းနှင့် ရွေ့ပြောင်းခြင်း မှတ်တမ်းများကို ကိုးကားချက်အဖြစ် အောက်တွင် ဖော်ပြထားသည်။", "log-fulllog": "မှတ်တမ်းအပြည့်အစုံကြည့်ရန်", "edit-gone-missing": "စာမျက်နှာကို အပ်ဒိတ်မလုပ်နိုင်ပါ။\nအဖျက်ခံလိုက်ရပုံပေါ်သည်။", "edit-conflict": "အငြင်းပွားမှုကို တည်းဖြတ်ရန်။", @@ -556,7 +602,15 @@ "postedit-confirmation-created": "စာမျက်နှာကို ဖန်တီးပြီးပြီ။", "postedit-confirmation-restored": "စာမျက်နှာကို ပြန်လည်ထိန်းသိမ်းပြီးပြီ။", "postedit-confirmation-saved": "သင့်တည်းဖြတ်မှုကို သိမ်းဆည်းပြီးပြီ။", + "postedit-confirmation-published": "သင်၏တည်းဖြတ်မှုကို လွှင့်တင်ခဲ့သည်။", "edit-already-exists": "စာမျက်နှာအသစ်တစ်ခု မဖန်တီးနိုင်ပါ။\nယင်းစာမျက်နှာ တည်ရှိပြီး ဖြစ်သည်။", + "defaultmessagetext": "ပုံမှန် အသိပေးချက် စာသား", + "invalid-content-data": "မဆီလျော်သော မာတိကာဒေတာ", + "content-not-allowed-here": "\"$1\" မာတိကာကို [[$2]] စာမျက်နှာပေါ်တွင် ခွင့်မပြုပါ။", + "editpage-invalidcontentmodel-title": "မာတိကာမော်ဒယ်သည် မထောက်ပံ့ထားပါ", + "editpage-invalidcontentmodel-text": "မာတိကာမော်ဒယ် \"$1\" သည် မထောက်ပံ့ထားပါ။", + "editpage-notsupportedcontentformat-title": "မာတိကာပုံစံသည် မထောက်ပံ့ထားပါ", + "editpage-notsupportedcontentformat-text": "မာတိကာပုံစံ $1 အား မာတိကာမော်ဒယ် $2 မှ မထောက်ပံ့ထားပါ။", "content-model-wikitext": "ဝီကီစာသား", "duplicate-args-category": "တမ်းပလိတ်တွင်းရှိ arguments ထပ်နေသော စာမျက်နှာများ", "post-expand-template-inclusion-warning": "'''သတိပေးချက် -''' တမ်းပလိတ်အရွယ်အစား ကြီးလွန်းနေသည်။\nအချို့တမ်းပလိတ်တို့ ပါဝင်မည်မဟုတ်။", @@ -566,13 +620,15 @@ "parser-template-loop-warning": "တမ်းပလိတ်များ လှည့်ပတ်ဆက်စပ် နေသည်ကို တွေ့ရသည်။ [[$1]]", "undo-failure": "ကြားဖြတ် တည်းဖြတ်မှုများကြောင့် တည်းဖြတ်မှုကို နောက်ပြန် မပြင်နိုင်တော့ပါ။", "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ တည်းဖြတ်မူ $1 ကို ပြန်လည်ပယ်ဖျက်လိုက်သည်", + "cantcreateaccount-text": "ဤအိုင်ပီလိပ်စာ ($1) မှ အကောင့်ဖန်တီးခြင်းကို [[User:$3|$3]] က ပိတ်ပင်ထားသည်။ \n\n$3 က ပေးထားသော အကြောင်းပြချက်မှာ $2", + "cantcreateaccount-range-text": "သင်၏အိုင်ပီလိပ်စာ ($4) ပါဝင်သော ဤအိုင်ပီလိပ်စာ ($1) မှ အကောင့်ဖန်တီးခြင်းကို [[User:$3|$3]] က ပိတ်ပင်ထားသည်။ \n\n$3 က ပေးထားသော အကြောင်းပြချက်မှာ $2", "viewpagelogs": "ဤစာမျက်နှာအတွက် မှတ်တမ်းများကို ကြည့်ရန်", "nohistory": "ဤစာမျက်နှာတွင် တည်းဖြတ်မှု ရာဇဝင်မရှိပါ", "currentrev": "နောက်ဆုံးမူ", "currentrev-asof": "$1 က နောက်ဆုံး တည်းဖြတ်မူ", "revisionasof": "$1 ရက်နေ့က မူ", "revision-info": "$1 နေ့က {{GENDER:$6|$2}}$7 တည်းဖြတ်သည့်မူ", - "previousrevision": "မူဟောင်း", + "previousrevision": "← မူဟောင်း", "nextrevision": "ပိုသစ်သော တည်းဖြတ်မူ →", "currentrevisionlink": "နောက်ဆုံး မူ", "cur": "လက်ရှိ", @@ -585,10 +641,12 @@ "history-show-deleted": "ဖျက်ထားသော မူများသာ", "histfirst": "အဟောင်းဆုံး", "histlast": "အသစ်ဆုံး", + "historysize": "({{PLURAL:$1|1 ဘိုက်|$1 ဘိုက်}})", "historyempty": "(ဘာမှမရှိ)", "history-feed-title": "မူရာဇဝင်မှတ်တမ်း", "history-feed-description": "ဝီကီပေါ်ရှိ ဤစာမျက်နှာ၏ တည်းဖြတ်မှုရာဇဝင်", "history-feed-item-nocomment": "$2 က $1", + "history-feed-empty": "တောင်းဆိုလိုက်သော စာမျက်နှာ မတည်ရှိပါ။ ယင်းအား ဝီကီမှ ဖျက်ပစ်၊ အမည်ပြောင်းခဲ့သည်မျိုး ဖြစ်နိုင်ပါသည်။ သင့်လျော်သော စာမျက်နှာသစ်များအတွက် [[Special:Search|ဝီကီတွင် ရှာဖွေရန်]] စမ်းကြည့်ပါ။", "rev-deleted-comment": "(တည်းဖြတ်မှုအတိုချုပ် ဖယ်ရှားပြီး)", "rev-deleted-user": "(အသုံးပြုသူအမည် ဖယ်ရှားပြီး)", "rev-deleted-event": "(အသေးစိတ် မှတ်တမ်း ဖယ်ရှားပြီးပြီ)", @@ -622,6 +680,7 @@ "revdel-restore": "မည်မျှ ရှုမြင်နိုင်သည်ကို ပြောင်းရန်", "pagehist": "စာမျက်နှာ မှတ်တမ်း", "deletedhist": "ဖျက်ပစ်လိုက်သော မှတ်တမ်း", + "revdelete-reason-dropdown": "*ယေဘုယျ ဖျက်ပစ်ခြင်း အကြောင်းပြချက်များ\n** မူပိုင်ခွင့် ချိုးဖောက်မှု\n** မသင့်တော်သောမှတ်ချက် သို့ ပုဂ္ဂိုလ်ရေးအချက်အလက်\n** မသင့်တော်သော အသုံးပြုသူအမည်\n** အသရေဖျက်နိုင်ခြေရှိသော အချက်အလက်", "revdelete-otherreason": "အခြားသော/နောက်ထပ် အကြောင်းပြချက် -", "revdelete-reasonotherlist": "အခြား အကြောင်းပြချက်", "revdelete-edit-reasonlist": "ဖျက်ပစ်လိုက်ရသော အကြောင်းရင်းများကို တည်းဖြတ်ရန်", @@ -634,6 +693,10 @@ "mergehistory-go": "ပေါင်းစည်းနိုင်သော တည်းဖြတ်မှုများကို ပြရန်", "mergehistory-submit": "မူများကို ပေါင်းရန်", "mergehistory-empty": "ပေါင်းစည်းနိုင်သော မူများ မရှိပါ။", + "mergehistory-fail-invalid-source": "ရင်းမြစ်စာမျက်နှာသည် မဆီလျော်ပါ။", + "mergehistory-fail-invalid-dest": "ဦးတည်စာမျက်နှာသည် ဆီလျော်ပါ။", + "mergehistory-fail-permission": "ရာဇဝင် ပေါင်းစပ်ရန် ခွင့်ပြုချက်များ မလုံလောက်ပါ။", + "mergehistory-fail-self-merge": "ရင်းမြစ်နှင့် ဦးတည်စာမျက်နှာများသည် အတူတူပင်ဖြစ်သည်။", "mergehistory-no-source": "ရင်းမြစ်စာမျက်နှာ $1 မတည်ရှိပါ။", "mergehistory-no-destination": "သတ်မှတ်ထားသောစာမျက်နှာ $1 မတည်ရှိပါ။", "mergehistory-invalid-source": "ရင်းမြစ်စာမျက်နှာသည် တရားဝင်သော ခေါင်းစဉ် ဖြစ်ရမည်။", @@ -657,6 +720,7 @@ "diff-multi-sameuser": "(တူညီသော အသုံးပြုသူ၏ {{PLURAL:$1|အလယ်ကြား မူတစ်ခု|အလယ်ကြား မူများ $1 ခု}} အား ပြသမထားပါ)", "diff-multi-otherusers": "({{PLURAL:$2|အခြား အသုံးပြုသူ|အသုံးပြုသူ $2 ဦးတို့}}၏ {{PLURAL:$1|အလယ်ကြား မူတစ်ခု|အလယ်ကြား မူများ $1 ခု}} အား ပြသမထားပါ)", "searchresults": "ရှာဖွေမှု ရလဒ်များ", + "search-filter-title-prefix-reset": "စာမျက်နှာအားလုံး ရှာဖွေရန်", "searchresults-title": "\"$1\" အတွက် ရှာတွေ့သည့် ရလဒ်များ", "titlematches": "စာမျက်နှာခေါင်းစဉ်ကိုက်ညီသည်", "textmatches": "စာမျက်နှာစာသားကိုက်ညီသည်", @@ -686,9 +750,11 @@ "search-category": "(ကဏ္ဍ $1)", "search-file-match": "(ကိုက်ညီသော ဖိုင်အကြောင်းအရာ)", "search-suggest": "$1 ဟု ဆိုလိုပါသလား။", + "search-rewritten": "$1 အတွက် ရလဒ်များ ပြသခြင်း။ $2 အတွက် ရှာဖွေရန်။", "search-interwiki-caption": "ညီအစ်မ ပရောဂျက်များမှ ရလဒ်များ", "search-interwiki-default": "$1 မှ ရလဒ်များ -", "search-interwiki-more": "(နောက်ထပ်)", + "search-interwiki-more-results": "ရလဒ်များ ပို၍", "search-relatedarticle": "ဆက်နွယ်သော", "searchrelated": "ဆက်နွယ်သော", "searchall": "အားလုံး", @@ -701,10 +767,15 @@ "powersearch-togglelabel": "စစ်ဆေးရန် -", "powersearch-toggleall": "အားလုံး", "powersearch-togglenone": "အမည်ညွှန်းမရှိ", + "powersearch-remember": "နောင်ရှာဖွေမှုများအတွက် ရွေးချယ်မှုကို အမှတ်ရရန်", "search-external": "အပြင်တွင် ရှာရန်", + "searchdisabled": "{{SITENAME}} ရှာဖွေခြင်းကို ပိတ်ထားပါသည်။ ဤအတောအတွင်း ဂူဂဲလ်မှတဆင့် ရှာဖွေနိုင်သည်။ မှတ်သားရန်မှာ {{SITENAME}} ရှိအကြောင်းအရာ အညွှန်းများသည် ခေတ်နောက်ကျနိုင်သည်။", + "search-error": "ရှာဖွေနေစဉ် အမှားတစ်ခု ဖြစ်ပွားခဲ့သည်: $1", + "search-warning": "ရှာဖွေနေစဉ် သတိပေးချက်တစ်ခု ဖြစ်ပွားခဲ့သည်: $1", "preferences": "​ရွေး​ချယ်​စ​ရာ​များ​", "mypreferences": "​ရွေး​ချယ်​စ​ရာ​များ​", "prefs-edits": "တည်းဖြတ်မှုအရေအတွက် -", + "prefsnologintext2": "သင်၏ အပြင်အဆင်များကို ပြောင်းလဲရန် အကောင့်ထဲဝင်ရောက်ပါ။", "prefs-skin": "အသွင်အပြင်", "skin-preview": "နမူနာ", "datedefault": "မရွေးချယ်", @@ -724,12 +795,14 @@ "prefs-misc": "အသေးအမွှား", "prefs-resetpass": "စကားဝှက် ပြောင်းရန်", "prefs-changeemail": "အီးမေးလိပ်စာ ပြင်ဆင် သို့ ဖယ်ရှားရန်", + "prefs-setemail": "အီးမေးလ် လိပ်စာ ရိုက်ထည့်ပါ", "prefs-email": "အီးမေးအတွက် ရွေးချယ်စရာ", "prefs-rendering": "ပုံပန်းသွင်ပြင်", "saveprefs": "သိမ်းရန်", "restoreprefs": "မူလအပြင်အဆင်အားလုံးသို့ ပြန်ပြောင်းရန် (အပိုင်းအားလုံးတွင်)", "prefs-editing": "တည်းဖြတ်ခြင်း", "searchresultshead": "ရှာဖွေရန်", + "stub-threshold-sample-link": "နမူနာ", "stub-threshold-disabled": "ပိတ်ထားသည်", "recentchangesdays": "လတ်တလောအပြောင်းအလဲများကို ပြရန်နေ့များ -", "recentchangesdays-max": "အများဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}", @@ -754,27 +827,33 @@ "timezoneregion-indian": "အိန္ဒိယသမုဒ္ဒရာ", "timezoneregion-pacific": "ပစိဖိတ်သမုဒ္ဒရာ", "allowemail": "ကျွန်ုပ်ထံသို့ အခြားအသုံးပြုသူများ အီးမေးလ်ပေးပို့ခြင်းကို ခွင့်ပြုရန်", + "email-allow-new-users-label": "အသစ်စက်စက် အသုံးပြုသူများဆီမှ အီးမေးလ်လက်ခံရန် ခွင့်ပြုမည်", + "email-blacklist-label": "ဤအသုံးပြုသူများ မိမိအား အီးမေးလ်ပို့ခြင်းကို ပိတ်ထားမည်", "prefs-searchoptions": "ရှာဖွေရန်", "prefs-namespaces": "အမည်ညွှန်း", "default": "ပုံမှန်အားဖြင့်", - "prefs-files": "ဖိုင်", + "prefs-files": "ဖိုင်များ", "prefs-custom-css": "စိတ်ကြိုက် CSS", "prefs-custom-js": "စိတ်ကြိုက် Javascript", "prefs-emailconfirm-label": "အီးမေးအတည်ပြုရန်", - "youremail": "အီး​မေး -", + "youremail": "အီးမေးလ်:", "username": "{{GENDER:$1|အသုံးပြုသူအမည်}} -", "prefs-memberingroups": "{{PLURAL:$1|အုပ်စု|အုပ်စုများ}}၏ {{GENDER:$2|အဖွဲ့ဝင်}} -", + "group-membership-link-with-expiry": "$1 ($2 မတိုင်ခင်)", "prefs-registration": "မှတ်ပုံတင်သည့် အချိန် -", "yourrealname": "နာမည်ရင်း -", "yourlanguage": "ဘာသာစကား:", "yournick": "လက်မှတ်အသစ် -", + "prefs-help-signature": "ဆွေးနွေးချက်စာမျက်နှာများတွင် မှတ်ချက်ပေးရာ၌ \"~~~~\" ဖြင့် လက်မှတ်ထိုးသင့်ပါသည်၊ ယင်းသည် သင်၏လက်မှတ်နှင့် အချိန်မှတ်တမ်းကို ပြောင်းပေးမည်ဖြစ်သည်။", "badsig": "တရားမဝင်သည့် လက်မှတ်အကြမ်း။\nHTML tags ကို စစ်ဆေးပါ။", "badsiglength": "သင့်လက်မှတ်သည် ရှည်လွန်းနေပါသည်။\nယင်းသည် စာလုံး {{PLURAL:$1|လုံး|လုံး}}ထက် မရှည်ရပါ။", "yourgender": "သင်ဘယ်လို ဖော်ပြစေချင်ပါသလဲ?", "gender-unknown": "သင့်အားရည်ညွှန်းရာတွင် ဆော့ဖ်ဝဲလ်သည် ဖြစ်နိုင်ပါက ဘက်မလိုက်သည့် လိင်အသုံးအနှုန်းများကို အသုံးပြုလိမ့်မည်", "gender-male": "သူသည် ဝီကီစာမျက်နှာများကို တည်းဖြတ်သည်", "gender-female": "သူမသည် ဝီကီစာမျက်နှာများကို တည်းဖြတ်သည်", - "email": "အီးမေး", + "prefs-help-gender": "ဤအပြင်အဆင်ကို သတ်မှတ်လိုက သတ်မှတ်နိုင်သည်။ ဆော့ဝဲလ်က အခြားသူများကို သင့်အားဖော်ပြရာတွင် သင့်လျော်သော သဒ္ဒါစဉ်အတိုင်း အသုံးပြုပါသည်။ ဤသတင်းအချက်အလက်သည် အများကြည့်နိုင်သောအရာ ဖြစ်ပါလိမ့်မည်။", + "email": "အီးမေးလ်", + "prefs-help-realname": "နာမည်ရင်းကို ထည့်သွင်းလိုကထည့်နိုင်သည်။ ထည့်သွင်းထားပါက သင်၏လုပ်ဆောင်မှုအတွက် ထည့်သွင်းတွက်ချက်မှုအား သင့်ကိုပေးရာတွင် အသုံးပြုနိုင်သည်။", "prefs-help-email": "အီးမေးလ်လိပ်စာ ပေးမည် မပေးမည်မှာ သင့်သဘောသာ ဖြစ်ပါသည်။ သို့သော်လည်း သင် စကားဝှက်ကို မေ့သွားပါက စကားဝှက်ကို reset လုပ်ရန် အီးမေးလ်လိပ်စာ လိုအပ်ပါလိမ့်မည်။", "prefs-help-email-others": "သင့်အသုံးပြုသူစာမျက်နှာ သို့မဟုတ် ဆွေးနွေးရန်စာမျက်နှာရှိ လင့်မှတဆင့် သင့်ထံ အခြားသူများ အီးမေးမှဆက်သွယ်ရန်လည်း ရွေးချယ်နိုင်သည်။\nအခြားသူများ သင့်ထံဆက်သွယ်သည့်အခါ သင့်အီးမေးကို သူတို့အား ဖော်ပြမည်မဟုတ်ပါ။", "prefs-help-email-required": "အီးမေးလိပ်စာ လိုအပ်ပါသည်။", @@ -784,6 +863,7 @@ "prefs-dateformat": "နေ့စွဲပုံစံ", "prefs-timeoffset": "အချိန် တန်ဖိုး", "prefs-advancedediting": "အထွေထွေ ရွေးချယ်စရာများ", + "prefs-developertools": "ဆော့ဝဲလ်တီထွင်ဖန်တီးသူ ကိရိယာများ", "prefs-editor": "တည်းဖြတ်သူ", "prefs-preview": "နမူနာ", "prefs-advancedrc": "အဆင့်မြင့် ရွေးချယ်မှု", @@ -794,6 +874,8 @@ "prefs-displaywatchlist": "ပြသရန် ရွေးချယ်မှု", "prefs-tokenwatchlist": "တိုကင်", "prefs-diffs": "ကွဲပြားချက်", + "prefs-help-prefershttps": "ဤအပြင်အဆင်များသည် နောက်တခါအကောင့်ထဲဝင်ပါက သက်ရောက်မှုရှိလာပါလိမ့်မည်။", + "prefswarning-warning": "သင်၏အပြင်အဆင်များအတွက် မသိမ်းဆည်းရသေးသော ပြောင်းလဲမှုများကို လုပ်ဆောင်ခဲ့သည်။ အကယ်၍ \"$1\" ကိုမနှိပ်ဘဲ ဤစာမျက်နှာကို ချန်ထားလိုက်ပါက သင်၏အပြင်အဆင်များသည် မွမ်းမံသွားလိမ့်မည်မဟုတ်ပါ။", "userrights": "အသုံးပြုသူ အခွင့်အရေးများ", "userrights-lookup-user": "အသုံးပြုသူတစ်ဦးကို ရွေးချယ်ရန်", "userrights-user-editname": "အသုံးပြုသူအမည်တစ်ခုကို ထည့်ပါ -", @@ -804,17 +886,25 @@ "userrights-viewusergroup": "{{GENDER:$1|အသုံးပြုသူ}} အုပ်စုများကို ကြည့်ရန်", "saveusergroups": "{{GENDER:$1|အသုံးပြုသူ}}အုပ်စုများကို သိမ်းရန်", "userrights-groupsmember": "အဖွဲ့ဝင်", + "userrights-groupsmember-auto": "အကြွင်းမဲ့ အဖွဲ့ဝင်:", "userrights-groups-help": "ဤအသုံးပြုသူ၏ အုပ်စုများကို အောက်ပါအတိုင်း သင်ပြောင်းလဲနိုင်သည်\n* အမှန်ခြစ်အကွက်သည် ထိုအသုံးပြုသူသည် ယင်းအုပ်စုတွင် ပါဝင်ကြောင်း ဆိုလိုသည်။\n* အမှန်ခြစ်မပါသော အကွက်သည် ထိုအသုံးပြုသူသည် ယင်းအုပ်စုတွင် မပါဝင်ကြောင်း ဆိုလိုသည်။\n* ခရေပွင့် * အမှတ်အသားသည် အုပ်စုတစ်ခုအတွင်းသို့ ထည့်သွင်းပြီးပါက ပြန်လည် ဖယ်ရှားမရနိုင်ကြောင်း (အပြန်အလှန်) ကို ဆိုလိုသည်။\n* သင်္ကေတ # အမှတ်အသားသည် ဤအုပ်စုအဖွဲ့ဝင် သက်တမ်းကို ပြန်လည်ထည့်သွင်းနိုင်ပြီး ရှေ့တိုးပေးရန် မဖြစ်နိုင်ကြောင်း ဖော်ပြသည်။", "userrights-reason": "အ​ကြောင်း​ပြ​ချက်:", + "userrights-no-interwiki": "အခြားဝီကီများ၌ အသုံးပြုသူ အခွင့်ရေးများကို တည်းဖြတ်ရန် သင့်တွင် ခွင့်ပြုချက်မရှိပါ။", "userrights-changeable-col": "သင်ပြောင်းလဲပေးနိုင်သောအုပ်စုများ", "userrights-unchangeable-col": "သင်ပြောင်းလဲမပေးနိုင်သောအုပ်စုများ", + "userrights-expiry-current": "သက်တမ်းကုန်ချိန် $1", "userrights-expiry-none": "သက်တမ်းကုန်ဆုံးခြင်း မရှိ", + "userrights-expiry": "သက်တမ်းကုန်လွန်မည်:", + "userrights-expiry-othertime": "အခြားအချိန်:", + "userrights-expiry-options": "1 ရက်:1 day,၁ ပတ်:1 week,၁ လ:1 month,၃ လ:3 months,၆ လ:6 months,၁ နှစ်:1 year", + "userrights-invalid-expiry": "အုပ်စု \"$1\" အတွက် သက်တမ်းကုန်ချိန်မှာ မဆီလျော်ပါ။", + "userrights-expiry-in-past": "အုပ်စု \"$1\" အတွက် သက်တမ်းကုန်ချိန်မှာ အတိတ်ကဖြစ်သည်။", "group": "အုပ်စု -", "group-user": "အသုံးပြုသူများ", "group-autoconfirmed": "အလိုအလျောက် အတည်ပြုထားသော အသုံးပြုသူများ", "group-bot": "ဘော့များ", "group-sysop": "စီမံခန့်ခွဲသူများ", - "group-bureaucrat": "ဗျူရိုကရက်", + "group-bureaucrat": "ဗျူရိုကရက်များ", "group-all": "(အားလုံး)", "group-user-member": "{{GENDER:$1|အသုံးပြုသူ}}", "group-autoconfirmed-member": "{{GENDER:$1|အလိုအလျောက် အတည်ပြုထားသော အသုံးပြုသူ}}", @@ -831,9 +921,11 @@ "right-createpage": "စာမျက်နှာများကို ဖန်တီးရန် (ဆွေးနွေးချက်စာမျက်နှာများမဟုတ်)", "right-createtalk": "ဆွေးနွေးချက်စာမျက်နှာများ စတင်ရေးသားရန်", "right-createaccount": "အသုံးပြုသူအကောင့်အသစ်ကို ဖန်တီးရန်", + "right-autocreateaccount": "ပြင်ပအသုံးပြုသူ အကောင့်တစ်ခုဖြင့် အလိုအလျောက် အကောင့်ထဲ ဝင်ရန်", "right-minoredit": "တည်းဖြတ်မှုများကို အရေးမကြီးဟု မှတ်သားရန်", "right-move": "စာမျက်နှာများကို ရွှေ့ပြောင်းပါ", "right-move-subpages": "စာမျက်နှာများကို ယင်းတို့၏စာမျက်နှာအခွဲတို့နှင့်တကွ ရွှေ့ရန်", + "right-move-categorypages": "ကဏ္ဍစာမျက်နှာများကို ရွေ့ရန်", "right-movefile": "ဖိုင်များရွှေ့ရန်", "right-suppressredirect": "စာမျက်နှာများကို ရွှေ့သောအခါ မူရင်းစာမျက်နှာတို့မှ ပြန်ညွှန်းများ မဖန်တီးရန်", "right-upload": "ဖိုင်များတင်ရန်", @@ -853,8 +945,14 @@ "right-hideuser": "အသုံးပြုသူအမည်ကို ပိတ်ပင်ရန်နှင့် ယင်းအမည်ကို အများမမြင်နိုင်အောင် ဝှက်ထားရန်", "right-unblockself": "ကိုယ့်ကိုကိုယ် ပြန်မပိတ်ပင်ရန်", "right-protect": "ကာကွယ်မှုအဆင့် ပြောင်းလဲရန်နှင့် သွယ်ဖြာ-ကာကွယ်ထားသည့် စာမျက်နှာများကို တည်းဖြတ်ရန်", + "right-editcontentmodel": "စာမျက်နှာ၏ မာတိကာမော်ဒယ်ကို ပြင်ဆင်ရန်", "right-editusercss": "အခြားအသုံးပြုသူများ၏ CSS ဖိုင်ကို တည်းဖြတ်ရန်", "right-edituserjs": "အခြားအသုံးပြုသူများ၏ JavaScript ဖိုင်ကို တည်းဖြတ်ရန်", + "right-viewmywatchlist": "သင်၏ကိုယ်ပိုင် စောင့်ကြည့်စာရင်းကို ကြည့်ရန်", + "right-viewmyprivateinfo": "သင်၏ကိုယ်ပိုင် ပုဂ္ဂလိကဒေတာကို ကြည့်ရန် (ဥပမာ - အီးမေးလ်လိပ်စာ၊ နာမည်ရင်း)", + "right-editmyprivateinfo": "သင်၏ကိုယ်ပိုင် ပုဂ္ဂလိကဒေတာကို ပြင်ရန် (ဥပမာ - အီးမေးလ်လိပ်စာ၊ နာမည်ရင်း)", + "right-editmyoptions": "သင်၏ကိုယ်ပိုင် အပြင်အဆင်များကို ပြင်ရန်", + "right-markbotedits": "နောက်ပြန်ပြင်သော တည်းဖြတ်မှုများကို ဘော့တည်းဖြတ်မှုအဖြစ် မှတ်သားရန်", "right-import": "အခြားဝီကီများမှ စာမျက်နှာများကို ထည့်သွင်းရန်", "right-importupload": "Upload တင်လိုက်သော ဖိုင်တစ်ခုမှ စာမျက်နှာများကို ထည့်သွင်းရန်", "right-patrol": "အခြားသောတည်းဖြတ်မှုများကို စောင့်ကြည့်နေသည်ဟု မှတ်သားရန်", @@ -863,8 +961,20 @@ "right-userrights": "အသုံးပြုသူ၏အခွင့်အရေးများအားလုံးကို တည်းဖြတ်ရန်", "right-userrights-interwiki": "အခြားဝီကီများမှ အသုံးပြုသူများ၏ အသုံးပြုသူအခွင့်အရေးများကို တည်းဖြတ်ရန်", "right-sendemail": "အခြားအသုံးပြုသူများကို အီးမေးပို့ရန်", + "grant-group-email": "အီးမေးလ် ပို့ရန်", "grant-blockusers": "အသုံးပြုသူများအား ပိတ်ပင်ခြင်းနှင့် ပိတ်ပင်မှု ဖယ်ရှားခြင်း", + "grant-createaccount": "အကောင့်များ ဖန်တီးရန်", + "grant-createeditmovepage": "စာမျက်နှာများကို ဖန်တီး၊ တည်းဖြတ်၊ ရွေ့ပြောင်းရန်", + "grant-editmyoptions": "သင်၏အသုံးပြုသူ အပြင်အဆင်များကို ပြင်ရန်", "grant-editmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်", + "grant-editpage": "ရှိပြီးသား စာမျက်နှာများကို တည်းဖြတ်ရန်", + "grant-editprotected": "ကာကွယ်ထားသော စာမျက်နှာများကို တည်းဖြတ်ရန်", + "grant-protect": "ကာကွယ်ထားသော နှင့် မကာကွယ်ထားသော စာမျက်နှာများ", + "grant-sendemail": "အခြားအသုံးပြုသူများကို အီးမေးပို့ရန်", + "grant-uploadfile": "ဖိုင်အသစ်များ တင်ရန်", + "grant-basic": "အခြေခံ ရပိုင်ခွင့်များ", + "grant-viewdeleted": "ဖျက်ထားသော ဖိုင်နှင့်စာမျက်နှာများကို ကြည့်ရန်", + "grant-viewmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို ကြည့်ရန်", "newuserlogpage": "အသုံးပြုသူအသစ်ရောက်လာခြင်း မှတ်တမ်း", "newuserlogpagetext": "ဤသည်မှာ အသုံးပြုသူအသစ် ဖန်တီးမှု မှတ်တမ်း ဖြစ်သည်။", "rightslog": "အသုံးပြုသူ၏ အခွင့်အရေးများ မှတ်တမ်း", @@ -874,9 +984,11 @@ "action-createpage": "ဤစာမျက်နှာကို ဖန်တီးရန်", "action-createtalk": "ဤဆွေးနွေးချက်စာမျက်နှာကို ဖန်တီးရန်", "action-createaccount": "ဤအသုံးပြုသူအကောင့်ကို ဖန်တီးရန်", + "action-history": "ဤစာမျက်နှာ၏ရာဇဝင်ကို ကြည့်ရန်", "action-minoredit": "ဤတည်းဖြတ်မှုကို အရေးမကြီးဟု မှတ်သားရန်", "action-move": "ဤစာမျက်နှာကို ရွှေ့ပြောင်းရန်", "action-move-subpages": "ဤစာမျက်နှာကို ၎င်း၏စာမျက်နှာခွဲများနှင့်တကွ ရွှေ့ရန်", + "action-move-categorypages": "ကဏ္ဍစာမျက်နှာများကို ရွေ့ရန်", "action-movefile": "ဤဖိုင်ကို ရွှေ့ရန်", "action-upload": "ဤဖိုင်ကို Upload တင်ရန်", "action-reupload": "ဤရှိပြီးသားဖိုင်ကို ထပ်ရေးရန်", @@ -898,10 +1010,13 @@ "action-userrights": "အသုံးပြုသူ၏အခွင့်အရေးများအားလုံးကို တည်းဖြတ်ရန်", "action-userrights-interwiki": "အခြားဝီကီများမှ အသုံးပြုသူများ၏ အသုံးပြုသူအခွင့်အရေးများကို တည်းဖြတ်ရန်", "action-sendemail": "အီးမေးများ ပို့ရန်", + "action-editmyoptions": "သင်၏ ရွေးချယ်စရာများကို ပြင်ရန်", "action-editmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်", "action-viewmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို ကြည့်ရန်", + "action-editcontentmodel": "စာမျက်နှာ၏ မာတိကာမော်ဒယ်ကို ပြင်ဆင်ရန်", "action-purge": "ဤစာမျက်နှာကို ရှင်းသန့်ရန်", "nchanges": "ပြောင်းလဲချက် $1 {{PLURAL:$1|ခု|ခု}}", + "enhancedrc-since-last-visit": "{{PLURAL:$1|သင် နောက်ဆုံးရောက်လာခဲ့ကတည်းက}} $1", "enhancedrc-history": "ရာဇဝင်", "recentchanges": "လတ်တလော အပြောင်းအလဲများ", "recentchanges-legend": "လတ်တလော အပြောင်းအလဲများအတွက် ရွေးချယ်စရာများ", @@ -920,31 +1035,45 @@ "rcfilters-legend-heading": "အတိုကောက်များ စာရင်း:", "rcfilters-other-review-tools": "အခြား ဆန်းစစ်ကိရိယာများ", "rcfilters-group-results-by-page": "စာမျက်နှာအလိုက် ရလဒ်များ အုပ်စုဖွဲ့ရန်", - "rcfilters-activefilters": "သက်ဝင်နေသာ filter များ", - "rcfilters-advancedfilters": "အဆင့်မြင့် filter များ", + "rcfilters-activefilters": "သက်ဝင်နေသာ စိစစ်မှုများ", + "rcfilters-activefilters-hide": "ဝှက်", + "rcfilters-activefilters-show": "ပြ", + "rcfilters-advancedfilters": "အဆင့်မြင့် စိစစ်မှုများ", "rcfilters-limit-title": "ပြသမည့် ရလဒ်များ", + "rcfilters-limit-and-date-label": "$2 $1 {{PLURAL:$1|ပြောင်းလဲမှု|ပြောင်းလဲမှုများ}}", + "rcfilters-date-popup-title": "ရှာဖွေရန် အချိန်ကာလ", "rcfilters-days-title": "မကြာသေးမီက ရက်များ", "rcfilters-hours-title": "မကြာသေးမီက နာရီများ", "rcfilters-days-show-days": "$1 {{PLURAL:$1|ရက်|ရက်}}", "rcfilters-days-show-hours": "$1 {{PLURAL:$1|နာရီ|နာရီ}}", - "rcfilters-quickfilters": "သိမ်းထားသော filter များ", - "rcfilters-quickfilters-placeholder-title": "မည်သည့် filter မှ မသိမ်းရသေးပါ", - "rcfilters-savedqueries-defaultlabel": "သိမ်းထားသော filter များ", + "rcfilters-highlighted-filters-list": "မီးမောင်းထိုးပြထားသည်: $1", + "rcfilters-quickfilters": "သိမ်းထားသော စိစစ်မှုများ", + "rcfilters-quickfilters-placeholder-title": "မည်သည့် စိစစ်မှုမှ မသိမ်းရသေးပါ", + "rcfilters-savedqueries-defaultlabel": "သိမ်းထားသော စိစစ်မှုများ", "rcfilters-savedqueries-rename": "အမည်ပြန်ပြောင်းရန်", "rcfilters-savedqueries-setdefault": "မူလပုံသေအဖြစ် သတ်မှတ်ရန်", "rcfilters-savedqueries-unsetdefault": "မူလပုံသေအဖြစ်မှ ဖယ်ရှားရန်", - "rcfilters-savedqueries-remove": "ဖယ်ရှားရန်", + "rcfilters-savedqueries-remove": "ဖျက်ရန်", "rcfilters-savedqueries-new-name-label": "အမည်", - "rcfilters-savedqueries-new-name-placeholder": "filter ၏ ရည်ရွယ်ချက်ကို ဖော်ပြရန်", - "rcfilters-savedqueries-apply-label": "filter ဖန်တီးရန်", - "rcfilters-savedqueries-apply-and-setdefault-label": "မူလပုံသေ filter ဖန်တီးရန်", + "rcfilters-savedqueries-new-name-placeholder": "စိစစ်မှု၏ ရည်ရွယ်ချက်ကို ဖော်ပြရန်", + "rcfilters-savedqueries-apply-label": "စိစစ်မှု ဖန်တီးရန်", + "rcfilters-savedqueries-apply-and-setdefault-label": "မူလပုံသေ စိစစ်မှုကို ဖန်တီးရန်", "rcfilters-savedqueries-cancel-label": "မလုပ်တော့ပါ", - "rcfilters-savedqueries-add-new-title": "လက်ရှိ filter အပြင်အဆင်များ သိမ်းရန်", - "rcfilters-restore-default-filters": "မူလပုံသေ filter များအတိုင်း ပြန်ထားရန်", - "rcfilters-clear-all-filters": "filter များအားလုံး ရှင်းလင်းရန်", + "rcfilters-savedqueries-add-new-title": "လက်ရှိ စိစစ်မှုအပြင်အဆင်များကို သိမ်းရန်", + "rcfilters-restore-default-filters": "မူလပုံသေ စိစစ်မှုများအတိုင်း ပြန်ထားရန်", + "rcfilters-clear-all-filters": "စိစစ်မှုများအားလုံး ရှင်းလင်းရန်", "rcfilters-show-new-changes": "နောက်ဆုံး ပြောင်းလဲမှုများကို ကြည့်ရန်", - "rcfilters-invalid-filter": "မရေရာသော filter", + "rcfilters-search-placeholder": "စိစစ်မှုစနစ် အပြောင်းအလဲများ (စိစစ်စနစ်အမည်အတွက် menu သို့မဟုတ် ရှာဖွေခလုတ်ကို အသုံးပြုပါ)", + "rcfilters-invalid-filter": "မရေရာသော စိစစ်မှု", + "rcfilters-empty-filter": "သက်ဝင်နေသော စိစစ်မှုစနစ်များ မရှိပါ။ ပံ့ပိုးမှုအားလုံးကို ပြသထားသည်။", + "rcfilters-filterlist-title": "စိစစ်မှုများ", + "rcfilters-filterlist-whatsthis": "အဲဒါက ဘယ်လိုလုပ်ဆောင်ပါသလဲ?", + "rcfilters-filterlist-feedbacklink": "ဤစိစစ်မှုကိရိယာများအကြောင်း မည်ကဲ့သို့ထင်မြင်သနည်း ပြောပြပါ", + "rcfilters-highlightbutton-title": "မီးမောင်းထိုးပြထားသော ရလဒ်များ", "rcfilters-highlightmenu-title": "အရောင်တစ်ခု ရွေးချယ်ပါ", + "rcfilters-highlightmenu-help": "ဤဂုဏ်အင်ကို မီးမောင်းထိုးပြရန် အရောင်တစ်ခုရွေးပါ", + "rcfilters-filterlist-noresults": "စိစစ်မှုများ မတွေ့ရှိပါ", + "rcfilters-filtergroup-authorship": "ပံ့ပိုးမှု စာပေလက်ရာ", "rcfilters-filter-editsbyself-label": "သင်၏ ပြောင်းလဲမှုများ", "rcfilters-filter-editsbyself-description": "သင်၏ ဆောင်ရွက်ချက်များ။", "rcfilters-filter-editsbyother-label": "အခြားသူများ၏ ပြောင်းလဲမှုများ", @@ -967,6 +1096,9 @@ "rcfilters-filter-humans-description": "လူတည်းဖြတ်သူများ၏ တည်းဖြတ်မှုများ။", "rcfilters-filtergroup-reviewstatus": "အခြေအနေ သုံးသပ်ရန်", "rcfilters-filter-reviewstatus-unpatrolled-label": "မစောင့်ကြည့်မစစ်ဆေးရသေး", + "rcfilters-filter-reviewstatus-manual-label": "လူကိုယ်တိုင် စောင့်ကြပ်စစ်ဆေးပြီး", + "rcfilters-filter-reviewstatus-auto-label": "အလိုအလျောက် စောင့်ကြပ်စစ်ဆေးပြီး", + "rcfilters-filtergroup-significance": "အရေးပါထင်ရှားမှု", "rcfilters-filter-minor-label": "အရေးမကြီးသည့် တည်းဖြတ်မှုများ", "rcfilters-filter-minor-description": "အရေးမကြီးဟု မှတ်သားလိုက်သော တည်းဖြတ်မှုများ။", "rcfilters-filter-major-label": "အရေးမကြီး မဟုတ်သော တည်းဖြတ်မှုများ", @@ -1003,12 +1135,15 @@ "rcfilters-view-tags": "စာတွဲမှတ်ထားသော တည်းဖြတ်မှုများ", "rcfilters-view-namespaces-tooltip": "အမည်ညွှန်းအလိုက် ရလဒ်များ စစ်ထုတ်ရန်", "rcfilters-view-tags-tooltip": "တည်းဖြတ်စာတွဲများ အသုံးပြု၍ ရလဒ်များ စစ်ထုတ်ရန်", - "rcfilters-view-return-to-default-tooltip": "ပင်မ filter မီနူးသို့ ပြန်သွားရန်", + "rcfilters-view-return-to-default-tooltip": "ပင်မ စိစစ်မှုမီနူးသို့ ပြန်သွားရန်", "rcfilters-view-tags-help-icon-tooltip": "စာတွဲမှတ်ထားသော တည်းဖြတ်မှုများအကြောင်း ပိုမိုလေ့လာရန်", + "rcfilters-liveupdates-button": "အချိန်နှင့်တစ်ပြေးညီ မွမ်းမံမှုများ", + "rcfilters-liveupdates-button-title-on": "အချိန်နှင့်တစ်ပြေးညီ မွမ်းမံမှုများကို ပိတ်ရန်", "rcfilters-liveupdates-button-title-off": "ပြောင်းလဲမှုအသစ် ဖြစ်ပေါ်တိုင်း ပြသရန်", "rcfilters-watchlist-markseen-button": "ပြောင်းလဲမှုများအားလုံးကို ကြည့်ရှုပြီးကြောင်း မှတ်သားရန်", "rcfilters-watchlist-edit-watchlist-button": "သင့်စောင့်ကြည့်စာရင်းရှိ စာမျက်နှာများစာရင်းအား တည်းဖြတ်ရန်", "rcfilters-watchlist-showupdated": "သင်နောက်ဆုံးကြည့်ရှုခဲ့ပြီးနောက် ပြောင်းလဲမှုရှိခဲ့သော စာမျက်နှာများကို စာလုံးမဲ ဖြင့် ပြသထားသည်။", + "rcfilters-target-page-placeholder": "စာမျက်နှာနာမည် (သို့မဟုတ် ကဏ္ဍ) ရိုက်ထည့်ပါ", "rcnotefrom": "အောက်ပါတို့မှာ $3၊ $4 မှစ၍ {{PLURAL:$5|ပြောင်းလဲမှု|ပြောင်းလဲမှုများ}} ဖြစ်သည် ($1 အထိ ပြထား)။", "rclistfromreset": "ရက်စွဲရွေးချယ်မှုအား ပြန်စရန်", "rclistfrom": "$3 $2 မှစသော အပြောင်းအလဲအသစ်များကို ပြရန်", @@ -1070,7 +1205,7 @@ "upload-permitted": "ခွင့်ပြုထားသော ဖိုင် {{PLURAL:$2|အမျိုးအစား|အမျိုးအစားများ}}: $1။", "upload-preferred": "အလေးပေးထားသော ဖိုင် {{PLURAL:$2|အမျိုးအစား|အမျိုးအစားများ}}: $1။", "upload-prohibited": "တားမြစ်ထားသော ဖိုင် {{PLURAL:$2|အမျိုးအစား|အမျိုးအစားများ}}: $1။", - "uploadlogpage": "Upload တင်သည့် မှတ်တမ်း", + "uploadlogpage": "ဖိုင်တင်သည့် မှတ်တမ်း", "uploadlogpagetext": "အောက်ပါတို့သည် မကြာမီက upload လုပ်ထားသော ဖိုင်စာရင်း ဖြစ်သည်။\nပိုမို၍ ခြုံငုံသုံးသပ်ကြည့်ရှုနိုင်ရန် [[Special:NewFiles|ဖိုင်အသစ်များ ပြခန်း]]ကို ကြည့်ပါ။", "filename": "ဖိုင်အမည်", "filedesc": "အကျဉ်းချုပ်", @@ -1097,6 +1232,7 @@ "largefileserver": "ဤဖိုင်သည် ဆာဗာတွင် ခွင့်ပြုရန်သတ်မှတ်ထားသော ဖိုင်အရွယ်အစားထက် ကြီးနေသည်။", "file-exists-duplicate": "ဤဖိုင်သည် အောက်ပါ {{PLURAL:$1|ဖိုင်|ဖိုင်များ}}၏ ထပ်တူပုံပွား ဖြစ်သည် -", "uploadwarning": "Upload တင်ရာတွင် သတိပေးချက်", + "uploadwarning-text": "ဖိုင်ဖော်ပြချက်ကို အောက်တွင် ပြုပြင်ပြီး ထပ်မံကြိုးစားပါ။", "savefile": "ဖိုင်သိမ်းရန်", "uploaddisabled": "Upload တင်ခြင်း ပိတ်ထားသည်။", "copyuploaddisabled": "URL လင့်မှ Upload တင်ခြင်း ပိတ်ထားသည်။", @@ -1111,7 +1247,35 @@ "upload-options": "Upload တင်သည့် ရွေးချယ်မှုများ", "watchthisupload": "ဤဖိုင်အား စောင့်ကြည့်ရန်", "upload-misc-error": "upload တင်ရာတွင် အမည်မသိ အမှား", + "upload-dialog-title": "ဖိုင်​တင်​ရန်​", + "upload-dialog-button-cancel": "မလုပ်တော့ပါ", + "upload-dialog-button-back": "နောက်သို့", + "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-invalidpath": "\"$1\" သည် ကျိုးကြောင်းညီညွတ်သော သိုလှောင်လမ်းကြောင်းမဟုတ်ပါ။", + "backend-fail-delete": "ဖိုင် \"$1\" ကို မဖျက်နိုင်ခဲ့ပါ။", + "backend-fail-describe": "ဖိုင် \"$1\" အတွက် မေတာဒေတာကို မပြောင်းလဲနိုင်ခဲ့ပါ။", + "backend-fail-alreadyexists": "ဖိုင် \"$1\" ရှိနှင့်ပြီးဖြစ်သည်။", + "backend-fail-store": "\"$2\" တွင် \"$1\" ဖိုင်ကို မသိုလှောင်နိုင်ခဲ့ပါ။", + "backend-fail-copy": "ဖိုင် \"$1\" ကို \"$2\" သို့ ကော်ပီကူးမရပါ။", + "backend-fail-move": "ဖိုင် \"$1\" ကို \"$2\" သို့ မပြောင်းရွေ့နိုင်ခဲ့ပါ။", + "backend-fail-opentemp": "ယာယီဖိုင်ကို မဖွင့်နိုင်ခဲ့ပါ။", + "backend-fail-writetemp": "ယာယီဖိုင်ကို မရေးနိုင်ခဲ့ပါ။", + "backend-fail-closetemp": "ယာယီဖိုင်ကို မပိတ်နိုင်ခဲ့ပါ။", + "backend-fail-read": "ဖိုင် \"$1\" ကို မဖတ်နိုင်ခဲ့ပါ။", + "backend-fail-create": "ဖိုင် \"$1\" ကို မရေးနိုင်ခဲ့ပါ။", + "uploadstash-bad-path": "လမ်းကြောင်း မတည်ရှိပါ။", + "uploadstash-bad-path-invalid": "လမ်းကြောင်းသည် ဆီလျော်မှုမရှိပါ။", "img-auth-accessdenied": "ဝင်ရောက်ခြင်းကို ငြင်းပယ်လိုက်သည်", "img-auth-nofile": "\"$1\" ဟူသည့်ဖိုင် မရှိပါ။", "img-auth-streaming": "\"$1\" ကို စထရင်းမင်း ဆွဲနေသည်။", @@ -1120,10 +1284,14 @@ "license": "လိုင်စင်သတ်မှတ်ခြင်း -", "license-header": "လိုင်စင်သတ်မှတ်ခြင်း", "nolicense": "ဘာမှရွေးချယ်မထားပါ", + "licenses-edit": "လိုင်စင် ရွေးစရာများကို ပြင်ဆင်ရန်", "license-nopreview": "(နမူနာ မရနိုင်ပါ)", "upload_source_url": "တရားဝင်၍ အများပြည်သူ သုံးစွဲခွင့်ရှိသော URL လင့်တစ်ခုမှ သင်ရွေးချယ်ထားသည့် File", "upload_source_file": "(သင်ရွေးချယ်ထားသော သင့်ကွန်ပျူတာမှ ဖိုင်တစ်ခု)", + "listfiles-delete": "ဖျက်", + "listfiles-summary": "ဤအထူးစာမျက်နှာသည် တင်ထားသောဖိုင်အားလုံးကို ပြသပေးသည်။", "listfiles_search_for": "မီဒီယာအမည်ကို ရှာရန် -", + "listfiles-userdoesnotexist": "အသုံးပြုသူအကောင့် \"$1\" သည် မှတ်ပုံမတင်ထားပါ။", "imgfile": "ဖိုင်", "listfiles": "ဖိုင်စာရင်း", "listfiles_thumb": "နမူနာပုံငယ်", @@ -1133,6 +1301,9 @@ "listfiles_size": "အရွယ်အစား", "listfiles_description": "ဖော်ပြချက်", "listfiles_count": "ဗားရှင်းများ", + "listfiles-latestversion": "လက်ရှိဗားရှင်း", + "listfiles-latestversion-yes": "မှန်", + "listfiles-latestversion-no": "မဟုတ်", "file-anchor-link": "ဖိုင်", "filehist": "ဖိုင်မှတ်တမ်း", "filehist-help": "ဖိုင်ကို ယင်းနေ့စွဲ အတိုင်း မြင်နိုင်ရန် နေ့စွဲ/အချိန် တစ်ခုခုပေါ်တွင် ကလစ်နှိပ်ပါ။", @@ -1149,13 +1320,17 @@ "filehist-filesize": "ဖိုင်ဆိုက်", "filehist-comment": "မှတ်ချက်", "imagelinks": "ဖိုင်သုံးစွဲမှု", - "linkstoimage": "ဤဖိုင်သို့ အောက်ပါ {{PLURAL:$1|စာမျက်နှာလင့်|စာမျက်နှာလင့် $1 ခု}} -", - "linkstoimage-more": "ဤဖိုင်သို့ {{PLURAL:$1|စာမျက်နှာ အချိတ်အဆက်များ|စာမျက်နှာ အချိတ်အဆက်}} $1 ခု ထက်မက ချိတ်ဆက်ထားသည်။\nအောက်ပါစာရင်းသည် ဤဖိုင်သို့ ချိတ်ဆက်ထားသော {{PLURAL:$1|ပထမ စာမျက်နှာ အချိတ်အဆက်|ပထမ စာမျက်နှာ အချိတ်အဆက်များ}}ကိုသာ ပြသထားသည်။\n[[Special:WhatLinksHere/$2|စာရင်းအပြည့်အစုံ]]လည်း ရရှိနိုင်ပါသည်။", - "nolinkstoimage": "ဤဖိုင်သို့လင့်ထားသော စာမျက်နှာမရှိပါ။", + "linkstoimage": "အောက်ပါ {{PLURAL:$1|စာမျက်နှာ|$1 စာမျက်နှာများ}} သည် ဤဖိုင်ကို အသုံးပြုထားသည်:", + "linkstoimage-more": "ဤဖိုင်သို့ {{PLURAL:$1|စာမျက်နှာ|စာမျက်နှာများ}} $1 ခုထက်မက အသုံးပြုထားသည်။\nအောက်ပါစာရင်းသည် ဤဖိုင်တစ်ခုတည်းကိုသာ အသုံးပြုထားသော {{PLURAL:$1|ပထမဆုံး စာမျက်နှာ|ပထမဆုံး $1 စာမျက်နှာများ}}ကိုသာ ပြသထားသည်။\n[[Special:WhatLinksHere/$2|စာရင်းအပြည့်အစုံ]]လည်း ရရှိနိုင်ပါသည်။", + "nolinkstoimage": "ဤဖိုင်ကို အသုံးပြုထားသော စာမျက်နှာများမရှိပါ။", "morelinkstoimage": "ဤဖိုင်သို့[[Special:WhatLinksHere/$1|နောက်ထပ်လင့်များ]] ကိုကြည့်ပါ။", "linkstoimage-redirect": "$1 (ဖိုင်ပြန်ညွှန်း) $2", + "duplicatesoffile": "ဤဖိုင်၏ အောက်ပါ {{PLURAL:$1|ဖိုင်သည်|$1 ဖိုင်များသည်}} ထပ်နေသည်([[Special:FileDuplicateSearch/$2|ပို၍အသေးစိတ်]]):", "sharedupload": "ဤဖိုင်သည် $1 မှဖြစ်ပြီး အခြားပရောဂျက်များတွင် သုံးကောင်းသုံးလိမ့်မည်။", + "sharedupload-desc-there": "ဤဖိုင်သည် $1 မှဖြစ်ပြီး အခြားပရောဂျက်များတွင်လည်း အသုံးပြုနိုင်သည်။ နောက်ထပ်အချက်အလက်အတွက် [$2 ဖိုင်ဖော်ပြချက် စာမျက်နှာ]ကို ကြည့်ပါ။", "sharedupload-desc-here": "ဤဖိုင်သည် $1 မှဖြစ်ပြီး အခြားပရောဂျက်များတွင် သုံးကောင်းသုံးလိမ့်မည်။\nယင်း၏ [$2 ဖိုင်အကြောင်းစာမျက်နှာ] တွင် ဖော်ပြထားချက်ကို အောက်တွင် ပြထားသည်။", + "sharedupload-desc-edit": "ဤဖိုင်သည် $1 မှဖြစ်ပြီး အခြားပရောဂျက်များတွင်လည်း အသုံးပြုနိုင်သည်။ [$2 ဖိုင်ဖော်ပြချက် စာမျက်နှာ]ပေါ်ရှိ ဖော်ပြချက်ကို တည်းဖြတ်နိုင်သည်။", + "sharedupload-desc-create": "ဤဖိုင်သည် $1 မှဖြစ်ပြီး အခြားပရောဂျက်များတွင်လည်း အသုံးပြုနိုင်သည်။ [$2 ဖိုင်ဖော်ပြချက် စာမျက်နှာ]ပေါ်ရှိ ဖော်ပြချက်ကို တည်းဖြတ်နိုင်သည်။", "filepage-nofile": "ဤအမည်ဖြင့် မည်သည့်ဖိုင်မှ မရှိပါ။", "filepage-nofile-link": "ဤအမည်ဖြင့် မည်သည့်ဖိုင်မှ မရှိပါ။ သိုရာတွင် ယင်းကို [$1 upload တင်]နိုင်သည်။", "uploadnewversion-linktext": "ဤဖိုင်၏ နောက်ဆုံး version ကို upload တင်ရန်", @@ -1175,7 +1350,10 @@ "filedelete-nofile": "'''$1''' မရှိပါ။", "filedelete-otherreason": "အခြားသော/နောက်ထပ် အကြောင်းပြချက် -", "filedelete-reason-otherlist": "အခြား အကြောင်းပြချက်", + "filedelete-reason-dropdown": "*ယေဘုယျ ဖျက်ပစ်ခြင်း အကြောင်းပြချက်များ\n** မူပိုင်ခွင့် ချိုးဖောက်\n*** ထပ်နေသောဖိုင်", "filedelete-edit-reasonlist": "ဖျက်ပစ်လိုက်ရသော အကြောင်းရင်းများကို တည်းဖြတ်ရန်", + "filedelete-maintenance": "ထိန်းပြင်လုပ်နေစဉ် ဖိုင်များ ဖျက်ခြင်း၊ ပြန်လည်ဆယ်ယူခြင်းကို ယာယီပိတ်ထားသည်။", + "filedelete-maintenance-title": "ဖိုင်ကို မဖျက်နိုင်ပါ", "mimesearch": "MIME ရှာဖွေခြင်း", "mimetype": "MIME အမျိုးအစား -", "download": "ဒေါင်းလုဒ်", @@ -1186,7 +1364,11 @@ "unusedtemplateswlh": "အခြားလင့်ခ်များ", "randompage": "ကျပန်းစာမျက်နှာ", "randomincategory": "ကဏ္ဍတွင်းရှိ ကျပန်း စာမျက်နှာ", + "randomincategory-invalidcategory": "\"$1\" သည် ဆီလျော်သော ကဏ္ဍအမည်မဟုတ်ပါ။", + "randomincategory-nopages": "ကဏ္ဍ [[:Category:$1|$1]] ထဲတွင် စာမျက်နှာများ မရှိပါ။", "randomincategory-category": "ကဏ္ဍ:", + "randomincategory-legend": "ကဏ္ဍထဲရှိ ကျပန်းစာမျက်နှာ", + "randomincategory-submit": "သွားပါ", "randomredirect": "ကျပန်းပြန်ညွှန်း", "randomredirect-nopages": "အမည်ညွှန်း \"$1\" တွင် ပြန်ညွှန်းမရှိပါ။", "statistics": "စာရင်းအင်း", @@ -1203,6 +1385,13 @@ "statistics-users": "မှတ်ပုံတင်ထားသော အသုံးပြုသူများ", "statistics-users-active": "လက်ရှိလုပ်ကိုင်နေသော အသုံးပြုသူများ", "statistics-users-active-desc": "နောက်ဆုံး {{PLURAL:$1|ရက်|$1 ရက်}}အတွင်း ဆောင်ရွက်ချက်ရှိသည့် အသုံးပြုသူများ", + "pageswithprop": "စာမျက်နှာဂုဏ်အင်တစ်ခုနှင့် စာမျက်နှာများ", + "pageswithprop-legend": "စာမျက်နှာဂုဏ်အင်တစ်ခုနှင့် စာမျက်နှာများ", + "pageswithprop-text": "ဤစာမျက်နှာသည် တစ်ခုချင်းအလိုက် စာမျက်နှာဂုဏ်အင်ကို အသုံးပြုသည့် စာမျက်နှာများကို စာရင်းပြုစုထားသည်။", + "pageswithprop-prop": "ဂုဏ်အင်အမည်:", + "pageswithprop-reverse": "ပြောင်းပြန်အစဉ်လိုက် စီရန်", + "pageswithprop-sortbyvalue": "ဂုဏ်အင်တန်ဖိုးအလိုက် စီရန်", + "pageswithprop-submit": "သွားပါ", "doubleredirects": "နှစ်ဆင့်ပြန် ပြန်ညွှန်းများ", "double-redirect-fixed-move": "[[$1]] ကို ရွှေ့ပြောင်းပြီးဖြစ်သည်။ ၎င်းအား အလိုအလျောက် ပြင်ဆင်ပြီး [[$2]] သို့ ပြန်ညွှန်းထားသည်။", "double-redirect-fixer": "ပြန်ညွှန်းပြင်ဆင်သူ", @@ -1215,9 +1404,15 @@ "withoutinterwiki-submit": "ပြ", "fewestrevisions": "တည်းဖြတ်မူအနည်းဆုံး စာမျက်နှာများ", "nbytes": "$1 {{PLURAL:$1|ဘိုက်|ဘိုက်}}", + "ncategories": "$1 {{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍများ}}", "nlinks": "{{PLURAL:$1|လင့်|လင့်ခ်များ}} $1", "nmembers": "အဖွဲ့ဝင် $1 {{PLURAL:$1|ခု|ခု}}", + "nmemberschanged": "$1 → $2 {{PLURAL:$2|အဖွဲ့ဝင်|အဖွဲ့ဝင်များ}}", + "nrevisions": "$1 {{PLURAL:$1|ပြန်လည်ပြင်ဆင်မှု|ပြန်လည်ပြင်ဆင်မှုများ}}", + "nimagelinks": "$1 {{PLURAL:$1|စာမျက်နှာ|စာမျက်နှာများ}}ပေါ်တွင် သုံးထားသည်", + "ntransclusions": "$1 {{PLURAL:$1|စာမျက်နှာ|စာမျက်နှာများ}}ပေါ်တွင် သုံးထားသည်", "specialpage-empty": "ဤသတင်းပို့ချက်အတွက် ရလဒ်မရှိပါ။", + "lonelypages": "မိဘမဲ့ စာမျက်နှာများ", "uncategorizedpages": "ကဏ္ဍမခွဲထားသော စာမျက်နှာများ", "uncategorizedcategories": "ကဏ္ဍမခွဲထားသော ကဏ္ဍများ", "uncategorizedimages": "ကဏ္ဍမခွဲထားသော ဖိုင်များ", @@ -1232,6 +1427,7 @@ "mostlinkedcategories": "အများဆုံး လာရောက် ချိတ်ဆက်ထားသည့် ကဏ္ဍများ", "mostcategories": "ကဏ္ဍအများဆုံးပါသော စာမျက်နှာများ", "mostimages": "အများဆုံး လာရောက်ချိတ်ဆက်ထားသည့် ဖိုင်များ", + "mostinterwikis": "အပြန်အလှန်ချိတ်ဆက်ဝီကီအများဆုံးနှင့် စာမျက်နှာများ", "mostrevisions": "တည်းဖြတ်မှု အများဆုံး စာမျက်နှာများ", "prefixindex": "ရှေ့ဆုံးမှ prefix ပါသော စာမျက်နှာ အားလုံး", "prefixindex-submit": "ပြသရန်", @@ -1240,12 +1436,30 @@ "deadendpages": "လမ်းဆုံးနေသော (လင့်ခ်မချိတ်ထားသော) စာမျက်နှာများ", "deadendpagestext": "အောက်ပါ စာမျက်နှာများသည် {{SITENAME}} တွင် အခြား စာမျက်နှာများသို့ လင့်ခ်ချိတ်ဆက်ထားခြင်း မရှိပါ။", "protectedpages": "ကာကွယ်ထားသော စာမျက်နှာများ", + "protectedpages-filters": "စိစစ်မှုများ:", + "protectedpages-indef": "အနန္တ ကာကွယ်မှုများသာ", + "protectedpages-summary": "ဤစာမျက်နှာသည် လတ်တလော ကာကွယ်ထားသော စာမျက်နှာများကို စာရင်းပြုထားသည်။ ဖန်တီးခြင်းမှ ကာကွယ်ထားသည့် ခေါင်းစဉ်များစာရင်းအတွက် [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]ကို ကြည့်ပါ။", + "protectedpages-cascade": "အဆင့်ဆင့် ကာကွယ်မှုများသာ", "protectedpages-noredirect": "ပြန်ညွှန်းများအား ဝှက်ရန်", + "protectedpagesempty": "ဤပါရာမီတာများဖြင့် ကာကွယ်ထားသော လတ်တလော စာမျက်နှာများ မရှိပါ။", + "protectedpages-timestamp": "အချိန်တံဆိပ်", "protectedpages-page": "စာမျက်နှာ", + "protectedpages-expiry": "သက်တမ်းကုန်လွန်မည်", + "protectedpages-performer": "အသုံးပြုသူအား ကာကွယ်ခြင်း", + "protectedpages-params": "ကာကွယ်မှု ပါရာမီတာများ", + "protectedpages-reason": "အကြောင်းပြချက်", + "protectedpages-submit": "စာမျက်နှာများကို ပြရန်", + "protectedpages-unknown-timestamp": "မသိရှိပါ", + "protectedpages-unknown-performer": "အမည်မသိရသော အသုံးပြုသူ", "protectedtitles": "ကာကွယ်ထားသော ခေါင်းစဉ်များ", + "protectedtitles-summary": "ဤစာမျက်နှာသည် ဖန်တီးခြင်းမှ လတ်တလော ကာကွယ်ထားသော ခေါင်းစဉ်များကို စာရင်းပြုထားသည်။\nရှိနှင့်ပြီးသား စာမျက်နှာများအား ကာကွယ်ထားသည့်စာရင်းအတွက် [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]ကို ကြည့်ပါ။", + "protectedtitlesempty": "ဤပါရာမီတာများဖြင့် ကာကွယ်ထားသော လတ်တလော ခေါင်းစဉ်များ မရှိပါ။", + "protectedtitles-submit": "ခေါင်းစဉ်များကို ပြရန်", "listusers": "အသုံးပြုသူစာရင်း", "listusers-editsonly": "တည်းဖြတ်ထားဖူးသော အသုံးပြုသူများကိုသာ ဖော်ပြရန်", + "listusers-temporarygroupsonly": "ယာယီအသုံးပြုသူအုပ်စုများထဲရှိ အသုံးပြုသူများကိုသာ ပြရန်", "listusers-creationsort": "စတင်ရေးသားသည့်ရက်စွဲအလိုက် စီရန်", + "listusers-desc": "ကြီးစဉ်ငယ်လိုက် စီရန်", "usereditcount": "တည်းဖြတ်မှု $1 {{PLURAL:$1|ခု|ခု}}", "usercreated": "$1 $2 အချိန်တွင် {{GENDER:$3|ဖန်တီးခဲ့သည်}}", "newpages": "စာမျက်နှာအသစ်", @@ -1257,6 +1471,18 @@ "unusedimagestext": "အောက်ပါဖိုင်များသည် မည်သည့်စာမျက်နှာတွင်မှ သုံးစွဲထားခြင်း မရှိပါ။\nအခြားသော ဝက်ဘ်ဆိုဒ်များမှနေ၍ ဖိုင်တစ်ခုခုသို့ တိုက်ရိုက် URL ဖြင့် တိုက်ရိုက်ချိတ်ဆက်ထားခြင်း ရှိနေနိုင်ပြီး သုံးစွဲနေခြင်းမရှိသော်လည်း ဤနေရာတွင် ဖော်ပြထားနိုင်ကြောင်း ကျေးဇူးပြု၍ မှတ်သားပါ။", "pager-newer-n": "{{PLURAL:$1|ပိုသစ်သော တစ်ခု|ပိုသစ်သော $1 ခု}}", "pager-older-n": "{{PLURAL:$1|ပိုဟောင်းသော တစ်ခု|ပိုဟောင်းသော $1 ခု}}", + "apihelp-no-such-module": "မော်ဂျူး \"$1\" မတွေ့ရှိပါ။", + "apisandbox-reset": "ရှင်းလင်း", + "apisandbox-retry": "ပြန်လုပ်", + "apisandbox-helpurls": "အကူအညီလင့်ခ်များ", + "apisandbox-examples": "ဥပမာများ", + "apisandbox-dynamic-parameters": "နောက်ထပ် ပါရာမီတာများ", + "apisandbox-dynamic-parameters-add-label": "ပါရာမီတာ ပေါင်းထည့်ရန်:", + "apisandbox-dynamic-parameters-add-placeholder": "ပါရာမီတာ အမည်", + "apisandbox-results": "ရလဒ်များ", + "apisandbox-continue": "ဆက်လက်", + "apisandbox-continue-clear": "ရှင်းလင်း", + "apisandbox-multivalue-all-values": "$1 (တန်ဖိုးများအားလုံး)", "booksources": "မှီငြမ်း စာအုပ်များ", "booksources-search-legend": "စာအုပ်ရင်းမြစ်များကို ရှာရန်", "booksources-search": "ရှာဖွေရန်", @@ -1264,11 +1490,16 @@ "speciallogtitlelabel": "ရည်ရွယ်ရာ (ခေါင်းစဉ် သို့ {{ns:user}}:အသုံးပြုသူအတွက် အသုံးပြုအမည်):", "log": "မှတ်​တမ်း​များ​", "logeventslist-submit": "ပြသရန်", + "logeventslist-more-filters": "အခြားသော မှတ်တမ်းများကို ပြရန်:", + "logeventslist-patrol-log": "စောင့်ကြပ်စစ်ဆေးမှု မှတ်တမ်း", + "logeventslist-tag-log": "စာတွဲ မှတ်တမ်း", "all-logs-page": "အများနှင့်ဆိုင်သောမှတ်တမ်းအားလုံး", "alllogstext": "{{SITENAME}}၏ ရရှိနိုင်သော မှတ်တမ်းများအားလုံး ပေါင်းစည်းပြသခြင်း ဖြစ်သည်။\nမှတ်တမ်းအမျိုးအစား၊ အသုံးပြုသူအမည် (စာလုံးအကြီးအသေး)၊ သို့မဟုတ် သက်ဆိုင်ရာ စာမျက်နှာ (စာလုံးအကြီးအသေး) ကို ရွေးချယ်ခြင်းဖြင့် ကြည့်ရှုမှုကို အကျဉ်းချုံးနိုင်ပါသည်။", "logempty": "မှတ်တမ်းထဲတွင် ကိုက်ညီသော အရာများ မရှိပါ။", "showhideselectedlogentries": "ရွေးချယ်ထားသော မှတ်တမ်းများ၏ မြင်နိုင်မှုကို ပြောင်းလဲရန်", + "checkbox-select": "ရွေးချယ်: $1", "checkbox-all": "အားလုံး", + "checkbox-none": "ဘာမှမရှိ", "allpages": "စာမျက်နှာအားလုံး", "nextpage": "နောက်ထပ်စာမျက်နှာ ($1)", "prevpage": "ယခင် စာမျက်နှာ ($1)", @@ -1297,21 +1528,39 @@ "activeusers-intro": "ဤသည်မှာ နောက်ဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}အတွင်း တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူများ စာရင်း ဖြစ်သည်။", "activeusers-count": "{{PLURAL:$3|ရက်|$3 ရက်}}အတွင်း {{PLURAL:$1|လုပ်ဆောင်မှု|လုပ်ဆောင်မှု}} $1 ခု", "activeusers-from": "ဤမှစသော အသုံးပြုသူများကို ပြရန် -", + "activeusers-groups": "ဤအုပ်စုများနှင့်သက်ဆိုင်သော အသုံးပြုသူများကိုပြရန်:", + "activeusers-excludegroups": "ဤအုပ်စုများနှင့်သက်ဆိုင်သော အသုံးပြုသူများကို ချန်လှပ်ရန်:", "activeusers-noresult": "အသုံးပြုသူ မတွေ့ပါ။", + "activeusers-submit": "လတ်တလောအသုံးပြုသူများကို ပြသရန်", "listgrouprights": "အသုံးပြုသူအုပ်စု အခွင့်အရေးများ", + "listgrouprights-summary": "အောက်ပါတို့သည် ဤဝီကီတွင် သတ်မှတ်ထားသည့် အသုံးပြုသူအုပ်စုစာရင်းများနှင့် ယင်းတို့၏ ဆက်နွယ်သော အခွင့်အရေးများဖြစ်သည်။ သီးသန့်အခွင့်အရေးများအတွက် [[{{MediaWiki:Listgrouprights-helppage}}|ထပ်ဆောင်း သတင်းအချက်အလက်]] ရှိနိုင်ပါသည်။", + "listgrouprights-key": "မှတ်ချက်:\n* အပ်နှင်းပြီး အခွင့်အရေး\n* ရုတ်သိမ်းပြီး အခွင့်အရေး", "listgrouprights-group": "အုပ်စု", "listgrouprights-rights": "အခွင့်အရေးများ", + "listgrouprights-helppage": "Help:အုပ်စု ရပိုင်ခွင့်များ", "listgrouprights-members": "(အဖွဲ့ဝင်စာရင်း)", + "listgrouprights-addgroup": "{{PLURAL:$2|အုပ်စု|အုပ်စုများ}} ပေါင်းထည့်ရန်: $1", + "listgrouprights-removegroup": "{{PLURAL:$2|အုပ်စု|အုပ်စုများ}} ဖယ်ရှားရန်: $1", "listgrouprights-addgroup-all": "အုပ်စုအားလုံးကို ပေါင်းထည့်ရန်", "listgrouprights-removegroup-all": "အုပ်စုအားလုံးကို ဖယ်ရှားရန်", + "listgrouprights-addgroup-self": "ကိုယ်ပိုင်အကောင့်သို့ {{PLURAL:$2|အုပ်စု|အုပ်စုများ}} ပေါင်းထည့်ရန်: $1", + "listgrouprights-removegroup-self": "ကိုယ်ပိုင်အကောင့်သို့ {{PLURAL:$2|အုပ်စု|အုပ်စုများ}} ဖယ်ရှားရန်: $1", "listgrouprights-addgroup-self-all": "အုပ်စုအားလုံးကို မိမိ၏အကောင့်သို့ ပေါင်းထည့်ရန်", "listgrouprights-removegroup-self-all": "မိမိ၏အကောင့်မှ အုပ်စုအားလုံးကို ဖယ်ရှားရန်", + "listgrouprights-namespaceprotection-header": "အမည်ညွှန်း ကန့်သတ်ချက်များ", "listgrouprights-namespaceprotection-namespace": "အမည်ညွှန်း", + "listgrouprights-namespaceprotection-restrictedto": "အသုံးပြုသူကို တည်းဖြတ်ရန်ခွင့်ပြုသည့် အခွင့်အရေးများ", + "listgrants": "အပ်နှင်းမှုများ", + "listgrants-summary": "အောက်ပါတို့သည် အသုံးပြုသူအခွင့်အရေးများနှင့် ဆက်နွယ်သော အပ်နှင်းမှုများစာရင်းဖြစ်သည်။ အသုံးပြုသူသည် ပေးအပ်ထားသော ခွင့်ပြုချက်များဖြင့် အတိုင်းအတာတစ်ခုထိ အပလေကေးရှင်းကို ခိုင်းစေနိုင်ပါသည်။ အခွင့်အရေးသည် အသုံးပြုသူ၌ အမှန်တကယ်မရှိသော်လည်း အပလေကေးရှင်းသည် အသုံးပြုသူကိုယ်စား ဆောင်ရွက်ပေးခြင်းဖြစ်သည်။ သီးသန့်အခွင့်အရေးများအတွက် [[{{MediaWiki:Listgrouprights-helppage}}|ထပ်ဆောင်း သတင်းအချက်အလက်]] ရှိနိုင်ပါသည်။", + "listgrants-grant": "အပ်နှင်းမှု", + "listgrants-rights": "အခွင့်အရေးများ", "trackingcategories": "နောက်ယောင်ခံ ကဏ္ဍများ", "trackingcategories-msg": "နောက်ယောင်ခံ ကဏ္ဍ", + "trackingcategories-nodesc": "ဖော်ပြချက် မရရှိနိုင်ပါ။", "mailnologin": "ပို့ရန်လိပ်စာ မရှိပါ", "emailuser": "ဤအသုံးပြုသူအား အီးမေးပို့ပါ", "emailuser-title-target": "{{GENDER:$1|အသုံးပြုသူ}}ကို အီးမေးပို့ရန်", + "emailuser-title-notarget": "အသုံးပြုသူအား အီးမေးလ်ပို့ရန်", "defemailsubject": "{{SITENAME}} အသုံးပြုသူ \"$1\" ထံမှ အီးမေး", "usermaildisabled": "အသုံးပြုသူအီးမေးကို ပိတ်ထားသည်", "noemailtitle": "အီးမေးလိပ်စာ မရှိပါ", @@ -1334,14 +1583,21 @@ "watchlistfor2": "$1 အတွက် $2", "nowatchlist": "သင့်စောင့်ကြည့်စာရင်းမှာ ဘာမှ မရှိပါ။", "watchnologin": "logged in ဝင်မထားပါ", + "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": "ဤစာမျက်နှာကို စောင့်ကြည့်ရန်", "unwatch": "စောင့်မကြည့်ပါနှင့်", "unwatchthispage": "စောင့်ကြည့်ခြင်းကို ရပ်တန့်ရန်", "notanarticle": "မာတိကာစာမျက်နှာတစ်ခု မဟုတ်", "watchlist-details": "သင့်စောင့်ကြည့်စာရင်းတွင် (ဆွေးနွေးချက် စာမျက်နှာများ အပါအဝင်){{PLURAL:$1|စာမျက်နှာ $1 ခု|စာမျက်နှာ $1 ခု}} ရှိသည်။", + "wlheader-enotif": "အီးမေးလ် အသိပေးချက်ကို ဖွင့်ထားသည်။", "wlheader-showupdated": "သင် နောက်ဆုံးကြည့်ရှုခဲ့ပြီးနောက် ပြောင်းလဲမှုရှိခဲ့သော စာမျက်နှာများကို စာလုံးမဲ ဖြင့် ပြသထားသည်", "wlnote": "အောက်ပါတို့သည် $3၊ $4 အထိ နောက်ဆုံး {{PLURAL:$2|နာရီ|$2 နာရီ}}အတွင်း {{PLURAL:$1|နောက်ဆုံးပြောင်းလဲချက် တစ်ခု|နောက်ဆုံးပြောင်းလဲချက်များ $1 ခု}} ဖြစ်သည်။", "wlshowlast": "နောက်ဆုံး $1 နာရီ $2 ရက် ကိုပြရန်", @@ -1349,21 +1605,39 @@ "watchlist-submit": "ပြသရန်", "wlshowtime": "ပြသပေးရမည့် အချိန်ကာလ:", "wlshowhideminor": "အရေးမကြီးသော ပြင်ဆင်မှုများ", + "wlshowhidebots": "ဘော့များ", "wlshowhideliu": "မှတ်ပုံတင်ထားသော အသုံးပြုသူများ", "wlshowhideanons": "အမည်မသိ အသုံးပြုသူများ", + "wlshowhidepatr": "စောင့်ကြပ်တည်းဖြတ်မှုများ", "wlshowhidemine": "ကျွန်ုပ်၏ တည်းဖြတ်မှုများ", "wlshowhidecategorization": "စာမျက်နှာ ကဏ္ဍထည့်သွင်းခြင်း", "watchlist-options": "စောင့်ကြည့်စာရင်းအတွက် ရွေးချယ်စရာများ", "watching": "စောင့်ကြည့်လျက်ရှိ...", "unwatching": "စောင့်မကြည့်တော့...", + "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 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}၊ $3 ကိုကြည့်ပါ။", + "enotif_body_intro_created": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ဖန်တီးခဲ့သည်}}၊ လက်ရှိ ပြန်လည်ပြင်ဆင်ခြင်းအတွက် $3 ကိုကြည့်ပါ။", + "enotif_body_intro_moved": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ရွေ့ပြောင်းခဲ့သည်}}၊ လက်ရှိ ပြန်လည်ပြင်ဆင်ခြင်းအတွက် $3 ကိုကြည့်ပါ။", + "enotif_body_intro_restored": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ပြန်လည်ထိန်းသိမ်းခဲ့သည်}}၊ လက်ရှိ ပြန်လည်ပြင်ဆင်ခြင်းအတွက် $3 ကိုကြည့်ပါ။", + "enotif_body_intro_changed": "{{SITENAME}} စာမျက်နှာ $1 အား $2 မှ $PAGEEDITDATE တွင် {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}၊ လက်ရှိ ပြန်လည်ပြင်ဆင်ခြင်းအတွက် $3 ကိုကြည့်ပါ။", + "enotif_lastvisited": "သင် နောက်ဆုံးရောက်လာခဲ့ကတည်းက ပြောင်းလဲမှုများအားလုံးအတွက် $1 ကိုကြည့်ပါ", + "enotif_lastdiff": "ဤပြောင်းလဲမှုအား ကြည့်ရန် $1 ကို ကြည့်ပါ", "enotif_anon_editor": "အမည်မသိ အသုံးပြုသူ $1", + "enotif_minoredit": "ဤအရာသည် အရေးမကြီးသောပြင်​ဆင်​မှု ​ဖြစ်​သည်​", "created": "ဖန်တီးလိုက်သည်", "changed": "ပြောင်းလဲလိုက်သည်", "deletepage": "စာမျက်နှာကိုဖျက်ပါ", "confirm": "အတည်ပြု", + "excontent": "အကြောင်းအရာမှာ: \"$1\"", "excontentauthor": "ပါဝင်အကြောင်းအရာမှာ - \"$1\"၊ ဖြစ်ပြီး တစ်ဦးတည်းသော ပံ့ပိုးထားသူမှာ \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|ဆွေးနွေး]]) ဖြစ်သည်", + "exbeforeblank": "ဗလာမလုပ်ခင် အကြောင်းအရာမှာ: \"$1\"", "delete-confirm": "\"$1\"ကို ဖျက်ပါ", "delete-legend": "ဖျက်", "historywarning": "သတိပေးချက်။ သင်ဖျက်ပစ်တော့မည့် စာမျက်နှာတွင် {{PLURAL:$1|တည်းဖြတ်မူ|တည်းဖြတ်မူများ}} $1 ခု ရှိနေသည်-", @@ -1375,29 +1649,62 @@ "dellogpage": "ဖျက်ထားသည်များ မှတ်တမ်း", "dellogpagetext": "အောက်ပါတို့သည် မကြာမီက ဖျက်ထားမှုများ စာရင်း ဖြစ်သည်။", "deletionlog": "ဖျက်ပစ်သည့်မှတ်တမ်း", + "log-name-create": "စာမျက်နှာဖန်တီးမှု မှတ်တမ်း", + "log-description-create": "အောက်ပါများသည် မကြာသေးခင်က စာမျက်နှာဖန်တီးမှုစာရင်း ဖြစ်သည်။", + "logentry-create-create": "$1 က စာမျက်နှာ $3 ကို {{GENDER:$2|ဖန်တီးခဲ့}}သည်", "reverted": "ယခင်တည်းဖြတ်မူသို့ နောက်ပြန်ပြင်ပြီးပြီ", "deletecomment": "အ​ကြောင်း​ပြ​ချက် -", "deleteotherreason": "အခြားသော/နောက်ထပ် အကြောင်းပြချက် -", "deletereasonotherlist": "အခြား အကြောင်းပြချက်", + "deletereason-dropdown": "* ယေဘုယျ ဖျက်ပစ်ခြင်း အကြောင်းရင်းများ\n** ဆပန်း\n** လက်သရမ်းမှု\n** မူပိုင်ခွင့် ချိုးဖောက်မှု\n** စာရေးသူ တောင်းဆိုမှု\n** ကျိုးပျက်နေသော ပြန်ညွှန်း", "delete-edit-reasonlist": "ဖျက်ပစ်ရသော အကြောင်းရင်းများကို တည်းဖြတ်ရန်", + "deleteprotected": "ဤစာမျက်နှာသည် ကာကွယ်ထားသောကြောင့် ဖျက်ပစ်၍မရနိုင်ပါ။", "deleting-backlinks-warning": "သတိပေးချက်။ သင်ဖျက်ပစ်တော့မည့် စာမျက်နှာအား [[Special:WhatLinksHere/{{FULLPAGENAME}}|အခြားစာမျက်နှာများမှ]] ချိတ်ဆက်ထားခြင်း သို့မဟုတ် ထည့်သွင်းထားခြင်း ရှိနေသည်။", + "rollback": "နောက်ပြန်ပြင် တည်းဖြတ်မှုများ", "rollbacklink": "နောက်ပြန် ပြန်သွားရန်", "rollbacklinkcount": "{{PLURAL:$1|တည်းဖြတ်မှု|တည်းဖြတ်မှုများ}} $1 ကို နောက်ပြန်ပြင်ရန်", + "rollbacklinkcount-morethan": "$1 ထက်ပိုသော {{PLURAL:$1|တည်းဖြတ်မှု|တည်းဖြတ်မှုများ}}ကို နောက်ပြန်ပြင်ရန်", + "rollbackfailed": "နောက်ပြန်ပြင်ခြင်း မအောင်မြင်ခဲ့ပါ။", + "editcomment": "တည်းဖြတ်မှု အကျဉ်းချုပ်မှာ: $1။", "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ ပြင်ဆင်မှုများကို [[User:$1|$1]] ၏ နောက်ဆုံးတည်းဖြတ်မူသို့ နောက်ပြန် ပြန်ပြင်ခဲ့သည်", + "changecontentmodel": "စာမျက်နှာ၏ မာတိကာမော်ဒယ်ကို ပြောင်းလဲရန်", + "changecontentmodel-legend": "မာတိကာမော်ဒယ်ကို ပြောင်းလဲရန်", + "changecontentmodel-title-label": "စာမျက်နှာ ခေါင်းစဉ်", + "changecontentmodel-model-label": "မာတိကာမော်ဒယ် အသစ်", + "changecontentmodel-reason-label": "အ​ကြောင်း​ပြ​ချက်:", + "changecontentmodel-submit": "ပြောင်းလဲရန်", + "changecontentmodel-success-title": "မာတိကာမော်ဒယ် ပြောင်းလဲခဲ့သည်", + "changecontentmodel-success-text": "[[:$1]]၏ မာတိကာအမျိုးအစား ပြောင်းလဲသွားသည်။", + "changecontentmodel-cannot-convert": "[[:$1]]ပေါ်ရှိ မာတိကာသည် $2 အမျိူးအစားတစ်ခုသို့ မကူးပြောင်းနိုင်ပါ။", + "changecontentmodel-nodirectediting": "$1 မာတိကာမော်ဒယ်သည် တိုက်ရိုက်တည်းဖြတ်မှုကို မထောက်ပံ့ပါ", + "changecontentmodel-emptymodels-title": "မည်သည့် မာတိကာမော်ဒယ်မှ မရရှိနိုင်ပါ", + "changecontentmodel-emptymodels-text": "[[:$1]]ပေါ်ရှိ မာတိကာသည် မည်သည့်အမျိူးအစားတစ်ခုသို့ မကူးပြောင်းနိုင်ပါ။", + "log-name-contentmodel": "မာတိကာမော်ဒယ် ပြောင်းလဲမှုမှတ်တမ်း", + "logentry-contentmodel-change-revertlink": "ပြန်ပြောင်းရန်", + "logentry-contentmodel-change-revert": "ပြန်ပြောင်းရန်", "protectlogpage": "ကာကွယ်မှုများ၏ မှတ်တမ်း", "protectlogtext": "အောက်ပါတို့သည် စာမျက်နှာ ကာကွယ်မှုများအတွက် အပြောင်းအလဲ စာရင်း ဖြစ်သည်။\nလက်ရှိ စာမျက်နှာ ကာကွယ်မှုများ စာရင်းအတွက် [[Special:ProtectedPages|ကာကွယ်ထားသော စာမျက်နှာများ စာရင်း]]ကို ကြည့်ပါ။", "protectedarticle": "\"[[$1]]\" ကို ကာကွယ်ထားသည်", "modifiedarticleprotection": "\"[[$1]]\" ၏ ကာကွယ်မှု အဆင့်ကို ပြောင်းရန်", + "unprotectedarticle": "\"[[$1]]\" မှ ကာကွယ်မှုအား ဖယ်ရှားခဲ့သည်", + "movedarticleprotection": "\"[[$2]]\" မှ \"[[$1]]\" သို့ ကာကွယ်မှု အပြင်အဆင်များအား ရွေ့ပြောင်းခဲ့သည်။", + "protectedarticle-comment": "\"[[$1]]\" ကို {{GENDER:$2|က ကာကွယ်ခဲ့သည်}}", "modifiedarticleprotection-comment": "\"[[$1]]\" အတွက် ကာကွယ်မှုအဆင့်ကို {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}", + "unprotectedarticle-comment": "\"[[$1]]\" မှ ကာကွယ်မှုကို {{GENDER:$2|ဖယ်ရှားခဲ့သည်}}", "protect-title": "\"$1\" ၏ ကာကွယ်မှုအဆင့်ကို ပြောင်းလဲရန်", + "protect-title-notallowed": "\"$1\" ၏ ကာကွယ်မှုအဆင့်ကို ကြည့်ရန်", "prot_1movedto2": "[[$1]] မှ​ [[$2]] သို့​", + "protect-norestrictiontypes-text": "ကန့်သတ်ချက်အမျိုးအစားများ မရရှိနိုင်သောကြောင့် ဤစာမျက်နှာကို မကာကွယ်နိုင်ပါ။", + "protect-norestrictiontypes-title": "မကာကွယ်နိုင်သော စာမျက်နှာ", "protect-legend": "ကာကွယ်မှု အတည်ပြုရန်", "protectcomment": "အ​ကြောင်း​ပြ​ချက်:", - "protectexpiry": "သက်တမ်းကုန်လွန်မည် -", + "protectexpiry": "သက်တမ်းကုန်လွန်မည်:", "protect_expiry_invalid": "သက်တမ်းကုန်လွန်မည့် အချိန်သည် တရားမဝင်ပါ။", "protect_expiry_old": "သက်တမ်းသည် အတိတ်ကာလတွင် ကုန်လွန်ခဲ့ပြီး ဖြစ်သည်။", "protect-unchain-permissions": "နောက်ထပ် ကာကွယ်မှု ရွေးချယ်စရာများ ဖော်ပြရန်", "protect-text": "'''$1''' စာမျက်နှာအတွက် ကာကွယ်မှုအဆင့်ကို ဤနေရာတွင် ကြည့်ရှုပြောင်းလဲနိုင်သည်။", + "protect-locked-blocked": "ပိတ်ပင်ထားစဉ် ကာကွယ်မှုအဆင့်များကို မပြောင်းလဲနိုင်ပါ။ စာမျက်နှာ $1 အတွက် လက်ရှိအပြင်အဆင်များမှာ:", + "protect-locked-dblock": "သက်ဝင်နေသော ဒေတာဘေ့စ် သော့ခတ်ထားမှုကြောင့် ကာကွယ်မှုအဆင့်များကို မပြောင်းလဲနိုင်ပါ။ စာမျက်နှာ $1 အတွက် လက်ရှိအပြင်အဆင်များမှာ:", "protect-locked-access": "သင့်အကောင့်သည် စာမျက်နှာ၏ ကာကွယ်မှုအဆင့်ကို ပြောင်းလဲနိုင်ရန် ခွင့်ပြုချက် မရှိပါ။\nဤသည်မှာ '''$1''' စာမျက်နှာအတွက် လက်ရှိ settings သတ်မှတ်ချက်များ ဖြစ်သည်။", "protect-cascadeon": "ပြန်စီစဉ်ခြင်း cascading ကို ကာကွယ်ထားသော အောက်ပါ{{PLURAL:$1|စာမျက်နှာ|စာမျက်နှာများ}} ထည့်သွင်းပါဝင်နေသောကြောင့် ဤစာမျက်နှာကို လက်ရှိတွင် ကာကွယ်ထားသည်။\nဤစာမျက်နှာ၏ ကာကွယ်မှုအဆင့်ကို ပြောင်းလဲမှုများသည် ပြန်စီစဉ်ခြင်း ကာကွယ်ထားမှုကို အကျိုးသက်ရောက်လိမ့်မည် မဟုတ်။", "protect-default": "အသုံးပြုသူ အားလုံးကို ခွင့်ပြုရန်", @@ -1406,11 +1713,17 @@ "protect-level-sysop": "စီမံခန့်ခွဲသူများသာ", "protect-summary-cascade": "အစီအစဉ်ကျအောင် စီနေသည်", "protect-expiring": "$1 (UTC) တွင် သက်တမ်းကုန်မည်", + "protect-expiring-local": "သက်တမ်းကုန်ချိန် $1", "protect-expiry-indefinite": "အနန္တ", "protect-cascade": "ဤစာမျက်နှာအတွင်း ပါဝင်သော စာမျက်နှာများကို ထိန်းသိမ်းကာကွယ်ပါ (အများခွင့်ပြုချက်ဖြင့်သာ ပြင်ဆင်သင့်သည်)", "protect-cantedit": "ကာကွယ်ထားသောစာမျက်နှာဖြစ်သည့်အတွက် ပြင်ဆင်၍ မရနိုင်ပါ။ အဘယ့်ကြောင့်ဆိုသော် သင့်မှာ တည်းဖြတ်ပိုင်ခွင့် မရှိ၍ ဖြစ်ပါသည်။", + "protect-othertime": "အခြားအချိန်:", + "protect-othertime-op": "အခြားအချိန်", + "protect-existing-expiry": "ရှိနေပြီးသား သက်တမ်းကုန်ချိန်: $3၊ $2", + "protect-existing-expiry-infinity": "ရှိနေပြီးသား သက်တမ်းကုန်ချိန်: အနန္တ", "protect-otherreason": "အခြားသော/နောက်ထပ် အကြောင်းပြချက် -", "protect-otherreason-op": "အခြား အကြောင်းပြချက်", + "protect-dropdown": "*ယေဘုယျ ကာကွယ်ရခြင်း အကြောင်းပြချက်များ\n** လက်သရမ်းမှု များပြားခြင်း\n** လိုက်ဖွခြင်း များပြား\n** တည်းဖြတ်မှုစစ်ပွဲအတွက် တန်ပြန်ဆင်ခြင်း\n** လူကြည့်များသော စာမျက်နှာ", "protect-edit-reasonlist": "ကာကွယ်ထားရသော အကြောင်းရင်းများကို တည်းဖြတ်ရန်", "protect-expiry-options": "၁ နာရီ:1 hour,၁ နေ့:1 day,၁ ပတ်:1 week,၂ ပတ်:2 weeks,၁ လ:1 month,၃ လ:3 months,၆ လ:6 months,၁ နှစ်:1 year,အနန္တ:infinite", "restriction-type": "ခွင့်ပြုချက် -", @@ -1420,8 +1733,8 @@ "pagesize": "(ဘိုက်)", "restriction-edit": "ပြင်ဆင်ရန်", "restriction-move": "ရွှေ့ရန်", - "restriction-create": "ထွင်", - "restriction-upload": "Upload တင်ရန်", + "restriction-create": "ဖန်တီး", + "restriction-upload": "ဖိုင်တင်ရန်", "restriction-level-sysop": "အပြည့်အဝကာကွယ်ထားသည်။", "restriction-level-autoconfirmed": "တစ်စိတ်တစ်ပိုင်း ကာကွယ်ထားသည်", "restriction-level-all": "မည်သည့်အဆင့်မဆို", @@ -1435,7 +1748,11 @@ "undeleteviewlink": "ကြည့်ရန်", "undeleteinvert": "ရွေးချယ်ထားခြင်းကို ပြောင်းပြန်လှန်ရန်", "undeletecomment": "အ​ကြောင်း​ပြ​ချက် -", + "undelete-header": "မကြာသေးခင်က ဖျက်ထားသည့်စာမျက်နှာများအတွက် [[Special:Log/delete|ဖျက်ထားသည်များ မှတ်တမ်း]]ကို ကြည့်ပါ။", + "undelete-search-title": "ဖျက်ပစ်လိုက်သော စာမျက်နှာများကို ရှာရန်", "undelete-search-box": "ဖျက်ပစ်သည့် စာမျက်နှာများမှ ရှာရန်", + "undelete-search-prefix": "ဤကဲ့သို့ အစပြုသောစာမျက်နှာများကို ပြရန်:", + "undelete-search-full": "ဤကဲ့သို့ ခေါင်းစဉ်များပါဝင်သော စာမျက်နှာကိုပြရန်:", "undelete-search-submit": "ရှာဖွေရန်", "undelete-show-file-submit": "မှန်", "namespace": "အမည်ညွှန်း -", @@ -1449,12 +1766,15 @@ "mycontris": "ဆောင်ရွက်ချက်များ", "anoncontribs": "ဆောင်ရွက်ချက်များ", "contribsub2": "{{GENDER:$3|$1}}အတွက် ($2)", + "contributions-userdoesnotexist": "အသုံးပြုသူအကောင့် \"$1\" သည် မှတ်ပုံမတင်ထားပါ။", "nocontribs": "ဤသတ်မှတ်ချက်များနှင့် ကိုက်ညီသည့် ပြောင်းလဲမှုများ မရှိပါ။", "uctop": "(လက်ရှိ)", "month": "အဆိုပါ လမှစ၍ ( အဆိုပါလထက်လည်း စောသော) :", "year": "အဆိုပါ နှစ်မှစ၍ ( အဆိုပါနှစ်ထက်လည်း စောသော) :", + "date": "အဆိုပါရက်စွဲမှစ၍ (ယင်းထက်လည်း စောသော):", "sp-contributions-newbies": "အကောင့်အသစ်များ၏ ပံ့ပိုးမှုများကိုသာ ပြရန်", "sp-contributions-newbies-sub": "အကောင့်အသစ်များအတွက်", + "sp-contributions-newbies-title": "အကောင့်သစ်များအတွက် အသုံးပြုသူပံ့ပိုးမှုများ", "sp-contributions-blocklog": "ပိတ်ပင်တားဆီးမှု မှတ်တမ်း", "sp-contributions-deleted": "ဖျက်ခံထားရသည့် {{GENDER:$1|အသုံးပြုသူ}} ဆောင်ရွက်ချက်များ", "sp-contributions-uploads": "အပ်လုပ်တင်ထားသည်များ", @@ -1462,12 +1782,14 @@ "sp-contributions-talk": "ဆွေးနွေး", "sp-contributions-userrights": "{{GENDER:$1|အသုံးပြုသူ}}၏ အခွင့်အရေးများကို စီမံခန့်ခွဲခြင်း", "sp-contributions-blocked-notice": "ဤအသုံးပြုသူအား လတ်တလောတွင် ပိတ်ပင်ထားသည်။\nနောက်ဆုံးပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။", + "sp-contributions-blocked-notice-anon": "ဤအိုင်ပီလိပ်စာအား လတ်တလောတွင် ပိတ်ပင်ထားသည်။\nနောက်ဆုံးပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။", "sp-contributions-search": "ပံ့ပိုးမှုများကို ရှာရန်", "sp-contributions-username": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် :", "sp-contributions-toponly": "နောက်ဆုံးတည်းဖြတ်မူများသာပြရန်", "sp-contributions-newonly": "စာမျက်နှာ ဖန်တီးမှုများသာ ပြသရန်", "sp-contributions-hideminor": "အရေးမကြီးသော တည်းဖြတ်မှုများကို ဝှက်ရန်", "sp-contributions-submit": "ရှာဖွေရန်", + "sp-contributions-outofrange": "မည်သည့်ရလဒ်များ မပြနိုင်ပါ။ တောင်းဆိုထားသော အိုင်ပီအတိုင်းအတာသည် /$1 ၏ CIDR ကန့်သတ်ချက်ထက် ပိုကြီးသည်။", "whatlinkshere": "ဘယ်ကလင့်ခ်ထားလဲ", "whatlinkshere-title": "\"$1\" သို့ ချိတ်ဆက်ထားသော စာမျက်နှာများ", "whatlinkshere-page": "စာမျက်နှာ -", @@ -1484,11 +1806,16 @@ "whatlinkshere-hidelinks": "လင့်ခ်များ $1 ခု", "whatlinkshere-hideimages": "ဖိုင်အချိတ်အဆက်များ $1 ခု", "whatlinkshere-filters": "စိစစ်မှုများ", + "whatlinkshere-submit": "သွားပါ", + "autoblockid": "အလိုအလျောက်ပိတ်ပင် #$1", + "block": "အသုံးပြုသူကို ပိတ်ပင်ရန်", "unblock": "အသုံးပြုသူကို ပိတ်ပင်ထားရာမှ ပြန်ဖွင့်ပေးရန်", "blockip": "{{GENDER:$1|အသုံးပြုသူ}} ပိတ်ပင်ရန်", + "blockiptext": "သတ်မှတ်ထားသော အိုင်ပီလိပ်စာ သို့မဟုတ် အသုံးပြုသူအမည်ကို ရေးသားပိုင်ခွင့်မှ ပိတ်ပင်တားဆီးရန် အောက်ပါပုံစံကို အသုံးပြုပါ။ ဤသည် [[{{MediaWiki:Policy-url}}|မူဝါဒ]] အရ ဖျက်လိုဖျက်ဆီးလုပ်ဆောင်မှုကို ကာကွယ်ရန်အတွက်သာ ဆောင်ရွက်သင့်သည်။ ပိတ်ပင်ရသည့် အကြောင်းပြချက်များကိုလည်း အောက်တွင်\nဖြည့်သွင်းပါ။ အိုင်ပီလိပ်စာ အတိုင်းအတာအလိုက် [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax ကို အသုံးပြု၍ ပိတ်ပင်နိုင်ပါသည်။ အများဆုံး ခွင့်ပြုပမာဏမှာ IPv4 အတွက် /$1 ဖြစ်ပြီး IPv6 အတွက် /$2 ဖြစ်သည်။", "ipaddressorusername": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် -", "ipbexpiry": "သက်တမ်းကုန်လွန်ရက် -", "ipbreason": "အ​ကြောင်း​ပြ​ချက်:", + "ipbreason-dropdown": "*ယေဘုယျ ပိတ်ပင်တားဆီးရခြင်း အကြောင်းပြချက်များ\n** မှားယွင်းအချက်အလက်များကို ထည့်သွင်းမှု\n** စာမျက်နှာများမှ အကြောင်းအရာကို ဖယ်ရှားမှု\n** ပြင်ပဆိုဒ်များသို့လင့်ခ်ချိတ်၍ ဖွမှု\n** စာမျက်နှာများတွင် ပေါက်တတ်ကရများ ထည့်သွင်းမှု\n** ခြိမ်းခြောက်ခြင်း အပြုအမူ/အနှောက်အယှက်ပေးခြင်း\n** အကောင့်များစွာကို အလွဲသုံးစားလုပ်မှု\n** လက်ခံနိုင်ဖွယ်မရှိသော အသုံးပြုသူအမည်", "ipb-hardblock": "ဤအိုင်ပီလိပ်စာမှ လော့ဂ်အင်ဝင်ထားသော အသုံးပြုသူများကို တည်းဖြတ်ခြင်းမှ တားမြစ်ရန်", "ipbcreateaccount": "အကောင့်အသစ်ပြုလုပ်ခြင်းကို တားဆီးရန်", "ipbemailban": "အီးမေးပို့ခြင်းမှ အသုံးပြုသူကို တားဆီးရန်", @@ -1500,37 +1827,62 @@ "ipbwatchuser": "ဤအသုံးပြုသူ၏ စာမျက်နှာနှင့် ဆွေးနွေးချက်တို့ကို စောင့်ကြည့်ရန်", "ipb-disableusertalk": "ပိတ်ပင်ထားစဉ်အတွင်း ဤအသုံးပြုသူအား သူတို့၏ ကိုယ်ပိုင်ဆွေးနွေးချက် စာမျက်နှာကို ပြင်ဆင်ခြင်းမှ ပိတ်ပင်ရန်", "ipb-change-block": "အသုံးပြုသူအား ဤအပြင်အဆင်များဖြင့် ထပ်မံပိတ်ပင်ရန်", + "ipb-confirm": "ပိတ်ပင်မှုကို အတည်ပြု", "badipaddress": "တရားမဝင်သော IP address", "blockipsuccesssub": "ပိတ်ပင်ခြင်း အောင်မြင်သည်", + "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ကို ပိတ်ပင်ထားပါသည်။
    \nပိတ်ပင်မှုများကို ပြန်လည်ဆန်းစစ်ရန် [[Special:BlockList|ပိတ်ပင်မှု စာရင်း]]ကို ကြည့်ပါ။", + "ipb-blockingself": "သင့်ကိုယ်သင် ပိတ်ပင်တားဆီးတော့မည် ဖြစ်သည်။ ဤသည်ကို လုပ်ဆောင်လိုသည်မှာ သေချာပါသလား။", + "ipb-confirmaction": "ဤသည်ကို လုပ်ဆောင်လိုသည်မှာ သေချာပါက အောက်ခြေရှိ \"{{int:ipb-confirm}}\" ကွင်းအား ကျေးဇူးပြု၌ စစ်ဆေးပါ။", "ipb-edit-dropdown": "ပိတ်ပင်ရသောအကြောင်းရင်းများ", "ipb-unblock-addr": "$1 ကို ပိတ်ထားရာမှ ပြန်ဖွင့်ရန်", "ipb-unblock": "အသုံးပြုသူအမည် သို့ IP address ကို ပိတ်ထားရာမှ ပြန်ဖွင့်ပေးရန်", "ipb-blocklist": "ရှိနှင့်ပြီးသား ပိတ်ပင်မှုများကို ကြည့်ရန်", "ipb-blocklist-contribs": "{{GENDER:$1|$1}} အတွက် ဆောင်ရွက်ချက်များ", + "ipb-blocklist-duration-left": "$1 ကျန်ရှိ", "unblockip": "အသုံးပြုသူကို ပိတ်ပင်ထားရာမှ ပြန်ဖွင့်ပေးရန်", "ipusubmit": "ဤပိတ်ပင်မှုကို ဖယ်ရှားရန်", "unblocked": "[[User:$1|$1]] ကို ပိတ်ပင်ထားရာမှ ပြန်ဖွင့်ပေးလိုက်သည်", + "unblocked-range": "$1 အား ပိတ်ပင်မှုမှ ပြန်ဖြေပေးလိုက်သည်။", "unblocked-id": "$1 ကို ပိတ်ပင်ထားမှုကို ဖယ်ရှာလိုက်သည်", + "unblocked-ip": "[[Special:Contributions/$1|$1]] အား ပိတ်ပင်မှုမှ ပြန်ဖြေပေးလိုက်သည်။", "blocklist": "ပိတ်ပင်ထားသော အသုံးပြုသူများ", "autoblocklist": "အလိုအလျောက် ပိတ်ပင်မှုများ", + "autoblocklist-submit": "ရှာဖွေရန်", "autoblocklist-legend": "အလိုအလျောက် ပိတ်ပင်မှုများ စာရင်း", "autoblocklist-localblocks": "ဒေသဆိုင်ရာ {{PLURAL:$1|အလိုအလျောက် ပိတ်ပင်မှု|အလိုအလျောက် ပိတ်ပင်မှုများ}}", + "autoblocklist-total-autoblocks": "အလိုအလျက်ပိတ်ပင်မှုများ စုစုပေါင်း: $1", + "autoblocklist-empty": "အလိုအလျောက် ပိတ်ပင်ထားမှုစာရင်းသည် ဗလာဖြစ်နေသည်။", "autoblocklist-otherblocks": "အခြား {{PLURAL:$1|အလိုအလျောက် ပိတ်ပင်မှု|အလိုအလျောက် ပိတ်ပင်မှုများ}}", "ipblocklist": "ပိတ်ပင်ထားသော အသုံးပြုသူများ", "ipblocklist-legend": "ပိတ်ပင်ထားသော အသုံးပြုသူတစ်ဦးကို ရှာရန်", + "blocklist-userblocks": "အကောင့်ပိတ်ပင်မှုများ ဝှက်", + "blocklist-tempblocks": "ယာယီပိတ်ပင်မှုများ ဝှက်", + "blocklist-addressblocks": "အိုင်ပီတစ်ခုတည်းပိတ်ပင်မှု ဝှက်", + "blocklist-rangeblocks": "အကွာအဝေးလိုက် ပိတ်ပင်မှုများ ဝှက်", + "blocklist-timestamp": "အချိန်တံဆိပ်", + "blocklist-target": "ပစ်မှတ်", + "blocklist-expiry": "သက်တမ်းကုန်လွန်မည်", + "blocklist-by": "ပတ်ပင်ထားသည့် အက်ဒမိန်", + "blocklist-params": "ပိတ်ပင်မှု ပါရာမီတာများ", + "blocklist-reason": "အကြောင်းပြချက်", "ipblocklist-submit": "ရှာဖွေရန်", + "ipblocklist-localblock": "ဒေသတွင်း ပိတ်ပင်", "ipblocklist-otherblocks": "အခြား ပိတ်ပင်ထားမှု{{PLURAL:$1|ခု|ခု}}", "infiniteblock": "အကန့်အသတ်မရှိ", "expiringblock": "$1 ရက် $2 အချိန်တွင် သက်တမ်းကုန်မည်", + "anononlyblock": "အမည်မသိများသာ", "noautoblockblock": "အလိုအလျောက်ပိတ်ပင်ခြင်းကို ပိတ်ထားရန်", "createaccountblock": "အကောင့်ဖန်တီးခြင်းကို ပိတ်ထားသည်", "emailblock": "အီးမေးကို ပိတ်ပင်ထားသည်", "blocklist-nousertalk": "မိမိ၏ဆွေးနွေးချက်စာမျက်နှာကို တည်းဖြတ်မရနိုင်ပါ", "ipblocklist-empty": "ပိတ်ပင်ထားမှုစာရင်းသည် ဗလာဖြစ်နေသည်။", + "ipblocklist-no-results": "တောင်းဆိုလိုက်သော အိုင်ပီလိပ်စာ သို့မဟုတ် အသုံးပြုသူအမည်ကို မပိတ်ပင်ထားပါ။", "blocklink": "ပိတ်ပင်", "unblocklink": "မပိတ်ပင်တော့ရန်", "change-blocklink": "စာကြောင်းအမည် ပြောင်းရန်", "contribslink": "ပံ့ပိုး", + "emaillink": "အီးမေးလ် ပို့", + "autoblocker": "အလိုအလျောက်ပိတ်ပင်ခဲ့သည်။ အကြောင်းမှာ သင်၏အိုင်ပီလိပ်စာအား \"[[User:$1|$1]]\" မှ မကြာသေးခင်က အသုံးပြုခဲ့သည်။ $1 ၏ ပိတ်ပင်မှုအတွက် ပေးထားသော အကြောင်းပြချက်မှာ \"$2\" ဖြစ်သည်။", "blocklogpage": "ပိတ်ပင်တားဆီးမှု မှတ်တမ်း", "blocklog-showlog": "ဤအသုံးပြုသူအား ယခင်က ပိတ်ပင်ထားပြီး ဖြစ်သည်။\nပိတ်ပင်မှု မှတ်တမ်းအား ကိုးကားနိုင်ရန် အောက်တွင် ဖော်ပြထားသည်။", "blocklogentry": "သက်တမ်း $2 ဖြင့် [[$1]] ကို ပိတ်ပင်လိုက်သည် $3", @@ -1542,16 +1894,36 @@ "block-log-flags-noautoblock": "အလိုအလျောက်ပိတ်ပင်ခြင်းကို ပိတ်ထားသည်", "block-log-flags-noemail": "အီးမေးကို ပိတ်ပင်ထားသည်", "block-log-flags-nousertalk": "မိမိ၏ဆွေးနွေးချက်စာမျက်နှာကို တည်းဖြတ်မရနိုင်ပါ", + "block-log-flags-angry-autoblock": "အရည်အသွေးမြှင့် အလိုအလျောက်ပိတ်ပင်မှု လုပ်ဆောင်ခွင့်ပြုထားသည်", "block-log-flags-hiddenname": "အသုံးပြုသူအမည် ဝှက်ထားသည်", + "range_block_disabled": "အတိုင်းအတာ ပိတ်ပင်မှုဖန်တီးရန် အက်ဒမင်၏စွမ်းရည်မှာ ပိတ်ထားပါသည်။", "ipb_expiry_invalid": "သက်တမ်းကုန်လွန်မည့် အချိန်သည် တရားမဝင်ပါ။", + "ipb_expiry_old": "သက်တမ်းကုန်လွန်ချိန်မှာ အတိတ်တွင်ဖြစ်သည်။", + "ipb_expiry_temp": "ဝှက်ထားသော အသုံးပြုသူအမည်အတွက် ပိတ်ပင်မှုသည် အမြဲတမ်းဖြစ်ရမည်။", "ipb_already_blocked": "\"$1\" ကို ပိတ်ပင်ထားပြီး ဖြစ်သည်။", "ipb-needreblock": "$1 ကို ပိတ်ပင်ထားပြီး ဖြစ်သည်။ အပြင်အဆင်များကို ပြောင်းလဲလိုပါသလား?", + "ipb-otherblocks-header": "အခြား ပိတ်ပင်ထားမှု{{PLURAL:$1|ခု|ခု}}", + "unblock-hideuser": "ဤအသုံးပြုသူအား ပိတ်ပင်မှုမှ ပြန်ဖြေမပေးနိုင်ပါ၊ အကြောင်းမှာ သူတို့၏ အသုံးပြုသူအမည်ကို ဝှက်ထားသည်။", + "ip_range_invalid": "ဆီလျော်မှုမရှိသော အိုင်ပီအတိုင်းအတာ", + "ip_range_toolarge": "/$1 ထက် ပိုကြီးသော အတိုင်းအတာ ပိတ်ပင်မှုများကို ခွင့်မပြုပါ။", + "ip_range_exceeded": "အိုင်ပီအတိုင်းအတာသည် ယင်း၏အများဆုံးပမာဏထက် ကျော်လွန်နေသည်။ ခွင့်ပြုထားသော အတိုင်းအတာမှာ /$1 ဖြစ်သည်။", + "ip_range_toolow": "အိုင်ပီအတိုင်းအတာများသည် ခွင့်ပြုထားခြင်း မရှိပါ။", "proxyblocker": "ပရောက်ဆီ ပိတ်ပင်သူ", + "softblockrangesreason": "ဤအိုင်ပီလိပ်စာ ($1) မှ အမည်မသိ ပံ့ပိုးမှုများကို ခွင့်မပြုပါ။ ကျေးဇူးပြု၍ အကောင့်ထဲဝင်ပါ။", + "ipbblocked": "အခြားအသုံးပြုသူများကို သင် မပိတ်ပင်နိုင်ပါ။ အကြောင်းမှာ သင်ကိုယ်တိုင် မိမိကိုယ်ကို ပိတ်ပင်ခဲ့သောကြောင့်ဖြစ်သည်။", + "ipbnounblockself": "သင်ကိုယ်တိုင် မိမိကိုယ်ကို ပိတ်ပင်မှုမှ ပြန်မဖြေနိုင်ပါ။", "move-page": "$1 ကို ရွှေ့ရန်", "move-page-legend": "စာမျက်နှာကို ရွှေ့ပြောင်းရန်", "movepagetext": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\nအမည်ဟောင်းသည် အမည်သစ်သို့ ပြန်ညွှန်းစာမျက်နှာ ဖြစ်လာမည်။\nသင်သည် မူလခေါင်းစဉ်သို့ ပြန်ညွှန်းများကို အလိုအလျောက် အပ်ဒိတ် update လုပ်နိုင်သည်။\nအကယ်၍ မပြုလုပ်လိုပါက [[Special:DoubleRedirects|နှစ်ဆင့်ပြန်ညွှန်းများ]] သို့မဟုတ် [[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို မှတ်သားရန် မမေ့ပါနှင့်။\nလင့်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနှင့်ပြီး ဖြစ်ပါက (သို့) ယင်းစာမျက်နှာသည် အလွတ်မဖြစ်ပါက (သို့) ပြန်ညွှန်းတစ်ခု မရှိပါက (သို့) ယခင်က ပြုပြင်ထားသော မှတ်တမ်း မရှိပါက စာမျက်နှာသည် ရွေ့မည်မဟုတ် သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\nမှတ်ချက်။\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။", "movepagetext-noredirectfixer": "အောက်ပါပုံစံကို အသုံးပြုခြင်းသည် စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်း၏ မှတ်တမ်းနှင့်တကွ ရွှေ့ပေးမည် ဖြစ်သည်။\n[[Special:DoubleRedirects|နှစ်ဆင့်ပြန်ညွှန်းများ]] သို့မဟုတ် [[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို စစ်ဆေးရန် မမေ့ပါနှင့်။\nလင့်ခ်များ ညွှန်းလိုသည့် နေရာသို့ ညွှန်ပြနေရန် သင့်တွင် တာဝန် ရှိသည်။\n\nအကယ်၍ ခေါင်းစဉ်အသစ်တွင် စာမျက်နှာတစ်ခု ရှိနေနှင့်ပြီး ပြန်ညွှန်းတစ်ခု မရှိပါက သို့မဟုတ် ယခင်က ပြုပြင်ထားသော မှတ်တမ်း ရှိနေပါက စာမျက်နှာသည် ရွေ့မည်မဟုတ် သည်ကို သတိပြုပါ။ \nဆိုလိုသည်မှာ သင်သည် အမှားတစ်ခု ပြုလုပ်မိပါက စာမျက်နှာကို ယခင်အမည်ကို ပြန်လည် ပြောင်းလဲပေးနိုင်သည်။ ရှိပြီသားစာမျက်နှာတစ်ခုကို စာမျက်နှာ အသစ်နှင့် ပြန်အုပ် overwrite ခြင်း မပြုနိုင်။\n\nမှတ်ချက်။\nဤသည်မှာ လူဖတ်များသော စာမျက်နှာတစ်ခုဖြစ်ပါက မမျှော်လင့်ထားသော၊ ကြီးမားသော အပြောင်းအလဲတစ်ခု ဖြစ်ပေါ်လာနိုင်သည်။\nထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်တွဲ အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြု၍ သေချာပါစေ။", "movepagetalktext": "ဤအကွက်ကို အမှန်ခြစ်လိုက်ခြင်းဖြင့် ဗလာမဟုတ်သော ဆွေးနွေးချက်စာမျက်နှာသည် ရှိနှင့်ပြီး မဟုတ်လျှင် ဆက်နွယ်နေသော ဆွေးနွေးချက် စာမျက်နှာကို ခေါင်းစဉ်အသစ်သို့ အလိုအလျောက် ရွှေ့ပစ်မည် ဖြစ်သည်။\n\nဤကိစ္စရပ်တွင် သင် ဆန္ဒရှိလျှင် စာမျက်နှာကို မိမိကိုယ်တိုင် သွားရောက်ရွှေ့ပြောင်း ပေါင်းစပ်နိုင်သည်။", + "movenologintext": "စာမျက်နှာတစ်ခုကို ရွေ့ပြောင်းရန် သင့်အနေဖြင့် မှတ်ပုံတင်ထားသော အသုံးပြုသူနှင့် [[Special:UserLogin|အကောင့်ထဲဝင်]]ထားရပါမည်။", + "movenotallowed": "သင့်တွင် စာမျက်နှာများကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။", + "movenotallowedfile": "သင့်တွင် ဖိုင်များကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။", + "cant-move-user-page": "သင့်တွင် အသုံးပြုသူ စာမျက်နှာများကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။", + "cant-move-category-page": "သင့်တွင် ကဏ္ဍစာမျက်နှာများကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။", + "cant-move-to-category-page": "သင့်တွင် စာမျက်နှာမှ ကဏ္ဍစာမျက်နှာသို့ ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။", + "cant-move-subpages": "သင့်တွင် စာမျက်နှာခွဲများကို ရွေ့ပြောင်းရန် ခွင့်ပြုချက်မရှိပါ။", "newtitle": "ခေါင်းစဉ်အသစ်:", "move-watch": "မူရင်းစာမျက်နှာနှင့် ဦးတည်ထားသော စာမျက်နှာတို့ကို စောင့်ကြည့်ရန်", "movepagebtn": "စာမျက်နှာကို ရွှေ့ပြောင်းရန်", @@ -1560,11 +1932,16 @@ "movepage-moved-redirect": "ပြန်ညွှန်းတစ်ခုကို ဖန်တီးပြီးဖြစ်သည်။", "movepage-moved-noredirect": "ပြန်ညွှန်းဖန်တီးခြင်းအား ချေဖျက်ပြီး ဖြစ်သည်။", "articleexists": "ထိုအမည်ဖြင့် စာမျက်နှာတစ်ခု ရှိနှင့်ပြီးဖြစ်သည် (သို့) သင်ရွေးလိုက်သော အမည်သည် တရားမဝင်ပါ။\nကျေးဇူးပြု၍ အခြားအမည်တစ်ခုကို ရွေးပေးပါ။", + "cantmove-titleprotected": "ဤနေရာသို့ စာမျက်နှာတစ်ခုကို ဖန်တီးရန် ခွင့်ပြုချက်မရှိပါ၊ အကြောင်းမှာ ခေါင်းစဉ်သစ်ကို ဖန်တီးခြင်းမှ ကာကွယ်ခဲ့သောကြောင့်ဖြစ်သည်။", "movetalk": "ယှက်နွယ်နေသော ဆွေးနွေးချက်စာမျက်နှာများကို ရွှေ့ရန်", + "move-subpages": "စာမျက်နှာခွဲများကို ရွေ့ပြောင်းရန် ($1 ထက်ပို၍)", + "move-talk-subpages": "ဆွေးနွေးစာမျက်နှာ၏ စာမျက်နှာခွဲများကို ရွေ့ပြောင်းရန် ($1 ထက်ပို၍)", "movepage-page-moved": "စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့ပြီးပြီ ဖြစ်သည်။", "movepage-page-unmoved": "စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့မရနိုင်ပါ။", "movelogpage": "ရွှေ့ပြောင်းခြင်း မှတ်တမ်း", "movelogpagetext": "အောက်ပါတို့သည် စာမျက်နှာ ရွေ့ပြောင်းမှုများ အားလုံး စာရင်း ဖြစ်သည်။", + "movesubpage": "{{PLURAL:$1|စာမျက်နှာခွဲ|စာမျက်နှာခွဲများ}}", + "movenosubpage": "ဤစာမျက်နှာတွင် စာမျက်နှာခွဲများ မရှိပါ။", "movereason": "အ​ကြောင်း​ပြ​ချက် -", "revertmove": "ပြောင်းရန်", "delete_and_move_confirm": "ဟုတ်ပါသည်။ စာမျက်နှာကို ဖျက်ပါ။", @@ -1588,10 +1965,12 @@ "allmessages-filter-all": "အားလုံး", "allmessages-filter-modified": "ပြုပြင်ထားသော", "allmessages-language": "ဘာသာစကား:", - "allmessages-filter-submit": "သွား", + "allmessages-filter-submit": "သွားပါ", + "allmessages-filter-translate": "ဘာသာပြန်ပါ", "thumbnail-more": "ပုံကြီးချဲ့ရန်", "filemissing": "ဖိုင်ပျောက်နေသည်", "thumbnail_error": "ပုံစံငယ်ဖန်တီးရာတွင် အမှားပြနေသည် - $1", + "thumbnail_error_remote": "$1 မှ အမှားမက်ဆေ့: $2", "import": "စာမျက်နှာများထည့်သွင်းရန်", "import-interwiki-submit": "တင်သွင်းရန်", "import-upload-filename": "ဖိုင်အမည် -", @@ -1604,10 +1983,13 @@ "importlogpage": "ထည့်သွင်းသည့် မှတ်တမ်း", "tooltip-pt-userpage": "{{GENDER:|သင်၏ အသုံးပြုသူ}} စာမျက်နှာ", "tooltip-pt-mytalk": "{{GENDER:|သင်၏}} ဆွေးနွေးချက်စာမျက်နှာ", + "tooltip-pt-anontalk": "ဤအိုင်ပီလိပ်စာမှ တည်းဖြတ်မှုများအကြောင်း ဆွေးနွေးချက်", "tooltip-pt-preferences": "{{GENDER:|သင်၏}} ရွေးချယ်စရာများ", "tooltip-pt-watchlist": "အပြောင်းအလဲများအတွက် စောင့်ကြည့်နေသော စာမျက်နှာများ၏ စာရင်း", "tooltip-pt-mycontris": "{{GENDER:|သင်၏}} ဆောင်ရွက်ချက်များ စာရင်း", + "tooltip-pt-anoncontribs": "ဤအိုင်ပီလိပ်စာမှ ပြုလုပ်ထားသော တည်းဖြတ်မှုများ၏ စာရင်း", "tooltip-pt-login": "သင့်အား အကောင့်ဝင်ရန် တိုက်တွန်းပါသည်။ သို့သော် မဖြစ်မနေ လုပ်ဆောင်ရန် မဟုတ်ပါ။", + "tooltip-pt-login-private": "ဤဝီကီကို အသုံးပြုရန် အကောင့်ထဲဝင်ဖို့ လိုအပ်သည်", "tooltip-pt-logout": "ထွက်​ပါ​", "tooltip-pt-createaccount": "အကောင့်တစ်ခုကို ဖန်တီးပြီး ဝင်ရောက်ရန် သင့်အား တိုက်တွန်းပါသည်။ သို့သော် မဖြစ်မနေ မဟုတ်ပါ။", "tooltip-ca-talk": "မာတိကာ စာမျက်နှာအတွက် ဆွေးနွေးချက်များ", @@ -1638,7 +2020,8 @@ "tooltip-feed-atom": "ဤစာမျက်နှာအတွက် Atom feed", "tooltip-t-contributions": "{{GENDER:$1|ဤအသုံးပြုသူ}}၏ ဆောင်ရွက်ချက်များ စာရင်း", "tooltip-t-emailuser": "{{GENDER:$1|ဤအသုံးပြုသူထံ}} အီးမေးပေးပို့ရန်", - "tooltip-t-upload": "ဖိုင်တင်ရန်", + "tooltip-t-info": "ဤစာမျက်နှာအကြောင်း အချက်အလက်ပို၍", + "tooltip-t-upload": "ဖိုင်များတင်ရန်", "tooltip-t-specialpages": "အထူး စာမျက်နှာများအားလုံး စာရင်း", "tooltip-t-print": "ဤစာမျက်နှာ၏ ပရင့်ထုတ်နိုင်သောမူ", "tooltip-t-permalink": "ယခုမူအတွက် ပုံသေလိပ်စာ", @@ -1654,17 +2037,27 @@ "tooltip-ca-nstab-category": "ကဏ္ဍများကို ကြည့်ရန်", "tooltip-minoredit": "အရေးမကြီးသော တည်းဖြတ်မှုအဖြစ် မှတ်သားရန်", "tooltip-save": "ပြောင်းလဲထားသည်များကို သိမ်းရန်", + "tooltip-publish": "သင်၏ပြောင်းလဲမှုများကို လွှင့်တင်ရန်", "tooltip-preview": "သင်ပြင်ထားသည်များကို နမူနာကြည့်ရန်ဖြစ်သည်။ ကျေးဇူးပြု၍ မသိမ်းခင် သုံးပေးပါ။", "tooltip-diff": "ဘယ်စာသား ​ပြောင်းလိုက်သည်ကို ြပရန်", "tooltip-compareselectedversions": "ရွေးချယ်ထားသော မူနှစ်ခု၏ ကွဲပြားချက်များကို ကြည့်ရန်", "tooltip-watch": "ဤစာမျက်နှာကို စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ရန်", + "tooltip-watchlistedit-normal-submit": "ခေါင်းစဉ်များကို ဖယ်ရှားရန်", + "tooltip-watchlistedit-raw-submit": "စောင့်ကြည့်စာရင်းကို မွမ်းမံရန်", "tooltip-recreate": "စာမျက်နှာကို ဖျက်ပစ်လိုက်လျှင်သော်မှ ပြန်လည်ဖန်တီးပါ", "tooltip-upload": "Upload တင်ခြင်း စတင်ရန်", "tooltip-rollback": "\"နောက်ပြန် ပြန်သွားခြင်း\" သည် ဤစာမျက်နှာ၏ နောက်ဆုံး တည်းဖြတ်မူသို့ ကလစ် တစ်ချက်ဖြင့် ပြန်ပြောင်းပေးသည်။", "tooltip-undo": "\"နောက်ပြန် ပြန်သွားခြင်း\" သည် ဤ တည်းဖြတ်ခြင်းကို နောက်ပြန်ပြန်ဆုတ်ပြီး နမူနာပုံနှင့်တကွ တည်းဖြတ်ရန် ပြန်ဖွင့်မည် ဖြစ်သည်။ အဘယ်ကြောင့် နောက်ပြန်သွားသည်ကို အကျဉ်းချုပ် အကြောင်းပြချက် ရေးနိုင်သည်။", "tooltip-preferences-save": "ရေးချယ်စရာများကို သိမ်းရန်", "tooltip-summary": "အတိုချုပ်ထည့်ရန်", + "anonymous": "{{SITENAME}} ၏ အမည်မသိ {{PLURAL:$1|အသုံးပြုသူ|အသုံးပြုသူများ}}", + "siteuser": "{{SITENAME}} အသုံးပြုသူ $1", + "anonuser": "{{SITENAME}} အမည်မသိ အသုံးပြုသူ $1", + "lastmodifiedatby": "ဤစာမျက်နှာကို $1၊ $2 အချိန်တွင် $3 က နောက်ဆုံး ပြင်ဆင်ခဲ့သည်။", "others": "အခြား", + "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|အသုံးပြုသူ}}|အသုံးပြုသူများ}} $1", + "anonusers": "{{SITENAME}} အမည်မသိ {{PLURAL:$2|အသုံးပြုသူ|အသုံးပြုသူများ}} $1", + "spamprotectiontitle": "စပန်း ကာကွယ်ခြင်း စိစစ်မှု", "simpleantispam-label": "Anti-spam စစ်ဆေးခြင်း။\nဤအရာအား မဖြည့်ပါနှင့်!", "pageinfo-title": "\"$1\" အတွက် အချက်အလက်များ", "pageinfo-header-basic": "အခြေခံသတင်းအချက်အလက်", @@ -1676,7 +2069,9 @@ "pageinfo-length": "စာမျက်နှာ အလျား (ဘိုက်ဖြင့်)", "pageinfo-article-id": "စာမျက်နှာ အိုင်ဒီ", "pageinfo-language": "စာမျက်နှာ စာကိုယ် ဘာသာစကား", + "pageinfo-language-change": "ပြောင်းလဲရန်", "pageinfo-content-model": "စာမျက်နှာ မာတိကာမော်ဒယ်", + "pageinfo-content-model-change": "ပြောင်းလဲရန်", "pageinfo-robot-policy": "စက်ရုပ်များမှ index ပြုလုပ်ခြင်း", "pageinfo-robot-index": "ခွင့်ပြုပြီး", "pageinfo-robot-noindex": "ခွင့်မပြုထားပါ", @@ -1699,12 +2094,25 @@ "pageinfo-toolboxlink": "စာမျက်နှာ အချက်အလက်များ", "pageinfo-contentpage": "မာတိကစာမျက်နှာအဖြစ် ရေတွက်ပြီး", "pageinfo-contentpage-yes": "မှန်", + "pageinfo-category-info": "ကဏ္ဍ သတင်းအချက်အလက်", + "pageinfo-category-total": "အဖွဲ့ဝင်များ စုစုပေါင်းအရေအတွက်", + "pageinfo-category-pages": "စာမျက်နှာများ အရေအတွက်", + "pageinfo-category-subcats": "ကဏ္ဍခွဲများ အရေအတွက်", + "pageinfo-category-files": "ဖိုင်များ အရေအတွက်", + "pageinfo-user-id": "အသုံးပြုသူ အိုင်ဒီ", "markaspatrolleddiff": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားရန်", "markaspatrolledtext": "ဤစာမျက်နှာအား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားရန်", + "markaspatrolledtext-file": "ဤဖိုင်ဗားရှင်းအား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားရန်", "markedaspatrolled": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီး", "markedaspatrolledtext": "[[:$1]] ၏ ရွေးချယ်ထားသော တည်းဖြတ်မူကို စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီးပါပြီ။", + "markedaspatrollederror": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မမှတ်သားနိုင်ပါ", + "markedaspatrollederror-noautopatrol": "သင်၏ကိုယ်ပိုင် ပြောင်းလဲမှုများကို စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားရန် ခွင့်မပြုပါ။", "markedaspatrollednotify": "$1 သို့ ဤပြောင်းလဲမှုအား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီးပါပြီ။", + "markedaspatrollederrornotify": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားခြင်း မအောင်မြင်ပါ", "patrol-log-page": "စောင့်ကြပ်စစ်ဆေးမှု မှတ်တမ်း", + "patrol-log-header": "ဤသည် စောင့်ကြပ်စစ်ဆေးထားသော ပြန်လည်ပြင်ဆင်မှုများ၏ မှတ်တမ်းဖြစ်သည်။", + "confirm-markpatrolled-button": "အိုကေ", + "confirm-markpatrolled-top": "$2 ၏ $3 အား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားမည်လော။", "filedeleteerror-short": "ဖိုင်ဖျက်ရာတွင် အမှားအယွင်း - $1", "previousdiff": "← တည်းဖြတ်မူ အဟောင်း", "nextdiff": "ပိုသစ်သော တည်းဖြတ်မှု", @@ -1720,12 +2128,35 @@ "newimages": "ပုံအသစ်များပြခန်း", "newimages-legend": "စိစစ်မှု", "newimages-label": "ဖိုင်အမည် (သို့ ယင်း၏အစိတ်အပိုင်း) -", + "newimages-user": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည်", + "newimages-newbies": "အကောင့်အသစ်များ၏ ပံ့ပိုးမှုများကိုသာ ပြရန်", + "newimages-mediatype": "မီဒီယာ အမျိုးအစား:", "noimages": "ကြည့်စရာဘာမှ မရှိပါ။", "ilsubmit": "ရှာဖွေရန်", "bydate": "ရက်စွဲဖြင့်", "sp-newimages-showfrom": "$1 နေ့ $2 အချိန်ကစသော ဖိုင်အသစ်များကို ပြရန်", + "seconds": "{{PLURAL:$1|$1 စက္ကန့်|$1 စက္ကန့်}}", + "minutes": "{{PLURAL:$1|$1 မိနစ်|$1 မိနစ်}}", + "hours": "{{PLURAL:$1|$1 နာရီ|$1 နာရီ}}", + "days": "{{PLURAL:$1|$1 ရက်|$1 ရက်}}", + "weeks": "{{PLURAL:$1|$1 ပတ်|$1 ပတ်}}", + "months": "{{PLURAL:$1|$1 လ|$1 လ}}", + "years": "{{PLURAL:$1|$1 နှစ်|$1 နှစ်}}", + "ago": "$1 အကြာက", + "just-now": "ယခုလေးတင်", + "hours-ago": "$1 {{PLURAL:$1|နာရီ|နာရီ}}အကြာက", + "minutes-ago": "$1 {{PLURAL:$1|မိနစ်|မိနစ်}} အကြာက", + "seconds-ago": "$1 {{PLURAL:$1|စက္ကန့်|စက္ကန့်}} အကြာက", + "monday-at": "တနင်္လာနေ့က $1", + "tuesday-at": "အင်္ဂါနေ့က $1", + "wednesday-at": "ဗုဒ္ဓဟူးနေ့က $1", + "thursday-at": "ကြာသပတေးနေ့က $1", + "friday-at": "သောကြာနေ့က $1", + "saturday-at": "စနေနေ့က $1", + "sunday-at": "တနင်္ဂနွေနေ့က $1", + "yesterday-at": "မနေ့က $1", "bad_image_list": "ဖောမတ်ပုံစံမှာ အောက်ပါအတိုင်းဖြစ်သည်။\n\nစာရင်းတွင်ထည့်သွင်းထားသော အရာများကိုသာ ထည့်သွင်းစဉ်းစားမည်။ (ခရေပွင့် * ဖြင့်စသော စာကြောင်းများ)\nစာကြောင်း၏ ပထမဆုံး လင့်သည် ဖိုင်ညံ့ ဖြစ်ရမည်။\nယင်းစာကြောင်းတွင်ပင် နောက်ထပ်လာသောလင့်များကို ချွင်းချက်အဖြစ် စဉ်းစားမည်။ ဆိုလိုသည်မှာ ၎င်းလင့်များတွင်လည်း အဆိုပါ ဖိုင်ညံ့ ပါကောင်း ပါဝင်နေမည်။", - "metadata": "Metadata", + "metadata": "မီတာဒေတာ", "metadata-help": "ဤဖိုင်တွင် သတင်းအချက်အလက် အပိုများ ပါဝင်သည်။ ဒီဂျစ်တယ် ကင်မရာ သို့ စကင်နာများက ထည့်ပေါင်းပေးလိုက်ခြင်း ဖြစ်ကောင်းဖြစ်မည်။\nအကယ်၍ ဖိုင်ကို မူရင်းအခြေအနေမှ ပြုပြင်လိုက်ပါက အသေးစိတ်အချို့သည် ပြုပြင်ထားသောဖိုင်တွင် အပြည့်အစုံ ပြန်ပါလာမည်မဟုတ်။", "metadata-expand": "ချဲ့ထားသော အသေးစိတ်များကို ပြရန်", "metadata-collapse": "ချဲ့ထားသော အသေးစိတ်များကို ပြရန်", @@ -1758,8 +2189,17 @@ "exif-gpslatitude": "လတ္တီကျု", "exif-gpslongitude": "လောင်ဂျီကျု", "exif-gpsaltitude": "အမြင့်", + "exif-gpsimgdirection": "ရုပ်ပုံ၏ လမ်းကြောင်း", "exif-gpsdatestamp": "ဂျီပီအက်စ်ရက်စွဲ", + "exif-objectname": "ခေါင်းစဉ်တို", + "exif-contact": "ဆက်သွယ်ရန် လိပ်စာ", "exif-languagecode": "ဘာသာစကား", + "exif-iimcategory": "ကဏ္ဍ", + "exif-cameraownername": "ကင်မရာပိုင်ရှင်", + "exif-copyrighted": "မူပိုင်ခွင့် အခြေအနေ", + "exif-copyrightowner": "မူပိုင်ခွင့်ပိုင်ရှင်", + "exif-disclaimer": "သတိပြုစရာ", + "exif-contentwarning": "အကြောင်းအရာ သတိပေးချက်", "exif-orientation-1": "ပုံမှန်", "exif-componentsconfiguration-0": "မတည်ရှိပါ", "exif-subjectdistance-value": "$1 မီတာ", @@ -1784,32 +2224,94 @@ "exif-contrast-2": "အပြင်း", "exif-saturation-0": "သာမန်", "exif-sharpness-0": "ပုံမှန်", + "exif-subjectdistancerange-0": "မသိရှိပါ", "exif-subjectdistancerange-1": "မက်ကရို", + "exif-subjectdistancerange-2": "အနီးကြည့်", + "exif-subjectdistancerange-3": "အဝေးကြည့်", + "exif-gpslatitude-n": "မြောက်လတ္တီကျု", + "exif-gpslatitude-s": "တောင်လတ္တီကျု", + "exif-gpslongitude-e": "အရှေ့လောင်ဂျီကျု", "exif-gpslongitude-w": "အနောက်လောင်ဂျီကျု", + "exif-gpsaltitude-above-sealevel": "ပင်လယ်ရေမျက်နှာပြင်အမြင့် $1 {{PLURAL:$1|မီတာ|မီတာ}}", + "exif-gpsaltitude-below-sealevel": "ပင်လယ်ရေမျက်နှာပြင်အောက် $1 {{PLURAL:$1|မီတာ|မီတာ}}", + "exif-gpsmeasuremode-2": "နှစ်ဖက်မြင် အတိုင်းအတာ", + "exif-gpsmeasuremode-3": "သုံးဖက်မြင် အတိုင်းအတာ", + "exif-gpsspeed-k": "တစ်နာရီလျင် ကီလိုမီတာနှုန်း", "exif-gpsspeed-m": "တစ်နာရီလျှင် ရှိသည့် မိုင်နှုန်း", + "exif-gpsspeed-n": "တစ်နာရီလျင် ရေမိုင်နှုန်း", + "exif-gpsdestdistance-k": "ကီလိုမီတာ", + "exif-gpsdestdistance-m": "မိုင်", + "exif-gpsdestdistance-n": "ရေမိုင်", + "exif-gpsdop-excellent": "အထူးကောင်း ($1)", + "exif-gpsdop-good": "ကောင်း ($1)", + "exif-gpsdop-moderate": "အလယ်အလတ် ($1)", + "exif-gpsdop-fair": "အတော်အသင့် ($1)", + "exif-gpsdop-poor": "ညံ့ဖျင်း ($1)", + "exif-objectcycle-a": "မနက်ပိုင်းသာ", + "exif-objectcycle-p": "ညနေပိုင်းသာ", + "exif-gpsdirection-m": "သံလိုက်လမ်းကြောင်း", "exif-dc-contributor": "ဆောင်ရွက်ပေးထားသူများ", + "exif-dc-source": "ရင်းမြစ် မီဒီယာ", + "exif-dc-type": "မီဒီယာ အမျိုးအစား", + "exif-iimcategory-ace": "အနုပညာ၊ ယဥ်ကျေးမှုနှင့် ဖြေဖျော်ရေး", + "exif-iimcategory-clj": "ရာဇဝတ်မှုနှင့် ဥပဒေ", + "exif-iimcategory-dis": "ဘေးအန္တရာယ်များနှင့် မတော်တဆမှုများ", + "exif-iimcategory-fin": "စီးပွားရေးနှင့် စီးပွားရေးလုပ်ငန်း", + "exif-iimcategory-edu": "ပညာရေး", + "exif-iimcategory-evn": "ပတ်ဝန်းကျင်", + "exif-iimcategory-hth": "ကျန်းမာရေး", + "exif-iimcategory-lab": "အလုပ်အကိုင်", + "exif-iimcategory-pol": "နိုင်ငံရေး", + "exif-iimcategory-rel": "ဘာသာရေးနှင့် ယုံကြည်မှု", + "exif-iimcategory-sci": "သိပ္ပံနှင့် နည်းပညာ", + "exif-iimcategory-spo": "အားကစား", + "exif-iimcategory-wea": "ရာသီဥတု", + "exif-urgency-normal": "ပုံမှန် ($1)", + "exif-urgency-low": "နိမ့် ($1)", + "exif-urgency-high": "မြင့် ($1)", "namespacesall": "အားလုံး", "monthsall": "အားလုံး", "confirmemail": "အီးမေးကိုအတည်ပြုပါ", "confirmemail_send": "အတည်ပြုချက်ကုတ်ကို အီးမေးပို့ပေးရန်", + "confirmemail_sent": "အတည်ပြုချက် အီးမေးလ် ပို့ပြီး", + "confirmemail_needlogin": "သင်၏ အီးမေးလ်လိပ်စာကို အတည်ပြုရန် $1 ပါ။", + "confirmemail_loggedin": "သင်၏ အီးမေးလ်လိပ်စာ အတည်ပြုပြီးပါပြီ။", + "confirmemail_subject": "{{SITENAME}} အီးမေးလ်လိပ်စာ အတည်ပြုချက်", + "invalidateemail": "အီးမေးလ် အတည်ပြုခြင်းကို ပယ်ဖျက်ရန်", + "notificationemail_subject_changed": "{{SITENAME}} မှတ်ပုံတင်ထားသော အီးမေးလ်လိပ်စာကို ပြောင်းလဲလိုက်သည်", + "notificationemail_subject_removed": "{{SITENAME}} မှတ်ပုံတင်ထားသော အီးမေးလ်လိပ်စာကို ဖယ်ရှားလိုက်သည်", + "deletedwhileediting": "သတိပေးချက်: ဤစာမျက်နှာကို သင် စတင်တည်းဖြတ်ပြီးနောက် ဖျက်ပစ်ခဲ့သည်။", "recreate": "ပြန်လည်ဖန်တီးရန်", "confirm_purge_button": "အိုကေ", "confirm-purge-top": "ဤစာမျက်နှာ၏ cache အား ရှင်းလင်းမည်လော?", + "confirm-watch-button": "အိုကေ", + "confirm-watch-top": "ဤစာမျက်နှာကို သင်၏စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်မည်လော", + "confirm-unwatch-button": "အိုကေ", + "confirm-unwatch-top": "ဤစာမျက်နှာကို သင်၏စောင့်ကြည့်စာရင်းမှ ဖယ်ရှားမည်လော", + "confirm-rollback-button": "အိုကေ", "imgmultipageprev": "← ပြီးခဲ့သော စာမျက်နှာ", "imgmultipagenext": "နောက်စာမျက်နှာ →", "imgmultigo": "သွားပါ!", "imgmultigoto": "စာမျက်နှာ $1 ကို သွားရန်", "img-lang-default": "(ပင်မ ဘာသာစကား)", + "img-lang-go": "သွားပါ", + "ascending_abbrev": "ငယ်စဉ်ကြီးလိုက်", + "descending_abbrev": "ကြီးစဉ်ငယ်လိုက်", "table_pager_next": "နောက်စာမျက်နှာ", "table_pager_prev": "ပြီးခဲ့သော စာမျက်နှာ", "table_pager_first": "ပထမဆုံး စာမျက်နှာ", "table_pager_last": "နောက်ဆုံးစာမျက်နှာ", + "table_pager_limit": "စာမျက်နှာအလိုက် အကြောင်းအရာ $1 ကိုပြရန်", + "table_pager_limit_label": "စာမျက်နှာအလိုက် အကြောင်းအရာများ:", "table_pager_limit_submit": "သွားပါ", "table_pager_empty": "မည်သည့်ရလဒ်မှ မရှိပါ", "autosumm-blank": "စာမျက်နှာကို ဗလာလုပ်လိုက်သည်", + "autosumm-replace": "အကြောင်းအရာ \"$1\" ဖြင့် အစားထိုးခဲ့သည်", "autoredircomment": "စာမျက်နှာကို [[$1]] သို့ ပြန်ညွှန်းလိုက်သည်", + "autosumm-removed-redirect": "[[$1]] သို့ ပြန်ညွှန်းကို ဖယ်ရှားခဲ့သည်", "autosumm-changed-redirect-target": "ပြန်ညွှန်းကို [[$1]] မှ [[$2]] သို့ ပြောင်းလဲခဲ့သည်", "autosumm-new": "\"$1\" အစချီသော စာလုံးတို့နှင့် စာမျက်နှာကို ဖန်တီးလိုက်သည်", + "autosumm-newblank": "ဗလာစာမျက်နှာကို ဖန်တီးခဲ့သည်", "size-bytes": "$1 {{PLURAL:$1|ဘိုက်|ဘိုက်}}", "watchlistedit-normal-title": "စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်", "watchlistedit-normal-legend": "စောင့်ကြည့်စာရင်းမှ ခေါင်းစဉ်များကို ဖျက်ရန်", @@ -1817,36 +2319,65 @@ "watchlistedit-normal-submit": "ခေါင်းစဉ်များကို ဖယ်ရှားရန်", "watchlistedit-normal-done": "{{PLURAL:$1|ခေါင်းစဉ်တစ်ခု|ခေါင်းစဉ် $1 ခုတို့}}ကို သင်၏ စောင့်ကြည့်စာရင်းမှ ဖယ်ရှားပြီးပြီ:", "watchlistedit-raw-titles": "ခေါင်းစဉ်များ -", + "watchlistedit-raw-submit": "စောင့်ကြည့်စာရင်းကို မွမ်းမံရန်", + "watchlistedit-raw-done": "သင်၏ စောင့်ကြည့်စာရင်းကို မွမ်းမံပြီးဖြစ်သည်။", + "watchlistedit-raw-added": "ခေါင်းစဉ် {{PLURAL:$1|၁ ခု|$1 ခု}} ပေါင်းထည့်ခဲ့သည်:", + "watchlistedit-raw-removed": "ခေါင်းစဉ် {{PLURAL:$1|၁ ခု|$1 ခု}} ဖယ်ရှားခဲ့သည်:", + "watchlistedit-clear-title": "စောင့်ကြည့်စာရင်းကို ရှင်းလင်းရန်", + "watchlistedit-clear-legend": "စောင့်ကြည့်စာရင်းကို ရှင်းလင်းရန်", + "watchlistedit-clear-explain": "သင်၏ စောင့်ကြည့်စာရင်းမှ ဆောင်းပါးများအားလုံး ဖယ်ရှားသွားပါလိမ့်မည်", + "watchlistedit-clear-titles": "ခေါင်းစဉ်များ -", + "watchlistedit-clear-submit": "စောင့်ကြည့်စာရင်းအား ရှင်းလင်းရန် (ဤသည် အမြဲတမ်း)", + "watchlistedit-clear-done": "သင်၏ စောင့်ကြည့်စာရင်းကို ရှင်းလင်းပြီးဖြစ်သည်။", + "watchlistedit-clear-jobqueue": "သင်၏ စောင့်ကြည့်စာရင်းကို ရှင်းလင်းနေသည်။ အချိန်အချို့ ကြာနိုင်ပါသည်။", + "watchlistedit-clear-removed": "ခေါင်းစဉ် {{PLURAL:$1|၁ ခု|$1 ခု}} ဖယ်ရှားခဲ့သည်:", + "watchlistedit-too-many": "ဤနေရာတွင် ပြသရန် စာမျက်နှာများ အများအပြားရှိသည်။", "watchlisttools-clear": "စောင့်ကြည့်စာရင်းကို ရှင်းလင်းရန်", "watchlisttools-view": "ကိုက်ညီသော အပြောင်းအလဲများကို ကြည့်ရန်", "watchlisttools-edit": "စောင့်ကြည့်စာရင်းများကို ကြည့်ပြီး တည်းဖြတ်ပါ။", "watchlisttools-raw": "စောင့်ကြည့်စာရင်း အကြမ်းကို တည်းဖြတ်ရန်", "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ဆွေးနွေး]])", + "timezone-local": "ဒေသတွင်း", "duplicate-defaultsort": "'''သတိပေးချက် -''' ပုံမှန် sort key \"$2\" oသည် ယခင်ပုံမှန်ဖြစ်သော sort key \"$1\" ကို override ထပ်ရေးမည်ဖြစ်သည်.", "version": "ဗားရှင်း", "version-specialpages": "အထူး စာမျက်နှာများ", + "version-editors": "တည်းဖြတ်သူများ", "version-other": "အခြား", + "version-no-ext-name": "[အမည်မရှိ]", "version-license": "မီဒီယာဝီကီ လိုင်စင်", + "version-ext-license": "လိုင်စင်", + "version-skin-colheader-name": "အသွင်အပြင်", + "version-ext-colheader-version": "ဗားရှင်း", + "version-ext-colheader-license": "လိုင်စင်", + "version-ext-colheader-description": "ဖော်ပြချက်", + "version-ext-colheader-credits": "စာရေးသူများ", + "version-license-title": "$1 အတွက် လိုင်စင်", + "version-poweredby-others": "အခြားသော", + "version-poweredby-translators": "translatewiki.net ဘာသာပြန်သူများ", "version-software": "သွင်းထားသော ဆော့ဝဲ", "version-software-product": "ထုတ်ကုန်", "version-software-version": "ဗားရှင်း", + "version-libraries-version": "ဗားရှင်း", + "version-libraries-license": "လိုင်စင်", + "version-libraries-description": "ဖော်ပြချက်", "redirect": "ဖိုင်၊ အသုံးပြုသူ၊ စာမျက်နှာ၊ တည်းဖြတ်မူ၊ သို့မဟုတ် မှတ်တမ်းအိုင်ဒီ မှ ပြန်ညွှန်းသည်", "redirect-summary": "ဤအထူးစာမျက်နှာသည် ဖိုင်တစ်ခု (ပေးထားသော ဖိုင်အမည်)၊ စာမျက်နှာတစ်ခု (ပေးထားသော တည်းဖြတ်မူအိုင်ဒီ သို့ စာမျက်နှာအိုင်ဒီ)၊ အသုံးပြုသူစာမျက်နှာတစ်ခု (ပေးထားသော အသုံးပြုသူဂဏန်းအိုင်ဒီ)၊ သို့မဟုတ် မှတ်တမ်းတစ်ခု (ပေးထားသော မှတ်တမ်းအိုင်ဒီ) ဆီသို့ ပြန်ညွှန်းသည်။ အသုံးပြုပုံ - [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], သို့မဟုတ် [[{{#Special:Redirect}}/logid/186]].", "redirect-submit": "သွားပါ", - "redirect-lookup": "ရှာဖွေ။", - "redirect-value": "တန်ဖိုး။", + "redirect-lookup": "ရှာဖွေ:", + "redirect-value": "တန်ဖိုး:", "redirect-user": "အသုံးပြုသူ အိုင်ဒီ", "redirect-page": "စာမျက်နှာ အိုင်ဒီ", "redirect-revision": "စာမျက်နှာ တည်းဖြတ်မူ", "redirect-file": "ဖိုင်အမည်", "fileduplicatesearch": "နှစ်ခုထပ်နေသောဖိုင်များကို ရှာရန်", - "fileduplicatesearch-filename": "ဖိုင်အမည် -", + "fileduplicatesearch-filename": "ဖိုင်အမည်:", "fileduplicatesearch-submit": "ရှာဖွေရန်", "specialpages": "အထူး စာမျက်နှာများ", + "specialpages-note-top": "မှတ်ချက်", "specialpages-note-restricted": "* ပုံမှန် အထူးစာမျက်နှာများ။\n* ကန့်သတ်ထားသော အထူးစာမျက်နှာများ။", "specialpages-group-maintenance": "ထိန်းသိမ်းမှု အစီရင်ခံချက်များ", "specialpages-group-other": "အခြားအထူးစာမျက်နှာများ", - "specialpages-group-login": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်", + "specialpages-group-login": "အကောင့်ဝင်ရန် / ဖန်တီးရန်", "specialpages-group-changes": "လတ်တလော အပြောင်းအလဲနှင့် မှတ်တမ်းများ", "specialpages-group-media": "မီဒီယာ အစီရင်ခံချက်များနှင့် Upload တင်ထားသည်များ", "specialpages-group-users": "အသုံးပြုသူများနှင့် အခွင့်အရေးများ", @@ -1856,6 +2387,7 @@ "specialpages-group-wiki": "ဒေတာနှင့် ကိရိယာများ", "specialpages-group-redirects": "အထူးစာမျက်နှာများကို ပြန်ညွှန်းနေသည်", "specialpages-group-spam": "စပမ်းကိရိယာများ", + "specialpages-group-developer": "ဆော့ဝဲလ်တီထွင်သူ ကိရိယာများ", "blankpage": "ဗလာစာမျက်နှာ", "intentionallyblankpage": "ဤစာမျက်နှာသည် တမင်ရည်ရွယ်ချက်ရှိရှိ ဗလာထားခဲ့ခြင်း ဖြစ်သည်။", "external_image_whitelist": " #ဤစာကြောင်းကို ဤအတိုင်းထားပါ
    \n#regular expression fragments ကို(// နှစ်ခုကြားရှိ အစိတ်အပိုင်းသာ) အောက်တွင်ထားပါ\n#ယင်းတို့ကို external (hotlinked) ပုံတို့၏URL များနှင့် တွဲညှိပေးမည်ဖြစ်သည်\n#ကိုက်ညီသည်များကို ပုံအဖြစ်ပြမည်ဖြစ်ပြီး မကိုက်ညီပါက ပုံထံပြန်ညွှန်းသည့် လင့်အဖြစ်သာပြမည်ဖြစ်သည်\n## နှင့်စသော စာကြောင်းများကို ကွန်းမန့်အဖြစ် ယူဆမည်ဖြစ်သည်\n#ဤသည်တွင် အက္ခရာအကြီးအသေး မှန်ကန်ရမည်ဖြစ်သည်\n\n#regex fragments အားလုံးကို စာကြောင်း၏အပေါ်တွင်ထားပါ။ ဤစာကြောင်းကို ဤအတိုင်းထားပါ
    ", @@ -1863,6 +2395,7 @@ "tag-filter": "[[Special:Tags|Tag]] သီးသန့်စစ်ထုတ်ရန် -", "tag-filter-submit": "စိစစ်မှု", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|စာတွဲ|စာတွဲများ}}]]: $2)", + "tag-mw-contentmodelchange": "မာတိကာမော်ဒယ် ပြောင်းလဲမှု", "tag-mw-new-redirect": "ပြန်ညွှန်းအသစ်", "tag-mw-removed-redirect": "ပြန်ညွှန်းကို ဖယ်ရှားခဲ့သည်", "tag-mw-changed-redirect-target": "ပြန်ညွှန်းကို ပြောင်းလဲခဲ့သည်", @@ -1870,66 +2403,221 @@ "tag-mw-replace": "အစားထိုးခဲ့သည်", "tag-mw-rollback": "နောက်ပြန် ပြန်ပြင်ခြင်း", "tag-mw-undo": "နောက်ပြန် ပြန်ပြင်ခြင်း", - "tags-title": "အမည်တွဲ", + "tags-title": "အမည်တွဲများ", "tags-tag": "အမည်တွဲ အမည်", "tags-active-yes": "မှန်", "tags-active-no": "မလုပ်ပါ", + "tags-source-extension": "ဆော့ဝဲလ်မှ သတ်မှတ်ထားသော", + "tags-source-none": "အသုံးမပြုတော့ပါ", "tags-edit": "ပြင်ဆင်ရန်", + "tags-delete": "ဖျက်", + "tags-activate": "စတင်သက်ဝင်စေရန်", + "tags-deactivate": "သက်ဝင်ခြင်းမလုပ်တော့ရန်", "tags-hitcount": "ပြောင်းလဲချက် $1 {{PLURAL:$1|ခု|ခု}}", + "tags-manage-no-permission": "သင့်တွင် အမည်တွဲများ အပြောင်းအလဲကို စီမံရန် ခွင့်ပြုချက်မရှိပါ။", + "tags-manage-blocked": "{{GENDER:$1|သင်}}သည် ပိတ်ပင်ခံရစဉ် အမည်တွဲများ အပြောင်းအလဲကို စီမံခွင့်မရှိပါ။", + "tags-create-heading": "အမည်တွဲအသစ် ဖန်တီးရန်", + "tags-create-tag-name": "အမည်တွဲ အမည်:", + "tags-create-reason": "အ​ကြောင်း​ပြ​ချက်:", + "tags-create-submit": "ဖန်တီးရန်", + "tags-create-already-exists": "အမည်တွဲ \"$1\" ရှိနှင့်ပြီးဖြစ်သည်။", + "tags-create-warnings-below": "အမည်တွဲ ဆက်လက်ဖန်တီးရန် ဆန္ဒရှိပါသလား။", + "tags-delete-title": "အမည်တွဲကို ဖျက်ရန်", + "tags-delete-reason": "အ​ကြောင်း​ပြ​ချက်:", + "tags-delete-not-found": "အမည်တွဲ \"$1\" မတည်ရှိပါ။", + "tags-delete-no-permission": "သင့်တွင် အမည်တွဲများ အပြောင်းအလဲကို ဖျက်ပစ်ရန် ခွင့်ပြုချက်မရှိပါ။", + "tags-activate-title": "အမည်တွဲကို သက်ဝင်စေရန်", + "tags-activate-reason": "အ​ကြောင်း​ပြ​ချက်:", + "tags-activate-not-found": "အမည်တွဲ \"$1\" မတည်ရှိပါ။", + "tags-activate-submit": "စတင်သက်ဝင်စေရန်", + "tags-deactivate-title": "အမည်တွဲကို သက်ဝင်ခြင်းမလုပ်တော့ပါ", + "tags-deactivate-reason": "အ​ကြောင်း​ပြ​ချက်:", + "tags-deactivate-submit": "သက်ဝင်ခြင်းမလုပ်တော့ရန်", + "tags-edit-title": "အမည်တွဲများကို တည်းဖြတ်ရန်", + "tags-edit-manage-link": "အမည်တွဲများကို စီမံခန့်ခွဲရန်", + "tags-edit-existing-tags": "ရှိနှင့်ပြီးသော အမည်တွဲများ:", + "tags-edit-existing-tags-none": "ဘာမှမရှိ", + "tags-edit-new-tags": "အမည်တွဲ အသစ်များ:", + "tags-edit-add": "ဤအမည်တွဲများကို ပေါင်းထည့်ရန်:", + "tags-edit-remove": "ဤအမည်တွဲများကို ဖယ်ရှားရန်:", + "tags-edit-remove-all-tags": "(အမည်တွဲများအားလုံးကို ဖယ်ရှား)", + "tags-edit-chosen-placeholder": "အမည်တွဲများအချို့ကို ရွေးချယ်ရန်", + "tags-edit-chosen-no-results": "ကိုက်ညီသော အမည်တွဲများ မတွေ့ရှိပ", + "tags-edit-reason": "အ​ကြောင်း​ပြ​ချက်:", "comparepages": "စာမျက်နှာများကို နှိုင်းယှဉ်ရန်", "compare-page1": "စာမျက်နှာတစ်", "compare-page2": "စာမျက်နှာနှစ်", "compare-rev1": "မူ တစ်", "compare-rev2": "မူ နှစ်", "compare-submit": "နှိုင်းယှဉ်ရန်", + "diff-form": "ကွဲပြားချက်များ", + "diff-form-submit": "ကွဲပြားချက်များကို ပြသရန်", + "permanentlink": "ပုံ​သေ​လိပ်​စာ​", "dberr-problems": "ဝမ်းနည်းပါသည်။ ဤဆိုက်သည် နည်းပညာပိုင်းဆိုင်ရာ အခက်အခဲများ ကြုံတွေ့နေရပါသည်။", "htmlform-required": "ဤတန်ဖိုး လိုအပ်သည်", "htmlform-submit": "ထည့်သွင်းရန်", "htmlform-reset": "ပြောင်းလဲထားသည်များ မလုပ်တော့ရန်", "htmlform-selectorother-other": "အခြား", + "htmlform-chosen-placeholder": "လုပ်ဆောင်ချက်တစ်ခု ရွေးချယ်ရန်", + "htmlform-cloner-create": "ပို၍ ထပ်ပေါင်းရန်", + "htmlform-cloner-delete": "ဖယ်ရှားရန်", + "htmlform-cloner-required": "အနည်းဆုံး တန်ဖိုးတစ်ခု လိုအပ်သည်။", + "htmlform-title-not-creatable": "\"$1\" ဖန်တီးနိုင်စွမ်းရှိသော စာမျက်နှာခေါင်းစဉ် မဟုတ်ပါ", + "htmlform-title-not-exists": "$1 မတည်ရှိပါ။", + "htmlform-user-not-exists": "$1 မတည်ရှိပါ။", + "htmlform-user-not-valid": "$1 သည် ဆီလျော်သော အသုံးပြုသူအမည် မဟုတ်ပါ။", "logentry-delete-delete": "$3 စာမျက်နှာကို $1 က {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}", "logentry-delete-delete_redir": "ပြန်ညွှန်း $3 ကို ထပ်ပိုးရေးသားခြင်းဖြင့် $1 က {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}", "logentry-delete-restore": "စာမျက်နှာ $3 ($4) ကို $1 က {{GENDER:$2|ပြန်လည်ထိန်းသိမ်းခဲ့သည်}}", + "logentry-delete-restore-nocount": "$1 က စာမျက်နှာ $3 ကို {{GENDER:$2|ပြန်လည်ထိန်းသိမ်းခဲ့သည်}}", + "restore-count-files": "{{PLURAL: $1|၁ ဖိုင်|$1 ဖိုင်များ}}", "logentry-delete-revision": "$3 စာမျက်နှာပေါ်ရှိ {{PLURAL:$5|တည်းဖြတ်မူတစ်ခု|တည်းဖြတ်မူ $5 ခု}}၏ အမြင်ပုံစံကို $1 က {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}: $4", "revdelete-content-hid": "အကြောင်းအရာ ဝှက်ခြင်း", "revdelete-restricted": "အက်ဒမင်များသို့ ကန့်သတ်ချက်များ သက်ရောက်ရန်", "revdelete-unrestricted": "အက်ဒမင်များအတွက် ကန့်သတ်ချက်များကို ဖယ်ရှားရန်", + "logentry-block-block": "$1 က {{GENDER:$4|$3}} ကို သက်တမ်းကုန်လွန်ချိန် $5 $6 ဖြင့် {{GENDER:$2|ပိတ်ပင်ခဲ့သည်}}", + "logentry-block-unblock": "$1 က {{GENDER:$4|$3}} ကို {{GENDER:$2|ပိတ်ပင်မှုမှ ပြန်ဖြေခဲ့သည်}}", + "logentry-block-reblock": "$1 က {{GENDER:$4|$3}} အတွက် ပိတ်ပင်မှုအပြင်အဆင်များကို သက်တမ်းကုန်လွန်ချိန် $5 $6 ဖြင့် {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}", "logentry-suppress-block": "{{GENDER:$4|$3}} အား $5 ကြာအောင် $1 က {{GENDER:$2|ပိတ်ပင်ခဲ့သည်}} $6", + "logentry-suppress-reblock": "$1 က {{GENDER:$4|$3}} အတွက် ပိတ်ပင်မှုအပြင်အဆင်များကို သက်တမ်းကုန်လွန်ချိန် $5 $6 ဖြင့် {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}", "logentry-move-move": "$3 စာမျက်နှာကို $4 သို့ $1က {{GENDER:$2|ရွှေ့ခဲ့သည်}}", "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားဘဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}", "logentry-move-move_redir": "$3 စာမျက်နှာကို $4 သို့ ပြန်ညွှန်းပေါ်ထပ်၍ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}", "logentry-move-move_redir-noredirect": "$3 မှ $4 သို့ ပြန်ညွှန်းပေါ်ထပ်အုပ်ကာ ပြန်ညွှန်းချန်မထားဘဲ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}", "logentry-patrol-patrol-auto": "စာမျက်နှာ $3 ၏ တည်းဖြတ်မူ $4 အား $1 က စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း အလိုအလျောက် {{GENDER:$2|မှတ်သားခဲ့သည်}}", + "logentry-newusers-newusers": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}", "logentry-newusers-create": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}", "logentry-newusers-create2": "အသုံးပြုသူအကောင့် $3 ကို $1 က{{GENDER:$2|ဖန်တီးခဲ့သည်}}", + "logentry-newusers-byemail": "အသုံးပြုသူအကောင့် $3 ကို $1 က {{GENDER:$2|ဖန်တီးခဲ့ပြီး}} စကားဝှက်ကို အီးမေးလ်မှ ပို့ခဲ့သည်", "logentry-newusers-autocreate": "အသုံးပြုသူအကောင့် $1 ကို အလိုအလျောက် {{GENDER:$2|ဖန်တီးခဲ့သည်}}", + "logentry-protect-move_prot": "$1 က ကာကွယ်မှုအပြင်အဆင်များကို $4 မှ $3 သို့ {{GENDER:$2|ရွေ့ပြောင်းခဲ့သည်}}", + "logentry-protect-unprotect": "$1 က ကာကွယ်မှုကို $3 မှ {{GENDER:$2|ဖယ်ရှားခဲ့သည်}}", "logentry-protect-protect": "$1 က $3 ကို {{GENDER:$2|ကာကွယ်ခဲ့သည်}} $4", "logentry-protect-modify": "$3 အတွက် ကာကွယ်မှုအဆင့်ကို $1 {{GENDER:$2|က ပြောင်းလဲခဲ့သည်}} $4", "logentry-rights-rights": "{{GENDER:$6|$3}} အတွက် အုပ်စုအဖွဲ့ဝင် $4 မှ $5 သို့ $1 က {{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|upload တင်ခဲ့သည်}}", "logentry-upload-overwrite": "$3 ၏ ဗားရှင်းအသစ်ကို $1 {{GENDER:$2|upload တင်ခဲ့သည်}}", + "log-name-managetags": "အမည်တွဲ စီမံခန့်ခွဲမှု မှတ်တမ်း", + "log-name-tag": "စာတွဲ မှတ်တမ်း", "rightsnone": "(ဘာမှမရှိ)", + "feedback-back": "နောက်သို့", + "feedback-cancel": "မလုပ်တော့ပါ", + "feedback-close": "ပြီးပြီ", + "feedback-dialog-title": "အကြံပေး ပေါင်းထည့်ရန်", + "feedback-message": "မက်ဆေ့:", + "feedback-subject": "အကြောင်းအရာ:", + "feedback-submit": "ထည့်သွင်းရန်", + "feedback-thanks-title": "ကျေးဇူးတင်ပါသည်", "searchsuggest-search": "{{SITENAME}} တွင် ရှာဖွေရန်", "api-error-unknown-warning": "မသိသေးသော သတိပေးချက်: \"$1\"။", + "api-error-unknownerror": "အမည်မသိ အမှား - \"$1\"", + "duration-seconds": "$1 {{PLURAL:$1|စက္ကန့်|စက္ကန့်}}", + "duration-minutes": "$1 {{PLURAL:$1|မိနစ်|မိနစ်}}", + "duration-hours": "$1 {{PLURAL:$1|နာရီ|နာရီ}}", "duration-days": "$1 {{PLURAL:$1|ရက်|ရက်}}", + "duration-weeks": "$1 {{PLURAL:$1|ပတ်|ပတ်}}", + "duration-years": "$1 {{PLURAL:$1|ခုနှစ်|ခုနှစ်}}", + "duration-decades": "$1 {{PLURAL:$1|ဆယ်စုနှစ်|ဆယ်စုနှစ်များ}}", + "duration-centuries": "$1 {{PLURAL:$1|ရာစုနှစ်|ရာစုနှစ်များ}}", + "duration-millennia": "$1 {{PLURAL:$1|ထောင်စုနှစ်|ထောင်စုနှစ်များ}}", + "limitreport-cputime": "စီပီယူ အချိန်အသုံးပြုမှု", + "limitreport-cputime-value": "$1 {{PLURAL:$1|စက္ကန့်|စက္ကန့်}}", + "limitreport-walltime-value": "$1 {{PLURAL:$1|စက္ကန့်|စက္ကန့်}}", + "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|ဘိုက်|ဘိုက်}}", + "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|ဘိုက်|ဘိုက်}}", + "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|ဘိုက်|ဘိုက်}}", + "expand_templates_output": "ရလဒ်", + "expand_templates_ok": "အိုကေ", + "expand_templates_remove_comments": "မှတ်ချက်များ ဖယ်ရှားရန်", + "expand_templates_preview": "ကြိုတင်အစမ်းကြည့်ရှုရန်", "pagelanguage": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်", "pagelang-name": "စာမျက်နှာ", "pagelang-language": "ဘာသာစကား", "pagelang-use-default": "ပင်မ ဘာသာစကားကို အသုံးပြုရန်", + "pagelang-select-lang": "ဘာသာစကား ရွေးရန်", + "pagelang-reason": "အကြောင်းပြချက်", + "pagelang-submit": "ထည့်သွင်းရန်", + "pagelang-nonexistent-page": "စာမျက်နှာ $1 မတည်ရှိပါ။", + "pagelang-unchanged-language": "စာမျက်နှာ $1 သည် ဘာသာစကား $2 သို့ သတ်မှတ်ပြီးသားဖြစ်သည်။", "right-pagelang": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်", + "action-pagelang": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်", "log-name-pagelang": "ဘာသာစကား ပြောင်းလဲမှု မှတ်တမ်း", "log-description-pagelang": "ဤအရာသည် စာမျက်နှာ၏ဘာသာစကားများ ပြောင်းလဲမှုမှတ်တမ်း ဖြစ်သည်။", + "logentry-pagelang-pagelang": "$1 က $3 ၏ ဘာသာစကားကို $4 မှ $5 သို့ {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}", + "default-skin-not-found-row-enabled": "* $1 / $2 (လုပ်ခွင့်ပြုပြီး)", + "default-skin-not-found-row-disabled": "* $1 / $2 (လုပ်ခွင့်မပြုထားပါ)", "mediastatistics": "မီဒီယာ စာရင်းအင်း", "mediastatistics-nbytes": "{{PLURAL:$1|$1 ဘိုက်|$1 ဘိုက်}} ($2; $3%)", + "mediastatistics-bytespertype": "ဤအပိုင်းအတွက် စုစုပေါင်းဖိုင်အရွယ်အစား: {{PLURAL:$1|$1 ဘိုက်|$1 ဘိုက်}} ($2; $3%)။", + "mediastatistics-allbytes": "ဖိုင်အားလုံးအတွက် စုစုပေါင်းဖိုင်အရွယ်အစား: {{PLURAL:$1|$1 ဘိုက်|$1 ဘိုက်}} ($2)။", + "mediastatistics-table-count": "ဖိုင်များ အရေအတွက်", + "mediastatistics-header-total": "ဖိုင်အားလုံး", + "special-characters-group-latin": "လက်တင်", "special-characters-group-symbols": "သင်္ကေတများ", + "special-characters-group-greek": "ဂရိ", + "special-characters-group-arabic": "အာရဗီ", + "special-characters-group-hebrew": "ဟီးဘရူး", + "special-characters-group-bangla": "ဘင်္ဂလား", + "special-characters-group-thai": "ထိုင်း", + "special-characters-group-lao": "လာအို", + "special-characters-group-khmer": "ခမာ", + "mw-widgets-dateinput-no-date": "ရက်စွဲ ရွေးမထားပါ", + "mw-widgets-mediasearch-input-placeholder": "မီဒီယာအတွက် ရှာဖွေရန်", + "mw-widgets-mediasearch-noresults": "မည်သည့်ရလဒ်မျှ မရပါ", + "mw-widgets-titleinput-description-new-page": "စာမျက်နှာ မရှိသေးပါ", + "mw-widgets-titleinput-description-redirect": "$1 သို့ ပြန်ညွှန်း", + "mw-widgets-categoryselector-add-category-placeholder": "ကဏ္ဍတစ်ခု ထည့်ပေါင်း...", + "mw-widgets-usersmultiselect-placeholder": "ပို၍ ထည့်ပေါင်း...", + "date-range-from": "နေ့စွဲမှ:", + "date-range-to": "နေ့စွဲသို့:", "randomrootpage": "ကျပန်း အခြေ စာမျက်နှာ", + "log-action-filter-block": "ပိတ်ပင်မှု အမျိုးအစား:", + "log-action-filter-contentmodel": "မာတိကာမော်ဒယ် အမျိုးအစား:", + "log-action-filter-delete": "ဖျက်ပစ်ခြင်း အမျိုးအစား:", + "log-action-filter-move": "ရွေ့ပြောင်းခြင်း အမျိုးအစား:", "log-action-filter-newusers": "အကောင့်ဖန်တီးမှု အမျိုးအစား:", + "log-action-filter-patrol": "စောင့်ကြပ်စစ်ဆေးခြင်း အမျိုးအစား:", + "log-action-filter-protect": "ကာကွယ်ခြင်း အမျိုးအစား:", + "log-action-filter-rights": "အခွင့်အရေးပြောင်းလဲမှု အမျိုးအစား:", "log-action-filter-all": "အားလုံး", + "log-action-filter-block-block": "ပိတ်ပင်", + "log-action-filter-contentmodel-change": "မာတိကာမော်ဒယ်၏ ပြောင်းလဲမှု", + "log-action-filter-delete-delete": "စာမျက်နှာ ဖျက်ပစ်ခြင်း", + "log-action-filter-delete-event": "မှတ်တမ်း ဖျက်ပစ်ခြင်း", + "log-action-filter-managetags-create": "အမည်တွဲ ဖန်တီးခြင်း", + "log-action-filter-managetags-delete": "အမည်တွဲ ဖျက်ပစ်ခြင်း", + "log-action-filter-managetags-activate": "အမည်တွဲ သက်ဝင်စေခြင်း", + "log-action-filter-managetags-deactivate": "အမည်တွဲ မသက်ဝင်စေတော့ခြင်း", "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-rights-rights": "လူဖြင့် ပြောင်းလဲမှု", + "log-action-filter-rights-autopromote": "အလိုအလျောက် ပြောင်းလဲမှု", + "authmanager-create-disabled": "အကောင့်ဖန်တီးခြင်းကို ပိတ်ထားသည်။", + "authmanager-authplugin-setpass-failed-title": "စကားဝှက်ပြောင်းလဲမှု မအောင်မြင်ပါ", + "authmanager-autocreate-noperm": "အလိုအလျာက် အကောင့်ဖန်တီးခြင်းကို ခွင့်မပြုပါ။", + "authmanager-autocreate-exception": "ရှေ့ကအမှားများကြောင့် အလိုအလျာက် အကောင့်ဖန်တီးခြင်းကို ယာယီပိတ်ထားသည်။", + "authmanager-userdoesnotexist": "အသုံးပြုသူအကောင့် \"$1\" သည် မှတ်ပုံမတင်ထားပါ။", + "authmanager-retype-help": "အတည်ပြုရန် စကားဝှက်ထပ်မံရိုက်ပါ။", + "authmanager-email-label": "အီးမေးလ်", + "authmanager-email-help": "အီးမေးလ် လိပ်စာ", + "authmanager-realname-label": "အမည်ရင်း", + "authmanager-realname-help": "အသုံးပြုသူ၏ အမည်ရင်း", + "authmanager-provider-temporarypassword": "ယာယီစကားဝှက်", + "cannotauth-not-allowed-title": "ခွင့်ပြုချက် ငြင်းပယ်လိုက်သည်", + "cannotauth-not-allowed": "သင်သည် ဤစာမျက်နှာကို အသုံးပြုခွင့်မရှိပါ", "gotointerwiki": "{{SITENAME}} မှ ထွက်ခွာနေသည်", + "pagedata-title": "စာမျက်နှာ ဒေတာ", + "pagedata-bad-title": "မဆီလျော်သော ခေါင်းစဉ်: $1", "passwordpolicies": "စကားဝှက် မူဝါဒများ", - "passwordpolicies-summary": "ဤသည်မှာ ဤဝီကီရှိ အသုံးပြုသူအုပ်စုများအတွက် အကျုံးဝင်သော စကားဝှက် မူဝါဒများ ဖြစ်သည်။" + "passwordpolicies-summary": "ဤသည်မှာ ဤဝီကီရှိ အသုံးပြုသူအုပ်စုများအတွက် အကျုံးဝင်သော စကားဝှက် မူဝါဒများ ဖြစ်သည်။", + "passwordpolicies-group": "အုပ်စု", + "passwordpolicies-policies": "မူဝါဒများ", + "passwordpolicies-policy-passwordcannotmatchusername": "စကားဝှက်သည် အသုံးပြုသူအမည်နှင့် မတူညီရပါ" } diff --git a/languages/i18n/nan.json b/languages/i18n/nan.json index 78f521b5f0..0701bd793b 100644 --- a/languages/i18n/nan.json +++ b/languages/i18n/nan.json @@ -700,6 +700,7 @@ "rcfilters-activefilters": "Chok-iōng ê lÅ«-thai", "rcfilters-activefilters-hide": "Chhàng-tiāu", "rcfilters-activefilters-show": "Tián-sÄ«", + "rcfilters-limit-and-date-label": "$1 pái {{PLURAL:$1|siu-kái}}, $2", "rcfilters-days-show-days": "$1 {{PLURAL:$1|kang}}", "rcfilters-days-show-hours": "$1 {{PLURAL:$1|tiám-cheng}}", "rcfilters-quickfilters": "Pó-chûn ê lÅ«-thai", @@ -709,8 +710,12 @@ "rcfilters-savedqueries-cancel-label": "Chhú-siau", "rcfilters-search-placeholder": "LÅ«-thai kái-ōaⁿ (ēng me-niú ia̍h chha-sûn chhōe lÅ«-thai ê miâ)", "rcfilters-filterlist-title": "LÅ«-thai", + "rcfilters-filter-editsbyself-label": "Lí ê siu-kái", + "rcfilters-filter-editsbyother-label": "Pa̍t-lâng ê siu-kái", + "rcfilters-filtergroup-userExpLevel": "Iōng-chiá teng-lio̍k kap keng-giām", "rcfilters-filter-bots-label": "Bot", "rcfilters-filter-humans-label": "Jîn-lÅ«i (m̄-sÄ« bot)", + "rcfilters-filter-pageedits-label": "Ia̍h-bÄ«n pian-chi̍p", "rcfilters-liveupdates-button": "Chek-sî kái-sin", "rcnotefrom": "Ē-kha sÄ« $2 kàu taⁿ ê kái-piàn (ke̍k-ke hián-sÄ« $1 hāng).", "rclistfrom": "Hián-sÄ« tùi $3 $2 kàu taⁿ ê sin kái-piàn", diff --git a/languages/i18n/nap.json b/languages/i18n/nap.json index 6b18e7184b..23b32440f3 100644 --- a/languages/i18n/nap.json +++ b/languages/i18n/nap.json @@ -2161,8 +2161,8 @@ "sp-contributions-blocked-notice-anon": "St'IP è bloccato mò.\nL'urdemo elemento d' 'o riggistro 'e blocche è ripurtato ccà abbascio p'avé nu riferimento:", "sp-contributions-search": "Ascìa 'e contribbute", "sp-contributions-username": "Nnerizzo IP o nomme utente", - "sp-contributions-toponly": "Facenno vedé sulamente 'e contribbute 'e l'urdeme verziune", - "sp-contributions-newonly": "Facenno vedé sulamente 'e contribbute ca songo criazione 'e paggene", + "sp-contributions-toponly": "Sulamente 'e contribbute ca songo ll'urdeme verziune", + "sp-contributions-newonly": "Sulamente 'e contribbute ca songo criazione 'e paggene", "sp-contributions-hideminor": "Annascunne cagnamiénte piccerille", "sp-contributions-submit": "Truova", "whatlinkshere": "Paggene ca cullegano a chesta", diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json index bc7c9dd01e..cffe621c1b 100644 --- a/languages/i18n/nb.json +++ b/languages/i18n/nb.json @@ -411,6 +411,7 @@ "ns-specialprotected": "Spesialsider kan ikke redigeres.", "titleprotected": "Denne tittelen har blitt lÃ¥st for oppretting av [[User:$1|$1]].\nDen angitte grunnen er $2.", "filereadonlyerror": "Kan ikke endre filen «$1» fordi filsamlingen «$2» er skrivebeskyttet.\n\nSystemadministrator ga følgende begrunnelse: «$3».", + "invalidtitle": "Ugyldig tittel", "invalidtitle-knownnamespace": "Ugyldig tittel med navnerommet «$2» og teksten «$3»", "invalidtitle-unknownnamespace": "Ugyldig tittel med ukjent navneromsnummer $1 og teksten «$2»", "exception-nologin": "Ikke innlogget", @@ -426,7 +427,7 @@ "welcomecreation-msg": "Kontoen din har blitt opprettet.\nIkke glem Ã¥ endre [[Special:Preferences|innstillingene dine]] pÃ¥ {{SITENAME}}.", "yourname": "Brukernavn:", "userlogin-yourname": "Brukernavn", - "userlogin-yourname-ph": "Fyll inn brukernavnet ditt", + "userlogin-yourname-ph": "Fyll inn ditt brukernavn", "createacct-another-username-ph": "Fyll inn brukernavnet", "yourpassword": "Passord:", "userlogin-yourpassword": "Passord", @@ -1820,8 +1821,8 @@ "filehist-filesize": "Filstørrelse", "filehist-comment": "Kommentar", "imagelinks": "Filbruk", - "linkstoimage": "Følgende {{PLURAL:$1|side|$1 sider}} har lenker til denne filen:", - "linkstoimage-more": "Mer enn $1 {{PLURAL:$1|side|sider}} lenker til denne filen.\nFølgende liste viser {{PLURAL:$1|den første siden|de $1 første sidene}}.\nEn [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengelig.", + "linkstoimage": "{{PLURAL:$1|Den følgende siden|De følgende $1 sidene}} bruker denne filen:", + "linkstoimage-more": "Mer enn $1 {{PLURAL:$1|side|sider}} bruker denne filen.\nFølgende liste viser {{PLURAL:$1|den første siden|de $1 første sidene}} som kun bruker denne filen.\nEn [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengelig.", "nolinkstoimage": "Det er ingen sider som bruker denne filen.", "morelinkstoimage": "Vis [[Special:WhatLinksHere/$1|flere lenker]] til denne filen.", "linkstoimage-redirect": "$1 (filomdirigering) $2", @@ -2098,7 +2099,7 @@ "cachedspecial-refresh-now": "Vis siste.", "categories": "Kategorier", "categories-submit": "Vis", - "categoriespagetext": "Følgende {{PLURAL:$1|kategori|kategorier}} inneholder sider eller media.\n[[Special:UnusedCategories|Ubrukte kategorier]] vises ikke her.\nSe ogsÃ¥ [[Special:WantedCategories|ønskede kategorier]].", + "categoriespagetext": "Følgende {{PLURAL:$1|kategori|kategorier}} eksisterer pÃ¥ wikien, og er muligens {{PLURAL:$1|ubrukt|ubrukte}}.\nSe ogsÃ¥ [[Special:WantedCategories|ønskede kategorier]].", "categoriesfrom": "Vis kategorier fra og med:", "deletedcontributions": "Slettede brukerbidrag", "deletedcontributions-title": "Slettede brukerbidrag", @@ -4099,6 +4100,7 @@ "edit-error-long": "Feil:\n\n$1", "revid": "revisjon $1", "pageid": "side-ID $1", + "interfaceadmin-info": "$1\n\nTillatelse til Ã¥ redigere CSS, JavaScript og JSON som gjelder hele nettstedet ble nylig utskilt til rettigheten editinterface. Om du ikke forstÃ¥r hvorfor du fÃ¥r denne feilmeldingen, se [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "<html>-tagger kan ikke brukes utenfor normale sider.", "gotointerwiki": "Forlater {{SITENAME}}", "gotointerwiki-invalid": "Den gitte tittelen er ugyldig.", @@ -4118,7 +4120,7 @@ "passwordpolicies-policy-minimumpasswordlengthtologin": "Passordet mÃ¥ være pÃ¥ minst $1 {{PLURAL:$1|tegn}} for Ã¥ kunne logge inn", "passwordpolicies-policy-passwordcannotmatchusername": "Passordet kan ikke være det samme som brukernavnet", "passwordpolicies-policy-passwordcannotmatchblacklist": "Passordet kan ikke matche spesifikt svartelistede passord", - "passwordpolicies-policy-maximalpasswordlength": "Passordet mÃ¥ være pÃ¥ minst $1 {{PLURAL:$1|tegn}}", + "passwordpolicies-policy-maximalpasswordlength": "Passordet kan maksimalt være pÃ¥ $1 {{PLURAL:$1|tegn}}", "passwordpolicies-policy-passwordcannotbepopular": "Passordet kan ikke være {{PLURAL:$1|det populære passordet|i lista over $1 populære passord}}", "easydeflate-invaliddeflate": "Det gitte innholdet er ikke riktig komprimert" } diff --git a/languages/i18n/ne.json b/languages/i18n/ne.json index 5002cfa696..5b810ea75d 100644 --- a/languages/i18n/ne.json +++ b/languages/i18n/ne.json @@ -28,7 +28,8 @@ "Nirajan pant", "Drjpoudel", "Fitoschido", - "Nabin Sapkota" + "Nabin Sapkota", + "Tulsi Bhagat" ] }, "tog-underline": "रेखाङ्कित लिङ्क:", @@ -249,8 +250,8 @@ "disclaimerpage": "Project:सामान्य अस्वीकारोक्ति", "edithelp": "सम्पादन सहायता", "helppage-top-gethelp": "सहायता", - "mainpage": "गृह पृष्ठ", - "mainpage-description": "गृह पृष्ठ", + "mainpage": "मुख्य पृष्ठ", + "mainpage-description": "मुख्य पृष्ठ", "policy-url": "Project:निति", "portal": "सामाजिक पोर्टल", "portal-url": "Project:सामाजिक पोर्टल", @@ -1128,7 +1129,7 @@ "right-viewmyprivateinfo": "आफ्नो व्यक्तिगत डेटा हेर्नुहोस (उदाहरण इमेल ठेगाना, सहि नाम)", "right-editmyprivateinfo": "आफ्नो निजी जानकारी (जस्तैः इमेल ठेगाना, बास्तविक नाम) सम्पादन गर्नुहोस्", "right-editmyoptions": "तपाईँका अभिरुचीहरू सम्पादन गर्नुहोस्", - "right-rollback": "पछिल्लो प्रयोगकर्ताको सम्पादनहरूलाई छरितो रुपमा पछाडि पर्काउने", + "right-rollback": "पछिल्लो प्रयोगकर्ताको सम्पादनहरूलाई छरितो रूपमा पछाडि फर्काउने", "right-markbotedits": "पछाडि फर्काउने सम्पादनहरूलाई बोट सम्पादनकारुपमा चिनो लगाउने", "right-noratelimit": "दर सीमाले असर नपार्ने", "right-import": "अरु विकिबाट पृष्ठहरू आयात गर्ने", @@ -1892,7 +1893,7 @@ "deleteprotected": "यो पृष्ठलाई सुरक्षित गरिएकोले तपाईं यसलाई मेटाउन सक्नु हुन्न ।", "deleting-backlinks-warning": "'''चेतावनी:''' जुन पृष्ठ तपाईं हटाउन गइरहनु भएको छ त्यससँग [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठहरू]] जोडिन्छ अथवा त्यसलाई ट्रान्सक्लयुड गर्छ।", "rollback": "सम्पादनहरू पछाडि लिने", - "rollbacklink": "पहिलेको रुपमा फर्काउने", + "rollbacklink": "पूर्ववत्", "rollbacklinkcount": "रोल्ब्याक $1 {{PLURAL:$1|सम्पादन|सम्पादनहरू}}", "rollbacklinkcount-morethan": "$1 भन्दा बढी {{PLURAL:$1|सम्पादन|सम्पादनहरू}} रोलब्याक गर्ने", "rollbackfailed": "रोलब्याक असफल", @@ -2211,7 +2212,7 @@ "movesubpagetext": "यस पृष्ठको $1 {{PLURAL:$1|सह-पृष्ठ|सह-पृष्ठहरू}} तल देखाइएको :", "movenosubpage": "यस पृष्ठका उप पृष्ठहरू छैनन्।", "movereason": "कारण :", - "revertmove": "पहिलेको रुपमा फर्काउने", + "revertmove": "पूर्ववत्", "delete_and_move_text": "== मेटाउनु आवश्यक ==\nलक्ष्य गरिएको पृष्ठ \"[[:$1]]\" पहिलादेखि छ\nके तपाईं यो त्यहाँ सार्न त्यसलाई मेट्न चाहनुहुन्छ?", "delete_and_move_confirm": "हो, पृष्ठ मेट्नुहोस्", "delete_and_move_reason": " \"[[$1]]\"बाट सार्नलाई बाटो खुलाउन मेटियो", diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json index fff1097652..1e731ee506 100644 --- a/languages/i18n/nl.json +++ b/languages/i18n/nl.json @@ -447,6 +447,7 @@ "ns-specialprotected": "Pagina's in de naamruimte \"{{ns:special}}\" kunnen niet bewerkt worden.", "titleprotected": "Het aanmaken van deze pagina is beveiligd door [[User:$1|$1]].\nDe gegeven reden is $2.", "filereadonlyerror": "Het was niet mogelijk het bestand \"$1\" aan te passen omdat de bestandsrepository \"$2\" op dit moment alleen-lezen is.\n\nDe opgegeven reden is \"''$3''\".", + "invalidtitle": "Ongeldige titel", "invalidtitle-knownnamespace": "Ongeldige titel met naamruimte \"$2\" en tekst \"$3\"", "invalidtitle-unknownnamespace": "Ongeldige titel met onbekend naamruimtenummer $1 en tekst \"$2\"", "exception-nologin": "Niet aangemeld", @@ -995,8 +996,8 @@ "diff-paragraph-moved-toold": "Deze paragraaf is verplaatst. Klik om naar de oude locatie te springen.", "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].", "searchresults": "Zoekresultaten", - "search-filter-title-prefix": "Alleen zoeken naar pagina's waarvan de titel begint met \"$1\"", - "search-filter-title-prefix-reset": "Alle zoeken naar alle pagina's", + "search-filter-title-prefix": "Alleen pagina's doorzoeken waarvan de titel begint met \"$1\"", + "search-filter-title-prefix-reset": "Alle pagina's doorzoeken", "searchresults-title": "Zoekresultaten voor \"$1\"", "titlematches": "Overeenkomst met onderwerp", "textmatches": "Overeenkomst met inhoud", @@ -1198,7 +1199,7 @@ "group-autoconfirmed": "autobevestigde gebruikers", "group-bot": "bots", "group-sysop": "beheerders", - "group-interface-admin": "Interfacemoderator", + "group-interface-admin": "interfacemoderatoren", "group-bureaucrat": "bureaucraten", "group-suppress": "toezichthouders", "group-all": "(iedereen)", @@ -1262,7 +1263,7 @@ "right-editcontentmodel": "Het paginainhoudmodel bewerken", "right-editinterface": "De gebruikersinterface bewerken", "right-editusercss": "De CSS-bestanden van andere gebruikers bewerken", - "right-edituserjson": "De JSONbestanden van andere gebruikers bewerken", + "right-edituserjson": "De JSON-bestanden van andere gebruikers bewerken", "right-edituserjs": "De JavaScriptbestanden van andere gebruikers bewerken", "right-editsitecss": "Wikibrede CSS bewerken", "right-editsitejson": "Wikibrede JSON bewerken", @@ -1855,7 +1856,7 @@ "filehist-comment": "Opmerking", "imagelinks": "Bestandsgebruik", "linkstoimage": "Dit bestand wordt op de volgende {{PLURAL:$1|pagina|$1 pagina's}} gebruikt:", - "linkstoimage-more": "Er {{PLURAL:$2|is|zijn}} meer dan $1 {{PLURAL:$1|koppeling|koppelingen}} naar dit bestand.\nDe volgende lijst geeft alleen de eerste {{PLURAL:$1|koppeling|$1 koppelingen}} naar dit bestand weer.\nEr is ook een [[Special:WhatLinksHere/$2|volledige lijst]].", + "linkstoimage-more": "Meer dan $1 {{PLURAL:$1|pagina gebruikt|pagina's gebruiken}} dit bestand.\nDe volgende lijst geeft alleen de eerste {{PLURAL:$1|pagina|$1 pagina's}} die dit bestand gebruiken weer.\nEr is ook een [[Special:WhatLinksHere/$2|volledige lijst]] beschikbaar.", "nolinkstoimage": "Geen enkele pagina gebruikt dit bestand.", "morelinkstoimage": "[[Special:WhatLinksHere/$1|Meer koppelingen]] naar dit bestand bekijken.", "linkstoimage-redirect": "$1 (bestandsdoorverwijzing) $2", diff --git a/languages/i18n/nn.json b/languages/i18n/nn.json index 3dd13447f7..154264a64e 100644 --- a/languages/i18n/nn.json +++ b/languages/i18n/nn.json @@ -1004,6 +1004,7 @@ "userrights-unchangeable-col": "Grupper du ikkje kan endre", "userrights-expiry-current": "Endar $1", "userrights-expiry-none": "Aldri", + "userrights-expiry": "Endar:", "userrights-expiry-othertime": "Anna tid:", "userrights-expiry-options": "1 dag:1 day,1 veke:1 week,1 mÃ¥nad:1 month,3 mÃ¥nader:3 months,6 mÃ¥nader:6 months,1 Ã¥r:1 year", "group": "Gruppe:", @@ -1161,6 +1162,7 @@ "recentchanges-legend": "Alternativ for siste endringar", "recentchanges-summary": "PÃ¥ denne sida ser du dei sist endra sidene i {{SITENAME}}.", "recentchanges-noresult": "Ingen endringar i den gjevne perioden passar med kriteria.", + "recentchanges-network": "PÃ¥ grunn av ein teknisk feil kunne ikkje resultata lastast inn. Freist Ã¥ oppdatera sida.", "recentchanges-feed-description": "Fylg med pÃ¥ dei siste endringane pÃ¥ denne wikien med dette abonnementet.", "recentchanges-label-newpage": "Endringa oppretta ei ny side", "recentchanges-label-minor": "Endringa er smÃ¥plukk", @@ -2034,6 +2036,7 @@ "uctop": "(gjeldande)", "month": "MÃ¥nad:", "year": "År:", + "date": "FrÃ¥ dato (og tidlegare):", "sp-contributions-newbies": "Vis berre bidrag frÃ¥ nye brukarar", "sp-contributions-newbies-sub": "FrÃ¥ nye brukarkontoar", "sp-contributions-newbies-title": "Brukarbidrag av nye brukarar", @@ -2500,6 +2503,7 @@ "svg-long-error": "Ugild SVG-fil: $1", "show-big-image": "Opphavleg fil", "show-big-image-preview": "Storleik pÃ¥ førehandsvising: $1.", + "show-big-image-preview-differ": "Storleik pÃ¥ denne $3-førehandsvisinga av denne $2-fila: $1.", "show-big-image-other": "{{PLURAL:$2|Anna oppløysing|Andre oppløysingar}}: $1.", "show-big-image-size": "$1 × $2 pikslar", "file-info-gif-looped": "gjentatt", @@ -3153,6 +3157,7 @@ "revdelete-restricted": "la til avgrensingar for administratorar", "revdelete-unrestricted": "fjerna avgrensingar for administratorar", "logentry-block-block": "$1 {{GENDER:$2|blokkerte}} {{GENDER:$4|$3}} for $5 $6", + "logentry-block-unblock": "$1 {{GENDER:$2|oppheva}} blokkeringa av {{GENDER:$4|$3}}", "logentry-suppress-reblock": "$1 {{GENDER:$2|endra}} blokkeringsinnstillingar for {{GENDER:$4|$3}} med opphøyrstid $5 $6", "logentry-merge-merge": "$1 {{GENDER:$2|fletta}} $3 inn i $4 (versjonar til og med $5)", "logentry-move-move": "$1 {{GENDER:$2|flytte}} sida $3 til $4", @@ -3222,6 +3227,8 @@ "limitreport-templateargumentsize-value": "$1/$2 byte", "limitreport-expansiondepth": "Største utvidingsdjupna", "limitreport-expensivefunctioncount": "Tal pÃ¥ dyre analysefunksjonar", + "limitreport-unstrip-depth": "Rekursjonsdjupn for «unstrip»", + "limitreport-unstrip-size": "Storleik for «unstrip» etter utviding", "expandtemplates": "Utvid malar", "expand_templates_intro": "Denne sida tek ein tekst og utvider alle malar som er bruka i teksten.\nHo utvider òg alle funksjonar som\n{{#language:…}}, og variablar som\n{{CURRENTDAY}}— bortimot alt som stÃ¥r i dobbelte klammeparentesar.\nDette gjer ho ved Ã¥ kalla dei relevante parsersetega frÃ¥ MediaWiki sjølv.", "expand_templates_title": "Konteksttittel, for {{FULLPAGENAME}} etc.:", @@ -3280,12 +3287,18 @@ "date-range-from": "FrÃ¥ dato:", "date-range-to": "Til dato:", "randomrootpage": "Tilfeldig rotside", + "log-action-filter-newusers": "Type kontooppretting:", "log-action-filter-rights": "Type endring av rettar:", + "log-action-filter-all": "Alle", "log-action-filter-delete-delete_redir": "Overskriving av omdirigering", "log-action-filter-delete-restore": "Attoppretting av side", "log-action-filter-delete-revision": "Versjonssletting", "log-action-filter-move-move": "Flytting utan overskriving av omdirigeringar", "log-action-filter-move-move_redir": "Flytting med overskriving av omdirigeringar", + "log-action-filter-newusers-create": "Oppretting av anonym brukar", + "log-action-filter-newusers-create2": "Oppretting av registrert brukar", + "log-action-filter-newusers-autocreate": "Automatisk oppretting", + "log-action-filter-newusers-byemail": "Oppretting med passord sendt pÃ¥ e-post", "log-action-filter-suppress-revision": "Versjonsundertrykking", "authmanager-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.", "authmanager-provider-temporarypassword": "Mellombels passord", diff --git a/languages/i18n/or.json b/languages/i18n/or.json index 7da0f30b30..1751fdd5b4 100644 --- a/languages/i18n/or.json +++ b/languages/i18n/or.json @@ -211,7 +211,7 @@ "redirectedfrom": "($1 ରୁ ଲେଉଟି ଆସିଛି)", "redirectpagesub": "ପୁନଃପ୍ରେରଣ ପୃଷ୍ଠା", "redirectto": "କେଉଁଠାକୁ ଲେଉଟାଣି:", - "lastmodifiedat": "ଏହି ପୃଷ୍ଠାଟି $1 ତାରିଖ $2 ବେଳେ ବଦଳାଯାଇଥିଲା ।", + "lastmodifiedat": "ଏହି ପୃଷ୍ଠାଟି $1 ଦିନ $2 ବେଳେ ବଦଳାଯାଇଥିଲା ।", "viewcount": "ଏହି ପୃଷ୍ଠାଟି {{PLURAL:$1|ଥରେ|$1 ଥର}} ଖୋଲାଯାଇଛି ।", "protectedpage": "କିଳାଯାଇଥିବା ପୃଷ୍ଠା", "jumpto": "ସିଧାସଳଖ ଯିବେ", @@ -2249,7 +2249,7 @@ "tooltip-feed-rss": "ଏହି ପୃଷ୍ଠାଟି ପାଇଁ RSS ଫିଡ଼", "tooltip-feed-atom": "ଏହି ପୃଷ୍ଠାଟି ପାଇଁ ଆଟମ ଫିଡ଼", "tooltip-t-contributions": "{{GENDER:$1|ଏହି ଇଉଜରଙ୍କର}} ଦ୍ଵାରା ହୋଇଥିବା ବଦଳ ତାଲିକା", - "tooltip-t-emailuser": "ଏହି ସଭ୍ୟଙ୍କୁ ଇ-ମେଲଟିଏ ପଠାଇବେ", + "tooltip-t-emailuser": "ଏହି {{GENDER:$1|ସଭ୍ୟ}}ଙ୍କୁ ଇ-ମେଲଟିଏ ପଠାଇବେ", "tooltip-t-upload": "ଫାଇଲ ଅପଲୋଡ଼ କରିବେ", "tooltip-t-specialpages": "ବିଶେଷ ପୃଷ୍ଠାମାନଙ୍କର ଏକ ତାଲିକା", "tooltip-t-print": "ଏହି ପୃଷ୍ଠାର ଛପାହୋଇପାରିବା ସଙ୍କଳନ", @@ -3163,5 +3163,6 @@ "special-characters-title-endash": "en ଡ୍ୟାସ", "special-characters-title-emdash": "em dash", "special-characters-title-minus": "ମେନୁଗୁଡିକର ଚିହ୍ନ", - "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ" + "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ", + "randomrootpage": "ଜାହିତାହି ମୁଳ ପୃଷ୍ଠା" } diff --git a/languages/i18n/pfl.json b/languages/i18n/pfl.json index 76c083ec24..20164c0b58 100644 --- a/languages/i18n/pfl.json +++ b/languages/i18n/pfl.json @@ -17,7 +17,7 @@ "tog-extendwatchlist": "Zaisch alle Ännarunge unn nedd nua die ledschde", "tog-showtoolbar": "Weagzaisch fas Schaffe zaische", "tog-previewontop": "VoAbligg owwahalwb vum Beawaidungsfenschda zaische", - "tog-previewonfirst": "Zaischn VoAbligg baim erschdemol Schaffe", + "tog-previewonfirst": "Zaischn Voabligg baim erschdemol Schaffe", "tog-oldsig": "Voahonneni Unnaschrifd", "tog-uselivepreview": "Uuvazeschada Vorbligg (vasugswais)", "tog-showhiddencats": "Zaisch vaschdeglde Grubbe", @@ -365,7 +365,7 @@ "updated": "(Gännad)", "note": "'''Hiwes:'''", "previewnote": "'''Deng'g drõõ, dasses nua e Vorschau isch.'''\nDoi Ännarunge sinn noch nedd gschbaischadd worre!", - "editing": "Oam $1 schaffe", + "editing": "An de Said $1 schaffe", "creating": "Magschd $1", "editingsection": "$1 schaffe (Deel)", "editingcomment": "$1 schaffe (Deel)", @@ -709,7 +709,7 @@ "filedelete-success": "'''$1''' isch gleschd worre.", "filedelete-maintenance-title": "Dadai konnned gleschd werre", "download": "Runalaade", - "randompage": "Iaschnd n'Adiggl", + "randompage": "Iaschnden Adiggl", "randomincategory-category": "Sachgrubb:", "statistics": "Schdadischdigge", "statistics-pages": "Saide", diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json index c5a42353ce..1e8ddfdd9f 100644 --- a/languages/i18n/pl.json +++ b/languages/i18n/pl.json @@ -459,6 +459,7 @@ "ns-specialprotected": "Stron specjalnych nie można edytować.", "titleprotected": "Utworzenie strony o tej nazwie zostało zablokowane przez [[User:$1|$1]].\nUzasadnienie blokady: $2.", "filereadonlyerror": "Nie można zmodyfikować pliku „$1”, ponieważ repozytorium plików „$2” jest w trybie tylko do odczytu.\n\nBlokujący go administrator systemu podał następujący powód: „$3”.", + "invalidtitle": "Nieprawidłowy tytuł", "invalidtitle-knownnamespace": "Nieprawidłowa nazwa \"$3\" w przestrzeni nazw \"$2\"", "invalidtitle-unknownnamespace": "Nieprawidłowy tytuł \"$2\" z nieznanym numerem przestrzeni nazw $1", "exception-nologin": "Nie jesteś zalogowany/a", @@ -1232,7 +1233,7 @@ "right-edit": "Edycja stron", "right-createpage": "Tworzenie stron (niebędących stronami dyskusji)", "right-createtalk": "Tworzenie stron dyskusji", - "right-createaccount": "Tworzenie kont użytkowników", + "right-createaccount": "Tworzenie nowych kont użytkowników", "right-autocreateaccount": "Automatyczne logowanie za pomocą zewnętrznego konta użytkownika", "right-minoredit": "Oznaczanie edycji jako drobnych", "right-move": "Przenoszenie stron", @@ -1247,7 +1248,7 @@ "right-reupload-shared": "Lokalne nadpisywanie pliku istniejącego w repozytorium mediów", "right-upload_by_url": "Przesyłanie plików z adresu URL", "right-purge": "Czyszczenie pamięci podręcznej stron bez pytania o potwierdzenie", - "right-autoconfirmed": "Wyłączenie z ograniczeń dla użytkowników niezarejestrowanych", + "right-autoconfirmed": "Wyłączenie z ograniczeń prędkości zakładanych na IP", "right-bot": "Oznaczanie edycji jako wykonanych automatycznie", "right-nominornewtalk": "Drobne zmiany na stronach dyskusji użytkowników nie włączają powiadomienia o nowej wiadomości", "right-apihighlimits": "Zwiększony limit w zapytaniach wykonywanych poprzez interfejs API", @@ -1297,8 +1298,8 @@ "right-patrolmarks": "Podgląd znaczników patrolowania ostatnich zmian – oznaczania jako „sprawdzone”", "right-unwatchedpages": "Podgląd listy stron nieobserwowanych", "right-mergehistory": "Łączenie historii edycji stron", - "right-userrights": "Edycja uprawnień użytkownika", - "right-userrights-interwiki": "Edycja uprawnień użytkowników innych witryn wiki", + "right-userrights": "Edycja uprawnień użytkowników", + "right-userrights-interwiki": "Edycja uprawnień użytkowników na innych witrynach wiki", "right-siteadmin": "Blokowanie i odblokowywanie bazy danych", "right-override-export-depth": "Eksport stron wraz z linkowanymi do głębokości 5 linków", "right-sendemail": "Wysyłanie e‐maili do innych użytkowników", @@ -1867,9 +1868,9 @@ "filehist-filesize": "Rozmiar pliku", "filehist-comment": "Opis", "imagelinks": "Wykorzystanie pliku", - "linkstoimage": "{{PLURAL:$1|Poniższa strona odwołuje|Następujące strony odwołują}} się do tego pliku:", - "linkstoimage-more": "Więcej niż $1 {{PLURAL:$1|strona linkuje|strony linkują|stron linkuje}} do tego pliku.\nPoniższa lista pokazuje jedynie {{PLURAL:$1|pierwszy link|pierwsze $1 linki|pierwszych $1 linków}} do tego pliku.\nDostępna jest też [[Special:WhatLinksHere/$2|pełna lista]].", - "nolinkstoimage": "Å»adna strona nie odwołuje się do tego pliku.", + "linkstoimage": "{{PLURAL:$1|Poniższa strona korzysta|Następujące strony korzystają}} z tego pliku:", + "linkstoimage-more": "Z tego pliku {{PLURAL:$1|korzysta więcej niż jedna strona| korzystają więcej niż $1 strony| korzysta więcej niż $1 stron}}.\nPoniższa lista pokazuje jedynie {{PLURAL:$1|pierwszą z ich|$1 pierwsze z nich|$1 pierwszych z nich}}.\nDostępna jest również [[Special:WhatLinksHere/$2|pełna lista]].", + "nolinkstoimage": "Å»adna strona nie korzysta z tego pliku.", "morelinkstoimage": "Pokaż [[Special:WhatLinksHere/$1|więcej odnośników]] do tego pliku.", "linkstoimage-redirect": "$1 (przekierowanie do pliku) $2", "duplicatesoffile": "{{PLURAL:$1|Następujący plik jest kopią|Następujące pliki są kopiami}} pliku ([[Special:FileDuplicateSearch/$2|więcej informacji]]):", @@ -2144,7 +2145,7 @@ "cachedspecial-refresh-now": "Najpóźniejszy widok.", "categories": "Kategorie", "categories-submit": "Pokaż", - "categoriespagetext": "Strona przedstawia {{PLURAL:$1|kategorię zawierającą|listę kategorii zawierających}} strony lub pliki.\n[[Special:UnusedCategories|Nieużywane kategorie]] zostały ukryte.\nZobacz również [[Special:WantedCategories|brakujące kategorie]].", + "categoriespagetext": "Strona przedstawia {{PLURAL:$1|istniejącą kategorię zawierającą|istniejące kategorie}} na wiki. Wymienione są także puste kategorie.\nZobacz również [[Special:WantedCategories|brakujące kategorie]].", "categoriesfrom": "Wyświetl kategorie, zaczynając od:", "deletedcontributions": "Usunięty wkład użytkownika", "deletedcontributions-title": "Usunięty wkład użytkownika", @@ -2175,8 +2176,8 @@ "listgrouprights-rights": "Uprawnienia", "listgrouprights-helppage": "Help:Uprawnienia grup użytkowników", "listgrouprights-members": "(lista członków grupy)", - "listgrouprights-addgroup": "Możliwość dodawania do {{PLURAL:$2|grupy|grup:}} $1", - "listgrouprights-removegroup": "Możliwość usuwania z {{PLURAL:$2|grupy|grup:}} $1", + "listgrouprights-addgroup": "Możliwość dodawania do {{PLURAL:$2|grupy|grup}}: $1", + "listgrouprights-removegroup": "Możliwość usuwania z {{PLURAL:$2|grupy|grup}}: $1", "listgrouprights-addgroup-all": "Możliwość dodania użytkownika do każdej grupy", "listgrouprights-removegroup-all": "Możliwość usunięcia użytkownika z każdej grupy", "listgrouprights-addgroup-self": "Możliwość dodania własnego konta do {{PLURAL:$2|grupy|grup:}} $1", @@ -2882,6 +2883,10 @@ "group-bureaucrat.css": "/* Umieszczony tutaj kod CSS dotyczyć będzie tylko biurokratów */", "common.json": "/* Umieszczony tutaj JSON zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */", "common.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */", + "group-autoconfirmed.js": "/* JavaScript tutaj umieszczony będzie dotyczyć tylko automatycznie zatwierdzonych użytkowników */", + "group-bot.js": "/* JavaScript tutaj umieszczony będzie obowiązywał tylko dla botów */", + "group-sysop.js": "/* Umieszczony tutaj kod JavaScript dotyczyć będzie tylko administratorów */", + "group-bureaucrat.js": "/* Umieszczony tutaj kod JavaScript dotyczyć będzie tylko biurokratów */", "anonymous": "{{PLURAL:$1|Anonimowy użytkownik|Anonimowi użytkownicy}} {{GRAMMAR:D.lp|{{SITENAME}}}}", "siteuser": "{{GENDER:$2|użytkownik|użytkowniczka}} {{GRAMMAR:D.lp|{{SITENAME}}}} – $1", "anonuser": "niezalogowany użytkownik {{GRAMMAR:D.lp|{{SITENAME}}}} – $1", @@ -4135,6 +4140,7 @@ "edit-error-long": "Błędy:\n\n$1", "revid": "wersja $1", "pageid": "ID strony: $1", + "interfaceadmin-info": "$1\n\nUprawnienia do edycji CSS/JS/JSON całej witryny zostały wydzielone z dotychczasowego uprawnienia editinterface. Jeżeli nie rozumiesz, dlaczego otrzymujesz ten komunikat, przeczytaj [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "Znaczniki <html> nie mogą być stosowane poza zwykłymi stronami.", "gotointerwiki": "Opuszczasz {{SITENAME}}", "gotointerwiki-invalid": "Podany tytuł jest nieprawidłowy.", diff --git a/languages/i18n/ps.json b/languages/i18n/ps.json index 2b5b10e626..41b39162ca 100644 --- a/languages/i18n/ps.json +++ b/languages/i18n/ps.json @@ -1038,6 +1038,7 @@ "group-autoconfirmed": "تاييد شوي کارنان", "group-bot": "روباټونه", "group-sysop": "پازوالان", + "group-interface-admin": "سيمييز پازوالان", "group-bureaucrat": "بيوروکراټان", "group-suppress": "ځپوونکي", "group-all": "(ټول)", @@ -1045,12 +1046,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|تاييد شوی کارن}}", "group-bot-member": "{{GENDER:$1|روباټ}}", "group-sysop-member": "{{GENDER:$1|پازوال}}", + "group-interface-admin-member": "{{GENDER:$1|سيمييز پازوالان}}", "group-bureaucrat-member": "{{GENDER:$1|بيوروکراټ}}", "group-suppress-member": "{{GENDER:$1|ځپوونکی}}", "grouppage-user": "{{ns:project}}:کارنان", "grouppage-autoconfirmed": "{{ns:project}}:تاييد شوي کارنان", "grouppage-bot": "{{ns:project}}:روباټان", "grouppage-sysop": "{{ns:project}}:پازوالان", + "grouppage-interface-admin": "{{ns:project}}:سيمييز پازوالان", "grouppage-bureaucrat": "{{ns:project}}:بيوروکراټان", "grouppage-suppress": "{{ns:project}}:ځپل", "right-read": "مخونه لوستل", diff --git a/languages/i18n/pt-br.json b/languages/i18n/pt-br.json index af43e93981..476a8bc924 100644 --- a/languages/i18n/pt-br.json +++ b/languages/i18n/pt-br.json @@ -251,6 +251,7 @@ "noindex-category": "Páginas não indexadas", "broken-file-category": "Páginas com links inválidos para arquivos", "categoryviewer-pagedlinks": "($1) ($2)", + "category-header-numerals": "$1–$2", "about": "Sobre", "article": "Página de conteúdo", "newwindow": "(abre numa nova janela)", @@ -352,6 +353,8 @@ "versionrequiredtext": "Esta página requer a versão $1 do MediaWiki para ser utilizada.\nVeja a [[Special:Version|página sobre a versão do sistema]].", "ok": "OK", "pagetitle": "$1 - {{SITENAME}}", + "pagetitle-view-mainpage": "{{SITENAME}}", + "backlinksubtitle": "← $1", "retrievedfrom": "Disponível em \"$1\"", "youhavenewmessages": "{{PLURAL:$3|Você tem}} $1 ($2).", "youhavenewmessagesfromusers": "{{PLURAL:$4|Você tem}} $1 de {{PLURAL:$3|outro usuário|$3 usuários}} ($2).", @@ -477,6 +480,7 @@ "ns-specialprotected": "Não é possível editar páginas especiais", "titleprotected": "Este título foi protegido, para que não seja criado.\nQuem o protegeu foi [[User:$1|$1]], com a justificativa: $2.", "filereadonlyerror": "Não é possível modificar o arquivo \"$1\" porque o repositório do arquivo \"$2\" está em modo somente leitura.\n\nO administrador de sistema que bloqueou ofereceu a seguinte explicação: \"$3\".", + "invalidtitle": "Título inválido", "invalidtitle-knownnamespace": "Título inválido para o espaço nominal \"$2\" e texto \"$3\"", "invalidtitle-unknownnamespace": "Título inválido para o espaço nominal de número desconhecido ($1) e texto \"$2\"", "exception-nologin": "Não está autenticado", @@ -553,6 +557,7 @@ "nocookiesnew": "A conta do usuário foi criada, mas você não foi autenticado.\n{{SITENAME}} utiliza ''cookies'' para autenticar os usuários.\nVocê tem os ''cookies'' desativados no seu navegador.\nPor favor ative-os, depois autentique-se com o seu novo nome de usuário e a sua senha.", "nocookieslogin": "Você tem os cookies desativados no seu navegador, e a {{SITENAME}} utiliza cookies para ligar os usuários às suas contas. Por favor os ative e tente novamente.", "nocookiesfornew": "A conta de usuário 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.", + "nocookiesforlogin": "{{int:nocookieslogin}}", "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": "Você não colocou um nome de usuário válido.", "loginsuccesstitle": "Autenticado", @@ -810,6 +815,7 @@ "template-semiprotected": "(semiprotegida)", "hiddencategories": "Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:", "edittools": "", + "edittools-upload": "-", "nocreatetext": "{{SITENAME}} tem restringida a habilidade de criar novas páginas.\nVolte à tela anterior e edite uma página já existente, ou [[Special:UserLogin|autentique-se ou crie uma conta]].", "nocreate-loggedin": "Você não possui permissão para criar novas páginas.", "sectioneditnotsupported-title": "Edição por seções não suportada", @@ -844,6 +850,7 @@ "content-model-text": "texto simples", "content-model-javascript": "Javascript", "content-model-css": "CSS", + "content-model-json": "JSON", "content-json-empty-object": "Objeto vazio", "content-json-empty-array": "Array vazia", "deprecated-self-close-category": "Páginas com etiquetas HTML de autofechamento não válidas", @@ -1006,6 +1013,7 @@ "mergehistory-comment": "[[:$1]] fundido em [[:$2]]: $3", "mergehistory-same-destination": "As páginas de origem e de destino não podem ser as mesmas", "mergehistory-reason": "Motivo:", + "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6", "mergelog": "Registro de fusão de históricos", "revertmerge": "Desfazer fusão", "mergelogpagetext": "Segue-se um registro das mais recentes fusões de históricos de páginas.", @@ -1155,8 +1163,10 @@ "youremail": "Seu e-mail:", "username": "Nome de {{GENDER:$1|usuário|usuária|usuário(a)}}:", "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:", + "prefs-memberingroups-type": "$1", "group-membership-link-with-expiry": "$1 (até $2)", "prefs-registration": "Hora de registro:", + "prefs-registration-date-time": "$1", "yourrealname": "Nome verdadeiro:", "yourlanguage": "Idioma:", "yourvariant": "Variante da língua de conteúdo:", @@ -1207,12 +1217,15 @@ "saveusergroups": "Salvar grupos {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}}", "userrights-groupsmember": "Membro de:", "userrights-groupsmember-auto": "Membro implícito de:", + "userrights-groupsmember-type": "$1", "userrights-groups-help": "É possível alterar os grupos em que {{GENDER:$1|este usuário|esta usuária|este(a) usuário(a)}} se encontra:\n* Uma caixa de seleção selecionada significa que {{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} encontra-se no grupo.\n* Uma caixa de seleção não selecionada significa que {{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} não se encontra no grupo.\n* Um * indica que não pode remover o grupo depois de o adicionar, ou vice-versa.\n* Um # indica que você só pode atrasar o tempo de expiração dos membros deste grupo; você não pode aumentá-lo.", "userrights-reason": "Motivo:", "userrights-no-interwiki": "Você não tem permissão para alterar privilégios de usuários em outros wikis.", "userrights-nodatabase": "O banco de dados $1 não existe ou não é um banco de dados local.", "userrights-changeable-col": "Grupos que pode alterar", "userrights-unchangeable-col": "Grupos que não pode alterar", + "userrights-irreversible-marker": "$1*", + "userrights-no-shorten-expiry-marker": "$1#", "userrights-expiry-current": "Expira a $1", "userrights-expiry-none": "Não expira", "userrights-expiry": "Expira em:", @@ -1414,6 +1427,7 @@ "action-deletechangetags": "deletar marcações da base de dados", "action-purge": "purgar esta página", "nchanges": "$1 {{PLURAL:$1|alteração|alterações}}", + "ntimes": "$1×", "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}", "enhancedrc-history": "histórico", "recentchanges": "Mudanças recentes", @@ -1600,7 +1614,9 @@ "minoreditletter": "m", "newpageletter": "N", "boteditletter": "b", + "unpatrolledletter": "!", "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 usuário|$1 usuários}} vigiando]", + "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após alterações", "newsectionsummary": "/* $1 */ nova seção", "rc-enhanced-expand": "Exibir detalhes", @@ -1885,9 +1901,9 @@ "filehist-filesize": "Tamanho do arquivo", "filehist-comment": "Comentário", "imagelinks": "Uso do arquivo", - "linkstoimage": "{{PLURAL:$1|A página a seguir tem|As $1 páginas a seguir têm}} link para este arquivo:", - "linkstoimage-more": "Mais de $1 {{PLURAL:$1|página|páginas}} tem algum link para este arquivo.\nA lista a seguir mostra apenas {{PLURAL:$1|o primeiro link|os $1 primeiros links}} para este arquivo.\nUma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.", - "nolinkstoimage": "Nenhuma página contém links para este arquivo.", + "linkstoimage": "{{PLURAL:$1|As seguinte página usa|As seguintes $1 páginas usa}} este arquivo:", + "linkstoimage-more": "Mais de $1 {{PLURAL:$1|página usa|páginas usam}} este arquivo.\nA lista a seguir mostra {{PLURAL:$ 1|a primeira página|as primeiras $1 páginas}} que usa apenas este arquivo.\nUma [[Special:WhatLinksHere/$2|lista completa]] está disponível.", + "nolinkstoimage": "Não há páginas que usem este arquivo.", "morelinkstoimage": "Ver [[Special:WhatLinksHere/$1|mais links]] para este arquivo.", "linkstoimage-redirect": "$1 (redirecionamento de arquivo) $2", "duplicatesoffile": "{{PLURAL:$1|O seguinte arquivo é duplicado|Os seguintes arquivos são duplicados}} deste arquivo ([[Special:FileDuplicateSearch/$2|mais detalhes]]):", @@ -1901,6 +1917,7 @@ "uploadnewversion-linktext": "Enviar uma nova versão deste arquivo", "shared-repo-from": "de $1", "shared-repo": "um repositório compartilhado", + "shared-repo-name-wikimediacommons": "Wikimedia Commons", "filepage.css": "/* O CSS aqui inserido será incluído na página de descrição de arquivo local e de wikis externos */", "upload-disallowed-here": "Você não pode substituir este arquivo.", "filerevert": "Reverter $1", @@ -2106,6 +2123,7 @@ "apisandbox-request-selectformat-label": "Mostrar dados do pedido como:", "apisandbox-request-format-url-label": "Sequência de consulta de URL", "apisandbox-request-url-label": "URL solicitante:", + "apisandbox-request-format-json-label": "JSON", "apisandbox-request-json-label": "Pedido JSON:", "apisandbox-request-time": "Tempo do pedido: {{PLURAL:$1|$1 ms}}", "apisandbox-results-fixtoken": "Corrigir token e reenviar", @@ -2120,6 +2138,7 @@ "apisandbox-multivalue-all-values": "$1 (Todos os valores)", "booksources": "Fontes bibliográficas", "booksources-search-legend": "Pesquisar fontes de livros", + "booksources-isbn": "ISBN:", "booksources-search": "Pesquisar", "booksources-text": "É exibida a seguir uma listagem de links para outros sites que vendem livros novos e usados e que possam possuir informações adicionais sobre os livros que você está pesquisando:", "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique se houve erros ao copiar da fonte original.", @@ -2163,7 +2182,7 @@ "cachedspecial-refresh-now": "Ver a mais recente.", "categories": "Categorias", "categories-submit": "Exibir", - "categoriespagetext": "{{PLURAL:$1|A seguinte categoria contém|As seguintes contém}} páginas ou mídia.\n[[Special:UnusedCategories|Categorias não utilizadas]] não são mostradas aqui.\nVeja também [[Special:WantedCategories|categorias pedidas]].", + "categoriespagetext": "{{PLURAL:$1|A seguinte categoria existe na wiki e pode, ou não, ser usada|As seguintes categorias existem na wiki e podem, ou não, ser usadas}}.\nVeja também as [[Special:WantedCategories|categorias desejadas]].", "categoriesfrom": "Listar categorias começando por:", "deletedcontributions": "Contribuições eliminadas", "deletedcontributions-title": "Contribuições eliminadas", @@ -2194,6 +2213,8 @@ "listgrouprights-rights": "Privilégios", "listgrouprights-helppage": "Help:Privilégios de grupo", "listgrouprights-members": "(lista de membros)", + "listgrouprights-right-display": "$1 ($2)", + "listgrouprights-right-revoked": "$1 ($2)", "listgrouprights-addgroup": "Podem adicionar {{PLURAL:$2|grupo|grupos}}: $1", "listgrouprights-removegroup": "Podem remover {{PLURAL:$2|grupo|grupos}}: $1", "listgrouprights-addgroup-all": "Podem adicionar todos os grupos", @@ -2209,6 +2230,7 @@ "listgrants-summary": "Esta é uma lista das possíveis concessões de permissões e das respetivas permissões dos usuários que são atribuídas por cada concessão. Os usuários podem autorizar aplicações a utilizar a sua conta, agindo assim em seu nome mas com as permissões limitadas com base nestas concessões. Uma aplicação que age em nome de um usuário não pode utilizar permissões que o utilizador não possui.\nPoderá existir [[{{MediaWiki:Listgrouprights-helppage}}|informação adicional]] sobre as permissões individuais.", "listgrants-grant": "Atribuição", "listgrants-rights": "Direitos", + "listgrants-grant-display": "$1 ($2)", "trackingcategories": "Categorias de rastreamento", "trackingcategories-summary": "Esta página lista categorias de monitoramento que são preenchidas automaticamente pelo software MediaWiki. Seus nomes podem ser alterados através da alteração das mensagens de sistema relevantes no namespace {{ns: 8}}.", "trackingcategories-msg": "Categoria de monitoramento", @@ -2254,6 +2276,7 @@ "emailuserfooter": "Esta mensagem foi enviada {{GENDER:$1|pelo usuário|pela usuária}} $1 para {{GENDER:$2|$2}} através da opção “{{int:emailuser}}” do projeto {{SITENAME}}. {{GENDER:$2|A sua}} resposta será enviada diretamente para {{GENDER:$1|o|a}} remetente original, e revelar-lhe-á {{GENDER:$2|o seu}} endereço de e-mail.", "usermessage-summary": "Deixar mensagem de sistema.", "usermessage-editor": "Mensagens de sistema", + "usermessage-template": "MediaWiki:UserMessage", "watchlist": "Páginas vigiadas", "mywatchlist": "Páginas vigiadas", "watchlistfor2": "Para $1 $2", @@ -2407,6 +2430,7 @@ "protect-fallback": "Permitir apenas os usuários com privilégio de \"$1\"", "protect-level-autoconfirmed": "Permitir apenas usuários autoconfirmados", "protect-level-sysop": "Permitir apenas administradores", + "protect-summary-desc": "[$1=$2] ($3)", "protect-summary-cascade": "em cascata", "protect-expiring": "expira em $1 (UTC)", "protect-expiring-local": "expira $1", @@ -2472,6 +2496,7 @@ "undelete-error-long": "Foram encontrados erros ao tentar restaurar o arquivo:\n\n$1", "undelete-show-file-confirm": "Você tem certeza de que deseja visualizar um versão eliminada do arquivo \"$1\" das $3 de $2?", "undelete-show-file-submit": "Sim", + "undelete-revision-row2": "$1 ($2) $3 . . $4 $5 $6 $7 $8", "namespace": "Espaço nominal:", "invert": "Inverter seleção", "tooltip-invert": "Marque esta caixa para esconder as alterações a páginas no espaço nominal selecionado (e no espaço nominal associado, se escolheu fazê-lo)", @@ -2636,6 +2661,7 @@ "ip_range_toolow": "Os intervalos de IP não são efetivamente permitidos.", "proxyblocker": "Bloqueador de proxy", "proxyblockreason": "O seu endereço de IP foi bloqueado por ser um proxy público. Por favor contacte o seu fornecedor do serviço de Internet ou o apoio técnico e informe-os deste problema de segurança grave.", + "sorbs": "DNSBL", "sorbsreason": "O seu endereço IP encontra-se listado como proxy aberto pela DNSBL utilizada por {{SITENAME}}.", "sorbs_create_account_reason": "O seu endereço de IP encontra-se listado como proxy aberto na DNSBL utilizada por {{SITENAME}}. Você não pode criar uma conta", "softblockrangesreason": "Contribuições anônimas não são permitidas do seu endereço IP $1 Por favor, faça login.", @@ -2892,9 +2918,23 @@ "tooltip-undo": "\"desfazer\" reverte esta edição e apresenta a página de edição no modo de previsão.\nPermite colocar uma justificativa no sumário da edição.", "tooltip-preferences-save": "Salvar preferências", "tooltip-summary": "Forneça um breve resumo", + "interlanguage-link-title": "$1 – $2", + "interlanguage-link-title-nonlang": "$1 – $2", "common.css": "/** o código CSS colocado aqui será aplicado a todos os temas */", + "print.css": "/* Código CSS colocado aqui afetará as impressões */", + "noscript.css": "/* Os estilos CSS colocados aqui afetarão os usuários que tenham o JavaScript desativado */", + "group-autoconfirmed.css": "/* Os estilos CSS colocados aqui só afetarão os usuários autoconfirmados */", + "group-user.css": "/* Os estilos CSS colocados aqui só afetarão os usuários registados */", + "group-bot.css": "/* Os estilos CSS colocados aqui só afetarão robôs */", + "group-sysop.css": "/* Os estilos CSS colocados aqui só afetarão os administradores */", + "group-bureaucrat.css": "/* Os estilos CSS colocados aqui só afetarão os burocratas */", "common.json": "/* Qualquer JSON aqui será carregado para todos os usuários em cada carregamento de página. */", "common.js": "/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */", + "group-autoconfirmed.js": "/* O código JavaScript colocado aqui só será carregado para usuários autoconfirmados */", + "group-user.js": "/* O código JavaScript colocado aqui só será carregado para usuários registados */", + "group-bot.js": "/* O código JavaScript colocado aqui só será carregado para robôs */", + "group-sysop.js": "/* O código JavaScript colocado aqui só será carregado para administradores */", + "group-bureaucrat.js": "/* O código JavaScript colocado aqui só será carregado para burocratas */", "anonymous": "{{PLURAL:$1|Usuário anônimo|Usuários anônimos}} da {{SITENAME}}", "siteuser": "{{GENDER:$2|um usuário|uma usuária|um usuário}} da {{SITENAME}} ($1)", "anonuser": "usuário anônimo $1 da {{SITENAME}}", @@ -2935,6 +2975,7 @@ "pageinfo-few-watchers": "Menos de $1 {{PLURAL:$1|vigilante|vigilantes}}", "pageinfo-few-visiting-watchers": "Pode haver ou não ser um usuário assistindo visitando edições recentes", "pageinfo-redirects-name": "Número de redirecionamentos para esta página", + "pageinfo-redirects-value": "$1", "pageinfo-subpages-name": "Subpáginas desta página", "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não redirecionamento|não redirecionamentos}})", "pageinfo-firstuser": "Criador da página", @@ -2992,6 +3033,7 @@ "mediawarning": "'''Aviso''': Este tipo de arquivo pode conter código malicioso.\nExecutá-lo poderá comprometer a segurança do seu sistema.", "imagemaxsize": "Limite de tamanho de imagem:
    ''(para páginas de descrição de arquivos)''", "thumbsize": "Tamanho de miniaturas:", + "widthheight": "$1 × $2", "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|página|páginas}}", "file-info": "tamanho: $1, tipo MIME: $2", "file-info-size": "$1 × $2 pixels, tamanho: $3, tipo MIME: $4", @@ -3027,9 +3069,11 @@ "ilsubmit": "Pesquisar", "bydate": "por data", "sp-newimages-showfrom": "Mostrar novos arquivos a partir das $2 de $1", + "video-dims": "$1, $2 × $3", "seconds-abbrev": "$1 s", "minutes-abbrev": "$1 min", "hours-abbrev": "$1 h", + "days-abbrev": "$1 d", "seconds": "{{PLURAL:$1|um segundo|$1 segundos}}", "minutes": "{{PLURAL:$1|um minuto|$1 minutos}}", "hours": "{{PLURAL:$1|uma hora|$1 horas}}", @@ -3056,6 +3100,8 @@ "metadata-expand": "Mostrar detalhes adicionais", "metadata-collapse": "Esconder detalhes restantes", "metadata-fields": "Os campos de metadados de imagens listados nesta mensagem serão incluídos na página de descrição da imagem quando a tabela de metadados estiver recolhida.\nPor padrão, outros campos estarão ocultos.\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", + "metadata-langitem": "$2: $1", + "metadata-langitem-default": "$1", "exif-imagewidth": "Largura", "exif-imagelength": "Altura", "exif-bitspersample": "Bits por componente", @@ -3101,6 +3147,7 @@ "exif-exposuretime": "Tempo de exposição", "exif-exposuretime-format": "$1 seg ($2)", "exif-fnumber": "Número F", + "exif-fnumber-format": "f/$1", "exif-exposureprogram": "Programa de exposição", "exif-spectralsensitivity": "Sensibilidade espectral", "exif-isospeedratings": "Taxa de velocidade ISO", @@ -3114,6 +3161,7 @@ "exif-lightsource": "Fonte de luz", "exif-flash": "Flash", "exif-focallength": "Comprimento de foco da lente", + "exif-focallength-format": "$1 mm", "exif-subjectarea": "Área de sujeito", "exif-flashenergy": "Energia do flash", "exif-focalplanexresolution": "Resolução do plano focal X", @@ -3168,6 +3216,7 @@ "exif-gpsareainformation": "Nome da área do GPS", "exif-gpsdatestamp": "Data do GPS", "exif-gpsdifferential": "Correção do diferencial do GPS", + "exif-coordinate-format": "$1° $2′ $3″ $4", "exif-jpegfilecomment": "Comentário de arquivo JPEG", "exif-keywords": "Palavras-chave", "exif-worldregioncreated": "Região do mundo onde a fotografia foi tirada", @@ -3232,13 +3281,32 @@ "exif-personinimage": "Pessoa retratada", "exif-originalimageheight": "Altura da imagem antes de ser cortada", "exif-originalimagewidth": "Largura da imagem antes de ser cortada", + "exif-contact-value": "$1\n\n$2\n
    \n$3\n\n$4, $5, $6 $7\n
    \n$8", + "exif-subjectnewscode-value": "$2 ($1)", "exif-compression-1": "Sem compressão", "exif-compression-2": "CCITT Grupo 3 Codificação run length de Huffman modificado unidimensional", "exif-compression-3": "CCITT Grupo 3 codificação de fax", "exif-compression-4": "CCITT Grupo 4 codificação de fax", + "exif-compression-6": "JPEG (antigo)", + "exif-compression-7": "JPEG", + "exif-compression-8": "Deflate (Adobe)", + "exif-compression-32773": "PackBits (Macintosh RLE)", + "exif-compression-32946": "Deflate (PKZIP)", + "exif-compression-34712": "JPEG2000", "exif-copyrighted-true": "Direitos autorais reservados", "exif-copyrighted-false": "Situação de direitos autorais não definido", + "exif-photometricinterpretation-0": "Preto e branco (branco é 0)", "exif-photometricinterpretation-1": "Preto e branco (Preto é 0)", + "exif-photometricinterpretation-2": "RGB", + "exif-photometricinterpretation-3": "Palete", + "exif-photometricinterpretation-4": "Máscara de transparência", + "exif-photometricinterpretation-5": "Separados (provavelmente CMYK)", + "exif-photometricinterpretation-6": "YCbCr", + "exif-photometricinterpretation-8": "CIE L*a*b*", + "exif-photometricinterpretation-9": "CIE L*a*b* (codificação ICC)", + "exif-photometricinterpretation-10": "CIE L*a*b* (codificação ITU)", + "exif-photometricinterpretation-32803": "Matriz de filtros de cores", + "exif-photometricinterpretation-34892": "Linear não processado", "exif-unknowndate": "Data desconhecida", "exif-orientation-1": "Normal", "exif-orientation-2": "Espelhamento horizontal", @@ -3250,8 +3318,13 @@ "exif-orientation-8": "Rodado 90° no sentido horário", "exif-planarconfiguration-1": "formato irregular", "exif-planarconfiguration-2": "formato plano", + "exif-xyresolution-i": "$1 ppp", + "exif-xyresolution-c": "$1 pt/cm", + "exif-colorspace-1": "sRGB", "exif-colorspace-65535": "Descalibrada", "exif-componentsconfiguration-0": "não existe", + "exif-componentsconfiguration-1": "Y", + "exif-componentsconfiguration-2": "Cb", "exif-exposureprogram-0": "Não definido", "exif-exposureprogram-1": "Manual", "exif-exposureprogram-2": "Programa normal", @@ -3438,6 +3511,13 @@ "confirm-unwatch-top": "Remover esta página das páginas vigiadas?", "confirm-rollback-button": "OK", "confirm-rollback-top": "Reverter edições nesta página?", + "semicolon-separator": "; ", + "comma-separator": ", ", + "colon-separator": ": ", + "pipe-separator": " | ", + "word-separator": " ", + "ellipsis": "...", + "percent": "$1%", "quotation-marks": "$1", "imgmultipageprev": "← página anterior", "imgmultipagenext": "próxima página →", @@ -3463,7 +3543,9 @@ "autosumm-changed-redirect-target": "Alvo de redirecionamento alterado de [[$1]] para [[$2]]", "autosumm-new": "Criou página com '$1'", "autosumm-newblank": "Criar página em branco", + "size-bytes": "$1 {{PLURAL:$1|byte|bytes}}", "size-kilobytes": "$1 kB", + "size-pixel": "$1 {{PLURAL:$1|píxel|píxeis}}", "bitrate-kilobits": "$1 kb/s", "lag-warn-normal": "É possível que as mudanças que sejam mais recentes do que $1 {{PLURAL:$1|segundo|segundos}} não sejam exibidas nesta lista.", "lag-warn-high": "Devido a sérios problemas de latência no servidor do banco de dados, as mudanças mais recentes que $1 {{PLURAL:$1|segundo|segundos}} poderão não ser exibidas nesta lista.", @@ -3539,6 +3621,8 @@ "version-entrypoints": "URLs dos pontos de entrada", "version-entrypoints-header-entrypoint": "Ponto de entrada", "version-entrypoints-header-url": "URL", + "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Caminho dos artigos]", + "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Caminho dos scripts]", "version-libraries": "Bibliotecas instaladas", "version-libraries-library": "Biblioteca", "version-libraries-version": "Versão", diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json index 6e15906d51..c22e63839f 100644 --- a/languages/i18n/pt.json +++ b/languages/i18n/pt.json @@ -443,6 +443,7 @@ "ns-specialprotected": "Não é possível editar páginas especiais.", "titleprotected": "Este título foi protegido contra criação por [[User:$1|$1]].\nA justificação dada foi $2.", "filereadonlyerror": "Não é possível modificar o ficheiro \"$1\" porque o repositório de ficheiros \"$2\" está em modo de leitura.\n\nO administrador do sistema que efetuou o bloqueio deu a seguinte explicação: \"$3\".", + "invalidtitle": "Título inválido", "invalidtitle-knownnamespace": "Título inválido com o domínio \"$2\" e texto \"$3\"", "invalidtitle-unknownnamespace": "Título inválido com número de domínio $1 desconhecido e texto \"$2\"", "exception-nologin": "Não está autenticado", @@ -1859,9 +1860,9 @@ "filehist-filesize": "Tamanho do ficheiro", "filehist-comment": "Comentário", "imagelinks": "Utilização local do ficheiro", - "linkstoimage": "{{PLURAL:$1|A seguinte página contém|As seguintes $1 páginas contêm}} hiperligações para este ficheiro:", - "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém|$1 páginas contêm}} hiperligações para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].", - "nolinkstoimage": "Não há nenhuma página que contenha hiperligações para este ficheiro.", + "linkstoimage": "{{PLURAL:$1|A seguinte página usa|As seguintes $1 páginas usam}} este ficheiro:", + "linkstoimage-more": "Mais de {{PLURAL:$1|uma página usa|$1 páginas usam}} este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].", + "nolinkstoimage": "Não há nenhuma página que use este ficheiro.", "morelinkstoimage": "Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm hiperligações para este ficheiro.", "linkstoimage-redirect": "$1 (redirecionamento de ficheiro) $2", "duplicatesoffile": "{{PLURAL:$1|O seguinte ficheiro é duplicado|Os seguintes $1 ficheiros são duplicados}} deste ficheiro ([[Special:FileDuplicateSearch/$2|mais detalhes]]):", @@ -2137,7 +2138,7 @@ "cachedspecial-refresh-now": "Ver mais recente.", "categories": "Categorias", "categories-submit": "Mostrar", - "categoriespagetext": "{{PLURAL:$1|A seguinte categoria contém páginas ou ficheiros multimédia|As seguintes categorias contêm páginas ou ficheiros multimédia}}.\nAs [[Special:UnusedCategories|categorias não utilizadas]] não são apresentadas nesta lista.\nVeja também as [[Special:WantedCategories|categorias desejadas]].", + "categoriespagetext": "{{PLURAL:$1|A seguinte categoria existe na wiki e pode, ou não, ser usada|As seguintes categorias existem na wiki e podem, ou não, ser usadas}}.\nVeja também as [[Special:WantedCategories|categorias desejadas]].", "categoriesfrom": "Mostrar categorias que comecem por:", "deletedcontributions": "Edições eliminadas", "deletedcontributions-title": "Edições eliminadas", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index 41765dfad9..4b1717d900 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -576,6 +576,7 @@ "ns-specialprotected": "Error message displayed when trying to edit a page in the Special namespace", "titleprotected": "Used as error message. Parameters:\n* $1 - username; GENDER supported\n* $2 - reason for protection", "filereadonlyerror": "Parameters:\n* $1 - file name\n* $2 - file repository name\n* $3 - reason", + "invalidtitle": "Displayed when an invalid title was encountered (generally in a list) and there are no details about it to be shown.", "invalidtitle-knownnamespace": "Displayed when an invalid title was encountered (generally in a list), but the namespace number is known to exist.\n\nParameters:\n* $1 - (Unused) the namespace number\n* $2 - the namespace name in content language or {{msg-mw|blanknamespace}} for the main namespace\n* $3 - the part of the title after the namespace (e.g. SomeName for the page User:SomeName)", "invalidtitle-unknownnamespace": "Displayed when an invalid title was encountered (generally in a list) and the namespace number is unknown.\n\nParameters:\n* $1 - the namespace number\n* $2 - the part of the title after the namespace (e.g. SomeName for the page User:SomeName)", "exception-nologin": "Generic page title used on error page when a user is not logged in. Message used by the UserNotLoggedIn exception.\n{{Identical|Not logged in}}", diff --git a/languages/i18n/ro.json b/languages/i18n/ro.json index e0c49abfbe..c028e0ad51 100644 --- a/languages/i18n/ro.json +++ b/languages/i18n/ro.json @@ -382,6 +382,9 @@ "customcssprotected": "Nu aveți permisiunea de a modifica această pagină CSS, deoarece conține setările personale ale altui utilizator.", "customjsonprotected": "Nu aveți permisiunea de a modifica această pagină JSON, deoarece conține setările personale ale altui utilizator.", "customjsprotected": "Nu aveți permisiunea de a modifica această pagină JavaScript, deoarece conține setările personale ale altui utilizator.", + "sitecssprotected": "Nu aveți dreptul să editați această pagină CSS deoarece poate afecta toți vizitatorii", + "sitejsonprotected": "Nu aveți dreptul să editați această pagină JSON deoarece poate afecta toți vizitatorii", + "sitejsprotected": "Nu aveți dreptul să editați această pagină JavaScript deoarece poate afecta toți vizitatorii", "mycustomcssprotected": "Nu aveți permisiunea să modificați această pagină CSS.", "mycustomjsonprotected": "Nu aveți permisiunea să modificați această pagină JSON.", "mycustomjsprotected": "Nu aveți permisiunea să modificați această pagină JavaScript.", @@ -390,6 +393,7 @@ "ns-specialprotected": "Paginile din spațiul de nume {{ns:special}} nu pot fi editate.", "titleprotected": "Acest titlu a fos protejat la creare de [[User:$1|$1]].\nMotivul invocat este $2.", "filereadonlyerror": "Imposibil de modificat fișierul „$1”, deoarece depozitul de fișiere „$2” este în modul „doar citire”.\n\nAdministratorul de sistem care a efectuat blocarea a furnizat explicația: „$3”.", + "invalidtitle": "Titlu incorect", "invalidtitle-knownnamespace": "Titlu invalid cu spațiul de nume „$2” și textul „$3”", "invalidtitle-unknownnamespace": "Titlu invalid cu numărul spațiului de nume $1 necunoscut și textul „$2”", "exception-nologin": "Neautentificat{{GENDER:||ă}}", @@ -1139,6 +1143,7 @@ "group-autoconfirmed": "Utilizatori autoconfirmați", "group-bot": "Roboți", "group-sysop": "Administratori", + "group-interface-admin": "Administratori de interfață", "group-bureaucrat": "Birocrați", "group-suppress": "Suprimători", "group-all": "(toți)", @@ -1146,12 +1151,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|utilizator autoconfirmat|utilizatoare autoconfirmată|utilizator autoconfirmat}}", "group-bot-member": "{{GENDER:$1|robot}}", "group-sysop-member": "{{GENDER:$1|administrator}}", + "group-interface-admin-member": "{{GENDER:$1|administrator de interfață}}", "group-bureaucrat-member": "{{GENDER:$1|birocrat}}", "group-suppress-member": "{{GENDER:$1|suprimător|suprimătoare}}", "grouppage-user": "{{ns:project}}:Utilizatori", "grouppage-autoconfirmed": "{{ns:project}}:Utilizator autoconfirmați", "grouppage-bot": "{{ns:project}}:Boți", "grouppage-sysop": "{{ns:project}}:Administratori", + "grouppage-interface-admin": "{{ns:project}}:Administratori de interfață", "grouppage-bureaucrat": "{{ns:project}}:Birocrați", "grouppage-suppress": "{{ns:project}}:Suprimători", "right-read": "Citește pagini", @@ -1202,6 +1209,9 @@ "right-editusercss": "Modifică fișierele CSS ale altor utilizatori", "right-edituserjson": "Modifică fișierele JSON ale altor utilizatori", "right-edituserjs": "Modifică fișierele JS ale altor utilizatori", + "right-editsitecss": "Editează CSS global", + "right-editsitejson": "Editează JSON global", + "right-editsitejs": "Editează JavaScript global", "right-editmyusercss": "Modificați-vă propriile fișiere CSS", "right-editmyuserjson": "Modificați-vă propriile fișiere JSON", "right-editmyuserjs": "Modificați-vă propriile fișiere JavaScript", @@ -1243,10 +1253,11 @@ "grant-createaccount": "Creare conturi", "grant-createeditmovepage": "Creează, editează și redenumește pagini", "grant-delete": "Șterge pagini, revizii și loguri", - "grant-editinterface": "Editați spațiul de nume MediaWiki și CSS/JSON/JavaScript de utilizator", + "grant-editinterface": "Editați spațiul de nume MediaWiki și fișiere JSON globale/de utilizator", "grant-editmycssjs": "Editați CSS/JSON/JavaScript ale contului dv.", "grant-editmyoptions": "Modificați-vă preferințele de utilizator", "grant-editmywatchlist": "Modificați-vă lista de pagini urmărite", + "grant-editsiteconfig": "Editează CSS/JS global și de utilizator", "grant-editpage": "Editați pagini existente", "grant-editprotected": "Editați pagini protejate", "grant-highvolume": "Volum mare de editare", @@ -1409,9 +1420,11 @@ "rcfilters-filter-humans-label": "Om (nu robot)", "rcfilters-filter-humans-description": "Modificări făcute de oameni.", "rcfilters-filtergroup-reviewstatus": "Statutul reviziei", + "rcfilters-filter-reviewstatus-unpatrolled-description": "Editări nemarcate, manual sau automat, ca patrulate.", "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrulate", "rcfilters-filter-reviewstatus-manual-description": "Modificări marcate manual ca patrulate.", "rcfilters-filter-reviewstatus-manual-label": "Patrulate manual", + "rcfilters-filter-reviewstatus-auto-description": "Editări făcute de utilizatori avansați a cărui muncă este marcată automat ca patrulată.", "rcfilters-filter-reviewstatus-auto-label": "Patrulate automat", "rcfilters-filtergroup-significance": "Semnificație", "rcfilters-filter-minor-label": "Modificări minore", @@ -1464,6 +1477,7 @@ "rcfilters-watchlist-showupdated": "Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate îngroșat.", "rcfilters-preference-label": "Ascunde versiunea îmbunătățită a Schimbărilor Recente", "rcfilters-preference-help": "Ascunde interfața schimbată în 2017 și toate uneltele adăugate de atunci.", + "rcfilters-watchlist-preference-label": "Ascunde versiunea îmbunătățită a liste de pagini urmărite", "rcfilters-filter-showlinkedfrom-label": "Arată schimbările pe paginile către care există legături în", "rcfilters-filter-showlinkedfrom-option-label": "Pages la care trimite pagina selectată", "rcfilters-filter-showlinkedto-label": "Arată schimbările din paginile ce trimit la", @@ -1726,7 +1740,7 @@ "uploadstash-zero-length": "Fișierul are lungime zero.", "invalid-chunk-offset": "Decalaj de segment nevalid", "img-auth-accessdenied": "Acces interzis", - "img-auth-nopathinfo": "PATH_INFO lipsește.\nServerul dumneavoastră nu a fost setat pentru a trece aceste informații.\nS-ar putea să fie bazat pe CGI și să nu suporte img_auth.\nVedeți https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", + "img-auth-nopathinfo": "Lipsește informația privitoare la căi.\n\nServerul dumneavoastră trebuie să fie setat pentru a transmite variabilele REQUEST_URI sau PATH_INFO.\n\nDacă face deja acest lucru, încercați să activați $wgUserPathInfo.\n\nVedeți https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", "img-auth-notindir": "Adresa cerută nu este în directorul pentru încărcări configurat.", "img-auth-badtitle": "Nu s-a putut construi un titlu valid din \"$1\".", "img-auth-nologinnWL": "Nu sunteți autentificat și \"$1\" nu este pe lista albă.", @@ -1786,8 +1800,8 @@ "filehist-filesize": "Mărimea fișierului", "filehist-comment": "Comentariu", "imagelinks": "Utilizarea fișierului", - "linkstoimage": "{{PLURAL:$1|Următoarea pagină trimite|Următoarele $1 pagini trimit spre|Următoarele $1 de pagini trimit}} către acest fișier:", - "linkstoimage-more": "Mai mult de $1 {{PLURAL:$1|pagină este legată|pagini sunt legate}} de acest fișier.\nUrmătoarea listă arată {{PLURAL:$1|prima legătură|primele $1 legături}} către acest fișier.\nO [[Special:WhatLinksHere/$2|listă completă]] este disponibilă.", + "linkstoimage": "{{PLURAL:$1|Următoarea pagină folosește|Următoarele $1 pagini folosesc |Următoarele $1 de pagini folosesc}} acest fișier:", + "linkstoimage-more": "Mai mult de $1 {{PLURAL:$1|pagină folosește|pagini folosesc}} acest fișier.\nUrmătoarea listă arată {{PLURAL:$1|prima legătură|primele $1 legături}} către acest fișier.\nEste disponibilă o [[Special:WhatLinksHere/$2|listă completă]].", "nolinkstoimage": "Nicio pagină nu utilizează această imagine.", "morelinkstoimage": "Vedeți [[Special:WhatLinksHere/$1|mai multe legături]] către acest fișier.", "linkstoimage-redirect": "$1 (redirecționare de fișier) $2", @@ -2063,7 +2077,7 @@ "cachedspecial-refresh-now": "Ultima versiune.", "categories": "Categorii", "categories-submit": "Afișează", - "categoriespagetext": "{{PLURAL:$1|Următoarea categorie conține|Următoarele categorii conțin}} pagini sau fișiere.\n[[Special:UnusedCategories|Categoriile neutilizate]] nu apar aici.\nVedeți și [[Special:WantedCategories|categoriile dorite]].", + "categoriespagetext": "{{PLURAL:$1|Următoarea categorie|Următoarele categorii}} există pe wiki și ar putea sau nu să fie nefolosite.\nVedeți și [[Special:WantedCategories|categoriile dorite]].", "categoriesfrom": "Arată categoriile pornind de la:", "deletedcontributions": "Contribuții șterse", "deletedcontributions-title": "Contribuții șterse", @@ -2619,7 +2633,7 @@ "fix-double-redirects": "Actualizează toate redirecționările care trimit la titlul original", "move-leave-redirect": "Lasă în urmă o redirecționare", "protectedpagemovewarning": "'''Atenție:''' această pagină a fost protejată astfel încât poate fi redenumită doar de către administratori.\nUltima intrare în jurnal este afișată mai jos pentru referință:", - "semiprotectedpagemovewarning": "'''Observație: această pagină a fost protejată, putând fi redenumiră doar de către utilizatorii înregistrați.'''\nUltima intrare în jurnal este afișată mai jos pentru referință:", + "semiprotectedpagemovewarning": "Notă: această pagină a fost protejată, putând fi redenumită doar de către utilizatorii autoconfirmați.\nUltima intrare în jurnal este afișată mai jos pentru referință:", "move-over-sharedrepo": "[[:$1]] există deja într-un depozit partajat. Redenumirea fișierului la acest titlu va suprascrie fișierul partajat și îl va face inaccesibil.", "file-exists-sharedrepo": "Numele ales al fișierului este deja în utilizare într-un depozit împărțit.\nAlegeți un alt nume.", "export": "Exportare pagini", @@ -3604,6 +3618,7 @@ "diff-form": "Diferențe", "diff-form-submit": "Arată diferențele", "permanentlink": "Legătură permanentă", + "permanentlink-revid": "ID versiune", "permanentlink-submit": "Mergi la versiunea", "dberr-problems": "Ne cerem scuze! Acest site întâmpină dificultăți tehnice.", "dberr-again": "Așteptați câteva minute și încercați din nou.", @@ -3636,6 +3651,10 @@ "htmlform-datetime-invalid": "Valoarea introdusă nu este recunoscută ca dată și timp. Încercați să folosiți formatul YYYY-MM-DD HH:MM:SS.", "htmlform-date-toolow": "Valoarea introdusă este anterioară primei date permise, $1.", "htmlform-date-toohigh": "Valoarea introdusă este posterioară ultimei date permise, $1.", + "htmlform-time-toolow": "Valoarea specificată este înainte de prima oră permisă, $1.", + "htmlform-time-toohigh": "Valoarea specificată este după ultima oră permisă, $1.", + "htmlform-datetime-toolow": "Valoarea specificată este înainte de prima dată permisă, $1.", + "htmlform-datetime-toohigh": "Valoarea specificată este după ultima dată permisă, $1.", "htmlform-title-badnamespace": "[[:$1]] nu se află în spațiul de nume „{{ns:$2}}”.", "htmlform-title-not-creatable": "„$1” este un titlu de pagină inutilizabil", "htmlform-title-not-exists": "$1 nu există.", @@ -3908,8 +3927,13 @@ "log-action-filter-protect-move_prot": "Mutarea protecției", "log-action-filter-rights-rights": "Modificare manuală", "log-action-filter-rights-autopromote": "Schimbare automată", + "log-action-filter-suppress-event": "Ștergere jurnal", + "log-action-filter-suppress-revision": "Ștergere versiune", + "log-action-filter-suppress-delete": "Ștergere pagină", "log-action-filter-upload-upload": "Încărcare nouă", "log-action-filter-upload-overwrite": "Reîncărcare", + "authmanager-create-disabled": "Crearea de conturi este dezactivată.", + "authmanager-create-from-login": "Pentru a crea contul, vă rugăm să completați câmpurile.", "authmanager-authplugin-setpass-failed-title": "Schimbarea parolei a eșuat", "authmanager-authplugin-setpass-bad-domain": "Domeniu invalid.", "authmanager-userdoesnotexist": "Contul de utilizator „$1” nu este înregistrat.", @@ -3953,9 +3977,14 @@ "edit-error-short": "Eroare: $1", "edit-error-long": "Erori:\n\n$1", "revid": "versiunea $1", + "pageid": "ID pagină $1", + "interfaceadmin-info": "$1\n\nPermisiunile pentru editarea de CSS/JS/JSON global au fost recent separate de dreptul editinterface. Dacă nu înțelegeți de ce primiți această eroare, vedeți [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "Tagurile <html> nu pot fi folosite în afara paginilor normale.", "gotointerwiki": "Se părăsește {{SITENAME}}", "gotointerwiki-invalid": "Titlul specificat nu este valid.", + "gotointerwiki-external": "Sunteți pe cale să părăsiți {{SITENAME}} pentru a vizita [[$2]], care este un alt site.\n\n'''[$1 Continuați către $1]'''", + "undelete-cantedit": "Nu puteți recupera această pagină pentru că nu puteți să o editați.", + "undelete-cantcreate": "Nu puteți recupera această pagină deoarece nu există o pagină cu acest nume și nu aveți dreptul să o creați.", "pagedata-title": "Datele paginii", "pagedata-not-acceptable": "Niciun format corespunzător găsit. Tipuri MIME acceptate: $1", "pagedata-bad-title": "Titlu invalid: $1.", @@ -3967,5 +3996,6 @@ "passwordpolicies-policy-passwordcannotmatchusername": "Parola nu poate fi identică cu numele de utilizator", "passwordpolicies-policy-passwordcannotmatchblacklist": "Parolele nu pot fi cele de pe lista neagră", "passwordpolicies-policy-maximalpasswordlength": "Parola trebuie să aibă cel puțin $1 {{PLURAL:$1|caracter|caractere|de caractere}}.", - "passwordpolicies-policy-passwordcannotbepopular": "Parola nu poate fi {{PLURAL:$1|o parolă populară|în lista celor $1 parole populare|în lista celor $1 de parole populare}}." + "passwordpolicies-policy-passwordcannotbepopular": "Parola nu poate fi {{PLURAL:$1|o parolă populară|în lista celor $1 parole populare|în lista celor $1 de parole populare}}.", + "easydeflate-invaliddeflate": "Conținutul oferit nu este comprimat corect" } diff --git a/languages/i18n/roa-tara.json b/languages/i18n/roa-tara.json index e32a7c2b93..7fdfdbb120 100644 --- a/languages/i18n/roa-tara.json +++ b/languages/i18n/roa-tara.json @@ -48,7 +48,7 @@ "tog-watchlisthideminor": "Scunne le cangiaminde stuèdeche da l'elenghe de le pàggene condrollate", "tog-watchlisthideliu": "Scunne le cangiaminde de l'utinde canusciute da l'elenghe de le pàggene condrollate", "tog-watchlistreloadautomatically": "Recareche automaticamende l'eleghe de le pàggene condrollate quanne cange 'nu filtre (richieste Javascript)", - "tog-watchlistunwatchlinks": "Aggiunge collegaminde dirette pe langià/non langià le eleminde jndr'à le pàggene condrollate (vole 'u JavaScript pe ausà sta funzionalità).", + "tog-watchlistunwatchlinks": "Aggiunge marcature dirette ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) pe langià/non langià le cangiaminde a le pàggene (vole 'u JavaScript pe ausà sta funzionalità).", "tog-watchlisthideanons": "Scunne le cangiaminde de l'utinde scanusciute da l'elenghe de le pàggene condrollate", "tog-watchlisthidepatrolled": "Scunne le cangiaminde condrollate jndr'à l'elenghe de le pàggene condrollate", "tog-watchlisthidecategorization": "Scunne 'a categorizzazzione d'a vôsce", @@ -317,6 +317,7 @@ "missingarticle-rev": "(versione#: $1)", "missingarticle-diff": "(Diff: $1, $2)", "readonly_lag": "'U database ha state automaticamende blocchete purcè le server de le database ca depennene da 'u master onne sciute in eccezzione", + "nonwrite-api-promise-error": "Ha state mannate a 'ndestazione HTTP 'Promise-Non-Write-API-Action', ma 'a richieste ere de 'nu module API de scritture.", "internalerror": "Errore inderne", "internalerror_info": "Errore inderne: $1", "internalerror-fatal-exception": "Eccezzione fatale d'u tipe \"$1\"", @@ -361,6 +362,7 @@ "cascadeprotected": "Sta pàgene ha state prutette da le cangiaminde, purcè jè ingluse jndr'à {{PLURAL:$1|seguende pàgene, ca jè|le seguende pàggene, ca sonde}} prutette cu l'opzione \"a cascate\":\n$2", "namespaceprotected": "Non ge tine 'u permesse pe cangià pàggene d'u neimspeise '''$1'''.", "customcssprotected": "Non ge tine 'u permesse pe cangià sta pàgene de CSS, purcè tène otre configurazione personale.", + "customjsonprotected": "Non ge tine 'u permesse pe cangià sta pàgene de JSON, purcè tène otre configurazione personale.", "customjsprotected": "Non ge tine 'u permesse pe cangià sta pàgene de Javascript, purcè tène otre configurazione personale.", "mycustomcssprotected": "Non ge tìne le permesse pe cangià sta pàgene CSS", "mycustomjsprotected": "Non ge tìne le permesse pe cangià sta pàgene JavaScript", @@ -369,6 +371,7 @@ "ns-specialprotected": "Le pàgene speciale no ponne essere cangete.", "titleprotected": "Stu titele ha state prutette da 'a ccreazione da [[User:$1|$1]].\n'U mutive jè $2.", "filereadonlyerror": "Non ge pozze cangià 'u file \"$1\" purcé l'archivije de le file \"$2\" ste in sola letture.\n\nL'amministratore d'u sisteme ca l'ave bloccate dèje sta spiegazione: \"$3\".", + "invalidtitle": "Titole invalide", "invalidtitle-knownnamespace": "Titole invalide cu 'u namespace \"$2\" e teste \"$3\"", "invalidtitle-unknownnamespace": "Titele invalide cu numere de namespace scanusciute $1 e teste \"$2\"", "exception-nologin": "Non ge sì collegate", @@ -462,7 +465,7 @@ "password-login-forbidden": "L'ause de stu nome utende e passuord onne state vietate.", "mailmypassword": "Azzere 'a passuord", "passwordremindertitle": "Passuord temboranea nova pe {{SITENAME}}", - "passwordremindertext": "Quacchedune (pò essere tu, da quiste indirizze IP $1) ha cerchete 'na nova password pe {{SITENAME}} ($4).\n'Na password temboranea pe l'utende \"$2\" ha state ccrejete e ha state 'mbostete a \"$3\".\nCe quiste ere quidde ca vulive, mo vide ce te colleghe e te scacchie 'na password nova.\n'A password temboranea adda murè 'mbrà {{PLURAL:$5|'nu giurne|$5 giurne}}.\n\nCe quacche otre 'nvece ha fatte sta rechieste, o ce tu t'è recurdate 'a password, e non g'à vuè cu cangè cchiù, allore no sce penzanne a 'stu messagge e continue a ausà 'a vecchia password.", + "passwordremindertext": "Quacchedune (da quiste indirizze IP $1) ha cerchete 'na nova password pe {{SITENAME}} ($4).\n'Na password temboranea pe l'utende \"$2\" ha state ccrejete e ha state 'mbostete a \"$3\".\nCe quiste ere quidde ca vulive, mo vide ce te colleghe e te scacchie 'na password nova.\n'A password temboranea adda murè 'mbrà {{PLURAL:$5|'nu giurne|$5 giurne}}.\n\nCe quacche otre 'nvece ha fatte sta rechieste, o ce tu t'è recurdate 'a password, e non g'à vuè cu cangè cchiù, allore no sce penzanne a 'stu messagge e continue a ausà 'a vecchia password.", "noemail": "Non ge stonne email reggistrete pe l'utende \"$1\".", "noemailcreate": "Tu ha mèttere 'n'indirizze e-mail valide", "passwordsent": "'Na nova passuord ha state mannete a l'indirizze e-mail reggistrete pe \"$1\".\nPe piacere, colleghete n'otra vota quanne l'è ricevute.", @@ -511,6 +514,7 @@ "botpasswords-existing": "Passuord de le bot esistende", "botpasswords-createnew": "Ccreje 'na passuord nove pu bot", "botpasswords-editexisting": "Cange 'na passuord d'u bot ca esiste ggià", + "botpasswords-label-needsreset": "(le password onna essere repristinate)", "botpasswords-label-appid": "Nome d'u bot:", "botpasswords-label-create": "Ccreje", "botpasswords-label-update": "Aggiorne", @@ -536,13 +540,13 @@ "resetpass-submit-loggedin": "Cange 'a password", "resetpass-submit-cancel": "Annulle", "resetpass-wrong-oldpass": "'A password temboranée o quedda corrende non g'è valide.\nPò essere ca tu è già cangiate 'a password toje o n'è cercate una nove temboranée.", - "resetpass-recycled": "Pe piacere azzere 'a password toje cu 'n'otra password deverse da quedde de mò.", + "resetpass-recycled": "Pe piacere cange 'a password toje cu 'n'otra password deverse da quedde de mò.", "resetpass-temp-emailed": "Tu è trasute cu 'nu codece email tembaranèe.\nPe spiccià de trasè, tu ha 'mbostà 'na password nove aqquà:", "resetpass-temp-password": "Password temboranea:", "resetpass-abort-generic": "'U cange de passuord ha state annullate da 'n'estenzione.", "resetpass-expired": "'A password toje ha scadute. Pe piacere 'mboste 'a password nove pe trasè.", - "resetpass-expired-soft": "'A password toje ha scadute e ave abbesògne de essere azzerate. Pe piacere scacchie 'n'otra password mò, o cazze \"{{int:authprovider-resetpass-skip-label}}\" pe azzerarle cchiù tarde.", - "resetpass-validity-soft": "'A password toje non g'è valide: $1\n\nPe piacere scacchie 'na password nove, o cazze \"{{int:authprovider-resetpass-skip-label}}\"pe azzerarle cchiù tarde.", + "resetpass-expired-soft": "'A password toje ha scadute e ave abbesògne de essere cangiate. Pe piacere scacchie 'n'otra password mò, o cazze \"{{int:authprovider-resetpass-skip-label}}\" pe cangiale cchiù tarde.", + "resetpass-validity-soft": "'A password toje non g'è valide: $1\n\nPe piacere scacchie 'na password nove, o cazze \"{{int:authprovider-resetpass-skip-label}}\" pe cangiale cchiù tarde.", "passwordreset": "Azzere 'a passuord", "passwordreset-text-one": "Comblete stu module pe azzerà 'a passuord toje.", "passwordreset-text-many": "{{PLURAL:$1|Inghie une de le cambe pe azzerà 'a passuord toje.}}", @@ -603,6 +607,10 @@ "savechanges": "Reggistre le cangiaminde", "publishpage": "Pubbleche 'a pàgene", "publishchanges": "Pubbleche le cangiaminde", + "savearticle-start": "Reggistre 'a vôsce...", + "savechanges-start": "Reggistre le cangiaminde...", + "publishpage-start": "Pubbleche 'a pàgene...", + "publishchanges-start": "Pubbleche le cangiaminde...", "preview": "Andeprime", "showpreview": "Vide l'andeprime", "showdiff": "Fa vedè le cangiaminde", @@ -618,7 +626,7 @@ "previewerrortext": "'N'errore ha assute quanne ste facive l'andeprime de le cangiaminde.", "blockedtitle": "L'utende è blocchete", "blockedtext": "'U nome de l'utende o l'indirizze IP ha state bloccate.\n\n'U blocche ha state fatte da $1.\n'U mutive date jè $2.\n\n* 'U Blocche accumenze: $8\n* 'U Blocche spicce: $6\n* Tipe de blocche: $7\n\nTu puè condatta $1 o n'otre [[{{MediaWiki:Grouppage-sysop}}|amministratore]] pe 'ngazzarte sus a 'u blocche.\nTu non ge puè ausà 'u strumende \"{{int:emailuser}}\" senza ca mitte n'indirizze email valide jndr'à le\n[[Special:Preferences|preferenze tune]] e ce è state bloccate sus a l'use sue.\nL'IP ca tine mò jè $3 e 'u codece d'u blocche jè #$5.\nPe piacere mitte ste doje 'mbormaziune ce manne 'na richieste de sblocche.", - "autoblockedtext": "L'indirizze IP tue ha state automaticamende blocchete purcè ha state ausete da n'otre utende, ca avère state blocchete da $1.\n'U mutive date jè 'u seguende:\n\n:''$2''\n\n* Inizie d'u blocche: $8\n* Scadenze d'u blocche: $6\n* Blocche 'ndise: $7\n\nTu puè cundattà $1 o une de l'otre [[{{MediaWiki:Grouppage-sysop}}|amministrature]] pe parà de stu probbleme.\n\nVide Bbuene ca tu non ge puè ausà 'a funziona \"manne n'e-mail a stu utende\" senze ca tu tìne 'n'indirizze e-mail valide e reggistrete jndr'à seziona [[Special:Preferences|me piace accussì]] e tu non ge sinde blocchete da ausarle.\n\nL'indirizze IP corrende jè $3, e 'u codece d'u blocche jè #$5.\nPe piacere mitte tutte le dettaglie ca ponne essere utile pe le richieste tue.", + "autoblockedtext": "L'indirizze IP tue ha state automaticamende blocchete purcè ha state ausete da n'otre utende, ca avère state blocchete da $1.\n'U mutive date jè 'u seguende:\n\n:''$2''\n\n* Inizie d'u blocche: $8\n* Scadenze d'u blocche: $6\n* Blocche 'ndise: $7\n\nTu puè cundattà $1 o une de l'otre [[{{MediaWiki:Grouppage-sysop}}|amministrature]] pe parà de stu probbleme.\n\nVide Bbuene ca tu non ge puè ausà 'a funziona \"manne n'e-mail a stu utende\" senze ca tu tìne 'n'indirizze e-mail valide e reggistrete jndr'à seziona [[Special:Preferences|me piace accussì]] e tu non ge sinde blocchete da ausarle.\n\nL'indirizze IP corrende jè $3, e 'u codece d'u blocche jè #$5.\nPe piacere mitte tutte le dettaglie ca ponne essere utile pe le richieste tune.", "blockednoreason": "nisciune mutive", "whitelistedittext": "Tu ha $1 pàggene da cangià.", "confirmedittext": "Tu a confermà l'indirizze e-mail tue apprime de cangià le pàggene.\nPe piacere mitte e validesce l'indirizze e-mail tue ausanne le [[Special:Preferences|preferenze de l'utende]].", @@ -645,7 +653,7 @@ "userjspreview": "'''Arrecuerdete ca tu ste vide/teste sulamende in andeprime 'u JavaScript tue.'''\n'''Non g'à state angore reggistrete ninde!'''", "sitecsspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tune.'''\n'''Non g'à state angore reggistrate ninde!'''", "sitejspreview": "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u codece JavaScript tune.'''\n'''Non g'à state angore reggistrate ninde!'''", - "userinvalidconfigtitle": "'''Attenziò:''' Non ge stè 'nu skin \"$1\".\nArrecuerdete ca jndr'à le file personalizzete .css e .js s'ause scrivere le titele cu le lettere piccenne, pe esembie {{ns:user}}:Foo/vector.css è diverse da {{ns:user}}:Foo/Vector.css.", + "userinvalidconfigtitle": "Attenziò: Non ge stè 'nu skin \"$1\".\nArrecuerdete ca jndr'à le file personalizzete .css, .json e .js s'ause scrivere le titele cu le lettere piccenne, pe esembie {{ns:user}}:Foo/vector.css è diverse da {{ns:user}}:Foo/Vector.css.", "updated": "(Cangiete)", "note": "'''Vide Bbuene:'''", "previewnote": "'''Arrecuerdete queste è sole 'n'andeprime.'''\nle cangiaminde non g'onne state angore reggistrate!", @@ -671,7 +679,7 @@ "longpageerror": "'''ERRORE: 'U teste ca tu vuè ccu reggistre è luenghe {{PLURAL:$1|'nu kilobyte|$1 kilobyte}}, invece 'u limite massime jè de {{PLURAL:$2|'nu kilobyte|$2 kilobyte}}.'''\nNon ge puè reggistrà sta pàggene.", "readonlywarning": "FA ATTENZIO': 'U database ha state bloccate pe manutenzione, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.\nTu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tune e pò cchiù tarde le reggistre sus 'a Uicchi.\n\nL'amministratore ca ha bloccate 'u database ha date stu mutive: $1", "protectedpagewarning": "'''ATTENZIO': Sta pàgene ha state bloccate e allore sulamende le utinde cu le privilegge de ''sysop'' ponne cangiarle.'''\nL'urteme archivie de le trasute ha state previste aqquà sotte pe referimende:", - "semiprotectedpagewarning": "'''Fà attenzione:''' Sta pàgene ha state bloccate accussì sulamende l'utinde reggistrete ponne fà cangiaminde.\nL'urteme archivije de le trasute ha state previste aqquà sotte pe referimende:", + "semiprotectedpagewarning": "Fà attenzione: Sta pàgene ha state bloccate accussì sulamende l'utinde reggistrete ponne fà cangiaminde.\nL'urteme archivije de le trasute ha state previste aqquà sotte pe referimende:", "cascadeprotectedwarning": "Fa attenziò: Sta pàgene ha state protette accussì sulamende l'utinde ca tènene le [[Special:ListGroupRights|deritte de amministratore]] a ponne cangià, purcè inglude {{PLURAL:$1|pàgene|pàggene}} prutette a cascate:", "titleprotectedwarning": "'''ATTENZIONE: Sta pàgene ha state bloccate accussì sulamende [[Special:ListGroupRights|specifice diritte]] a ponne ccrejà.'''\nL'urteme archivije de le trasute jè provviste sotte pe referimende:", "templatesused": "{{PLURAL:$1|Template|Template}} ausate sus 'a sta pàgene:", @@ -975,7 +983,7 @@ "recentchangesdays": "Sciurne da fà vedè jndr'à le cangiaminde recende:", "recentchangesdays-max": "(massime $1 {{PLURAL:$1|sciurne|sciurne}})", "recentchangescount": "Numere de cangiaminde da fà vedè pe default:", - "prefs-help-recentchangescount": "Quiste 'nglude le urteme cangiaminde, le storie de le pàggene e le archivije.", + "prefs-help-recentchangescount": "Numere massime: 1000", "prefs-help-watchlist-token2": "Queste jè 'a chiave segrete a le feed d'u web de l'elenghe de le pàggene condrollate tune.\nCengate vò ccu canosce ce pò leggere l'elenghe de le pàggene condrollate tune, accussì non g'ù pò condividere.\nCe è abbesogne, [[Special:ResetTokens|'u puè azzerà]].", "savedprefs": "Le preferenze tue onne state aggiornete.", "savedrights": "Le gruppe utinde de {{GENDER:$1|$1}} onne state reggistrate.", @@ -1002,7 +1010,7 @@ "prefs-files": "Fails", "prefs-custom-css": "CSS Personalizzete", "prefs-custom-js": "JS Personalizzete", - "prefs-common-config": "CSS/JS condivise pe tutte le sfonde:", + "prefs-common-config": "CSS/JSON/JavaScript condivise pe tutte le sfonde:", "prefs-reset-intro": "Tu puè ausà sta pàgene pe azzerà le preferenze tue a quidde de default d'u site.\nQuiste non ge pò essere annullate.", "prefs-emailconfirm-label": "Conferme de l'e-mail:", "youremail": "Poste:", @@ -1178,8 +1186,8 @@ "grant-createaccount": "Ccreje le cunde utinde", "grant-createeditmovepage": "Ccreje, cange e spueste le pàggene", "grant-delete": "Scangille pàggene, revisiune e vôsce de l'archivije", - "grant-editinterface": "Cange 'u namespace MediaUicchi e le CSS/JavaScript de le utinde", - "grant-editmycssjs": "Cange le CSS/JavaScript tune", + "grant-editinterface": "Cange 'u namespace MediaUicchi e le JSON d'u site/utinde", + "grant-editmycssjs": "Cange le CSS/JSON/JavaScript tune", "grant-editmyoptions": "Cange le preferenze tune", "grant-editmywatchlist": "Cange le pàggene condrollate tune", "grant-editpage": "Cange le pàggene esistende", @@ -1273,8 +1281,13 @@ "rcfilters-other-review-tools": "Otre struminde de revisione", "rcfilters-group-results-by-page": "Raggruppe le resultate pe pàgene", "rcfilters-activefilters": "Filtre attive", + "rcfilters-activefilters-hide": "Scunne", + "rcfilters-activefilters-show": "Fà 'ndrucà", + "rcfilters-activefilters-hide-tooltip": "Scunne l'arèe de le filtre attive", + "rcfilters-activefilters-show-tooltip": "Fà 'ndrucà l'arèe de le filtre attive", "rcfilters-advancedfilters": "Filtre avanzate", "rcfilters-limit-title": "Cangiaminde da 'ndrucà", + "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cangiamende|cangiaminde}}, $2", "rcfilters-date-popup-title": "Periode de tiembe da cercà", "rcfilters-days-title": "Urteme sciurne", "rcfilters-hours-title": "Urteme ore", @@ -1288,13 +1301,14 @@ "rcfilters-savedqueries-rename": "Renomene", "rcfilters-savedqueries-setdefault": "'Mboste cumme predefinite", "rcfilters-savedqueries-unsetdefault": "Live cumme predefinite", - "rcfilters-savedqueries-remove": "Live", + "rcfilters-savedqueries-remove": "Scangìlle", "rcfilters-savedqueries-new-name-label": "Nome", "rcfilters-savedqueries-new-name-placeholder": "Dì a ce serve 'u filtre", "rcfilters-savedqueries-apply-label": "Ccrèje 'nu filtre", "rcfilters-savedqueries-apply-and-setdefault-label": "Ccreje 'nu filtre de base", "rcfilters-savedqueries-cancel-label": "Annulle", "rcfilters-savedqueries-add-new-title": "Reggìstre le 'mbostaziune de mò d'u filtre", + "rcfilters-savedqueries-already-saved": "Ste filtre onne state ggià reggistrate. Cange le 'mbostaziune pe ccrejà 'nu filtre nuève reggistrate.", "rcfilters-restore-default-filters": "Repristine le filtre de base", "rcfilters-clear-all-filters": "Pulizze tutte le filtre", "rcfilters-show-new-changes": "'Ndruche le urteme cangiaminde", @@ -1537,7 +1551,7 @@ "lockmanager-fail-closelock": "Non ge pozze achiudere 'u blocche d'u file pe \"$1\".", "lockmanager-fail-deletelock": "Non ge pozze scangellà 'u blocche d'u file pe \"$1\".", "lockmanager-fail-acquirelock": "Non ge pozze pigghià blocche pe \"$1\".", - "lockmanager-fail-openlock": "Non ge pozze aprè 'u blocche d'u file pe \"$1\".", + "lockmanager-fail-openlock": "Non ge pozze aprè 'u blocche d'u file pe \"$1\". Assecurate ca 'a cartelle pe le carecaminde ha state configurate bbuene e 'u web server tène le permesse pe scrivere sus. 'Ndruche https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory per cchiù 'mbormaziune.", "lockmanager-fail-releaselock": "Non ge pozze relassà blocche pe \"$1\".", "lockmanager-fail-db-bucket": "Non ge pozze condattà 'u database purcé stonne troppe blocche jndr'à $1.", "lockmanager-fail-db-release": "Non ge pozze relassà le blocche sus a 'u database $1.", @@ -1554,12 +1568,13 @@ "uploadstash-badtoken": "L'esecuzione de sta azione non g'ha riuscite, pò essere purcé le credenziale pe le cangiaminde onne scadute. Pruève arrete.", "uploadstash-errclear": "'A pulizie de le file non g'ha riuscite.", "uploadstash-refresh": "Aggiorne l'elenghe de le file", + "uploadstash-thumbnail": "'ndruche 'a miniature", "uploadstash-bad-path-invalid": "Percorse invalide.", "uploadstash-bad-path-unknown-type": "Tipe scanusciute \"$1\".", "uploadstash-bad-path-unrecognized-thumb-name": "Nome d'a miniature non acchiate.", "invalid-chunk-offset": "distanze d'u chunk invalide", "img-auth-accessdenied": "Accesse negate", - "img-auth-nopathinfo": "No se iacchie PATH_INFO.\n'U server tune non g'è 'mbostate o non ge passe sta 'mbormazione.\nPò essere ca jè basate sus a 'u CGI e non ge pò supportà img_auth.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization", + "img-auth-nopathinfo": "No se iacchie 'u percorse d'a 'mbormnazione.\n'U server tune adda essere 'mbostate pe passà sta 'le variabbile REQUEST_URI e/o PATH_INFO.\nCe jè accussì, pruève a abbilità $wgUsePathInfo.\n'Ndruche https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", "img-auth-notindir": "'U percorse richieste non ge stè jndr'à cartelle de carecamende configurate", "img-auth-badtitle": "Non ge se pò costruì 'nu titele valide da \"$1\".", "img-auth-nologinnWL": "Tu non ge sì collegate e \"$1\" non ge stè jndr'à lista vianghe.", @@ -1620,7 +1635,7 @@ "filehist-comment": "Commende", "imagelinks": "Ause d'u file", "linkstoimage": "{{PLURAL:$1|sta pàgene apponde |$1 ste pàggene appondene}} a stu fail:", - "linkstoimage-more": "Cchiù de $1 {{PLURAL:$1|pàgene se colleghe|pàggene se collegane}} a stu file.
    \n'A seguende liste face vedè {{PLURAL:$1|'a prima pàgene ca se colleghe|le prime $1 pàggene ca se colleghene}} sulamende a stu file.
    \n'Na [[Special:WhatLinksHere/$2|liste comblete]] è disponibbele.", + "linkstoimage-more": "Cchiù de $1 {{PLURAL:$1|pàgene se colleghe|pàggene se collegane}} a stu file.
    \n'A seguende liste face vedè {{PLURAL:$1|'a prima pàgene ca se colleghe|le prime $1 pàggene ca se colleghene}} sulamende a stu file.
    \n'Na [[Special:WhatLinksHere/$2|elenghe comblete]] è disponibbele.", "nolinkstoimage": "Non ge stonne pàggene ca appodene a stu fail.", "morelinkstoimage": "Vide [[Special:WhatLinksHere/$1|cchiù collegaminde]] a stu file.", "linkstoimage-redirect": "$1 (redirezionamende d'u file) $2", @@ -1708,7 +1723,7 @@ "doubleredirects": "Ridirezionaminde a doppie", "doubleredirectstext": "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.\nOgne righe condene 'nu collegamende a 'u prime e a 'u seconde ridirezionamende pe fà vedè addò arrive 'u seconde ridirezionamende, 'u quale jè normalmende 'a pàgena de destinaziona \"rèale\", addò 'u prime ridirezionamende avesse appondà.\nLe situaziune de ingrocie onne state resolte.", "double-redirect-fixed-move": "[[$1]] ha state spustate.\nAvène aggiornate automaticamende e mò s'avène redirette a [[$2]].", - "double-redirect-fixed-maintenance": "Aggiuste le doppie redirezionaminde da [[$1]] a [[$2]] jndr'à 'na fatije de manutenzione.", + "double-redirect-fixed-maintenance": "Aggiuste le doppie redirezionaminde da [[$1]] a [[$2]] jndr'à 'na fatije de manutenzione", "double-redirect-fixer": "Correttore de redirezionaminde", "brokenredirects": "Redirezionamninde scuasciete", "brokenredirectstext": "Le ridirezionaminde ca seguene appondene a pàggene ca non g'esistene:", @@ -1763,6 +1778,7 @@ "deadendpages": "Pàggene senza collegamende", "deadendpagestext": "Le pàggene ca seguene non g'appondute a otre pàggene sus a {{SITENAME}}.", "protectedpages": "Pàggene prutette", + "protectedpages-filters": "Filtre:", "protectedpages-indef": "Sulamende protezziune indefinite", "protectedpages-summary": "Sta pàgene elenghe le pàggene ca so prutette. Pe 'n'elenghe de le titole ca sò prutette da 'a ccrejazzione, 'ndruche [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].", "protectedpages-cascade": "Sulamende prutezzione a cascata", @@ -1783,6 +1799,7 @@ "protectedtitles-submit": "Fà 'ndrucà le titole", "listusers": "Liste de l'utende", "listusers-editsonly": "Fà vedè sulamende l'utinde cu cangiaminde fatte", + "listusers-temporarygroupsonly": "Fà 'ndrucà sulamende le utinde jndr'à le gruppe de utinde temboranèe", "listusers-creationsort": "Arrenghete pe date de ccreazione", "listusers-desc": "Arranghe jndr'à 'n'ordine ca scenne", "usereditcount": "$1 {{PLURAL:$1|cangiamende|cangiaminde}}", @@ -1806,11 +1823,13 @@ "apihelp": "Aijute de l'API", "apihelp-no-such-module": "Module \"$1\" none acchiate.", "apisandbox": "Sandbox de l'API", + "apisandbox-jsonly": "'U JavaScript jè richieste pe ausà 'a sandbox API.", "apisandbox-api-disabled": "API non g'è abbiletate sus a stu site.", "apisandbox-intro": "Ause sta pàgene pe sperimendà cu le API de le web service pe MediaUicchi.\nFà referimende a [[mw:API:Main page| 'a documendazione de l'API]] pe cchiù dettaglie de l'ause de l'API.\nEsembie: [https://www.mediawiki.org/wiki/API#A_simple_example pigghie 'u condenute d'a Pàgene Prengepàle]. Scacchie 'n'azione pe 'ndrucà otre esembie.\n\nVide ca, pure ca queste jè 'na buatte de sabbie tu puè carrescià le cangiaminde de sta pàgene sus 'a uicchi.", "apisandbox-submit": "Fà 'na richieste", "apisandbox-reset": "Pulizze", "apisandbox-retry": "Pruève arrete", + "apisandbox-loading": "Stoche a careche le 'mbormaziune pu module API \"$1\"...", "apisandbox-examples": "Esembie", "apisandbox-dynamic-parameters": "Parametre aggiundive", "apisandbox-dynamic-parameters-add-label": "Aggiunge 'u parametre:", @@ -1864,7 +1883,7 @@ "cachedspecial-refresh-now": "Vide l'urteme.", "categories": "Le Categorije", "categories-submit": "Fà 'ndrucà", - "categoriespagetext": "{{PLURAL:$1|'A seguende categorije tène|Le seguende categorije tènene}} pàggene o media.\n[[Special:UnusedCategories|Categorije non ausate]] non ge se vèdene aqquà.\nVide pure [[Special:WantedCategories|Categorije cercate]].", + "categoriespagetext": "{{PLURAL:$1|'A seguende categorije tène|Le seguende categorije tènene}} pàggene o media.\n'Ndruche pure [[Special:WantedCategories|Categorije cercate]].", "categoriesfrom": "Fà vedè le categorije partenne da:", "deletedcontributions": "Condrebbute de l'utende scangellete", "deletedcontributions-title": "Condrebbute de l'utende scangellate", @@ -2387,7 +2406,7 @@ "fix-double-redirects": "Aggiorne ogne redirezionamende ca apponde a 'u titele origginale", "move-leave-redirect": "Lasse 'nu ridirezionamende rréte", "protectedpagemovewarning": "'''Attenziò:''' Sta pàgene ha state bloccate accussì sulamende l'utinde cu le deritte d'amministratore 'a ponne spustà.\nL'urteme archivije de le trasute ha state mise aqquà sotte pe referimende:", - "semiprotectedpagemovewarning": "'''Vide Bbuène:''' Sta pàgene ha state blocchete accussì sulamende l'utinde reggistrate 'a ponne spustà.\nL'urteme archivije de le trasute ha state mise aqquà sotte pe referimende:", + "semiprotectedpagemovewarning": "Vide Bbuène: Sta pàgene ha state blocchete accussì sulamende l'utinde reggistrate 'a ponne spustà.\nL'urteme archivije de le trasute ha state mise aqquà sotte pe referimende:", "move-over-sharedrepo": "[[:$1]] esiste sus a 'n'archivie condivise. Spustanne 'u file sus a stu titole vèje a sovrascrive 'u file condivise.", "file-exists-sharedrepo": "'U nome d'u file ca è scacchiate jè già ausate sus a 'n'archivie condivise.\nPe piacere scacchiene 'notre.", "export": "Pàggene esportete", @@ -3340,7 +3359,7 @@ "version-poweredby-others": "otre", "version-poweredby-translators": "tradutture de translatewiki.net", "version-credits-summary": "Nuje vulesseme acchià le persone seguende pe le lore condrebbute a [[Special:Version|MediaUicchi]].", - "version-license-info": "MediaUicchi jè 'nu softuare libbere, tu 'u puè redestribbuì e/o cangiarle sotte le termine d'a GNU (Licenze Pubbleche Generale) cumme pubblecate da 'a Free Software Foundation; endrambe le versiune 2 d'a Licenze, o (a scelta toje) 'le versiune cchiù nnove.\n\nMediauicchi jè destribbuite cu 'a speranze ca jè utile, ma SENZE NISCIUNA GARANZIE; senze nemmanghe 'a garanzie imblicite de COMMERCIABBELETÀ o IDONIETÀ PE 'NU SCOPE PARTICOLARE. Vatte a vide 'a GNU (Licenze Pubbleche Generale) pe cchiù 'mbormaziune.\n\nAvisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenze Pubbleche Generale)] 'nzieme a stu programme, ce none, scrive a 'a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor , Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html liggele sus a Indernette].", + "version-license-info": "MediaUicchi jè 'nu softuare libbere, tu 'u puè redestribbuì e/o cangiarle sotte le termine d'a GNU (Licenze Pubbleche Generale) cumme pubblecate da 'a Free Software Foundation; endrambe le versiune 2 d'a Licenze, o (a scelta toje) 'le versiune cchiù nnove.\n\nMediauicchi jè destribbuite cu 'a speranze ca jè utile, ma SENZE NISCIUNA GARANZIE; senze nemmanghe 'a garanzie imblicite de COMMERCIABBELETÀ o IDONIETÀ PE 'NU SCOPE PARTICOLARE. Vatte a vide 'a GNU (Licenze Pubbleche Generale) pe cchiù 'mbormaziune.\n\nAvisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenze Pubbleche Generale)] 'nzieme a stu programme, ce none, scrive a 'a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor , Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html liggele sus a Indernette].", "version-software": "Softuer installete", "version-software-product": "Prodotte", "version-software-version": "Versione", @@ -3645,7 +3664,7 @@ "limitreport-expansiondepth": "Espanzione massime de profonnetà", "limitreport-expensivefunctioncount": "Analizzatore d'u cunde d'a funzione ca coste assaije", "expandtemplates": "Template spannute", - "expand_templates_intro": "Sta pàgena speciale pigghie quacche teste e spanne tutte le template jndr'à jidde recorsivamende.
    \nJidde spanne pure le funziune de analise cumme
    \n{{#language:…}}, e variabbele cumme
    \n{{CURRENTDAY}}.
    \nIn pratiche tutte quidde ca stè jndr'à le doppie parendesi graffe.
    ", + "expand_templates_intro": "Sta pàgena speciale pigghie quacche uicchiteste e spanne tutte le template jndr'à jidde recorsivamende.
    \nJidde spanne pure le funziune de analise cumme
    \n{{#language:…}}, e variabbele cumme
    \n{{CURRENTDAY}}.
    \nIn pratiche tutte quidde ca stè jndr'à le doppie parendesi graffe.
    ", "expand_templates_title": "Titele condestuale, pe {{FULLPAGENAME}} ecc.:", "expand_templates_input": "Uicchiteste de input:", "expand_templates_output": "Resultete", diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json index 2b4c144686..86d9b67778 100644 --- a/languages/i18n/ru.json +++ b/languages/i18n/ru.json @@ -494,6 +494,7 @@ "ns-specialprotected": "Страницы пространства имён «{{ns:special}}» не могут правиться.", "titleprotected": "Создание страницы с таким заголовком было запрещено участником [[User:$1|$1]].\nУказана следующая причина: $2.", "filereadonlyerror": "Не удаётся изменить файл «$1», так как хранилище «$2» находится в режиме «только для чтения».\n\nСистемный администратор, заблокировавший базу, оставил следующее объяснение: «$3».", + "invalidtitle": "Недопустимое название", "invalidtitle-knownnamespace": "Недопустимый заголовок с пространством имен «$2» и текстом «$3»", "invalidtitle-unknownnamespace": "Недопустимый заголовок с неизвестным номером пространства $1 и текстом «$2»", "exception-nologin": "Вы не представились системе", @@ -502,7 +503,7 @@ "virus-badscanner": "Ошибка настройки. Неизвестный сканер вирусов: ''$1''", "virus-scanfailed": "ошибка сканирования (код $1)", "virus-unknownscanner": "неизвестный антивирус:", - "logouttext": "Вы завершили сеанс работы.\n\nНекоторые страницы могут продолжить отображаться так, словно вы все ещё не завершили сеанс. Для борьбы с этим явлением обновите кэш браузера.", + "logouttext": "Вы завершили сеанс работы.\n\nНекоторые страницы могут продолжить отображаться так, как будто вы все ещё не завершили сеанс, пока вы не обновите кэш браузера.", "cannotlogoutnow-title": "Невозможно выйти прямо сейчас", "cannotlogoutnow-text": "Нельзя выйти во время использования $1.", "welcomeuser": "Добро пожаловать, $1!", @@ -1287,14 +1288,14 @@ "right-suppressredirect": "подавление перенаправлений при переименовании страниц", "right-upload": "загрузка файлов", "right-reupload": "перезапись существующих файлов", - "right-reupload-own": "перезапись файлов тем же участником", + "right-reupload-own": "перезапись файлов, загруженных тем же участником", "right-reupload-shared": "подмена файлов из общих хранилищ локальными", "right-upload_by_url": "загрузка файлов с адреса URL", "right-purge": "очистка кэша страниц без подтверждения", "right-autoconfirmed": "обход ограничений скорости на IP-адрес", "right-bot": "автоматический процесс", "right-nominornewtalk": "малые правки на страницах обсуждений участников не создают для них уведомление о новом сообщении", - "right-apihighlimits": "уменьшение ограничений на выполнение API-запросов", + "right-apihighlimits": "использование высших ограничений при выполнении API-запросов", "right-writeapi": "использование API для записи", "right-delete": "удаление страниц", "right-bigdelete": "удаление страниц с длинными историями изменений", @@ -1315,7 +1316,7 @@ "right-protect": "изменение уровня защиты страниц и правка каскадно защищённых страниц", "right-editprotected": "правка страниц, защищённых как «{{int:protect-level-sysop}}»", "right-editsemiprotected": "правка страниц, защищённых как «{{int:protect-level-autoconfirmed}}»", - "right-editcontentmodel": "редактирование контентной модели страницы", + "right-editcontentmodel": "редактирование модели содержимого страницы", "right-editinterface": "изменение пользовательского интерфейса", "right-editusercss": "правка CSS-файлов других участников", "right-edituserjson": "правка JSON-файлов других участников", @@ -1327,7 +1328,7 @@ "right-editmyuserjson": "редактирование своих пользовательских JSON-файлов", "right-editmyuserjs": "редактирование своих пользовательских JavaScript-файлов", "right-viewmywatchlist": "просмотр своего списка наблюдения", - "right-editmywatchlist": "редактирование своего списка наблюдения", + "right-editmywatchlist": "редактирование своего списка наблюдения; некоторые действия будут добавлять страницы даже без такого права", "right-viewmyprivateinfo": "просмотр собственных личных данных (например, адрес электронной почты, настоящее имя)", "right-editmyprivateinfo": "правка собственных личных данных (например, адрес электронной почты, настоящее имя)", "right-editmyoptions": "редактирование собственных настроек", @@ -1336,8 +1337,8 @@ "right-noratelimit": "обход ограничений скорости", "right-import": "импорт страниц из других вики", "right-importupload": "импорт страниц через загрузку файлов", - "right-patrol": "патрулирование правок", - "right-autopatrol": "автоматическое патрулирование правок", + "right-patrol": "отметка правок других участников как отпатрулированных", + "right-autopatrol": "автоматическая отметка собственных правок как патрулированных", "right-patrolmarks": "просмотр отметок о патрулировании в свежих правках", "right-unwatchedpages": "просмотр списка ненаблюдаемых страниц", "right-mergehistory": "объединение историй страниц", @@ -1914,9 +1915,9 @@ "filehist-filesize": "Размер файла", "filehist-comment": "Примечание", "imagelinks": "Использование файла", - "linkstoimage": "{{PLURAL:$1|Следующая $1 страница ссылается|Следующие $1 страницы ссылаются|Следующие $1 страниц ссылаются}} на данный файл:", - "linkstoimage-more": "Более $1 {{PLURAL:$1|страницы|страниц}} ссылаются на этот файл.\nВ данном списке {{PLURAL:$1|представлена только $1 ссылка|представлены только $1 ссылки|представлены только $1 ссылок}} на этот файл.\nДоступен также [[Special:WhatLinksHere/$2|полный список]].", - "nolinkstoimage": "Нет страниц, включающих этот файл.", + "linkstoimage": "{{PLURAL:$1|Следующая $1 страница использует|Следующие $1 страницы используют|Следующие $1 страниц используют}} данный файл:", + "linkstoimage-more": "Более $1 {{PLURAL:$1|страницы|страниц}} используют этот файл.\nВ данном списке {{PLURAL:$1|представлена только $1 страница, использующая|представлены только $1 страницы, использующие|представлены только $1 страниц, использующих}} этот файл.\nДоступен также [[Special:WhatLinksHere/$2|полный список]].", + "nolinkstoimage": "Нет страниц, использующих этот файл.", "morelinkstoimage": "Просмотреть [[Special:WhatLinksHere/$1|остальные ссылки]] на этот файл.", "linkstoimage-redirect": "$1 (файловое перенаправление) $2", "duplicatesoffile": "{{PLURAL:$1|Следующий файл является дубликатом|Следующие $1 файла являются дубликатами|Следующие $1 файлов являются дубликатами}} этого файла ([[Special:FileDuplicateSearch/$2|подробности]]):", @@ -4349,6 +4350,7 @@ "edit-error-long": "Ошибки:\n\n$1", "revid": "версия $1", "pageid": "ID страницы $1", + "interfaceadmin-info": "$1\n\nПрава на редактирование общесайтных CSS/JS/JSON были недавно вынесены из права editinterface. Если вы не понимаете, почему вы наткнулись на эту ошибку, см. [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "<html> теги могут быть использованы только в пределах обычных страниц.", "gotointerwiki": "Покидаем {{grammar:accusative|{{SITENAME}}}}...", "gotointerwiki-invalid": "Указан некорректный заголовок.", diff --git a/languages/i18n/sat.json b/languages/i18n/sat.json index 282761aff8..6f2c3b1ce6 100644 --- a/languages/i18n/sat.json +++ b/languages/i18n/sat.json @@ -17,7 +17,10 @@ "Manik Soren", "Ramjit Tudu", "R Ashwani Banjan Murmu", - "Fagunkoyel Hansdah" + "Fagunkoyel Hansdah", + "Subasmurmu", + "Amire80", + "Dulal Kisku" ] }, "tog-underline": "ᱡᱚᱱᱚᱲ ᱞᱟᱛᱟᱨᱨᱮ ᱫᱟᱜᱽ ᱩᱫᱩᱜᱽᱢᱮ:", @@ -40,7 +43,7 @@ "tog-minordefault": "ᱮᱛᱦᱚᱵᱨᱮ ᱥᱟᱱᱟᱢ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱦᱩᱰᱤᱧ ᱞᱮᱠᱟᱛᱮ ᱪᱤᱱᱦᱟᱹ ᱠᱟᱜ ᱢᱮ", "tog-previewontop": "ᱥᱟᱯᱲᱟᱣ ᱵᱟᱠᱥᱳ ᱞᱟᱦᱟᱨᱮ ᱩᱱᱩᱫᱩᱜ ᱩᱫᱩᱜᱽ ᱢᱮ", "tog-previewonfirst": "ᱯᱟᱹᱦᱤᱞ ᱥᱟᱯᱲᱟᱣ ᱨᱮ ᱩᱱᱩᱫᱩᱜ ᱩᱫᱩᱜᱽ ᱢᱮ", - "tog-enotifwatchlistpages": "ᱡᱟᱸᱦᱟᱸ ᱥᱟᱦᱴᱟ ᱥᱮ ᱨᱮᱫ ᱤᱧᱟᱜ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱱᱟᱠᱩ ᱵᱚᱫᱚᱞ ᱞᱮᱱ ᱠᱷᱟᱡ E-mail ᱟᱹᱧᱢᱮ", + "tog-enotifwatchlistpages": "ᱡᱟᱸᱦᱟᱸ ᱥᱟᱦᱴᱟ ᱥᱮ ᱨᱮᱫ ᱤᱧᱟᱜ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱱᱟᱠᱩ ᱵᱚᱫᱚᱞ ᱞᱮᱱ ᱠᱷᱟᱡ ᱤ-ᱢᱮᱞ ᱟᱹᱧᱢᱮ", "tog-enotifusertalkpages": "ᱤ-ᱢᱮᱞ ᱟᱹᱧᱢᱮ ᱛᱤᱱᱨᱮ ᱤᱧᱟᱜ ᱨᱚᱲ ᱥᱟᱦᱴᱟ ᱵᱚᱫᱚᱞᱜ-ᱟ", "tog-enotifminoredits": "ᱥᱟᱦᱴᱟ ᱟᱨ ᱨᱮᱫ ᱠᱩ ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱞᱮᱱ ᱠᱷᱟᱡ ᱦᱚᱸ E-mail ᱟᱹᱧᱢᱮ", "tog-enotifrevealaddr": "ᱰᱷᱟᱹᱨᱣᱟᱜ ᱥᱟᱦᱴᱟᱨᱮ ᱤᱧᱟᱜ e-mail ᱴᱷᱤᱠᱱᱟ ᱥᱚᱫᱚᱨ ᱦᱩᱭᱩᱜ ᱢᱟ", @@ -53,6 +56,7 @@ "tog-watchlisthidebots": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱚᱴ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ", "tog-watchlisthideminor": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ", "tog-watchlisthideliu": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱚᱞᱚ ᱟᱠᱟᱱ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ", + "tog-watchlistreloadautomatically": "ᱡᱚᱠᱷᱚᱱ ᱯᱷᱤᱞᱴᱚᱨ ᱵᱚᱫᱚᱞᱚᱜᱼᱟ ᱧᱮᱞᱼᱛᱟᱹᱞᱠᱟ. ᱟᱡ ᱛᱮᱜᱮ ᱞᱟᱫᱮ ᱨᱩᱣᱟᱹᱲ ᱢᱮ (ᱡᱟᱵᱷᱟᱪᱤᱠᱤ ᱞᱟᱹᱠᱛᱤᱼᱟ)", "tog-watchlisthideanons": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱟᱭ ᱵᱚᱞᱚ ᱟᱠᱟᱱ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ", "tog-watchlisthidepatrolled": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱤᱰᱟᱹᱣᱮᱱ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ", "tog-watchlisthidecategorization": "ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱛᱷᱚᱠ ᱠᱚ ᱫᱟᱱᱟᱝ", @@ -60,6 +64,8 @@ "tog-diffonly": "ᱯᱷᱟᱨᱟᱠ ᱨᱮᱭᱟᱜ ᱞᱟᱛᱟᱨ ᱥᱟᱦᱴᱟᱨᱮ ᱵᱟᱵᱚᱛᱠᱩ ᱵᱟᱝ ᱩᱫᱩᱜᱚᱜ ᱢᱟ", "tog-showhiddencats": "ᱩᱠᱩ ᱛᱷᱚᱠᱠᱩ ᱩᱫᱩᱜᱽᱢᱮ", "tog-norollbackdiff": "rollback ᱛᱟᱭᱚᱢ ᱛᱮ ᱯᱷᱟᱨᱟᱠ ᱟᱞᱚᱢ ᱩᱫᱩᱜᱟ", + "tog-useeditwarning": "ᱡᱚᱠᱷᱚᱱ ᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱥᱟᱦᱴᱟ ᱵᱟᱝ ᱨᱟᱠᱷᱟ ᱠᱟᱛᱮᱫᱤᱧ ᱵᱚᱫᱚᱞᱼᱟ ᱥᱚᱱᱛᱚᱨᱤᱧ ᱢᱮ", + "tog-prefershttps": "ᱞᱮᱛᱟᱲ ᱵᱚᱞᱚᱱ ᱡᱚᱠᱷᱚᱱ ᱢᱚᱦᱚᱡᱩᱫ ᱠᱷᱚᱸᱡᱟ ᱵᱮᱵᱷᱟᱨ ᱢᱮ", "underline-always": "ᱥᱟᱨᱟ ᱜᱷᱟᱹᱲᱤᱡ", "underline-never": "ᱛᱤᱥ ᱦᱚᱸ ᱵᱟᱝ", "underline-default": "ᱦᱟᱨᱛᱟ ᱥᱮ ᱵᱨᱟᱣᱡᱟᱨ ᱪᱮᱛᱞᱮᱠᱟ ᱛᱟᱸᱦᱮᱸᱠᱟᱱᱟ ᱚᱝᱠᱟᱜᱮ", @@ -92,7 +98,7 @@ "september": "ᱥᱮᱯᱴᱮᱢᱵᱚᱨ", "october": "ᱚᱠᱴᱚᱵᱚᱨ", "november": "ᱱᱚᱵᱷᱮᱢᱵᱚᱨ", - "december": "ᱰᱤᱥᱮᱢᱵᱟᱨ", + "december": "ᱰᱤᱥᱮᱢᱵᱚᱨ", "january-gen": "ᱡᱟᱱᱩᱣᱟᱨᱤ", "february-gen": "ᱯᱷᱮᱵᱽᱨᱩᱣᱟᱨᱤ", "march-gen": "ᱢᱟᱨᱪ", @@ -159,7 +165,7 @@ "anontalk": "ᱨᱚᱲ", "navigation": "ᱟᱹᱪᱩᱨᱵᱟᱲᱟ", "and": " ᱟᱨ", - "faq": "FAQ", + "faq": "ᱵᱹᱞᱹᱠᱹ", "actions": "ᱠᱟᱹᱢᱤᱠᱩ", "namespaces": "ᱧᱤᱛᱩᱢ ᱡᱟᱜᱟ", "variants": "ᱮᱴᱟᱜᱠᱳ", @@ -223,13 +229,13 @@ "pool-errorunknown": "ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱦᱩᱲᱟᱹᱜ", "poolcounter-usage-error": "ᱵᱮᱵᱷᱟᱨᱟᱜ ᱦᱩᱲᱟᱹᱜᱺ $1", "aboutsite": "{{SITENAME}} ᱵᱟᱵᱚᱛ", - "aboutpage": "Project: ᱵᱟᱵᱚᱛ", + "aboutpage": "Project:ᱵᱟᱵᱚᱛ", "copyright": "ᱩᱱᱩᱫᱩᱜ ᱫᱚ ᱧᱟᱢᱚᱜ-ᱟ $1 ᱞᱮᱠᱟᱛᱮ ᱵᱟᱝᱠᱷᱟᱱ ᱚᱞ ᱛᱟᱦᱮᱱᱟ", - "copyrightpage": "{{ns:project}}: ᱮᱠᱛᱤᱭᱟᱨ", + "copyrightpage": "{{ns:project}}:ᱮᱠᱛᱤᱭᱟᱨ", "currentevents": "ᱱᱤᱛᱚᱜ ᱠᱷᱚᱵᱚᱨ", - "currentevents-url": "Project: ᱱᱤᱛᱚᱜ ᱠᱷᱚᱵᱚᱨᱠᱳ", + "currentevents-url": "Project:ᱱᱤᱛᱚᱜ ᱠᱷᱚᱵᱚᱨᱠᱳ", "disclaimers": "ᱫᱟᱹᱵᱤ ᱵᱟᱱᱩᱜᱠᱳ", - "disclaimerpage": "Project: ᱥᱟᱫᱷᱟᱨᱚᱱ ᱫᱟᱹᱵᱤ ᱵᱟᱱᱩᱜᱠᱩ", + "disclaimerpage": "Project:ᱥᱟᱫᱷᱟᱨᱚᱱ ᱫᱟᱹᱵᱤ ᱵᱟᱱᱩᱜᱠᱩ", "edithelp": "ᱥᱟᱯᱲᱟᱣ ᱜᱚᱸᱲᱚᱸ", "helppage-top-gethelp": "ᱜᱚᱸᱲᱚᱸ", "mainpage": "ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ", @@ -238,12 +244,12 @@ "portal": "ᱜᱩᱥᱴᱤ ᱵᱚᱞᱚᱜ ᱫᱩᱭᱟᱹᱨ", "portal-url": "Project:ᱠᱷᱩᱴ ᱵᱚᱞᱚᱱ ᱦᱚᱨ", "privacy": "ᱩᱠᱩ ᱮᱠᱛᱤᱭᱟᱨ", - "privacypage": "Project: ᱩᱠᱩ ᱮᱠᱛᱤᱭᱟᱨ", + "privacypage": "Project:ᱩᱠᱩ ᱮᱠᱛᱤᱭᱟᱨ", "badaccess": "ᱟᱹᱭᱫᱟᱹᱨᱤ ᱦᱩᱲᱟᱹᱜ", "badaccess-group0": "ᱟᱢ ᱫᱚ ᱚᱠᱟ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱛ ᱮᱢ ᱟᱨᱚᱡᱽ ᱟᱠᱟᱛ, ᱚᱱᱟ ᱠᱟᱹᱢᱤ ᱯᱩᱨᱟᱹᱣ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾", "badaccess-groups": "ᱟᱢ ᱫᱚ ᱚᱠᱟ ᱠᱟᱹᱢᱤᱢ ᱢᱮᱱᱡᱚᱝᱠᱟᱱ ᱚᱱᱟ ᱫᱚ ᱠᱷᱟᱹᱞᱤ {{PLURAL:$2 ᱨᱟᱹᱥᱤᱭᱟᱹᱠᱚᱨᱮ ᱱᱚᱣᱟ ᱨᱟᱹᱥᱤᱭᱟᱹ ᱨᱮᱭᱟᱜ ᱢᱤᱫᱴᱮᱱ ᱨᱮ}} ᱢᱤᱫᱴᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱡ ᱥᱟᱯᱲᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ: $1᱾", "versionrequired": "ᱢᱤᱰᱤᱭᱟ ᱩᱭᱠᱤ ᱨᱮᱭᱟᱜ $1 ᱱᱟᱣᱟ ᱵᱷᱟᱨᱥᱚᱱ ᱡᱟᱹᱨᱩᱲᱟ", - "versionrequiredtext": "Version $1 of ᱢᱤᱰᱤᱭᱟ ᱣᱤᱠᱤ ᱫᱚ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱜᱟᱣᱭᱟ᱾\nᱧᱮᱞᱢᱮ [[Special:Version|version page]]᱾", + "versionrequiredtext": "ᱵᱷᱟᱨᱥᱚᱱ $1 ᱨᱮᱱᱟᱜ ᱢᱤᱰᱤᱭᱟ ᱣᱤᱠᱤ ᱫᱚ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱜᱟᱣᱭᱟ᱾\nᱧᱮᱞᱢᱮ [[Special:Version|ᱵᱷᱟᱨᱥᱚᱱ ᱥᱟᱦᱴᱟ]]᱾", "ok": "ᱴᱷᱤᱠ ᱜᱮᱭᱟ", "retrievedfrom": "\"$1\" ᱠᱷᱚᱱ ᱧᱟᱢ ᱟᱹᱜᱩᱭ", "youhavenewmessages": "{{PLURAL:$3|ᱟᱢᱟᱜ ᱢᱮᱱᱟᱜ-ᱟ}} $1 ($2)᱾", @@ -256,7 +262,7 @@ "editold": "ᱥᱟᱯᱲᱟᱣ", "viewsourceold": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞ", "editlink": "ᱥᱟᱯᱲᱟᱣ", - "viewsourcelink": "ᱯᱷᱮᱰᱟᱛ ᱦᱚᱨ ᱧᱮᱞᱢᱮ", + "viewsourcelink": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞᱢᱮ", "editsectionhint": "ᱥᱟᱯᱲᱟᱣ ᱡᱟᱭᱜᱟ: $1", "toc": "ᱩᱱᱩᱫᱩᱜ", "showtoc": "ᱥᱚᱫᱚᱨ", @@ -267,21 +273,21 @@ "confirmable-yes": "ᱦᱮᱸ", "confirmable-no": "ᱵᱟᱝ", "thisisdeleted": "ᱧᱮᱞ ᱥᱮ ᱨᱩᱭᱟᱹᱲ ᱫᱚᱲᱦᱟ $1?", - "viewdeleted": "$1 ᱧᱮᱞᱢᱮ", + "viewdeleted": "$1 ᱧᱮᱞᱟᱢ?", "restorelink": "{{PLURAL:$1 ᱢᱤᱫᱴᱮᱱ ᱚᱪᱚᱜ ᱜᱤᱰᱤ ᱥᱟᱯᱲᱟᱣ $1 ᱜᱟᱱ ᱩᱫᱩᱜᱽ ᱜᱤᱰᱤ ᱥᱟᱯᱲᱟᱣ}}", "feedlinks": "ᱟᱡᱚ:", "feed-invalid": "ᱜᱟᱨᱦᱟᱠ feed ᱨᱮᱭᱟᱜ ᱨᱚᱠᱚᱢ ᱫᱚ ᱚᱝᱞᱮᱠᱟᱛᱮ ᱵᱟᱝᱠᱟᱱᱟ᱾", "feed-unavailable": "ᱥᱤᱱᱰᱤᱠᱮᱥᱚᱱ ᱟᱡᱚ ᱠᱩᱫᱚ ᱵᱟᱝ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ", - "site-rss-feed": "$1 RSS feed", + "site-rss-feed": "$1 ᱨᱥᱥ ᱯᱷᱤᱰ", "site-atom-feed": " $1 ᱡᱚᱢ ᱚᱪᱚ", - "page-rss-feed": "\"$1\" RSS feed", + "page-rss-feed": "\"$1\" ᱨᱥᱥ ᱯᱷᱤᱰ", "page-atom-feed": " $1 ᱡᱚᱢ ᱚᱪᱚ", "red-link-title": "$1 (ᱱᱤᱭᱟᱹ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ)", "sort-descending": "ᱩᱞᱴᱟᱹᱣᱛᱮ ᱥᱟᱡᱟᱣ", "sort-ascending": "ᱥᱟᱢᱴᱟᱣ ᱛᱮ", "nstab-main": "ᱥᱟᱦᱴᱟ", "nstab-user": "ᱵᱮᱵᱦᱟᱹᱨᱤᱭᱟᱹᱜ ᱥᱟᱦᱴᱟ", - "nstab-media": "Media ᱥᱟᱦᱴᱟ", + "nstab-media": "ᱢᱤᱰᱤᱭᱟ ᱥᱟᱦᱴᱟ", "nstab-special": "ᱚᱥᱚᱠᱟᱭᱛᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ", "nstab-project": "ᱯᱨᱚᱡᱮᱠᱴ ᱥᱟᱦᱴᱟ", "nstab-image": "ᱨᱮᱫ", @@ -296,6 +302,7 @@ "nospecialpagetext": "ᱟᱢ ᱫᱚ ᱡᱟᱦᱟᱸ ᱥᱟᱦᱴᱟ ᱞᱟᱹᱜᱤᱫ ᱮᱢ ᱱᱮᱦᱚᱨ ᱟᱠᱟᱫᱟ ᱚᱱᱟᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ \nᱡᱟᱦᱟᱸ ᱥᱟᱦᱴᱟᱠᱩ ᱱᱚᱸᱰᱮ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱱᱟᱨᱮᱱᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱱᱚᱸᱰᱮᱢ ᱧᱟᱢᱟ [[Special:SpecialPages|{{int:specialpages}}]]᱾", "error": "ᱦᱩᱲᱟᱹᱜ", "databaseerror": "ᱰᱟᱴᱟᱵᱮᱡᱽ ᱦᱩᱲᱟᱹᱜ", + "databaseerror-textcl": "ᱰᱟᱴᱟᱵᱮᱡᱽ ᱥᱮᱱᱫᱽᱨᱟ ᱵᱟᱹᱲᱤᱡ ᱟᱠᱟᱱᱟ᱾", "databaseerror-query": "ᱠᱩᱠᱞᱤ: $1", "databaseerror-function": "ᱠᱟᱹᱢᱤ: $1", "databaseerror-error": "ᱦᱩᱲᱟᱹᱜ: $1", @@ -331,13 +338,17 @@ "viewyourtext": "ᱟᱢ ᱫᱚ '''ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ''' ᱥᱟᱦᱴᱟ ᱧᱮᱞ ᱟᱨ ᱮᱢ ᱠᱚᱯᱤ ᱦᱟᱛᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ:", "protectedinterface": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱵᱟᱵᱚᱛᱠᱚ ᱫᱚ ᱣᱤᱠᱤ ᱥᱚᱯᱷᱴᱚᱭᱟᱨ ᱨᱮᱭᱟᱜ ᱢᱤᱫᱴᱮᱱ ᱤᱱᱴᱟᱨᱯᱷᱮᱥ ᱠᱷᱚᱵᱚᱨᱮ ᱮᱢᱟ, ᱚᱱᱟᱛᱮ ᱱᱚᱣᱟ ᱫᱟ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱫᱚᱦᱚ ᱦᱩᱭᱠᱟᱱᱟ᱾", "cascadeprotected": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱥᱟᱯᱲᱟᱣ ᱠᱷᱚᱱ ᱨᱩᱠᱷᱤᱭᱟᱹᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ, ᱠᱟᱨᱚᱱ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ {{PLURAL:$1 ᱜᱟᱱ ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱜᱟᱱ ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ}} ᱵᱷᱤᱛᱨᱤᱨᱮ, ᱚᱠᱟ ᱥᱟᱦᱴᱟ ᱫᱚ (cascading) ᱛᱮ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱢᱮᱱᱟᱜ-ᱟ:\n$2", - "namespaceprotected": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱞᱟᱹᱜᱤᱛ ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱹᱱᱩᱜ ᱛᱟᱢᱟ '''$1''' ᱧᱩᱛᱩᱢ ᱡᱟᱭᱜᱟ᱾", + "namespaceprotected": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱞᱟᱹᱜᱤᱛ ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱹᱱᱩᱜ ᱛᱟᱢᱟ $1 ᱧᱩᱛᱩᱢ ᱡᱟᱭᱜᱟ᱾", + "customcssprotected": "ᱱᱤᱭᱟᱹ CSS ᱥᱟᱠᱟᱢ ᱥᱟᱯᱲᱟᱣ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱛᱟᱢᱟ, ᱪᱮᱫᱟᱜ ᱥᱮ ᱱᱤᱭᱟᱹ ᱫᱚ ᱮᱴᱟᱜ ᱦᱚᱲ ᱟᱭᱟᱜ ᱥᱮᱴᱤᱜ ᱨᱮᱭ ᱫᱚᱦᱚ ᱟᱠᱟᱫᱟ᱾", + "mycustomcssprotected": "ᱱᱤᱭᱟᱹ CSS ᱥᱟᱠᱟᱢ ᱥᱟᱯᱲᱟᱣ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱛᱟᱢᱟ᱾", + "mycustomjsprotected": "ᱱᱤᱭᱟᱹ JavaScript ᱥᱟᱠᱟᱢ ᱥᱟᱯᱲᱟᱣ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱛᱟᱢᱟ᱾", + "mypreferencesprotected": "ᱟᱢᱟᱜ ᱠᱩᱥᱤᱠᱚ ᱥᱟᱯᱲᱟᱣ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱛᱟᱢᱟ᱾", "ns-specialprotected": "ᱟᱥᱚᱠᱟᱭ ᱛᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱯᱲᱟᱣ ᱨᱮᱭᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱟᱢᱟᱜ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾", "exception-nologin": "ᱵᱟᱢ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟ", "exception-nologin-text": "ᱫᱟᱭᱟᱠᱟᱛᱮ ᱵᱚᱞᱚᱱ ᱢᱮ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ", - "virus-badscanner": "Vul konfigareson: baṅ orom vairas skenar: \"$1\"", - "virus-scanfailed": "Esken baṅ hoelena (Code $1)", - "virus-unknownscanner": "Baṅ urum anṭvayras:", + "virus-badscanner": "ᱵᱟᱹᱲᱤᱡ ᱠᱚᱱᱯᱷᱤᱜᱟᱨᱮᱥᱚᱱ: ᱵᱟᱝ ᱩᱨᱩᱢ ᱵᱷᱟᱭᱨᱟᱥ ᱮᱥᱠᱮᱱᱟᱨ: \"$1\"", + "virus-scanfailed": "ᱮᱥᱠᱮᱱ ᱵᱟᱝ ᱦᱩᱭᱞᱮᱱᱟ (Code $1)", + "virus-unknownscanner": "ᱵᱟᱝ ᱩᱨᱩᱢ ᱮᱱᱴᱤᱵᱷᱟᱭᱨᱟᱥ:", "cannotlogoutnow-title": "ᱱᱤᱛ ᱚᱰᱚᱠ ᱵᱟᱭ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ", "cannotlogoutnow-text": "ᱚᱰᱚᱠᱚᱜ ᱫᱚ ᱵᱟᱭ ᱜᱟᱱᱚᱜᱼᱟ ᱡᱚᱠᱷᱚᱱ $1 ᱵᱮᱵᱷᱟᱨᱚᱜ ᱠᱟᱱᱟ", "welcomeuser": "ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ, $1!", @@ -361,17 +372,20 @@ "cannotloginnow-text": "ᱵᱚᱞᱚᱱ ᱫᱚ ᱵᱟᱭ ᱜᱟᱱᱚᱜᱼᱟ ᱡᱚᱠᱷᱚᱱ $1 ᱵᱮᱵᱷᱟᱨᱚᱜ ᱠᱟᱱᱟ", "cannotcreateaccount-title": "ᱮᱠᱟᱶᱩᱴ ᱵᱟᱝ ᱛᱮᱭᱟᱨᱞᱮᱱᱟ", "yourdomainname": "ᱟᱢᱟᱜ ᱧᱩᱛᱩᱢ:", - "externaldberror": "Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.", + "externaldberror": "ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱡᱟᱸᱦᱟᱸᱱ ᱵᱟᱨᱦᱮ ᱨᱮᱭᱟᱜ ᱡᱟᱪᱟᱭᱤᱡ ᱰᱟᱴᱟᱵᱮᱥ ᱵᱷᱩᱞ ᱦᱩᱭᱠᱟᱱᱟ ᱥᱮ ᱟᱢᱟᱜ ᱵᱟᱨᱦᱮ ᱨᱮᱭᱟᱜ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱷᱟ ᱫᱚ ᱱᱟᱦᱟᱜ ᱦᱟᱞᱚᱛ ᱨᱩᱣᱟᱹᱲ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾", "login": "ᱵᱚᱞᱚᱜ ᱢᱮ", + "login-security": "ᱟᱢᱟᱜ ᱩᱯᱲᱩᱢ ᱵᱤᱰᱟᱹᱣ ᱢᱮ", "nav-login-createaccount": "ᱵᱚᱞᱚᱜ ᱫᱩᱣᱟᱹᱨ / ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ", "logout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ", "userlogout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ", "notloggedin": "ᱵᱟᱢ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟ", "userlogin-noaccount": "ᱠᱷᱟᱛᱟ ᱵᱟᱹᱱᱩᱜ ᱛᱟᱢᱟ?", - "userlogin-joinproject": "ᱠᱷᱚᱸᱡᱟ {{SITENAME}}", + "userlogin-joinproject": "ᱥᱮᱞᱮᱫᱚᱜ ᱢᱮ {{SITENAME}} ᱨᱮ", "createaccount": "ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ", "userlogin-resetpassword-link": "ᱟᱢᱟᱜ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱦᱤᱲᱤᱧ ᱠᱮᱫᱟᱢ?", "userlogin-helplink2": "ᱵᱚᱞᱚᱜ ᱠᱷᱟᱹᱛᱤᱨ ᱜᱚᱸᱲᱚᱸ", + "userlogin-loggedin": "ᱟᱢ ᱫᱚ {{GENDER:$1|$1}} ᱞᱮᱠᱟᱛᱮ ᱵᱚᱞᱚᱜᱮ ᱢᱮᱱᱟᱢᱟ᱾ ᱮᱴᱟᱜ ᱦᱚᱲ ᱞᱮᱠᱟᱛᱮ ᱵᱚᱞᱚ ᱞᱟᱹᱜᱤᱫ ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ ᱯᱷᱚᱨᱢ ᱵᱮᱣᱦᱟᱨ ᱢᱮ᱾", + "userlogin-reauth": "ᱟᱢ {{GENDER:$1|$1}} ᱠᱟᱱᱟᱢ ᱚᱱᱟ ᱵᱤᱰᱟᱹᱣ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱫᱚᱥᱟᱨ ᱛᱮ ᱵᱚᱞᱚᱜ ᱢᱮ᱾", "userlogin-createanother": "ᱮᱴᱟᱜ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ", "createacct-emailrequired": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ", "createacct-emailoptional": "ᱤᱢᱮᱞ ᱴᱷᱤᱠᱱᱟ (ᱟᱢᱠᱩᱥᱤ)", @@ -389,53 +403,53 @@ "createacct-benefit-body1": "{{PLURAL:$1|ᱥᱟᱯᱲᱟᱣ|ᱥᱟᱯᱲᱟᱣᱠᱚ}}", "createacct-benefit-body2": "{{PLURAL:$1|ᱥᱟᱦᱴᱟ|ᱥᱟᱦᱴᱟᱠᱳ}}", "createacct-benefit-body3": "ᱱᱮᱛᱟᱨ {{PLURAL:$1|ᱮᱱᱮᱢᱤᱭᱟᱹ|ᱮᱱᱮᱢᱤᱭᱟᱹᱠᱚ}}", - "badretype": "Am do okaṭaḱ oku nambarkom em keda ona do baṅ milạolena.", - "userexists": "Laṛcaṛicaḱ ńutum em hoyena ona do beohar hoyakana.\nDayakatet́ eṭagaḱ ńutum bachaome.", + "badretype": "ᱟᱢ ᱫᱚ ᱚᱠᱟᱴᱟᱜ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨᱠᱚᱢ ᱮᱢ ᱠᱟᱫᱟ ᱚᱱᱟ ᱫᱚ ᱵᱟᱝ ᱢᱤᱞᱟᱹᱜ ᱠᱟᱱᱟ᱾", + "userexists": "ᱞᱟᱲᱪᱟᱹᱨᱤᱡ ᱧᱩᱛᱩᱢ ᱮᱢ ᱦᱩᱭᱱᱟ ᱚᱱᱟ ᱫᱚ ᱵᱮᱵᱷᱟᱨ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾\nᱫᱟᱭᱟᱠᱟᱛᱮᱛ ᱮᱴᱟᱜ-ᱟ ᱧᱩᱛᱩᱢ ᱵᱟᱪᱷᱟᱣᱢᱮ᱾", "loginerror": "ᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚᱜ ᱦᱩᱲᱟᱹᱜ", "createacct-error": "ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨ ᱦᱩᱲᱟᱹᱜ", "createaccounterror": "ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱵᱟᱝ ᱛᱮᱭᱟᱨᱠᱟᱱᱟ: $1", "nocookiesnew": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱦᱤᱥᱟᱹᱵ ᱛᱮᱭᱟᱨ ᱦᱩᱭ ᱞᱮᱱᱟ, ᱢᱮᱱᱠᱷᱟᱱ ᱟᱢᱫᱚ ᱱᱤᱛ ᱫᱷᱟᱹᱵᱤᱡ ᱵᱟᱢ ᱵᱚᱞᱚᱣᱠᱟᱱᱟ᱾ {{SITENAME}} ᱨᱮ ᱠᱩᱠᱤᱠᱚ ᱵᱮᱵᱦᱟᱨ ᱠᱟᱛᱮ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱦᱤᱥᱟᱹᱵᱨᱮ ᱵᱚᱞᱚᱣᱟ᱾\nᱟᱢᱟᱜ ᱠᱩᱠᱤᱠᱚ ᱵᱚᱸᱫᱚ ᱦᱩᱭᱠᱟᱱᱟ᱾\nᱫᱟᱭᱟᱠᱟᱛᱮ ᱠᱩᱠᱤᱠᱚ ᱡᱷᱤᱡ ᱢᱮ, ᱚᱱᱟ ᱛᱟᱭᱚᱢ ᱟᱢᱟᱜ ᱱᱟᱣᱟ ᱵᱮᱵᱦᱟᱨᱤᱡ ᱧᱤᱛᱩᱢ ᱟᱨ ᱩᱠᱩ ᱮᱞᱥᱚᱝ ᱵᱮᱵᱦᱟᱨ ᱠᱟᱛᱮᱡ ᱱᱚᱣᱟ ᱦᱤᱥᱟᱹᱵᱨᱮ ᱵᱚᱞᱚᱜᱢᱮ᱾", - "nocookieslogin": "{{SITENAME}} re kuki hotete beoharićaḱ bhitri boloḱ do hoyoḱa. Amaḱ sendrare kuki bondo menaḱa. Kuki cạlu kate arhõ kurumuṭuimẽ.", + "nocookieslogin": "{{SITENAME}} ᱫᱚ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱵᱚᱞᱚᱜ ᱞᱟᱹᱜᱤᱫ ᱠᱩᱠᱤᱡᱽ ᱠᱚᱭ ᱵᱮᱵᱷᱟᱨᱟ ᱾\nᱟᱢ ᱠᱩᱠᱤᱡᱽ ᱮᱢ ᱵᱚᱸᱫᱽ ᱟᱠᱟᱫᱼᱟ ᱾\nᱚᱱᱟᱠᱚ ᱦᱚᱨ ᱟᱲᱟᱜᱟᱜ ᱢᱮ ᱟᱨ ᱫᱚᱲᱦᱟ ᱵᱤᱰᱟᱹᱣ ᱾", "nocookiesfornew": "Beoharićaḱ ekaunṭ do baṅ tear akana, Cedaḱ je noa ńamoḱ jaega babote ale do bale uruma.\nAle do baḍae ocolem amaḱ kuki doe kạmikana, sakam do arhõ rakaṕ lạgit́te kurumuṭuemẽ.", - "noname": "Am do asol beoharićaḱ ńutum ṭhikte bam emakada.", - "loginsuccesstitle": "ᱵᱷᱤᱛᱨᱤ ᱵᱚᱠᱟᱜ ᱫᱚ ᱢᱚᱡᱽᱛᱮᱜᱮ ᱯᱩᱨᱟᱹᱣᱱᱟ", - "loginsuccess": "'''Am do nitge \"$1\" ńutumte {{SITENAME}} rem bolo akana.'''", + "noname": "ᱟᱢ ᱥᱩᱦᱤᱛ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ ᱵᱟᱢ ᱟᱫᱮᱨ ᱟᱠᱟᱫᱼᱟ ᱾", + "loginsuccesstitle": "ᱵᱚᱞᱚ ᱟᱠᱮᱱᱟᱢ", + "loginsuccess": "ᱟᱢ ᱫᱚ ᱱᱤᱛᱜᱮ \"$1\" ᱧᱩᱛᱩᱢᱛᱮ {{SITENAME}} ᱨᱮᱢ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟ᱾", "nosuchuser": "\"$1\" ᱧᱩᱛᱩᱢᱟᱱ ᱡᱟᱸᱦᱟᱱ ᱵᱮᱵᱷᱟᱨᱤᱡ ᱵᱟᱹᱱᱩᱭᱟ᱾ ᱵᱮᱵᱷᱟᱨᱤᱡ ᱧᱩᱛᱩᱢ ᱫᱚ ᱵᱩᱠᱨᱩᱜᱮᱭᱟ᱾ ᱟᱢᱟᱜ ᱵᱟᱱᱟᱱᱠᱩ ᱧᱮᱞᱢᱮ, ᱥᱮ [[Special:CreateAccount|ᱱᱟᱣᱟ ᱢᱤᱫᱴᱮᱱ ᱮᱠᱟᱶᱩᱴ ᱛᱮᱭᱟᱨᱢᱮ]]᱾", - "nosuchusershort": "\"$1\" ńutuman jahãe beoharko do banuḱkoa. Ńutum reaḱ banan biḍaomẽ.", - "nouserspecified": "Am do pusṭaote laṛcaṛićaḱ ńutum em hoyoḱtama.", - "login-userblocked": "Nui laṛcaṛic doe esetgea. bhitri boloḱ ạidạri bań emoḱ kana.", - "wrongpassword": "ᱵᱮᱷᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ ᱥᱮ ᱩᱠᱩ ᱱᱟᱢᱵᱟᱨ ᱵᱟᱝ ᱢᱤᱞᱟᱹᱜ ᱠᱟᱱᱟ᱾ ᱫᱚᱲᱦᱟᱛᱮ ᱠᱩᱨᱩᱢᱩᱴᱩᱭᱢᱮ᱾", - "wrongpasswordempty": "Em hoyen oku nambar do cetge banuḱa.\nDaya katet́ arhõ kurumuṭuyme.", - "passwordtooshort": "Uku nambar do {{PLURAL:$1 1 horop reaḱ $1 horop reaḱ}} mudre hoyoḱ jạruṛa.", - "password-name-match": "Amaḱ oku nambar do amaḱ ńutum khon eṭaḱ hoyoḱ jạruṛtama.", - "password-login-forbidden": "Noa laṛcaṛicaḱ ńutum ar oku nambar do ạnlekate baṅkana.", + "nosuchusershort": "\"$1\" ᱧᱩᱛᱩᱢᱟᱱ ᱡᱟᱸᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹᱠᱳ ᱫᱚ ᱵᱟᱹᱱᱩᱜ ᱠᱳᱣᱟ᱾\nᱧᱩᱛᱩᱢ ᱨᱮᱭᱟᱜ ᱵᱟᱱᱟᱱ ᱵᱤᱰᱟᱹᱣᱢᱮ᱾", + "nouserspecified": "ᱟᱢ ᱫᱚ ᱯᱩᱥᱴᱟᱹᱣᱛᱮ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ ᱮᱢ ᱦᱩᱭᱩᱛᱟᱢᱟ᱾", + "login-userblocked": "ᱱᱩᱭ ᱵᱮᱵᱷᱟᱨᱤᱭᱟ ᱫᱚᱭ ᱮᱥᱮᱫᱜᱮᱭᱟ᱾ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾", + "wrongpassword": "ᱟᱫᱮᱨᱟᱠᱟᱫ ᱵᱮᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ ᱥᱮ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱦᱩᱲᱟᱹᱜ ᱜᱮᱭᱟ᱾\nᱫᱚᱲᱦᱟᱛᱮ ᱠᱩᱨᱩᱢᱩᱴᱩᱭᱢᱮ᱾", + "wrongpasswordempty": "ᱮᱢ ᱦᱩᱭᱮᱱ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱨᱮ ᱫᱚ ᱪᱮᱫ ᱜᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\nᱫᱟᱭᱟᱠᱟᱛᱮ ᱟᱨᱦᱚᱸ ᱠᱩᱨᱩᱢᱩᱴᱩᱭᱢᱮ᱾", + "passwordtooshort": "ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱚ {{PLURAL:$1 1 ᱦᱚᱨᱚᱯ ᱨᱮᱭᱟᱜ $1 ᱦᱚᱨᱚᱯ ᱨᱮᱭᱟᱜ}} ᱢᱩᱫᱨᱮ ᱦᱩᱭᱩᱜ ᱡᱟᱹᱨᱩᱲᱟ᱾", + "password-name-match": "ᱟᱢᱟᱜ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱚ ᱟᱢᱟᱜ ᱧᱩᱛᱩᱢ ᱠᱷᱚᱱ ᱮᱴᱟᱜ ᱦᱩᱭᱩᱜ ᱡᱟᱹᱨᱩᱲᱟ᱾", + "password-login-forbidden": "ᱱᱚᱣᱟ ᱵᱮᱵᱷᱟᱨᱤᱭᱟ ᱧᱩᱛᱩᱢ ᱟᱨ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱚ ᱮᱠᱟᱞᱛᱮ ᱵᱟᱝ ᱜᱟᱱᱚᱜ-ᱟ᱾", "mailmypassword": "ᱱᱟᱣᱟᱛᱮ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱮᱢ", - "passwordremindertitle": "ᱱᱟᱣᱟ ᱱᱤᱛ ᱞᱟᱹᱜᱤᱛ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ {{SITENAME}} ᱞᱟᱹᱜᱤᱛ ᱛᱮ", - "noemail": "\"$1\" beoharić lạgit́te do jahan e-mail ṭhikana rukhiyạ doho bạnuḱa.", - "noemailcreate": "Am do mitṭen jewet e-mail ṭhikạna em jaruṛ menaḱtama.", - "passwordsent": "\"$1\" ṭhikạnate resṭariyen e-mail lạgit́te mitṭen oku nambar em hoyena.\nDaya kate ńam porte arhõ bhitri boloḱme.", + "passwordremindertitle": "ᱱᱟᱣᱟ ᱠᱟᱹᱢᱤᱪᱚᱲᱟ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ {{SITENAME}} ᱞᱟᱹᱜᱤᱛ ᱛᱮ", + "noemail": "\"$1\" ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱞᱟᱹᱜᱤᱫᱛᱮ ᱫᱚ ᱤ-ᱢᱮᱞ ᱴᱷᱤᱠᱟᱱᱟ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱫᱚᱦᱚ ᱵᱟᱹᱱᱩᱜᱼᱟ᱾", + "noemailcreate": "ᱟᱢ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱡᱤᱣᱟᱹᱛ ᱤ-ᱢᱮᱞ ᱴᱷᱤᱠᱟᱱᱟ ᱮᱢ ᱡᱟᱹᱨᱩᱲ ᱢᱮᱱᱟᱜ ᱛᱟᱢᱟ᱾", + "passwordsent": "ᱢᱤᱫ ᱱᱟᱶᱟ ᱫᱟᱱᱟᱝᱥᱟᱵᱟᱫᱽ \"$1\" ᱞᱟᱹᱜᱤᱫ ᱨᱤᱥᱴᱨᱤ ᱟᱠᱟᱱ ᱤᱢᱮᱞ ᱨᱮ ᱠᱳᱞ ᱮᱱᱟ ᱾\nᱧᱟᱢ ᱠᱮᱫ ᱛᱟᱭᱚᱢ ᱫᱚᱲᱦᱟ ᱵᱚᱞᱚᱱ ᱢᱮ ᱾", "blocked-mailpassword": "ᱟᱢᱟᱜ IP ᱴᱷᱤᱠᱟᱹᱱᱟ ᱠᱷᱚᱱ ᱥᱟᱯᱲᱟᱣ ᱰᱚᱱᱫᱽ ᱜᱮᱭᱟ᱾ ᱚᱱᱟᱛᱮ ᱱᱚᱣᱟ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱵᱟᱝ ᱵᱮᱵᱷᱟᱨ ᱠᱟᱛᱮ ᱩᱠᱩ ᱱᱟᱢᱵᱟᱨ ᱨᱩᱣᱟᱹᱲ ᱵᱟᱝ ᱦᱩᱭᱩᱜ-ᱟ᱾", - "mailerror": "E-mail kulte eṭkẽṭõrẽ: $1", + "mailerror": "E-mail ᱠᱩᱞᱛᱮ ᱮᱴᱠᱮᱴᱚᱸᱲᱮ: $1", "emailauthenticated": "ᱟᱢᱟᱜ ᱤ-ᱢᱮᱞ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱫᱚ $2 ᱛᱟᱹᱨᱤᱠᱷ ᱨᱮᱭᱟᱜ $3 ᱨᱮ ᱡᱟᱹᱦᱤᱨᱮᱱᱟ᱾", "emailnotauthenticated": "ᱟᱢᱟᱜ e-mail ᱨᱮᱭᱟᱜ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱫᱚ ᱱᱤᱛ ᱦᱚᱸ ᱵᱟᱝ ᱡᱟᱹᱪᱟᱹᱭ ᱟᱠᱟᱱᱟ ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ features ᱞᱟᱹᱜᱤᱛᱛᱮ ᱡᱟᱸᱦᱟᱸᱱ e-mail ᱫᱚ ᱵᱟᱝᱠᱩᱞᱟᱠᱳ᱾", - "noemailprefs": "Noa features ko kạmie ocoy lạgit́te mit́ṭen e-mail ṭhikạna dohoe hoyoḱa.", - "emailconfirmlink": "Amaḱ e-mail ṭhikana do sạriyme.", - "invalidemailaddress": "Noa e-mail ṭhikạna do baṅ hataoa, karon noa formeṭ do pusṭạote baṅ em akana. Dayakate pusṭao formeṭte ṭhikạna emmẽ, se khet do khạliemẽ.", - "cannotchangeemail": "Ekaunṭ e-mail ṭhikạnakodo noa wiki re baṅ bodoloḱ kana.", - "emaildisabled": "Noa sayeṭre do e-mail em subita bạnuḱa.", + "noemailprefs": "ᱱᱚᱣᱟ ᱯᱷᱤᱪᱟᱨᱥ ᱠᱳ ᱠᱟᱹᱢᱤ ᱚᱪᱚᱭᱛᱮ ᱢᱤᱫᱴᱮᱱ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱫᱚᱦᱚᱭ ᱦᱩᱭᱩᱜ-ᱟ᱾", + "emailconfirmlink": "ᱟᱢᱟᱜ ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱥᱟᱹᱨᱤᱢᱮ", + "invalidemailaddress": "ᱱᱚᱣᱟ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱫᱚ ᱵᱟᱝ ᱦᱟᱛᱟᱣᱚᱜ-ᱟ, ᱠᱟᱨᱚᱱ ᱱᱚᱣᱟ ᱯᱷᱚᱨᱢᱮᱴ ᱫᱚ ᱯᱩᱥᱴᱟᱹᱣᱛᱮ ᱵᱟᱝ ᱮᱢ ᱟᱠᱟᱱᱟ᱾ \nᱫᱟᱭᱟᱠᱟᱛᱮ ᱯᱩᱥᱴᱟᱹᱣ ᱯᱷᱚᱨᱢᱮᱴᱛᱮ ᱴᱷᱤᱠᱟᱱᱟ ᱮᱢ ᱢᱮ, ᱥᱮ ᱠᱷᱟᱹᱞᱤ ᱫᱚᱦᱚᱭᱢᱮ᱾", + "cannotchangeemail": "ᱮᱠᱟᱶᱩᱴ ᱤᱢᱮᱞ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱫᱚ ᱱᱚᱣᱟ ᱣᱤᱠᱤ ᱨᱮ ᱵᱟᱝ ᱵᱚᱫᱚᱞᱚᱜ ᱠᱟᱱᱟ᱾", + "emaildisabled": "ᱱᱚᱣᱟ ᱥᱟᱭᱤᱴᱨᱮ ᱫᱚ e-mail ᱮᱢ ᱥᱩᱵᱤᱫᱟ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾", "accountcreated": "ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱱᱟ", - "accountcreatedtext": "$1 ᱞᱟᱹᱜᱤᱛᱛᱮ ᱮᱠᱟᱣᱱᱴ ᱫᱚ ᱵᱮᱱᱟᱣᱮᱱᱟ᱾", + "accountcreatedtext": "ᱱᱤᱭᱟᱹ ᱵᱮᱵᱷᱟᱨᱤᱭᱟ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱫᱚ [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ᱵᱮᱱᱟᱣᱱᱟ᱾", "createaccount-title": "{{SITENAME}} ᱞᱟᱹᱜᱤᱛᱛᱮ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨ", - "createaccount-text": "Okoe co am lạgit́te mitṭen ekaunṭko amaḱ e-mail ṭhikạna lạgit {{SITENAME}} re ($4) ńutum \"$2\", oku nambar \"$3\".\nAm do mesagem baṅ daṛeyaḱa, judi noa ekaunṭ do vulge benaolen khan.", - "login-throttled": "ᱟᱢ ᱫᱚ ᱢᱤᱫᱜᱷᱟᱹᱲᱤ ᱞᱟᱦᱟᱨᱮ ᱟᱭᱢᱟ ᱫᱷᱟᱣ ᱵᱚᱞᱚᱜᱮᱢ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱠᱮᱫᱟ᱾ \nᱟᱨᱦᱚᱸ ᱠᱩᱨᱩᱢᱩᱴᱩᱭ ᱞᱟᱦᱟᱨᱮ ᱫᱟᱭᱟᱠᱟᱛᱮ ᱛᱷᱟᱲᱟᱜᱟᱱ ᱛᱟᱸᱜᱤᱭᱢᱮ᱾", + "createaccount-text": "ᱚᱠᱚᱭ ᱪᱚ ᱟᱢ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱢᱤᱫᱴᱮᱱ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱟᱢᱟᱜ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱞᱟᱹᱜᱤᱛ {{SITENAME}} ᱨᱮ ($4) ᱧᱩᱛᱩᱢ \"$2\", ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ\"$3\"᱾\nᱟᱢ ᱫᱚ ᱱᱮᱛᱚᱜ ᱵᱚᱞᱚᱜ ᱢᱮ ᱟᱨ ᱟᱢᱟᱜ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱵᱟᱫᱟᱞ ᱢᱮ᱾\n\nᱟᱢ ᱫᱚ ᱱᱤᱭᱟ ᱠᱷᱚᱵᱚᱨᱮᱢ ᱵᱟᱫᱽ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱡᱩᱫᱤ ᱱᱤᱭᱟᱹ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱷᱟ ᱵᱷᱩᱞᱛᱮ ᱵᱮᱱᱟᱣᱞᱮᱱ ᱠᱷᱟᱱ᱾", + "login-throttled": "ᱟᱢ ᱫᱚ ᱢᱤᱫᱜᱷᱟᱹᱲᱤ ᱞᱟᱦᱟᱨᱮ ᱟᱭᱢᱟ ᱫᱷᱟᱣ ᱵᱚᱞᱚᱜᱮᱢ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱠᱮᱫᱟ᱾ \nᱟᱨᱦᱚᱸ ᱠᱩᱨᱩᱢᱩᱴᱩᱭ ᱞᱟᱦᱟᱨᱮ ᱫᱟᱭᱟᱠᱟᱛᱮ $1 ᱛᱟᱸᱜᱤᱭᱢᱮ᱾", "login-abort-generic": "ᱟᱢᱟᱜ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱠᱟᱜ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱞᱮᱱᱟ - ᱵᱟᱫᱽᱱᱟ", "loginlanguagelabel": "ᱯᱟᱹᱨᱥᱤ: $1", "pt-login": "ᱵᱚᱞᱚᱜ ᱫᱩᱭᱟᱹᱨ", "pt-login-button": "ᱵᱚᱞᱚᱜ ᱢᱮ", "pt-login-continue-button": "ᱞᱮᱛᱟᱲ ᱵᱚᱞᱚ ᱠᱚᱜᱼᱢᱮ", - "pt-createaccount": "ᱴᱷᱟᱭ ᱵᱮᱱᱟᱣᱢᱮ", + "pt-createaccount": "ᱮᱠᱟᱶᱩᱴ ᱛᱮᱭᱟᱨᱢᱮ", "pt-userlogout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ", - "user-mail-no-addy": "Jahan e-mail ṭhikana bạgi kate e-mail kul kurumuṭu hoena.", + "user-mail-no-addy": "ᱡᱟᱸᱦᱟᱸᱱ e-mail ᱴᱷᱤᱠᱟᱱᱟ ᱵᱟᱹᱜᱤ ᱠᱟᱛᱮ e-mail ᱠᱩᱞ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱦᱩᱭᱮᱱᱟ᱾", "changepassword": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ", "resetpass_header": "ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱨᱮᱱᱟᱜ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ", "oldpassword": "ᱢᱟᱨᱮᱭᱟᱜ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ:", @@ -453,26 +467,26 @@ "botpasswords-label-resetpassword": "ᱱᱟᱣᱟᱛᱮ ᱫᱟᱱᱟᱝᱥᱟᱵᱟᱫᱽ ᱮᱢ", "botpasswords-label-grants-column": "ᱦᱩᱭᱠᱟᱱ", "botpasswords-bad-appid": "ᱵᱚᱴ ᱧᱤᱛᱩᱢ \"$1\" ᱵᱟᱝ ᱴᱷᱤᱠᱟ᱾", - "botpasswords-created-title": "ᱵᱚᱴ ᱩᱠᱩ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱛᱮᱭᱟᱨᱱᱟ", + "botpasswords-created-title": "ᱵᱚᱴ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱛᱮᱭᱟᱨᱮᱱᱟ", "botpasswords-updated-title": "ᱵᱚᱴ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱩᱛᱷᱱᱟᱹᱣ", "botpasswords-deleted-title": "ᱵᱚᱴ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱢᱩᱪᱷᱟᱹᱣᱱᱟ", "resetpass_forbidden": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱟᱝ ᱵᱚᱫᱚᱞᱜ-ᱟ", "resetpass_forbidden-reason": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱟᱝ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ: $1", - "resetpass-no-info": "Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.", + "resetpass-no-info": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱥᱚᱡᱷᱮᱛᱮ ᱞᱟᱲᱪᱟᱲ ᱞᱟᱹᱜᱤᱫᱛᱮ ᱟᱢ ᱫᱚ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚᱜ ᱦᱩᱭᱩᱜᱛᱟᱢᱟ᱾", "resetpass-submit-loggedin": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ", "resetpass-submit-cancel": "ᱵᱟᱫᱽ", "resetpass-temp-password": "ᱱᱮᱛᱚᱜ ᱞᱟᱹᱜᱤᱛ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ:", "passwordreset": "ᱱᱟᱣᱟᱛᱮ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱮᱢ", - "passwordreset-disabled": "Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.", + "passwordreset-disabled": "ᱱᱚᱣᱟ ᱣᱤᱠᱤ ᱨᱮ ᱟᱢᱟᱜ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱱᱟᱣᱟᱛᱮ ᱮᱢ ᱞᱟᱹᱜᱤᱛ ᱥᱩᱵᱤᱫᱟ ᱫᱚ ᱵᱚᱱᱫ ᱜᱮᱭᱟ᱾", "passwordreset-username": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱧᱩᱛᱩᱢ:", "passwordreset-domain": "ᱧᱩᱛᱩᱢ:", "passwordreset-email": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ:", - "passwordreset-emailtitle": "{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko", + "passwordreset-emailtitle": "{{SITENAME}} ᱨᱮ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱯᱩᱨᱟᱹᱣ ᱛᱷᱩᱛᱷᱤᱠᱳ", "passwordreset-emailelement": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ: \n$1\n\nᱢᱤᱫ ᱜᱷᱟᱹᱲᱤ ᱞᱟᱹᱜᱤᱛ ᱫᱟᱱᱟᱝ ᱱᱟᱵᱟᱫᱽ: \n$2", "passwordreset-emailsentemail": "ᱱᱚᱣᱟ ᱤᱢᱮᱞ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱥᱟᱶᱛᱮ ᱢᱮᱥᱟ ᱢᱮᱱᱟᱜ ᱠᱷᱟᱡ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱤᱥᱟᱹ ᱨᱩᱣᱟᱹᱲ ᱤᱢᱮᱞ ᱫᱚ ᱠᱩᱞᱮᱱᱟ᱾", "changeemail": "ᱤᱢᱮᱞ ᱴᱷᱤᱠᱱᱟ ᱵᱚᱫᱚᱞ ᱢᱮ ᱥᱮ ᱚᱪᱚᱜᱽ ᱢᱮ", "changeemail-header": "e-mail ᱴᱷᱤᱠᱟᱹᱱᱟ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱱᱤᱭᱟᱹ ᱯᱷᱚᱨᱢ ᱯᱩᱨᱳᱱᱢᱮ᱾ ᱡᱟᱸᱦᱟᱸᱱ email ᱡᱩ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱨᱮ ᱢᱮᱥᱟ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱱᱟᱠᱩ ᱚᱪᱚᱜ ᱞᱟᱹᱜᱤᱛ email ᱴᱷᱤᱠᱟᱹᱱᱟ ᱚᱞ ᱡᱟᱜᱟ ᱫᱚ ᱯᱷᱟᱠᱟ ᱫᱚᱦᱚᱭᱢᱮ᱾", - "changeemail-no-info": "Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.", + "changeemail-no-info": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱥᱚᱡᱽᱦᱮᱛᱮ ᱞᱟᱲᱪᱟᱲ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱟᱢ ᱫᱚ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚᱜ ᱦᱩᱭᱩᱜᱛᱟᱢᱟ᱾", "changeemail-oldemail": "ᱱᱮᱛᱚᱜ-ᱟᱜ ᱤᱢᱮᱞ ᱴᱷᱤᱠᱟᱹᱱᱟ", "changeemail-newemail": "ᱱᱟᱣᱟ ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ:", "changeemail-none": "(ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱹᱱᱩᱜ-ᱟ)", @@ -485,7 +499,7 @@ "link_sample": "ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ", "link_tip": "ᱵᱷᱤᱛᱨᱤ ᱡᱚᱱᱚᱲ", "extlink_sample": "http://www.example.com ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ", - "extlink_tip": "ᱵᱟᱨᱦᱮ ᱨᱮᱱᱟᱜ ᱡᱚᱱᱚᱲ (ᱫᱤᱥᱟᱹᱭᱢᱮ http://prefix)", + "extlink_tip": "ᱵᱟᱨᱦᱮ ᱡᱚᱱᱚᱲ (ᱫᱤᱥᱟᱹᱭᱢᱮ http:// prefix)", "headline_sample": "ᱵᱚᱦᱚᱜ ᱨᱮᱱᱟᱜ ᱚᱞ", "headline_tip": "ᱞᱮᱵᱷᱮᱞ ᱒ ᱦᱮᱰᱞᱟᱭᱤᱱ", "nowiki_sample": "ᱵᱮᱜᱚᱨ ᱯᱷᱚᱨᱢᱮᱴ ᱚᱞᱠᱩ ᱵᱷᱚᱨᱟᱣᱢᱮ", @@ -510,7 +524,7 @@ "showpreview": "ᱧᱮᱞᱡᱚᱝ ᱩᱫᱩᱜᱽᱢᱮ", "showdiff": "ᱵᱚᱫᱚᱞᱠᱩ ᱩᱫᱩᱜᱽ ᱢᱮ", "anoneditwarning": "ᱦᱩᱥᱤᱭᱟᱹᱨ: ᱟᱢ ᱵᱟᱢ ᱵᱚᱞᱚᱣᱟᱠᱟᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ ᱡᱟᱦᱟᱸᱱᱟᱜ ᱥᱟᱯᱲᱟᱣᱟᱢ ᱟᱢᱟᱜ IP ᱵᱩᱴᱟᱹ ᱥᱚᱫᱚᱨ ᱛᱟᱦᱮᱸᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ [$1 ᱵᱚᱞᱚᱱᱟᱢ]
    ᱟᱨᱵᱟᱝ [$2 ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱟᱢ], ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱩᱫᱩᱜᱚᱜ-ᱟ ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ, ᱥᱟᱶᱛᱮ ᱮᱴᱟᱜ ᱥᱩᱵᱤᱫᱷᱟ ᱠᱚ ᱾", - "anonpreviewwarning": "\"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa.\"", + "anonpreviewwarning": "\"ᱟᱢ ᱫᱚ ᱵᱷᱤᱛᱨᱤ ᱵᱟᱢ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟ᱾ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮ ᱟᱢᱟᱜ ᱠᱟᱹᱢᱤᱠᱳ ᱡᱟᱨᱮ IP ᱴᱷᱤᱠᱟᱱᱟ ᱨᱮ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱠᱟᱜ᱾\"", "missingcommenttext": "ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱠᱟᱛᱷᱟ ᱵᱚᱞᱚᱭ ᱢᱮ᱾", "summary-preview": "ᱜᱩᱴ ᱠᱟᱛᱷᱟ ᱩᱱᱩᱫᱩᱜ:", "subject-preview": "ᱜᱩᱴᱠᱟᱛᱷᱟ ᱩᱱᱩᱫᱩᱜ:", @@ -521,15 +535,15 @@ "nosuchsectiontitle": "ᱛᱷᱚᱠ ᱵᱟᱝ ᱧᱟᱢᱞᱮᱱᱟ", "loginreqtitle": "ᱵᱚᱞᱚᱜ ᱡᱟᱹᱨᱩᱲᱟ", "loginreqlink": "ᱵᱚᱞᱚᱜ ᱢᱮ", - "loginreqpagetext": "Eṭagaḱ sakamko ńel lạgit́te do am $1 hoyoḱ jạruṛtama.", + "loginreqpagetext": "ᱮᱴᱟᱜ ᱥᱟᱦᱴᱟᱠᱳ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱫᱚ ᱟᱢ $1 ᱦᱩᱭᱩᱜ ᱡᱟᱹᱨᱩᱲᱛᱟᱢᱟ᱾", "accmailtitle": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱩᱞ ᱦᱩᱭᱱᱟ", - "accmailtext": "[[User talk:$1 $1]] ᱞᱟᱹᱜᱤᱛᱛᱮ ᱟᱪᱛᱮ ᱵᱮᱱᱟᱣᱮᱱ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱫᱚ $2 ᱠᱩᱞ ᱦᱩᱭᱮᱱᱟ᱾\nᱵᱷᱤᱛᱨᱤ ᱵᱚᱞᱚ ᱠᱟᱛᱮ ᱱᱚᱣᱟ ᱱᱟᱣᱟ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱟ ᱞᱟᱹᱜᱤᱛ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ \"[[Special:ChangePassword Change password]]\" ᱥᱟᱦᱴᱟ ᱠᱷᱚᱱᱮᱢ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾", + "accmailtext": "[[User talk:$1|$1]] ᱞᱟᱹᱜᱤᱫᱛᱮ ᱟᱡᱛᱮ ᱵᱮᱱᱟᱣᱮᱱ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱫᱚ $2 ᱴᱷᱮᱱ ᱠᱳᱞ ᱦᱩᱭᱮᱱᱟ᱾ ᱱᱚᱶᱟ ᱫᱚ [[Special:ChangePassword|ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ]] ᱥᱟᱦᱴᱟ ᱵᱚᱞᱚ ᱠᱟᱛᱮᱢ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ᱾", "newarticle": "(ᱱᱟᱣᱟᱱᱟᱜ)", "newarticletext": "ᱟᱢ ᱚᱠᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱡᱚᱱᱟᱲᱮᱢ ᱯᱟᱸᱡᱟᱸ ᱟᱹᱜᱩᱭᱫᱟ ᱚᱱᱚ ᱫᱚ ᱵᱟᱱᱩᱜ-ᱟ᱾\nᱚᱱᱟ ᱥᱟᱦᱴᱟ ᱛᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱛ ᱛᱮ, ᱞᱟᱛᱟᱨ ᱵᱟᱠᱥᱚ ᱵᱷᱤᱛᱨᱤᱨᱮ ᱚᱞ ᱮᱦᱚᱵ ᱢᱮ (ᱟᱨᱦᱚᱸ ᱡᱟᱹᱥᱛᱤ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱛᱴᱮ [$1 ᱜᱚᱸᱲᱚᱸ ᱥᱟᱦᱴᱟ] ᱯᱟᱸᱡᱚᱸᱭᱢᱮ)᱾\nᱟᱢ ᱵᱷᱩᱞᱛᱮ ᱱᱚᱸᱰᱮᱢ ᱦᱮᱡ ᱟᱠᱟᱱ ᱠᱷᱟᱡ, ᱟᱢᱟᱜ ᱵᱨᱟᱣᱡᱟᱨ ᱨᱮᱱᱟᱜ '''ᱛᱟᱭᱚᱢ''' ᱵᱟᱴᱚᱱ ᱞᱤᱱᱢᱮ᱾", "anontalkpagetext": "----\n\nᱱᱚᱶᱟ ᱫᱚ ᱜᱟᱞᱚᱪ ᱥᱟᱦᱴᱟ ᱠᱟᱱᱟ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱡᱟᱦᱟᱸᱭ ᱫᱚ ᱠᱷᱟᱛᱟ ᱵᱟᱭ ᱛᱮᱭᱟᱨ ᱟᱠᱟᱫᱟ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ, ᱟᱨᱵᱟᱝ ᱡᱟᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱫᱟ ᱱᱚᱶᱟ ᱾\nᱚᱱᱟᱛᱮ ᱟᱞᱮ ᱮᱞᱮᱞ IP ᱞᱮ ᱵᱮᱵᱷᱟᱨᱮᱜ-ᱟ ᱩᱱᱤ ᱪᱤᱱᱦᱟᱹᱣ ᱞᱟᱹᱜᱤᱫ ᱾\nᱚᱱᱠᱟᱱ IP ᱵᱩᱴᱟᱹ ᱫᱚ ᱦᱟᱹᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱛᱤᱢᱤᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱟᱨᱟᱭᱛᱮ ᱾\nᱡᱩᱫᱤ ᱟᱢ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱟᱱᱟᱢ ᱟᱨ ᱵᱷᱟᱹᱵᱤᱭᱮᱜ-ᱟᱢ ᱵᱟᱝ ᱡᱚᱲᱟᱣᱟᱱ ᱠᱟᱛᱷᱟ ᱟᱢᱮ ᱩᱫᱩᱜᱢᱮ ᱠᱟᱱᱟ, ᱮᱱᱠᱷᱟᱱ [[Special:CreateAccount|ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ]] ᱟᱨᱵᱟᱝ [[Special:UserLogin|ᱞᱚᱜᱤᱱ]] ᱢᱮ ᱫᱟᱨᱟᱭ ᱵᱷᱮᱣᱱᱟ ᱠᱚ ᱥᱟᱦᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱮᱴᱟᱜ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱥᱟᱶ ᱾", "noarticletext": "ᱱᱮᱛᱚᱜ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱪᱮᱫᱜᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\nᱮᱴᱟᱜ ᱥᱟᱦᱴᱟᱨᱮᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱧᱩᱛᱩᱢ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ]],\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ᱡᱚᱲᱟᱣᱟᱱ ᱞᱚᱜᱽ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣ ᱢᱮ].", "noarticletext-nopermission": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱱᱤᱛᱚᱜ ᱪᱮᱫᱜᱮ ᱚᱞ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\n\nᱟᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟᱨᱮᱱᱟᱜ ᱧᱤᱛᱩᱢᱮᱢ ᱥᱮᱸᱫᱽᱨᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ]] ᱮᱴᱟᱜ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮᱦᱚᱸ,\nᱟᱨᱵᱟᱝ [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs].", - "userpage-userdoesnotexist": "\"$1\" ńutuman jahãe beoharićaḱ ekaunṭ do baṅ resṭri hoeakana. Daya kate biḍạo katet́ ńelmẽ noa sakam do benoa/sompadonem menet́ kana se baṅ.", + "userpage-userdoesnotexist": "\"$1\" ᱧᱩᱛᱩᱢᱟᱱ ᱡᱟᱸᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱷᱟ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾\nᱫᱟᱭᱟᱠᱟᱛᱮ ᱵᱤᱰᱟᱹᱣ ᱠᱟᱛᱮᱛ ᱧᱮᱞᱢᱮ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱮᱱᱟᱣ/ᱥᱟᱯᱲᱟᱣ ᱢᱮᱱᱮᱫ ᱠᱟᱱᱟ ᱥᱮ ᱵᱟᱝ᱾", "userpage-userdoesnotexist-view": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ \"$1\" ᱮᱠᱟᱣᱱᱴ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱟᱠᱟᱱᱟ᱾", "blocked-notice-logextract": "ᱱᱩᱭ ᱵᱮᱵᱦᱟᱨᱤᱡ ᱫᱚ ᱱᱮᱛᱚᱜ ᱮ ᱥᱮᱥᱫᱜᱮᱭᱟ᱾\nᱨᱮᱯᱷᱟᱨᱮᱱᱥ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱱᱟᱣᱟᱱᱟᱜ ᱵᱚᱞᱚᱜ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱞᱟᱛᱟᱨᱨᱮ ᱮᱢ ᱦᱩᱭᱱᱟ:", "clearyourcache": "Note: After saving, you may have to bypass your browser's cache to see the changes.\n* Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)\n* Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)\n* Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5\n* Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.", @@ -571,17 +585,19 @@ "defaultmessagetext": "ᱯᱩᱭᱞᱩ ᱚᱞᱠᱟᱱ ᱠᱷᱚᱵᱚᱨ", "content-model-wikitext": "ᱣᱤᱠᱤ-ᱚᱞ", "content-model-text": "ᱥᱚᱢᱟᱱ ᱚᱞ", - "post-expand-template-inclusion-warning": "\"Sontoroḱme\" Noa format do lạṭu geya.\nThoṛa format do noare banuḱana.", - "post-expand-template-inclusion-category": "Sakamko oka borḍre noa tahẽna ona doe paromkeda", - "post-expand-template-argument-warning": "'''Sontoroḱmẽ:''' Noa sakamre komse kom mitṭen forma joṛao menaḱa ạḍi lạṭute pasnao akana.\nOnate noa ạrgumenṭkodo bạgi giḍi hoena.", + "content-model-javascript": "ᱡᱟᱵᱷᱟᱥᱠᱤᱯᱴ", + "content-json-empty-object": "ᱥᱟᱢᱟᱱ ᱵᱟᱹᱱᱩᱜᱼᱟ", + "post-expand-template-inclusion-warning": "ᱥᱚᱱᱛᱚᱨᱚᱜᱢᱮ ᱱᱚᱣᱟ ᱯᱷᱚᱨᱢᱮᱴ ᱫᱚ ᱞᱟᱹᱴᱩ ᱜᱮᱭᱟ᱾ \nᱛᱷᱚᱲᱟ ᱯᱷᱚᱨᱢᱮᱴ ᱫᱚ ᱱᱟᱣᱨᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾", + "post-expand-template-inclusion-category": "ᱥᱟᱦᱴᱟ ᱫᱚ ᱚᱠᱟ ᱪᱷᱟᱸᱪ ᱨᱮ ᱛᱟᱸᱦᱮᱱ ᱚᱱᱟ ᱫᱚ ᱯᱟᱨᱚᱢᱠᱮᱫᱟᱭ", + "post-expand-template-argument-warning": "'''ᱥᱚᱱᱛᱚᱨᱚᱜᱢᱮ:''' ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱠᱚᱢᱥᱮ ᱠᱚᱢ ᱢᱤᱫᱴᱮᱱ ᱯᱷᱚᱨᱢᱟ ᱡᱚᱲᱟᱣ ᱢᱮᱱᱟᱜ-ᱟ ᱟᱹᱰᱤ ᱞᱟᱹᱴᱩᱛᱮ ᱯᱟᱥᱱᱟᱣ ᱟᱠᱟᱱᱟ᱾\nᱚᱱᱟᱛᱮ ᱱᱚᱣᱟ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱠᱚᱫᱚ ᱜᱮᱫ ᱜᱤᱰᱤ ᱦᱩᱭᱱᱟ᱾", "post-expand-template-argument-category": "Pages containing omitted template arguments", "undo-failure": "ᱥᱟᱯᱲᱟᱣᱠᱚ ᱵᱟᱭ ᱟᱹᱪᱩᱨ ᱨᱩᱣᱟᱹᱲᱚᱜ-ᱟ ᱛᱟᱞᱟ-ᱢᱟᱞᱟ ᱥᱟᱯᱲᱟᱣ ᱵᱤᱨᱚᱫᱽ ᱤᱫᱤᱠᱟᱛᱮ |", "viewpagelogs": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱞᱚᱜᱽᱠᱚ ᱧᱮᱞᱢᱮ", "nohistory": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱱᱟᱜᱟᱢ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾", "currentrev": "ᱱᱮᱛᱟᱨ ᱧᱮᱞ", "currentrev-asof": "ᱱᱟᱣᱟ ᱧᱮᱞ ᱞᱮᱠᱟᱛᱮ $1", - "revisionasof": "Revision as of $1", - "revision-info": "Revision as of $1 by {{GENDER:$6|$2}}$7", + "revisionasof": "$1 ᱧᱮᱞᱟᱹᱨᱩ ᱞᱮᱠᱟᱛᱮ", + "revision-info": "{{GENDER:$6|$2}}$7 ᱫᱟᱨᱟᱭᱛᱮ $1 ᱨᱮᱱᱟᱜ ᱧᱮᱞᱟᱹᱨᱩ", "previousrevision": "ᱯᱟᱹᱦᱤᱞ ᱯᱟᱲᱦᱟᱣ ᱨᱩᱣᱟᱹᱲ", "nextrevision": "ᱱᱟᱣᱟᱛᱮ ᱧᱮᱞ ᱨᱩᱣᱟᱹᱲ →", "currentrevisionlink": "ᱱᱮᱛᱟᱨ ᱧᱮᱞ", @@ -663,7 +679,7 @@ "search-file-match": "(ᱢᱤᱫᱩᱜᱟᱜ ᱨᱮᱫ ᱩᱱᱩᱫᱩᱜ)", "search-suggest": "ᱪᱮᱫ ᱮᱢ ᱢᱮᱱ ᱚᱪᱚᱭᱮᱫᱟ: $1", "search-interwiki-caption": "ᱥᱟᱶᱛᱮᱱ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱷᱚᱱ ᱚᱨᱡᱚ", - "search-interwiki-default": "Results from $1:", + "search-interwiki-default": "$1 ᱠᱷᱚᱱ ᱚᱨᱡᱚ:", "search-interwiki-more": "(ᱵᱟᱹᱲᱛᱤ)", "search-interwiki-more-results": "ᱵᱟᱹᱲᱛᱤ ᱚᱨᱡᱚᱠᱚ", "search-relatedarticle": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱ", @@ -682,9 +698,15 @@ "skin-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ", "datedefault": "ᱠᱩᱥᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ", "prefs-user-pages": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ", + "prefs-rc": "ᱨᱚᱠᱟ ᱵᱚᱫᱚᱞᱠᱚ", + "prefs-watchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ", + "prefs-editwatchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ ᱥᱟᱯᱲᱟᱣ", + "prefs-editwatchlist-label": "ᱟᱢᱟᱜ ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤᱨᱮ ᱟᱫᱮᱨᱟᱜ ᱠᱚ ᱥᱟᱯᱲᱟᱣ", + "prefs-editwatchlist-edit": "ᱟᱢᱟᱜ ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤᱨᱮ ᱧᱮᱞ ᱟᱨ ᱥᱟᱛᱟᱢ ᱚᱪᱚᱜ", "prefs-resetpass": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ", "prefs-changeemail": "ᱤᱢᱮᱞ ᱴᱷᱤᱠᱟᱱᱟ ᱵᱚᱫᱚᱞ ᱥᱮ ᱜᱮᱫ ᱜᱤᱰᱤᱭᱢᱮ", "prefs-setemail": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱡᱚᱲᱟᱣᱢᱮ", + "prefs-rendering": "ᱧᱮᱞᱚᱪᱚ", "saveprefs": "ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ", "searchresultshead": "ᱥᱮᱸᱫᱽᱨᱟ", "timezonelegend": "ᱮᱞᱟᱠᱟ ᱚᱠᱛᱚᱺ", @@ -704,6 +726,7 @@ "timezoneregion-indian": "ᱥᱤᱧᱚᱛ ᱢᱟᱦᱟᱫᱚᱨᱭᱟ", "timezoneregion-pacific": "ᱯᱮᱥᱤᱯᱷᱤᱠ ᱢᱟᱦᱟᱫᱚᱨᱭᱟ", "prefs-searchoptions": "ᱥᱮᱸᱫᱽᱨᱟ", + "default": "ᱡᱟᱭᱞᱮᱠᱟ", "prefs-files": "ᱨᱮᱫᱠᱚ", "youremail": "Email:", "username": "{{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ}}:", @@ -712,12 +735,13 @@ "yournick": "ᱱᱟᱶᱟ ᱥᱩᱦᱤ:", "gender-male": "ᱵᱟᱵᱟ ᱦᱚᱲ ᱣᱤᱠᱤ ᱥᱟᱦᱴᱟ ᱠᱩᱭ ᱥᱟᱯᱲᱟᱣ ᱠᱮᱫᱟ", "gender-female": "ᱜᱚᱜᱚ ᱦᱚᱲ ᱣᱤᱠᱤ ᱥᱟᱦᱴᱟ ᱠᱩᱭ ᱥᱟᱯᱲᱟᱣ ᱠᱮᱫᱟ", - "email": "Email", - "prefs-help-email": "E-mail ṭhikana do bạṛtitege, menkhan uku namber nãwãte benao jạruṛa, am do amaḱ uku nomborem hiṛiń keda.", - "prefs-help-email-others": "Am são e-mail hotete jogajog dohoy lạgitte mitṭen joṛao se amaḱ katha roṛaḱ sakam bachao jońme.\nAmaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara", + "email": "ᱤᱢᱮᱞ", + "prefs-help-email": "E-mail ᱴᱷᱤᱠᱟᱱᱟ ᱫᱚ ᱵᱟᱹᱨᱛᱤ ᱛᱮᱜᱮ, ᱢᱮᱱᱠᱷᱟᱱ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱱᱟᱣᱟᱛᱮ ᱵᱮᱱᱟᱣ ᱡᱟᱹᱨᱩᱲᱟ, ᱟᱢ ᱫᱚ ᱟᱢᱟᱜ ᱩᱠᱩ ᱱᱚᱢᱵᱚᱨ ᱮᱢ ᱦᱤᱲᱤᱧ ᱠᱮᱫᱟ᱾", + "prefs-help-email-others": "ᱟᱢ ᱥᱟᱶ ᱤ-ᱢᱮᱞ ᱦᱚᱛᱮᱛᱮ ᱥᱟᱹᱜᱟᱹᱭ ᱫᱚᱦᱚᱭ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱢᱤᱫᱴᱮᱱ ᱡᱚᱲᱟᱣ ᱥᱮ ᱟᱢᱟᱜ ᱠᱟᱛᱷᱟ ᱨᱚᱲᱟᱜ ᱥᱟᱦᱴᱟ ᱵᱟᱪᱷᱟᱣ ᱡᱚᱝᱢᱮ᱾\nᱟᱢᱟᱜ ᱤ-ᱢᱮᱞ ᱴᱷᱤᱠᱟᱱᱟ ᱫᱚ ᱵᱟᱝ ᱪᱟᱵᱟᱠᱚᱜ ᱛᱤᱱᱨᱮ ᱩᱝᱠᱩ ᱫᱚ ᱠᱳ ᱵᱮᱵᱷᱟᱨᱚᱜ-ᱟ᱾", "prefs-signature": "ᱥᱩᱦᱤ", "prefs-editor": "ᱥᱟᱯᱲᱮᱛ", "prefs-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ", + "prefs-diffs": "ᱵᱷᱮᱯᱮᱫ", "userrights": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱠᱩ", "userrights-lookup-user": "ᱢᱤᱫᱴᱮᱱ ᱵᱮᱵᱦᱟᱨᱤ ᱴᱷᱤᱠᱤ ᱢᱮ", "userrights-user-editname": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱤᱛᱩᱢ ᱵᱚᱞᱚᱭ ᱢᱮ:", @@ -725,13 +749,20 @@ "userrights-editusergroup": "ᱥᱟᱯᱲᱟᱣ {{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤ}} ᱜᱟᱶᱛᱟᱠᱩ", "saveusergroups": "ᱨᱩᱠᱷᱤᱭᱟᱹ {{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤ}} ᱜᱟᱶᱛᱟᱠᱩ", "userrights-reason": "ᱚᱡᱮ:", + "userrights-expiry-current": "$1 ᱪᱟᱵᱟᱜᱼᱟ", + "userrights-expiry-none": "ᱵᱟᱭ ᱪᱟᱵᱟᱜᱼᱟ", + "userrights-expiry": "ᱪᱟᱵᱟᱜᱼᱟᱺ", + "userrights-expiry-existing": "ᱪᱟᱵᱟᱜ ᱠᱟᱱ ᱚᱠᱛᱚ :$3,$2", + "userrights-expiry-othertime": "ᱮᱴᱟᱜ ᱚᱠᱛᱚᱺ", + "userrights-expiry-options": "᱑ ᱢᱟᱦᱟᱸ:᱑ ᱢᱟᱦᱟᱸ,᱑ ᱦᱟᱯᱛᱟ:᱑ ᱦᱟᱯᱛᱟ, ᱑ ᱪᱟᱸᱫᱚ:᱑ ᱪᱟᱸᱫᱚ, ᱓ ᱪᱟᱸᱫᱚ:᱓ ᱪᱟᱸᱫᱚ, ᱖ ᱪᱟᱸᱫᱚ:᱖ᱪᱟᱸᱫᱚ, ᱑ ᱥᱮᱨᱢᱟ:᱑ ᱥᱮᱨᱢᱟ", "group-bot": "ᱵᱚᱴᱠᱚ", "group-sysop": "ᱟᱰᱢᱤᱱᱤᱥᱴᱨᱮᱴᱚᱨ", + "group-user-member": "{{GENDER:$1|ᱵᱚᱵᱷᱟᱨᱤᱭᱟᱹ}}", "grouppage-bot": "{{ns:project}}:ᱵᱚᱴᱠᱚ", "grouppage-sysop": "{{ns:project}}:ᱯᱟᱨᱜᱟᱱᱟᱠᱚ", "right-read": "ᱥᱟᱦᱴᱟᱠᱩ ᱯᱟᱲᱦᱟᱣᱢᱮ", - "right-edit": "ᱥᱟᱦᱴᱟᱠᱩ ᱥᱟᱯᱲᱟᱣ", - "right-createpage": "Sakamko benoamẽ (Okako do galmarao sakamko baṅkan)", + "right-edit": "ᱥᱟᱦᱴᱟᱠᱩ ᱥᱟᱯᱲᱟᱣ ᱢᱮ", + "right-createpage": "ᱥᱟᱦᱴᱟ ᱵᱮᱱᱟᱣᱢᱮ (ᱚᱠᱟᱠᱳ ᱫᱚ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱥᱟᱦᱴᱟᱠᱳ ᱱᱟᱝᱠᱷᱟᱱ)", "right-createtalk": "ᱜᱟᱞᱢᱟᱨᱟᱣ ᱥᱟᱦᱴᱟᱠᱩ ᱵᱮᱱᱟᱣᱢᱮ", "right-createaccount": "ᱱᱟᱶᱟ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨ", "right-move": "ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱦᱟᱭᱢᱮ", @@ -819,9 +850,9 @@ "hist": "ᱱᱟᱜᱟᱢ", "hide": "ᱫᱟᱱᱟᱝ", "show": "ᱧᱮᱞ", - "minoreditletter": "m", - "newpageletter": "N", - "boteditletter": "b", + "minoreditletter": "ᱱᱟᱥᱮ", + "newpageletter": "ᱱᱟᱶᱟ", + "boteditletter": "ᱵᱚᱴ", "rc-change-size-new": "$1 {{PLURAL:$1|ᱵᱟᱭᱤᱴ|ᱵᱟᱭᱤᱴᱥ}} ᱵᱚᱫᱚᱞ ᱛᱟᱭᱚᱢ", "rc-enhanced-expand": "ᱡᱚᱛᱚ ᱩᱰᱩᱜᱽ ᱢᱮ", "rc-enhanced-hide": "ᱡᱚᱛᱚᱭᱟᱜ ᱩᱠᱩᱭᱢᱮ", @@ -876,7 +907,7 @@ "filehist-current": "ᱱᱤᱛᱚᱜ", "filehist-datetime": "ᱢᱟᱹᱦᱤᱛ/ᱚᱠᱛᱚ", "filehist-thumb": "ᱴᱤᱯ", - "filehist-thumbtext": "Thumbnail for version as of $1", + "filehist-thumbtext": "$1 ᱞᱮᱠᱟᱛᱮ ᱛᱷᱚᱢᱵᱽᱱᱮᱞ ᱵᱷᱚᱨᱥᱚᱱ", "filehist-nothumb": "ᱵᱟᱹᱱᱩᱜ-ᱟ ᱴᱤᱯ-ᱨᱟᱢᱟ", "filehist-user": "ᱵᱮᱵᱷᱟᱨᱤᱡ", "filehist-dimensions": "ᱡᱚᱠᱷᱟ", @@ -914,7 +945,7 @@ "pager-newer-n": "{{PLURAL:$1|1 ᱱᱟᱣᱟᱱᱟᱜ | ᱱᱟᱣᱟᱱᱟᱜ $1}}", "pager-older-n": "{{PLURAL:$1|ᱢᱟᱨᱮᱭᱟᱜ 1|ᱢᱟᱨᱮᱭᱟᱜ $1}}", "booksources": "ᱯᱚᱛᱚᱵ ᱯᱷᱮᱰᱟᱛ ᱠᱚ", - "booksources-search-legend": "ᱯᱚᱛᱚᱵ ᱨᱮᱭᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱦᱚᱨ ᱞᱟᱹᱜᱤᱛ ᱥᱮᱸᱫᱽᱨᱟ", + "booksources-search-legend": "ᱯᱚᱛᱚᱵ ᱨᱮᱭᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱥᱮᱸᱫᱽᱨᱟ", "booksources-search": "ᱥᱮᱸᱫᱽᱨᱟ", "specialloguserlabel": "ᱠᱟᱹᱢᱤᱭᱟᱹ:", "speciallogtitlelabel": "ᱡᱚᱥ (ᱧᱩᱛᱩᱢ ᱟᱨᱵᱟᱝ {{ns:user}}:ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱞᱟᱹᱜᱩᱫ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ):", @@ -937,8 +968,8 @@ "listgrouprights-members": "(ᱥᱚᱦᱮᱫᱠᱩᱣᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ)", "listgrouprights-addgroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱥᱮᱞᱮᱫ ᱠᱩ ᱢᱮ", "listgrouprights-removegroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱚᱪᱚᱜ ᱠᱩ ᱢᱮ", - "emailuser": "ᱱᱩᱭ ᱵᱮᱵᱦᱟᱨᱤᱡ e-mail ᱮᱢᱟᱭᱢᱮ", - "noemailtitle": "E-mail ᱴᱷᱤᱠᱟᱹᱱᱟ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ", + "emailuser": "ᱱᱩᱭ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ ᱤᱢᱮᱞ ᱮᱢᱟᱭᱢᱮ", + "noemailtitle": "ᱤᱢᱮᱞ ᱴᱷᱤᱠᱟᱹᱱᱟ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ", "emailusername": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱧᱩᱛᱩᱢᱺ", "emailusernamesubmit": "ᱮᱢ", "emailfrom": "ᱠᱩᱞᱤᱪ:", @@ -950,7 +981,7 @@ "mywatchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ", "watchlistfor2": "$1 ($2) ᱞᱟᱹᱜᱤᱛ", "watch": "ᱧᱮᱞ", - "unwatch": "ᱵᱟᱱᱝ ᱧᱮᱞᱠᱟᱱ", + "unwatch": "ᱵᱟᱝ ᱧᱮᱞᱠᱟᱱ", "watchlist-details": "ᱵᱟᱝ ᱯᱩᱨᱟᱹᱣ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ{{PLURAL:$1 ᱥᱟᱦᱴᱟ $1 ᱥᱟᱦᱴᱟ}} ᱢᱮᱱᱟᱜ-ᱟ (ᱨᱚᱲ ᱥᱟᱦᱴᱟ ᱠᱚᱦᱚᱸ)", "wlheader-showupdated": "ᱟᱢᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱞᱚᱝᱨᱮ ᱡᱟᱸᱦᱟᱸ ᱥᱟᱦᱴᱟ ᱠᱚᱢ ᱵᱚᱫᱚᱞ ᱞᱮᱫᱟ ᱚᱱᱟᱠᱩ ᱧᱮᱞᱚᱜ-ᱟ bold.", "wlnote": "ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ {{PLURAL:$1|ᱫᱚ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱫᱚᱞ ᱠᱟᱱᱟ|ᱠᱚ ᱫᱚ ᱢᱩᱪᱟᱹᱫ $1 ᱵᱚᱫᱚᱞᱠᱟᱱᱟ}} ᱢᱩᱪᱟᱹᱫ ᱨᱮ {{PLURAL:$2|ᱴᱟᱲᱟᱝ|$2 ᱴᱟᱲᱟᱝ}}, $3, $4 ᱞᱮᱠᱟᱛᱮ ᱾", @@ -1015,7 +1046,7 @@ "istemplate": "ᱥᱮᱞᱮᱫ", "isimage": "ᱨᱮᱫ ᱡᱚᱱᱚᱲ", "whatlinkshere-prev": "{{PLURAL:$1|ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ |ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ$1}}", - "whatlinkshere-next": "{{PLURAL:$1 |ᱛᱟᱭᱚᱢ |ᱛᱟᱭᱚᱢ $1}}", + "whatlinkshere-next": "{{PLURAL:$1|ᱛᱟᱭᱚᱢ|ᱛᱟᱭᱚᱢ $1}}", "whatlinkshere-links": "← ᱡᱚᱱᱚᱲᱠᱚ", "whatlinkshere-hideredirs": "$1 ᱟᱨᱦᱚᱸ ᱩᱱᱩᱫᱩᱜ", "whatlinkshere-hidetrans": "ᱥᱮᱞᱮᱫ $1", @@ -1029,17 +1060,17 @@ "ipblocklist": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱮᱥᱮᱫᱜᱮᱭᱟᱭ", "ipblocklist-submit": "ᱥᱮᱸᱫᱽᱨᱟ", "infiniteblock": "ᱚᱦᱤᱥᱟᱹᱵᱽ", - "emailblock": "E-mail ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ", + "emailblock": "ᱤᱢᱮᱞ ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ", "blocklink": "ᱮᱥᱮᱫᱽ", "unblocklink": "ᱵᱟᱝ ᱮᱥᱮᱫ", "change-blocklink": "block ᱵᱚᱫᱚᱞ", "contribslink": "ᱮᱱᱮᱢ", - "emaillink": "E-mail ᱠᱩᱞᱢᱮ", + "emaillink": "ᱤᱢᱮᱞ ᱠᱩᱞᱢᱮ", "blocklogpage": "ᱠᱩᱞᱩᱯ ᱮᱥᱮᱫ", "blocklogentry": "ᱮᱥᱮᱫ [[$1]] ᱥᱟᱶᱛᱮ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ ᱚᱠᱟ ᱫᱚ $2 $3", "reblock-logentry": "ᱵᱚᱫᱚᱞᱮᱱᱟ ᱵᱚᱸᱫ ᱥᱟᱡᱟᱣᱠᱚ [[$1]] ᱞᱟᱹᱜᱤᱫ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ $2 $3 ᱥᱟᱶ", "block-log-flags-nocreate": "ᱮᱠᱟᱣᱱᱴ ᱵᱮᱱᱟᱣ ᱵᱚᱱᱫᱷ ᱜᱮᱭᱟ", - "block-log-flags-noemail": "E-mail ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ", + "block-log-flags-noemail": "ᱤᱢᱮᱞ ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ", "block-log-flags-hiddenname": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ ᱩᱠᱩ ᱜᱮᱭᱟ", "proxyblocker": "ᱯᱨᱚᱠᱥᱤ ᱮᱥᱮᱫᱤᱡ", "movepagebtn": "ᱥᱟᱦᱴᱟ ᱩᱪᱟᱹᱲᱢᱮ", @@ -1050,13 +1081,13 @@ "export-addcat": "ᱥᱮᱞᱮᱫ", "export-addns": "ᱥᱮᱞᱮᱫ", "allmessagesname": "ᱧᱩᱛᱩᱢ", - "allmessagesdefault": "Bań bhul mesag ol", + "allmessagesdefault": "ᱯᱩᱭᱞᱩ ᱚᱞᱠᱟᱱ ᱠᱷᱚᱵᱚᱨ", "allmessages-filter-all": "ᱡᱚᱛᱚ", "allmessages-language": "ᱯᱟᱹᱨᱥᱤ:", "allmessages-filter-submit": "ᱪᱟᱞᱟᱜ ᱢᱮ", "allmessages-filter-translate": "ᱛᱚᱨᱡᱚᱢᱟ", "thumbnail-more": "ᱞᱟᱹᱴᱩᱭ ᱢᱮ", - "thumbnail_error": "Benawakan unuduḱ kạṭuṕ do baṅ ṭhika: $1", + "thumbnail_error": "ᱵᱮᱱᱟᱣ ᱟᱠᱟᱱᱟ ᱩᱱᱩᱫᱩᱜ ᱠᱟᱹᱴᱩᱯ ᱫᱚ ᱵᱟᱝ ᱴᱷᱤᱠᱟ: $1", "import-upload-filename": "ᱨᱮᱫᱧᱩᱛᱩᱢᱺ", "importlogpage": "ᱞᱚᱜᱽ ᱟᱹᱜᱩ", "tooltip-pt-userpage": "{{GENDER:|ᱟᱢᱟᱜ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ}} ᱥᱟᱦᱴᱟ", @@ -1070,7 +1101,7 @@ "tooltip-ca-talk": "ᱥᱟᱛᱚᱢ ᱥᱟᱦᱴᱟ ᱞᱟᱹᱜᱤᱛ ᱜᱟᱞᱢᱟᱨᱟᱣ", "tooltip-ca-edit": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣᱢᱮ", "tooltip-ca-addsection": "ᱱᱟᱣᱟ ᱦᱟᱹᱴᱤᱧ ᱮᱦᱚᱵᱽ ᱢᱮ", - "tooltip-ca-viewsource": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱠᱩᱞᱩᱯ ᱜᱮᱭᱟ᱾\nᱱᱤᱭᱟᱹ ᱨᱮᱱᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱦᱚᱨ ᱫᱟᱲᱮᱭᱟᱜ ᱟᱢ", + "tooltip-ca-viewsource": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱨᱟᱠᱷᱟ ᱜᱮᱭᱟ᱾\nᱱᱤᱭᱟᱹ ᱨᱮᱱᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞ ᱫᱟᱲᱮᱭᱟᱜ ᱟᱢ", "tooltip-ca-history": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱮᱱᱟᱝ ᱱᱟᱝ ᱧᱮᱞ ᱨᱩᱟᱹᱲ", "tooltip-ca-protect": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮ", "tooltip-ca-delete": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱜᱮᱫᱽ ᱢᱮ", @@ -1084,7 +1115,7 @@ "tooltip-n-mainpage": "ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱪᱟᱞᱟᱜᱢᱮ", "tooltip-n-mainpage-description": "ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱪᱟᱞᱟᱜᱢᱮ", "tooltip-n-portal": "ᱱᱤᱭᱟᱹ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱷᱟᱹᱛᱤᱨ, ᱪᱮᱛᱮᱢ ᱪᱮᱠᱟ ᱫᱟᱨᱮᱭᱟᱜ-ᱟ,ᱚᱠᱟᱨᱮ ᱥᱮᱸᱫᱽᱨᱟ ᱧᱟᱢᱚᱜ-ᱟ", - "tooltip-n-currentevents": "ᱱᱤᱛᱚᱜ events ᱨᱮ ᱡᱚᱥ ᱦᱩᱫᱤᱥ ᱧᱟᱢ ᱢᱮ", + "tooltip-n-currentevents": "ᱱᱤᱛᱚᱜ ᱤᱵᱷᱮᱸᱴ ᱨᱮ ᱡᱚᱥ ᱦᱩᱫᱤᱥ ᱧᱟᱢ ᱢᱮ", "tooltip-n-recentchanges": "ᱩᱤᱠᱤ ᱨᱮ ᱱᱟᱣᱭᱟ ᱵᱚᱫᱚᱞᱠᱳ ᱨᱮᱭᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ", "tooltip-n-randompage": "ᱟᱨᱦᱚᱸ ᱥᱟᱦᱴᱟᱠᱳ ᱩᱫᱩᱜᱽ ᱢᱮ", "tooltip-n-help": "ᱥᱮᱸᱫᱽᱨᱟ ᱧᱟᱢ ᱨᱮᱭᱟᱜ ᱡᱟᱜᱟ", @@ -1163,7 +1194,7 @@ "show-big-image": "ᱟᱥᱚᱞ ᱨᱮᱫ", "show-big-image-preview": "ᱧᱮᱞᱡᱚᱝ ᱨᱮᱱᱟᱜ ᱟᱠᱟᱨ:$1", "show-big-image-other": "ᱮᱢᱟᱱ ᱛᱮᱭᱟᱜ {{PLURAL:$2|resolution|resolutions}}: $1", - "show-big-image-size": "$1 X $2 Pixels", + "show-big-image-size": "$1 × $2 Pixels", "ilsubmit": "ᱥᱮᱸᱫᱽᱨᱟ", "bydate": "ᱢᱟᱹᱦᱤᱛ ᱛᱮ", "monday-at": "ᱚᱛᱮᱢᱟᱦᱟᱸ $1 ᱨᱮ", @@ -1172,7 +1203,7 @@ "friday-at": "ᱡᱟᱹᱨᱩᱢ ᱢᱟᱦᱟᱸ $1 ᱨᱮ", "saturday-at": "ᱧᱩᱦᱩᱢ ᱢᱟᱦᱟᱸ $1 ᱨᱮ", "yesterday-at": "ᱦᱚᱞᱟ $1 ᱨᱮ", - "bad_image_list": "Format do latar re leka", + "bad_image_list": "ᱯᱷᱚᱨᱢᱮᱴ ᱫᱚ ᱞᱟᱛᱟᱨ ᱨᱮ ᱞᱮᱠᱟ:\n\nᱠᱷᱟᱹᱞᱤ ᱛᱟᱹᱞᱠᱟᱹ ᱟᱭᱴᱮᱢᱠᱳ (ᱞᱟᱭᱤᱱ ᱮᱛᱦᱚᱵᱚ ᱟᱜ *) ᱦᱟᱛᱟᱣᱚᱜ-ᱟ᱾\nᱯᱩᱭᱞᱩ ᱡᱚᱱᱚᱲ ᱞᱟᱭᱤᱱ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱵᱟᱹᱲᱤᱡ ᱨᱮᱫ ᱨᱮ᱾\nᱮᱴᱟᱜ subsequent ᱡᱚᱱᱚᱲᱠᱩ ᱚᱱᱟ ᱞᱟᱭᱤᱱ ᱨᱮᱜᱮ ᱦᱟᱛᱟᱣᱚᱜ-ᱟ ᱵᱮᱛᱤᱠᱨᱚᱢ ᱠᱷᱟᱹᱛᱤᱨ, i.e. ᱥᱟᱦᱴᱟᱠᱳ ᱡᱟᱸᱦᱟᱸᱨᱮ ᱨᱮᱫ ᱨᱮᱱᱟᱜ ᱞᱟᱭᱤᱱ ᱠᱩ᱾", "metadata": "ᱢᱮᱴᱟ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ", "metadata-help": "ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱫᱚ ᱵᱟᱹᱲᱛᱤ ᱠᱟᱛᱷᱟᱠᱚ ᱢᱮᱱᱟᱜ-ᱟ, ᱯᱟᱥᱮᱡ ᱱᱚᱣᱟ ᱫᱚ ᱰᱤᱡᱤᱴᱟᱞ ᱠᱮᱢᱨᱟ ᱥᱮ ᱮᱥᱠᱮᱱᱟᱨ ᱵᱮᱵᱦᱟᱨ ᱠᱟᱛᱮ ᱰᱤᱡᱤᱴᱟᱞ ᱟᱠᱟᱫᱟᱠᱚ᱾ ᱡᱩᱫᱤ ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱭᱟᱜ ᱵᱩᱱᱤᱭᱟᱹᱫ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱥᱩᱫᱷᱨᱟᱣ ᱞᱮᱱᱠᱷᱟᱱ, ᱯᱟᱥᱮᱡ ᱥᱟᱱᱟᱢᱠᱚ ᱛᱷᱚᱲᱟ ᱵᱟᱝᱠᱩ ᱥᱚᱫᱚᱨᱚᱜ-ᱟ ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱫᱚ᱾", "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude", @@ -1212,7 +1243,7 @@ "watchlisttools-edit": "ᱧᱮᱞᱢᱮ ᱟᱨ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣᱢᱮ", "watchlisttools-raw": "ᱵᱟᱝ ᱯᱩᱨᱟᱣ ᱟᱠᱟᱱ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣᱢᱮ", "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ᱜᱟᱞᱢᱟᱨᱟᱣ]])", - "duplicate-defaultsort": "'''Sontoroḱmẽ:''' ḍifolṭ sajao reaḱ cạbi: $2 lahare ḍifolṭ sajao reaḱ sakam: ''$1'' e bae luturaḱ kana.", + "duplicate-defaultsort": "ᱥᱚᱱᱛᱚᱨᱚᱜᱢᱮ: ᱡᱟᱭᱞᱮᱠᱟ ᱥᱟᱡᱟᱣ ᱨᱮᱭᱟᱜ ᱪᱟᱹᱵᱤ: $2 ᱞᱟᱦᱟᱨᱮ ᱡᱟᱭᱞᱮᱠᱟ ᱥᱟᱡᱟᱣ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ: ''$1'' ᱮ ᱵᱟᱭ ᱞᱩᱛᱩᱨᱟᱜ ᱠᱟᱱᱟ᱾", "redirect": "ᱨᱮᱫ, ᱵᱮᱵᱷᱟᱨᱩᱭᱟᱹ, ᱥᱟᱦᱴᱟ, ᱧᱮᱞ-ᱟᱹᱨᱩ, ᱵᱟᱝᱠᱷᱟᱱ ᱞᱚᱜᱽ ID ᱫᱟᱨᱟᱭᱛᱮ ᱢᱚᱦᱰᱟ", "redirect-summary": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱢᱚᱦᱰᱟ ᱟ ᱢᱤᱫ ᱨᱮᱫ (ᱮᱢᱟᱠᱟᱱ ᱨᱮᱫᱧᱩᱛᱩᱢ) ᱴᱷᱮᱱ, ᱢᱤᱫ ᱥᱟᱦᱴᱟ (ᱮᱢᱮᱱ ᱟᱹᱨᱩᱣᱟᱜ ID ᱟᱨᱵᱟᱝ ᱥᱟᱦᱴᱟ ID), ᱢᱤᱫ ᱵᱮᱵᱷᱟᱨᱩᱭᱟᱹ ᱥᱟᱦᱴᱟ (ᱮᱢᱮᱱ ᱮᱞᱩᱠ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ID ), ᱟᱨᱵᱟᱝ ᱢᱤᱫ ᱞᱚᱜᱽ ᱵᱚᱞᱚ (ᱮᱢᱮᱱ ᱞᱚᱜᱽ ID) ᱾ ᱵᱮᱵᱷᱟᱨᱟᱠᱟᱱ: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], ᱟᱨᱵᱟᱝ [[{{#Special:Redirect}}/logid/186]]", "redirect-submit": "ᱥᱮᱱᱚᱜ", @@ -1226,7 +1257,7 @@ "fileduplicatesearch-submit": "ᱥᱮᱸᱫᱽᱨᱟ", "specialpages": "ᱵᱤᱥᱮᱥ ᱥᱟᱦᱴᱟᱠᱚ", "external_image_whitelist": "#ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱪᱮᱛ ᱞᱮᱠᱟ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱝᱠᱟᱜᱮ ᱫᱚᱦᱚᱭᱢᱮ\n#ᱡᱚᱛᱚ ᱚᱠᱛᱚ ᱨᱮ ᱡᱟᱹᱦᱤᱨᱮᱱ ᱠᱩᱴᱨᱟᱹ ᱞᱟᱛᱟᱨ ᱨᱮ (ᱠᱷᱟᱹᱞᱤ ᱦᱟᱹᱴᱤᱧ //ᱛᱟᱞᱟᱨᱮ) ᱵᱟᱹᱭᱥᱟᱹᱣᱢᱮ\n#ᱱᱚᱣᱟ ᱠᱚ ᱫᱚ ᱵᱟᱨᱦᱮ ᱨᱮᱭᱟᱜ (hotlinked) ᱪᱤᱛᱟᱹᱨ ᱨᱮᱭᱟᱜ URL ᱥᱟᱶᱛᱮ ᱢᱤᱞᱟᱹᱣ ᱦᱩᱭᱩᱜ-ᱟ\n#ᱚᱠᱟᱠᱩ ᱢᱤᱞᱟᱹᱜ-ᱟ, ᱚᱱᱟᱠᱩ ᱫᱚ ᱪᱤᱛᱟᱹᱨ ᱞᱮᱠᱟᱛᱮ ᱩᱫᱩᱜᱚᱜ-ᱟ, ᱵᱟᱝᱠᱷᱟᱱ ᱫᱚ ᱠᱷᱟᱹᱞᱤ ᱪᱤᱛᱟᱨ ᱡᱚᱱᱚᱲ ᱩᱫᱩᱜᱚᱜ-ᱟ\n#ᱱᱚᱣᱟ ᱞᱟᱭᱤᱱ ᱨᱮᱭᱟᱜ ᱮᱛᱦᱚᱵᱨᱮ # ᱢᱮᱱᱟᱜ-ᱟ ᱚᱱᱟ ᱞᱟᱭᱤᱱᱠᱚ ᱢᱮᱱᱠᱚ ᱦᱤᱥᱟᱹᱵᱛᱮ ᱵᱮᱵᱦᱟᱨ ᱦᱩᱭᱩᱜ-ᱟ\n#ᱱᱚᱣᱟ ᱫᱚ ᱨᱤᱢᱡᱷᱟᱹᱣᱜᱮ\n#ᱱᱚᱣᱟ ᱫᱟᱜᱽ ᱪᱮᱛᱟᱱᱨᱮ regex ᱠᱩᱴᱨᱟᱹ ᱵᱟᱹᱭᱥᱟᱹᱣᱢᱮ᱾ ᱱᱚᱣᱟ ᱞᱟᱭᱤᱱ ᱪᱮᱫᱞᱮᱠᱟ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱝᱠᱟᱜᱮ ᱫᱚᱦᱚᱭᱢᱮ", - "tag-filter": "[[Special:Tags|Tag]] ᱪᱷᱟᱹᱠᱱᱤ:", + "tag-filter": "[[Special:Tags|ᱜᱚᱛᱟᱣ]] ᱪᱷᱟᱹᱱᱤ:", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ᱥᱟᱛᱚᱢ|ᱥᱟᱛᱚᱢᱠᱩ}}]]: $2)", "tags-active-yes": "ᱦᱮᱸ", "tags-active-no": "ᱵᱟᱝ", diff --git a/languages/i18n/sco.json b/languages/i18n/sco.json index aabc640dc8..d58c150eb7 100644 --- a/languages/i18n/sco.json +++ b/languages/i18n/sco.json @@ -26,7 +26,8 @@ "C.R.", "Anomie", "Pierpao", - "Fitoschido" + "Fitoschido", + "Vlad5250" ] }, "tog-underline": "Unnerline airtins:", @@ -1161,8 +1162,10 @@ "right-editcontentmodel": "Eedit the content model o ae page", "right-editinterface": "Eedit the uiser interface", "right-editusercss": "Eedit ither uisers' CSS files", + "right-edituserjson": "Eedit ither uisers' JSON files", "right-edituserjs": "Eedit ither uisers' JavaScript files", "right-editmyusercss": "Eidit yer ain uiser CSS files", + "right-editmyuserjson": "Eedit yer ain uiser JSON files", "right-editmyuserjs": "Eedit yer ain uiser JavaScript files", "right-viewmywatchlist": "See yer ain watchleet", "right-editmywatchlist": "Eedit yer ain watchleet. Mynd that some actions will still eik pages even wioot this richt.", diff --git a/languages/i18n/sd.json b/languages/i18n/sd.json index 07cf146ffb..22d343e240 100644 --- a/languages/i18n/sd.json +++ b/languages/i18n/sd.json @@ -230,6 +230,7 @@ "privacy": "ذاتيات پاليسي", "privacypage": "Project:ذاتيات پاليسي", "badaccess": "اجازتي چُڪَ", + "badaccess-groups": "هن عمل کي محدود ڪيو ويو آهي $1 {{PLURAL:$2|جو اختيار رکندڙ|جا اختيار رکندڙن}} لاءِ.", "versionrequired": "ذريعات‌وڪي جو ورزن $1 درڪار", "versionrequiredtext": "هيءُ صفحو استعمال ڪرڻ لاءِ ذريعات‌وڪي جو ورزن $1 درڪار آهي. وڌيڪ ڄاڻڻ لاءِ [[Special:Version|ورزن بابت صفحو]] ڏسو.", "ok": "ٺيڪ", @@ -320,6 +321,7 @@ "mypreferencesprotected": "توھان کي پنھنجون ترجيحون سنوارڻ جي اجات حاصل ڪانھي.", "ns-specialprotected": "خاص صفحا سنواري نٿا سگھجن.", "titleprotected": "[[User:$1|$1]] اهڙي عنوان سان صفحو سرجڻ تي روڪ لڳائي ڇڏي آهي. سبب $2 ڄاڻايو ويو آهي.", + "invalidtitle": "غلط عنوان", "exception-nologin": "داخل ٿيل نہ آهيو", "virus-unknownscanner": "اڻڄاتل نِس وائرس:", "cannotlogoutnow-title": "ھاڻي خارج نٿو ٿي سگھجي", @@ -435,6 +437,9 @@ "changepassword-throttled": "توهان تازو ئي داخل ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.", "botpasswords": "بوٽ جو ڳجھولفظ", "botpasswords-disabled": "بوٽ ڳجھالفظ ناقابلِڪار ڪيل آھن.", + "botpasswords-existing": "باٽ جا هاڻوڪا پاسورڊَ", + "botpasswords-createnew": "باٽ جو نئون پاسورڊ ٺاهيو", + "botpasswords-editexisting": "باٽ جي هاڻوڪي پاسورڊ کي سنواريو", "botpasswords-label-appid": "باٽ جو نالو:", "botpasswords-label-create": "سرجيو", "botpasswords-label-update": "تجديد", @@ -443,6 +448,8 @@ "botpasswords-label-resetpassword": "ڳجھولفظ ٻيھر مقرر ڪريو", "botpasswords-label-grants-column": "منظور", "botpasswords-bad-appid": "بوٽ نانءُ \"$1\" قابلِڪار ناھي.", + "botpasswords-created-title": "باٽ پاسورڊ ٺاهيو ويو آهي", + "botpasswords-deleted-title": "باٽ پاسورڊ ڊاٿو ويو", "resetpass_forbidden": "ڳجھالفظ بدلائي نٿا سگھجن", "resetpass_forbidden-reason": "ڳجھالفظ بدلائي نٿا سگھجن:$1", "resetpass-no-info": "هيءُ صفحو پڙهڻ لاءِ داخل ٿيڻ ضروري آهي.", @@ -504,6 +511,10 @@ "savechanges": "تبديليون سانڍيو", "publishpage": "صفحو ڇاپيو", "publishchanges": "تبديليون ڇاپيو", + "savearticle-start": "صفحو سانڍيو", + "savechanges-start": "تبديليون سانڍيو", + "publishpage-start": "صفحو ڇاپيو", + "publishchanges-start": "تبديليون ڇاپيو", "preview": "پيش نگاھ", "showpreview": "پيش نگاھ", "showdiff": "تبديليون ڏيکاريو", @@ -877,11 +888,14 @@ "right-override-export-depth": "5ئين اونهائيءَ تائين ڳنڍيل صفحن سميت صفحا برآمديو", "right-sendemail": "ٻين واپرائيندڙن ڏانھن برقٽپال موڪليو", "right-managechangetags": "[[Special:Tags|ٽيگس]] سرجيو ۽ ڊاهيو.", + "grant-group-file-interaction": "ميڊيا سان لھ وچڙ ۾ اچو", "grant-group-email": "برقٽپال اماڻيو", + "grant-group-other": "گاڏڙ ساڏڙ سرگرمي", "grant-blockusers": "واپرائيندڙن کي بندشيو ۽ اڻبندشيو", "grant-createaccount": "کاتا کوليو", "grant-createeditmovepage": "صفحا سرجيو، سنواريو، ۽ چوريو", "grant-editmywatchlist": "پنھنجي نظر ۾ فھرست سنواريو", + "grant-editpage": "هاڻوڪن صفحن کي سنواريو", "grant-editprotected": "تحفظيل صفحا سنواريو", "grant-rollback": "صفحن ۾ ڪيل تبديليون واپس ورايو", "grant-sendemail": "ٻين واپرائيندڙن ڏانھن برقٽپال موڪليو", @@ -927,6 +941,7 @@ "action-viewmywatchlist": "پنهنجي نظر ۾ فھرست ڏسو", "action-viewmyprivateinfo": "پنهنجي ذاتي معلومات ڏسو", "action-editmyprivateinfo": "پنهنجي ذاتي معلومات سنواريو", + "action-purge": "هن صفحي جي صفائي ڪيو", "nchanges": "$1 {{PLURAL:$1|تبديلي|تبديليون}}", "enhancedrc-history": "سوانح", "recentchanges": "تازيون تبديليون", @@ -946,6 +961,8 @@ "rcfilters-other-review-tools": "نظرثانيءَ جا ٻيا اوزار", "rcfilters-group-results-by-page": "صفحي جي لحاظ سان گروھي نتيجا", "rcfilters-activefilters": "سرگرم ڇاڻيون", + "rcfilters-activefilters-hide": "لڪايو", + "rcfilters-activefilters-show": "ڏيکاريو", "rcfilters-advancedfilters": "متقدم ڇاڻيون", "rcfilters-limit-title": "ڏيکارڻ لاءِ نتيجا", "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|تبديلي|$1 تبديليون}}، $2", @@ -958,11 +975,14 @@ "rcfilters-quickfilters-placeholder-title": "اڃان ڪا به ڇاڻي سانڍيل ناهي", "rcfilters-savedqueries-defaultlabel": "سانڍيل ڇاڻيون", "rcfilters-savedqueries-rename": "ٻيھر نالو ڏيو", + "rcfilters-savedqueries-setdefault": "ڊيفالٽ جي طور تي ڏيکاريو", + "rcfilters-savedqueries-remove": "ڊاھيو", "rcfilters-savedqueries-new-name-label": "نالو", "rcfilters-savedqueries-apply-label": "ڇاڻي سرجيو", "rcfilters-savedqueries-cancel-label": "رد", "rcfilters-savedqueries-add-new-title": "ھاڻوڪيون ڇاڻين جون ترتيبون سانڍيو", "rcfilters-restore-default-filters": "ڏنل ڇاڻيون ريسٽور ڪريو", + "rcfilters-clear-all-filters": "سڀئي لڳل ڇاڻيو هٽايو", "rcfilters-show-new-changes": "نيون ترين تبديليون ڏيکاريو", "rcfilters-search-placeholder": "تبديليون ڇاڻيو (مينيو استعمال ڪريو يا ڇاڻيءَ جي ڳولا ڪريو)", "rcfilters-invalid-filter": "ناقابلِڪار ڇاڻي", @@ -1074,6 +1094,7 @@ "uploadwarning": "چاڙھ جو چتاءُ", "savefile": "فائيل سانڍيو", "uploaddisabled": "چاڙھ ناقابلِ ڪار بڻيل.", + "uploaddisabledtext": "فائيل چاڙهڻ بند ڪيل آهن.", "upload-scripted-pi-callback": "ن فائيل کي اپلوڊ نه ٿو ڪري سگهي جنهن ۾ ايڪس ايم ايل اسٽائيل شيٽ جون پراسيسنگ هدايتون شامل هجن.", "uploaded-script-svg": "اسڪرپٽ جوڳو ايليمينٽ ”$1” مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾.", "uploaded-hostile-svg": "اپلوڊ ٿيل ايس وي جي فائيل جو غير محفوظ سي ايس ايس ۾ اسٽائيل ايلمينٽ مليو", @@ -1093,6 +1114,7 @@ "upload-options": "چاڙھ جا چارا", "watchthisupload": "هيءُ فائيل نظر ۾ رکو", "upload-file-error": "اندروني چُڪَ", + "upload-misc-error": "چارهڻ مهل اَڻڄاتل چُڪ ٿي آهي", "upload-http-error": "ايڇ ٽي ٽي پي جي چُڪَ ٿي آهي: $1", "upload-dialog-title": "فائيل چاڙهيو", "upload-dialog-button-cancel": "رد", @@ -1116,6 +1138,7 @@ "backend-fail-opentemp": "عارضي فائيئ کولي نه سگھيو.", "backend-fail-read": "فائيل \"$1\" کي پڙهي نه سگھيو.", "uploadstash-thumbnail": "ٽِڪِلي ڏسو", + "uploadstash-zero-length": "فائيل سڃيو آهي.", "img-auth-accessdenied": "دسترس کان جواب", "license": "لائيسنسڪاري:", "license-header": "لائيسنسڪاري", @@ -1239,6 +1262,7 @@ "longpages": "طويل صفحا", "deadendpages": "اڻ ڳنڍيندڙ صفحا", "protectedpages": "تحفظيل صفحا", + "protectedpages-filters": "ڇاڻيون:", "protectedpages-noredirect": "چورڻا لڪايو", "protectedpages-timestamp": "اوقاتي مُهُرَ", "protectedpages-page": "صفحو", @@ -1267,6 +1291,7 @@ "apisandbox-examples": "مثال", "apisandbox-dynamic-parameters-add-label": "نيمپيما شامل ڪريو", "apisandbox-dynamic-parameters-add-placeholder": "نيمپيما نانءُ", + "apisandbox-add-multi": "شامل ڪيو", "apisandbox-results": "نتيجا", "apisandbox-continue": "جاري رکو", "booksources": "ڪتابي وسيلا", @@ -1315,6 +1340,8 @@ "listgrouprights-addgroup-all": "سڀ گروپَ شامل ڪريو", "listgrouprights-removegroup-all": "سڀ گروپ هٽايو", "listgrouprights-namespaceprotection-namespace": "نانءُ پولار:", + "listgrants": "گرانٽون", + "listgrants-grant": "گرانٽ", "listgrants-rights": "حق", "trackingcategories-name": "پيغام جو نالو", "trackingcategories-nodesc": "ڪا به تشريح موجود نه آهي.", @@ -1341,6 +1368,7 @@ "watchlist": "نظر ۾ فھرست", "mywatchlist": "نظر ۾ فھرست", "watchlistfor2": "$1 $2 لاءِ", + "watchnologin": "لاگڊ اِن ٿيل ڪونه آهيو", "addwatch": "نظر ۾ فھرست ۾ شامل ڪريو", "addedwatchtext": "صفحو\"[[:$1]]\" ان جي بحث وارو صفحو اوهان جي [[Special:Watchlist|نظر ۾ فھرست]] ۾ شامل ڪيو ويو آهي.", "removewatch": "نظر ۾ فھرست مان ھٽايو", @@ -1370,6 +1398,7 @@ "enotif_impersonal_salutation": "{{SITENAME}} واپرائيندڙ", "enotif_lastdiff": "هي تبديلي ڏسڻ لاءِ، $1 ڏسو", "enotif_anon_editor": "گمنام واپرائيندڙ $1", + "enotif_minoredit": "هيءَ ننڍڙي سنوار آهي", "created": "ٺهي چڪو", "changed": "تبديل ٿي ويو", "deletepage": "صفحو ڊاهيو", @@ -1424,6 +1453,8 @@ "protect-expiry-options": "1 ڪلاڪ:1 hour,1 ڏينهن:1 day,1 هفتو:1 week,2 هفتو:2 weeks,1 مهينا:1 month,3 مهينا:3 months,6 مهينا:6 months,1 سال:1 year,اڻ کٽ:infinite", "restriction-type": "اجازتنامو:", "restriction-level": "روڪ سطح:", + "minimum-size": "ننڍي ماپ ۾", + "maximum-size": "وڌي ماپ ۾:", "pagesize": "(بائيٽس)", "restriction-edit": "سنواريو", "restriction-move": "چوريو", @@ -1431,6 +1462,7 @@ "restriction-upload": "چاڙهيو", "restriction-level-sysop": "مڪمل طور تحفظيل", "restriction-level-autoconfirmed": "نيم تحفظيل", + "undelete": "ڊاٺل صفحا ڏسو", "viewdeletedpage": "ڊاٺل صفحا ڏسو", "undelete-nodiff": "ڪوبہ اڳيون مسودو نہ لڌو", "undeletebtn": "بحاليو", @@ -1560,6 +1592,8 @@ "export": "صفحا برآمديو", "exportall": "سڀ صفحا برآمديو", "export-submit": "برآمديو", + "export-addcat": "شامل ڪيو", + "export-addns": "شامل ڪيو", "export-download": "بطور فائيل سانڍيو", "export-templates": "سانچا شامل ڪريو", "allmessages": "سرشتائي نياپا", @@ -1574,8 +1608,14 @@ "thumbnail-more": "وڏو ڪريو", "filemissing": "فائيل کٽل", "import": "صفحا درآمديو", + "import-interwiki-sourcewiki": "وڪيءَ جو ذريعو:", + "import-interwiki-sourcepage": "صفحي جو ذريعو:", + "import-interwiki-submit": "درآمد ڪيو", + "import-mapping-default": "ڊيفالت لوڪيشنز تي درآمد ڪيو:", + "import-mapping-namespace": "نالي واري خاني ۾ درآمد ڪيو:", "import-upload-filename": "فائيل نانءُ:", "import-comment": "تاثر:", + "importstart": "صفحا درآمد ٿين پيا...", "importlogpage": "درآمد لاگ", "tooltip-pt-userpage": "{{GENDER:|توھانجو}} صفحو", "tooltip-pt-mytalk": "{{GENDER:|توھانجو}} بحث صفحو", @@ -1617,6 +1657,7 @@ "tooltip-t-permalink": "صفحي جي ان نظرثاليءَ ڏانھن مستقل ڳنڍڻو", "tooltip-ca-nstab-main": "مواد جي صفحي کي ڏسو", "tooltip-ca-nstab-user": "واپرائيندڙ جو صفحو ڏسو", + "tooltip-ca-nstab-media": "ميڊيا جو صفحو ڏسو", "tooltip-ca-nstab-special": "هيءُ خاص صفحو آهي، ان ۾ ترميم نٿي ڪري سگھجي", "tooltip-ca-nstab-project": "رٿائي صفحو ڏسو", "tooltip-ca-nstab-image": "ھن فائيل جو صفحو ڏسو", @@ -1626,10 +1667,14 @@ "tooltip-ca-nstab-category": "هن زمري جو صفحو ڏسو", "tooltip-minoredit": "ان کي هڪ معمولي ترميم ڄاڻايو", "tooltip-save": "پنھنجون تبديليون سانڍيو", + "tooltip-publish": "پنهنجيون تبديليون ڇاپيو", "tooltip-preview": "پنھنجي تبديلين تي نگاھ وجھو. براءِ مھرباني اھو سانڍڻ کان اڳ ڪندا.", "tooltip-diff": "لکت ۾ ڪيل پنھنجون تبديليون ڏسو", "tooltip-compareselectedversions": "هن صفحي جن ٻن چونڊيل پرتن درميان تفاوت ڏسو.", "tooltip-watch": "هيءُ صفحو پنهنجي نظر ۾ فھرست ۾ شامل ڪريو", + "tooltip-watchlistedit-normal-submit": "فائيل ھٽايو", + "tooltip-watchlistedit-raw-submit": "واچ لسٽ کي اَپڊيٽ ڪيو", + "tooltip-upload": "چاڙهڻ شروع ڪيو", "tooltip-rollback": "\"واپس ورايو\" ھن صفحي ۾ پوئين ڀاڱيدار جي ڪيل ترميم(ن) کي ھڪ ٽڙڪ سان اڻڪري ٿو", "tooltip-undo": "\"اڻڪريو\" هن ترميم کي واپس ڪيو ۽ پيش نگاه ۾ ترميم کي کوليو. اهو اوهان کي تت شامل ڪرڻ جو موقعو ڏيندو.", "tooltip-preferences-save": "ترجيحون سانڍيو", @@ -1663,14 +1708,19 @@ "pageinfo-magic-words": "جادوئي {{PLURAL:$1|لفظُ|لفظَ}} ($1)", "pageinfo-hidden-categories": "لڪيل {{PLURAL:$1|زمرو|زمرا}} ($1)", "pageinfo-toolboxlink": "صفحي جي معلومات", + "pageinfo-redirectsto-info": "ڄاڻ", "pageinfo-contentpage": "موادي صفحي طور ڳڻيو ويندڙ", "pageinfo-contentpage-yes": "ها", "pageinfo-protect-cascading-yes": "ها", + "pageinfo-category-info": "ڪيٽاگريءَ جي باري ۾ ڄاڻ", "pageinfo-category-total": "رڪنن جو ڪل تعداد", + "pageinfo-category-pages": "صفحن جو تعداد", "pageinfo-category-subcats": "ذيلي زمرن جو تعداد", "pageinfo-category-files": "صفحن جو تعداد", + "pageinfo-user-id": "واهپيندڙ (يوزر) جي سڃاڻپ (آءِ ڊي)", "markaspatrolledtext": "ھن صفحي کي گشت ڪيل طور نشان لڳايو", "patrol-log-page": "گشت لاگ", + "confirm-markpatrolled-button": "ٺيڪ (او ڪي) آهي", "previousdiff": "← اڳوڻي ترميم", "nextdiff": "نئين تر ترميم →", "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|صفحو|صفحا}}", diff --git a/languages/i18n/se.json b/languages/i18n/se.json index 6db5b71472..c7b403ede9 100644 --- a/languages/i18n/se.json +++ b/languages/i18n/se.json @@ -123,6 +123,7 @@ "anontalk": "Ságastallan IP-čujuhussii", "navigation": "Navigašuvdna", "and": " ja", + "variants": "Variánttat", "errorpagetitle": "Feaila", "returnto": "Máhcat siidui $1.", "tagline": "{{SITENAME}}", @@ -356,6 +357,7 @@ "template-protected": "(suodjáluvvon)", "template-semiprotected": "(suodjáluvvon anonyma ja ođđa geavaheddjiin)", "edittools": "", + "content-model-wikitext": "wikiteaksta", "viewpagelogs": "Čájet dán siiddu loggaid", "nohistory": "Dán siiddus ii leat rievdadanhistorjá.", "currentrev": "Dálá veršuvdna", @@ -370,8 +372,8 @@ "page_first": "vuosttas siidu", "page_last": "maŋimus siidu", "history-fieldset-title": "Bláđe historjjá", - "histfirst": "Vuosttas", - "histlast": "Maŋimus", + "histfirst": "vuosttas", + "histlast": "maŋimus", "historysize": "($1 stávvala)", "historyempty": "(guoros)", "history-feed-title": "Rievdadushistorjá", @@ -545,7 +547,7 @@ "upload-file-error": "Stuorra feaila", "upload-misc-error": "Feaila", "upload-curl-error6": "Čujuhus ii doaimma", - "license": "Liseansa", + "license": "Liseansa:", "license-header": "Liseansa", "nolicense": "Ii liseansa", "license-nopreview": "(ovdalgihtii geahččan ii leat vejolaš)", @@ -665,6 +667,7 @@ "notargettext": "It leat meroštallan mearresiiddu dahje -geavaheaddji, masa dahku laktása.", "booksources": "Girjegáldut", "booksources-search-legend": "Oza girjegálduid", + "booksources-search": "Oza", "booksources-text": "Vuolábealde leat liŋkkat olggobeal siidduide, main vuvdojuvvot ođđa ja boares girjjid. Siiddui sáhttá maid leat lassedieđut girjjiin.", "specialloguserlabel": "Geavaheaddji:", "speciallogtitlelabel": "Mearri", @@ -756,7 +759,7 @@ "revertpage": "Geavaheaddji [[Special:Contributions/$2|$2]] ([[User_talk:$2|ságastallan]]) rievdadusat sihkkojuvvui ja siidu máhcahuvvui veršuvdnii, man geavaheaddji [[User:$1|$1]] lei dahkan.", "rollback-success": "Rievdadusat, maid geavaheaddji ”$1” lei dahkan, sihkojuvvui ja artihkal máhcaduvvui veršuvdnii, man geavaheaddji $2 lei dahkan.", "protectlogpage": "Suodjálanlogga", - "protectedarticle": "suodjálii siiddu $1", + "protectedarticle": "suodjálii siiddu [[$1]]", "modifiedarticleprotection": "rievddai siiddu [[$1]] suodjálandási", "unprotectedarticle": "heittii siiddu $1 suodjaleami", "protect-title": "Siiddu $1 suodjáleapmi", @@ -802,12 +805,14 @@ "contributions": "Geavaheaddji rievdadusat", "contributions-title": "Geavaheaddji $1 rievdadusat", "mycontris": "Rievdadusat", + "anoncontribs": "Rievdadusat", "uctop": "(ođđaseamos)", "month": "Mánotbadji", "year": "Jahki", "sp-contributions-newbies": "Čájet ođđa geavaheddjiid rievdadusaid", "sp-contributions-newbies-sub": "Ođđa geavaheddjiid rievdadusat", "sp-contributions-blocklog": "cakkastallamat", + "sp-contributions-logs": "loggat", "sp-contributions-talk": "ságastallan", "sp-contributions-userrights": "Geavaheaddjirivttiid stivren", "sp-contributions-search": "Oza rievdadusaid", @@ -1022,13 +1027,14 @@ "watchlisttools-view": "Čájet rievdadusaid", "watchlisttools-edit": "Ođasmahte listtu", "version": "Veršuvdna", + "redirect-file": "Fiilanamma", "specialpages": "Erenomáš siiddut", "logentry-delete-delete": "$1 sihkui siiddu $3", "logentry-delete-restore": "$1 máhcahii siiddu $3", "logentry-move-move": "$1 sirddii siiddu $3 nammii $4", "logentry-move-move_redir-noredirect": "$1 sirddii siiddu $3 nammii $4 iige ráhkadan ođđasitstivrema", "logentry-newusers-create": "$1 ráhkadii dovddaldaga", - "logentry-newusers-autocreate": "Dovddaldat $1 ráhkaduvvui automáhtalaččat", + "logentry-newusers-autocreate": "Dovddaldat $1 {{GENDER:$2|ráhkaduvvui}} automáhtalaččat", "rightsnone": "(eai rievttit)", "searchsuggest-search": "Oza" } diff --git a/languages/i18n/sh.json b/languages/i18n/sh.json index d8a7a88003..1e11dbcbe3 100644 --- a/languages/i18n/sh.json +++ b/languages/i18n/sh.json @@ -980,7 +980,7 @@ "userrights": "Postavke korisničkih prava", "userrights-lookup-user": "Menadžment korisničkih prava", "userrights-user-editname": "Unesi korisničko ime:", - "editusergroup": "Menjaj Grupe Korisnika", + "editusergroup": "Učitaj korisničke grupe", "editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]] $2", "userrights-editusergroup": "Uredi korisničke grupe", "saveusergroups": "Snimi korisničke grupe", diff --git a/languages/i18n/sk.json b/languages/i18n/sk.json index 0d4bb240dc..18a77656aa 100644 --- a/languages/i18n/sk.json +++ b/languages/i18n/sk.json @@ -1115,7 +1115,7 @@ "grouppage-bureaucrat": "{{ns:project}}:Byrokrati", "grouppage-suppress": "{{ns:project}}:Dozor", "right-read": "Čítať stránky", - "right-edit": "Upravovať stránky (ktoré nie sú diskusné stránky)", + "right-edit": "Upravovať stránky", "right-createpage": "Vytvárať stránky (ktoré nie sú diskusné stránky)", "right-createtalk": "Vytvárať diskusné stránky", "right-createaccount": "Vytvárať nové používateľské kontá", diff --git a/languages/i18n/skr-arab.json b/languages/i18n/skr-arab.json index a9d9e7c14d..a4cdf77c27 100644 --- a/languages/i18n/skr-arab.json +++ b/languages/i18n/skr-arab.json @@ -595,7 +595,7 @@ "grouppage-bot": "{{ns:project}}:بوٹ", "grouppage-sysop": "{{ns:project}}:ایڈمنسٹریٹر", "right-read": "ورقے پڑھو", - "right-edit": "ورقے وچ لکھو", + "right-edit": "ورقیاں وچ لکھو", "right-move": "ورقے ٹورو", "right-movefile": "فائلاں ٹورو", "right-upload": "فائلاں چڑھاؤ", diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json index 75aa015624..4df3c9dec4 100644 --- a/languages/i18n/sl.json +++ b/languages/i18n/sl.json @@ -162,7 +162,7 @@ "anontalk": "Pogovorna stran", "navigation": "Navigacija", "and": " in", - "faq": "Najpogostejša vprašanja", + "faq": "Pogosta vprašanja", "actions": "Dejanja", "namespaces": "Imenski prostori", "variants": "Različice", @@ -375,6 +375,7 @@ "ns-specialprotected": "Posebnih strani ni mogoče urejati.", "titleprotected": "Uporabnik [[User:$1|$1]] je preprečil ustvarjanje strani s tem naslovom.\nPodan razlog je $2.", "filereadonlyerror": "Ne morem spremeniti datoteke »$1«, ker je skladišče datotek »$2« v načinu, ki dovoljuje samo branje.\n\nSistemski skrbnik, ki ga je zaklenil, je podal naslednje pojasnilo: »$3«.", + "invalidtitle": "Neveljaven naslov", "invalidtitle-knownnamespace": "Neveljaven naslov z imenskim prostorom »$2« in besedilom »$3«", "invalidtitle-unknownnamespace": "Neveljaven naslov z neznano številko imenskega prostora $1 in besedilom »$2«", "exception-nologin": "Niste prijavljeni", @@ -1367,24 +1368,24 @@ "rcfilters-restore-default-filters": "Obnovi privzete filtre", "rcfilters-clear-all-filters": "Počisti vse filtre", "rcfilters-show-new-changes": "Ogled najnovejših sprememb", - "rcfilters-search-placeholder": "Filtrirajte spremembe (uporabite meni ali poiščite ime filtra)", + "rcfilters-search-placeholder": "Filtriraj zadnje spremembe (uporabi meni ali vnesi ime filtra)", "rcfilters-invalid-filter": "Neveljaven filter", "rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.", "rcfilters-filterlist-title": "Filtri", "rcfilters-filterlist-whatsthis": "Kako to deluje?", - "rcfilters-filterlist-feedbacklink": "Povejte nam, kaj menite o teh orodjih za filtriranje", + "rcfilters-filterlist-feedbacklink": "Povej nam, kaj meniš o tem orodju za filtriranje", "rcfilters-highlightbutton-title": "Označi rezultate", - "rcfilters-highlightmenu-title": "Izberite barvo", - "rcfilters-highlightmenu-help": "Izberite barvo za označitev te lastnosti", + "rcfilters-highlightmenu-title": "Izberi barvo", + "rcfilters-highlightmenu-help": "Izberi barvo za označitev te lastnosti", "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra", "rcfilters-noresults-conflict": "Našli nismo nobenih rezultatov, ker si merila za iskanje nasprotujejo", "rcfilters-state-message-subset": "Ta filter nima učinka, saj njegove rezultate {{PLURAL:$2|vključuje naslednji, širši filter|vključujeta naslednja, širša filtra|vključujejo naslednji, širši filtri}} (označite jih, da razlikujete med njimi): $1", "rcfilters-state-message-fullcoverage": "Izbira vseh filtrov v tej skupini je enako kot izbira nobenega, zato ta filter nima učinka. Skupina vključuje: $1", "rcfilters-filtergroup-authorship": "Avtorstvo prispevka", - "rcfilters-filter-editsbyself-label": "Vaše spremembe", - "rcfilters-filter-editsbyself-description": "Vaša lastna urejanja.", + "rcfilters-filter-editsbyself-label": "Tvoje spremembe", + "rcfilters-filter-editsbyself-description": "Tvoja lastna urejanja.", "rcfilters-filter-editsbyother-label": "Spremembe drugih", - "rcfilters-filter-editsbyother-description": "Vse spremembe razen vaših.", + "rcfilters-filter-editsbyother-description": "Vse spremembe razen tvojih.", "rcfilters-filtergroup-userExpLevel": "Prijava in izkušnje uporabnika", "rcfilters-filter-user-experience-level-registered-label": "Registrirani", "rcfilters-filter-user-experience-level-registered-description": "Prijavljeni uporabniki.", @@ -1411,7 +1412,7 @@ "rcfilters-filtergroup-significance": "Pomembnost", "rcfilters-filter-minor-label": "Manjša urejanja", "rcfilters-filter-minor-description": "Urejanja, ki jih je avtor označil kot manjša.", - "rcfilters-filter-major-label": "Nemanjša urejanja", + "rcfilters-filter-major-label": "Večja urejanja", "rcfilters-filter-major-description": "Urejanja, ki niso označena kot manjša.", "rcfilters-filtergroup-watchlist": "Nadzorovane strani", "rcfilters-filter-watchlist-watched-label": "Na spisku nadzorov", @@ -1431,7 +1432,7 @@ "rcfilters-filter-newpages-label": "Ustvarjanja strani", "rcfilters-filter-newpages-description": "Urejanja, ki ustvarijo nove strani.", "rcfilters-filter-categorization-label": "Spremembe kategorij", - "rcfilters-filter-categorization-description": "Zapisi o straneh, ki so bila dodana ali odstranjena iz kategorij.", + "rcfilters-filter-categorization-description": "Zapisi o straneh, ki so bile dodane ali odstranjene iz kategorij.", "rcfilters-filter-logactions-label": "Dnevniška dejanja", "rcfilters-filter-logactions-description": "Administrativna dejanja, ustvarjanja računov, izbrisi strani, nalaganja ...", "rcfilters-hideminor-conflicts-typeofchange-global": "Filter »Manjša urejanja« je v sporu z enim ali več filtri Vrsta spremembe, ker nekaterih vrst urejanj ni možno označiti kot »manjša«. Filtri v sporu so označeni v območju Dejavni filtri zgoraj.", @@ -1783,9 +1784,9 @@ "filehist-filesize": "Velikost datoteke", "filehist-comment": "Komentar", "imagelinks": "Uporaba datoteke", - "linkstoimage": "Datoteka je del {{PLURAL:$1|naslednje $1 strani|naslednjih $1 strani}} {{GRAMMAR:rodilnik|{{SITENAME}}}}:", - "linkstoimage-more": "Na to datoteko se {{PLURAL:$1|povezuje več kot $1 stran|povezujeta več kot $1 strani|povezujejo več kot $1 strani|povezuje več kot $1 strani}}.\nNaslednji seznam obsega samo {{PLURAL:$1|prvo stran, ki se povezuje|prvi $1 strani, ki se povezujeta|prve $1 strani, ki se povezujejo|prvih $1 strani, ki se povezujejo}} na datoteko.\nNa razpolago je tudi [[Special:WhatLinksHere/$2|popoln seznam]].", - "nolinkstoimage": "Z datoteko se ne povezuje nobena stran.", + "linkstoimage": "Datoteko {{PLURAL:$1|uporablja naslednja $1 stran|uporabljata naslednji $1 strani|uporabljajo naslednje $1 strani|uporablja naslednjih $1 strani}}:", + "linkstoimage-more": "To datoteko {{PLURAL:$1|uporablja več kot $1 stran|uporabljata več kot $1 strani|uporabljajo več kot $1 strani|uporablja več kot $1 strani}}.\nNaslednji seznam obsega samo {{PLURAL:$1|prvo stran, ki uporablja|prvi $1 strani, ki uporabljata|prve $1 strani, ki uporabljajo|prvih $1 strani, ki uporabljajo}} datoteko.\nNa razpolago je tudi [[Special:WhatLinksHere/$2|popoln seznam]].", + "nolinkstoimage": "Nobena stran ne uporablja te datoteke.", "morelinkstoimage": "Preglejte [[Special:WhatLinksHere/$1|več povezav]] na to datoteko.", "linkstoimage-redirect": "$1 (preusmeritev datoteke) $2", "duplicatesoffile": "{{PLURAL:$1|Sledeča datoteka je dvojnik|Sledeči datoteki sta dvojnika|Sledeče $1 datoteke so dvojniki|Sledečih $1 datotek so dvojniki}} te datoteke ([[Special:FileDuplicateSearch/$2|več podrobnosti]]):", @@ -3506,14 +3507,14 @@ "tag-mw-rollback-description": "Urejanja, ki vrnejo prejšnja urejanja s povezavo za vrnitev", "tag-mw-undo": "Razveljavljeno", "tag-mw-undo-description": "Urejanja, ki razveljavijo prejšnja urejanja z uporabo povezave za razveljavitev", - "tags-title": "Etikete", - "tags-intro": "Ta stran navaja etikete, s katerimi lahko programje označi urejanja, in njihov pomen.", + "tags-title": "Oznake", + "tags-intro": "Ta stran navaja oznake, s katerimi lahko programje označi urejanja, in njihov pomen.", "tags-tag": "Ime oznake", "tags-display-header": "Prikaz na seznamu sprememb", "tags-description-header": "Polni opis pomena", "tags-source-header": "Vir", "tags-active-header": "Dejavno?", - "tags-hitcount-header": "Etiketirane spremembe", + "tags-hitcount-header": "Označene spremembe", "tags-actions-header": "Dejanja", "tags-active-yes": "Da", "tags-active-no": "Ne", diff --git a/languages/i18n/sq.json b/languages/i18n/sq.json index d1f3d62cfe..72e7ea5d0f 100644 --- a/languages/i18n/sq.json +++ b/languages/i18n/sq.json @@ -319,7 +319,7 @@ "nosuchaction": "Nuk ekziston ky veprim", "nosuchactiontext": "Veprimi i specifikuar nga URL është i pavlefshëm.\nJu mund të keni bërë një gabim në shkrimin e URL-së, ose keni ndjekur një lidhje të pasaktë.\nKjo mund të vijë edhe si rezultat i një gabimi në programin e përdorur nga {{SITENAME}}.", "nosuchspecialpage": "Nuk ekziston kjo faqe speciale", - "nospecialpagetext": "Ju keni kërkuar një faqe speciale të pavlefshme. \n\n Një listë e faqeve speciale të vlefshme mund të gjendet në [[Special:SpecialPages|{{int: specialpages }}]].", + "nospecialpagetext": "Ju keni kërkuar një faqe speciale të pavlefshme. \n\nNjë listë e faqeve speciale të vlefshme mund të gjendet në [[Special:SpecialPages|{{int: specialpages }}]].", "error": "Gabim", "databaseerror": "Gabim në databazë", "databaseerror-text": "\nKjo mund të tregojë një gabim në software.", diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json index 388d26f3d7..ef4d5d3450 100644 --- a/languages/i18n/sr-ec.json +++ b/languages/i18n/sr-ec.json @@ -42,50 +42,50 @@ "Stalker" ] }, - "tog-underline": "Подвлачење веза:", + "tog-underline": "Подвлачење линкова:", "tog-hideminor": "Сакриј мање измене са списка скорашњих измена", "tog-hidepatrolled": "Сакриј патролиране измене са списка скорашњих измена", "tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница", "tog-hidecategorization": "Сакриј категоризацију страница", - "tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих", + "tog-extendwatchlist": "Прошири списак надгледања за поглед свих промена, не само скорашњих", "tog-usenewrc": "Групиши измене по страници у скорашњим изменама и списку надгледања", "tog-numberheadings": "Аутоматски нумериши поднаслове", - "tog-showtoolbar": "Трака са алаткама за уређивање", + "tog-showtoolbar": "Прикажи траку са алаткама за уређивање", "tog-editondblclick": "Уреди странице двоструким кликом", - "tog-editsectiononrightclick": "Уређивање одељака десним кликом на њихове наслове", - "tog-watchcreations": "Додај странице које направим и датотеке које отпремим у мој списак надгледања", - "tog-watchdefault": "Додај странице и датотеке које изменим у мој списак надгледања", - "tog-watchmoves": "Додај странице и датотеке које преместим у мој списак надгледања", - "tog-watchdeletion": "Додај странице и датотеке које обришем у мој списак надгледања", - "tog-watchuploads": "Додај датотеке које отпремим у мој списак надгледања", - "tog-watchrollback": "Додај странице на којима сам вратио измене у мој списак надгледања", + "tog-editsectiononrightclick": "Омогући уређивање одељака десним кликом на њихове наслове", + "tog-watchcreations": "Додај странице које направим и датотеке које отпремим на мој списак надгледања", + "tog-watchdefault": "Додај странице и датотеке које уредим на мој списак надгледања", + "tog-watchmoves": "Додај странице и датотеке које преместим на мој списак надгледања", + "tog-watchdeletion": "Додај странице и датотеке које обришем на мој списак надгледања", + "tog-watchuploads": "Додај датотеке које отпремим на мој списак надгледања", + "tog-watchrollback": "Додај странице на којима сам извршио враћање измена на мој списак надгледања", "tog-minordefault": "Означавај све измене као мање", "tog-previewontop": "Прикажи претпреглед пре оквира за уређивање", "tog-previewonfirst": "Прикажи претпреглед при првој измени", "tog-enotifwatchlistpages": "Пошаљи ми имејл када се промени страница или датотека са мог списка надгледања", - "tog-enotifusertalkpages": "Пошаљи ми имејл кад се промени моја страница за разговор", + "tog-enotifusertalkpages": "Пошаљи ми имејл кад се промени моја корисничка страница за разговор", "tog-enotifminoredits": "Пошаљи ми имејл и код мањих измена страница и датотека", - "tog-enotifrevealaddr": "Откриј моју имејл адресу у порукама обавештења", + "tog-enotifrevealaddr": "Откриј моју имејл-адресу у порукама обавештења", "tog-shownumberswatching": "Прикажи број корисника који надгледају", "tog-oldsig": "Ваш постојећи потпис:", - "tog-fancysig": "Сматрај потпис као викитекст (без самоповезивања)", + "tog-fancysig": "Сматрај потпис као викитекст (без аутоматског линка)", "tog-uselivepreview": "Прикажи претпреглед без поновног учитавања странице", - "tog-forceeditsummary": "Упозори ме када не унесем опис измене", + "tog-forceeditsummary": "Упозори ме када не унесем резиме измене", "tog-watchlisthideown": "Сакриј моје измене са списка надгледања", "tog-watchlisthidebots": "Сакриј измене ботова са списка надгледања", "tog-watchlisthideminor": "Сакриј мање измене са списка надгледања", "tog-watchlisthideliu": "Сакриј измене пријављених корисника са списка надгледања", - "tog-watchlistreloadautomatically": "Аутоматски освежи списак надгледања кад год се филтер измени (потребан JavaScript)", + "tog-watchlistreloadautomatically": "Аутоматски освежи списак надгледања кад год се филтер промени (потребан JavaScript)", "tog-watchlistunwatchlinks": "Додај везе за директно додавање/уклањање ставки са списка надгледања (потребан JavaScript)", "tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања", "tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања", "tog-watchlisthidecategorization": "Сакриј категоризацију страница", "tog-ccmeonemails": "Пошаљи ми копије имејлова које пошаљем другим корисницима", "tog-diffonly": "Не приказуј садржај странице испод разлика", - "tog-showhiddencats": "Скривене категорије", + "tog-showhiddencats": "Прикажи скривене категорије", "tog-norollbackdiff": "Не приказуј разлику након извршеног враћања", - "tog-useeditwarning": "Упозори ме када напуштам страницу са несачуваним изменама", - "tog-prefershttps": "Увек користи сигурну везу док сам пријављен.", + "tog-useeditwarning": "Упозори ме када напуштам страницу за уређивање са несачуваним променама", + "tog-prefershttps": "Увек користи сигурну везу док сам пријављен/а.", "underline-always": "увек", "underline-never": "никад", "underline-default": "према теми или прегледачу", @@ -173,7 +173,7 @@ "listingcontinuesabbrev": "наст.", "index-category": "Пописане странице", "noindex-category": "Непописане странице", - "broken-file-category": "Странице с неисправним везама до датотека", + "broken-file-category": "Странице са неисправним линковима до датотека", "categoryviewer-pagedlinks": "$1 ($2)", "category-header-numerals": "$1–$2", "about": "О нама", @@ -191,13 +191,13 @@ "actions": "Радње", "namespaces": "Именски простори", "variants": "Варијанте", - "navigation-heading": "Навигациони мени", + "navigation-heading": "Мени за навигацију", "errorpagetitle": "Грешка", "returnto": "Назад на страницу „$1“.", "tagline": "Извор: {{SITENAME}}", "help": "Помоћ", "search": "Претрага", - "search-ignored-headings": " #
    \n# Наслови који ће бити занемарени при претрази.\n# Измене су видљиве одмах након што се страница са насловом попише.\n# Можете изнудити поновно пописивање „нултом” изменом.\n# Синтакса је следећа:\n#  * Сваки ред који започиње знаком „#” је коментар.\n#  * Сваки не празни ред је тачан наслов који ће бити занемарен, с тим да се разликују мала и велика слова и све остало\nРеференце\nСпољашње везе\nТакође погледајте\n #
    ", + "search-ignored-headings": " #
    \n# Наслови који ће бити занемарени при претрази.\n# Промене су видљиве одмах након што се страница са насловом попише.\n# Можете изнудити поновно пописивање „нултом” изменом.\n# Синтакса је следећа:\n#  * Сваки ред који започиње знаком „#” је коментар.\n#  * Сваки не празни ред је тачан наслов који ће бити занемарен, с тим да се разликују мала и велика слова и све остало\nРеференце\nСпољашњи линкови\nТакође погледајте\n #
    ", "searchbutton": "Претражи", "go": "Иди", "searcharticle": "Иди", @@ -206,7 +206,7 @@ "history_small": "историја", "updatedmarker": "ажурирано од моје последње посете", "printableversion": "За штампање", - "permalink": "Трајна веза", + "permalink": "Трајни линк", "print": "Штампај", "view": "Погледај", "view-foreign": "Погледај на пројекту $1", @@ -216,7 +216,7 @@ "create-local": "Додај локални опис", "delete": "Обриши", "undelete_short": "Врати {{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}", - "viewdeleted_short": "Погледај {{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}", + "viewdeleted_short": "Погледај {{PLURAL:$1|једну обрисану измену|$1 обрисане измене|$1 обрисаних измена}}", "protect": "Заштити", "protect_change": "промени", "unprotect": "Промени заштиту", @@ -227,9 +227,9 @@ "talk": "Разговор", "views": "Прегледи", "toolbox": "Алатке", - "tool-link-userrights": "Уреди {{GENDER:$1|корисничке}} групе", - "tool-link-userrights-readonly": "{{GENDER:$1|Корисничке}} групе", - "tool-link-emailuser": "Пошаљи имејл {{GENDER:$1|кориснику|корисници}}", + "tool-link-userrights": "Промени {{GENDER:$1|корисничке}} групе", + "tool-link-userrights-readonly": "Преглед {{GENDER:$1|корисничких}} група", + "tool-link-emailuser": "Слање имејла {{GENDER:$1|кориснику|корисници}}", "imagepage": "Погледај страницу датотеке", "mediawikipage": "Погледај страницу поруке", "templatepage": "Погледај страницу шаблона", @@ -247,7 +247,7 @@ "jumptonavigation": "навигацију", "jumptosearch": "претрагу", "view-pool-error": "Нажалост, сервери су тренутно преоптерећени.\nПревише корисника покушава да прегледа ову страницу.\nСачекајте неко време пре него што поново покушате да јој приступите.\n\n$1", - "generic-pool-error": "Нажалост, сервери су тренутно преоптерећени.\nПревише корисника покушава да види овај ресурс.\nСачекајте неко време пре него што поново покушате да му приступите.", + "generic-pool-error": "Нажалост, сервери су тренутно преоптерећени.\nПревише корисника покушава да погледа овај ресурс.\nСачекајте неко време пре него што поново покушате да му приступите.", "pool-timeout": "Истек времена чека на закључавање", "pool-queuefull": "Ред је пун захтева", "pool-errorunknown": "Непозната грешка", @@ -270,11 +270,11 @@ "portal-url": "Project:Портал заједнице", "privacy": "Политика приватности", "privacypage": "Project:Политика приватности", - "badaccess": "Грешке у овлашћењима", - "badaccess-group0": "Није Вам дозвољено да извршите захтевану радњу.", + "badaccess": "Грешка у дозволама", + "badaccess-group0": "Није вам дозвољено да извршите радњу коју сте захтевали.", "badaccess-groups": "Радња коју сте захтевали је ограничена само корисницима у {{PLURAL:$2|следећој групи|следећим групама}}: $1.", "versionrequired": "Потребна је верзија $1 Медијавикија", - "versionrequiredtext": "Потребно је издање $1 Медијавикија да бисте користили ову страницу.\nПогледајте страницу за [[Special:Version|издање]].", + "versionrequiredtext": "Потребна је верзија $1 Медијавикија да бисте користили ову страницу.\nПогледајте страницу [[Special:Version|верзије]].", "ok": "У реду", "pagetitle": "$1 — {{SITENAME}}", "pagetitle-view-mainpage": "{{SITENAME}}", @@ -283,8 +283,8 @@ "youhavenewmessages": "{{PLURAL:$3|Имате}} $1 ($2).", "youhavenewmessagesfromusers": "{{PLURAL:$4|Имате}} $1 од {{PLURAL:$3|другог корисника|$3 корисника}} ($2).", "youhavenewmessagesmanyusers": "Имате $1 од много корисника ($2).", - "newmessageslinkplural": "{{PLURAL:$1|нову поруку|нове поруке|нових порука}}", - "newmessagesdifflinkplural": "{{PLURAL:$1|последња измена|последње измене|последњих измена}}", + "newmessageslinkplural": "{{PLURAL:$1|нову поруку|нове поруке|999=нових порука}}", + "newmessagesdifflinkplural": "{{PLURAL:$1|последња промена|999=последње промене}}", "youhavenewmessagesmulti": "Имате нове поруке на $1", "editsection": "уреди", "editold": "уреди", @@ -302,21 +302,21 @@ "confirmable-no": "Не", "thisisdeleted": "Погледај или врати $1?", "viewdeleted": "Погледај $1?", - "restorelink": "{{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}", - "feedlinks": "Довод:", - "feed-invalid": "Неисправна врста довода.", - "feed-unavailable": "Доводи нису доступни", - "site-rss-feed": "$1 RSS довод", - "site-atom-feed": "$1 Атом довод", - "page-rss-feed": "„$1“ RSS довод", - "page-atom-feed": "„$1“ Атом довод", - "feed-atom": "Атом", + "restorelink": "{{PLURAL:$1|једну обрисану измену|$1 обрисане измене|$1 обрисаних измена}}", + "feedlinks": "Фид:", + "feed-invalid": "Неважећи тип пријаве на фид.", + "feed-unavailable": "Фидови синдикације нису доступни", + "site-rss-feed": "$1 – RSS фид", + "site-atom-feed": "$1 – Atom фид", + "page-rss-feed": "„$1“ – RSS фид", + "page-atom-feed": "„$1“ – Atom фид", + "feed-atom": "Atom", "feed-rss": "RSS", "red-link-title": "$1 (страница не постоји)", "sort-descending": "Поређај опадајуће", "sort-ascending": "Поређај растуће", "nstab-main": "Страница", - "nstab-user": "{{GENDER:{{BASEPAGENAME}}|Корисник|Корисница|Корисник}}", + "nstab-user": "{{GENDER:{{BASEPAGENAME}}|Корисник|Корисница}}", "nstab-media": "Медији", "nstab-special": "Посебно", "nstab-project": "Пројекат", @@ -327,27 +327,27 @@ "nstab-category": "Категорија", "mainpage-nstab": "Главна страна", "nosuchaction": "Нема такве радње", - "nosuchactiontext": "Радња наведена у адреси није исправна.\nМожда сте погрешно написали адресу или сте пратили застарелу везу.\nМогуће је и да се ради о грешци у софтверу викија.", + "nosuchactiontext": "Радња наведена у URL-у није валидна.\nМожда сте откуцали погрешан URL-а или сте пратили покварен линк.\nОво такође може да указује на грешку у софтверу који користи {{SITENAME}}.", "nosuchspecialpage": "Нема такве посебне странице", - "nospecialpagetext": "Посебна страница коју сте захтевали не постоји.\n\nСписак свих посебних страница налази се на „[[Special:SpecialPages|{{int:specialpages}}]]”.", + "nospecialpagetext": "Захтевали сте невалидну посебну страницу.\n\nСписак валидних посебних страница може да се пронађе на „[[Special:SpecialPages|{{int:specialpages}}]]”.", "error": "Грешка", "databaseerror": "Грешка у бази података", - "databaseerror-text": "Дошло је до грешке у упиту базе података. Можда је у питању програмска грешка.", + "databaseerror-text": "Дошло је до грешке у упиту базе података. \nОво може да указује на грешку у софтверу.", "databaseerror-textcl": "Дошло је до грешке у упиту базе података.", "databaseerror-query": "Упит: $1", "databaseerror-function": "Функција: $1", "databaseerror-error": "Грешка: $1", - "laggedslavemode": "Упозорење: могуће је да страница није ажурирана.", + "laggedslavemode": "Упозорење: страница можда не садржи недавна ажурирања.", "readonly": "База података је закључана", "enterlockreason": "Унесите разлог за закључавање, укључујући и време откључавања", "readonlytext": "База података је тренутно закључана, што значи да је није могуће мењати.\n\nСистемски администратор је навео следеће објашњење: $1", - "missing-article": "Текст странице под називом „$1“ ($2) није пронађен.\n\nУзрок ове грешке је обично застарела измена или веза до обрисане странице.\n\nАко се не ради о томе, онда сте вероватно пронашли грешку у софтверу.\nПријавите је [[Special:ListUsers/sysop|администратору]] уз одговарајућу везу.", - "missingarticle-rev": "(измена#: $1)", + "missing-article": "Текст странице под називом „$1“ ($2) није пронађен.\n\nУзрок ове грешке је обично застарела измена или линк до обрисане странице.\n\nАко се не ради о томе, онда сте вероватно пронашли грешку у софтверу.\nПријавите је [[Special:ListUsers/sysop|администратору]] уз одговарајући линк.", + "missingarticle-rev": "(ревизија#: $1)", "missingarticle-diff": "(разлика: $1, $2)", "readonly_lag": "База података је аутоматски закључана да би се секундарни сервери базе података ускладили с главним.", "internalerror": "Унутрашња грешка", "internalerror_info": "Интерна грешка: $1", - "internalerror-fatal-exception": "Фатална грешка типа „$1“", + "internalerror-fatal-exception": "Грешка необрађеног изузетка типа „$1“", "filecopyerror": "Не могу да копирам датотеку „$1“ у „$2“.", "filerenameerror": "Не могу да преименујем датотеку „$1“ у „$2“.", "filedeleteerror": "Не могу да обришем датотеку „$1“.", @@ -361,9 +361,9 @@ "cannotdelete": "Не могу да обришем страницу или датотеку „$1“.\nВероватно ју је неко други обрисао.", "cannotdelete-title": "Не могу да обришем страницу „$1“", "delete-hook-aborted": "Брисање је прекинула кука.\nНије дато никакво образложење.", - "no-null-revision": "Не могу да направим нову празну верзију за страницу „$1“", - "badtitle": "Неисправан наслов", - "badtitletext": "Наслов странице је неисправан, празан или је међујезички или међувики наслов погрешно повезан.\nМожда садржи знакове који се не могу користити у насловима.", + "no-null-revision": "Не могу да направим нову ништавну ревизију странице „$1“", + "badtitle": "Лош наслов", + "badtitletext": "Захтевани наслов странице је неважећи, празан или је погрешно повезан међујезички или међувики наслов.\nМожда садржи један или више знакова који се не могу користити у насловима.", "title-invalid-empty": "Тражено име странице је празно или садржи само назив именског простора.", "title-invalid-utf8": "Тражени назив странице садржи неважећи UTF-8 знак.", "title-invalid-interwiki": "Тражени наслов странице садржи унутрашњу вики везу која не може бити кориштена у насловима.", @@ -383,34 +383,35 @@ "protectedpagetext": "Ова страница је закључана за измене и друге радње.", "viewsourcetext": "Можете да читате и копирате изворник ове странице.", "viewyourtext": "Можете да погледате и копирате изворник Ваших измена на овој страници.", - "protectedinterface": "Ова страница садржи текст интерфејса за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или изменили преводе било којег викија, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.", + "protectedinterface": "Ова страница садржи текст интерфејса за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или променили преводе било којег викија, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.", "editinginterface": "Упозорење: уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.", - "translateinterface": "Да додате или промените преводе за све викије, посетите [https://translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.", + "translateinterface": "Да бисте додали или променили преводе за све викије, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.", "cascadeprotected": "Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:\n$2", "namespaceprotected": "Немате дозволу да уређујете странице у именском простору: $1.", "customcssprotected": "Немате дозволу да мењате ову CSS страницу јер садржи лична подешавања другог корисника.", "customjsprotected": "Немате дозволу да мењате ову страницу JavaScript јер садржи лична подешавања другог корисника.", - "mycustomcssprotected": "Немате дозволу за мењање ове CSS странице.", - "mycustomjsonprotected": "Немате дозволу за мењање ове JSON странице.", - "mycustomjsprotected": "Немате дозволу за мењање ове JavaScript странице.", - "myprivateinfoprotected": "Немате дозволу за мењање ваших личних информација.", - "mypreferencesprotected": "Немате дозволу за мењање ваших подешавања.", + "mycustomcssprotected": "Немате дозволу да уређујете ову CSS страницу.", + "mycustomjsonprotected": "Немате дозволу да уређујете ову JSON страницу.", + "mycustomjsprotected": "Немате дозволу да уређујете ову страницу с јаваскриптом.", + "myprivateinfoprotected": "Немате дозволу да уређујете своје приватне информације.", + "mypreferencesprotected": "Немате дозволу да уређујете своја подешавања.", "ns-specialprotected": "Посебне странице се не могу уређивати.", "titleprotected": "Овај назив је [[User:$1|$1]] заштитио од прављења. Разлог: $2.", "filereadonlyerror": "Не могу да изменим датотеку „$1“ јер је ризница „$2“ у режиму за читање.\n\nСистемски администратор је навео следеће објашњење: „$3“.", - "invalidtitle-knownnamespace": "Неисправан наслов с именским простором „$2“ и текстом „$3“", - "invalidtitle-unknownnamespace": "Неисправан наслов с именским простором бр. $1 и текстом „$2“", + "invalidtitle": "Неважећи наслов", + "invalidtitle-knownnamespace": "Неважећи наслов са именским простором „$2“ и текстом „$3“", + "invalidtitle-unknownnamespace": "Неважећи наслов са непознатим именским простором бр. $1 и текстом „$2“", "exception-nologin": "Нисте пријављени", "exception-nologin-text": "Пријавите се да бисте приступили овој страници или радњи.", "exception-nologin-text-manual": "Морате бити $1 да бисте приступили овој страници или радњи.", - "virus-badscanner": "Неисправно подешавање: непознати скенер за вирусе: $1", - "virus-scanfailed": "неуспешно скенирање (код $1)", + "virus-badscanner": "Лоша конфигурација: непознати скенер за вирусе: $1", + "virus-scanfailed": "скенирање није успело (код $1)", "virus-unknownscanner": "непознати антивирус:", - "logouttext": "Сада сте одјављени.\n\nЗапамтите да неке странице могу да наставе да се приказују као да сте још увек пријављени, док не очистите привремену меморију свог прегледача.", + "logouttext": "Сада сте одјављени.\n\nЗапамтите да неке странице могу наставити да се приказују као да сте још увек пријављени, све док не очистите кеш свог прегледача.", "cannotlogoutnow-title": "Одјава тренутно није могућа", "cannotlogoutnow-text": "Одјава није могућа током употребе $1.", "welcomeuser": "Добро дошли, $1!", - "welcomecreation-msg": "Ваш налог је отворен.\nНе заборавите да промените своја [[Special:Preferences|подешавања]].", + "welcomecreation-msg": "Ваш налог је отворен.\nМожете да промените своја [[Special:Preferences|подешавања]] на пројекту {{SITENAME}} ако желите.", "yourname": "Корисничко име:", "userlogin-yourname": "Корисничко име", "userlogin-yourname-ph": "Унесите своје корисничко име", @@ -428,36 +429,36 @@ "cannotlogin-text": "Пријава није могућа", "cannotloginnow-title": "Пријава тренутно није могућа", "cannotloginnow-text": "Пријава није могућа када се користи $1.", - "cannotcreateaccount-title": "Отварање налога није могуће", + "cannotcreateaccount-title": "Не могу да отворим налоге", "cannotcreateaccount-text": "Директно прављење налога није омогућено на овом викију.", "yourdomainname": "Домен:", "password-change-forbidden": "Не можете да промените лозинку на овом викију.", - "externaldberror": "Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате свој спољни налог.", + "externaldberror": "Дошло је до грешке при потврди идентитета базе података или вам није дозвољено да ажурирате свој спољни налог.", "login": "Пријави ме", - "login-security": "Верификација вашег индентитета", + "login-security": "Потврда вашег индентитета", "nav-login-createaccount": "Пријава/регистрација", "logout": "Одјава", "userlogout": "Одјава", "notloggedin": "Нисте пријављени", "userlogin-noaccount": "Немате налог?", "userlogin-joinproject": "Придружите се пројекту {{SITENAME}}", - "createaccount": "Отвори налог", + "createaccount": "Отварање налога", "userlogin-resetpassword-link": "Заборавили сте лозинку?", "userlogin-helplink2": "Помоћ при пријављивању", "userlogin-loggedin": "Већ сте пријављени као {{GENDER:$1|$1}}.\nКористите доњи образац да бисте се пријавили као други корисник.", - "userlogin-reauth": "Морате се поново пријавити да би верификовали да сте {{GENDER:$1|$1}}.", + "userlogin-reauth": "Морате да се поново пријавите да бисте потврдили да сте {{GENDER:$1|$1}}.", "userlogin-createanother": "Отвори још један налог", - "createacct-emailrequired": "Имејл адреса", - "createacct-emailoptional": "Имејл адреса (необавезно)", - "createacct-email-ph": "Унесите своју имејл адресу", - "createacct-another-email-ph": "Унесите имејл адресу", - "createaccountmail": "Користите привремену, случајно створену лозинку и пошаљите на наведену имејл адресу", - "createaccountmail-help": "Може се користити да се некоме направи налог без сазнања лозинке.", - "createacct-realname": "Право име (необавезно)", + "createacct-emailrequired": "Имејл-адреса", + "createacct-emailoptional": "Имејл-адреса (опционално)", + "createacct-email-ph": "Унесите своју имејл-адресу", + "createacct-another-email-ph": "Унесите имејл-адресу", + "createaccountmail": "Користите привремену, случајну лозинку и пошаљите је на наведену имејл-адресу", + "createaccountmail-help": "Може се користити да се некоме отвори налог без сазнања лозинке.", + "createacct-realname": "Право име (опционално)", "createacct-reason": "Разлог", "createacct-reason-ph": "Зашто правите још један налог?", - "createacct-reason-help": "Порука која се приказује у дневнику стварања корисничких налога", - "createacct-submit": "Отвори налог", + "createacct-reason-help": "Порука која се приказује у евиденцији прављења корисничких налога", + "createacct-submit": "Отвори свој налог", "createacct-another-submit": "Отвори налог", "createacct-continue-submit": "Наставите отварање налога", "createacct-another-continue-submit": "Наставите отварање налога", @@ -467,7 +468,7 @@ "createacct-benefit-body3": "недавно {{PLURAL:$1|активни корисник|активна корисника|активних корисника}}", "badretype": "Унете лозинке се не поклапају.", "usernameinprogress": "Налог за ово корисничко име се већ прави, сачекајте.", - "userexists": "Корисничко име је заузето. Изаберите друго.", + "userexists": "Унесено корисничко име је већ у употреби.\nОдаберите друго.", "loginerror": "Грешка при пријављивању", "createacct-error": "Дошло је до грешке при отварању налога", "createaccounterror": "Не могу да отворим налог: $1.", @@ -476,57 +477,57 @@ "nocookiesfornew": "Кориснички налог није отворен јер његов извор није потврђен.\nОмогућите колачиће на прегледачу и поново учитајте страницу.", "nocookiesforlogin": "{{int:nocookieslogin}}", "createacct-loginerror": "Налог је успешно направљен, али се не можете аутоматски пријавити. Пређите на [[Special:UserLogin|ручно пријављивање]].", - "noname": "Унели сте неисправно корисничко име.", + "noname": "Нисте навели важеће корисничко име.", "loginsuccesstitle": "Успешно пријављивање", "loginsuccess": "Пријављени сте на {{SITENAME}} као „$1”.", "nosuchuser": "Не постоји корисник с именом „$1“.\nКорисничка имена су осетљива на мала и велика слова.\nПроверите да ли сте га добро унели или [[Special:CreateAccount|отворите нови налог]].", "nosuchusershort": "Корисник с именом „$1“ не постоји.\nПроверите да ли сте правилно написали.", "nouserspecified": "Морате навести корисничко име.", "login-userblocked": "{{GENDER:$1|Овај корисник је блокиран|Ова корисница је блокирана|Овај корисник је блокиран}}. Пријава није дозвољена.", - "wrongpassword": "Унели сте неисправно корисничко име или лозинку. Покушајте поново.", + "wrongpassword": "Унели сте неисправно корисничко име или лозинку.\nПокушајте поново.", "wrongpasswordempty": "Нисте унели лозинку. Покушајте поново.", "passwordtooshort": "Лозинка мора имати најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}.", "passwordtoolong": "Лозинке не могу бити дуже од {{PLURAL:$1|$1 знака|$1 знакова}}.", - "passwordtoopopular": "Често изабране лозинке не могу да се користе. Изаберите лозинку коју је теже погодити.", + "passwordtoopopular": "Често одабране лозинке не могу да се користе. Одаберите лозинку коју је теже погодити.", "password-name-match": "Лозинка се мора разликовати од корисничког имена.", "password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.", "mailmypassword": "Ресетуј лозинку", "passwordremindertitle": "{{SITENAME}} — привремена лозинка", "passwordremindertext": "Неко са IP адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.", - "noemail": "Не постоји имејл адреса за {{GENDER:$1|корисника|корисницу}} $1.", - "noemailcreate": "Морате навести исправну имејл адресу.", - "passwordsent": "Нова лозинка је послата на имејл адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.", - "blocked-mailpassword": "Ваша IP адреса има забрану уређивања. Ради спречавања злоупотребе, није дозвољено враћање лозинке са ње.", - "eauthentsent": "На наведену имејл адресу је послат потврдни код.\nПре него што пошаљемо даљње поруке, пратите упутства с имејла да бисте потврдили да сте Ви отворили налог.", + "noemail": "Не постоји имејл-адреса за {{GENDER:$1|корисника|корисницу}} $1.", + "noemailcreate": "Морате да наведете важећу имејл-адресу.", + "passwordsent": "Нова лозинка је послата на имејл-адресу {{GENDER:$1|корисника|кориснице}} $1.\nПоново се пријавите након што је примите.", + "blocked-mailpassword": "Уређивање са ваше IP адресе је блокирано. Ради спречавања злоупотребе, забрањена је и функција враћања лозинке са ње.", + "eauthentsent": "Имејл о потврди је послат на наведену имејл-адресу.\nПре било којих других слања имејлова на налог, мораћете пратити упутства у имејлу да бисте потврдили да је налог заиста ваш.", "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.", "mailerror": "Грешка при слању поруке: $1", "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу IP адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове IP адресе тренутно не могу отворити више налога.", - "emailauthenticated": "Ваша имејл адреса је потврђена на дан $2 у $3.", - "emailnotauthenticated": "Ваша имејл адреса још увек није потврђена.\nИмејл неће бити послат ни у једном од следећих случајева.", - "noemailprefs": "Наведите имејл адресу у својим подешавањима за рад ових могућности.", - "emailconfirmlink": "Потврдите своју имејл адресу", - "invalidemailaddress": "Имејл адреса не може бити прихваћена јер је неисправног облика.\nУнесите исправну адресу или оставите празно поље.", - "cannotchangeemail": "На овом викију не можете променити имејл адресу налога.", + "emailauthenticated": "Ваша имејл-адреса је потврђена на дан $2 у $3 ч.", + "emailnotauthenticated": "Ваша имејл-адреса још није потврђена.\nНиједан имејл неће да буде послат ни у једном од следећих случајева.", + "noemailprefs": "Наведите имејл-адресу у својим подешавањима за оспособљавање ових могућности.", + "emailconfirmlink": "Потврдите своју имејл-адресу", + "invalidemailaddress": "Имејл-адреса не може да буде прихваћена јер је у неважећем облику.\nУнесите исправну адресу или оставите празно поље.", + "cannotchangeemail": "Имејл-адресе налога не могу да се промене на овом викију.", "emaildisabled": "Овај сајт не може да шаље имејлове.", "accountcreated": "Налог је отворен", "accountcreatedtext": "Кориснички налог [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) је отворен.", "createaccount-title": "Отварање корисничког налога за {{SITENAME}}", - "createaccount-text": "Неко је отворио налог с вашом имејл адресом на {{SITENAME}} ($4) под именом $2 и лозинком $3.\nПријавите се и промените своју лозинку.\n\nАко је ово грешка, занемарите ову поруку.", - "login-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.", + "createaccount-text": "Неко је отворио налог са вашом имејл-адресом на пројекту {{SITENAME}} ($4) под именом „$2“ и са лозинком „$3“.\nОдмах требате да се пријавите и промените своју лозинку.\n\nМожете да занемарите ову поруку, ако је овај налог отворен грешком.", + "login-throttled": "Превише пута сте покушали да се пријавите.\nСачекајте $1 пре него што покушате поново.", "login-abort-generic": "Неуспешна пријава – прекинуто", "login-migrated-generic": "Ваш налог је мигриран и ваше корисничко више не постоји на овом викију.", "loginlanguagelabel": "Језик: $1", - "suspicious-userlogout": "Ваш захтев за одјаву је одбијен јер је послат од стране неисправног прегледача или посредника.", - "createacct-another-realname-tip": "Право име није обавезно.\nАко изаберете да га унесете, оно ће бити коришћено за приписивање вашег рада.", + "suspicious-userlogout": "Ваш захтев за одјаву је одбијен јер изгледа да га је послао покварени прегледач или кеширани посредник.", + "createacct-another-realname-tip": "Право име је опционално.\nАко одаберете да га наведете, биће коришћено за приписивање вашег рада.", "pt-login": "Пријави ме", "pt-login-button": "Пријави ме", "pt-login-continue-button": "Настави пријављивање", "pt-createaccount": "Отвори налог", "pt-userlogout": "Одјави ме", "php-mail-error-unknown": "Непозната грешка у функцији PHP mail().", - "user-mail-no-addy": "Покушали сте да пошаљете имејл без имејл адресе.", + "user-mail-no-addy": "Покушали сте да пошаљете имејл без имејл-адресе.", "user-mail-no-body": "Покушано слање имејла с празним или неразумно кратким садржајем.", - "changepassword": "Промени лозинку", + "changepassword": "Промена лозинке", "resetpass_announce": "Да бисте завршили пријаву, подесите нову лозинку овде.", "resetpass_text": "", "resetpass_header": "Промена лозинке налога", @@ -535,13 +536,13 @@ "retypenew": "Потврда лозинке:", "resetpass_submit": "Постави лозинку и пријави ме", "changepassword-success": "Ваша лозинка је успешно промењена!", - "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.", + "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nСачекајте $1 пре него што покушате поново.", "botpasswords": "Лозинке ботова", "botpasswords-disabled": "Лозинке ботова су онемогућене.", "botpasswords-no-central-id": "Да би сте користили ботовске лозинке, морате бити пријављени на средишњи налог.", "botpasswords-existing": "Постојећа лозинка бота", "botpasswords-createnew": "Направи нову лозинку за бота", - "botpasswords-editexisting": "Измени постојећу лозинку за бота", + "botpasswords-editexisting": "Уреди постојећу лозинку бота", "botpasswords-label-needsreset": "(лозинку треба ресетовати)", "botpasswords-label-appid": "Име бота:", "botpasswords-label-create": "Направи", @@ -552,8 +553,8 @@ "botpasswords-label-grants": "Применљиве дозволе:", "botpasswords-label-grants-column": "Одобрено", "botpasswords-bad-appid": "Име бота „$1” није валидно.", - "botpasswords-insert-failed": "Неуспешно додавање бота \"$1\". Да ли је већ додат?", - "botpasswords-update-failed": "Није могуће ажурирати бота \"$1\". Да ли је обрисан?", + "botpasswords-insert-failed": "Неуспело додавање бота под именом „$1”. Можда је већ додат?", + "botpasswords-update-failed": "Неуспело ажурирање бота под називом „$1”. Да ли је обрисан?", "botpasswords-created-title": "Направљена лозинка бота", "botpasswords-created-body": "Лозинка за бота „$1” корисника „$2” је направљена.", "botpasswords-updated-title": "Лозинка бота промењена", @@ -568,97 +569,97 @@ "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-abort-generic": "Промену лозинке је прекинуо додатак.", "resetpass-expired": "Ваша лозинка је истекла. Поставите нову лозинку да бисте се пријавили.", "resetpass-expired-soft": "Ваша лозинка је истекла и морате је променити. Поставите нову лозинку или кликните „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.", - "resetpass-validity-soft": "Ваша лозинка није исправна: $1\n\nМолимо изаберите нову или кликните „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.", - "passwordreset": "Обнављање лозинке", + "resetpass-validity-soft": "Ваша лозинка није важећа: $1\n\nИзаберите нову одмах или кликните на „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.", + "passwordreset": "Ресетовање лозинке", "passwordreset-text-one": "Попуните овај образац да бисте добили привремену лозинку на имејл.", "passwordreset-text-many": "{{PLURAL:$1|Испуните једно од поља како бисте добили привремену лозинку на имејл.}}", - "passwordreset-disabled": "Обнављање лозинке је онемогућено на овом викију.", + "passwordreset-disabled": "Ресетовање лозинке је онемогућено на овом викију.", "passwordreset-emaildisabled": "Имејл је онемогућен на овом викију.", "passwordreset-username": "Корисничко име:", "passwordreset-domain": "Домен:", - "passwordreset-email": "Имејл адреса:", + "passwordreset-email": "Имејл-адреса:", "passwordreset-emailtitle": "Детаљи налога на викију {{SITENAME}}", - "passwordreset-emailtext-ip": "Неко (вероватно Ви, са 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-emailtext-ip": "Неко (вероватно ви, са IP адресе $1) затражио је ресетовање ваше \nлозинке за пројекат {{SITENAME}} ($4). Следећи кориснички {{PLURAL:$3|налог је повезан|налози су повезани}} \nса овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Ова привремена лозинка|Ове привремене лозинке}} ће истећи за {{PLURAL:$5|један дан|$5 дана}}.\nОдмах требате да се пријавите и одаберите нову лозинку. Ако је неко други направио овај \nзахтев или сте се сетили своје првобитне лозинке, а не \nжелите да је промените, можете да занемарите ову поруку и наставите да користите своју стару \nлозинку.", + "passwordreset-emailtext-user": "{{GENDER:$1|Корисник је затражио|Корисница је затражила}} подсетник о подацима за пријаву на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} са овом имејл-адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.", "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2", - "passwordreset-emailsentemail": "Ако је ово имејл адреса повезана са Вашим налогом, подсетник о лозинци ће бити послат на имејл.", - "passwordreset-emailsentusername": "Ако сте навели имејл адресу приликом регистрације, биће послат имејл за ресетовање лозинке.", + "passwordreset-emailsentemail": "Ако је ова имејл-адреса повезана са вашим налогом, онда ће имејл о ресетовању лозинке бити послат.", + "passwordreset-emailsentusername": "Ако постоји имејл-адреса повезана са овим корисничким именом, онда ће имејл о ресетовању лозинке бити послат.", "passwordreset-nocaller": "Позивалац се мора навести", "passwordreset-nosuchcaller": "Позивалац не постоји: $1", "passwordreset-ignored": "Ресетовање лозинке није успело. Можда послужилац није конфигурисан?", - "passwordreset-invalidemail": "Неисправна имејл адреса", + "passwordreset-invalidemail": "Неважећа имејл-адреса", "passwordreset-nodata": "Корисничко име и адреса е-поште нису наведени", - "changeemail": "Промена или уклањање имејл адресе", - "changeemail-header": "Попуните овај образац да би сте променили Вашу имејл адресу. Ако жели да ускратите приступ било којој имејл адреси Вашем налогу, оставите празно поље за нову имејл адресу приликом попуњавање обрасца.", + "changeemail": "Промена или уклањање имејл-адресе", + "changeemail-header": "Попуните овај образац да би сте променили вашу имејл-адресу. Ако бисте желели да уклоните повезаност било које имејл-адресе са вашег налога, оставите празно поље за нову имејл-адресу када шаљете образац.", "changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.", - "changeemail-oldemail": "Тренутна имејл адреса:", + "changeemail-oldemail": "Актуелна имејл-адреса:", "changeemail-newemail": "Нова имејл адреса:", "changeemail-none": "(ништа)", - "changeemail-password": "Ваша лозинка:", + "changeemail-password": "Ваша лозинка за пројекат {{SITENAME}}:", "changeemail-submit": "Промени имејл", "changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.", "changeemail-nochange": "Унесите другу имејл адресу.", - "resettokens": "Ресетовање жетона", - "resettokens-text": "Можете поново поставити жетоне који ће вам омогућити приступ одређеним приватним подацима повезаним са вашим налогом овде.\n\nТребали бисте то да урадите ако их мимо воље поделите с неким или ако је ваш налог угрожен.", + "resettokens": "Ресетовање токена", + "resettokens-text": "Можете поново поставити жетоне који ће вам омогућити приступ одређеним приватним подацима повезаним са вашим налогом овде.\n\nТребали бисте то да урадите ако их мимо воље поделите са неким или ако је ваш налог угрожен.", "resettokens-no-tokens": "Нема жетона за ресетовање.", "resettokens-tokens": "Жетони:", "resettokens-token-label": "$1 (тренутна вредност: $2)", - "resettokens-watchlist-token": "Жетон за веб довод (Atom/RSS) [[Special:Watchlist|измена на страницама у вашем списку надгледања]]", + "resettokens-watchlist-token": "Токен за веб-фид (Atom/RSS) [[Special:Watchlist|промена на страницама у вашем списку надгледања]]", "resettokens-done": "Жетони су ресетовани", "resettokens-resetbutton": "Ресетуј изабране жетоне", "bold_sample": "Подебљан текст", "bold_tip": "Подебљан текст", "italic_sample": "Искошен текст", "italic_tip": "Искошен текст", - "link_sample": "Наслов везе", - "link_tip": "Унутрашња веза", - "extlink_sample": "http://www.example.com/ наслов везе", + "link_sample": "Наслов линка", + "link_tip": "Унутрашњи линк", + "extlink_sample": "http://www.example.com/ наслов линка", "extlink_tip": "Спољашња веза (с префиксом http://)", "headline_sample": "Текст наслова", "headline_tip": "Поднаслов (ниво 2)", - "nowiki_sample": "Убаците необликован текст овде", + "nowiki_sample": "Овде уметните необликован текст", "nowiki_tip": "Занемари вики обликовање", "image_sample": "Пример.jpg", "image_tip": "Уграђивање датотеке", "media_sample": "Пример.ogg", - "media_tip": "Веза", - "sig_tip": "Ваш потпис са тренутним временом", + "media_tip": "Линк до датотеке", + "sig_tip": "Ваш потпис са временском ознаком", "hr_tip": "Водоравна линија (користите ретко)", - "summary": "Опис измене:", + "summary": "Резиме:", "subject": "Тема:", "minoredit": "Ово је мања измена", "watchthis": "Надгледај ову страницу", "savearticle": "Сачувај страницу", - "savechanges": "Сачувај измене", + "savechanges": "Сачувај промене", "publishpage": "Објави страницу", - "publishchanges": "Објави измене", + "publishchanges": "Објави промене", "savearticle-start": "Сачувај страницу...", - "savechanges-start": "Сачувај измене...", + "savechanges-start": "Сачувај промене...", "publishpage-start": "Објави страницу...", - "publishchanges-start": "Објави измене...", + "publishchanges-start": "Објави промене...", "preview": "Претпреглед", "showpreview": "Прикажи претпреглед", - "showdiff": "Прикажи измене", + "showdiff": "Прикажи промене", "blankarticle": "Упозорење: Страница коју правите је празна.\nАко још једном притиснете „$1”, страница ће бити направљена без икаквог садржаја.", - "anoneditwarning": "Упозорење: Нисте пријављени. Ако објавите страницу, Ваша IP адреса ће бити јавно видљива у њеној историји измена и другде. Ако се [$1 пријавите] или [$2 отворите налог], поред осталих погодности које добијате Ваше измене ће бити приписиване Вашем корисничком имену.", - "anonpreviewwarning": "Нисте пријављени. Ако објавите страницу, Ваша IP адреса ће бити јавно видљива у њеној историји измена и другде.", - "missingsummary": "Подсетник: Нисте унели опис измене.\nАко поново кликнете на „$1”, Ваша измена ће бити сачувана без описа.", + "anoneditwarning": "Упозорење: Нисте пријављени. Ако објавите страницу, ваша IP адреса ће бити јавно видљива у њеној историји измена и другде. Ако се [$1 пријавите] или [$2 отворите налог], поред осталих погодности које добијате ваше измене ће бити приписиване вашем корисничком имену.", + "anonpreviewwarning": "Нисте пријављени. Ако објавите страницу, ваша IP адреса ће бити јавно видљива у њеној историји измена и другде.", + "missingsummary": "Подсетник: нисте навели резиме измене.\nАко поново кликнете на „$1”, ваша измена ће бити сачувана без резимеа.", "selfredirect": "Упозорење: Преусмеравате ову страницу на њу саму.\nМожда вам је одредишна страница за преусмерење погрешна или уређујете погрешну страницу.\nАко још једном притиснете „$1”, преусмерење ће свеједно бити направљено.", "missingcommenttext": "Молимо унесите коментар.", "missingcommentheader": "Напомена: Нисте унели наслов теме овог коментара.\nАко поново кликнете на „$1”, измена ће бити сачувана без наслова.", - "summary-preview": "Преглед описа измене:", + "summary-preview": "Преглед резимеа измене:", "subject-preview": "Преглед теме:", - "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.", + "previewerrortext": "Дошло је до грешке при покушају прегледа промена.", "blockedtitle": "Корисник је блокиран", - "blockedtext": "Ваше корисничко име или IP адреса је блокирана.\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је $2.\n\n* Почетак блокирања: $8\n* Истек блокирања: $6\n* Блокирани: $7\n\nМожете да се обратите {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] ради дискусије о блокирању.\nНе можете да користите могућност „{{int:emailuser}}” осим ако сте унели валидну имејл адресу у својим [[Special:Preferences|подешавањима]] налога и нисте блокирани од коришћења исте.\nВаша тренутна IP адреса је $3, а ID блокирања #$5.\nНаведите све информације одозго при стварању било каквих упита.", - "autoblockedtext": "Ваша IP адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:$2\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „{{int:emailuser}}“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана IP адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.", + "blockedtext": "Ваше корисничко име или IP адреса је блокирана.\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је $2.\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Блокирани корисник: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте разговарали о блокади.\nНе можете да користите могућност „{{int:emailuser}}” осим ако сте навели ваљану имејл адресу у својим [[Special:Preferences|подешавањима налога]] и нисте блокирани од коришћења исте.\nВаша актуелна IP адреса је $3, а ID блокаде #$5.\nУкључите све горње детаље при прављењу било каквих упита.", + "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:$2\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите могућност „{{int:emailuser}}“ осим ако сте навели ваљану имејл адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша актуелна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.", "blockednoreason": "разлог није наведен", "whitelistedittext": "За уређивање странице је потребно да будете $1.", "confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].", @@ -673,12 +674,12 @@ "newarticletext": "Дошли сте на страницу која још не постоји.\nДа бисте је направили, почните да куцате у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.", "anontalkpagetext": "----\nОво је страница за разговор с анонимним корисником који још нема налог или га не користи.\nЗбог тога морамо да користимо бројчану IP адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:CreateAccount|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.", "noarticletext": "На овој страници тренутно нема текста.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} направити ову страницу].", - "noarticletext-nopermission": "На овој страници тренутно нема текста.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама или [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне дневнике], али немате дозволу да направите ову страницу.", - "missing-revision": "Не могу да пронађем измену бр. $1 на страници под називом „{{FULLPAGENAME}}“.\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].", + "noarticletext-nopermission": "Тренутно нема текста на овој страници.\nМожете да [[Special:Search/{{PAGENAME}}|потражите овај наслов странице]] на другим страницама или [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражите сродне евиденције], али немате дозволу да направите ову страницу.", + "missing-revision": "Ревизија бр. $1 на страници под именом „{{FULLPAGENAME}}“ не постоји.\n\nОво се обично дешава када пратите застарели линк до странице која је обрисана.\nВише информација можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} евиденцији брисања].", "userpage-userdoesnotexist": "Кориснички налог „$1“ није отворен.\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* Опера: Идите на Алатке → Подешавања (Опера → Подешавања на Меку) и затим Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке.", + "blocked-notice-logextract": "Овај корисник је тренутно блокиран.\nПоследњи унос у евиденцији блокирања је наведен испод као референца:", + "clearyourcache": "Напомена: Након чувања, можда ћете морати да очистите кеш прегледача како бисте видели промене.\n* Фајерфокс / Сафари: Држите Shift и кликните на Освежи или притисните Ctrl-F5 или Ctrl-R (⌘-R на Меку)\n* Гугл кроум: Притисните Ctrl-Shift-R (⌘-Shift-R на Меку)\n* Интернет експлорер: Држите Ctrl и кликните на Освежи или притисните Ctrl-F5\n* Опера: Идите на Алатке → Подешавања (Опера → Подешавања на Меку) и затим Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке.", "usercssyoucanpreview": "Савет: кориситите дугме „{{int:showpreview}}“ да испробате свој нови CSS пре него што га сачувате.", "userjsyoucanpreview": "Савет: кориситите дугме „{{int:showpreview}}“ да испробате свој нови јаваскрипт пре него што га сачувате.", "usercsspreview": "Ово је само преглед CSS-а.\nСтраница још није сачувана!", @@ -688,12 +689,12 @@ "userinvalidconfigtitle": "Упозорење: не постоји тема „$1“.\nПрилагођене странице CSS, JSON и Јаваскрипт почињу малим словом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.", "updated": "(ажурирано)", "note": "Напомена:", - "previewnote": "Не заборавите да је ово само претпреглед.\nВаше измене још нису сачуване!", + "previewnote": "Не заборавите да је ово само претпреглед.\nВаше промене још нису сачуване!", "continue-editing": "Иди на уређивачки оквир", "previewconflict": "Овај преглед осликава како ће изгледати текст у текстуалном оквиру.", - "session_fail_preview": "Извињавамо се! Нисмо могли да обрадимо Вашу измену због губитка података сесије.\n\nМожда сте одјављени. Проверите да ли сте пријављени и покушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите, те проверите да ли су на Вашем претраживачу дозвољени колачићи са овог сајта.", - "session_fail_preview_html": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\nБудући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.\n\nАко сте покушали да направите праву измену, покушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли Ваш прегледач дозвољава колачиће са овог сајта.", - "token_suffix_mismatch": "Ваша измена је одбачена јер је ваш прегледач убацио знакове интерпункције у новчић уређивања.\nТо се понекад догађа када се користи неисправан посредник.", + "session_fail_preview": "Извињавамо се! Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\nМожда сте одјављени. Проверите да ли сте пријављени и покушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите, те проверите да ли су на вашем претраживачу дозвољени колачићи са овог сајта.", + "session_fail_preview_html": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\nБудући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.\n\nАко сте покушали да направите праву измену, покушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли ваш прегледач дозвољава колачиће са овог сајта.", + "token_suffix_mismatch": "Ваша измена је одбијена јер је ваш клијент убацио знакове интерпункције у токен уређивања.\nИзмена је одбијена ради спречавања уништавања текста странице.\nОво се понекад догађа када користите проблематични анонимни посредник који је заснован на вебу.", "edit_form_incomplete": "Неки делови обрасца за уређивање нису стигли до сервера. Проверите да ли су ваше измене непромењене и покушајте поново.", "editing": "Уређујете $1", "creating": "Прављење странице $1", @@ -702,19 +703,19 @@ "editconflict": "Сукобљене измене: $1", "explainconflict": "Неко други је у међувремену променио ову страницу.\nГорњи оквир садржи садашњи текст странице.\nВаше измене су приказане у доњем оквиру.\nМораћете да унесете своје промене у садашњи текст странице.\nСамо ће текст у горњем оквиру за уређивање бити сачуван када кликнете на „$1”.", "yourtext": "Ваш текст", - "storedversion": "Ускладиштена измена", - "editingold": "Упозорење: уређујете застарелу измену ове странице.\nАко је сачувате, све новије измене ће бити изгубљене.", + "storedversion": "Ускладиштена ревизија", + "editingold": "Упозорење: уређујете застарелу ревизију ове странице.\nАко је сачувате, све промене направљене од ове ревизије ће бити изгубљене.", "unicode-support-fail": "Ваш прегледач не подржава Unicode. Он је неопоходан за уређивање страница, па зато не могу сачувати измену.", "yourdiff": "Разлике", - "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.
    \nИсто тако обећавате да сте Ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\nНе шаљите радове заштићене ауторским правима без дозволе!", + "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.
    \nИсто тако обећавате да сте Ви аутор текста, или да сте га умножили са извора који је у јавном власништву.\nНе шаљите радове заштићене ауторским правима без дозволе!", "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.
    \nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\nНе шаљите радове заштићене ауторским правима без дозволе!", "editpage-cannot-use-custom-model": "Модел садржаја ове странице се не може променити.", "longpageerror": "Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.\nСтраница не може бити сачувана.", "readonlywarning": "Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nСистемски администратор је навео следеће објашњење: $1", - "protectedpagewarning": "Упозорење: ова страница је заштићена, тако да само корисници с администраторским овлашћењима могу да је мењају.\nПоследњи запис у дневнику је приказан испод као референца:", - "semiprotectedpagewarning": "Напомена: ова страница је заштићена, тако да само аутоматски потврђени корисници могу да је уређују.\nПоследњи запис у дневнику је приказан испод као референца:", - "cascadeprotectedwarning": "Упозорење: Ова страница је заштићена тако да је могу уређивати само корисници са [[Special:ListGroupRights|одређеним правима]] (администратори), јер је иста укључена у {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом” заштитом:", - "titleprotectedwarning": "Упозорење: ова страница је заштићена, тако да су потребна [[Special:ListGroupRights|посебна правима]] да се она направи.\nПоследњи запис у дневнику је приказан испод као референца:", + "protectedpagewarning": "Упозорење: Ова страница је заштићена, тако да само корисници са администраторским овлашћењима могу да је уређују.\nНајновији унос у евиденцији је наведен испод као референца:", + "semiprotectedpagewarning": "Напомена: Ова страница је заштићена, тако да само аутоматски потврђени корисници могу да је уређују.\nНајновији унос у евиденцији је наведен испод као референца:", + "cascadeprotectedwarning": "Упозорење: Ова страница је заштићена, тако да само корисници са [[Special:ListGroupRights|одређеним правима]] могу да је уређују, јер је она укључена у {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} преносивом заштитом:", + "titleprotectedwarning": "Упозорење: Ова страница је заштићена, тако да су потребна [[Special:ListGroupRights|посебна права]] да се она направи.\nНајновији унос у евиденцији је наведен испод као референца:", "templatesused": "{{PLURAL:$1|Шаблон који се користи|Шаблони који се користе}} на овој страници:", "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} у овом претпрегледу:", "templatesusedsection": "{{PLURAL:$1|Шаблон|Шаблони}} у овом одељку:", @@ -728,17 +729,17 @@ "sectioneditnotsupported-title": "Уређивање одељка није подржано", "sectioneditnotsupported-text": "Уређивање одељка није подржано на овој страници.", "permissionserrors": "Грешка у дозволи", - "permissionserrorstext": "Немате овлашћење за ову радњу из {{PLURAL:$1|1=следећег|следећих}} разлога:", - "permissionserrorstext-withaction": "Немате дозволу за $2 из {{PLURAL:$1|следећег|следећих}} разлога:", - "contentmodelediterror": "Не можете уредити ову измену јер је њен модел садржаја $1, што се разликује од тренутног модела садржаја странице $2.", - "recreate-moveddeleted-warn": "Упозорење: поново правите страницу која је претходно обрисана.\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:", - "moveddeleted-notice": "Ова страница је обрисана.\nДневник брисања, заштите и премештања странице налази се испод.", - "moveddeleted-notice-recent": "Жао нам је, ова страница је недавно обрисана (у последњих 24 сата).\nИсторија њеног брисања, заштите и премештања налази се испод:", - "log-fulllog": "Погледај целу историју", + "permissionserrorstext": "Немате дозволу за ову радњу из {{PLURAL:$1|следећег|следећих}} разлога:", + "permissionserrorstext-withaction": "Немате дозволу да $2 из {{PLURAL:$1|следећег|следећих}} разлога:", + "contentmodelediterror": "Не можете уредити ову ревизију јер је њен модел садржаја $1, што се разликује од актуелног модела садржаја странице $2.", + "recreate-moveddeleted-warn": "Упозорење: поново правите страницу која је претходно обрисана.\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена евиденција брисања и премештања с образложењем:", + "moveddeleted-notice": "Ова страница је обрисана.\nЕвиденција брисања, заштите и премештања странице је наведена испод као референца.", + "moveddeleted-notice-recent": "Жао нам је, ова страница је недавно обрисана (у последњих 24 сата).\nЕвиденција њеног брисања, заштите и премештања налази се испод:", + "log-fulllog": "Погледај целу евиденцију", "edit-hook-aborted": "Измену је прекинула кука.\nНије дато никакво образложење.", "edit-gone-missing": "Не могу да ажурирам страницу.\nИзгледа да је обрисана.", "edit-conflict": "Сукоб измена.", - "edit-no-change": "Ваша измена је занемарена јер није било никаквих измена у тексту.", + "edit-no-change": "Ваша измена је занемарена јер није било никаквих промена у тексту.", "postedit-confirmation-created": "Страница је направљена.", "postedit-confirmation-restored": "Страница је враћена.", "postedit-confirmation-saved": "Ваша измена је сачувана.", @@ -746,7 +747,7 @@ "edit-already-exists": "Не могу да направим страницу.\nИзгледа да она већ постоји.", "defaultmessagetext": "Подразумевани текст поруке", "content-failed-to-parse": "Не могу да рашчланим садржај типа $2 за модел $1: $3", - "invalid-content-data": "Неисправни подаци садржаја", + "invalid-content-data": "Неважећи подаци садржаја", "content-not-allowed-here": "Садржај модела „$1“ није дозвољен на страници [[$2]]", "editwarning-warning": "Ако напустите ову страницу, изгубићете све измене које сте направили. Ако сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „{{int:prefs-editing}}“.", "editpage-invalidcontentmodel-title": "Модел садржаја није подржан", @@ -764,14 +765,14 @@ "duplicate-args-warning": "Упозорење: [[:$1]] позива [[:$2]] са више од једне вредности за параметар „$3“. Само последња наведена вредност ће бити коришћена.", "duplicate-args-category": "Странице с дуплираним аргументима код позива шаблона", "duplicate-args-category-desc": "Страница садржи позиве шаблона који користе двоструке аргументе, као што су {{foo|bar=1|bar=2}} или {{foo|bar|1=baz}}.", - "expensive-parserfunction-warning": "Упозорење: ова страница садржи превише позива за рашчлањивање.\n\nТребало би да има мање од $2 {{PLURAL:$2|позив|позива}}, а сада има $1.", + "expensive-parserfunction-warning": "Упозорење: Ова страница садржи превише позива оптерећујућих функција за рашчлањивање.\n\nТребало би да има мање од $2 {{PLURAL:$2|позив|позива}}, а сада има $1.", "expensive-parserfunction-category": "Странице с превише позива за рашчлањивање", "post-expand-template-inclusion-warning": "Упозорење: величина обухваћеног шаблона је превелика.\nНеки шаблони неће бити обухваћени.", "post-expand-template-inclusion-category": "Странице где су обухваћени превелики шаблони", - "post-expand-template-argument-warning": "'''Упозорење:''' ова страница садржи најмање један аргумент у шаблону који има превелику величину.\nОвакве аргументе би требало избегавати.", + "post-expand-template-argument-warning": "'''Упозорење:''' Ова страница садржи најмање један аргумент у шаблону који има превелику величину.\nОвакви аргументи требају да се избегавају.", "post-expand-template-argument-category": "Странице које садрже изостављене аргументе у шаблону", "parser-template-loop-warning": "Откривена је петља шаблона: [[$1]]", - "template-loop-category": "Странице са петљама шаблона", + "template-loop-category": "Странице са петљама у шаблонима", "template-loop-category-desc": "Страница садржи петљу шаблона, тј. шаблон који позива сам ребе рекурзивно.", "parser-template-recursion-depth-warning": "Дубина укључивања шаблона је прекорачена ($1)", "language-converter-depth-warning": "Прекорачена је граница дубине језичког претварача ($1)", @@ -788,151 +789,152 @@ "undo-failure": "Ова измена се не може поништити због сукоба измена.", "undo-norev": "Не могу да вратим измену јер не постоји или је обрисана.", "undo-nochange": "Изгледа да је измена већ поништена.", - "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])", + "undo-summary": "Поништена ревизија $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])", "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника", - "cantcreateaccount-text": "Отварање налога с ове ИП адресе ($1) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је $2", + "cantcreateaccount-text": "Отварање налога с ове IP адресе ($1) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је $2", "cantcreateaccount-range-text": "Отварање налога са IP адреса у распону $1, који укључује и вашу IP адресу ($4) је блокирао/ла [[User:$3|$3]].\n\nРазлог који је навео/ла $3 је $2", - "viewpagelogs": "Дневници ове странице", + "viewpagelogs": "Евиденције ове странице", "nohistory": "Не постоји историја измена ове странице.", - "currentrev": "Тренутна измена", - "currentrev-asof": "Тренутна измена на датум $2 у $3", - "revisionasof": "Измена на датум $2 у $3", - "revision-info": "Измена од $1 од стране {{GENDER:$6|корисника $2|кориснице $2}}$7", - "previousrevision": "← Старија измена", - "nextrevision": "Новија измена →", - "currentrevisionlink": "Тренутна измена", + "currentrev": "Актуелна ревизија", + "currentrev-asof": "Најновија ревизија на датум $2 у $3", + "revisionasof": "Ревизија на датум $2 у $3", + "revision-info": "Ревизија од $1 од стране {{GENDER:$6|корисника $2|кориснице $2}}$7", + "previousrevision": "← Старија ревизија", + "nextrevision": "Новија ревизија →", + "currentrevisionlink": "Актуелна ревизија", "cur": "трен", "next": "след", "last": "разл", "page_first": "прва", "page_last": "последња", - "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.
    \nОбјашњење: ({{int:cur}}) = разлика с тренутном изменом, ({{int:last}}) = разлика с претходном изменом, {{int:minoreditletter}} = мања измена", + "histlegend": "Избор разлика: означите кутијице ревизија за упоређивање и притисните enter или дугме на дну.
    \nОбјашњење: ({{int:cur}}) = разлика са актуелном ревизијом, ({{int:last}}) = разлика са претходном ревизијом, {{int:minoreditletter}} = мања измена", "history-fieldset-title": "Претрага измена", - "history-show-deleted": "Само обрисане измене", + "history-show-deleted": "Само обрисане ревизије", "histfirst": "најстарије", "histlast": "најновије", "historysize": "({{PLURAL:$1|1 бајт|$1 бајта|$1 бајтова}})", "historyempty": "(празно)", - "history-feed-title": "Историја измена", + "history-feed-title": "Историја ревизија", "history-feed-description": "Историја измена ове странице на викију", "history-feed-item-nocomment": "$1 у $2", "history-feed-empty": "Тражена страница не постоји.\nМогуће да је обрисана с викија или је преименована.\nПокушајте да [[Special:Search|претражите вики]] за сличне странице.", - "history-edit-tags": "Уреди ознаке изабраних измена", + "history-edit-tags": "Уреди ознаке изабраних ревизија", "rev-deleted-comment": "(опис измене уклоњен)", "rev-deleted-user": "(корисничко име уклоњено)", "rev-deleted-event": "(детаљи уноса уклоњени)", - "rev-deleted-user-contribs": "[корисничко име или ИП адреса је уклоњена – измена је сакривена са списка доприноса]", - "rev-deleted-text-permission": "Измена ове странице је '''обрисана'''.\nДетаље можете видети у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].", + "rev-deleted-user-contribs": "[корисничко име или IP адреса је уклоњена – измена је сакривена са списка доприноса]", + "rev-deleted-text-permission": "Ревизија ове странице је обрисана.\nДетаље можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} евиденцији брисања].", "rev-suppressed-text-permission": "Измена ове странице је сакривена. Више детаља можете наћи у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} историји сакривања].", - "rev-deleted-text-unhide": "Измена ове странице је '''обрисана'''.\nДетаље можете видети у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].\nИпак можете да [$1 видите ову измену] ако желите да наставите.", - "rev-suppressed-text-unhide": "Измена ове странице је '''сакривена'''.\nДетаље можете видети у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} историји сакривања].\nИпак можете да [$1 видите ову измену] ако желите да наставите.", + "rev-deleted-text-unhide": "Ревизија ове странице је обрисана.\nДетаље можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} евиденцији брисања].\nИпак можете да [$1 погледате ову ревизију] ако желите да наставите.", + "rev-suppressed-text-unhide": "Ревизија ове странице је сакривена.\nДетаље можете да пронађете у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} евиденцији сакривања].\nИпак можете да [$1 погледате ову ревизију] ако желите да наставите.", "rev-deleted-text-view": "Измена ове странице је '''обрисана'''.\nМожете је погледати; више детаља можете наћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].", - "rev-suppressed-text-view": "Измена ове странице је '''сакривена'''.\nМожете је погледати; више детаља можете наћи у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} историји сакривања].", - "rev-deleted-no-diff": "Не можете видети ову разлику јер је једна од измена '''обрисана'''.\nДетаљи се налазе у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].", + "rev-suppressed-text-view": "Ревизија ове странице је сакривена.\nМожете је погледати; детаље можете да пронађете у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} евиденцији сакривања].", + "rev-deleted-no-diff": "Не можете да видете ову разлику јер је једна од ревизија обрисана.\nДетаљи можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} евиденцији брисања].", "rev-suppressed-no-diff": "Не можете видети ову разлику јер је једна од измена '''обрисана'''.", - "rev-deleted-unhide-diff": "Једна од измена у овом прегледу разлика је '''обрисана'''.\nДетаљи се налазе у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].\nИпак можете да [$1 видите ову разлику] ако желите да наставите.", - "rev-suppressed-unhide-diff": "Једна од измена ове разлике је '''сакривена'''.\nДетаљи се налазе у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} историји сакривања].\nИпак можете да [$1 видите ову разлику] ако желите да наставите.", - "rev-deleted-diff-view": "Једна од измена ове разлике је '''обрисана'''.\nИпак можете да видите ову разлику; више детаља можете наћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].", - "rev-suppressed-diff-view": "Једна од измена ове разлике је '''сакривена'''.\nИпак можете да видите ову разлику; више детаља можете наћи у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} историји сакривања].", + "rev-deleted-unhide-diff": "Једна од ревизија у овој разлици је обрисана.\nДетаље можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} евиденцији брисања].\nИпак можете да [$1 погледате ову разлику] ако желите да наставите.", + "rev-suppressed-unhide-diff": "Једна од измена у овој разлици је сакривена.\nВише информација можете да пронађете у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} евиденцији сакривања].\nИпак можете да [$1 погледате ову разлику] ако желите да наставите.", + "rev-deleted-diff-view": "Једна од ревизија у овој разлици је обрисана.\nИпак можете да погледате ову разлику; детаљњ можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} евиденцији брисања].", + "rev-suppressed-diff-view": "Једна од измена у овој разлици је сакривена.\nИпак можете да погледате ову разлику; више информација можете да пронађете у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} евиденцији сакривања].", "rev-delundel": "промени видљивост", "rev-showdeleted": "прикажи", - "revisiondelete": "Брисање/враћање измена", + "revisiondelete": "Брисање/враћање ревизија", "revdelete-nooldid-title": "Нема тражене измене", - "revdelete-nooldid-text": "Нисте изабрали одредишну измену на којој треба да се изврши ова функција, та измена не постоји, или покушавате сакрити тренутну измену.", + "revdelete-nooldid-text": "Нисте навели одредишну ревизију на којој треба да се изврши ова функција, та ревизија не постоји, или покушавате да сакријете актуелну ревизију.", "revdelete-no-file": "Тражена датотека не постоји.", - "revdelete-show-file-confirm": "Желите ли да видите обрисану измену датотеке „$1“ од $2; $3?", + "revdelete-show-file-confirm": "Јесте ли сигурни да желите да видите обрисану ревизију датотеке „$1“ од $2; $3?", "revdelete-show-file-submit": "Да", - "revdelete-selected-text": "{{PLURAL:$1|Изабрана измена|Изабране измене|Изабраних измена}} [[:$2]]:", + "revdelete-selected-text": "{{PLURAL:$1|Изабрана ревизија|Изабране ревизије|Изабраних ревизија}} [[:$2]]:", "revdelete-selected-file": "{{PLURAL:$1|Изабрана верзија датотеке|Изабране верзије датотеке}} [[:$2]]:", "logdelete-selected": "{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:", - "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступни.", + "revdelete-text-text": "Избрисане ревизије ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступни.", "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступни.", - "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступни.", + "logdelete-text": "Обрисани догађаји у евиденцијама ће се идаље појављивати у евиденцији, али ће делови њиховог садржаја бити недоступни јавности.", "revdelete-text-others": "Остали администратори ће и даље моћи да приступе скривеном садржају и врате га, осим ако се поставе додатна ограничења.", - "revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].", + "revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу са [[{{MediaWiki:Policy-url}}|правилима]].", "revdelete-suppress-text": "Сакривање измена би требало користити само у следећим случајевима:\n* злонамерни или погрдни подаци\n* неприкладни лични подаци\n*: кућна адреса и број телефона, број кредитне картице, ЈМБГ итд.", "revdelete-legend": "Ограничења видљивости", - "revdelete-hide-text": "Текст измене", + "revdelete-hide-text": "Текст ревизије", "revdelete-hide-image": "Сакриј садржај датотеке", "revdelete-hide-name": "Циљ и параметре", - "revdelete-hide-comment": "Опис измене", - "revdelete-hide-user": "Корисничко име/ИП адреса", + "revdelete-hide-comment": "Резиме измене", + "revdelete-hide-user": "Корисничко име/IP адреса", "revdelete-hide-restricted": "Сакриј податке од администратора и других корисника", "revdelete-radio-same": "(не мењај)", "revdelete-radio-set": "Сакривено", "revdelete-radio-unset": "Видљиво", "revdelete-suppress": "Сакриј податке од администратора и других корисника", - "revdelete-unsuppress": "Уклони ограничења на враћеним изменама", + "revdelete-unsuppress": "Уклони ограничења на враћеним ревизијама", "revdelete-log": "Разлог:", - "revdelete-submit": "Примени на {{PLURAL:$1|изабрану измену|изабране измене}}", + "revdelete-submit": "Примени на {{PLURAL:$1|изабрану ревизију|изабране ревизије}}", "revdelete-success": "Видљивост измене је ажурирана.", - "revdelete-failure": "'''Не могу да ажурирам видљивост измене:'''\n$1", - "logdelete-success": "Постављена је видљивост уноса у дневнику.", + "revdelete-failure": "Не могу да ажурирам видљивост ревизије:\n$1", + "logdelete-success": "Постављена је видљивост уноса у евиденцији.", "logdelete-failure": "'''Не могу да поставим видљивост историје:'''\n$1", "revdel-restore": "промени видљивост", "pagehist": "Историја странице", "deletedhist": "Обрисана историја", - "revdelete-hide-current": "Грешка при сакривању ставке од $1, $2: ово је тренутна измена.\nНе може бити сакривена.", + "revdelete-hide-current": "Грешка при сакривању ставке од $1, $2: ово је актуелна ревизија.\nНе може да буде сакривена.", "revdelete-show-no-access": "Грешка при приказивању ставке од $1, $2: означена је као „ограничена“.\nНемате приступ до ње.", "revdelete-modify-no-access": "Грешка при мењању ставке од $1, $2: означена је као „ограничена“.\nНемате приступ до ње.", "revdelete-modify-missing": "Грешка при мењању ИБ ставке $1: она не постоји у бази података.", "revdelete-no-change": "Упозорење: ставка од $1, $2 већ поседује затражена подешавања видљивости.", - "revdelete-concurrent-change": "Грешка при мењању ставке од $1, $2: њено стање је у међувремену промењено од стране другог корисника.\nПогледајте историју.", + "revdelete-concurrent-change": "Грешка при мењању ставке од $1, $2: њен статус је у међувремену променио други корисник.\nПроверите евиденцију.", "revdelete-only-restricted": "Грешка при сакривању ставке од $1, $2: не можете сакрити ставке од администратора без избора других могућности видљивости.", "revdelete-reason-dropdown": "*Уобичајени разлози за брисање\n** Кршење ауторског права\n** Неприкладан коментар или лични подаци\n** Неприкладно корисничко име\n** Увредљиви подаци", "revdelete-otherreason": "Други/додатни разлог:", "revdelete-reasonotherlist": "Други разлог", "revdelete-edit-reasonlist": "Уреди разлоге за брисање", - "revdelete-offender": "Аутор измене:", - "suppressionlog": "Дневник сакривања", - "suppressionlogtext": "Испод се налази списак брисања и блокирања који укључује садржај сакривен од администратора. Текуће забране и блокирања можете наћи [[Special:BlockList|овде]].", - "mergehistory": "Споји историје страница", - "mergehistory-header": "Ова страница вам омогућава да спојите измене неке изворне странице у нову страницу.\nЗапамтите да ће ова измена оставити непромењен садржај историје странице.", + "revdelete-offender": "Аутор ревизије:", + "suppressionlog": "Евиденција сакривања", + "suppressionlogtext": "Испод се налази списак брисања и блокирања који укључује садржај сакривен од администратора. Погледајте [[Special:BlockList|списак блокирања]] за списак актуелних операција забрана и блокирања.", + "mergehistory": "Спајање историја странице", + "mergehistory-header": "Ова страница вам омогућава да спојите ревизије неке изворне странице у нову страницу.\nЗапамтите да ће ова промена оставити непромењен садржај историје странице.", "mergehistory-box": "Споји измене две странице:", "mergehistory-from": "Изворна страница:", "mergehistory-into": "Одредишна страница:", "mergehistory-list": "Спојива историја измена", - "mergehistory-merge": "Следеће измене странице [[:$1]] могу се спојити са [[:$2]].\nКористите дугмиће у колони да бисте спојили измене које су направљене пре наведеног времена.\nКоришћење навигационих веза ће поништити ову колону.", + "mergehistory-merge": "Следеће ревизије странице [[:$1]] могу се спојити са [[:$2]].\nКористите дугмиће у колони да бисте спојили ревизије које су направљене пре наведеног времена.\nКоришћење навигационих линкова ће поништити ову колону.", "mergehistory-go": "Прикажи измене које се могу спојити", - "mergehistory-submit": "Споји измене", + "mergehistory-submit": "Споји ревизије", "mergehistory-empty": "Нема измена за спајање.", - "mergehistory-done": "$3 {{PLURAL:$3|измена странице $1 је спојена|измене странице $1 су спојене|измена странице $1 је спојено}} у [[:$2]].", + "mergehistory-done": "$3 {{PLURAL:$3|ревизија странице $1 је спојена|ревизије странице $1 су спојене|ревизија странице $1 је спојено}} у [[:$2]].", "mergehistory-fail": "Не могу да спојим историје. Проверите страницу и временске параметре.", - "mergehistory-fail-bad-timestamp": "Временска ознака није исправна.", - "mergehistory-fail-invalid-source": "Изворна страница није исправна.", - "mergehistory-fail-invalid-dest": "Одредишна страница није исправна.", - "mergehistory-fail-no-change": "Спајање историје није спојило ниједну измену. Проверите параметре странице и времена.", + "mergehistory-fail-bad-timestamp": "Временска ознака није валидна.", + "mergehistory-fail-invalid-source": "Изворна страница није валидна.", + "mergehistory-fail-invalid-dest": "Одредишна страница није валидна.", + "mergehistory-fail-no-change": "Спајање историје није спојило ниједну ревизију. Проверите параметре странице и времена.", "mergehistory-fail-permission": "Немате овлашћење за спајање историје.", "mergehistory-fail-self-merge": "Изворна и одредишна страница не могу бити исте.", - "mergehistory-fail-timestamps-overlap": "Изворне измене се преклапају или долазе након одредишних измена.", - "mergehistory-fail-toobig": "Није могуће спојити историје јер више од $1 {{PLURAL:$1|измене ће бити премештене|измена ће бити премештено}}.", + "mergehistory-fail-timestamps-overlap": "Изворне ревизије се преклапају или долазе након одредишних ревизија.", + "mergehistory-fail-toobig": "Не могу да извршим спајање историје јер ће више од $1 {{PLURAL:$1|ревизије бити премештене|ревизија бити премештено}}.", "mergehistory-no-source": "Изворна страница $1 не постоји.", "mergehistory-no-destination": "Одредишна страница $1 не постоји.", - "mergehistory-invalid-source": "Изворна страница мора имати исправан наслов.", - "mergehistory-invalid-destination": "Одредишна страница мора имати исправан наслов.", + "mergehistory-invalid-source": "Изворна страница мора имати валидан наслов.", + "mergehistory-invalid-destination": "Одредишна страница мора да има важећи наслов.", "mergehistory-autocomment": "Страница [[:$1]] је спојена у [[:$2]]", "mergehistory-comment": "Страница [[:$1]] је спојена у [[:$2]]: $3", "mergehistory-same-destination": "Изворна и одредишна страница не могу бити исте", "mergehistory-reason": "Разлог:", - "mergelog": "Дневник спајања", + "mergelog": "Евиденција спајања", "revertmerge": "растави", "mergelogpagetext": "Испод је списак најскоријих спајања историја двеју страница.", - "history-title": "Историја измена странице „$1“", - "difference-title": "Разлика између измена на страници „$1”", + "history-title": "Историја ревизија странице „$1“", + "difference-title": "Разлика између ревизија на страници „$1”", "difference-title-multipage": "Разлика између страница „$1“ и „$2“", "difference-multipage": "(разлике између страница)", "lineno": "Ред $1:", - "compareselectedversions": "Упореди изабране измене", - "showhideselectedversions": "Промени видљивост изабраних измена", + "compareselectedversions": "Упореди изабране ревизије", + "showhideselectedversions": "Промени видљивост изабраних ревизија", "editundo": "поништи", "diff-empty": "(нема разлике)", - "diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмене истог корисника нису приказане|$1 међуизмена истог корисника није приказано}})", - "diff-multi-otherusers": "({{PLURAL:$1|Једна међуизмена|$1 међуизмене|$1 међуизмена}} од стране {{PLURAL:$2|још једног корисника није приказана|$2 корисника није приказано}})", + "diff-multi-sameuser": "({{PLURAL:$1|Једна међуревизија истог корисника није приказана|$1 међуревизија истог корисника нису приказане|$1 међуревизија истог корисника није приказано}})", + "diff-multi-otherusers": "({{PLURAL:$1|Једна међуревизија|$1 међуревизије|$1 међуревизија}} од стране {{PLURAL:$2|још једног корисника није приказана|$2 корисника није приказано}})", "diff-multi-manyusers": "({{PLURAL:$1|Није приказана међуизмена|Нису приказане $1 међуизмене|Није приказано $1 међуизмена}} од више од $2 корисника)", - "diff-paragraph-moved-tonew": "Одломак је премештен. Кликните да пређете на његово ново место.", - "diff-paragraph-moved-toold": "Одломак је премештен. Кликните да пређете на његово старо место.", - "difference-missing-revision": "Не могу да пронађем {{PLURAL:$2|једну измену|$2 измене|$2 измена}} од ове разлике ($1).\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].", + "diff-paragraph-moved-tonew": "Пасус је премештен. Кликните да пређете на његово ново место.", + "diff-paragraph-moved-toold": "Пасус је премештен. Кликните да пређете на његово старо место.", + "difference-missing-revision": "{{PLURAL:$2|Једна ревизија|$2 ревизије}} од ове разлике ($1) не {{PLURAL:$2|постоји|постоје}}.\n\nОво се обично дешава када пратите застарели линк до странице која је обрисана.\nДетаље можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} евиденцији брисања].", "searchresults": "Резултати претраге", + "search-filter-title-prefix-reset": "Претражи све странице", "searchresults-title": "Резултати претраге за „$1“", "titlematches": "Наслов странице одговара", "textmatches": "Текст странице одговара", @@ -994,19 +996,19 @@ "datedefault": "Свеједно", "prefs-labs": "Пробне могућности", "prefs-user-pages": "Корисничке странице", - "prefs-personal": "Профил", + "prefs-personal": "Кориснички профил", "prefs-rc": "Скорашње измене", "prefs-watchlist": "Списак надгледања", "prefs-editwatchlist": "Уређивање списка надгледања", - "prefs-editwatchlist-label": "Уређивање списка:", - "prefs-editwatchlist-edit": "уреди списак", - "prefs-editwatchlist-raw": "уреди сиров списак", - "prefs-editwatchlist-clear": "испразни списак", + "prefs-editwatchlist-label": "Уреди уносе на списку надгледања:", + "prefs-editwatchlist-edit": "погледајте и уклоните наслове са списка надгледања", + "prefs-editwatchlist-raw": "уреди сиров списак надгледања", + "prefs-editwatchlist-clear": "очисти списак надгледања", "prefs-watchlist-days": "Број дана у списку надгледања:", "prefs-watchlist-days-max": "Највише $1 {{PLURAL:$1|дан|дана|дана}}", - "prefs-watchlist-edits": "Највећи број измена приказаних на списку надгледања:", + "prefs-watchlist-edits": "Највећи број промена приказаних на списку надгледања:", "prefs-watchlist-edits-max": "Највећи број: 1000", - "prefs-watchlist-token": "Жетон списка надгледања:", + "prefs-watchlist-token": "Токен списка надгледања:", "prefs-watchlist-managetokens": "Управљај жетонима", "prefs-misc": "Друга подешавања", "prefs-resetpass": "промени лозинку", @@ -1015,19 +1017,19 @@ "prefs-email": "Опције имејла", "prefs-rendering": "Изглед", "saveprefs": "Сачувај", - "restoreprefs": "Врати сва подразумевана подешавања (у свим одељцима)", + "restoreprefs": "Врати сва подешавања на подразумеване вредности (у свим одељцима)", "prefs-editing": "Уређивање", "searchresultshead": "Претрага", - "stub-threshold": "Праг за обликовање везе као клице ($1):", + "stub-threshold": "Праг за обликовање линкова као клице ($1):", "stub-threshold-sample-link": "пример", "stub-threshold-disabled": "онемогућено", "recentchangesdays": "Број дана у скорашњим изменама:", "recentchangesdays-max": "Највише $1 {{PLURAL:$1|дан|дана}}", - "recentchangescount": "Подразумевани број измена за приказ у скорашњим изменама, историјама страница и дневницима:", - "prefs-help-recentchangescount": "Највећа број: 1000", - "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да чита Ваш списак надгледања, зато га немојте делити. \nАко је потребно, [[Special:ResetTokens|можете га обновити]].", + "recentchangescount": "Подразумевани број измена за приказ у скорашњим изменама, историјама страница и евиденцијама:", + "prefs-help-recentchangescount": "Највећи број: 1000", + "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-фид вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да чита ваш списак надгледања, зато га немојте делити. \nАко је потребно, [[Special:ResetTokens|можете да га ресетујете]].", "savedprefs": "Ваша подешавања су сачувана.", - "savedrights": "Корисничке групе за {{GENDER:$1|$1}} су сачуване.", + "savedrights": "Корисничке групе {{GENDER:$1|корисника|кориснице}} $1 су сачуване.", "timezonelegend": "Временска зона:", "localtime": "Локално време:", "timezoneuseserverdefault": "подразумеване вредности ($1)", @@ -1053,9 +1055,9 @@ "prefs-files": "Датотеке", "prefs-custom-css": "прилагођени CSS", "prefs-custom-json": "Прилагођени JSON", - "prefs-custom-js": "прилагођени Јаваскрипт", - "prefs-common-config": "Дељени CSS/JSON/Јаваскрипт за све теме:", - "prefs-reset-intro": "Можете користити ову страницу да поништите своја подешавања на подразумеване вредности.\nОва радња се не може вратити.", + "prefs-custom-js": "прилагођени јаваскрипт", + "prefs-common-config": "Дељени CSS/JSON/јаваскрипт за све теме:", + "prefs-reset-intro": "Можете користити ову страницу да поново поставите своја подешавања на подразумеване вредности сајта.\nОво се не може опозвати.", "prefs-emailconfirm-label": "Потврда имејла:", "youremail": "Имејл:", "username": "{{GENDER:$1|Корисничко име}}:", @@ -1069,18 +1071,18 @@ "yourvariant": "Варијанта језика:", "prefs-help-variant": "Жељена варијанта или правопис за приказ страница са садржајем овог викија.", "yournick": "Нови потпис:", - "prefs-help-signature": "Коментари на страницама за разговор треба да буду потписани са „~~~~“ које ће бити претворено у Ваш потпис с тренутним временом.", - "badsig": "Потпис је неисправан.\nПроверите ознаке HTML.", + "prefs-help-signature": "Коментари на страницама за разговор треба да буду потписани са „~~~~“ које ће бити претворено у ваш потпис и временску ознаку.", + "badsig": "Неважећи сиров потпис.\nПроверите 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": "Имејл адреса није обавезна, али је потребна за обнављање лозинке, ако је заборавите.", - "prefs-help-email-others": "Такође можете изабрати да допустите другима да Вас контактирају преко имејла путем везе на Вашој корисничкој страници или страници за разговор.\nВаша имејл адреса неће бити приказана другим корисницима који Вас контактирају.", + "prefs-help-realname": "Право име је опционално.\nАко је наведено, биће коришћено за приписивање вашег рада.", + "prefs-help-email": "Имејл адреса је опционална, али је потребна за ресетовање лозинке, ако је заборавите.", + "prefs-help-email-others": "Такође можете изабрати да допустите другима да вас контактирају преко имејла путем линка на вашој корисничкој страници или страници за разговор.\nВаша имејл адреса неће бити приказана другим корисницима који вас контактирају.", "prefs-help-email-required": "Потребна је имејл адреса.", "prefs-info": "Основне информације", "prefs-i18n": "Интернационализација", @@ -1098,13 +1100,13 @@ "prefs-advancedwatchlist": "Напредне опције", "prefs-displayrc": "Подешавања приказа", "prefs-displaywatchlist": "Подешавања приказа", - "prefs-tokenwatchlist": "Жетон", + "prefs-tokenwatchlist": "Токен", "prefs-diffs": "Разлике", "prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.", - "prefswarning-warning": "Променили сте ваша подешавања али нисте их још сачували.\nАко не притиснете „$1“ ваша подешавања ће бити изгубљена.", + "prefswarning-warning": "Направили сте промене у подешавањима које још увек нису сачуване.\nАко напустите ову страницу без клика на „$1“, подешавања неће да буду ажурирана.", "prefs-tabs-navigation-hint": "Савет: можете користити типке са левом и десном стрелицом за кретање кроз картице.", "userrights": "Корисничка права", - "userrights-lookup-user": "Изабери корисника", + "userrights-lookup-user": "Избор корисника", "userrights-user-editname": "Корисничко име:", "editusergroup": "Учитај корисничке групе", "editinguser": "Мењате корисничка права {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]] $2", @@ -1112,11 +1114,11 @@ "userrights-editusergroup": "Промена {{GENDER:$1|корисничких}} група", "userrights-viewusergroup": "Преглед {{GENDER:$1|корисничких}} група", "saveusergroups": "Сачувај {{GENDER:$1|корисничке}} групе", - "userrights-groupsmember": "Члан:", - "userrights-groupsmember-auto": "Подразумевано члан и:", + "userrights-groupsmember": "Члан група:", + "userrights-groupsmember-auto": "{{GENDER:$2|Имплицитан члан|Имплицитна чланица}} група:", "userrights-groups-help": "Можете променити групе којима овај корисник припада:\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица (*) означава да не можете уклонити ту групу ако је додате и обратно.\n* Тараба (#) означава да једино можете одложити време истека чланства у тој групи; не можете га убрзати.", "userrights-reason": "Разлог:", - "userrights-no-interwiki": "Немате овлашћења да мењате корисничка права на другим викијима.", + "userrights-no-interwiki": "Немате дозволу да уређујете корисничка права на другим викијима.", "userrights-nodatabase": "База података $1 не постоји или није локална.", "userrights-changeable-col": "Групе које можете да промените", "userrights-unchangeable-col": "Групе које не можете да промените", @@ -1127,15 +1129,16 @@ "userrights-expiry-existing": "Постојеће време истека: $3, $2", "userrights-expiry-othertime": "Друго време:", "userrights-expiry-options": "1 дан:1 day,1 недеља:1 week,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year", - "userrights-invalid-expiry": "Време истицања групе „$1“ није исправно.", + "userrights-invalid-expiry": "Време истицања групе „$1“ није валидно.", "userrights-expiry-in-past": "Време истицања групе „$1“ је прошло.", "userrights-cannot-shorten-expiry": "Не можете убрзати истек чланства у групи „$1”. Само корисници са дозволом да додају или уклоне ову групу могу да убрзају рок истека.", - "userrights-conflict": "Сукоб промена корисничких права! Молимо проверите ваше измене.", + "userrights-conflict": "Сукоб промена корисничких права! Прегледајте и проверите ваше промене.", "group": "Група:", "group-user": "Корисници", "group-autoconfirmed": "Аутоматски потврђени корисници", "group-bot": "Ботови", "group-sysop": "Администратори", + "group-interface-admin": "Администратори интерфејса", "group-bureaucrat": "Бирократе", "group-suppress": "Ревизори", "group-all": "(сви)", @@ -1143,12 +1146,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|аутоматски потврђен корисник|аутоматски потврђена корисница}}", "group-bot-member": "{{GENDER:$1|бот}}", "group-sysop-member": "{{GENDER:$1|администратор|администраторка}}", + "group-interface-admin-member": "{{GENDER:$1|администратор интерфејса|администраторка интерфејса}}", "group-bureaucrat-member": "{{GENDER:$1|бирократа|бирократкиња}}", "group-suppress-member": "{{GENDER:$1|брисач измена}}", "grouppage-user": "{{ns:project}}:Корисници", "grouppage-autoconfirmed": "{{ns:project}}:Аутоматски потврђени корисници", "grouppage-bot": "{{ns:project}}:Ботови", "grouppage-sysop": "{{ns:project}}:Администратори", + "grouppage-interface-admin": "{{ns:project}}:Администратори интерфејса", "grouppage-bureaucrat": "{{ns:project}}:Бирократе", "grouppage-suppress": "{{ns:project}}:Ревизор", "right-read": "читање страница", @@ -1159,7 +1164,7 @@ "right-autocreateaccount": "Пријавите се аутоматски са екстерним корисничким налогом", "right-minoredit": "означавање измена мањим", "right-move": "премештање страница", - "right-move-subpages": "премештање страница с њиховим подстраницама", + "right-move-subpages": "премештање страница са њиховим подстраницама", "right-move-rootuserpages": "премештање основних корисничких страница", "right-move-categorypages": "премештање категорија", "right-movefile": "премештање датотека", @@ -1174,24 +1179,24 @@ "right-bot": "сматрање измена као аутоматски процес", "right-nominornewtalk": "непоседовање мањих измена на страницама за разговор отвара прозор за нове поруке", "right-apihighlimits": "коришћење виших граница за упите из API-ја", - "right-writeapi": "могућност писања API-ја", + "right-writeapi": "коришћење API-ја за писање", "right-delete": "брисање страница", - "right-bigdelete": "брисање страница с великом историјом", - "right-deletelogentry": "брисање и враћање одређених ставки у дневнику", - "right-deleterevision": "брисање и враћање одређених измена страница", + "right-bigdelete": "брисање страница са великом историјом", + "right-deletelogentry": "брисање и враћање одређених уноса у евиденцији", + "right-deleterevision": "брисање и враћање одређених ревизија страница", "right-deletedhistory": "прегледање обрисаних ставки историје без повезаног текста", - "right-deletedtext": "прегледање обрисаног текста и измена између обрисаних измена", + "right-deletedtext": "прегледање обрисаног текста и промена између обрисаних ревизија", "right-browsearchive": "претрага обрисаних страница", "right-undelete": "враћање обрисаних страница", - "right-suppressrevision": "прегледање, скривање и враћање одређених измена страница од свих корисника", + "right-suppressrevision": "прегледање, скривање и враћање одређених ревизија страница од свих корисника", "right-viewsuppressed": "прегледање измена скривених од свих корисника", - "right-suppressionlog": "прегледање приватних дневника", + "right-suppressionlog": "прегледање приватних евиденција", "right-block": "блокирање даљих измена других корисника", "right-blockemail": "блокирање корисника да шаљу имејл", "right-hideuser": "блокирање корисничког имена и његово сакривање од јавности", - "right-ipblock-exempt": "заобилажење блокирања ИП адресе, аутоматска блокирања и блокирања опсега", + "right-ipblock-exempt": "заобилажење IP блокада, самоблокада и блокада опсега", "right-unblockself": "деблокирање самог себе", - "right-protect": "мењање степена заштите и уређивање страница под преносивом заштитом", + "right-protect": "мењање нивоа заштите и уређивање страница под преносивом заштитом", "right-editprotected": "уређивање страница под заштитом „{{int:protect-level-sysop}}“", "right-editsemiprotected": "уређивање страница под заштитом „{{int:protect-level-autoconfirmed}}“", "right-editcontentmodel": "мењање модела садржаја странице", @@ -1220,11 +1225,11 @@ "right-userrights": "уређивање свих корисничких права", "right-userrights-interwiki": "уређивање корисничких права на другим викијима", "right-siteadmin": "закључавање и откључавање базе података", - "right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет веза", + "right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет линкова", "right-sendemail": "слање имејла другим корисницима", "right-managechangetags": "прављење и (де)активирање [[Special:Tags|ознака]]", - "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије измене", - "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима", + "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије промене", + "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним ревизијама и уносима у евиденцијама", "right-deletechangetags": "брисање [[Special:Tags|ознака]] из базе података", "grant-generic": "Скуп права „$1“", "grant-group-page-interaction": "Уређивање страница", @@ -1234,98 +1239,98 @@ "grant-group-high-volume": "Извршавање великог броја радњи", "grant-group-customization": "Прилагођавање и подешавања", "grant-group-administration": "Извршавање административних радњи", - "grant-group-private-information": "Приступање Вашим личним подацима", + "grant-group-private-information": "Приступање вашим приватним подацима", "grant-group-other": "Разне активности", "grant-blockusers": "Блокирање и деблокирање корисника", "grant-createaccount": "Отварање налога", "grant-createeditmovepage": "Прављење, уређивање и премештање страница", - "grant-delete": "Брисање страница, измена и уноса у дневницима", + "grant-delete": "Брисање страница, ревизија и уноса у евиденцијама", "grant-editinterface": "Уређивање Медијавики именског простора и корисничких CSS/JSON/Јаваскрипт страница", "grant-editmycssjs": "Уређивање вашег CSS/JSON/Јаваскрипта", - "grant-editmyoptions": "Уређивање Ваших подешавања", + "grant-editmyoptions": "Уређивање ваших корисничких подешавања", "grant-editmywatchlist": "Уређивање вашег списка надгледања", "grant-editpage": "Уређивање постојећих страница", "grant-editprotected": "Уређивање заштићених страница", "grant-highvolume": "Масовно уређивање", - "grant-oversight": "Скривање корисника и измена", - "grant-patrol": "Патролирање измена", + "grant-oversight": "Скривање корисника и ревизија", + "grant-patrol": "Патролирање промена на страницама", "grant-privateinfo": "Приступи приватним информацијама", "grant-protect": "Закључавање и откључавање страница", - "grant-rollback": "Враћање измена", + "grant-rollback": "Враћање промена на страницама", "grant-sendemail": "Слање имејлова другим корисницима", "grant-uploadeditmovefile": "Отпремање, замена и премештање датотека", "grant-uploadfile": "Отпремање нових датотека", "grant-basic": "Основна права", "grant-viewdeleted": "Преглед обрисаних страница и датотека", "grant-viewmywatchlist": "Преглед вашег списак надгледања", - "grant-viewrestrictedlogs": "Прегледање ограничених уноса у дневнику", - "newuserlogpage": "Дневник нових корисника", - "newuserlogpagetext": "Ово је дневник нових корисника.", - "rightslog": "Дневник корисничких права", - "rightslogtext": "Ово је дневник измена корисничких права.", - "action-read": "читање ове странице", - "action-edit": "уређивање ове странице", - "action-createpage": "прављење страница", - "action-createtalk": "прављење страница за разговор", - "action-createaccount": "отварање овог корисничког налога", - "action-autocreateaccount": "аутоматско прављење овог спољашњег корисничког налога", - "action-history": "гледање историје ове странице", - "action-minoredit": "означавање ове измене као мање", - "action-move": "премештање ове странице", - "action-move-subpages": "премештање ове странице и њених подстраница", - "action-move-rootuserpages": "премештање основних корисничких страница", - "action-move-categorypages": "премештање категорија", - "action-movefile": "премештање ове датотеке", - "action-upload": "отпреми ову датотеку", - "action-reupload": "замењивање постојеће датотеке", - "action-reupload-shared": "постављање ове датотеке на заједничко складиште", - "action-upload_by_url": "отпремање ове датотеке преко веб-адресе", - "action-writeapi": "писање API-ја", - "action-delete": "брисање ове странице", - "action-deleterevision": "брисање измена", - "action-deletelogentry": "бирсање уноса у дневницима", - "action-deletedhistory": "прегледање обрисане историје странице", - "action-deletedtext": "преглед обрисаног текста измене", - "action-browsearchive": "претраживање обрисаних страница", - "action-undelete": "враћање страница", - "action-suppressrevision": "прегледање и враћање сакривених измена", - "action-suppressionlog": "прегледање ове приватне историје", - "action-block": "блокирање даљих измена овог корисника", - "action-protect": "мењање степена заштите ове странице", - "action-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу", - "action-import": "увожење страница из других викија", - "action-importupload": "увожење страница из отпремљене датотеке", - "action-patrol": "означавање туђих измена патролираним", - "action-autopatrol": "означавање сопствених измена патролираним", - "action-unwatchedpages": "прегледање списка ненадгледаних страница", - "action-mergehistory": "спајање историје ове странице", - "action-userrights": "уређивање свих корисничких права", - "action-userrights-interwiki": "уређивање корисничких права на другим викијима", - "action-siteadmin": "закључавање или откључавање базе података", - "action-sendemail": "слање имејлова", - "action-editmyoptions": "уређивање Ваших подешавања", - "action-editmywatchlist": "измену сопственог списак надгледања", - "action-viewmywatchlist": "преглед вашег списак надгледања", - "action-viewmyprivateinfo": "прегледање ваших личних података", - "action-editmyprivateinfo": "уређивање ваших личних података", - "action-editcontentmodel": "мењање модела садржаја странице", - "action-managechangetags": "прављење и (де)активирање ознака", - "action-applychangetags": "додавање ознака на ваше измене", - "action-changetags": "додавање и уклањање разних ознака на појединачним изменама и уносима у дневницима", - "action-deletechangetags": "Обриши ознаке из базе података", - "action-purge": "чишћење привремене меморије ове странице", - "nchanges": "$1 {{PLURAL:$1|измена|измене|измена}}", + "grant-viewrestrictedlogs": "Прегледање ограничених уноса у евиденцији", + "newuserlogpage": "Евиденција нових корисника", + "newuserlogpagetext": "Ово је евиденција о регистрацији нових корисника.", + "rightslog": "Евиденција корисничких права", + "rightslogtext": "Ово је евиденција промена корисничких права.", + "action-read": "читате ову страницу", + "action-edit": "уређујете ову страницу", + "action-createpage": "направите ову страницу", + "action-createtalk": "направите ову страницу за разговор", + "action-createaccount": "направите овај кориснички налог", + "action-autocreateaccount": "аутоматски направите овај спољашњи кориснички налог", + "action-history": "гледате историју ове странице", + "action-minoredit": "означите ову измену као мању", + "action-move": "преместите ову страницу", + "action-move-subpages": "преместите ову страницу и њене подстранице", + "action-move-rootuserpages": "премештате основне корисничке странице", + "action-move-categorypages": "премештате категорије", + "action-movefile": "преместите ову датотеку", + "action-upload": "отпремите ову датотеку", + "action-reupload": "замењујете ову постојећу датотеку", + "action-reupload-shared": "премостите ову датотеку са заједничког складишта", + "action-upload_by_url": "отпремите ову датотеку путем УРЛ-а", + "action-writeapi": "користите API за писање", + "action-delete": "обришете ову страницу", + "action-deleterevision": "бришете ревизије", + "action-deletelogentry": "бришете уносе у евиденцијама", + "action-deletedhistory": "прегледате обрисану историју странице", + "action-deletedtext": "прегледате обрисани текст ревизије", + "action-browsearchive": "претражујете обрисане странице", + "action-undelete": "враћате странице", + "action-suppressrevision": "прегледате и враћате сакривене ревизије", + "action-suppressionlog": "прегледате ову приватну евиденције", + "action-block": "блокирате уређивање овом кориснику", + "action-protect": "промените нивое заштите ове странице", + "action-rollback": "брзо вратите измене последњег корисника који је уређивао одређену страницу", + "action-import": "увозите странице из другог викија", + "action-importupload": "увозите странице путем отпремања датотеке", + "action-patrol": "означите туђе измене као патролиране", + "action-autopatrol": "означите сопствене измене као патролиране", + "action-unwatchedpages": "прегледате списак ненадгледаних страница", + "action-mergehistory": "спајате историју ове странице", + "action-userrights": "уређујете сва корисничка права", + "action-userrights-interwiki": "уређујете корисничка права корисника на другим викијима", + "action-siteadmin": "закључавате или откључавате базу података", + "action-sendemail": "шаљете имејлове", + "action-editmyoptions": "уређујете сопствена подешавања", + "action-editmywatchlist": "уређујете сопствени списак надгледања", + "action-viewmywatchlist": "прегледате сопствени списак надгледања", + "action-viewmyprivateinfo": "прегледате сопствене личне информације", + "action-editmyprivateinfo": "уређујете сопствене приватне информације", + "action-editcontentmodel": "уређујете модел садржаја странице", + "action-managechangetags": "правите и (де)активирате ознаке", + "action-applychangetags": "додате ознаке уз сопствене промене", + "action-changetags": "додате и уклоните разне ознаке на појединачним ревизијама и уносима у евиденцијама", + "action-deletechangetags": "бришете ознаке из базе података", + "action-purge": "освежите ову страницу", + "nchanges": "$1 {{PLURAL:$1|промена|промене|промена}}", "ntimes": "$1×", "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|измена од ваше последње посете}}", "enhancedrc-history": "историја", "recentchanges": "Скорашње измене", "recentchanges-legend": "Опције скорашњих измена", - "recentchanges-summary": "Пратите скорашње измене на овој страници.", - "recentchanges-noresult": "Нема измена током датог периода а које одговарају овим критеријумима.", + "recentchanges-summary": "Пратите недавне промене на овој страници.", + "recentchanges-noresult": "Нема промена током датог периода а које одговарају овим критеријумима.", "recentchanges-timeout": "Ова претрага је истекла. Можда желите да покушате другачије параметре претраге.", "recentchanges-network": "Због техничког проблема не могу да учитам резултате. Покушајте да освежите страницу.", - "recentchanges-notargetpage": "Унесите назив странице како бисте видели сродне измене.", - "recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.", + "recentchanges-notargetpage": "Унесите име странице изнад да бисте видели промене сродне с овом страницом", + "recentchanges-feed-description": "Пратите најскорије промене на викију у овом фиду.", "recentchanges-label-newpage": "Овом изменом је направљена нова страница", "recentchanges-label-minor": "Ово је мања измена", "recentchanges-label-bot": "Ову измену је направио бот", @@ -1346,9 +1351,9 @@ "rcfilters-activefilters-show-tooltip": "Прикажите подручје активних филтера", "rcfilters-advancedfilters": "Напредни филтери", "rcfilters-limit-title": "Број измена за приказ", - "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|измена|измене|измена}}, $2", + "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|промена|промене|промена}}, $2", "rcfilters-date-popup-title": "Временски период за претрагу", - "rcfilters-days-title": "Скорашњи дани", + "rcfilters-days-title": "Недавни дани", "rcfilters-hours-title": "Скорашњи сати", "rcfilters-days-show-days": "$1 {{PLURAL:$1|дан|дана}}", "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сат|сата}}", @@ -1366,13 +1371,13 @@ "rcfilters-savedqueries-apply-label": "Направи филтер", "rcfilters-savedqueries-apply-and-setdefault-label": "Направи подразумевани филтер", "rcfilters-savedqueries-cancel-label": "Откажи", - "rcfilters-savedqueries-add-new-title": "Сачувајте тренутна подешавања филтера", - "rcfilters-savedqueries-already-saved": "Ови филтери су већ сачувани. Измените Ваша подешавања да бисте направили нове сачуване филтере.", + "rcfilters-savedqueries-add-new-title": "Сачувајте актуелна подешавања филтера", + "rcfilters-savedqueries-already-saved": "Ови филтери су већ сачувани. Промените своја подешавања да бисте направили нове сачуване филтере.", "rcfilters-restore-default-filters": "Врати подразумеване филтере", "rcfilters-clear-all-filters": "Уклоните све филтере", - "rcfilters-show-new-changes": "Најновије измене", - "rcfilters-search-placeholder": "Филтрирајте измене (користите мени или претрагу за име филтера)", - "rcfilters-invalid-filter": "Неисправан филтер", + "rcfilters-show-new-changes": "Најновије промене", + "rcfilters-search-placeholder": "Филтрирајте промене (користите мени или претрагу за име филтера)", + "rcfilters-invalid-filter": "Неважећи филтер", "rcfilters-empty-filter": "Нема активних филтера. Сви доприноси су приказани.", "rcfilters-filterlist-title": "Филтери", "rcfilters-filterlist-whatsthis": "Како ово функционише?", @@ -1385,10 +1390,10 @@ "rcfilters-state-message-subset": "Овај филтер нема ефекта јер су његови резултати укључени са онима {{PLURAL:$2|следећег, ширег филтера|следећих, ширих филтера}} (покушајте са означавањем да бисте их распознали): $1", "rcfilters-state-message-fullcoverage": "Одабир свих филтера у групи је исто као и одабир ниједног, тако да овај филтер нема ефекта. Група укључује: $1", "rcfilters-filtergroup-authorship": "Ауторство доприноса", - "rcfilters-filter-editsbyself-label": "Ваше измене", - "rcfilters-filter-editsbyself-description": "Ваши доприноси.", - "rcfilters-filter-editsbyother-label": "Измене других", - "rcfilters-filter-editsbyother-description": "Све измене осим Ваших.", + "rcfilters-filter-editsbyself-label": "Ваше промене", + "rcfilters-filter-editsbyself-description": "Ваши сопствени доприноси.", + "rcfilters-filter-editsbyother-label": "Промене других", + "rcfilters-filter-editsbyother-description": "Све измене осим ваших.", "rcfilters-filtergroup-userExpLevel": "Корисничка регистрација и искуство", "rcfilters-filter-user-experience-level-registered-label": "Регистровани", "rcfilters-filter-user-experience-level-registered-description": "Пријављени уредници.", @@ -1419,33 +1424,33 @@ "rcfilters-filter-major-description": "Измене које нису означене као мање.", "rcfilters-filtergroup-watchlist": "Странице на списку надгледања", "rcfilters-filter-watchlist-watched-label": "На списку надгледања", - "rcfilters-filter-watchlist-watched-description": "Измене страница на Вашем списку надгледања.", - "rcfilters-filter-watchlist-watchednew-label": "Нове измене на списку надгледања", - "rcfilters-filter-watchlist-watchednew-description": "Измене страница на списку надгледања које нисте посетили од када су направљене измене.", + "rcfilters-filter-watchlist-watched-description": "Промене страница на вашем списку надгледања.", + "rcfilters-filter-watchlist-watchednew-label": "Нове промене на списку надгледања", + "rcfilters-filter-watchlist-watchednew-description": "Промене страница на списку надгледања које нисте посетили од када су промене направљене.", "rcfilters-filter-watchlist-notwatched-label": "Није на списку надгледања", - "rcfilters-filter-watchlist-notwatched-description": "Све осим измена страница на Вашем списку надгледања.", + "rcfilters-filter-watchlist-notwatched-description": "Све осим промена страница на вашем списку надгледања.", "rcfilters-filtergroup-watchlistactivity": "Стање на списку надгледања", - "rcfilters-filter-watchlistactivity-unseen-label": "Непогледане измене", - "rcfilters-filter-watchlistactivity-unseen-description": "Измене страница које нисте посетили од када су направљене измене.", + "rcfilters-filter-watchlistactivity-unseen-label": "Непогледане промене", + "rcfilters-filter-watchlistactivity-unseen-description": "Промене на страницама које нисте посетили од када су промене направљене.", "rcfilters-filter-watchlistactivity-seen-label": "Погледане измене", - "rcfilters-filter-watchlistactivity-seen-description": "Измене страница које сте посетили од када су направљене измене.", - "rcfilters-filtergroup-changetype": "Тип измене", + "rcfilters-filter-watchlistactivity-seen-description": "Промене на страницама које сте посетили од када су промене направљене.", + "rcfilters-filtergroup-changetype": "Тип промене", "rcfilters-filter-pageedits-label": "Измене страница", "rcfilters-filter-pageedits-description": "Измене вики садржаја, расправа, описа категорија…", "rcfilters-filter-newpages-label": "Прављење страница", "rcfilters-filter-newpages-description": "Измене којима се праве нове странице.", - "rcfilters-filter-categorization-label": "Измене категорија", + "rcfilters-filter-categorization-label": "Промене категорија", "rcfilters-filter-categorization-description": "Записи о страницама додатим или уклоњеним из категорија.", - "rcfilters-filter-logactions-label": "Забележене радње", + "rcfilters-filter-logactions-label": "Евидентиране радње", "rcfilters-filter-logactions-description": "Административне радње, прављење налога, брисање страница, отпремања…", - "rcfilters-hideminor-conflicts-typeofchange-global": "Филтер за „мање” измене је у сукобу са једним или више филтера типа измена, зато што одређени типови измена не могу да се означе као „мање”. Сукобљени филтери су означени у подручју Активни филтери, изнад.", - "rcfilters-hideminor-conflicts-typeofchange": "Одређени типови измена не могу да се означе као „мање”, тако да је овај филтер у сукобу са следећим филтерима типа измена: $1", + "rcfilters-hideminor-conflicts-typeofchange-global": "Филтер за „мање” измене је у сукобу са једним или више филтера типа промена, зато што одређени типови промена не могу да се означе као „мање”. Сукобљени филтери су означени у подручју Активни филтери, изнад.", + "rcfilters-hideminor-conflicts-typeofchange": "Одређени типови промена не могу да се означе као „мање”, тако да је овај филтер у сукобу са следећим филтерима типа промена: $1", "rcfilters-typeofchange-conflicts-hideminor": "Овај филтер типа измене је у сукобу са филтером за „мање” измене. Одређени типови измена не могу да се означе као „мање”.", - "rcfilters-filtergroup-lastRevision": "Последње измене", + "rcfilters-filtergroup-lastRevision": "Последње ревизије", "rcfilters-filter-lastrevision-label": "Последња измена", - "rcfilters-filter-lastrevision-description": "Само најновија измена на страници.", - "rcfilters-filter-previousrevision-label": "Није последња измена", - "rcfilters-filter-previousrevision-description": "Све измене које нису „последње измене”.", + "rcfilters-filter-lastrevision-description": "Само најновија промена на страници.", + "rcfilters-filter-previousrevision-label": "Није последња ревизија", + "rcfilters-filter-previousrevision-description": "Све промене које нису „последње ревизије“.", "rcfilters-filter-excluded": "Изостављено", "rcfilters-tag-prefix-namespace-inverted": ":није $1", "rcfilters-exclude-button-off": "Изостави означено", @@ -1457,21 +1462,21 @@ "rcfilters-view-tags-help-icon-tooltip": "Сазнајте више о означеним изменама", "rcfilters-liveupdates-button": "Ажурирај уживо", "rcfilters-liveupdates-button-title-on": "Искључите ажурирања уживо", - "rcfilters-liveupdates-button-title-off": "Прикажите нове измене уживо", + "rcfilters-liveupdates-button-title-off": "Прикажите нове промене уживо", "rcfilters-watchlist-markseen-button": "Означи све измене као погледане", "rcfilters-watchlist-edit-watchlist-button": "Промени списак надгледаних страница", - "rcfilters-watchlist-showupdated": "Измене страница које нисте посетили од када је измена извршена су подебљане, са испуњеним ознакама.", + "rcfilters-watchlist-showupdated": "Промене на страницама које нисте посетили од када је измена извршена су подебљане, с испуњеним ознакама.", "rcfilters-preference-label": "Сакриј побољшану верзију скорашњих измена", "rcfilters-preference-help": "Поништава редизајн интерфејса из 2017. и све алатке додате тада и после.", "rcfilters-watchlist-preference-label": "Сакриј побољшану верзију списка надгледања", - "rcfilters-filter-showlinkedfrom-label": "Прикажи измене на страницама са којих долазе везе", + "rcfilters-filter-showlinkedfrom-label": "Прикажи промене на страницама са којих долазе везе", "rcfilters-filter-showlinkedfrom-option-label": "Странице са којих долазе везе до изабране странице", - "rcfilters-filter-showlinkedto-label": "Прикажи измене на страницама ка којима воде везе", + "rcfilters-filter-showlinkedto-label": "Прикажи промене на страницама ка којима воде везе", "rcfilters-filter-showlinkedto-option-label": "Странице ка којима воде везе са изабране странице", "rcfilters-target-page-placeholder": "Унесите име странице (или категорије)", - "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од $3, $4 (до $1 приказано).", - "rclistfromreset": "Ресетуј одабир датума", - "rclistfrom": "Прикажи нове измене почев од $2, $3", + "rcnotefrom": "Испод {{PLURAL:$5|је промена|су промене}} од $3, $4 (до $1 приказано).", + "rclistfromreset": "Ресетуј избор датума", + "rclistfrom": "Прикажи нове промене почев од $2, $3", "rcshowhideminor": "$1 мање измене", "rcshowhideminor-show": "Прикажи", "rcshowhideminor-hide": "Сакриј", @@ -1493,7 +1498,7 @@ "rcshowhidecategorization": "$1 категоризацију страница", "rcshowhidecategorization-show": "Прикажи", "rcshowhidecategorization-hide": "Сакриј", - "rclinks": "Прикажи последњих $1 измена {{PLURAL:$2|претходни дан|у последња $2 дана|у последњих $2 дана}}", + "rclinks": "Прикажи последњих $1 промена {{PLURAL:$2|претходни дан|у последња $2 дана|у последњих $2 дана}}", "diff": "разл", "hist": "ист", "hide": "Сакриј", @@ -1504,23 +1509,23 @@ "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|корисник надгледа|корисника надгледају|корисника надгледају}}]", "rc-change-size": "$1", - "rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајта|бајтова}} после измене", + "rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајта|бајтова}} после промене", "newsectionsummary": "/* $1 */ нови одељак", "rc-enhanced-expand": "Прикажи детаље", "rc-enhanced-hide": "Сакриј детаље", "rc-old-title": "првобитно направљено као „$1“", - "recentchangeslinked": "Сродне измене", + "recentchangeslinked": "Сродне промене", "recentchangeslinked-feed": "Сродне измене", - "recentchangeslinked-toolbox": "Сродне измене", - "recentchangeslinked-title": "Сродне измене са „$1“", + "recentchangeslinked-toolbox": "Сродне промене", + "recentchangeslinked-title": "Измене сродне са „$1“", "recentchangeslinked-summary": "Унесите име странице да бисте видели промене на страницама које су повезане са или са те странице. (Да бисте видели чланове категорије, унесите {{ns:category}}:Име категорије). Промене на страницама које су на [[Special:Watchlist|Вашем списку надгледања]] су подебљане.", "recentchangeslinked-page": "Назив странице:", - "recentchangeslinked-to": "Прикажи измене страница које су повезане с датом страницом", + "recentchangeslinked-to": "Прикажи промене на страницама које су повезане с датом страницом", "recentchanges-page-added-to-category": "[[:$1]] је додата у категорију", "recentchanges-page-added-to-category-bundled": "[[:$1]] је додана у категорију, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]", "recentchanges-page-removed-from-category": "[[:$1]] је уклоњена из категорије", "recentchanges-page-removed-from-category-bundled": "[[:$1]] је уклоњена из категорије, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]", - "autochange-username": "Медијавики аутоматска измена", + "autochange-username": "Аутоматска промена Медијавикија", "upload": "Отпремање датотеке", "uploadbtn": "Отпреми датотеку", "reuploaddesc": "Назад на образац за отпремање", @@ -1531,17 +1536,17 @@ "upload_directory_missing": "Фасцикла за слање ($1) недостаје и сервер је не може направити.", "upload_directory_read_only": "Сервер не може да пише по фасцикли за слање ($1).", "uploaderror": "Грешка при отпремању", - "upload-recreate-warning": "'''Упозорење: датотека с тим називом је обрисана или премештена.'''\n\nИсторија брисања и премештања се налази испод:", - "uploadtext": "Користите образац испод да бисте отпремили датотеке.\nЗа преглед или претрагу постојећих датотека, погледајте [[Special:FileList|списак отпремљених датотека]], поновна отпремања су наведена у [[Special:Log/upload|дневнику отпремања]], а брисања у [[Special:Log/delete|дневнику брисања]].\n\nДатотеку додајете на жељену страницу користећи следеће обрасце:\n* '''[[{{ns:file}}:Слика.jpg]]''' за верзију слике у пуној величини\n* '''[[{{ns:file}}:Слика.png|200п|мини|лево|опис]]''' за верзију слике с величином од 200 пиксела која је приказана у засебном оквиру, заједно с описом.\n* '''[[{{ns:media}}:Датотека.ogg]]''' за директно повезивање с датотеком без њеног приказивања", + "upload-recreate-warning": "Упозорење: датотека с тим називом је обрисана или премештена.\n\nЕвиденција брисања и премештања се налази испод:", + "uploadtext": "Користите образац испод да бисте отпремили датотеке.\nЗа преглед или претрагу постојећих датотека, погледајте [[Special:FileList|списак отпремљених датотека]], поновна отпремања су наведена у [[Special:Log/upload|евиденцији отпремања]], а брисања у [[Special:Log/delete|евиденцији брисања]].\n\nДатотеку додајете на жељену страницу користећи следеће обрасце:\n* '''[[{{ns:file}}:Слика.jpg]]''' за верзију слике у пуној величини\n* '''[[{{ns:file}}:Слика.png|200п|мини|лево|опис]]''' за верзију слике с величином од 200 пиксела која је приказана у засебном оквиру, заједно с описом.\n* '''[[{{ns:media}}:Датотека.ogg]]''' за директно повезивање с датотеком без њеног приказивања", "upload-permitted": "Дозвољени {{PLURAL:$2|тип|типови}} датотека: $1.", "upload-preferred": "Препоручени {{PLURAL:$2|тип|типови}} датотека: $1.", "upload-prohibited": "Забрањени {{PLURAL:$2|тип|типови}} датотека: $1.", - "uploadlogpage": "Дневник отпремања", - "uploadlogpagetext": "Испод је списак скорашњих слања.\nПогледајте [[Special:NewFiles|галерију нових датотека]] за лепши преглед.", + "uploadlogpage": "Евиденција отпремања", + "uploadlogpagetext": "Испод је списак недавних отпремања.\nПогледајте [[Special:NewFiles|галерију нових датотека]] за лепши преглед.", "filename": "Назив датотеке", - "filedesc": "Опис", - "fileuploadsummary": "Опис:", - "filereuploadsummary": "Измене датотеке:", + "filedesc": "Резиме", + "fileuploadsummary": "Резиме:", + "filereuploadsummary": "Промене датотеке:", "filestatus": "Статус ауторског права:", "filesource": "Извор:", "ignorewarning": "Занемари упозорења и сачувај датотеку", @@ -1549,19 +1554,19 @@ "minlength1": "Назив датотеке мора имати барем један знак.", "illegalfilename": "Датотека „$1“ садржи знакове који нису дозвољени у називима страница.\nПромените назив датотеке и поново је пошаљите.", "filename-toolong": "Називи датотека могу имати највише 240 бајтова.", - "badfilename": "Назив датотеке је промењен у „$1“.", - "filetype-mime-mismatch": "Екстензија „.$1“ не одговара препознатој врсти MIME датотеке ($2).", + "badfilename": "Име датотеке је промењено у „$1“.", + "filetype-mime-mismatch": "Проширење датотеке „.$1“ не одговара препознатом типу MIME датотеке ($2).", "filetype-badmime": "Датотеке MIME типа „$1“ није дозвољено слати.", - "filetype-bad-ie-mime": "Ова датотека се не може послати зато што би је Интернет експлорер уочио као „$1“, а то је забрањена и опасна врста датотеке.", - "filetype-unwanted-type": "„.$1“ је непожељна врста датотеке.\n{{PLURAL:$3|Пожељна врста датотеке је|Пожељне врсте датотека су}} $2.", - "filetype-banned-type": "'''„.$1“''' {{PLURAL:$4|је забрањена врста датотеке|су забрањене врсте датотека}}.\n{{PLURAL:$3|Дозвољена врста датотеке је|Дозвољене врсте датотека су}} $2.", - "filetype-missing": "Ова датотека нема екстензију (нпр. „.jpg“).", + "filetype-bad-ie-mime": "Не могу да отпремим ову датотеку јер би је Интернет експлорер препознао као „$1“, што је недозвољен и потенцијално опасан тип датотеке.", + "filetype-unwanted-type": "„.$1“ је непожељан тип датотеке.\n{{PLURAL:$3|Пожељан тип датотеке је|Пожељни типови датотека су}} $2.", + "filetype-banned-type": "„.$1“ {{PLURAL:$4|није допуштен тип датотеке|нису допуштени типови датотека}}.\n{{PLURAL:$3|Дозвољен тип датотеке је|Дозвољени типови датотека су}} $2.", + "filetype-missing": "Ова датотека нема проширење (нпр. „.jpg“).", "empty-file": "Послата датотека је празна.", "file-too-large": "Послата датотека је превелика.", "filename-tooshort": "Назив датотеке је прекратак.", - "filetype-banned": "Врста датотеке је забрањена.", + "filetype-banned": "Овај тип датотеке је забрањен.", "verification-error": "Ова датотека није прошла проверу.", - "hookaborted": "Измена је одбачена од куке за проширења.", + "hookaborted": "Измену коју сте покушали да направите је прекинуо додатак.", "illegal-filename": "Назив датотеке је забрањен.", "overwrite": "Замењивање постојеће датотеке је забрањено.", "unknown-error": "Дошло је до непознате грешке.", @@ -1570,15 +1575,15 @@ "large-file": "Препоручљиво је да датотеке не буду веће од $1; ова датотека је $2.", "largefileserver": "Ова датотека прелази ограничење величине.", "emptyfile": "Датотека коју сте послали је празна.\nУзрок може бити грешка у називу датотеке.\nПроверите да ли заиста желите да је пошаљете.", - "windows-nonascii-filename": "Овај вики не подржава називе датотека с посебним знацима.", - "fileexists": "Датотека с овим називом већ постоји. Погледајте [[:$1]] ако нисте сигурни да ли желите да је промените.\n[[$1|thumb]]", + "windows-nonascii-filename": "Овај вики не подржава имена датотека са посебним знацима.", + "fileexists": "Датотека с овим именом већ постоји. Погледајте [[:$1]] ако нисте сигурни да ли желите да је промените.\n[[$1|thumb]]", "filepageexists": "Страница с описом ове датотеке је већ направљена овде [[:$1]], иако датотека не постоји.\nОпис који сте навели се неће појавити на страници с описом.\nДа би се ваш опис овде нашао, потребно је да га ручно измените.\n[[$1|thumb]]", "fileexists-extension": "Датотека са сличним називом већ постоји: [[$2|thumb]]\n* Назив датотеке коју шаљете: [[:$1]]\n* Назив постојеће датотеке: [[:$2]]\nДа ли желите да користите препознатљивије име?", "fileexists-thumbnail-yes": "Изгледа да је датотека умањено издање слике ''(thumbnail)''.\n[[$1|thumb]]\nПроверите датотеку [[:$1]].\nАко је проверена датотека иста слика оригиналне величине, није потребно слати додатну слику.", "file-thumbnail-no": "Датотека почиње са $1.\nИзгледа да се ради о умањеној слици ''(thumbnail)''.\nУколико имате ову слику у пуној величини, пошаљите је, а ако немате, промените назив датотеке.", "fileexists-forbidden": "Датотека с овим називом већ постоји и не може се заменити.\nАко и даље желите да пошаљете датотеку, вратите се и изаберите други назив.\n[[File:$1|thumb|center|$1]]", - "fileexists-shared-forbidden": "Датотека с овим називом већ постоји у заједничкој остави.\nВратите се и пошаљите датотеку с другим називом.\n[[File:$1|thumb|center|$1]]", - "fileexists-no-change": "Датотека је дупликат тренутне верзије [[:$1]].", + "fileexists-shared-forbidden": "Датотека са овим називом већ постоји у заједничкој остави.\nВратите се и пошаљите датотеку са другим називом.\n[[File:$1|thumb|center|$1]]", + "fileexists-no-change": "Датотека је дупликат актуелне верзије [[:$1]].", "fileexists-duplicate-version": "Датотека је дупликат {{PLURAL:$2|старе верзије|старих верзија}} [[:$1]].", "file-exists-duplicate": "Ово је дупликат {{PLURAL:$1|следеће датотеке|следећих датотека}}:", "file-deleted-duplicate": "Датотека истоветна овој ([[:$1]]) је претходно обрисана.\nПогледајте историју брисања пре поновног слања.", @@ -1593,14 +1598,14 @@ "php-uploaddisabledtext": "Отпремање датотека је онемогућено у PHP-у.\nПроверите подешавања file_uploads.", "uploadscripted": "Датотека садржи HTML или скриптни код који може бити погрешно протумачен од стране прегледача.", "upload-scripted-pi-callback": "Датотека која садржи инструкције за обраду XML стилског облика се не може отпремити.", - "upload-scripted-dtd": "Није могуће отпремање SVG датотека које садрже нестандардну DTD декларацију.", + "upload-scripted-dtd": "Не могу да отпремим SVG датотеке које садрже нестандардну DTD декларацију.", "uploaded-script-svg": "Пронађен скриптни елеменат „$1“ у постављеној SVG датотеци.", "uploaded-hostile-svg": "Пронађен небезбедан CSS у стилском елементу постављене SVG датотеке.", "uploaded-event-handler-on-svg": "Није дозвољено постављање атрибута који контролишу догађаје $1=\"$2\" у SVG датотекама.", "uploaded-href-unsafe-target-svg": "Пронађен href са несигурним подацима: URI одредиште <$1 $2=\"$3\"> у постављеној SVG датотеци.", "uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <$1 $2=\"$3\"> у постављеној SVG датотеци.", "uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „$1“", - "uploadinvalidxml": "Није могуће рашчланити XML отпремљене датотеке.", + "uploadinvalidxml": "Не могу да рашчланим XML у отпремљеној датотеци.", "uploadvirus": "Датотека садржи вирус!\nДетаљи: $1", "uploadjava": "Датотека је формата ZIP који садржи јава .class елемент.\nСлање јава датотека није дозвољено јер оне могу изазвати заобилажење сигурносних ограничења.", "upload-source": "Изворна датотека", @@ -1614,12 +1619,12 @@ "filewasdeleted": "Датотека с овим називом је раније послата, али је обрисана.\nПроверите $1 пре него што наставите с поновним слањем.", "filename-bad-prefix": "Назив датотеке коју шаљете почиње са „$1“, а њега обично додељују дигитални фотоапарати.\nИзаберите назив датотеке који описује њен садржај.", "filename-prefix-blacklist": " #
    \n# Синтакса је следећа:\n#   * Све од тарабе па до краја реда је коментар\n#   * Сваки ред означава префикс типичних назива датотека које додељивају дигитални апарати\nCIMG # Касио\nDSC_ # Никон\nDSCF # Фуџи\nDSCN # Никон\nDUW # неки мобилни телефони\nIMG # опште\nJD # Џеноптик\nMGP # Пентакс\nPICT # разно\n #
    ", - "upload-proto-error": "Неисправан протокол", + "upload-proto-error": "Неважећи протокол", "upload-proto-error-text": "Слање са спољне локације захтева адресу која почиње са http:// или ftp://.", "upload-file-error": "Унутрашња грешка", "upload-file-error-text": "Дошло је до унутрашње грешке при отварању привремене датотеке на серверу.\nКонтактирајте [[Special:ListUsers/sysop|администратора]].", "upload-misc-error": "Непозната грешка при слању датотеке", - "upload-misc-error-text": "Непозната грешка при слању датотеке.\nПроверите да ли је адреса исправна и покушајте поново.\nАко се проблем не реши, контактирајте [[Special:ListUsers/sysop|администратора]].", + "upload-misc-error-text": "Непозната грешка при отпремању датотеке.\nПроверите да ли је адреса валидна и покушајте поново.\nАко се проблем не реши, контактирајте [[Special:ListUsers/sysop|администратора]].", "upload-too-many-redirects": "Адреса садржи превише преусмерења", "upload-http-error": "Дошло је до HTTP грешке: $1", "upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.", @@ -1644,7 +1649,7 @@ "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 већ постоји.", @@ -1657,7 +1662,7 @@ "backend-fail-read": "Не могу да прочитам датотеку $1.", "backend-fail-create": "Не могу да запишем датотеку $1.", "backend-fail-maxsize": "Не могу да запишем датотеку $1 јер је већа од {{PLURAL:$2|$2 бајта|$2 бајта|$2 бајтова}}.", - "backend-fail-readonly": "Складишна основа „$1“ тренутно не може да се записује. Наведени разлог гласи: $2", + "backend-fail-readonly": "Складишна основа „$1“ је тренутно само за читање. Наведени разлог је: $2", "backend-fail-synced": "Датотека „$1“ је недоследна између унутрашњих складишних основа", "backend-fail-connect": "Не могу да се повежем са складишном основом „$1“.", "backend-fail-internal": "Дошло је до непознате грешке у складишној основи „$1“.", @@ -1670,7 +1675,7 @@ "lockmanager-fail-closelock": "Не могу да затворим катанац за „$1“.", "lockmanager-fail-deletelock": "Не могу да обришем катанац за „$1“.", "lockmanager-fail-acquirelock": "Не могу да се закључам за „$1“.", - "lockmanager-fail-openlock": "Не могу да отворим катанац за „$1“. Уверите се да је Ваш директоријум за отпремање исправно конфигурисан и да Ваш веб-сервер има дозволу да пише у том директоријуму. Погледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory за више информација.", + "lockmanager-fail-openlock": "Не могу да отворим катанац за „$1“. Уверите се да је ваш директоријум за отпремање исправно конфигурисан и да ваш веб-сервер има дозволу да пише у том директоријуму. Погледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory за више информација.", "lockmanager-fail-releaselock": "Не могу да ослободим катанац за „$1“.", "lockmanager-fail-db-bucket": "Не могу да контактирам с довољно катанаца у канти $1.", "lockmanager-fail-db-release": "Не могу да ослободим катанце у бази $1.", @@ -1680,7 +1685,7 @@ "zip-wrong-format": "Наведена датотека није формата ZIP.", "zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.", "zip-unsupported": "Датотека је формата ZIP који користи могућности које не подржава Медијавики.\nБезбедносна провера не може да се изврши како треба.", - "uploadstash": "Тајно складиште", + "uploadstash": "Отпремање низа датотека", "uploadstash-summary": "Ова страница пружа приступ датотекама које су отпремљене или се отпремају, али још нису објављене. Ове датотеке нису видљиве никоме, осим кориснику који их је отпремио.", "uploadstash-clear": "Очисти сакривене датотеке", "uploadstash-nofiles": "Немате сакривене датотеке.", @@ -1690,23 +1695,24 @@ "uploadstash-thumbnail": "погледај минијатуру", "uploadstash-exception": "Не могу сачувати датотеку у складиште ($1): „$2“.", "uploadstash-bad-path": "Путања не постоји.", - "uploadstash-bad-path-invalid": "Путања није исправна.", + "uploadstash-bad-path-invalid": "Путања није валидна.", "uploadstash-bad-path-unknown-type": "Непознат тип „$1“.", "uploadstash-bad-path-unrecognized-thumb-name": "Непрепознато име минијатуре.", "uploadstash-bad-path-bad-format": "Кључ „$1“ није у одговарајућем облику.", + "uploadstash-file-not-found": "Кључ „$1” није пронађен у складишту.", "uploadstash-file-not-found-no-thumb": "Не могу добити минијатуру.", "uploadstash-file-not-found-no-local-path": "Нема локалне путање за умањену ставку.", "uploadstash-file-not-found-no-object": "Не могу направити локални датотечни објекат за минијатуру.", "uploadstash-file-not-found-no-remote-thumb": "Добављање минијатуре није успело: $1\nАдреса = $2", - "uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за врсту садржаја.", + "uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за тип садржаја.", "uploadstash-file-not-found-not-exists": "Не могу наћи путању или ово није обична датотека.", "uploadstash-file-too-large": "Не могу послужити датотеку већу од $1 {{PLURAL:$1|бајта|бајтова}}", "uploadstash-not-logged-in": "Нико није пријављен. Датотеке морају припадати корисницима.", - "uploadstash-wrong-owner": "Ова датотека ($1) не припада тренутном кориснику.", + "uploadstash-wrong-owner": "Ова датотека ($1) не припада актуелном кориснику.", "uploadstash-no-such-key": "Нема таквог кључа ($1). Не могу уклонити.", - "uploadstash-no-extension": "Нема траженог додатка.", + "uploadstash-no-extension": "Додатак је празан.", "uploadstash-zero-length": "Датотека је празна", - "invalid-chunk-offset": "Неисправна полазна тачка", + "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?uselang=sr-ec.", "img-auth-notindir": "Захтевана путања није у подешеној фасцикли за отпремање.", @@ -1717,15 +1723,16 @@ "img-auth-streaming": "Учитавам „$1“...", "img-auth-public": "Сврха img_auth.php је да прослеђује датотеке из приватних викија.\nОвај вики је постављен као јавни.\nРади сигурности, img_auth.php је онемогућен.", "img-auth-noread": "Корисник нема приступ за читање „$1“.", - "http-invalid-url": "Неисправна адреса: $1", + "http-invalid-url": "Неважећи URL: $1", "http-invalid-scheme": "Адресе са шемом „$1“ нису подржане.", "http-request-error": "HTTP захтев није прошао због непознате грешке.", "http-read-error": "HTTP грешка при читању.", "http-timed-out": "Захтев HTTP је истекао.", "http-curl-error": "Грешка при отварању адресе: $1", "http-bad-status": "Дошло је до проблема током захтева HTTP: $1 $2", + "http-internal-error": "HTTP интерна грешка.", "upload-curl-error6": "Не могу да приступим адреси", - "upload-curl-error6-text": "Не могу да приступим наведеној адреси.\nПроверите да ли је адреса исправна и доступна.", + "upload-curl-error6-text": "Не могу да приступим наведеном URL-у.\nПроверите да ли је URL исправан и доступан.", "upload-curl-error28": "Отпремање је истекло", "upload-curl-error28-text": "Сервер не одговара на упит.\nПроверите да ли сајт ради, мало осачекајте и покушајте поново.\nПробајте касније када буде мање оптерећење.", "license": "Лиценца:", @@ -1733,7 +1740,7 @@ "nolicense": "Није изабрано", "licenses-edit": "Уреди избор лиценци", "license-nopreview": "(преглед није доступан)", - "upload_source_url": "(ваша изабрана датотека од исправних и јавно доступних адреса)", + "upload_source_url": "(ваша изабрана датотека од важећих, јавно доступних адреса)", "upload_source_file": "(ваша одабрана датотека са вашег рачунара)", "listfiles-delete": "обриши", "listfiles-summary": "Ова посебна страница приказује све отпремљене датотеке.", @@ -1749,16 +1756,16 @@ "listfiles_description": "Опис", "listfiles_count": "Верзије", "listfiles-show-all": "Обухвати старе верзије датотека", - "listfiles-latestversion": "Тренутна верзија", + "listfiles-latestversion": "Актуелна верзија", "listfiles-latestversion-yes": "Да", "listfiles-latestversion-no": "Не", "file-anchor-link": "Датотека", "filehist": "Историја датотеке", - "filehist-help": "Кликните на датум/време да видите тадашњу верзију датотеке.", + "filehist-help": "Кликните на датум/време да бисте видели тадашњу верзију датотеке.", "filehist-deleteall": "обриши све", "filehist-deleteone": "обриши", "filehist-revert": "врати", - "filehist-current": "тренутно", + "filehist-current": "актуелна", "filehist-datetime": "Датум/време", "filehist-thumb": "Минијатура", "filehist-thumbtext": "Минијатура за верзију на дан $1", @@ -1769,9 +1776,9 @@ "filehist-comment": "Коментар", "imagelinks": "Употреба датотеке", "linkstoimage": "{{PLURAL:$1|Следећа страница користи|$1 следеће странице користе|$1 следећих страница користи}} ову датотеку:", - "linkstoimage-more": "Више од $1 {{PLURAL:$1|страница|странице|страница}} је повезано с овом датотеком.\nСледећи списак приказује само {{PLURAL:$1|прву страницу повезану|прве $1 странице повезане|првих $1 страница повезаних}} с овом датотеком.\nДоступан је и [[Special:WhatLinksHere/$2|потпуни списак]].", + "linkstoimage-more": "Више од $1 {{PLURAL:$1|странице користи|странице користе|страница користе}} ову датотеку.\nСледећи списак приказује само {{PLURAL:$1|прву страницу која користи|прве $1 странице које користе|првих $1 страница које користе}} ову датотеку.\nДоступан је и [[Special:WhatLinksHere/$2|потпуни списак]].", "nolinkstoimage": "Нема страница које користе ову датотеку.", - "morelinkstoimage": "Погледајте [[Special:WhatLinksHere/$1|више веза]] до ове датотеке.", + "morelinkstoimage": "Погледајте [[Special:WhatLinksHere/$1|више линкова]] до ове датотеке.", "linkstoimage-redirect": "$1 (преусмерење датотеке) $2", "duplicatesoffile": "{{PLURAL:$1|Следећа датотека је дупликат|Следеће $1 датотеке су дупликати|Следећих $1 датотека су дупликати}} ове датотеке ([[Special:FileDuplicateSearch/$2|детаљније]]):", "sharedupload": "Ова датотека се налази на $1 и може се користити и на другим пројектима.", @@ -1789,13 +1796,13 @@ "upload-disallowed-here": "Не можете да замените ову датотеку.", "filerevert": "Врати $1", "filerevert-legend": "Врати датотеку", - "filerevert-intro": "Враћате датотеку '''[[Media:$1|$1]]''' на [$4 издање од $2; $3].", + "filerevert-intro": "Враћате датотеку [[Media:$1|$1]] на [$4 верзију од $2; $3].", "filerevert-comment": "Разлог:", "filerevert-defaultcomment": "Враћено на верзију од $2, $1 ($3)", "filerevert-submit": "Врати", - "filerevert-success": "Датотека '''[[Media:$1|$1]]''' је враћена на [$4 издање од $2; $3].", - "filerevert-badversion": "Не постоји раније локално издање датотеке с наведеним временским подацима.", - "filerevert-identical": "Тренутна измена датотеке индентична је изабраној.", + "filerevert-success": "Датотека [[Media:$1|$1]] је враћена на [$4 верзију од $2; $3].", + "filerevert-badversion": "Не постоји ранија локална верзија ове датотеке са наведеном временском ознаком.", + "filerevert-identical": "Актуелна верзија датотеке је индентична изабраној.", "filedelete": "Обриши $1", "filedelete-legend": "Обриши датотеку", "filedelete-intro": "Бришете датотеку '''[[Media:$1|$1]]''' заједно с њеном историјом.", @@ -1803,9 +1810,9 @@ "filedelete-comment": "Разлог:", "filedelete-submit": "Обриши", "filedelete-success": "Датотека '''$1''' је обрисана.", - "filedelete-success-old": "Издање '''[[Media:$1|$1]]''' од $2, $3 је обрисано.", + "filedelete-success-old": "Верзија датотеке [[Media:$1|$1]] од $2, $3 је обрисана.", "filedelete-nofile": "Датотека '''$1''' не постоји.", - "filedelete-nofile-old": "Не постоји архивирано издање датотеке '''$1''' с наведеним особинама.", + "filedelete-nofile-old": "Не постоји архивирана верзија датотеке $1 са наведеним особинама.", "filedelete-otherreason": "Други/додатни разлог:", "filedelete-reason-otherlist": "Други разлог", "filedelete-reason-dropdown": "*Најчешћи разлози брисања\n** Кршење ауторских права\n** Дупликати датотека", @@ -1814,11 +1821,11 @@ "filedelete-maintenance-title": "Не могу да обришем датотеку", "mimesearch": "MIME претрага", "mimesearch-summary": "Ова страница омогућава филтрирање датотека према њиховим MIME типовима.\nУлазни подаци: contenttype/subtype или contenttype/*, нпр. image/jpeg.", - "mimetype": "MIME врста:", + "mimetype": "MIME тип:", "download": "преузми", "unwatchedpages": "Ненадгледане странице", "listredirects": "Списак преусмерења", - "listduplicatedfiles": "Списак дуплираних датотека", + "listduplicatedfiles": "Списак датотека са дупликатима", "listduplicatedfiles-summary": "Ово је списак датотека које су дупликат неких других датотека. Само локалне датотеке су приказане.", "listduplicatedfiles-entry": "[[:File:$1|$1]] има [[$3|{{PLURAL:$2|један дупликат|$2 дупликата}}]].", "unusedtemplates": "Некоришћени шаблони", @@ -1848,7 +1855,7 @@ "statistics-users": "Регистровани корисници", "statistics-users-active": "Активни корисници", "statistics-users-active-desc": "Корисници који су извршили бар једну радњу {{PLURAL:$1|1=претходни дан|у последња $1 дана|у последњих $1 дана}}", - "pageswithprop": "Стране с особином стране", + "pageswithprop": "Странице са својством странице", "pageswithprop-legend": "Стране с особином стране", "pageswithprop-text": "Ова страна излистава стране које имају одређену особину", "pageswithprop-prop": "Име особине:", @@ -1858,26 +1865,26 @@ "pageswithprop-prophidden-long": "сакривено дуго текстуално својство ($1)", "pageswithprop-prophidden-binary": "сакривено дуго бинарно својство ($1)", "doubleredirects": "Двострука преусмерења", - "doubleredirectstext": "Ова страница приказује странице које преусмеравају на друга преусмерења.\nСваки ред садржи везе према првом и другом преусмерењу, као и одредишну страницу другог преусмерења која је обично „прави“ чланак на кога прво преусмерење треба да упућује.\nПрецртани уноси су већ решени.", + "doubleredirectstext": "Ова страница приказује странице које преусмеравају на друга преусмерења.\nСваки ред садржи линкове према првом и другом преусмерењу, као и одредишну страницу другог преусмерења која је обично „прави“ чланак на кога прво преусмерење треба да упућује.\nПрецртани уноси су већ решени.", "double-redirect-fixed-move": "[[$1]] је премештен.\nАутоматски је ажурирано и сада преусмерава на [[$2]].", "double-redirect-fixed-maintenance": "Аутоматски исправља двострука преусмерења из [[$1]] у [[$2]] као део одржавања", "double-redirect-fixer": "Исправљач преусмерења", "brokenredirects": "Покварена преусмерења", - "brokenredirectstext": "Следећа преусмерења упућују на непостојеће странице:", + "brokenredirectstext": "Следећа преусмерења воде на непостојеће странице:", "brokenredirects-edit": "уреди", "brokenredirects-delete": "обриши", - "withoutinterwiki": "Странице без језичких веза", - "withoutinterwiki-summary": "Следеће странице нису повезане с другим језицима.", + "withoutinterwiki": "Странице без језичких линкова", + "withoutinterwiki-summary": "Следеће странице немају линкове према верзијама на другим језицима.", "withoutinterwiki-legend": "Префикс", "withoutinterwiki-submit": "Прикажи", - "fewestrevisions": "Странице с најмање измена", + "fewestrevisions": "Странице са најмање ревизија", "nbytes": "$1 {{PLURAL:$1|бајт|бајта|бајтова}}", "ncategories": "$1 {{PLURAL:$1|категорија|категорије|категорија}}", "ninterwikis": "$1 {{PLURAL:$1|међувики|међувикија|међувикија}}", - "nlinks": "$1 {{PLURAL:$1|веза|везе|веза}}", + "nlinks": "$1 {{PLURAL:$1|линк|линка|линкова}}", "nmembers": "$1 {{PLURAL:$1|члан|члана|чланова}}", "nmemberschanged": "$1 → $2 {{PLURAL:$2|члан|члана|чланова}}", - "nrevisions": "$1 {{PLURAL:$1|измена|измене|измена}}", + "nrevisions": "$1 {{PLURAL:$1|ревизија|ревизије|ревизија}}", "nimagelinks": "Користи се на $1 {{PLURAL:$1|страници|странице|страница}}", "ntransclusions": "користи се на $1 {{PLURAL:$1|страници|странице|страница}}", "specialpage-empty": "Нема резултата за овај извештај.", @@ -1891,46 +1898,46 @@ "unusedimages": "Некоришћене датотеке", "wantedcategories": "Тражене категорије", "wantedpages": "Тражене странице", - "wantedpages-summary": "Списак непостојећих страница са највише веза до њих, на овом списку се не налазе странице до којих воде преусмерења. За списак покварених преусмерења погледајте [[{{#special:BrokenRedirects}}|списак покварених преусмерења]].", - "wantedpages-badtitle": "Неисправан наслов у сету резултата: $1", + "wantedpages-summary": "Списак непостојећих страница са највише линкова до њих, на овом списку се не налазе странице до којих воде преусмерења. За списак покварених преусмерења погледајте [[{{#special:BrokenRedirects}}|списак покварених преусмерења]].", + "wantedpages-badtitle": "Неважећи наслов у скупу резултата: $1", "wantedfiles": "Тражене датотеке", "wantedfiletext-cat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити поништене са списка. Поред тога, странице које садрже непостојеће датотеке се налазе [[:$1|овде]].", "wantedfiletext-nocat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити поништене са списка.", "wantedfiletext-nocat-noforeign": "Следеће датотеке се користе, али не постоје.", "wantedtemplates": "Тражени шаблони", - "mostlinked": "Странице с највише веза", - "mostlinkedcategories": "Категорије с највише веза", - "mostlinkedtemplates": "Странице с највише веза", - "mostcategories": "Странице с највише категорија", - "mostimages": "Датотеке с највише веза", + "mostlinked": "Странице са највише линкова", + "mostlinkedcategories": "Категорије са највише веза", + "mostlinkedtemplates": "Странице са највише веза", + "mostcategories": "Странице са највише категорија", + "mostimages": "Датотеке са највише линкова", "mostinterwikis": "Странице са највише међувикија", - "mostrevisions": "Странице с највише измена", - "prefixindex": "Све странице с префиксом", + "mostrevisions": "Странице са највише ревизија", + "prefixindex": "Све странице са префиксом", "prefixindex-namespace": "Све странице с предметком (именски простор $1)", "prefixindex-submit": "Прикажи", "prefixindex-strip": "Сакриј префикс у списку", "shortpages": "Кратке странице", "longpages": "Дугачке странице", - "deadendpages": "Странице без унутрашњих веза", - "deadendpagestext": "Следеће странице немају везе до других страница на овом викију.", + "deadendpages": "Ћорсокаци", + "deadendpagestext": "Следеће странице немају линкове до других страница на овом викију.", "protectedpages": "Заштићене странице", "protectedpages-filters": "Филтери:", "protectedpages-indef": "Само неограничене заштите", - "protectedpages-summary": "На овој страници се налази списак тренутно заштићених страница. За списак заштићених наслова види [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].", + "protectedpages-summary": "На овој страници се налази списак постојећих страница које су тренутно заштићене. За списак наслова који су заштићени од прављења, погледајте [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].", "protectedpages-cascade": "Само преносиве заштите", "protectedpages-noredirect": "Сакриј преусмерења", "protectedpagesempty": "Нема заштићених страница с овим параметрима.", - "protectedpages-timestamp": "Време и датум", + "protectedpages-timestamp": "Временска ознака", "protectedpages-page": "Страница", "protectedpages-expiry": "Истиче", "protectedpages-performer": "Заштитио", - "protectedpages-params": "Ниво заштите", + "protectedpages-params": "Параметри заштите", "protectedpages-reason": "Разлог", "protectedpages-submit": "Прикажи странице", "protectedpages-unknown-timestamp": "нема", "protectedpages-unknown-performer": "нема", "protectedtitles": "Заштићени наслови", - "protectedtitles-summary": "На овој страници се налази списак тренутно заштићених наслова. За списак тренутно заштићених страница види [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].", + "protectedtitles-summary": "На овој страници се налазе наслови који су тренутно заштићени од прављења. За списак постојећих страница које су заштићене, погледајте [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].", "protectedtitlesempty": "Нема заштићених наслова с овим параметрима.", "protectedtitles-submit": "Прикажи наслове", "listusers": "Списак корисника", @@ -1974,9 +1981,9 @@ "apisandbox-dynamic-parameters-add-placeholder": "Назив параметра", "apisandbox-dynamic-error-exists": "Параметар под називом \"$1\" већ постоји.", "apisandbox-deprecated-parameters": "Застарели параметри", - "apisandbox-fetch-token": "Аутоматски попуни токен", + "apisandbox-fetch-token": "Аутоматски испуни токен", "apisandbox-add-multi": "Додај", - "apisandbox-submit-invalid-fields-title": "Нека поља нису исправна", + "apisandbox-submit-invalid-fields-title": "Нека поља нису валидна", "apisandbox-submit-invalid-fields-message": "Молимо Вас поправите означена поља и покушајте поново.", "apisandbox-results": "Резултати", "apisandbox-sending-request": "Слање API захтева...", @@ -1987,37 +1994,37 @@ "apisandbox-request-format-json-label": "JSON", "apisandbox-request-json-label": "Затражите JSON:", "apisandbox-request-time": "Време за извршавање захтјева: {{PLURAL:$1|$1 милисекунда|$1 милисекунде|$1 милисекунди}}", - "apisandbox-results-fixtoken": "Исправи жетон и пошаљи поново", - "apisandbox-results-fixtoken-fail": "Нисам успео да добијем жетон „$1“.", - "apisandbox-alert-page": "Поља на страници су неисправна.", - "apisandbox-alert-field": "Вредност овог поља је неисправна.", + "apisandbox-results-fixtoken": "Исправи токен и пошаљи поново", + "apisandbox-results-fixtoken-fail": "Неуспело добијање „$1“ токена.", + "apisandbox-alert-page": "Поља на страници нису важећа.", + "apisandbox-alert-field": "Вредност овог поља није важећа.", "apisandbox-continue": "Настави", "apisandbox-continue-clear": "Очисти", "apisandbox-param-limit": "Унесите max да би сте користили највеће ограничење.", "apisandbox-multivalue-all-namespaces": "$1 (сви именски простори)", "apisandbox-multivalue-all-values": "$1 (све вредности)", - "booksources": "Штампани извори", + "booksources": "Књижевни извори", "booksources-search-legend": "Претражи штампане изворе", "booksources-isbn": "ISBN:", "booksources-search": "Претражи", - "booksources-text": "Испод се налази списак веза ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:", - "booksources-invalid-isbn": "Наведени ISBN број није исправан. Проверите да није дошло до грешке при умножавању из првобитног извора.", - "magiclink-tracking-rfc": "Странице с магичним RFC везама", - "magiclink-tracking-pmid": "Странице с магичним PMID везама", - "magiclink-tracking-isbn": "Странице са ISBN магичним везама", + "booksources-text": "Испод се налази списак линкова ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:", + "booksources-invalid-isbn": "Наведени ISBN број није валидан. Проверите да није дошло до грешке при копирању из првобитног извора.", + "magiclink-tracking-rfc": "Странице са магичним RFC линковима", + "magiclink-tracking-pmid": "Странице са магичним PMID линковима", + "magiclink-tracking-isbn": "Странице са ISBN магичним линковима", "specialloguserlabel": "Извршилац:", "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):", - "log": "Дневници", + "log": "Евиденције", "logeventslist-submit": "Прикажи", "logeventslist-more-filters": "Приказ додатних дневника:", - "logeventslist-patrol-log": "Дневник патролирања", - "logeventslist-tag-log": "Дневник ознака", - "all-logs-page": "Сви јавни дневници", - "alllogstext": "Скупни приказ свих доступних историја овог викија.\nМожете сузити приказ одабирући врсту историје, корисничког имена или тражене странице.", - "logempty": "Нема пронађених уноса у дневнику.", + "logeventslist-patrol-log": "Евиденција патролирања", + "logeventslist-tag-log": "Евиденција ознака", + "all-logs-page": "Све јавне евиденције", + "alllogstext": "Скупни приказ свих доступних евиденција са овог викија.\nМожете сузити приказ изабирањем типа евиденције, корисничког имена (осетљиво на мала и велика слова) или тражене странице (такође осетљиво на мала и велика слова).", + "logempty": "Нема пронађених уноса у евиденцији.", "log-title-wildcard": "Претражи наслове који почињу са овим текстом", - "showhideselectedlogentries": "Прикажи/сакриј изабране догађаје", - "log-edit-tags": "Уреди ознаке изабраних уноса у дневницима", + "showhideselectedlogentries": "Промени видљивост изабраних уноса у евиденцији", + "log-edit-tags": "Уреди ознаке изабраних уноса у евиденцијама", "checkbox-select": "Изабери: $1", "checkbox-all": "Све", "checkbox-none": "Ништа", @@ -2035,7 +2042,7 @@ "allpages-bad-ns": "{{SITENAME}} нема именски простор „$1“.", "allpages-hide-redirects": "Сакриј преусмерења", "cachedspecial-viewing-cached-ttl": "Гледате кеширану верзију ове странице, која може бити стара и до $1.", - "cachedspecial-viewing-cached-ts": "Гледате кеширану верзију ове странице, која може да се разликује од тренутне.", + "cachedspecial-viewing-cached-ts": "Гледате кеширану верзију ове странице, која можда није потпуно актуелна.", "cachedspecial-refresh-now": "Погледај најновију.", "categories": "Категоријe", "categories-submit": "Прикажи", @@ -2044,12 +2051,12 @@ "deletedcontributions": "Обрисани кориснички доприноси", "deletedcontributions-title": "Обрисани кориснички доприноси", "sp-deletedcontributions-contribs": "доприноси", - "linksearch": "Претрага спољашњих веза", + "linksearch": "Претрага спољашњих линкова", "linksearch-pat": "Образац претраге:", "linksearch-ns": "Именски простор:", "linksearch-ok": "Претражи", "linksearch-text": "Могу се користити џокери попут „*.wikipedia.org“.\nПотребан је највиши домен, као „*.org“.
    \n{{PLURAL:$2|1=Подржан протокол|Подржани протоколи}}: $1 (задаје http:// ако не наведете протокол).", - "linksearch-line": "$1 веза у $2", + "linksearch-line": "$1 води са $2", "linksearch-error": "Џокери се могу појавити само на почетку адресе.", "listusersfrom": "Прикажи кориснике почев од:", "listusers-submit": "Прикажи", @@ -2086,21 +2093,21 @@ "listgrants": "Дозволе", "listgrants-grant": "Дозвола", "listgrants-rights": "Права", - "trackingcategories": "Медијавики категорије", + "trackingcategories": "Категорије за праћење", "trackingcategories-summary": "Ова посебна страница је списак категорија које су део Медијавикија, оне се аутоматски ажурирају и њихови називи се могу мењати уређивањем системских порука у именском простору {{ns:8}}.", - "trackingcategories-msg": "Праћење категорије", + "trackingcategories-msg": "Категорије за праћење", "trackingcategories-name": "Име поруке", "trackingcategories-desc": "Које странице се налазе у категорији", "restricted-displaytitle-ignored": "Странице са занемареним насловима за приказ", "noindex-category-desc": "Странице које у себи имају магичну реч __NOINDEX__.", "index-category-desc": "Странице које у себи имају магичну реч __INDEX__ и самим тим су индексиране од стране робота.", - "broken-file-category-desc": "Странице које имају везе до непостојећих датотека.", + "broken-file-category-desc": "Страница садржи покварени линк до датотеке (линк за уграђивање датотеке када она не постоји).", "hidden-category-category-desc": "Категорије које у себи имају магичну реч __HIDDENCAT__ и самим тим се не приказују у одељку за категорије на страницама.", "trackingcategories-nodesc": "Опис није доступан.", "trackingcategories-disabled": "Категорија је онемогућена", "mailnologin": "Нема адресе за слање", "mailnologintext": "Морате бити [[Special:UserLogin|пријављени]] и имати ваљану имејл адресу у [[Special:Preferences|подешавањима]] да бисте слали имејлове другим корисницима.", - "emailuser": "Пошаљи имејл", + "emailuser": "Пошаљи имејл овом кориснику/ци", "emailuser-title-target": "Слање имејла {{GENDER:$1|кориснику|корисници}}", "emailuser-title-notarget": "Слање имејла кориснику", "emailpagetext": "Можете да користите доњи образац да пошаљете имејл {{GENDER:$1|овом кориснику|овој корисници}}.\nИмејл који сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.", @@ -2108,20 +2115,20 @@ "usermaildisabled": "Кориснички имејл је онемогућен", "usermaildisabledtext": "Не можете да шаљете имејлове другим корисницима на овом викију", "noemailtitle": "Нема имејл адресе", - "noemailtext": "Овај корисник није навео исправну имејл адресу.", + "noemailtext": "Овај корисник није навео валидну имејл адресу.", "nowikiemailtext": "Овај корисник је одлучио да не прима имејлове од других корисника.", - "emailnotarget": "Непостојеће или неисправно корисничко име примаоца.", + "emailnotarget": "Непостојеће или наважеће корисничко име примаоца.", "emailtarget": "Унос корисничког имена примаоца", "emailusername": "Корисничко име:", "emailusernamesubmit": "Пошаљи", - "email-legend": "Пошаљи имејл другом кориснику", + "email-legend": "Слање имејла другом кориснику пројекта {{SITENAME}}", "emailfrom": "Од:", "emailto": "За:", "emailsubject": "Наслов:", "emailmessage": "Порука:", "emailsend": "Пошаљи", "emailccme": "Пошаљи ми копију поруке на мој имејл.", - "emailccsubject": "Копија ваше поруке кориснику $1: $2", + "emailccsubject": "Копија поруке кориснику/ци $1: $2", "emailsent": "Имејл је послат", "emailsenttext": "Ваша имејл порука је послата.", "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу опције „{{int:emailuser}}“ на викију {{SITENAME}}. Ако одговорите на овај имејл, {{GENDER:$2|Ваш}} имејл ће бити непосредно прослеђен ка {{GENDER:$1|првобитном пошиљаоцу}}, чиме ћете {{GENDER:$2|му|јој}} открити {{GENDER:$2|своју}} имејл адресу.", @@ -2131,26 +2138,26 @@ "watchlist": "Списак надгледања", "mywatchlist": "Списак надгледања", "watchlistfor2": "За $1 $2", - "nowatchlist": "Ваш списак надгледања је празан.", + "nowatchlist": "Немате ништа на свом списку надгледања.", "watchlistanontext": "Морате бити пријављени да бисте гледали и уређивали ставке на вашем списку надгледања.", "watchnologin": "Нисте пријављени", "addwatch": "Додај на списак надгледања", - "addedwatchtext": "Страница „[[:$1]]“ и њена страница за разговор је додата на Ваш [[Special:Watchlist|списак надгледања]].", - "addedwatchtext-talk": "Страница „[[:$1]]” и њена придружена страница је додата на Ваш [[Special:Watchlist|списак надгледања]]", - "addedwatchtext-short": "Страница „$1“ је додата на Ваш списак надгледања.", + "addedwatchtext": "Страница „[[:$1]]“ и њена страница за разговор је додата на ваш [[Special:Watchlist|списак надгледања]].", + "addedwatchtext-talk": "Страница „[[:$1]]” и њена придружена страница је додата на ваш [[Special:Watchlist|списак надгледања]]", + "addedwatchtext-short": "Страница „$1“ је додата на ваш списак надгледања.", "removewatch": "Уклони са списка надгледања", - "removedwatchtext": "Страница „[[:$1]]“ и њена страница за разговор је уклоњена са Вашег [[Special:Watchlist|списка надгледања]].", - "removedwatchtext-short": "Страница „$1“ је уклоњена с вашег списка надгледања.", + "removedwatchtext": "Страница „[[:$1]]“ и њена страница за разговор је уклоњена са вашег [[Special:Watchlist|списка надгледања]].", + "removedwatchtext-short": "Страница „$1“ је уклоњена са вашег списка надгледања.", "watch": "Надгледај", "watchthispage": "Надгледај ову страницу", "unwatch": "Прекини надгледање", "unwatchthispage": "Прекини надгледање", "notanarticle": "Није страница са садржајем", - "notvisiblerev": "Измена је обрисана", - "watchlist-details": "На Вашем списку надгледања {{PLURAL:$1|је $1 страница|су $1 странице|је $1 страница}} (плус странице за разговор).", + "notvisiblerev": "Последња ревизија другог корисника је обрисана.", + "watchlist-details": "Имате {{PLURAL:$1|$1 страницу|$1 странице|$1 страница}} на свом списку надгледања (плус странице за разговор).", "wlheader-enotif": "Обавештење имејлом је омогућено.", - "wlheader-showupdated": "Странице које су измењене откад сте их последњи пут посетили су подебљане.", - "wlnote": "Испод {{PLURAL:$1|је последња измена|су последње $1 измене|је последњих $1 измена}} у {{PLURAL:$2|претходном сату|претходна $2 сата|претходних $2 сати}}, закључно са $3, $4.", + "wlheader-showupdated": "Странице које су промењене откад сте их последњи пут посетили су подебљане.", + "wlnote": "Испод {{PLURAL:$1|је последња промена|су последње $1 промене|је последњих $1 промена}} у {{PLURAL:$2|претходном сату|претходна $2 сата|претходних $2 сати}}, закључно са $3, $4.", "wlshowlast": "Прикажи последњих $1 сати, $2 дана", "watchlist-hide": "Сакриј", "watchlist-submit": "Прикажи", @@ -2174,14 +2181,14 @@ "enotif_subject_restored": "Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио је|вратила је|вратио је}} $2", "enotif_subject_changed": "Страницу $1 на {{SITENAME}} {{GENDER:$2|променио|променила}} је $2", "enotif_body_intro_deleted": "Страницу $1 на {{SITENAME}} {{GENDER:$2|обрисао|обрисала}} је $2 дана $PAGEEDITDATE Погледајте $3.", - "enotif_body_intro_created": "Страницу $1 на {{SITENAME}} {{GENDER:$2|направио|направила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.", - "enotif_body_intro_moved": "Страницу $1 на {{SITENAME}} {{GENDER:$2|преместио|преместила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.", - "enotif_body_intro_restored": "Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио|вратила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.", - "enotif_body_intro_changed": "Страницу $1 на {{SITENAME}} {{GENDER:$2|променио|променила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.", - "enotif_lastvisited": "За све измене од ваше последње посете, погледајте $1.", - "enotif_lastdiff": "Да видите ову измену, погледајте $1.", + "enotif_body_intro_created": "Страницу $1 на пројекту {{SITENAME}} је {{GENDER:$2|направио корисник|направила корисница}} $2 на датум $PAGEEDITDATE Актуелна ревизија се налази на $3.", + "enotif_body_intro_moved": "Страницу $1 на {{SITENAME}} је {{GENDER:$2|преместио корисник|преместила корисница}} $2 на датум $PAGEEDITDATE Актуелна ревизија се налази на $3.", + "enotif_body_intro_restored": "Страницу $1 на пројекту {{SITENAME}} је {{GENDER:$2|вратио корисник|вратила корисница}} $2 на датум $PAGEEDITDATE Актуелна ревизија се налази на $3.", + "enotif_body_intro_changed": "Страницу $1 на пројекту {{SITENAME}} је {{GENDER:$2|променио корисник|променила корисница}} $2 на датум $PAGEEDITDATE Актуелна ревизија се налази на $3.", + "enotif_lastvisited": "За све промене од последње посете, погледајте $1.", + "enotif_lastdiff": "Да бисте видели ову промену, погледајте $1.", "enotif_anon_editor": "анониман корисник $1", - "enotif_body": "Поштовани $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nмејл: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nНеће бити других обавештења у случају даљих измена уколико не посетите ову страницу када сте пријављени.\nМожете и да поништите подешавања обавештења за све странице у вашем списку надгледања.\n\nСрдачан поздрав, {{SITENAME}}\n\n--\nДа бисте променили подешавања имејл обавештења, посетите\n{{canonicalurl:{{#special:Preferences}}}}\n\nДа бисте променили подешавања списка надгледања, посетите\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nДа бисте уклонили ову страницу са списка надгледања, посетите\n$UNWATCHURL\n\nПодршка и даља помоћ:\n$HELPPAGE", + "enotif_body": "Поштовани $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nРезиме уређивача: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nмејл: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nНеће бити других обавештења у случају даљих измена уколико не посетите ову страницу када сте пријављени.\nМожете и да поништите подешавања обавештења за све странице у вашем списку надгледања.\n\nСрдачан поздрав, {{SITENAME}}\n\n--\nДа бисте променили подешавања имејл обавештења, посетите\n{{canonicalurl:{{#special:Preferences}}}}\n\nДа бисте променили подешавања списка надгледања, посетите\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nДа бисте уклонили ову страницу са списка надгледања, посетите\n$UNWATCHURL\n\nПодршка и даља помоћ:\n$HELPPAGE", "enotif_minoredit": "Ово је мања измена", "created": "направљена", "changed": "измењена", @@ -2192,26 +2199,26 @@ "exbeforeblank": "садржај пре брисања је био: „$1“", "delete-confirm": "Брисање странице „$1“", "delete-legend": "Брисање", - "historywarning": "Упозорење: страница коју желите да обришете има историју са $1 {{PLURAL:$1|изменом|измене|измена}}:", + "historywarning": "Упозорење: страница коју желите да обришете има историју са $1 {{PLURAL:$1|ревизијом|ревизије|ревизија}}:", "historyaction-submit": "Прикажи", "confirmdeletetext": "Управо ћете обрисати страницу, укључујући и њену историју.\nПотврдите своју намеру, да разумете последице и да ово радите у складу с [[{{MediaWiki:Policy-url}}|правилима]].", "actioncomplete": "Радња је завршена", "actionfailed": "Радња није успела", - "deletedtext": "Страница „$1“ је обрисана.\nПогледајте ''$2'' за више детаља.", - "dellogpage": "Дневник брисања", - "dellogpagetext": "Испод је списак последњих брисања.", - "deletionlog": "дневник брисања", - "log-name-create": "Дневник прављења страница", - "log-description-create": "Испод је списак скорашњих прављења страница.", + "deletedtext": "Страница „$1“ је обрисана.\nПогледајте ''$2'' за запис недавних брисања.", + "dellogpage": "Евиденција брисања", + "dellogpagetext": "Испод је списак недавних брисања.", + "deletionlog": "евиденција брисања", + "log-name-create": "Евиденција прављења страница", + "log-description-create": "Испод је списак недавних прављења страница.", "logentry-create-create": "$1 је {{GENDER:$2|направио|направила}} страницу $3", - "reverted": "Враћено на ранију измену", + "reverted": "Враћено на ранију ревизију", "deletecomment": "Разлог:", "deleteotherreason": "Други/додатни разлог:", "deletereasonotherlist": "Други разлог", - "deletereason-dropdown": "*Најчешћи разлози за брисање\n** Спам\n** Захтев аутора\n** Кршење ауторских права\n** Вандализам", + "deletereason-dropdown": "* Уобичајени разлози за брисање\n** Непожељан садржај\n** Вандализам\n** Кршење ауторских права\n** Захтев аутора\n** Покварено преусмерење", "delete-edit-reasonlist": "Уреди разлоге брисања", - "delete-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|измене|измена}}.\nБрисање таквих страница је ограничено да би се спречило случајно оптерећење сервера.", - "delete-warning-toobig": "Ова страница има велику историју, преко $1 {{PLURAL:$1|измене|изменe|измена}}.\nЊено брисање може пореметити базу података, стога поступајте с опрезом.", + "delete-toobig": "Ова страница има велику историју измена, преко $1 {{PLURAL:$1|ревизија|ревизије|ревизија}}.\nБрисање таквих страница је ограничено да би се спречило случајно оптерећење сервера.", + "delete-warning-toobig": "Ова страница има велику историју измена, преко $1 {{PLURAL:$1|ревизија|ревизије|ревизија}}.\nЊено брисање може да поремети базу података, стога поступајте с опрезом.", "deleteprotected": "Не можете обрисати ову страницу зато што је заштићена.", "deleting-backlinks-warning": "Упозорење: бришете страницу која је укључена у [[Special:WhatLinksHere/{{FULLPAGENAME}}|друге странице]] или друге странице воде на њу.", "deleting-subpages-warning": "Пажња: Страницу коју желите обрисати има [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|подстраницу|$1 подстранице|$1 подстраница|51=преко 50 подстраница}}]].", @@ -2219,16 +2226,16 @@ "rollbacklink": "врати", "rollbacklinkcount": "врати $1 {{PLURAL:$1|измену|измене|измена}}", "rollbacklinkcount-morethan": "врати више од $1 {{PLURAL:$1|измене|измене|измена}}", - "rollbackfailed": "Неуспешно враћање", + "rollbackfailed": "Враћање није успело", "rollback-missingparam": "Недостаје потребан параметар на захтеву.", - "rollback-missingrevision": "Не могу учитати податке о измени.", + "rollback-missingrevision": "Не могу да учитам податке о ревизији.", "cantrollback": "Не могу да вратим измену.\nПоследњи аутор је уједно и једини.", "alreadyrolled": "Враћање последње измене странице [[:$1]] од стране {{GENDER:$2|корисника|кориснице|корисника}} [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) није успело; неко други је у међувремену изменио или вратио страницу.\n\nПоследњу измену је {{GENDER:$3|направио|направила|направио}} [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).", - "editcomment": "Опис измене: $1.", - "revertpage": "Враћене измене {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]", - "revertpage-nouser": "Измене скривеног корисника су враћене на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]", - "rollback-success": "Измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}} су враћене на последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.", - "rollback-success-notify": "Враћене измене корисника $1;\nвраћено на последњу измену корисника $2. [$3 Прикажи измене]", + "editcomment": "Резиме измене је био: $1.", + "revertpage": "Враћене измене {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]) на последњу ревизију {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]", + "revertpage-nouser": "Враћене измене скривеног корисника на последњу ревизију {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]", + "rollback-success": "Враћене измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}} на последњу ревизију {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.", + "rollback-success-notify": "Враћене измене корисника $1;\nвраћено на последњу ревизију корисника $2. [$3 Прикажи промене]", "sessionfailure-title": "Сесија је окончана", "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nМолимо, поново пошаљите образац.", "changecontentmodel": "Промена модела садржаја странице", @@ -2239,43 +2246,43 @@ "changecontentmodel-submit": "Промени", "changecontentmodel-success-title": "Модел садржаја је промењен", "changecontentmodel-success-text": "Модел садржаја странице [[:$1]] је промењен.", - "changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може претворити у врсту $2.", + "changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може конвертовати у тип $2.", "changecontentmodel-nodirectediting": "Модел садржаја $1 не подржава изравно уређивање", "changecontentmodel-emptymodels-title": "Нема доступних модела садржаја", - "changecontentmodel-emptymodels-text": "Модел садржаја странице [[:$1]] се не може претворити ни у једну другу врсту.", - "log-name-contentmodel": "Дневник промене модела садржаја", + "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": "врати", - "protectlogpage": "Дневник заштите", + "protectlogpage": "Евиденција заштите", "protectlogtext": "Испод је списак заштићених страница.\nПогледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.", "protectedarticle": "је {{GENDER:|заштитио|заштитила}} страницу „[[$1]]“", - "modifiedarticleprotection": "је {{GENDER:|променио|променила}} степен заштите странице „[[$1]]“", + "modifiedarticleprotection": "је {{GENDER:|променио|променила}} ниво заштите странице „[[$1]]“", "unprotectedarticle": "је скинуо заштиту са странице „[[$1]]“", "movedarticleprotection": "је преместио подешавања заштите са „[[$2]]“ на „[[$1]]“", "protectedarticle-comment": "{{GENDER:$2|Заштићена}} страница [[$1]]", - "modifiedarticleprotection-comment": "{{GENDER:$2|Промењен}} ниво заштите [[$1]]", + "modifiedarticleprotection-comment": "је {{GENDER:$2|променио|променила}} ниво заштите странице „[[$1]]”", "unprotectedarticle-comment": "{{GENDER:$2|Скинута}} заштита са [[$1]]", - "protect-title": "Степен заштите за „$1“", - "protect-title-notallowed": "Преглед степена заштите за „$1“", + "protect-title": "Промена нивоа заштите странице „$1“", + "protect-title-notallowed": "Преглед нивоа заштите странице „$1“", "prot_1movedto2": "је преместио [[$1]] на [[$2]]", "protect-badnamespace-title": "Незаштитљив именски простор", "protect-badnamespace-text": "Странице у овом именском простору се не могу заштитити.", - "protect-norestrictiontypes-text": "Ова страница се не може заштитити јер нема доступних врста ограничења.", + "protect-norestrictiontypes-text": "Ова страница се не може заштитити јер нема доступних типова ограничења.", "protect-norestrictiontypes-title": "Незаштитљива страна", "protect-legend": "Подешавања заштите", "protectcomment": "Разлог:", "protectexpiry": "Истиче:", - "protect_expiry_invalid": "Време истека је неисправно.", - "protect_expiry_old": "Време истека је старије од тренутног времена.", + "protect_expiry_invalid": "Време истека није важеће.", + "protect_expiry_old": "Време истека је у прошлости.", "protect-unchain-permissions": "Откључај даљња подешавања заштите", - "protect-text": "Овде можете да погледате и промените степен заштите за страницу '''$1'''.", - "protect-locked-blocked": "Не можете мењати степене заштите док сте блокирани.\nОво су тренутна подешавања странице '''$1''':", - "protect-locked-dblock": "Степени заштите се не могу мењати јер је активна база података закључана.\nОво су подешавања странице '''$1''':", - "protect-locked-access": "Немате овлашћења за мењање степена заштите странице.\nОво су тренутна подешавања странице '''$1''':", - "protect-cascadeon": "Ова страница је тренутно заштићена јер се налази на {{PLURAL:$1|страници која има|страницама које имају}} преносиву заштиту.\nМожете да промените степен заштите, али то неће утицати на преносиву заштиту.", + "protect-text": "Овде можете да погледате и промените ниво заштите странице $1.", + "protect-locked-blocked": "Не можете да мењате нивое заштите док сте блокирани.\nОво су актуелна подешавања странице '''$1''':", + "protect-locked-dblock": "Нивои заштите се не могу мењати јер је активна база података закључана.\nОво су актуелна подешавања странице '''$1''':", + "protect-locked-access": "Ваш налог нема дозволу да мења нивое заштите странице.\nОво су актуелна подешавања странице '''$1''':", + "protect-cascadeon": "Ова страница је тренутно заштићена јер је укључена у {{PLURAL:$1|следећу страницу која има|следеће странице које имају}} укључену преносиву заштиту.\nПромене нивоа заштите ове странице неће да утичу на преносиву заштиту.", "protect-default": "Допуштено свим корисницима", "protect-fallback": "Дозвољено само корисницима са дозволом „$1“", "protect-level-autoconfirmed": "Допуштено само аутоматски потврђеним корисницима", @@ -2284,8 +2291,8 @@ "protect-expiring": "истиче $1 (UTC)", "protect-expiring-local": "истиче $1", "protect-expiry-indefinite": "неодређено", - "protect-cascade": "Заштити све странице које су укључене у ову (преносива заштита)", - "protect-cantedit": "Не можете мењати степене заштите ове странице јер немате овлашћења за уређивање.", + "protect-cascade": "Заштити странице које су укључене у ову (преносива заштита)", + "protect-cantedit": "Не можете да мењате ниво заштите ове странице јер немате дозволу да је уређујете.", "protect-othertime": "Друго време:", "protect-othertime-op": "друго време", "protect-existing-expiry": "Постојеће време истека: $2 у $3", @@ -2296,7 +2303,7 @@ "protect-edit-reasonlist": "Уреди разлоге заштићивања", "protect-expiry-options": "1 сат:1 hour,1 дан:1 day,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,трајно:infinite", "restriction-type": "Дозвола:", - "restriction-level": "Ниво заштите:", + "restriction-level": "Ниво ограничења:", "minimum-size": "Најмања величина", "maximum-size": "Највећа величина:", "pagesize": "(бајтови)", @@ -2307,20 +2314,20 @@ "restriction-level-sysop": "потпуно заштићено", "restriction-level-autoconfirmed": "полузаштићено", "restriction-level-all": "сви нивои", - "undelete": "Приказ обрисаних страница", + "undelete": "Преглед обрисаних страница", "undeletepage": "Преглед и враћање обрисаних страница", - "undeletepagetitle": "'''Следећи садржај се састоји од обрисаних измена странице [[:$1|$1]]'''.", + "undeletepagetitle": "Следећи садржај се састоји од обрисаних ревизија странице [[:$1|$1]].", "viewdeletedpage": "Приказ обрисаних страница", "undeletepagetext": "{{PLURAL:$1|Следећа страница је обрисана, али је још у архиви и може бити враћена|Следеће $1 странице су обрисане, али су још у архиви и могу бити враћене|Следећих $1 страница је обрисано, али су још у архиви и могу бити враћене}}.\nАрхива се повремено чисти од оваквих страница.", - "undelete-fieldset-title": "Враћање измена", - "undeleteextrahelp": "Да бисте вратили целу историју странице, оставите све кућице неозначене и кликните на дугме '''''{{int:undeletebtn}}'''''.\nАко желите да вратите одређене измене, означите их и кликните на '''''{{int:undeletebtn}}'''''.", + "undelete-fieldset-title": "Враћање ревизија", + "undeleteextrahelp": "Да бисте вратили целу историју странице, оставите све кућице неозначене и кликните на дугме {{int:undeletebtn}}.\nАко желите да вратите одређене ревизије, означите их и кликните на {{int:undeletebtn}}.", "undeleterevisions": "{{PLURAL:$1|Измена}} обрисано: $1", - "undeletehistory": "Ако вратите страницу, све измене ће бити враћене њеној историји.\nАко је у међувремену направљена нова страница с истим називом, враћене измене ће се појавити у њеној ранијој историји.", - "undeleterevdel": "Враћање неће бити извршено ако је резултат тога делимично брисање последње измене.\nУ таквим случајевима морате искључити или открити најновије обрисане измене.", - "undeletehistorynoadmin": "Ова страница је обрисана.\nРазлог за брисање се налази испод, заједно с детаљима о кориснику који је изменио ову страницу пре брисања.\nТекст обрисаних измена је доступан само администраторима.", + "undeletehistory": "Ако вратите страницу, све ревизије ће бити враћене њеној историји.\nАко је у међувремену направљена нова страница с истим називом, враћене ревизије ће се појавити у њеној ранијој историји.", + "undeleterevdel": "Враћање неће бити извршено ако је резултат тога делимично брисање последње ревизије.\nУ таквим случајевима морате искључити или открити најновије обрисане ревизије.", + "undeletehistorynoadmin": "Ова страница је обрисана.\nРазлог за брисање се налази испод, заједно с детаљима о кориснику који је уредио ову страницу пре брисања.\nТекст обрисаних ревизија је доступан само администраторима.", "undelete-revision": "Обрисана измена странице $1 (дана $4; $5) од стране {{GENDER:$3|корисника|кориснице|корисника}} $3:", - "undeleterevision-missing": "Неисправна или непостојећа измена.\nМожда сте унели погрешну везу, или је измена враћена или уклоњена из архиве.", - "undeleterevision-duplicate-revid": "Не могу вратити {{PLURAL:$1|измену|$1 измене|$1 измена}} јер се {{PLURAL:$1|њен|њихов}} rev_id већ користи.", + "undeleterevision-missing": "Неважећа или недостајућа ревизија.\nМожда сте унели лош линк или је ревизија враћена или уклоњена из архиве.", + "undeleterevision-duplicate-revid": "Не могу вратити {{PLURAL:$1|ревизију|$1 ревизије|$1 ревизија}} јер се {{PLURAL:$1|њен|њихов}} rev_id већ користи.", "undelete-nodiff": "Претходне измене нису пронађене.", "undeletebtn": "Врати", "undeletelink": "погледај/врати", @@ -2328,99 +2335,99 @@ "undeleteinvert": "Обрни избор", "undeletecomment": "Разлог:", "cannotundelete": "Враћање једне или свих није успело:\n$1", - "undeletedpage": "Страница $1 је враћена\n\nПогледајте [[Special:Log/delete|дневник брисања]] за записе о скорашњим брисањима и враћањима.", - "undelete-header": "Погледајте [[Special:Log/delete|историјат брисања]] за недавно обрисане странице.", + "undeletedpage": "Страница $1 је враћена\n\nПогледајте [[Special:Log/delete|евиденцију брисања]] за записе о недавним брисањима и враћањима.", + "undelete-header": "Погледајте [[Special:Log/delete|евиденцију брисања]] за недавно обрисане странице.", "undelete-search-title": "Претрага обрисаних страница", "undelete-search-box": "Претражи обрисане странице", "undelete-search-prefix": "Прикажи странице које почињу са:", "undelete-search-full": "Прикажи наслове који садрже:", "undelete-search-submit": "Претражи", - "undelete-no-results": "Одговарајућа страница у дневнику брисања није пронађена.", - "undelete-filename-mismatch": "Не могу да вратим измену датотеке од $1: назив датотеке се не поклапа", + "undelete-no-results": "Није пронађена одговарајућа страница у архиви брисања.", + "undelete-filename-mismatch": "Не могу да вратим ревизију датотеке од $1: назив датотеке се не поклапа.", "undelete-bad-store-key": "Не могу да вратим измену датотеке од $1: датотека је недостајала пре брисања.", "undelete-cleanup-error": "Грешка при брисању некоришћене архиве „$1“.", "undelete-missing-filearchive": "Не могу да вратим архиву с ИБ $1 јер се она не налази у бази података.\nМожда је већ била враћена.", "undelete-error": "Дошло је до грешке при враћању обрисане странице", "undelete-error-short": "Грешка при враћању датотеке: $1", "undelete-error-long": "Дошло је до грешке при враћању датотеке:\n\n$1", - "undelete-show-file-confirm": "Желите ли да видите обрисану измену датотеке „$1“ од $2; $3?", + "undelete-show-file-confirm": "Да ли сте сигурни да желите да погледате обрисану измену датотеке „$1“ од $2 у $3?", "undelete-show-file-submit": "Да", "namespace": "Именски простор:", "invert": "Обрни избор", - "tooltip-invert": "Означите ову кутијуцу да бисте сакрили измене страница у изабраном именском простору (и повезаним именским просторима, ако је означено)", - "tooltip-whatlinkshere-invert": "Означите ову кутијицу за сакривање веза са страница у изабраном именском простору.", + "tooltip-invert": "Означите ову кутијуцу да бисте сакрили промене на страницана у изабраном именском простору (и повезаним именским просторима, ако је означено)", + "tooltip-whatlinkshere-invert": "Означите ову кутијицу за сакривање линкова са страница у изабраном именском простору.", "namespace_association": "Повезани именски простор", "tooltip-namespace_association": "Означите ову кутијицу да бисте укључили и разговор или именски простор теме која је повезана са изабраним именским простором", "blanknamespace": "(главни)", - "contributions": "{{GENDER:$1|Кориснички}} доприноси", + "contributions": "Доприноси {{GENDER:$1|корисника|кориснице}}", "contributions-title": "Доприноси {{GENDER:$1|корисника|кориснице}} $1", "mycontris": "Доприноси", "anoncontribs": "Доприноси", "contribsub2": "За {{GENDER:$3|$1}} ($2)", "contributions-userdoesnotexist": "Кориснички налог „$1“ није отворен.", - "nocontribs": "Нема измена које одговарају наведеним критеријумима.", - "uctop": "(тренутна)", + "nocontribs": "Нису пронађене промене које одговарају овим критеријумима.", + "uctop": "(актуелна)", "month": "од месеца (и раније):", "year": "од године (и раније):", "date": "Од датума (и раније):", - "sp-contributions-newbies": "Прикажи само доприносе нових корисника", + "sp-contributions-newbies": "Прикажи само доприносе нових налога", "sp-contributions-newbies-sub": "За нове кориснике", "sp-contributions-newbies-title": "Доприноси нових корисника", - "sp-contributions-blocklog": "дневник блокирања", - "sp-contributions-suppresslog": "обрисани {{GENDER:$1|кориснички}} доприноси", - "sp-contributions-deleted": "обрисани {{GENDER:$1|доприноси}}", + "sp-contributions-blocklog": "евиденција блокирања", + "sp-contributions-suppresslog": "обрисани доприноси {{GENDER:$1|корисника|кориснице}}", + "sp-contributions-deleted": "обрисани доприноси {{GENDER:$1|корисника|кориснице}}", "sp-contributions-uploads": "отпремања", - "sp-contributions-logs": "дневници", + "sp-contributions-logs": "евиденције", "sp-contributions-talk": "разговор", - "sp-contributions-userrights": "управљање правима {{GENDER:$1|корисника|кориснице|корисника}}", - "sp-contributions-blocked-notice": "Овај корисник је тренутно блокиран. \nИспод су наведени последњи записи у дневнику блокирања:", - "sp-contributions-blocked-notice-anon": "Ова ИП адреса је тренутно блокирана.\nИспод су наведени последњи записи у дневнику блокирања:", + "sp-contributions-userrights": "управљање правима {{GENDER:$1|корисника|кориснице}}", + "sp-contributions-blocked-notice": "Овај корисник је тренутно блокиран. \nПоследњи унос у евиденцији блокирања је наведен испод као референца:", + "sp-contributions-blocked-notice-anon": "Ова IP адреса је тренутно блокирана.\nПоследњи унос у евиденцији блокирања је наведен испод као референца:", "sp-contributions-search": "Претрага доприноса", - "sp-contributions-username": "ИП адреса или корисничко име:", - "sp-contributions-toponly": "Само најновије измене", + "sp-contributions-username": "IP адреса или корисничко име:", + "sp-contributions-toponly": "Прикажи само измене које су најновије ревизије", "sp-contributions-newonly": "Само измене којима су направљене нове странице", "sp-contributions-hideminor": "Сакриј мање измене", "sp-contributions-submit": "Претражи", "whatlinkshere": "Шта води овде", - "whatlinkshere-title": "Странице које су повезане са „$1”", + "whatlinkshere-title": "Странице које воде на страницу „$1”", "whatlinkshere-page": "Страница:", - "linkshere": "Следеће странице имају везу до $2:", + "linkshere": "Следеће странице воде на страницу $2:", "nolinkshere": "Ниједна страница није повезана са: $2.", - "nolinkshere-ns": "Ниједна страница не води до '''$2''' у изабраном именском простору.", + "nolinkshere-ns": "Ниједна страница не води на страницу $2 у изабраном именском простору.", "isredirect": "преусмерење", "istemplate": "укључивање", - "isimage": "веза до датотеке", + "isimage": "линк до датотеке", "whatlinkshere-prev": "{{PLURAL:$1|претходни|претходна $1|претходних $1}}", "whatlinkshere-next": "{{PLURAL:$1|следећи|следећа $1|следећих $1}}", - "whatlinkshere-links": "← везе", + "whatlinkshere-links": "← линкови", "whatlinkshere-hideredirs": "$1 преусмерења", "whatlinkshere-hidetrans": "$1 укључивања", - "whatlinkshere-hidelinks": "$1 везе", - "whatlinkshere-hideimages": "$1 везе до датотеке", + "whatlinkshere-hidelinks": "$1 линкове", + "whatlinkshere-hideimages": "$1 линкова до датотеке", "whatlinkshere-filters": "Филтери", "whatlinkshere-submit": "Иди", "autoblockid": "Аутоматско блокирање #$1", - "block": "Блокирај корисника", + "block": "Блокирање корисника", "unblock": "Деблокирање корисника", - "blockip": "Блокирај {{GENDER:$1|корисника|корисницу}}", + "blockip": "Блокирање {{GENDER:$1|корисника|кориснице}}", "blockiptext": "Користите доњи образац да бисте забранили приступ за писање с одређене IP адресе или корисничког имена.\nОво би требало да вршите само ради спречавања вандализма, у складу са [[{{MediaWiki:Policy-url}}|смерницама]].\nИзаберите конкретан разлог испод (пример: навођење конкретних страница које су вандализоване). Можете блокирати опсеге IP адреса помоћу [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] синтаксе, највећи дозвољени опсег за IPv4 је /$1 односно /$2 за IPv6.", "ipaddressorusername": "IP адреса или корисничко име:", "ipbexpiry": "Истиче:", "ipbreason": "Разлог:", - "ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уношење лажних информација\n** Уклањање садржаја са страница\n** Постављање веза до спољашњих сајтова\n** Уношење бесмислица у странице\n** Непристојно понашање\n** Употреба више налога\n** Неприхватљиво корисничко име", - "ipb-hardblock": "Онемогући пријављеним корисницима да уређују с ове ИП адресе", + "ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уметање лажних информација\n** Уклањање садржаја са страница\n** Додавање непожељних линкова до спољашњих сајтова\n** Уношење бесмислица/графита у странице\n** Непристојно понашање\n** Употреба више налога\n** Неприхватљиво корисничко име", + "ipb-hardblock": "Спречи пријављене кориснике да уређују с ове IP адресе", "ipbcreateaccount": "Онемогући отварање налога", "ipbemailban": "Спречи корисника да шаље имејлове", - "ipbenableautoblock": "Аутоматски блокирај последњу ИП адресу овог корисника и све даљње адресе с којих покуша да уређује", + "ipbenableautoblock": "Аутоматски блокирај последњу IP адресу овог корисника и све даљње адресе с којих покуша да уређује", "ipbsubmit": "Блокирај овог корисника", "ipbother": "Друго време:", "ipboptions": "2 сата:2 hours,1 дан:1 day,3 дана:3 days,1 недеља:1 week,2 недеље:2 weeks,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year,трајно:infinite", "ipbhidename": "Сакриј корисничко име са измена и спискова", "ipbwatchuser": "Надгледај корисничке странице и странице за разговор овог корисника", "ipb-disableusertalk": "Онемогући кориснику да уређује своју страницу за разговор", - "ipb-change-block": "Поново блокирај корисника с овим поставкама", + "ipb-change-block": "Поновно блокирај корисника с овим подешавањима", "ipb-confirm": "Потврди блокирање", - "badipaddress": "Неисправна IP адреса", + "badipaddress": "Неважећа IP адреса", "blockipsuccesssub": "Блокирање је успело", "blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана|блокиран}}.
    \nБлокирања можете да погледате [[Special:BlockList|овде]].", "ipb-blockingself": "Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?", @@ -2432,8 +2439,8 @@ "ipb-blocklist": "Погледај постојећа блокирања", "ipb-blocklist-contribs": "Доприноси за {{GENDER:$1|$1}}", "ipb-blocklist-duration-left": "преостало: $1", - "unblockip": "Деблокирај корисника", - "unblockiptext": "Користите образац испод да бисте вратили право писања блокираној ИП адреси или корисничком имену.", + "unblockip": "Деблокирање корисника", + "unblockiptext": "Користите доњи образац да бисте вратили право писања раније блокираној IP адреси или корисничком имену.", "ipusubmit": "Уклони ову блокаду", "unblocked": "[[User:$1|$1]] је деблокиран", "unblocked-range": "$1 је деблокиран", @@ -2451,9 +2458,9 @@ "ipblocklist-legend": "Проналажење блокираног корисника", "blocklist-userblocks": "Сакриј блокирања налога", "blocklist-tempblocks": "Сакриј привремена блокирања", - "blocklist-addressblocks": "Сакриј појединачна блокирања ИП адресе", + "blocklist-addressblocks": "Сакриј појединачне блокаде IP-а", "blocklist-rangeblocks": "Сакриј блокирања опсега", - "blocklist-timestamp": "Време и датум", + "blocklist-timestamp": "Временска ознака", "blocklist-target": "Корисник", "blocklist-expiry": "Истиче", "blocklist-by": "Блокирао", @@ -2476,13 +2483,13 @@ "change-blocklink": "промени блокаду", "contribslink": "доприноси", "emaillink": "пошаљи имејл", - "autoblocker": "Аутоматски сте блокирани јер делите ИП адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања: „$2“", - "blocklogpage": "Дневник блокирања", + "autoblocker": "Аутоматски сте блокирани јер делите IP адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања корисника/це $1 је „$2“", + "blocklogpage": "Евиденција блокирања", "blocklog-showlog": "{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана}}.\nИсторија блокирања се налази испод:", "blocklog-showsuppresslog": "{{GENDER:$1|Овај корисник је раније блокиран и сакривен|Ова корисница је раније блокирана и сакривена}}.\nИсторија сакривања се налази испод:", "blocklogentry": "је блокирао [[$1]] са временом истицања од $2 $3", "reblock-logentry": "{{GENDER:|је променио|је променила}} подешавања за блокирање {{GENDER:$1|корисника|кориснице}} [[$1]] са временом истека од $2 ($3)", - "blocklogtext": "Ово је дневник блокирања и деблокирања корисника.\nАутоматски блокиране ИП адресе нису наведене.\nТекуће забране и блокирања можете наћи [[Special:BlockList|овде]].", + "blocklogtext": "Ово је евиденција радњи блокирања и деблокирања корисника.\nАутоматски блокиране IP адресе нису наведене.\nПогледајте [[Special:BlockList|списак блокирања]] за списак актуелних операција забрана и блокирања.", "unblocklogentry": "је деблокирао $1", "block-log-flags-anononly": "само анонимни корисници", "block-log-flags-nocreate": "онемогућено отварање налога", @@ -2491,8 +2498,8 @@ "block-log-flags-nousertalk": "забрањено уређивање сопствене странице за разговор", "block-log-flags-angry-autoblock": "проширено аутоматско блокирање је омогућено", "block-log-flags-hiddenname": "корисничко име је сакривено", - "range_block_disabled": "Администраторска могућност за блокирање распона ИП адреса је онемогућена.", - "ipb_expiry_invalid": "Време истека је неисправно.", + "range_block_disabled": "Администраторска могућност за прављење опсега блокаде је онемогућена.", + "ipb_expiry_invalid": "Време истека није важеће.", "ipb_expiry_old": "Време истека је у прошлости.", "ipb_expiry_temp": "Сакривене блокаде корисника морају бити трајне.", "ipb_hide_invalid": "Не могу да потиснем овај налог; има више од {{PLURAL:$1|једне измене|$1 измена}}.", @@ -2501,16 +2508,16 @@ "ipb-otherblocks-header": "{{PLURAL:$1|Друге блокаде}}", "unblock-hideuser": "Не можете деблокирати овог корисника јер је његово корисничко име сакривено.", "ipb_cant_unblock": "Грешка: блокада $1 не постоји. Можда је корисник деблокиран.", - "ipb_blocked_as_range": "Грешка: IP адреса $1 није директно блокирана и не може да се деблокира.\nОна је блокирана као део блокаде $2, која може бити деблокирана.", - "ip_range_invalid": "Неисправан распон IP адреса.", - "ip_range_toolarge": "Опсежна блокирања већа од /$1 нису дозвољена.", - "ip_range_toolow": "IP-опсези нису дозвољени.", + "ipb_blocked_as_range": "Грешка: IP адреса $1 није директно блокирана и не може да се деблокира.\nОна је блокирана као део блокаде $2, која може да се деблокира.", + "ip_range_invalid": "Неважећи опсег IP адресе.", + "ip_range_toolarge": "Опсези блокирања већи од /$1 нису дозвољени.", + "ip_range_toolow": "IP опсези нису дозвољени.", "proxyblocker": "Блокер посредника", - "proxyblockreason": "Ваша ИП адреса је блокирана јер представља отворени посредник.\nОбратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.", + "proxyblockreason": "Ваша IP адреса је блокирана јер представља отворени посредник.\nОбратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.", "sorbs": "DNSBL", - "sorbsreason": "Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.", - "sorbs_create_account_reason": "Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.\nНе можете да отворите налог.", - "cant-see-hidden-user": "Члан коме желите да забраните приступ је већ блокиран и сакривен.\nС обзиром на то да немате права за сакривање корисника, не можете да видите нити измените забрану.", + "sorbsreason": "Ваша IP адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.", + "sorbs_create_account_reason": "Ваша IP адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.\nНе можете да отворите налог.", + "cant-see-hidden-user": "Корисник којег покушавате да блокирате је већ блокиран и сакривен.\nС обзиром на то да немате права за сакривање корисника, не можете да погледате нити уредите корисничку блокаду.", "ipbblocked": "Не можете забранити или вратити приступ другим корисницима јер сте и сами блокирани", "ipbnounblockself": "Није вам дозвољено да деблокирате себе", "lockdb": "Закључавање базе података", @@ -2532,7 +2539,7 @@ "lockedbyandtime": "(од $1 дана $2 у $3)", "move-page": "Премештање „$1”", "move-page-legend": "Премештање странице", - "movepagetext": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови.\nМожете ажурирати преусмерења која воде до изворног наслова;\nпогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где треба.\n\nСтраница неће бити премештена ако већ постоји страница с тим именом (осим ако је празна, садржи преусмерење или нема историју измена).\nТо значи да можете вратити страницу на претходно име ако погрешите, али не можете ''преписати'' постојећу.\n\nНапомена:\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.", + "movepagetext": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови.\nМожете ажурирати преусмерења која воде до изворног наслова;\nпогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да линкови и даље иду тамо где треба.\n\nСтраница неће бити премештена ако већ постоји страница с тим именом (осим ако је празна, садржи преусмерење или нема историју измена).\nТо значи да можете вратити страницу на претходно име ако погрешите, али не можете ''преписати'' постојећу.\n\nНапомена:\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.", "movepagetext-noredirectfixer": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови.\nПогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где треба.\n\nСтраница неће бити премештена ако већ постоји страница с тим именом (осим ако је празна, садржи преусмерење или нема историју измена).\nТо значи да можете вратити страницу на претходно име ако погрешите, али не можете ''преписати'' постојећу.\n\nНапомена:\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.", "movepagetalktext": "Ако сте означили овај квадратић, одговарајућа страница за разговор биће аутоматски премештена на нови наслов, осим ако већ постоји страница за разговор са истим насловом.\n\nУ том случају, мораћете ручно да је преместите или спојите, ако има потребе за тим.", "moveuserpage-warning": "'''Упозорење:''' на путу сте да преместите корисничку страницу. Имајте у виду да ће само страница бити премештена, а сам корисник ''неће'' бити преименован.", @@ -2540,8 +2547,8 @@ "movenologintext": "Морате да будете регистровани и [[Special:UserLogin|пријављени]] да бисте премештали странице.", "movenotallowed": "Немате дозволу да премештате странице.", "movenotallowedfile": "Немате дозволу да премештате датотеке.", - "cant-move-user-page": "Немате дозволу за премештање основних корисничких страница (осим подстраница).", - "cant-move-to-user-page": "Немате дозволу за премештање странице на вашу корисничку страницу (осим на корисничку подстраницу).", + "cant-move-user-page": "Немате дозволу да премештате корисничке странице (осим подстраница).", + "cant-move-to-user-page": "Немате дозволу да преместите страницу на корисничку страницу (осим на корисничку подстраницу).", "cant-move-category-page": "Немате дозволу да премештате странице категорија.", "cant-move-to-category-page": "Немате дозволу да преместите страницу на страницу категорије.", "cant-move-subpages": "Немате дозволу да премештате подстранице.", @@ -2553,7 +2560,7 @@ "movepage-moved": "'''„$1“ је премештена на „$2“'''", "movepage-moved-redirect": "Преусмерење је направљено.", "movepage-moved-noredirect": "Стварање преусмерења је онемогућено.", - "articleexists": "Страница с тим именом већ постоји, или је име неисправно.\nИзаберите друго име.", + "articleexists": "Страница с тим именом већ постоји или име које сте одабрали није важеће.\nОдаберите друго.", "cantmove-titleprotected": "Не можете да преместите страницу на то место јер је жељени наслов заштићен од стварања", "movetalk": "Премести и страницу за разговор", "move-subpages": "Премести и подстранице (до $1)", @@ -2562,7 +2569,7 @@ "movepage-page-moved": "Страница $1 је премештена на $2.", "movepage-page-unmoved": "Страница $1 не може да се премести на $2.", "movepage-max-pages": "Највише $1 {{PLURAL:$1|страница је премештена|странице су премештене|страница је премештено}} и више не може да буде аутоматски премештено.", - "movelogpage": "Дневник премештања", + "movelogpage": "Евиденција премештања", "movelogpagetext": "Испод се налази списак премештања страница.", "movesubpage": "{{PLURAL:$1|Подстраница|Подстранице}}", "movesubpagetext": "Ова страница има $1 {{PLURAL:$1|подстраницу приказану|подстранице приказане|подстраница приказаних}} испод.", @@ -2575,24 +2582,24 @@ "selfmove": "Наслов је истоветан;\nне можете преместити страницу преко саме себе.", "immobile-source-namespace": "Не могу преместити странице у именски простор „$1“.", "immobile-target-namespace": "Не могу преместити странице у именски простор „$1“.", - "immobile-target-namespace-iw": "Међувики веза није исправно одредиште за премештање странице.", + "immobile-target-namespace-iw": "Међувики линк није важеће одредиште за премештање странице.", "immobile-source-page": "Ова страница се не може преместити.", "immobile-target-page": "Не могу да преместим на жељени наслов.", "bad-target-model": "Жељено одредиште користи другачији модел садржаја. Не могу да претворим из $1 у $2.", "imagenocrossnamespace": "Датотека се не може преместити у именски простор који не припада датотекама.", "nonfile-cannot-move-to-file": "Не-датотеке не можете преместити у именски простор за датотеке", - "imagetypemismatch": "Екстензија нове датотеке се не поклапа с њеном врстом", - "imageinvalidfilename": "Циљани назив датотеке је неисправан", + "imagetypemismatch": "Проширење нове датотеке се не поклапа с њеним типом.", + "imageinvalidfilename": "Циљано име датотеке је неважеће", "fix-double-redirects": "Ажурирајте сва преусмерења која воде до првобитног наслова", "move-leave-redirect": "Остави преусмерење", - "protectedpagemovewarning": "'''Упозорење:''' ова страница је заштићена, тако да само корисници с администраторским овлашћењима могу да је преместе.\nПоследњи запис у дневнику је приказан испод као референца:", - "semiprotectedpagemovewarning": "Напомена: ова страница је заштићена, тако да само аутоматски потврђени корисници могу да је преместе.\nПоследњи запис у дневнику је приказан испод као референца:", + "protectedpagemovewarning": "'''Упозорење:''' Ова страница је заштићена, тако да само корисници са администраторским овлашћењима могу да је преместе.\nНајновији унос у евиденцији је наведен испод као референца:", + "semiprotectedpagemovewarning": "Напомена: Ова страница је заштићена, тако да само аутоматски потврђени корисници могу да је преместе.\nНајновији унос у евиденцији је наведен испод као референца:", "move-over-sharedrepo": "[[:$1]] се налази на дељеном складишту. Ако преместите датотеку на овај наслов, то ће заменити дељену датотеку.", "file-exists-sharedrepo": "Наведени назив датотеке се већ користи у дељеном складишту.\nИзаберите други назив.", "export": "Извоз страница", - "exporttext": "Можете извести текст и историју измена одређене странице или групе страница у формату XML.\nОво онда може бити увезено у други вики који користи Медијавики софтвер преко [[Special:Import|странице за увоз]].\n\nДа бисте извезли странице, унесите називе у оквиру испод, с једним насловом по реду, и изаберите да ли желите текућу измену и све остале, или само текућу измену с подацима о последњој измени.\n\nУ другом случају, можете користити и везу, на пример [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за страницу [[{{MediaWiki:Mainpage}}]].", + "exporttext": "Можете да извезете текст и историју измена одређене странице или скупа страница уклљених у XML формату.\nОво онда може да буде увезено у други вики који користи Медијавики софтвер преко [[Special:Import|странице за увоз]].\n\nДа бисте извезли странице, унесите називе у оквиру испод, с једним насловом по реду, и изаберите да ли желите актуелну ревизију и све остале, или само актуелну ревизију с подацима о последњој измени.\n\nУ другом случају, можете користити и линк, на пример [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за страницу [[{{MediaWiki:Mainpage}}]].", "exportall": "Извези све странице", - "exportcuronly": "Укључи само текућу измену, не целу историју", + "exportcuronly": "Укључи само актуелну ревизију, не целу историју", "exportnohistory": "----\n'''Напомена:''' извоз пуне историје страница преко овог обрасца је онемогућено из техничких разлога.", "exportlistauthors": "Укључи целокупан списак доприносилаца за сваку страницу", "export-submit": "Извези", @@ -2607,7 +2614,7 @@ "allmessages": "Системске поруке", "allmessagesname": "Назив", "allmessagesdefault": "Подразумевани текст", - "allmessagescurrent": "Тренутни текст поруке", + "allmessagescurrent": "Актуелни текст поруке", "allmessagestext": "Ово је списак системских порука доступних у именском простору „Медијавики“.\nПосетите [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Медијавики локализацију] и [https://translatewiki.net translatewiki.net] ако желите да допринесете општој локализацији Медијавикија.", "allmessagesnotsupportedDB": "Ова страница не може да се користи јер је '''$wgUseDatabaseMessages''' онемогућен.", "allmessages-filter-legend": "Филтер", @@ -2623,24 +2630,24 @@ "filemissing": "Недостаје датотека", "thumbnail_error": "Грешка при стварању минијатуре: $1", "thumbnail_error_remote": "Порука о грешци из $1:\n$2", - "djvu_page_error": "DjVu страница је недоступна", + "djvu_page_error": "DjVu страница је ван опсега", "djvu_no_xml": "Не могу да преузмем XML за DjVu датотеку.", "thumbnail-temp-create": "Не могу да направим привремену датотеку минијатуре", "thumbnail-dest-create": "Не могу да сачувам минијатуру у одредишту", - "thumbnail_invalid_params": "Неисправни параметри за минијатуру", + "thumbnail_invalid_params": "Неважећи параметри сличице", "thumbnail_toobigimagearea": "Датотека са величинама већим од $1", "thumbnail_dest_directory": "Не могу да направим одредишну фасциклу", - "thumbnail_image-type": "Врста слике није подржана", + "thumbnail_image-type": "Тип слике није подржан", "thumbnail_gd-library": "Недовршена подешавања графичке библиотеке: недостаје функција $1", "thumbnail_image-size-zero": "Изгледа да је величина датотеке нула.", "thumbnail_image-missing": "Датотека недостаје: $1", - "thumbnail_image-failure-limit": "Било је превише скорашњих неуспешних покушаја ($1 или више) рендеровања ове минијатуре. Покушајте поново касније.", + "thumbnail_image-failure-limit": "Било је превише недавних неуспешних покушаја ($1 или више) рендеровања ове минијатуре. Покушајте поново касније.", "import": "Увоз страница", "importinterwiki": "Увоз са другог викија", - "import-interwiki-text": "Изаберите вики и наслов странице за увоз.\nДатуми и имена уредника ће бити сачувани.\nСве радње при увозу с других викија су забележене у [[Special:Log/import|дневнику увоза]].", + "import-interwiki-text": "Изаберите вики и наслов странице за увоз.\nДатуми ревизија и имена уредника ће бити сачувани.\nСве радње при увозу с других викија су евидентиране у [[Special:Log/import|евиденцији увоза]].", "import-interwiki-sourcewiki": "Изворна вики:", "import-interwiki-sourcepage": "Изворна страница:", - "import-interwiki-history": "Копирај све верзије историје за ову страницу", + "import-interwiki-history": "Копирај све ревизије историје за ову страницу", "import-interwiki-templates": "Укључи све шаблоне", "import-interwiki-submit": "Увези", "import-mapping-default": "Исто као и изворне странице", @@ -2651,14 +2658,14 @@ "import-comment": "Коментар:", "importtext": "Извезите датотеку с изворног викија користећи [[Special:Export|извоз]].\nСачувајте је на рачунар и пошаљите овде.", "importstart": "Увозим странице…", - "import-revision-count": "$1 {{PLURAL:$1|измена|измене|измена}}", + "import-revision-count": "$1 {{PLURAL:$1|ревизија|ревизије|ревизија}}", "importnopages": "Нема страница за увоз.", "imported-log-entries": "{{PLURAL:$1|Увезена је $1 ставка извештаја|Увезене су $1 ставке извештаја|Увезено је $1 ставки извештаја}}.", "importfailed": "Неуспешан увоз: $1", - "importunknownsource": "Непозната врста за увоз", + "importunknownsource": "Непознат изворни тип увоза", "importnoprefix": "Није наведен међувики префикс", "importcantopen": "Не могу да отворим датотеку за увоз.", - "importbadinterwiki": "Неисправна међувики веза", + "importbadinterwiki": "Лош међувики линк", "importsuccess": "Увожење је завршено!", "importnosources": "Није одређен ниједан извор за увоз, тако да је отпремање историје онемогућено.", "importnofile": "Увозна датотека није послата.", @@ -2667,44 +2674,44 @@ "importuploaderrortemp": "Не могу да пошаљем датотеку за увоз.\nНедостаје привремена фасцикла.", "import-parse-failure": "Погрешно рашчлањивање XML-а.", "import-noarticle": "Нема странице за увоз!", - "import-nonewrevisions": "Измене нису увезене (све су већ биле или присутне или прескочене због грешака).", + "import-nonewrevisions": "Ниједна ревизија није увезена (све су већ присутне или су прескочене због грешака).", "xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5", "import-upload": "Отпремање XML података", - "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени. '''Молимо Вас проверите да ли сте још увек пријављени и покушајте поново'''.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли Ваш веб-пртраживач дозвољава колачиће са овог сајта.", + "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени. '''Молимо Вас проверите да ли сте још увек пријављени и покушајте поново'''.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли ваш веб-претраживач дозвољава колачиће са овог сајта.", "import-invalid-interwiki": "Не могу да увозим с наведеног викија.", "import-error-edit": "Страница „$1“ није увезена јер вам није дозвољено да је уређујете.", "import-error-create": "Страница „$1“ није увезена јер вам није дозвољено да је направите.", "import-error-interwiki": "Не могу да увезем страницу „$1“ јер је њен назив резервисан за спољно повезивање (међувики).", "import-error-special": "Не могу да увезем страницу „$1“ јер она припада посебном именском простору које не прихвата странице.", - "import-error-invalid": "Не могу да увезем страницу „$1“ јер је њен назив неисправан.", - "import-error-unserialize": "Верзија $2 странице $1 не може бити прочитана/увезена. Записано је да верзија користи $3 тип садржаја у $4 формату.", + "import-error-invalid": "Страница „$1“ није увезена јер је име под којим се треба увости неважеће на овом викију.", + "import-error-unserialize": "Не могу да десеријализујем ревизију $2 странице $1. Записано је да ревизија користи $3 модел садржаја у $4 формату.", "import-options-wrong": "{{PLURAL:$2|Погрешна опција|Погрешне опције}}: $1", - "import-rootpage-invalid": "Наведена основна страница има неисправан наслов.", + "import-rootpage-invalid": "Наведена основна страница има неважећи наслов.", "import-rootpage-nosubpage": "Именски простор „$1“ основне странице не дозвољава подстранице.", - "importlogpage": "Дневник увоза", + "importlogpage": "Евиденција увоза", "importlogpagetext": "Административни увози страница с историјама измена с других викија.", - "import-logentry-upload-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}}", - "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|измена увезена|измене увезене|измена увезено}} из $2", - "javascripttest": "Јаваскрипт тест", + "import-logentry-upload-detail": "$1 {{PLURAL:$1|ревизија увезена|ревизије увезене|ревизија увезено}}", + "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|ревизија увезена|ревизије увезене|ревизија увезено}} из $2", + "javascripttest": "Тестирање јавасктипта", "javascripttest-pagetext-unknownaction": "Непозната радња „$1“.", "javascripttest-qunit-intro": "Погледајте [$1 документацију за тестирање] на mediawiki.org.", "tooltip-pt-userpage": "{{GENDER:|Ваша}} корисничка страница", - "tooltip-pt-anonuserpage": "Корисничка страница за ИП адресу с које уређујете", + "tooltip-pt-anonuserpage": "Корисничка страница за IP адресу с које уређујете", "tooltip-pt-mytalk": "{{GENDER:|Ваша}} страница за разговор", "tooltip-pt-anontalk": "Разговор о изменама са ове IP адресе", "tooltip-pt-preferences": "{{GENDER:|Ваша}} подешавања", "tooltip-pt-watchlist": "Списак страница које надгледате", "tooltip-pt-mycontris": "Списак {{GENDER:|Ваших}} доприноса", "tooltip-pt-anoncontribs": "Списак измена направљених са ове IP адресе", - "tooltip-pt-login": "Предлажемо Вам да се пријавите, иако то није обавезно", + "tooltip-pt-login": "Предлажемо вам да се пријавите, иако то није обавезно", "tooltip-pt-login-private": "Морате да се пријавите да бисте користили овај Вики", "tooltip-pt-logout": "Одјавите се", - "tooltip-pt-createaccount": "Предлажемо Вам да отворите налог и пријавите се, иако то није обавезно", + "tooltip-pt-createaccount": "Предлажемо вам да отворите налог и пријавите се, иако то није обавезно", "tooltip-ca-talk": "Разговор о страници са садржајем", "tooltip-ca-edit": "Уредите ову страницу", "tooltip-ca-addsection": "Започните нови одељак", "tooltip-ca-viewsource": "Ова страница је закључана. \nМожете да погледате њен изворник", - "tooltip-ca-history": "Претходне измене ове странице", + "tooltip-ca-history": "Претходне ревизије ове странице", "tooltip-ca-protect": "Заштитите ову страницу", "tooltip-ca-unprotect": "Промени заштиту ове странице", "tooltip-ca-delete": "Обришите ову страницу", @@ -2720,20 +2727,20 @@ "tooltip-n-mainpage-description": "Посетите главну страну", "tooltip-n-portal": "О пројекту, шта можете да радите и где да пронађете ствари", "tooltip-n-currentevents": "Пронађите додатне информације о актуелностима", - "tooltip-n-recentchanges": "Списак скорашњих измена на викију", + "tooltip-n-recentchanges": "Списак недавних промена на викију", "tooltip-n-randompage": "Учитајте случајну страницу", "tooltip-n-help": "Место где можете да научите нешто", "tooltip-t-whatlinkshere": "Списак свих вики страница које воде овде", - "tooltip-t-recentchangeslinked": "Скорашње измене на страницама које су повезане са овом страницом", - "tooltip-feed-rss": "RSS довод ове странице", - "tooltip-feed-atom": "Атом довод ове странице", + "tooltip-t-recentchangeslinked": "Недавне промене на страницама које су повезане с овом страницом", + "tooltip-feed-rss": "RSS фид за ову страницу", + "tooltip-feed-atom": "Atom фид за ову страницу", "tooltip-t-contributions": "Списак доприноса {{GENDER:$1|овог корисника|ове кориснице|овог корисника}}", "tooltip-t-emailuser": "Пошаљите имејл {{GENDER:$1|овом кориснику|овој корисници}}", "tooltip-t-info": "Више информација о овој страници", "tooltip-t-upload": "Отпремите датотеке", "tooltip-t-specialpages": "Списак свих посебних страница", "tooltip-t-print": "Верзија ове странице за штампање", - "tooltip-t-permalink": "Трајна веза ка овој измени странице", + "tooltip-t-permalink": "Трајни линк ка овој ревизији странице", "tooltip-ca-nstab-main": "Погледајте страницу са садржајем", "tooltip-ca-nstab-user": "Погледајте корисничку страницу", "tooltip-ca-nstab-media": "Погледајте медијску страницу", @@ -2745,20 +2752,20 @@ "tooltip-ca-nstab-help": "Погледајте страницу за помоћ", "tooltip-ca-nstab-category": "Погледајте страницу категорије", "tooltip-minoredit": "Означите ову измену као мању", - "tooltip-save": "Сачувајте своје измене", + "tooltip-save": "Сачувајте своје промене", "tooltip-publish": "Објавите своје измене", - "tooltip-preview": "Прегледајте своје измене. Користите ово дугме пре чувања.", - "tooltip-diff": "Погледајте које измене сте направили на тексту", - "tooltip-compareselectedversions": "Погледаjте разлике између две изабране измене ове странице.", + "tooltip-preview": "Прегледајте своје промене. Користите ово дугме пре чувања.", + "tooltip-diff": "Погледајте које промене сте направили на тексту", + "tooltip-compareselectedversions": "Погледаjте разлике између две изабране ревизије ове странице", "tooltip-watch": "Додајте ову страницу на свој списак надгледања", "tooltip-watchlistedit-normal-submit": "Уклоните наслове", "tooltip-watchlistedit-raw-submit": "Ажурирај списак", "tooltip-recreate": "Поново направите страницу иако је обрисана", "tooltip-upload": "Започните отпремање", "tooltip-rollback": "„Врати“ враћа измене последњег доприносиоца ове странице једним кликом", - "tooltip-undo": "„Поништи” враћа ову измену и отвара образац за уређивање у претпрегледном моду. Дозвољава додавање разлога у опису измене.", + "tooltip-undo": "„Поништи” враћа ову измену и отвара образац за уређивање у претпрегледном моду. Дозвољава додавање разлога у резимеу.", "tooltip-preferences-save": "Сачувај подешавања", - "tooltip-summary": "Унесите кратак опис", + "tooltip-summary": "Унесите кратак резиме", "interlanguage-link-title": "$1 — $2", "interlanguage-link-title-nonlang": "$1 — $2", "common.css": "/* CSS постављен овде ће се одразити на све теме */", @@ -2784,15 +2791,15 @@ "creditspage": "Аутори странице", "nocredits": "Не постоје подаци о аутору ове странице.", "spamprotectiontitle": "Филтер за заштиту од непожељних порука", - "spamprotectiontext": "Филтера против нежељених порука је блокирао чување ове странице.\nОво је вероватно изазвано везом до спољашњег сајта који се налази на црном списку.", + "spamprotectiontext": "Филтера против нежељених порука је блокирао чување ове странице.\nОво је вероватно изазвано линком до спољашњег сајта који се налази на црном списку.", "spamprotectionmatch": "Следећи текст је активирао наш филтер за нежељене поруке: $1", "spambot_username": "Чишћење непожељних порука у Медијавикији", - "spam_reverting": "Враћам на последњу измену која не садржи везе до $1", + "spam_reverting": "Враћам на последњу ревизију која не садржи линкове до $1", "spam_blanking": "Све измене садрже везе до $1. Чистим", - "spam_deleting": "Све измене садрже везе до $1. Бришем", - "simpleantispam-label": "Анти-спам провера. \nНе попуњавај ово унутра!", + "spam_deleting": "Све ревизије садрже линкове до $1. Бришем", + "simpleantispam-label": "Провера против нежељеног садржаја. \nНе попуњавајте ово!", "pageinfo-title": "Информације за „$1“", - "pageinfo-not-current": "Нажалост, немогуће је прибавити ове податке за старије измене.", + "pageinfo-not-current": "Нажалост, немогуће је навести ове инфомације за старије ревизије.", "pageinfo-header-basic": "Основне информације", "pageinfo-header-edits": "Историја измена", "pageinfo-header-restrictions": "Заштита странице", @@ -2811,6 +2818,7 @@ "pageinfo-watchers": "Број надгледача странице", "pageinfo-visiting-watchers": "Број надгледача странице који су посетили скорашње измене", "pageinfo-few-watchers": "Мање од $1 {{PLURAL:$1|надгледача}}", + "pageinfo-few-visiting-watchers": "Могуће је да постоји корисник који прати и посећује недавне промене", "pageinfo-redirects-name": "Број преусмерења на ову страницу", "pageinfo-redirects-value": "$1", "pageinfo-subpages-name": "Број подстраница ове странице", @@ -2821,7 +2829,7 @@ "pageinfo-lasttime": "Датум последње измене", "pageinfo-edits": "Број измена", "pageinfo-authors": "Број засебних аутора", - "pageinfo-recent-edits": "Број скорашњих измена (у последњих $1)", + "pageinfo-recent-edits": "Број недавних промена (у последњих $1)", "pageinfo-recent-authors": "Број скорашњих засебних аутора", "pageinfo-magic-words": "{{PLURAL:$1|Магична реч|Магичне речи}} ($1)", "pageinfo-hidden-categories": "{{PLURAL:$1|Сакривена категорија|Сакривене категорије}} ($1)", @@ -2846,40 +2854,40 @@ "markaspatrolledtext": "Означи страницу као патролирану", "markaspatrolledtext-file": "Означи ову верзију датотеке као патролирану", "markedaspatrolled": "Означено као патролирано", - "markedaspatrolledtext": "Изабрана измена странице [[:$1]] означена је као патролирана.", + "markedaspatrolledtext": "Изабрана ревизија странице [[:$1]] је означена као патролирана.", "rcpatroldisabled": "Патролирање скорашњих измена је онемогућено", - "rcpatroldisabledtext": "Патролирање скорашњих измена је онемогућено.", + "rcpatroldisabledtext": "Могућност патролирања скорашњих измена је актуелно онемогућена.", "markedaspatrollederror": "Не могу да означим као патролирано.", - "markedaspatrollederrortext": "Морате изабрати измену да бисте је означили као патролирану.", - "markedaspatrollederror-noautopatrol": "Не можете да означите своје измене као патролиране.", + "markedaspatrollederrortext": "Морате навести ревизију да бисте је означили као патролирану.", + "markedaspatrollederror-noautopatrol": "Не можете да означите своје промене као патролиране.", "markedaspatrollednotify": "Ова измена на страници „$1” означена је као патролирана.", "markedaspatrollederrornotify": "Означавање ове измене патролираном није успело.", - "patrol-log-page": "Дневник патролирања", - "patrol-log-header": "Ово је дневник патролираних измена.", + "patrol-log-page": "Евиденција патролирања", + "patrol-log-header": "Ово је евиденција патролираних ревизија.", "confirm-markpatrolled-button": "У реду", - "confirm-markpatrolled-top": "Означити измену $3 странице $2 патролираном?", - "deletedrevision": "Обрисана стара измена $1.", + "confirm-markpatrolled-top": "Означити ревизију $3 странице $2 као патролирану?", + "deletedrevision": "Обрисана стара ревизија $1.", "filedeleteerror-short": "Грешка при брисању датотеке: $1", "filedeleteerror-long": "Дошло је до грешака при брисању датотеке:\n\n$1", "filedelete-missing": "Датотека „$1“ се не може обрисати јер не постоји.", - "filedelete-old-unregistered": "Наведена измена датотеке „$1“ не постоји у бази података.", + "filedelete-old-unregistered": "Наведена ревизија датотеке „$1“ не постоји у бази података.", "filedelete-current-unregistered": "Наведена датотека „$1“ не постоји у бази података.", "filedelete-archive-read-only": "Сервер не може да пише по складишној фасцикли ($1).", "previousdiff": "← Старија измена", "nextdiff": "Новија измена →", - "mediawarning": "Упозорење: ова врста датотеке може садржати штетан код.\nАко га покренете, Ваш рачунар може бити угрожен.", + "mediawarning": "Упозорење: овај тип датотеке може да садржи штетан код.\nЊеговим извршавањем можете да угрозите ваш систем.", "imagemaxsize": "Ограничење величине слике:
    (на страницама за опис датотека)", "thumbsize": "Величина минијатуре:", "widthheight": "$1 × $2", "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|страница|странице|страница}}", "file-info": "величина датотеке: $1, MIME тип: $2", "file-info-size": "$1 × $2 пиксела, величина датотеке: $3, MIME тип: $4", - "file-info-size-pages": "$1 × $2 пиксела, величина: $3, MIME врста: $4, $5 {{PLURAL:$5|страница|странице|страница}}", + "file-info-size-pages": "$1 × $2 пиксела, величина: $3, MIME тип: $4, $5 {{PLURAL:$5|страница|странице|страница}}", "file-nohires": "Већа резолуција није доступна.", "svg-long-desc": "SVG датотека, номинално $1 × $2 пиксела, величина: $3", "svg-long-desc-animated": "Анимирана SVG датотека, номинално: $1 × $2 пиксела, величина: $3", - "svg-long-error": "Неисправна SVG датотека: $1", - "show-big-image": "Изворна датотека", + "svg-long-error": "Неважећа SVG датотека: $1", + "show-big-image": "Првобитна датотека", "show-big-image-preview": "Величина овог приказа: $1.", "show-big-image-preview-differ": "Величина $3 прегледа за ову $2 датотеку је $1.", "show-big-image-other": "$2 {{PLURAL:$2|друга резолуција|друге резолуције|других резолуција}}: $1.", @@ -2897,10 +2905,10 @@ "newimages-legend": "Филтер", "newimages-label": "Назив датотеке (или њен део):", "newimages-user": "IP адреса или корисничко име", - "newimages-newbies": "Прикажи само доприносе нових корисника", + "newimages-newbies": "Прикажи само доприносе нових налога", "newimages-showbots": "Прикажи датотеке које су послали ботови", "newimages-hidepatrolled": "Сакриј патролирана отпремања", - "newimages-mediatype": "Врста датотеке:", + "newimages-mediatype": "Тип датотеке:", "noimages": "Нема ништа.", "gallery-slideshow-toggle": "минијатуре", "ilsubmit": "Претражи", @@ -2931,7 +2939,7 @@ "saturday-at": "у суботу у $1", "sunday-at": "у недељу у $1", "yesterday-at": "Јуче у $1", - "bad_image_list": "Формат је следећи:\n\nРазматрају се само набрајања (редови који почињу са звездицом).\nПрва веза у реду мора да буде веза до неисправне датотеке.\nСве даљње везе у истом реду сматрају се изузецима.", + "bad_image_list": "Формат је следећи:\n\nРазматрају се само набрајања (редови који почињу са звездицом).\nПрви линк у реду мора да буде линк до неисправне датотеке.\nСви даљњи линкови у истом реду сматрају се изузецима.", "variantname-zh-hans": "hans", "variantname-zh-hant": "hant", "variantname-zh-cn": "cn", @@ -2994,15 +3002,15 @@ "exif-primarychromaticities": "Хроматичност основних боја", "exif-ycbcrcoefficients": "Матрични коефицијенти трансформације бојног простора", "exif-referenceblackwhite": "Упутне вредности пара беле и црне тачке", - "exif-datetime": "Датум и време последње измене датотеке", + "exif-datetime": "Датум и време последње промене датотеке", "exif-imagedescription": "Назив слике", "exif-make": "Произвођач камере", "exif-model": "Модел камере", "exif-software": "Коришћени софтвер", "exif-artist": "Аутор", "exif-copyright": "Носилац ауторских права", - "exif-exifversion": "Exif издање", - "exif-flashpixversion": "Подржано издање FlashPix-а", + "exif-exifversion": "Exif верзија", + "exif-flashpixversion": "Подржана верзија FlashPix-а", "exif-colorspace": "Простор боје", "exif-componentsconfiguration": "Значење сваког дела", "exif-compressedbitsperpixel": "Режим сажимања слике", @@ -3040,15 +3048,15 @@ "exif-focalplaneresolutionunit": "Јединица за резолуцију фокусне равни", "exif-subjectlocation": "Положај објекта", "exif-exposureindex": "Попис експозиције", - "exif-sensingmethod": "Врста сензора", + "exif-sensingmethod": "Начин сензора", "exif-filesource": "Изворна датотека", - "exif-scenetype": "Врста сцене", + "exif-scenetype": "Тип сцене", "exif-customrendered": "Прилагођена обрада слика", "exif-exposuremode": "Режим експозиције", "exif-whitebalance": "Бела равнотежа", "exif-digitalzoomratio": "Однос дигиталног увеличања", "exif-focallengthin35mmfilm": "Жаришна даљина за филм од 35 мм", - "exif-scenecapturetype": "Врста снимања сцена", + "exif-scenecapturetype": "Тип снимања сцена", "exif-gaincontrol": "Контрола сцене", "exif-contrast": "Контраст", "exif-saturation": "Засићеност", @@ -3056,7 +3064,7 @@ "exif-devicesettingdescription": "Опис поставки уређаја", "exif-subjectdistancerange": "Опсег удаљености објекта", "exif-imageuniqueid": "Назнака слике", - "exif-gpsversionid": "Издање GPS ознаке", + "exif-gpsversionid": "Верзија GPS ознаке", "exif-gpslatituderef": "Северна или јужна ширина", "exif-gpslatitude": "Ширина", "exif-gpslongituderef": "Источна или западна дужина", @@ -3116,12 +3124,12 @@ "exif-contact": "Подаци за контакт", "exif-writer": "Писац", "exif-languagecode": "Језик", - "exif-iimversion": "IIM издање", + "exif-iimversion": "IIM верзија", "exif-iimcategory": "Категорија", "exif-iimsupplementalcategory": "Допунске категорије", "exif-datetimeexpires": "Не користи након", "exif-datetimereleased": "Објављено", - "exif-originaltransmissionref": "Изворни пренос кода локације", + "exif-originaltransmissionref": "Првобитни код локације преноса", "exif-identifier": "Назнака", "exif-lens": "Коришћени објектив", "exif-serialnumber": "Серијски број камере", @@ -3138,13 +3146,13 @@ "exif-originaldocumentid": "Јединствени ID изворног документа", "exif-licenseurl": "Адреса лиценце за ауторска права", "exif-morepermissionsurl": "Резервни подаци о лиценцирању", - "exif-attributionurl": "При поновном коришћењу овог рада, користите везу до", + "exif-attributionurl": "При поновном коришћењу овог рада, користите линк до", "exif-preferredattributionname": "При поновном коришћењу овог рада, поставите заслуге", "exif-pngfilecomment": "Коментар на датотеку PNG", "exif-disclaimer": "Одрицање одговорности", "exif-contentwarning": "Упозорење о садржају", "exif-giffilecomment": "Коментар на датотеку GIF", - "exif-intellectualgenre": "Врста ставке", + "exif-intellectualgenre": "Тип ставке", "exif-subjectnewscode": "Код предмета", "exif-scenecode": "IPTC код сцене", "exif-event": "Приказани догађај", @@ -3194,7 +3202,7 @@ "exif-componentsconfiguration-4": "R", "exif-componentsconfiguration-5": "G", "exif-componentsconfiguration-6": "B", - "exif-exposureprogram-0": "Неодређено", + "exif-exposureprogram-0": "Није одређен", "exif-exposureprogram-1": "Ручно", "exif-exposureprogram-2": "Нормалан програм", "exif-exposureprogram-3": "Приоритет отвора бленде", @@ -3244,7 +3252,7 @@ "exif-flash-function-1": "Нема функције за блиц", "exif-flash-redeye-1": "режим исправке црвених очију", "exif-focalplaneresolutionunit-2": "инчи", - "exif-sensingmethod-1": "Неодређено", + "exif-sensingmethod-1": "Недефинисан", "exif-sensingmethod-2": "Једнокристални матрични сензор", "exif-sensingmethod-3": "Двокристални матрични сензор", "exif-sensingmethod-4": "Трокристални матрични сензор", @@ -3317,7 +3325,7 @@ "exif-dc-relation": "Сродни медији", "exif-dc-rights": "Права", "exif-dc-source": "Извор медија", - "exif-dc-type": "Врста медија", + "exif-dc-type": "Тип медија", "exif-rating-rejected": "Одбијено", "exif-isospeedratings-overflow": "Веће од 65535", "exif-maxaperturevalue-value": "$1 APEX (f/$2)", @@ -3345,38 +3353,39 @@ "namespacesall": "сви", "monthsall": "све", "confirmemail": "Потврда имејл адресе", - "confirmemail_noemail": "Нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].", - "confirmemail_text": "{{SITENAME}} захтева да потврдите имејл адресу пре него што почнете да користите могућности имејла.\nКликните на дугме испод за слање поруке на вашу адресу.\nУ поруци ће се налазити веза с потврдним кодом;\nунесите је у прегледач да бисте потврдили да је ваша имејл адреса исправна.", - "confirmemail_pending": "Потврдни код вам је већ послат. Ако сте управо отворили налог, онда вероватно треба да сачекате неколико минута да пристигне, пре него што поново затражите нови код.", + "confirmemail_noemail": "Нисте унели валидну имејл адресу у [[Special:Preferences|подешавањима]].", + "confirmemail_text": "{{SITENAME}} захтева да потврдите имејл адресу пре него што почнете да користите могућности имејла.\nКликните на дугме испод за слање поруке на вашу адресу.\nУ поруци ће се налазити линк са потврдним кодом;\nунесите је у прегледач да бисте потврдили да је ваша имејл адреса важећа.", + "confirmemail_pending": "Потврдни код вам је већ послат. Ако сте недавно отворили налог, онда вероватно треба да сачекате неколико минута да пристигне, пре него што поново затражите нови код.", "confirmemail_send": "Пошаљи потврдни код", "confirmemail_sent": "Потврдна порука је послата.", "confirmemail_oncreate": "Послат је потврдни код на вашу имејл адресу.\nОвај код није потребан за пријављивање, али вам треба да бисте укључили могућности имејла на викију.", "confirmemail_sendfailed": "{{SITENAME}} не може да пошаље имејл потврду.\nПроверите да ли је имејл адреса правилно написана.\n\nГрешка: $1", - "confirmemail_invalid": "Потврдни код је неисправан. Вероватно је истекао.", + "confirmemail_invalid": "Неважећи код за потврду.\nКод је можда истекао.", "confirmemail_needlogin": "Морате бити $1 да бисте потврдили имејл адресу.", "confirmemail_success": "Ваша имејл адреса је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]] и уживате у викију.", "confirmemail_loggedin": "Ваша имејл адреса је сада потврђена.", "confirmemail_subject": "{{SITENAME}} – потврда имејл адресе", - "confirmemail_body": "Неко, вероватно ви, са ИП адресе $1,\nотворио је налог „$2“ са овом имејл адресом на викију {{SITENAME}}.\n\nДа потврдите да овај налог стварно припада вама и да активирате\nмогућности имејла на викију {{SITENAME}}, отворите ову везу у прегледачу:\n\n$3\n\nУколико налог *не* припада вама, пратите везу\nда откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче у $4.", - "confirmemail_body_changed": "Неко, вероватно ви, са ИП адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на викију {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и поново активирали могућности имејла, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $6 у $7", - "confirmemail_body_set": "Неко, вероватно ви, са ИП адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали\nмогућности имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $4.", + "confirmemail_body": "Неко, вероватно Ви, са IP адресе $1,\nрегистровао је налог „$2“ са овом имејл адресом на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и активирали могућности имејла на пројекту {{SITENAME}}, отворите овај линк у прегледачу:\n\n$3\n\nАко ви *нисте* регистровали налог, пратите овај линк\nда бисте отказали потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче у $4.", + "confirmemail_body_changed": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и поново активирали могућности имејла, отворите следећи линк у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећи линк да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $6 у $7", + "confirmemail_body_set": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали\nмогућности имејла на {{SITENAME}}, отворите следећи линк у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећи линк да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $4.", "confirmemail_invalidated": "Потврда имејл адресе је отказана", "invalidateemail": "Отказивање потврде имејла", + "notificationemail_subject_changed": "Регистрована имејл адреса на пројекту {{SITENAME}} је промењена", "notificationemail_body_changed": "Неко, вероватно Ви је променио имејл адресу налога из $2“ у „$3“ са IP адресе $1 на сајту {{SITENAME}}.\n\nАко ово нисте били Ви, одмах обавестите администраторе сајта.", - "notificationemail_body_removed": "Неко, вероватно Ви са ИП адресе $1 је уклонио имејл адресу за налог „$2“ на {{SITENAME}}.\n\n\nАко ово нисте били Ви, одмах обавестите администраторе сајта.", + "notificationemail_body_removed": "Неко, вероватно Ви, с IP адресе $1, \nуклонио је имејл адресу за налог „$2“ на {{SITENAME}}.\n\nАко ово нисте били Ви, контактирајте администраторе сајта одмах.", "scarytranscludedisabled": "[Међувики укључивање шаблона је онемогућено]", "scarytranscludefailed": "[Добављање шаблона за $1 није успело]", "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]", "scarytranscludetoolong": "[URL адреса је предугачка]", - "deletedwhileediting": "Упозорење: ова страница је обрисана након што сте почели с уређивањем!", + "deletedwhileediting": "Упозорење: Ова страница је обрисана након што сте почели са уређивањем!", "confirmrecreate": "{{GENDER:$1|Корисник|Корисница}} [[User:$1|$1]] ([[User talk:$1|разговор]]) је {{GENDER:$1|обрисао|обрисала}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: $2\nПотврдите да стварно желите да направите страницу.", "confirmrecreate-noreason": "{{GENDER:$1|Корисник|Корисница}} [[User:$1|$1]] ([[User talk:$1|разговор]]) је {{GENDER:$1|обрисао|обрисала}} ову страницу након што сте почели да је уређујете. Потврдите да стварно желите да поново направите ову страницу.", "recreate": "Поново направи", "unit-pixel": "п", "confirm-purge-title": "Освежи ову страницу", "confirm_purge_button": "У реду", - "confirm-purge-top": "Очистити привремену меморију ове странице?", - "confirm-purge-bottom": "Ова радња чисти привремену меморију и приказује најновију измену.", + "confirm-purge-top": "Очистити кеш ове странице?", + "confirm-purge-bottom": "Освежавање странице чисти кеш и намеће најновију ревизију.", "confirm-watch-button": "У реду", "confirm-watch-top": "Додати ову страницу у списак надгледања?", "confirm-unwatch-button": "У реду", @@ -3420,33 +3429,33 @@ "size-kilobytes": "$1 kB", "size-megabytes": "$1 MB", "size-gigabytes": "$1 GB", - "lag-warn-normal": "Измене новије од $1 {{PLURAL:$1|секунде|секунде|секунди}} неће бити приказане.", - "lag-warn-high": "Због преоптерећења базе података, измене новије од $1 {{PLURAL:$1|1=секунде|секунде|секунди}} неће бити приказане.", + "lag-warn-normal": "Промене новије од $1 {{PLURAL:$1|секунде|секунде|секунди}} неће бити приказане.", + "lag-warn-high": "Због преоптерећења базе података, промене новије од $1 {{PLURAL:$1|1=секунде|секунде|секунди}} неће бити приказане.", "watchlistedit-normal-title": "Уређивање списка надгледања", "watchlistedit-normal-legend": "Уклањање наслова са списка надгледања", "watchlistedit-normal-explain": "Наслови на вашем списку надгледања су приказани испод.\nДа бисте уклонили наслов, означите квадратић до њега и кликните на „{{int:Watchlistedit-normal-submit}}“.\nМожете и да [[Special:EditWatchlist/raw|уредите сиров списак]].", "watchlistedit-normal-submit": "Уклони наслове", "watchlistedit-normal-done": "{{PLURAL:$1|1=Једна страница је уклоњена|$1 странице су уклоњене|$1 страница је уклоњено}} с вашег списка надгледања:", - "watchlistedit-raw-title": "Измени сиров списак надгледања", - "watchlistedit-raw-legend": "Измени сиров списак надгледања", + "watchlistedit-raw-title": "Уреди сиров списак надгледања", + "watchlistedit-raw-legend": "Уреди сиров списак надгледања", "watchlistedit-raw-explain": "Наслови са списка надгледања су приказани испод и могу се уређивати додавањем или уклањањем ставки са списка;\nједан наслов по реду.\nКада завршите, кликните на „{{int:Watchlistedit-raw-submit}}“.\nМожете да [[Special:EditWatchlist|користите и обичан уређивач]].", "watchlistedit-raw-titles": "Наслови:", "watchlistedit-raw-submit": "Ажурирај списак", "watchlistedit-raw-done": "Ваш списак надгледања је ажуриран.", "watchlistedit-raw-added": "{{PLURAL:$1|1=Додат је један наслов|Додата су $1 наслова|Додато је $1 наслова}}:", "watchlistedit-raw-removed": "{{PLURAL:$1|1 наслов је уклоњен|Уклоњена су $1 наслова|Уклоњено је $1 наслова}}:", - "watchlistedit-clear-title": "Пражњење списка надгледања", - "watchlistedit-clear-legend": "Испразни списак надгледања", - "watchlistedit-clear-explain": "Сви наслови ће бити уклоњени из вашег списка надгледања.", + "watchlistedit-clear-title": "Чишћење списка надгледања", + "watchlistedit-clear-legend": "Чишћење списка надгледања", + "watchlistedit-clear-explain": "Сви наслови ће бити уклоњени из списка надгледања", "watchlistedit-clear-titles": "Наслови:", - "watchlistedit-clear-submit": "Испразни списак надгледања (Ово је неповратно!)", - "watchlistedit-clear-done": "Ваш списак надгледања је испражњен.", + "watchlistedit-clear-submit": "Очисти списак надгледања (Ово је неповратно!)", + "watchlistedit-clear-done": "Ваш списак надгледања је очишћен.", "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:", "watchlistedit-too-many": "Има превише страница за приказ овде.", - "watchlisttools-clear": "испразни списак надгледања", - "watchlisttools-view": "прикажи сродне измене", + "watchlisttools-clear": "очисти списак надгледања", + "watchlisttools-view": "погледај релевантне промене", "watchlisttools-edit": "прикажи и уреди списак надгледања", - "watchlisttools-raw": "измени сиров списак надгледања", + "watchlisttools-raw": "уреди сиров списак надгледања", "iranian-calendar-m1": "Фарвардин", "iranian-calendar-m2": "Ордибехешт", "iranian-calendar-m3": "Хордад", @@ -3506,7 +3515,7 @@ "duplicate-displaytitle": "Упозорење: наслов за приказ „$2“ замениће постојећи „$1“.", "restricted-displaytitle": "Упозорење: Наслов за приказ „$1” је игнорисан пошто није еквивалентан стварном наслову странице.", "version": "Верзија", - "version-extensions": "Инсталирана проширења", + "version-extensions": "Инсталирани додаци", "version-skins": "Инсталиране теме", "version-specialpages": "Посебне странице", "version-parserhooks": "Куке рашчлањивача", @@ -3517,7 +3526,7 @@ "version-other": "Друго", "version-mediahandlers": "Руководиоци медијима", "version-hooks": "Куке", - "version-parser-extensiontags": "Ознаке", + "version-parser-extensiontags": "Ознаке додатка рашчлањивача", "version-parser-function-hooks": "Куке", "version-hook-name": "Назив куке", "version-hook-subscribedby": "Пријављено од", @@ -3525,16 +3534,16 @@ "version-no-ext-name": "[нема имена]", "version-license": "Медијавики лиценца", "version-ext-license": "Лиценца", - "version-ext-colheader-name": "Екстензија", + "version-ext-colheader-name": "Додатак", "version-skin-colheader-name": "Тема", - "version-ext-colheader-version": "Издање", + "version-ext-colheader-version": "Верзија", "version-ext-colheader-license": "Лиценца", "version-ext-colheader-description": "Опис", "version-ext-colheader-credits": "Аутори", "version-license-title": "Лиценца за $1", - "version-license-not-found": "За ову екстензију није нађена информација о лиценци.", + "version-license-not-found": "За овај додатак није пронађена информација о лиценци.", "version-credits-title": "Заслуге за $1", - "version-credits-not-found": "За ову екстензију није нађена информација о заслугама.", + "version-credits-not-found": "За овај додатак није пронађена информација о заслугама.", "version-poweredby-credits": "Овај вики покреће '''[https://www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.", "version-poweredby-others": "остали", "version-poweredby-translators": "translatewiki.net преводиоци", @@ -3542,7 +3551,7 @@ "version-license-info": "Медијавики је слободан софтвер можете га редистрибуирати и/или модификовати под условима ГНУ-ове опште јавне лиценце верзија 2 или сваке следеће коју објави Задужбина за слободан софтвер.\n\nМедијавики се редистрибуира у нади да ће бити од користи, али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ чак и без ПОДРАЗУМЕВАНЕ ГАРАНЦИЈЕ ФУНКЦИОНАЛНОСТИ или ПРИКЛАДНОСТИ ЗА ОДРЕЂЕНЕУ НАМЕНУ. Погледајте ГНУ-ову општу јавну лиценцу за више информација.\n\nТребало би да сте добили [{{SERVER}}{{SCRIPTPATH}}/COPYING примерак ГНУ-ове опште јавне лиценце] заједно са овим програмом. Ако нисте, пишите на Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитајте овде].", "version-software": "Инсталирани софтвер", "version-software-product": "Производ", - "version-software-version": "Издање", + "version-software-version": "Верзија", "version-entrypoints": "Адресе улазне тачке", "version-entrypoints-header-entrypoint": "Улазна тачка", "version-entrypoints-header-url": "Адреса", @@ -3552,18 +3561,18 @@ "version-libraries-license": "Лиценца", "version-libraries-description": "Опис", "version-libraries-authors": "Аутори", - "redirect": "Преусмерење на датотеку, корисника, страницу, измену или дневник (ID)", - "redirect-summary": "Ова посебна страница преусмерава до датотеке (с датим именом датотеке), странице (с датим ID-ом измене или ID-ом странице), корисничке странице (с датим нумеричким корисничким ID-ом), или уноса у дневнику (с датим дневничким ID-ом). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].", + "redirect": "Преусмерење на датотеку, корисника, страницу, ревизију или дневник (ID)", + "redirect-summary": "Ова посебна страница преусмерава до датотеке (с датим именом датотеке), странице (с датим ID-ом ревизије или ID-ом странице), корисничке странице (с датим нумеричким корисничким ID-ом), или уноса у дневнику (с датим дневничким ID-ом). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].", "redirect-submit": "Иди", "redirect-lookup": "Тип вредности:", "redirect-value": "Вредност:", "redirect-user": "Кориснички ID", "redirect-page": "ID странице", - "redirect-revision": "Измена странице", + "redirect-revision": "Ревизија странице", "redirect-file": "Назив датотеке", - "redirect-logid": "ID дневника", + "redirect-logid": "ID евиденције", "redirect-not-exists": "Вредност није пронађена", - "fileduplicatesearch": "Претражи дупликате", + "fileduplicatesearch": "Претрага дупликата датотека", "fileduplicatesearch-summary": "Претрага дуплираних датотека према хеш вредности.", "fileduplicatesearch-filename": "Назив датотеке:", "fileduplicatesearch-submit": "Претражи", @@ -3577,7 +3586,7 @@ "specialpages-group-maintenance": "Извештаји одржавања", "specialpages-group-other": "Остале посебне странице", "specialpages-group-login": "Пријава / регистрација", - "specialpages-group-changes": "Скорашње измене и дневници", + "specialpages-group-changes": "Недавне промене и евиденције", "specialpages-group-media": "Извештаји о мултимедијалном садржају и отпремања", "specialpages-group-users": "Корисници и корисничка права", "specialpages-group-highuse": "Најчешће коришћене странице", @@ -3589,13 +3598,13 @@ "specialpages-group-developer": "Програмерске алатке", "blankpage": "Празна страница", "intentionallyblankpage": "Ова страница је намерно остављена празном.", - "external_image_whitelist": " #Оставите овај ред онаквим какав јесте
    \n#Испод додајте одломке регуларних израза (само део који се налази између //)\n#Они ће бити упоређени с адресама спољашњих слика\n#Оне које се поклапају биће приказане као слике, а преостале као везе до слика\n#Редови који почињу с тарабом се сматрају коментарима\n#Сви уноси су осетљиви на мала и велика слова\n\n#Додајте све одломке регуларних израза изнад овог реда. Овај ред не дирајте
    ", - "tags": "Важеће ознаке измена", - "tag-filter": "Филтер за [[Special:Tags|ознаке]]:", + "external_image_whitelist": " #Оставите овај ред онаквим какав јесте
    \n#Испод додајте одломке регуларних израза (само део који се налази између //)\n#Они ће бити упоређени с адресама спољашњих слика\n#Оне које се поклапају биће приказане као слике, а преостале као линкови до слика\n#Редови који почињу с тарабом се сматрају коментарима\n#Сви уноси су осетљиви на мала и велика слова\n\n#Додајте све одломке регуларних израза изнад овог реда. Овај ред не дирајте
    ", + "tags": "Важеће ознаке промена", + "tag-filter": "Филтер [[Special:Tags|ознака]]:", "tag-filter-submit": "Филтрирај", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ознака|ознаке}}]]: $2)", "tag-mw-contentmodelchange": "промена модела садржаја", - "tag-mw-contentmodelchange-description": "Измене које мењају модел садржаја странице", + "tag-mw-contentmodelchange-description": "Измене које [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel мењају модел садржаја] странице", "tag-mw-new-redirect": "ново преусмерење", "tag-mw-new-redirect-description": "Измене којима је направљено ново преусмерење или је страница измењена да буде преусмерење", "tag-mw-removed-redirect": "уклоњено преусмерење", @@ -3613,11 +3622,11 @@ "tags-title": "Ознаке", "tags-intro": "На овој страници је наведен списак ознака с којима програм може да означи измене и његово значење.", "tags-tag": "Назив ознаке", - "tags-display-header": "Изглед на списковима измена", + "tags-display-header": "Изглед на списковима промена", "tags-description-header": "Опис значења", "tags-source-header": "Извор", "tags-active-header": "Активна?", - "tags-hitcount-header": "Означене измене", + "tags-hitcount-header": "Означене промене", "tags-actions-header": "Радње", "tags-active-yes": "Да", "tags-active-no": "Не", @@ -3628,14 +3637,15 @@ "tags-delete": "обриши", "tags-activate": "активирај", "tags-deactivate": "деактивирај", - "tags-hitcount": "$1 {{PLURAL:$1|измена|измене|измена}}", - "tags-manage-no-permission": "Немате дозволу да мењате ознаке.", - "tags-create-heading": "Нова ознака", + "tags-hitcount": "$1 {{PLURAL:$1|промена|промене|промена}}", + "tags-manage-no-permission": "Немате дозволу да управљате променама ознака.", + "tags-manage-blocked": "Не можете да мењате ознаке промена док {{GENDER:$1|сте}} блокирани.", + "tags-create-heading": "Прављење нове ознаке", "tags-create-explanation": "По подразумеваним подешавањима нове ознаке моћи ће да користе корисници и ботови.", "tags-create-tag-name": "Назив ознаке:", "tags-create-reason": "Разлог:", "tags-create-submit": "Направи", - "tags-create-no-name": "Морате навести назив ознаке.", + "tags-create-no-name": "Морате да наведете име ознаке.", "tags-create-already-exists": "Ознака „$1“ већ постоји.", "tags-create-warnings-below": "Правите нову ознаку, желите ли да наставите?", "tags-delete-title": "Брисање ознака", @@ -3644,8 +3654,8 @@ "tags-delete-reason": "Разлог:", "tags-delete-submit": "Неповратно обриши ову ознаку", "tags-delete-not-found": "Ознака „$1“ не постоји.", - "tags-delete-too-many-uses": "Ознака „$1” је примењена на више од $2 {{PLURAL:$2|измене|изменa}}, што значи да се не може обрисати.", - "tags-delete-no-permission": "Немате дозволу да бришете ознаке за измену.", + "tags-delete-too-many-uses": "Ознака „$1” је примењена на више од $2 {{PLURAL:$2|ревизије|ревизија}}, што значи да се не може обрисати.", + "tags-delete-no-permission": "Немате дозволу да бришете ознаке промена.", "tags-activate-title": "Активирање ознака", "tags-activate-question": "Активирате ознаку „$1“.", "tags-activate-reason": "Разлог:", @@ -3657,11 +3667,14 @@ "tags-deactivate-reason": "Разлог:", "tags-deactivate-not-allowed": "Није могуће деактивирати ознаку „$1“.", "tags-deactivate-submit": "Декативирај", - "tags-update-no-permission": "Немате дозволу за додавање или уклањање ознаке измена из засебних измена или уноса у дневнику.", + "tags-apply-no-permission": "Немате дозволу да примените ознаке промена заједно са својим променама.", + "tags-update-no-permission": "Немате дозволу да додате или уклоните ознаке промена из појединачних ревизија или уноса у евиденцији.", "tags-update-blocked": "Не можете додавати нити уклањати ознаке измена док {{GENDER:$1|сте}} блокирани.", "tags-update-add-not-allowed-one": "Није дозвољено да се ознака „$1” додаје ручно.", "tags-edit-title": "Уреди ознаке", "tags-edit-manage-link": "Управљај ознакама", + "tags-edit-revision-selected": "{{PLURAL:$1|Изабрана ревизија|Изабране ревизије}} странице [[:$2]]:", + "tags-edit-revision-legend": "Додајте или уклоните ознаке са {{PLURAL:$1|ове ревизије|свих $1 ревизија}}", "tags-edit-existing-tags": "Постојеће ознаке:", "tags-edit-existing-tags-none": "Нема", "tags-edit-new-tags": "Нове ознаке:", @@ -3671,25 +3684,26 @@ "tags-edit-chosen-placeholder": "Изабери неке ознаке", "tags-edit-chosen-no-results": "Одговарајуће ознаке нису пронађене", "tags-edit-reason": "Разлог:", - "tags-edit-success": "Измене су примењене.", + "tags-edit-revision-submit": "Примени промене {{PLURAL:$1|овој ревизији|$1 ревизијама}}", + "tags-edit-success": "Промене су примењене.", "tags-edit-failure": "Не могу да применим измене:\n$1", - "tags-edit-nooldid-title": "Неисправна одредишна измена", + "tags-edit-nooldid-title": "Неважећа одредишна ревизија", "tags-edit-none-selected": "Изаберите бар једну ознаку коју треба додати или уклонити.", "comparepages": "Упоређивање страница", "compare-page1": "Страница 1", "compare-page2": "Страница 2", - "compare-rev1": "Измена 1", + "compare-rev1": "Ревизија 1", "compare-rev2": "Измена 2", "compare-submit": "Упореди", - "compare-invalid-title": "Наведени наслов је неисправан.", + "compare-invalid-title": "Наслов који сте навели је неважећи.", "compare-title-not-exists": "Наведени наслов не постоји.", - "compare-revision-not-exists": "Наведена измена не постоји.", + "compare-revision-not-exists": "Ревизија коју сте навели не постоји.", "diff-form": "Разлике", - "diff-form-oldid": "ID старе измене (необавезно)", + "diff-form-oldid": "ID старе ревизије (опционално)", "diff-form-revid": "ID измене или разлике", "diff-form-submit": "Прикажи разлике", - "permanentlink": "Трајна веза", - "permanentlink-revid": "ID измене", + "permanentlink": "Трајни линк", + "permanentlink-revid": "ID ревизије", "permanentlink-submit": "Иди на измену", "dberr-problems": "Дошло је до техничких проблема.", "dberr-again": "Сачекајте неколико минута и поново учитајте страницу.", @@ -3698,15 +3712,15 @@ "dberr-usegoogle": "У међувремену, покушајте да претражите помоћу Гугла.", "dberr-outofdate": "Имајте на уму да њихови примерци нашег садржаја могу бити застарели.", "dberr-cachederror": "Ово је привремено меморисан примерак стране који можда није ажуран.", - "htmlform-invalid-input": "Пронађени су проблеми у вашем уносу", - "htmlform-select-badoption": "Наведена вредност није исправна опција.", + "htmlform-invalid-input": "Постоје проблеми са вашим уносом.", + "htmlform-select-badoption": "Вредност коју сте навели није валидна опција.", "htmlform-int-invalid": "Наведена вредност није цели број.", "htmlform-float-invalid": "Наведена вредност није број.", "htmlform-int-toolow": "Наведена вредност је испод минимума од $1", "htmlform-int-toohigh": "Наведена вредност је изнад максимума од $1", "htmlform-required": "Ова вредност је обавезна.", "htmlform-submit": "Постави", - "htmlform-reset": "Врати измене", + "htmlform-reset": "Врати промене", "htmlform-selectorother-other": "Друго", "htmlform-no": "Не", "htmlform-yes": "Да", @@ -3717,31 +3731,37 @@ "htmlform-date-placeholder": "ГГГГ-ММ-ДД", "htmlform-time-placeholder": "ЧЧ:ММ:СС", "htmlform-datetime-placeholder": "ГГГГ-ММ-ДД ЧЧ:ММ:СС", + "htmlform-date-invalid": "Вредност коју сте навели није препознати датум. Покушајте да користите формат ГГГГ-ММ-ДД.", + "htmlform-time-invalid": "Вредност коју сте навели није препознато време. Покушајте да користите формат ЧЧ:ММ:СС.", + "htmlform-datetime-invalid": "Вредност коју сте навели није препознати датум и време. Покушајте да користите формат ГГГГ-ММ-ДД ЧЧ:ММ:СС.", + "htmlform-date-toolow": "Вредност коју сте навели је пре најранијег дозвољеног датума – $1.", + "htmlform-date-toohigh": "Вредност коју сте навели је после крајњег дозвољеног датума – $1.", + "htmlform-time-toolow": "Вредност коју сте навели је пре најранијег дозвољеног времена – $1.", "htmlform-title-badnamespace": "[[:$1]] није у именском простору „{{ns:$2}}“.", "htmlform-title-not-creatable": "Страница „$1“ се не може направити", "htmlform-title-not-exists": "$1 не постоји.", "htmlform-user-not-exists": "$1 не постоји.", - "htmlform-user-not-valid": "$1 није исправно корисничко име.", + "htmlform-user-not-valid": "$1 није валидно корисничко име.", "logentry-delete-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3", "logentry-delete-delete_redir": "$1 је {{GENDER:$2|обрисао|обрисала}} преусмерење $3 преписивањем", "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3 ($4)", "logentry-delete-restore-nocount": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3", - "restore-count-revisions": "{{PLURAL:$1|1 измена|$1 измене|$1 измена}}", + "restore-count-revisions": "{{PLURAL:$1|1 ревизија|$1 ревизије|$1 ревизија}}", "restore-count-files": "{{PLURAL:$1|1 датотека|$1 датотеке|$1 датотека}}", - "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја}} у дневнику $3: $4", - "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=једне измене|$5 измене|$5 измена}} на страници $3: $4", - "logentry-delete-event-legacy": "$1 је {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику $3", - "logentry-delete-revision-legacy": "$1 је {{GENDER:$2|променио|променила}} видљивост измена на страници $3", + "logentry-delete-event": "$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", - "logentry-suppress-event": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|догађаја|$5 догађаја}} у дневнику $3: $4", - "logentry-suppress-revision": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|измене|$5 измена}} на страници $3: $4", - "logentry-suppress-event-legacy": "$1 је потајно {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику $3", - "logentry-suppress-revision-legacy": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост измена на страници $3", + "logentry-suppress-event": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|догађаја|$5 догађаја}} у евиденцији на страници „$3”: $4", + "logentry-suppress-revision": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|ревизије|$5 ревизија}} на страници $3: $4", + "logentry-suppress-event-legacy": "$1 је потајно {{GENDER:$2|променио|променила}} видљивост догађаја у евиденцији на страници „$3”", + "logentry-suppress-revision-legacy": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост ревизија на страници $3", "revdelete-content-hid": "садржај је сакривен", - "revdelete-summary-hid": "опис измене је сакривен", + "revdelete-summary-hid": "резиме измене је сакривен", "revdelete-uname-hid": "корисничко име је сакривено", "revdelete-content-unhid": "садржај је откривен", - "revdelete-summary-unhid": "опис измене је откривен", + "revdelete-summary-unhid": "резиме измене је откривен", "revdelete-uname-unhid": "корисничко име је откривено", "revdelete-restricted": "примењена ограничења за администраторе", "revdelete-unrestricted": "уклоњена ограничења за администраторе", @@ -3751,41 +3771,41 @@ "logentry-suppress-block": "$1 је {{GENDER:$2|блокирао|блокирала}} {{GENDER:$4|$3}} у трајању од $5 $6", "logentry-suppress-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања за блокирање {{GENDER:$4|корисника|кориснице}} {{GENDER:$4|$3}} у трајању од $5 $6", "logentry-import-upload": "$1 је {{GENDER:$2|увезао|увезла}} $3 отпремањем датотеке", - "logentry-import-upload-details": "$1 је {{GENDER:$2|увезао|увезла}} $3 отпремањем датотеке ($4 {{PLURAL:$4|измена|измене|измена}})", + "logentry-import-upload-details": "$1 је {{GENDER:$2|увезао|увезла}} $3 отпремањем датотеке ($4 {{PLURAL:$4|ревизија|ревизије|ревизија}})", "logentry-import-interwiki": "$1 је {{GENDER:$2|увезао|увезла}} $3 с другог викија", - "logentry-import-interwiki-details": "$1 је {{GENDER:$2|увезао|увезла}} $3 из $5 ($4 {{PLURAL:$4|1=измена|измене|измена}})", + "logentry-import-interwiki-details": "$1 је {{GENDER:$2|увезао|увезла}} $3 из $5 ($4 {{PLURAL:$4|ревизија|ревизије|ревизија}})", "logentry-merge-merge": "$1 је {{GENDER:$2|спојио|спојила}} $3 у $4 (све до измене $5)", "logentry-move-move": "$1 је {{GENDER:$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 је {{GENDER:$2|преместио|преместила}} страницу $3 на $4 преко преусмерења без остављања преусмерења", - "logentry-patrol-patrol": "$1 је {{GENDER:$2|означио|означила}} измену $4 странице $3 као патролирану", - "logentry-patrol-patrol-auto": "$1 је аутоматски {{GENDER:$2|означио|означила}} измену $4 странице $3 као патролирану", + "logentry-patrol-patrol": "$1 је {{GENDER:$2|означио|означила}} ревизију $4 странице $3 као патролирану", + "logentry-patrol-patrol-auto": "$1 је аутоматски {{GENDER:$2|означио|означила}} ревизију $4 странице $3 као патролирану", "logentry-newusers-newusers": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог", "logentry-newusers-create": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог", "logentry-newusers-create2": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог $3", - "logentry-newusers-byemail": "$1 је {{GENDER:$2|направио|направила}} кориснички налог $3 и лозинка је послата на имејл", + "logentry-newusers-byemail": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог $3 и лозинка је послата на имејл", "logentry-newusers-autocreate": "Кориснички налог $1 је аутоматски {{GENDER:$2|отворен}}", "logentry-protect-move_prot": "$1 је {{GENDER:$2|преместио|преместила}} подешавања заштите са $4 на $3", "logentry-protect-unprotect": "$1 je {{GENDER:$2|скинуо|скинула}} заштиту са странице $3", "logentry-protect-protect": "$1 је {{GENDER:$2|заштитио|заштитила}} $3 $4", "logentry-protect-protect-cascade": "$1 је {{GENDER:$2|заштитио|заштитила}} $3 $4 [преносива заштита]", - "logentry-protect-modify": "$1 је {{GENDER:$2|променио|променила}} степен заштите за $3 $4", - "logentry-protect-modify-cascade": "$1 је {{GENDER:$2|променио|променила}} степен заштите за $3 $4 [преносива заштита]", + "logentry-protect-modify": "$1 је {{GENDER:$2|променио|променила}} ниво заштите странице „$3” $4", + "logentry-protect-modify-cascade": "$1 је {{GENDER:$2|променио|променила}} ниво заштите странице „$3” $4 [преносива заштита]", "logentry-rights-rights": "$1 је {{GENDER:$2|променио|променила}} чланство групе за {{GENDER:$6|$3}} из $4 у $5", "logentry-rights-rights-legacy": "$1 је {{GENDER:$2|променио|променила}} чланство групе за $3", "logentry-rights-autopromote": "$1 је аутоматски {{GENDER:$2|унапређен|унапређена}} из $4 у $5", "logentry-upload-upload": "$1 је {{GENDER:$2|отпремио|отпремила}} $3", "logentry-upload-overwrite": "$1 је {{GENDER:$2|отпремио|отпремила}} нову верзију $3", "logentry-upload-revert": "$1 је {{GENDER:$2|отпремио|отпремила}} $3", - "log-name-managetags": "Дневник уређивања ознака", - "log-description-managetags": "Овај дневник садржи списак измена у вези [[Special:Tags|ознака]]. Дневник садржи само радње извршене од стране администратора, уноси за ознаке направљене или обрисане од стране вики софтвера се не налазе у овом дневнику.", + "log-name-managetags": "Евиденција управљања ознакама", + "log-description-managetags": "На овој страници се налази списак измена у вези [[Special:Tags|ознака]]. Евиденција садржи само радње које су ручно извршили администратори; уноси за ознаке које је направио или обрисао вики софтвера се не налазе у овој евиденцији.", "logentry-managetags-create": "$1 је {{GENDER:$2|направио|направила}} ознаку „$4“", - "logentry-managetags-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} ознаку „$4“ (уклоњена је из $5 {{PLURAL:$5|измене или дневника|измена и/или дневника}})", + "logentry-managetags-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} ознаку „$4“ (уклоњена је из $5 {{PLURAL:$5|ревизије или уноса у евиденцији|ревизија и/или уноса у евиденцији}})", "logentry-managetags-activate": "$1 је {{GENDER:$2|активирао|активирала}} ознаку „$4“ за употребу од стране корисника и ботова", "logentry-managetags-deactivate": "$1 је {{GENDER:$2|деактивирао|деактивирала}} ознаку „$4“ за употребу од стране корисника и ботова", - "log-name-tag": "Дневник ознака", - "log-description-tag": "Овај дневник приказује додавање/уклањање [[Special:Tags|ознака]] на појединачне измене или уносе у дневницима. Овај дневник не приказује означавање када су она део уређивања, брисања или неке друге радње.", + "log-name-tag": "Евиденција ознака", + "log-description-tag": "Ова страница приказује када су корисници додали/уклонили [[Special:Tags|ознаке]] с појединачних ревизија или уноса у евиденцијама. Евиденција не приказује радње означавања када су се догодиле приликом уређивања, брисања или сличне радње.", "rightsnone": "(нема)", "rightslogentry-temporary-group": "$1 (привремено, до $2)", "feedback-adding": "Додајем повратну информацију на страницу…", @@ -3809,7 +3829,7 @@ "feedback-useragent": "Кориснички агент:", "searchsuggest-search": "Претрага", "searchsuggest-containing": "садржи...", - "api-error-badtoken": "Унутрашња грешка: неисправан жетон.", + "api-error-badtoken": "Унутрашња грешка: лош токен.", "api-error-emptypage": "Стварање нових празних страница није дозвољено.", "api-error-publishfailed": "Унутрашња грешка: сервер није успео да објави привремену датотеку.", "api-error-stashfailed": "Унутрашња грешка: сервер не може да сачува привремену датотеку.", @@ -3841,7 +3861,7 @@ "limitreport-unstrip-depth": "Unstrip дубина рекурзије", "limitreport-unstrip-size": "Unstrip величина након проширења", "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}", - "expandtemplates": "Замена шаблона", + "expandtemplates": "Проширавање шаблона", "expand_templates_intro": "Ова посебна страница узима викитекст и мења све шаблоне у њему рекурзивно.\nТакође мења функције парсера као што је {{#language:…}} и променљиве као што је {{CURRENTDAY}}. \nЗаправо практично све што се налази између витичастих заграда.", "expand_templates_title": "Назив контекста; за {{СТРАНИЦА}} итд.:", "expand_templates_input": "Унос викитекста:", @@ -3854,7 +3874,7 @@ "expand_templates_generate_xml": "Прикажи XML стабло", "expand_templates_generate_rawhtml": "Прикажи сиров HTML", "expand_templates_preview": "Претпреглед", - "pagelanguage": "Промени језик странице", + "pagelanguage": "Промена језика странице", "pagelang-name": "Страница", "pagelang-language": "Језик", "pagelang-use-default": "Користи подразумевани језик", @@ -3865,19 +3885,19 @@ "pagelang-unchanged-language": "Страница $1 је већ постављена на језик $2.", "pagelang-db-failed": "База података није успела променити језик странице.", "right-pagelang": "мењање језика странице", - "action-pagelang": "промену језика странице", - "log-name-pagelang": "Дневник промене језика", - "log-description-pagelang": "Ово је дневник измена у језицима страница.", + "action-pagelang": "промените језик странице", + "log-name-pagelang": "Евиденција промене језика", + "log-description-pagelang": "Ово је евиденција промена у језицима страница.", "logentry-pagelang-pagelang": "$1 је {{GENDER:$2|променио|променила}} језик странице $3 из $4 у $5.", "default-skin-not-found-row-enabled": "* $1 / $2 (омогућена)", "default-skin-not-found-row-disabled": "* $1 / $2 (онемогућена)", - "mediastatistics": "Статистика датотека", - "mediastatistics-summary": "Статистике о типовима послатих датотека. Овде су урачунате само најновије верзије датотека. Старе или обрисане верзије нису урачунате.", + "mediastatistics": "Статистика медија", + "mediastatistics-summary": "Статистике о типовима послатих датотека. Овде су урачунате само најскорије верзије датотека. Старе или обрисане верзије нису урачунате.", "mediastatistics-nbytes": "{{PLURAL:$1|$1 бајт|$1 бајта|$1 бајтова}} ($2; $3%)", "mediastatistics-bytespertype": "Укупна величина датотеке овог одељка: {{PLURAL:$1|$1 бајт|$1 бајта|$1 бајтова}} ($2; $3%).", "mediastatistics-allbytes": "Укупна величина свих датотека: {{PLURAL:$1|$1 бајт|$1 бајта|$1 бајтова}} ($2).", "mediastatistics-table-mimetype": "MIME тип", - "mediastatistics-table-extensions": "Могуће екстензије", + "mediastatistics-table-extensions": "Могући додаци", "mediastatistics-table-count": "Број датотека", "mediastatistics-table-totalbytes": "Укупна величина", "mediastatistics-header-unknown": "Непознато", @@ -3893,14 +3913,14 @@ "json-warn-trailing-comma": "$1 {{PLURAL:$1|пратећа тачка је уклоњена|пратеће тачке су уклоњене|пратећих тачки је уклоњено}} из JSON-a", "json-error-unknown": "Догодио се проблем с JSON-ом. Грешка: $1", "json-error-depth": "Прекорачена је највећа дубина", - "json-error-state-mismatch": "Невалидан или покварени JSON", + "json-error-state-mismatch": "Неважећи или покварени JSON", "json-error-ctrl-char": "Грешка контролног симбола, могуће је да је неисправно енкодиран", "json-error-syntax": "Грешка у синтакси", "json-error-utf8": "Малформирани UTF-8 знаци, могуће је да су неисправно енкодирани", "json-error-recursion": "Једна или више рекурзивних референци у вредности коју треба енкодирати.", "json-error-inf-or-nan": "Једна или више NAN или INF вредности у вредности коју треба енкодирати", - "json-error-unsupported-type": "Дата је вреднос врсте која се не може енкодирати", - "headline-anchor-title": "Веза до овог одељка", + "json-error-unsupported-type": "Дата је вредност типа која се не може енкодирати", + "headline-anchor-title": "Линк до овог одељка", "special-characters-group-latin": "Латиница", "special-characters-group-latinextended": "Проширена латиница", "special-characters-group-ipa": "МФА", @@ -3944,25 +3964,25 @@ "log-action-filter-contentmodel": "Тип промене модела садржаја:", "log-action-filter-delete": "Тип брисања:", "log-action-filter-import": "Тип увоза:", - "log-action-filter-managetags": "Тип уређивања ознака:", + "log-action-filter-managetags": "Тип радње управљања ознакама:", "log-action-filter-move": "Тип премештања:", "log-action-filter-newusers": "Тип новог налога:", "log-action-filter-patrol": "Тип патролирања:", - "log-action-filter-protect": "Тип закључавања:", + "log-action-filter-protect": "Тип заштите:", "log-action-filter-rights": "Тип промене корисничких права:", - "log-action-filter-suppress": "Врста скривања:", + "log-action-filter-suppress": "Тип скривања:", "log-action-filter-upload": "Тип отпремања:", "log-action-filter-all": "Све", "log-action-filter-block-block": "блокирање", "log-action-filter-block-reblock": "измена блокирања", "log-action-filter-block-unblock": "деблокирање", - "log-action-filter-contentmodel-change": "Измена модела садржаја", + "log-action-filter-contentmodel-change": "Промена модела садржаја", "log-action-filter-contentmodel-new": "Нова страница с нестандардним моделом садржаја", "log-action-filter-delete-delete": "брисање странице", "log-action-filter-delete-delete_redir": "преснимавање преусмерења", "log-action-filter-delete-restore": "враћање странице", - "log-action-filter-delete-event": "брисање уноса у дневницима", - "log-action-filter-delete-revision": "брисање измене", + "log-action-filter-delete-event": "брисање евиденције", + "log-action-filter-delete-revision": "брисање ревизија", "log-action-filter-import-interwiki": "Међувики увоз", "log-action-filter-import-upload": "Увоз постављањем XML-а", "log-action-filter-managetags-create": "нова ознака", @@ -3983,17 +4003,17 @@ "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-event": "Скривање уноса у евиденцији", + "log-action-filter-suppress-revision": "скривање ревизија", "log-action-filter-suppress-delete": "Скривање странице", "log-action-filter-suppress-block": "Скривање корисника блокирањем", "log-action-filter-suppress-reblock": "Скривање корисника поновним блокирањем", "log-action-filter-upload-upload": "ново отпремање", "log-action-filter-upload-overwrite": "промена постојећег", - "authmanager-authn-not-in-progress": "Аутентификација није у току или је дошло до губитка података о сесији. Почните испочетка.", + "authmanager-authn-not-in-progress": "Потврда идентитета није у току или је дошло до губитка података о сесији. Почните испочетка.", "authmanager-authn-no-primary": "Не могу да проверим пружене акредитиве.", "authmanager-authn-no-local-user": "Пружени акредитиви нису повезани ни са једним корисником на овом викију.", - "authmanager-authn-no-local-user-link": "Пружени су исправни акредитиви, али нису повезани ни с једним корисником на овом викију. Пријавите се на неки други начин или направите нови кориснички налог, што ће Вам дати могућност да повежете претходне акредитиве на нови налог.", + "authmanager-authn-no-local-user-link": "Пружени су важећи акредитиви, али нису повезани ни с једним корисником на овом викију. Пријавите се на неки други начин или направите нови кориснички налог, што ће вам дати могућност да повежете претходне акредитиве на нови налог.", "authmanager-authn-autocreate-failed": "Не могу да аутоматски направим локални налог: $1", "authmanager-change-not-supported": "Не могу да променим пружене акредитиве јер их ништа не би користило.", "authmanager-create-disabled": "Онемогућено прављење налога.", @@ -4003,77 +4023,77 @@ "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-authplugin-setpass-failed-message": "Додатак за потврду идентитета је одбио промену лозинке.", + "authmanager-authplugin-create-fail": "Додатак за потврду идентитета је одбио прављење налога.", + "authmanager-authplugin-setpass-denied": "Додатак за потврду идентитета не дозвољава мењање лозику.", + "authmanager-authplugin-setpass-bad-domain": "Неважећи домен.", "authmanager-autocreate-noperm": "Аутоматско прављење налога није дозвољено.", "authmanager-userdoesnotexist": "Кориснички налог „$1“ није отворен.", - "authmanager-username-help": "Корисничко име за аутентификацију.", - "authmanager-password-help": "Лозинка за аутентификацију.", - "authmanager-domain-help": "Домен за спољашњу аутентификацију.", + "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-password-domain": "Аутентификација лозинком и доменом", + "authmanager-provider-password": "Потврда идентитета лозинком", + "authmanager-provider-password-domain": "Потврда идентитета лозинком и доменом", "authmanager-provider-temporarypassword": "Привремена лозинка", "authprovider-confirmlink-option": "$1 ($2)", "authprovider-confirmlink-request-label": "Рачуни који се требају повезати", "authprovider-confirmlink-success-line": "$1: Успешно повезано.", "authprovider-confirmlink-failed": "Не могу да повежем налог у потпуности: $1", - "authprovider-confirmlink-ok-help": "Наставите након приказивања порука за неуспешно повезивање.", + "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": "Недостаје жетон", - "authform-wrongtoken": "Погрешан жетон", + "authform-nosession-login": "Потврда идентитета је успела, али ваш прегледач не може да „запамти” да сте пријављени.\n\n$1", + "authform-nosession-signup": "Налог је отворен, али ваш прегледач не може да „запамти” да сте пријављени.\n\n$1", + "authform-newtoken": "Недостаје токен. $1", + "authform-notoken": "Недостаје токен", + "authform-wrongtoken": "Погрешан токен", "specialpage-securitylevel-not-allowed-title": "Није дозвољено", - "specialpage-securitylevel-not-allowed": "Жао нам је, није Вам дозвољено да користите ову страницу јер не могу да потврдим Ваш идентитет.", + "specialpage-securitylevel-not-allowed": "Жао нам је, није вам дозвољено да користите ову страницу јер не могу да потврдим ваш идентитет.", "authpage-cannot-login": "Не могу започети пријаву.", - "authpage-cannot-login-continue": "Не могу да наставим пријављивање. Ваша сесија је највероватније истекла.", + "authpage-cannot-login-continue": "Не могу да наставим са пријавом. Ваша сесија је највероватније истекла.", "authpage-cannot-create": "Не могу започети стварање налога.", "authpage-cannot-link": "Не могу започети спајање налога.", "cannotauth-not-allowed-title": "Приступ је одбијен", - "cannotauth-not-allowed": "Није Вам дозвољено да користите ову страницу", + "cannotauth-not-allowed": "Није вам дозвољено да користите ову страницу", "changecredentials": "Промена акредитива", "changecredentials-submit": "Промени", - "changecredentials-invalidsubpage": "„$1“ није исправна врста акредитива.", + "changecredentials-invalidsubpage": "„$1“ није важећи тип акредитива.", "changecredentials-success": "Ваши акредитиви су промењени.", "removecredentials": "Уклањање акредитива", "removecredentials-submit": "Уклањање акредитива", - "removecredentials-invalidsubpage": "„$1“ није исправна врста акредитива.", + "removecredentials-invalidsubpage": "„$1“ није важећи тип акредитива.", "removecredentials-success": "Ваши акредитиви су уклоњени.", - "credentialsform-provider": "Врста акредитива:", + "credentialsform-provider": "Тип акредитива:", "credentialsform-account": "Назив налога:", "cannotlink-no-provider-title": "Нема налога за повезивање", "cannotlink-no-provider": "Нема налога за повезивање.", - "linkaccounts": "Повежи налоге", + "linkaccounts": "Спајање налога", "linkaccounts-success-text": "Налог је повезан.", "linkaccounts-submit": "Повежи налоге", - "unlinkaccounts": "Обједини налоге", + "unlinkaccounts": "Раздвајање налога", "unlinkaccounts-success": "Налог је обједињен.", "userjsispublic": "Напомена: JavaScript подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.", "usercssispublic": "Напомена: CSS подстранице не би требале садржавати поверљиве информације будући да су видљиве другим корисницима.", - "restrictionsfield-badip": "Неисправна ИП адреса или опсег: $1", - "restrictionsfield-label": "Дозвољени ИП-опсези:", + "restrictionsfield-badip": "Неважећа IP адреса или опсег: $1", + "restrictionsfield-label": "Дозвољени IP опсези:", "edit-error-short": "Грешка: $1", "edit-error-long": "Грешке:\n\n$1", - "revid": "измена $1", + "revid": "ревизија $1", "pageid": "ID странице: $1", "rawhtml-notallowed": "<html> тагови не могу да се користе ван нормалних страница.", - "gotointerwiki": "Напуштам пројекат {{SITENAME}}", + "gotointerwiki": "Напуштање пројекта {{SITENAME}}", "gotointerwiki-invalid": "Одабрани наслов је невалидан.", "gotointerwiki-external": "Управо ћете да напустите пројекат {{SITENAME}} да бисте на засебном веб-сајту посетили [[$2]].\n\n'''[$1 Продужи на $1]'''", "undelete-cantedit": "Не можете повратити ову страницу јер немате дозволу да је уређујете.", "undelete-cantcreate": "Не можете повратити ову страницу јер нема постојеће странице са овим именом и немате дозволу да направите ову страницу.", "pagedata-title": "Подаци странице", "pagedata-not-acceptable": "Није пронађен одговарајући облик. Подржане MIME-врсте: $1", - "pagedata-bad-title": "Невалидан наслов: $1.", + "pagedata-bad-title": "Неважећи наслов: $1.", "passwordpolicies": "Правила за лозинке", "passwordpolicies-group": "Група", "passwordpolicies-policies": "Правила", diff --git a/languages/i18n/sr-el.json b/languages/i18n/sr-el.json index 8f4753c987..c4b1e4834a 100644 --- a/languages/i18n/sr-el.json +++ b/languages/i18n/sr-el.json @@ -356,7 +356,7 @@ "cannotdelete-title": "Ne mogu da obriÅ¡em stranicu „$1“", "delete-hook-aborted": "Brisanje je prekinula kuka.\nNije dato nikakvo obrazloženje.", "no-null-revision": "Ne mogu da napravim novu praznu verziju za stranicu „$1“", - "badtitle": "Neispravan naslov", + "badtitle": "LoÅ¡ naslov", "badtitletext": "Naslov stranice je neispravan, prazan ili je međujezički ili međuviki naslov pogreÅ¡no povezan.\nMožda sadrži znakove koji se ne mogu koristiti u naslovima.", "title-invalid-empty": "Traženo ime stranice je prazno ili sadrži samo naziv imenskog prostora.", "title-invalid-utf8": "Traženi naziv stranice sadrži nevažeći UTF-8 znak.", @@ -435,7 +435,7 @@ "notloggedin": "Niste prijavljeni", "userlogin-noaccount": "Nemate nalog?", "userlogin-joinproject": "Pridružite se projektu {{SITENAME}}", - "createaccount": "Otvori nalog", + "createaccount": "Otvaranje naloga", "userlogin-resetpassword-link": "Zaboravili ste lozinku?", "userlogin-helplink2": "Pomoć pri prijavljivanju", "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.", @@ -520,7 +520,7 @@ "php-mail-error-unknown": "Nepoznata greÅ¡ka u funkciji PHP mail().", "user-mail-no-addy": "PokuÅ¡ali ste da poÅ¡aljete imejl bez imejl adrese.", "user-mail-no-body": "PokuÅ¡ano slanje imejla s praznim ili nerazumno kratkim sadržajem.", - "changepassword": "Promeni lozinku", + "changepassword": "Promena lozinke", "resetpass_announce": "Da biste zavrÅ¡ili prijavu, podesite novu lozinku ovde.", "resetpass_text": "", "resetpass_header": "Promena lozinke naloga", @@ -1842,7 +1842,7 @@ "statistics-users": "Registrovani korisnici", "statistics-users-active": "Aktivni korisnici", "statistics-users-active-desc": "Korisnici koji su izvrÅ¡ili bar jednu radnju {{PLURAL:$1|1=prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}", - "pageswithprop": "Strane s osobinom strane", + "pageswithprop": "Stranice sa svojstvom stranice", "pageswithprop-legend": "Strane s osobinom strane", "pageswithprop-text": "Ova strana izlistava strane koje imaju određenu osobinu", "pageswithprop-prop": "Ime osobine:", @@ -1899,13 +1899,13 @@ "mostimages": "Datoteke s najviÅ¡e veza", "mostinterwikis": "Stranice sa najviÅ¡e međuvikija", "mostrevisions": "Stranice s najviÅ¡e izmena", - "prefixindex": "Sve stranice s prefiksom", + "prefixindex": "Sve stranice sa prefiksom", "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)", "prefixindex-submit": "Prikaži", "prefixindex-strip": "Sakrij prefiks u spisku", "shortpages": "Kratke stranice", "longpages": "Dugačke stranice", - "deadendpages": "Stranice bez unutraÅ¡njih veza", + "deadendpages": "Ćorsokaci", "deadendpagestext": "Sledeće stranice nemaju veze do drugih stranica na ovom vikiju.", "protectedpages": "ZaÅ¡tićene stranice", "protectedpages-filters": "Filteri:", @@ -1990,7 +1990,7 @@ "apisandbox-param-limit": "Unesite max da bi ste koristili najveće ograničenje.", "apisandbox-multivalue-all-namespaces": "$1 (svi imenski prostori)", "apisandbox-multivalue-all-values": "$1 (sve vrednosti)", - "booksources": "Å tampani izvori", + "booksources": "Književni izvori", "booksources-search-legend": "Pretraži Å¡tampane izvore", "booksources-isbn": "ISBN:", "booksources-search": "Pretraži", @@ -2092,7 +2092,7 @@ "trackingcategories-disabled": "Kategorija je onemogućena", "mailnologin": "Nema adrese za slanje", "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravan imejl adresu u [[Special:Preferences|podeÅ¡avanjima]] da biste slali imejlove drugim korisnicima.", - "emailuser": "PoÅ¡alji imejl", + "emailuser": "PoÅ¡alji imejl ovom korisniku/ci", "emailuser-title-target": "Slanje imejla {{GENDER:$1|korisniku|korisnici}}", "emailuser-title-notarget": "Slanje imejla korisniku", "emailpagetext": "Možete da koristite donji obrazac da poÅ¡aljete imejl {{GENDER:$1|ovom korisniku|ovoj korisnici}}.\nImejl koji ste uneli u vaÅ¡im [[Special:Preferences|podeÅ¡avanjima]] će se prikazati u polju „Od“, tako da će primalac moći da vam odgovori direktno.", @@ -2674,7 +2674,7 @@ "importlogpagetext": "Administrativni uvozi stranica s istorijama izmena s drugih vikija.", "import-logentry-upload-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}}", "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}} iz $2", - "javascripttest": "Javaskript test", + "javascripttest": "Testiranje javaskripta", "javascripttest-pagetext-unknownaction": "Nepoznata radnja „$1“.", "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.", "tooltip-pt-userpage": "{{GENDER:|VaÅ¡a}} korisnička stranica", @@ -3552,7 +3552,7 @@ "redirect-file": "Naziv datoteke", "redirect-logid": "ID dnevnika", "redirect-not-exists": "Vrednost nije pronađena", - "fileduplicatesearch": "Pretraži duplikate", + "fileduplicatesearch": "Pretraga duplikata datoteka", "fileduplicatesearch-summary": "Pretraga dupliranih datoteka prema heÅ¡ vrednosti.", "fileduplicatesearch-filename": "Naziv datoteke:", "fileduplicatesearch-submit": "Pretraži", @@ -3830,7 +3830,7 @@ "limitreport-unstrip-depth": "Unstrip dubina rekurzije", "limitreport-unstrip-size": "Unstrip veličina nakon proÅ¡irenja", "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}", - "expandtemplates": "Zamena Å¡ablona", + "expandtemplates": "ProÅ¡iravanje Å¡ablona", "expand_templates_intro": "Ova posebna stranica uzima vikitekst i menja sve Å¡ablone u njemu rekurzivno.\nTakođe menja funkcije parsera kao Å¡to je {{#language:…}} i promenljive kao Å¡to je {{CURRENTDAY}}. \nZapravo praktično sve Å¡to se nalazi između vitičastih zagrada.", "expand_templates_title": "Naziv konteksta; za {{STRANICA}} itd.:", "expand_templates_input": "Unos vikiteksta:", @@ -3843,7 +3843,7 @@ "expand_templates_generate_xml": "Prikaži XML stablo", "expand_templates_generate_rawhtml": "Prikaži sirov HTML", "expand_templates_preview": "Pretpregled", - "pagelanguage": "Promeni jezik stranice", + "pagelanguage": "Promena jezika stranice", "pagelang-name": "Stranica", "pagelang-language": "Jezik", "pagelang-use-default": "Koristi podrazumevani jezik", @@ -3859,7 +3859,7 @@ "log-description-pagelang": "Ovo je dnevnik izmena u jezicima stranica.", "logentry-pagelang-pagelang": "$1 je {{GENDER:$2|promenio|promenila}} jezik stranice $3 iz $4 u $5.", "default-skin-not-found-row-enabled": "* $1 / $2 (omogućena)", - "mediastatistics": "Statistika datoteka", + "mediastatistics": "Statistika medija", "mediastatistics-summary": "Statistike o tipovima poslatih datoteka. Ovde su uračunate samo najnovije verzije datoteka. Stare ili obrisane verzije nisu uračunate.", "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%)", "mediastatistics-bytespertype": "Ukupna veličina datoteke ovog odeljka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%).", @@ -4053,7 +4053,7 @@ "revid": "izmena $1", "pageid": "ID stranice: $1", "rawhtml-notallowed": "<html> tagovi ne mogu da se koriste van normalnih stranica.", - "gotointerwiki": "NapuÅ¡tam projekat {{SITENAME}}", + "gotointerwiki": "NapuÅ¡tanje projekta {{SITENAME}}", "gotointerwiki-invalid": "Odabrani naslov je nevalidan.", "gotointerwiki-external": "Upravo ćete da napustite projekat {{SITENAME}} da biste na zasebnom veb-sajtu posetili [[$2]].\n\n'''[$1 Produži na $1]'''", "undelete-cantedit": "Ne možete povratiti ovu stranicu jer nemate dozvolu da je uređujete.", diff --git a/languages/i18n/sv.json b/languages/i18n/sv.json index 27fc9109ca..445cfa9b87 100644 --- a/languages/i18n/sv.json +++ b/languages/i18n/sv.json @@ -436,6 +436,7 @@ "ns-specialprotected": "Specialsidor kan inte redigeras.", "titleprotected": "Denna sidtitel har skyddats frÃ¥n att skapas av [[User:$1|$1]].\nDen angivna anledningen är $2.", "filereadonlyerror": "Det gÃ¥r inte att ändra filen \"$1\", eftersom fildatabasen \"$2\" är i skrivskyddat läge.\n\nDen systemadministratör som lÃ¥ste den angav följande anledning: \"$3\".", + "invalidtitle": "Ogiltig titel", "invalidtitle-knownnamespace": "Ogiltig titel med namnrymden \"$2\" och texten \"$3\"", "invalidtitle-unknownnamespace": "Ogiltig titel med okänt namnrymdsnummer $1 och texten \"$2\"", "exception-nologin": "Inte inloggad", @@ -1196,7 +1197,7 @@ "group-autoconfirmed-member": "{{GENDER:$1|bekräftad användare}}", "group-bot-member": "{{GENDER:$1|robot}}", "group-sysop-member": "{{GENDER:$1|administratör}}", - "group-interface-admin-member": "{{GENDER:$1|gränssnittsadministratörer}}", + "group-interface-admin-member": "{{GENDER:$1|gränssnittsadministratör}}", "group-bureaucrat-member": "{{GENDER:$1|byrÃ¥krat}}", "group-suppress-member": "{{GENDER:$1|censor}}", "grouppage-user": "{{ns:project}}:Användare", @@ -1845,9 +1846,9 @@ "filehist-filesize": "Filstorlek", "filehist-comment": "Kommentar", "imagelinks": "Filanvändning", - "linkstoimage": "Följande {{PLURAL:$1|sida|$1 sidor}} länkar till den här filen:", - "linkstoimage-more": "Mer än {{PLURAL:$1|en sida|$1 sidor}} länkar till den här filen.\nFöljande lista visar bara {{PLURAL:$1|den första sidan|de $1 första sidorna}} som länkar till filen.\nDet finns en [[Special:WhatLinksHere/$2|fullständig lista]].", - "nolinkstoimage": "Inga sidor länkar till den här filen.", + "linkstoimage": "Följande {{PLURAL:$1|sida|$1 sidor}} använder den här filen:", + "linkstoimage-more": "Mer än {{PLURAL:$1|en sida|$1 sidor}} använder den här filen.\nFöljande lista visar bara {{PLURAL:$1|den första sidan|de $1 första sidorna}} som använder filen.\nDet finns en [[Special:WhatLinksHere/$2|fullständig lista]].", + "nolinkstoimage": "Inga sidor använder den här filen.", "morelinkstoimage": "Visa [[Special:WhatLinksHere/$1|fler länkar]] till den här filen.", "linkstoimage-redirect": "$1 (filomdirigering) $2", "duplicatesoffile": "Följande {{PLURAL:$1|fil är en dubblett|filer är dubbletter}} till den här filen ([[Special:FileDuplicateSearch/$2|mer detaljer]]):", @@ -2124,7 +2125,7 @@ "cachedspecial-refresh-now": "Visa senaste.", "categories": "Kategorier", "categories-submit": "Visa", - "categoriespagetext": "Följande {{PLURAL:$1|kategori|kategorier}} innehÃ¥ller sidor eller media.\n[[Special:UnusedCategories|Oanvända kategorier]] visas inte här.\nSe även [[Special:WantedCategories|önskade kategorier]].", + "categoriespagetext": "Följande {{PLURAL:$1|kategori|kategorier}} finns pÃ¥ wikin och kanske eller kanske inte används.\nSe även [[Special:WantedCategories|önskade kategorier]].", "categoriesfrom": "Visa kategorier frÃ¥n och med:", "deletedcontributions": "Raderade användarbidrag", "deletedcontributions-title": "Raderade användarbidrag", @@ -4094,6 +4095,7 @@ "edit-error-long": "Fel:\n\n$1", "revid": "sidversion $1", "pageid": "sid-ID $1", + "interfaceadmin-info": "$1\n\nBehörigheter för att redigera CSS/JS/JSON-filer för hela webbplatsen separerades nyligen frÃ¥n rättigheten editinterface. Om du inte förstÃ¥r varför du fÃ¥r detta felmeddelande, se [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "<html>-taggar kan inte användas utanför normala sidor.", "gotointerwiki": "Lämnar {{SITENAME}}", "gotointerwiki-invalid": "Den angivna titeln är ogiltig.", diff --git a/languages/i18n/sw.json b/languages/i18n/sw.json index fb6aa0d8e6..a0e1e10222 100644 --- a/languages/i18n/sw.json +++ b/languages/i18n/sw.json @@ -1321,7 +1321,7 @@ "imagelinks": "Matumizi ya faili", "linkstoimage": "{{PLURAL:$1|Ukurasa huu umeunganishwa|Kurasa hizi $1 zimeunganishwa}} na faili hili:", "linkstoimage-more": "Zipo {{PLURAL:$1|kurasa|kurasa}} zaidi ya $1 zinazounga na faili hili.\nOrodha inayofuata inaonyesha {{PLURAL:$1|kiungo cha kwanza|viungo $1 vya kwanza}} tu vinavyoungana na faili hili.\n[[Special:WhatLinksHere/$2|Orodha nzima]] inapatikana.", - "nolinkstoimage": "Hakuna kurasa zozote zilizounganishwa na faili hii.", + "nolinkstoimage": "Hakuna kurasa zozote zinazotumia faili hii.", "morelinkstoimage": "Tazama [[Special:WhatLinksHere/$1|viungo vingine]] vinavyoelekeza faili hili.", "linkstoimage-redirect": "$1 (elekezo la faili) $2", "duplicatesoffile": "{{PLURAL:$1|Faili linalofuata ni nakala ya|Mafaili $1 yanayofuata ni nakala za}} faili hili ([[Special:FileDuplicateSearch/$2|maelezo mengine]]):", diff --git a/languages/i18n/ta.json b/languages/i18n/ta.json index f92970ebe8..c4590dcf91 100644 --- a/languages/i18n/ta.json +++ b/languages/i18n/ta.json @@ -400,6 +400,7 @@ "ns-specialprotected": "சிறப்புப் பக்கங்களைத் தொகுக்க முடியாது.", "titleprotected": "பயனர் [[User:$1|$1]] இத்தலைப்பு உருவாக்கப்படுவதை தவிர்க்கும் வகையில் தடுத்துள்ளார்.\nகொடுக்கப்பட்டக் காரணம் $2.", "filereadonlyerror": "\"$1\" கோப்பைத் திருத்த முடியவில்லை ஏனெனில் கோப்புப் பெட்டகம் \"$2\" படிக்க-மட்டும் வகையில் உள்ளது. அதனை பூட்டிய நிர்வாகி பின்வரும் விளக்கத்தை அளித்துள்ளார்: \"$3\"", + "invalidtitle": "செல்லத்தகாத தலைப்பு", "invalidtitle-knownnamespace": "பெயரிடைவெளி ' $2 '' மற்றும் உரை '' $3 '' கொன்ட தலைப்பு செல்லாது", "invalidtitle-unknownnamespace": "அறியப்படாத பெயரிடைவெளி $1 மற்றும் உரை $2 கொண்ட தலைப்பு செல்லாது", "exception-nologin": "புகுபதிகை செய்யப்படவில்லை.", @@ -431,6 +432,7 @@ "cannotloginnow-title": "இப்பொழுது விடுபதிகை செய்ய இயலாது.", "cannotloginnow-text": "$1-ஐ பயன்படுத்தும் பொழுது விடுபதிகை சாத்தியம் அல்ல.", "cannotcreateaccount-title": "கணக்கைத் தொடங்க முடியாது", + "cannotcreateaccount-text": "இவ்விக்கியில் நேரடி கணக்குத்தொடக்கம் இயக்கப்படவில்லை", "yourdomainname": "உங்கள் உரிமைப்பரப்பு:", "password-change-forbidden": "நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது", "externaldberror": "வெளி உறுதிப்படுத்தலில் ஏற்பட்ட தவறு காரணமாக உங்கள் வெளி கணக்கை இற்றைப்படுத்த முடியாது.", @@ -446,12 +448,14 @@ "userlogin-resetpassword-link": "உங்கள் கடவுச் சொல்லை மறந்து விட்டீர்களா?", "userlogin-helplink2": "உள்நுழைவதற்கு உதவி", "userlogin-loggedin": "நீங்கள் {{GENDER:$1|$1}} ஆக புகுபதியவில்லை.\nகீழ் உள்ள படிவத்தை பயன்படுத்தி இன்னொரு பயனராக புகுபதிவு செய்க.", + "userlogin-reauth": "{{GENDER:$1|$1}} என்பதை உறுதிசெய்ய நீங்கள் உள்புக வேண்டும்.", "userlogin-createanother": "மற்றொரு கணக்கு ஒன்றை உருவாக்கவும்", "createacct-emailrequired": "மின்னஞ்சல் முகவரி", "createacct-emailoptional": "மின்னஞ்சல் முகவரி (விருப்பத்தேர்வு)", "createacct-email-ph": "உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடுக", "createacct-another-email-ph": "உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடுக", "createaccountmail": "தற்காலிகமாக எழுந்தமான ஒரு கடவுச்சொல்லை பயன்படுத்துக, அதை குறித்துள்ள மின்னஞ்சலுக்கு அனுப்புக", + "createaccountmail-help": "மற்றவருக்காக கடவுச்சொல்லை அறிந்துக்கொள்ளாமல் கணக்கைத் தொடங்க முடியும்.", "createacct-realname": "உண்மைப் பெயர் (விருப்பத்தேர்வு)", "createacct-reason": "காரணம்", "createacct-reason-ph": "தாங்கள் ஏன் மற்றொரு கணக்கைத் துவங்குகிறீர்கள்?", @@ -631,6 +635,9 @@ "savechanges": "மாற்றங்களைச் சேமி", "publishpage": "பக்கத்தைப் பதிப்பிடுக", "publishchanges": "மாற்றங்களைப் பதிப்பிடுக", + "savearticle-start": "பக்கத்தைச் சேமி..", + "savechanges-start": "மாற்றங்களைச் சேமிக்கவும்...", + "publishpage-start": "மாற்றங்களைப் பதிப்பிடுக…", "publishchanges-start": "மாற்றங்களைப் பதிப்பிடுக…", "preview": "முன்தோற்றம்", "showpreview": "முன்தோற்றம் காட்டு", @@ -727,6 +734,7 @@ "postedit-confirmation-created": "இந்தப் பக்கம் உருவாக்கபட்டுள்ளது", "postedit-confirmation-restored": "இந்தப் பக்கம் மீட்டமைக்கப்பட்டது.", "postedit-confirmation-saved": "உங்களது தொகுப்பு சேமிக்கப்பட்டது.", + "postedit-confirmation-published": "தங்கள் தொகுப்பு பதிப்பிக்கப்பட்டுவிட்டது.", "edit-already-exists": "புதிய பக்கமொன்றை உருவாக்க முடியாது.\nஇப்பக்கம் ஏற்கனவே உள்ளது.", "defaultmessagetext": "இயல்பிருப்பு தகவல் உரை", "content-failed-to-parse": "உள்ளடக்கம் $2 வகை $1 இற்காக பாகுபடுத்தல் தோல்வி: $3", @@ -908,6 +916,7 @@ "diff-multi-manyusers": "({{PLURAL:$2|பயனரால்|$2 பயனர்களால்}} செய்யப்பட்ட {{PLURAL:$1|ஒரு இடைப்பட்ட திருத்தம்|$1 இடைப்பட்ட திருத்தங்கள்}} காட்டப்படவில்லை.)", "difference-missing-revision": "இந்த வேறுபாட்டின் ($1) {{PLURAL:$2|ஒரு திருத்தம்|$2 திருத்தங்கள்}} {{PLURAL:$2|கண்டறியப்பட்டது|கண்டறியப்பட்டன}}.\n\nஇது வழக்கமாக அழிக்கப்பட்ட பக்கத்தின் ஒரு காலவதியான வேறுபாட்டு இணைப்பு காரணமாக ஏற்படுகிறது.\nமேலும் விவரங்களை [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} நீக்கல் பதிவில்] காணலாம்.", "searchresults": "தேடல் முடிவுகள்", + "search-filter-title-prefix-reset": "அணைத்துப் பக்கங்களில் தேடவும்", "searchresults-title": "\"$1\" இற்கான தேடல் முடிவுகள்", "titlematches": "கட்டுரைத் தலைப்புப் பொருந்துகிறது", "textmatches": "கட்டுரை உரை பொருந்துகிறது", @@ -938,7 +947,7 @@ "search-file-match": "(கோப்பு உள்ளடக்கத்துடன் பொருந்துகிறது)", "search-suggest": "நீங்கள் கருதியது இதையா: $1", "search-rewritten": "$1-இற்கான முடிவுகள் காட்டப்படுகின்றன. $2-இற்கு பதிலாக தேடப்படுகிறது.", - "search-interwiki-caption": "உறவுத் திட்டங்கள்", + "search-interwiki-caption": "உறவுத் திட்டங்களில் இருந்து முடிவுகள்", "search-interwiki-default": "$1 தளத்திலிருந்து முடிவுகள்:", "search-interwiki-more": "(மேலும்)", "search-interwiki-more-results": "மேலும் முடிவுகள்", @@ -981,6 +990,7 @@ "prefs-watchlist-edits": "விரிவாக்கப்பட்ட கவனிப்புப் பட்டியலில் காட்டவேண்டிய தொகுப்புகளின் எண்ணிக்கை:", "prefs-watchlist-edits-max": "(அதிக அளவான எண்: 1000)", "prefs-watchlist-token": "கவனிப்பு பட்டியலின் அடையாளம்:", + "prefs-watchlist-managetokens": "வில்லைகளை நிர்வகிக்க", "prefs-misc": "பலதரப்பட்டவை", "prefs-resetpass": "கடவுச்சொல்லை மாற்றுக", "prefs-changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு", @@ -1274,6 +1284,8 @@ "recentchanges-legend-heading": "குறியீட்டு விளக்கம்:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)", "recentchanges-submit": "காட்டு", + "rcfilters-activefilters-hide": "மறைக்க", + "rcfilters-activefilters-show": "காட்டு", "rcfilters-days-title": "அண்மைய தினங்கள்", "rcfilters-hours-title": "அண்மைய நேரங்கள்", "rcfilters-days-show-days": "$1 {{PLURAL:$1|நாள்|நாட்கள்}}", @@ -1287,6 +1299,7 @@ "rcfilters-savedqueries-apply-label": "வடிப்பானை உருவாக்குக", "rcfilters-savedqueries-apply-and-setdefault-label": "தன்னியல்பு வடிப்பானை உருவாக்குக", "rcfilters-savedqueries-cancel-label": "ரத்து செய்", + "rcfilters-invalid-filter": "செல்லத்தகாத வடிப்பான்", "rcfilters-filterlist-title": "வடிப்பான்கள்", "rcfilters-highlightmenu-title": "ஒரு நிறத்தை தேர்ந்தெடுக்கவும்", "rcfilters-filterlist-noresults": "எந்த வடிப்பானும் காணப்படவில்லை", @@ -1294,7 +1307,9 @@ "rcfilters-filter-editsbyself-description": "தங்களது தொகுப்புகள்.", "rcfilters-filter-editsbyother-label": "மற்றவர் தொகுப்புகள்", "rcfilters-filter-user-experience-level-registered-label": "பதிவுசெய்யப்பட்டது", + "rcfilters-filter-user-experience-level-registered-description": "உள்நுழைந்த தொகுப்பாளர்கள்.", "rcfilters-filter-user-experience-level-unregistered-label": "பதிவு நீக்கம் செய்யப்பட்டது", + "rcfilters-filter-user-experience-level-unregistered-description": "உள்புகாத தொகுப்பாளர்கள்", "rcfilters-filter-user-experience-level-newcomer-label": "புது வரவுகள்", "rcfilters-filter-user-experience-level-learner-label": "கற்போர்", "rcfilters-filter-user-experience-level-experienced-label": "அனுபவமுள்ள பயனர்கள்", @@ -1304,12 +1319,18 @@ "rcfilters-filter-bots-description": "தானியக்க கருவிகளால ஆன தொகுப்புகள்", "rcfilters-filter-humans-label": "மனிதன் (தானியங்கி அல்ல)", "rcfilters-filter-humans-description": "மனித தொகுப்பாளர்களால் ஆன தொகுப்பு", + "rcfilters-filter-reviewstatus-unpatrolled-label": "சுற்றித்திரியாதவை", + "rcfilters-filter-reviewstatus-auto-label": "தானியக்கமாக ரோந்திடப்பட்டது", "rcfilters-filtergroup-significance": "சிறப்பு", "rcfilters-filter-minor-label": "சிறு தொகுப்பு", + "rcfilters-filter-major-label": "சிறுமையில்லா தொகுப்புகள்", + "rcfilters-filtergroup-watchlist": "பார்க்கப்படும் பக்கங்கள்", "rcfilters-filtergroup-changetype": "மாற்ற வகை", "rcfilters-filter-pageedits-label": "பக்க தொகுப்புகள்", "rcfilters-filter-newpages-label": "பக்க உருவாக்கங்கள்", + "rcfilters-filtergroup-lastRevision": "அண்மைய திருத்தங்கள்", "rcfilters-filter-lastrevision-label": "அண்மைய திருத்தம்", + "rcfilters-filter-excluded": "தவிர்க்கப்பட்டது", "rcnotefrom": "கீழே காணப்படுவது $3, $4 இலிருந்து செய்யப்பட்ட ($1 வரைக் காட்டப்பட்டுள்ளது) {{PLURAL:$5|மாற்றமாகும்.|மாற்றங்களாகும்.}}", "rclistfrom": "$2, $3 முதல் இன்று வரை செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்", "rcshowhideminor": "சிறிய தொகுப்புகளை $1", @@ -1451,6 +1472,7 @@ "upload-copy-upload-invalid-domain": "இந்தக் களத்தில் இருந்து படியெடுத்துப் பதிவேற்றம் செய்யும் வசதி கிடையாது.", "upload-dialog-title": "கோப்பைப் பதிவேற்று", "upload-dialog-button-cancel": "ரத்து செய்", + "upload-dialog-button-back": "பின் செல்", "upload-dialog-button-done": "முடிந்தது", "upload-dialog-button-save": "சேமி", "upload-dialog-button-upload": "பதிவேற்று", @@ -1510,6 +1532,11 @@ "uploadstash-badtoken": "அந்த செயலுக்கான நடவடிக்கை தோல்வியடைந்தது, ஒருவேளை ஏனென்றால் உங்கள் திருத்த அறிமுகசான்றுகள் காலாவதியாகிவிட்டது. மீண்டும் முயற்சி செய்.", "uploadstash-errclear": "கோப்புகளை சரிசெய்தல் (Clearing) தோல்வியடைந்து விட்டது.", "uploadstash-refresh": "கோப்புகள் உள்ள பட்டியலை புதுப்பி", + "uploadstash-thumbnail": "நகப்படத்தை காட்டுக", + "uploadstash-bad-path": "வழி இடம்பெறவில்லை", + "uploadstash-bad-path-invalid": "வழி செல்லத்தாகது", + "uploadstash-file-not-found-no-thumb": "நகப்படத்தை பெறமுடியவில்லை", + "uploadstash-zero-length": "கோப்பின் நீளம் சுழியம்", "invalid-chunk-offset": "செல்லாத chunk offset", "img-auth-accessdenied": "அனுமதி மறுக்கப்பட்டது", "img-auth-nopathinfo": "PATH_INFO காணவில்லை.\nஉங்கள் வழங்கி இந்தத் தகவலை அனுப்ப அமைக்கப்படவில்லை\nஇது சிஜிஐ (CGI)- அடிப்படையிலானதாகவோ img_auth-ஐ ஆதரக்காததாகவோ இருக்கலாம் .\nபார்க்கவும் https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -1757,6 +1784,7 @@ "apisandbox-reset": "வெறுமையாக்கு", "apisandbox-retry": "மறு முயற்சி செய்", "apisandbox-examples": "உதாரணங்கள்", + "apisandbox-add-multi": "சேர்", "apisandbox-results": "முடிவுகள்", "apisandbox-sending-request": "API வேண்டுகோள் அனுப்பப்படுகிறது...", "apisandbox-loading-results": "API முடிவுகள் பெறப்படுகின்றன...", @@ -1839,6 +1867,7 @@ "listgrouprights-namespaceprotection-header": "பெயர்வெளி கட்டுப்பாடு", "listgrouprights-namespaceprotection-namespace": "பெயர்வெளி", "listgrouprights-namespaceprotection-restrictedto": "பயனரை திருத்த அனுமதிக்கும் உரிமை(கள்)", + "listgrants": "நல்கைகள்", "listgrants-grant": "நல்கை", "listgrants-rights": "அணுக்கங்கள்", "trackingcategories": "பகுப்புகளை தடமறி", @@ -1943,6 +1972,7 @@ "dellogpage": "நீக்கல் பதிவு", "dellogpagetext": "கீழே காணப்படுவது மிக அண்மைய நீக்கல்களின் அட்டவணையாகும்.", "deletionlog": "நீக்கல் பதிவு", + "log-name-create": "பக்க உருவாக்க குறிப்பு", "reverted": "முன் திருத்தத்துக்கு முன்நிலையாக்கப்பட்டது", "deletecomment": "காரணம்:", "deleteotherreason": "வேறு மேலதிக காரணம்:", @@ -2160,6 +2190,9 @@ "unblocked-id": "$1 தடை நீக்கப்பட்டது", "unblocked-ip": "[[Special:Contributions/$1|$1]] முடக்கப்பட்டார்.", "blocklist": "தடைசெய்யப்பட்ட பயனர்கள்", + "autoblocklist": "தன்னியக்கத் தடை", + "autoblocklist-submit": "தேடுக", + "autoblocklist-legend": "தானியக்க தடைகளை பட்டியலிடுக", "ipblocklist": "தடைசெய்யப்பட்ட பயனர்கள்", "ipblocklist-legend": "தடுக்கப்பட்ட பயனரொருவரைத் தேடு", "blocklist-userblocks": "கணக்கு தடுப்புகளை மறை", diff --git a/languages/i18n/te.json b/languages/i18n/te.json index 62f42480df..0824294e77 100644 --- a/languages/i18n/te.json +++ b/languages/i18n/te.json @@ -1412,7 +1412,7 @@ "rcfilters-tag-prefix-namespace-inverted": ":not $1", "rcfilters-exclude-button-off": "ఎంచుకున్నవాటిని వదిలెయ్యి", "rcfilters-exclude-button-on": "ఎంచుకున్నవాటిని వదిలేస్తున్నాం", - "rcfilters-view-tags": "ట్యాగ్ ఉన్న మార్పులు", + "rcfilters-view-tags": "ట్యాగు ఉన్న మార్పులు", "rcfilters-view-namespaces-tooltip": "ఫలితాలను పేరుబరి ప్రకారం వడపోయి", "rcfilters-view-tags-tooltip": "ట్యాగుల వారీగా ఫలితాలను వడపోయండి", "rcfilters-view-return-to-default-tooltip": "తిరిగి ప్రధాన వడపోత మెనూకు వెళ్ళండి", @@ -1583,6 +1583,11 @@ "upload-form-label-own-work": "ఇది నా స్వంత కృతి", "upload-form-label-infoform-categories": "వర్గాలు", "upload-form-label-infoform-date": "తేదీ", + "upload-form-label-not-own-work-message-generic-local": "మీరీ ఫైలును {{SITENAME}} విధానాల ప్రకారం ఎక్కించలేకపోతే, ఈ డయలాగ్ పెట్టెను మూసేసి వేరే పద్ధతిలో ప్రయత్నించండి.", + "upload-form-label-not-own-work-local-generic-local": "మీరు [[Special:Upload|డిఫాల్టు ఎక్కింపు పేజీ]]ని కూడా వాడి చూడవచ్చు.", + "upload-form-label-own-work-message-generic-foreign": "నేనీ ఫైలును అందరికీ అందుబాటులో ఉండే ఒక ఖజానాలోకి ఎక్కిస్తున్నానని తెలుసు. అక్కడి సేవా నియమాలు, లైసెన్సు విధానాలకు లోబడి ఈ పని చేస్తున్నానని నిర్ధారిస్తున్నాను.", + "upload-form-label-not-own-work-message-generic-foreign": "అందరికీ అందుబాటులో ఉండే ఖజానా (షేర్‌డ్ రిపాజిటరీ) విధానాలకు లోబడి ఈ ఫైలును ఎక్కించలేకపోతే, ఈ డయలాగు పెట్టెను మూసేసి, వేరే పద్ధతిలో ప్రయత్నించండి.", + "upload-form-label-not-own-work-local-generic-foreign": "[[Special:Upload|{{SITENAME}} లోని ఎక్కింపు పేజీ]] ద్వారా - ఆ సైటు విధానాలకు లోబడి ఎక్కించే వీలుంటే - ఈ ఫైలును ఎక్కించే ప్రయత్నం చెయ్యవచ్చు.", "backend-fail-stream": "\"$1\" ఫైలును స్ట్రీమింగు చెయ్యలేకపోయాం.", "backend-fail-backup": "\"$1\" ఫైలును బ్యాకప్పు చెయ్యలేకపోయాం.", "backend-fail-notexists": "$1 ఫైలు అసలు లేనేలేదు.", @@ -1632,6 +1637,8 @@ "uploadstash-errclear": "ఫైళ్ళ తీసివేత విఫలమైంది.", "uploadstash-refresh": "దస్త్రాల జాబిజాను తాజాకరించు", "uploadstash-thumbnail": "నఖచిత్రం చూడండి", + "uploadstash-exception": "ఎక్కించిన దాన్ని ($1) ఖజానాలో భద్రపరచలేక పోయాం: \"$2\".", + "uploadstash-bad-path-unknown-type": "తెలియని రకం \"$1\".", "uploadstash-file-too-large": "$1 బైట్ల కంటే పెద్ద ఫైలును భద్రపరచలేం.", "uploadstash-not-logged-in": "వాడుకరి ఎవరూ లాగినై లేరు. దస్త్రాలు వాడుకరులకు చెంది ఉండాలి", "uploadstash-wrong-owner": "ఈ దస్త్రం ($1) ప్రస్తుత వాడుకరికి చెందినది కాదు.", @@ -1700,9 +1707,9 @@ "filehist-filesize": "దస్త్రపు పరిమాణం", "filehist-comment": "వ్యాఖ్య", "imagelinks": "దస్త్రపు వాడుక", - "linkstoimage": "కింది {{PLURAL:$1|పేజీ|$1 పేజీల}} నుండి ఈ ఫైలుకి లింకులు ఉన్నాయి:", - "linkstoimage-more": "ఈ ఫైలుకు $1 కంటే ఎక్కువ {{PLURAL:$1|పేజీ లింకై ఉంది|పేజీలు లింకై ఉన్నాయి}}.\nఈ ఫైలుకి మాత్రమే లింకై ఉన్న {{PLURAL:$1|మొదటి పేజీని|మొదటి $1 పేజీలను}} ఈ క్రింది జాబితా చూపిస్తుంది.\n[[Special:WhatLinksHere/$2|పూర్తి జాబితా]] కూడా ఉంది.", - "nolinkstoimage": "ఈ ఫైలుకు లింకున్న పేజీలు లేవు.", + "linkstoimage": "కింది {{PLURAL:$1|పేజీ|$1 పేజీలు}} ఈ ఫైలును వాడుతున్నాయి:", + "linkstoimage-more": "ఈ ఫైలును $1 కంటే ఎక్కువ {{PLURAL:$1|పేజీ వాడుతోంది|పేజీలు వాడుతున్నాయి}}.\nఈ ఫైలును మాత్రమే వాడుతున్న {{PLURAL:$1|మొదటి పేజీని|మొదటి $1 పేజీలను}} ఈ క్రింది జాబితా చూపిస్తుంది.\n[[Special:WhatLinksHere/$2|పూర్తి జాబితా]] ఉంది.", + "nolinkstoimage": "ఈ ఫైలును వాడుతున్న పేజీలు లేవు.", "morelinkstoimage": "ఈ ఫైలుకు ఉన్న మరిన్ని [[Special:WhatLinksHere/$1| లింకులను]] చూపించు", "linkstoimage-redirect": "$1 (దస్త్రపు దారిమార్పు) $2", "duplicatesoffile": "క్రింద పేర్కొన్న {{PLURAL:$1|ఫైలు ఈ ఫైలుకి నకలు|$1 ఫైళ్ళు ఈ ఫైలుకి నకళ్ళు}} ([[Special:FileDuplicateSearch/$2|మరిన్ని వివరాలు]]):", @@ -1824,6 +1831,7 @@ "wantedpages-badtitle": "ఫలితాల సమితిలో తప్పుడు శీర్షిక: $1", "wantedfiles": "కావలసిన ఫైళ్ళు", "wantedfiletext-cat": "కింది ఫైళ్ళను వాడారు, కానీ అవి ఉనికిలో లేవు. బయటి రిపాజిటరీలలోని ఫైళ్ళను, అవి ఉనికిలో ఉన్నప్పటికీ, చూపవచ్చు. అటువంటి తప్పు పాజిటివులు కొట్టివేయబడతాయి. పైగా, ఉనికిలో లేని ఫైళ్ళను ఇమిడ్చే పేజీలు [[:$1]] లో చేర్చబడతాయి.", + "wantedfiletext-cat-noforeign": "కింది దస్త్రాలు ఉనికిలో లేవు. కానీ, అవి వాడుకలో ఉన్నాయి. అదనంగా, ఉనికిలోనే లేని దస్త్రాలను వాడే పేజీల జాబితా [[:$1]] లో ఉంది.", "wantedfiletext-nocat": "కింది ఫైళ్ళను వాడారు, కానీ అవి ఉనికిలో లేవు. బయటి రిపాజిటరీలలోని ఫైళ్ళను, అవి ఉనికిలో ఉన్నప్పటికీ, చూపవచ్చు. అటువంటి తప్పు పాజిటివులు కొట్టివేయబడతాయి.", "wantedfiletext-nocat-noforeign": "ఈ క్రింది దస్త్రాలను వాడారు కానీ అవి లేనే లేవు.", "wantedtemplates": "కావాల్సిన మూసలు", @@ -1882,7 +1890,7 @@ "nopagetext": "మీరు అడిగిన పేజీ లేదు", "pager-newer-n": "{{PLURAL:$1|1 కొత్తది|$1 కొత్తవి}}", "pager-older-n": "{{PLURAL:$1|1 పాతది|$1 పాతవి}}", - "suppress": " పూర్తి తొలగింపు", + "suppress": "పూర్తి తొలగింపు", "querypage-disabled": "పనితీరు కారణాల వలన, ఈ ప్రత్యేకపేజీని అశక్తం చేసాం.", "apihelp": "API సహాయం", "apihelp-no-such-module": "\"$1\" మాడ్యూలు కనబడలేదు.", @@ -1993,6 +2001,7 @@ "post-expand-template-argument-category-desc": "ఓ మూస పరామితిని విస్తరించాక (మూడు మీసాల బ్రాకెట్ల మధ్య ఉన్నవి, ఇలా: {{{Foo}}}), ఈ పేజీ $wgMaxArticleSize కంటే పెద్దదిగా ఉంది.", "expensive-parserfunction-category-desc": "ఈ పేజీ ఖరీదైన పార్సరు ఫంక్షన్లు చాలా వాటిని వాడుతోంది (#ifexist లాంటివి). [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] చూడండి.", "broken-file-category-desc": "ఈ పుటలో విరిగిన దస్త్ర లంకె ఉన్నది (దస్త్రం ఉనికిలో లేనప్పుడు దస్త్రానికి ఎంబెడ్ చేయు లంకె).", + "hidden-category-category-desc": "ఈ వర్గంపు పేజీ పాఠ్యంలో __HIDDENCAT__ ఉంది. ఈ కారణంగా, ఈ వర్గంలో చేరి ఉన్న పేజీల వర్గాల పెట్టెలో ఇది కనబడదు.", "trackingcategories-nodesc": "వివరణ లేదు.", "trackingcategories-disabled": "వర్గం అచేతనమై ఉంది", "mailnologin": "పంపించవలసిన చిరునామా లేదు", @@ -2657,7 +2666,7 @@ "anonymous": "{{SITENAME}} యొక్క అజ్ఞాత {{PLURAL:$1|వాడుకరి|వాడుకరులు}}", "siteuser": "{{SITENAME}} వాడుకరి $1", "anonuser": "{{SITENAME}} అజ్ఞాత వాడుకరి $1", - "lastmodifiedatby": "ఈ పేజీకి $3 $2, $1à°¨ చివరి మార్పు చేసారు.", + "lastmodifiedatby": "ఈ పేజీలో చివరి మార్పు $1à°¨ చేసారు. చేసినది: $3 $2.", "othercontribs": "$1 యొక్క కృతిపై ఆధారితం.", "others": "ఇతరాలు", "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|వాడుకరి}}|వాడుకరులు}} $1", @@ -2691,6 +2700,7 @@ "pageinfo-watchers": "పేజీ గమనింపుదారుల సంఖ్య", "pageinfo-visiting-watchers": "ఈ పేజీలో ఇటీవల జరిగిన దిద్దుబాట్లను చూసిన వీక్షకుల సంఖ్య", "pageinfo-few-watchers": "$1 {{PLURAL:$1|వీక్షకుడి|వీక్షకుల}} కంటే తక్కువ", + "pageinfo-few-visiting-watchers": "ఇటీవలి మార్పులను గమనిస్తూ ఉన్న వాడుకరి ఉండి ఉండవచ్చు, ఉండకపోనూ వచ్చు.", "pageinfo-redirects-name": "ఈ పేజీకి ఉన్న దారిమార్పుల సంఖ్య", "pageinfo-subpages-name": "ఈ పేజీకి ఉన్న ఉపపేజీల సంఖ్య", "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|దారిమార్పు|దారిమార్పులు}}; $3 {{PLURAL:$3|దారిమార్పు కానిది|దారిమార్పు కానివి}})", @@ -2719,6 +2729,8 @@ "pageinfo-category-pages": "పేజీల సంఖ్య", "pageinfo-category-subcats": "ఉపవర్గాల సంఖ్య", "pageinfo-category-files": "దస్త్రాల సంఖ్య", + "pageinfo-user-id": "వాడుకరి ID", + "pageinfo-file-hash": "హ్యాష్ వ్యాల్యూ", "markaspatrolleddiff": "పరీక్షించినట్లుగా గుర్తు పెట్టు", "markaspatrolledtext": "ఈ వ్యాసాన్ని పరీక్షించినట్లుగా గుర్తు పెట్టు", "markedaspatrolled": "పరీక్షింపబడినట్లు గుర్తింపబడింది", @@ -3165,6 +3177,7 @@ "confirmrecreate": "మీరు దిద్దుబాటు మొదలుపెట్టిన తరువాత [[User:$1|$1]] ([[User talk:$1|చర్చ]]) ఈ పేజీని {{GENDER:$1|తొలగించారు}}. దానికి ఈ కారణం ఇచ్చారు: $2\nమీరు ఈ పేజీని మళ్ళీ సృష్టించాలనుకుంటున్నారని ధృవీకరించండి.", "confirmrecreate-noreason": "మీరు దిద్దుబాటు మొదలుపెట్టిన తరువాత [[User:$1|$1]] ([[User talk:$1|చర్చ]]) ఈ పేజీని {{GENDER:$1|తొలగించారు}}. మీరు ఈ పేజీని మళ్ళీ సృష్టించాలనుకుంటున్నారని ధృవీకరించండి.", "recreate": "మళ్లీ సృష్టించు", + "confirm-purge-title": "ఈ పేజీని పర్జ్ చెయ్యండి", "confirm_purge_button": "సరే", "confirm-purge-top": "ఈ పేజీ యొక్క పాత కాపీని తొలగించమంటారా?", "confirm-purge-bottom": "సత్వరనిల్వ(cache)లోపేజీ నిర్మూలించితే, ఇటీవలి కూర్పు కనబడుతుంది.", @@ -3173,6 +3186,7 @@ "confirm-unwatch-button": "సరే", "confirm-unwatch-top": "ఈ పుటను మీ వీక్షణ జాబితా నుండి తొలగించాలా?", "confirm-rollback-button": "సరే", + "confirm-rollback-top": "ఈ పేజీలో జరిగిన దిద్దుబాట్లను వెనక్కి తిప్పాలా?", "quotation-marks": "“$1”", "imgmultipageprev": "← మునుపటి పేజీ", "imgmultipagenext": "తరువాతి పేజీ →", @@ -3194,6 +3208,8 @@ "autosumm-blank": "పేజీలోని విషయాన్నంతటినీ తీసేసారు.", "autosumm-replace": "పేజీని '$1' తో మారుస్తున్నాం", "autoredircomment": "పేజీని [[$1]] కు దారి మళ్ళించారు", + "autosumm-removed-redirect": "[[$1]] కు ఉన్న దారిమార్పును తీసేసాం", + "autosumm-changed-redirect-target": "దారిమార్పును [[$1]] నుండి [[$2]] కు మార్చాం", "autosumm-new": "'$1' తో కొత్త పేజీని సృష్టించారు", "autosumm-newblank": "ఖాళీ పేజీని సృష్టించారు", "lag-warn-normal": "$1 {{PLURAL:$1|క్షణం|క్షణాల}} లోపు జరిగిన మార్పులు ఈ జాబితాలో కనిపించకపోవచ్చు.", @@ -3217,6 +3233,7 @@ "watchlistedit-clear-titles": "శీర్షికలు:", "watchlistedit-clear-submit": "వీక్షణ జాబితా శుభ్రం చేయి (ఇది శాశ్వతం!)", "watchlistedit-clear-done": "మీ వీక్షణ జాబితాను శుభ్రం చేశాం.", + "watchlistedit-clear-jobqueue": "మీ వీక్షణ జాబితాను తుడిచేస్తున్నాం. దీనికి కాస్త సమయం పట్టొచ్చు!", "watchlistedit-clear-removed": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} తీసివేశాం:", "watchlistedit-too-many": "ఇక్కడ చూపించలేనన్ని పేజీలున్నాయి.", "watchlisttools-clear": "వీక్షణజాబితాను శుభ్రం చేయి", @@ -3226,6 +3243,8 @@ "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|చర్చ]])", "timezone-local": "స్థానిక", "duplicate-defaultsort": "హెచ్చరిక: డిఫాల్టు పేర్చు కీ \"$2\", గత డిఫాల్టు పేర్చు కీ \"$1\" ని అతిక్రమిస్తుంది.", + "duplicate-displaytitle": "హెచ్చరిక: ఈ \"కనబడే శీర్షిక\" \"$2\", ఇదివరకటి \"కనబడే శీర్షిక\" \"$1\" ను తిరగరాస్తుంది.", + "restricted-displaytitle": "హెచ్చరిక: కనబడే శీర్షిక \"$1\" ను పక్కన పెట్టేసాం. ఎందుకంటే పేజీ అసలు శీర్షికతో సరిపోలి లేదు.", "invalid-indicator-name": "లోపం: పేజీ స్థితి సూచిక పేరు విశేషణం ఖాళీగా ఉండరాదు.", "version": "సంచిక", "version-extensions": "స్థాపించిన పొడగింతలు", @@ -3317,13 +3336,17 @@ "tag-mw-contentmodelchange-description": "పేజీ [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel కంటెంటు మోడలును మార్చేసే] దిద్దుబాట్లు", "tag-mw-new-redirect": "కొత్త దారిమార్పు", "tag-mw-new-redirect-description": "కొత్త దారిమార్పును సృష్టించే లేదా ఓ పేజీని దారిమార్పుగా మార్చేసే దిద్దుబాట్లు", + "tag-mw-removed-redirect": "దారిమార్పును తీసేసారు", "tag-mw-removed-redirect-description": "ఓ దారిమార్పును దారిమార్పు-కానిది గా మార్చే దిద్దుబాట్లు", "tag-mw-changed-redirect-target": "దారిమార్పు లక్ష్యాన్ని మార్చారు", "tag-mw-changed-redirect-target-description": "దారిమార్పు లక్ష్యాన్ని మార్చే దిద్దుబాట్లు", "tag-mw-blank": "తుడిచివేత", "tag-mw-blank-description": "పేజీని తుడిచివేసే దిద్దుబాట్లు", + "tag-mw-replace": "మార్చేసారు", "tag-mw-replace-description": "పేజీలోని పాఠ్యంలో 90% కి పైగా తీసివేసే దిద్దుబాట్లు", - "tags-title": "టాగులు", + "tag-mw-rollback": "రోల్‌బ్యాక్", + "tag-mw-rollback-description": "వెనక్కితిప్పు లింకు ద్వారా మునుపటి దిద్దుబాట్లను రద్దు చేసే దిద్దుబాట్లు", + "tags-title": "ట్యాగులు", "tags-intro": "మార్పుచేర్పులకు సాఫ్టువేరు ఇచ్చే ట్యాగులను, వాటి అర్ధాలనూ ఈ పేజీ చూపిస్తుంది.", "tags-tag": "ట్యాగు పేరు", "tags-display-header": "మార్పుల జాబితాలో కనపించు రీతి", @@ -3341,6 +3364,7 @@ "tags-hitcount": "$1 {{PLURAL:$1|మార్పు|మార్పులు}}", "tags-manage-no-permission": "ట్యాగులను నిర్వహించడానికి మీకు అనుమతి లేదు.", "tags-create-heading": "కొత్త ట్యాగును సృష్టించు", + "tags-create-explanation": "డిఫాల్టుగా, కొత్తగా సృష్టించిన ట్యాగులు, వాడుకరులు బాట్‌లూ వాడుకునేందుకు వెంటనే అందుబాటులోకి వస్తాయి.", "tags-create-tag-name": "ట్యాగు పేరు:", "tags-create-reason": "కారణం:", "tags-create-submit": "సృష్టించు", @@ -3607,6 +3631,8 @@ "default-skin-not-found-row-disabled": "* $1 / $2 (అచేతనం)", "mediastatistics": "మాధ్యమ గణాంకాలు", "mediastatistics-nbytes": "{{PLURAL:$1|$1 బైటు|$1 బైట్లు}} ($2; $3%)", + "mediastatistics-bytespertype": "ఈ విభాగంలో మొత్తం దస్త్రాల పరిమాణం: {{PLURAL:$1|$1 బైటు|$1 బైట్లు}} ($2; $3%).", + "mediastatistics-allbytes": "మొత్తం దస్త్రాలన్నింటి మొత్తం పరిమాణం: {{PLURAL:$1|$1 బైటు|$1 బైట్లు}} ($2).", "mediastatistics-table-mimetype": "MIME రకం", "mediastatistics-table-extensions": "సంభావ్యత గల పొడిగింతలు", "mediastatistics-table-count": "దస్త్రాల సంఖ్య", @@ -3646,6 +3672,7 @@ "special-characters-group-thai": "థాయి", "special-characters-group-lao": "లావో", "special-characters-group-khmer": "ఖ్మెర్", + "special-characters-group-canadianaboriginal": "కెనడియన్ ఎబొరిజినల్", "special-characters-title-endash": "ఎన్ డాష్", "special-characters-title-emdash": "ఎమ్ డాష్", "special-characters-title-minus": "మైనస్ గుర్తు", @@ -3662,7 +3689,10 @@ "sessionprovider-mediawiki-session-cookiesessionprovider": "కూకీ-ఆధారిత సెషన్లు", "log-action-filter-block": "నిరోధపు రకం:", "log-action-filter-delete": "తొలగింపు రకం:", + "log-action-filter-import": "Type of import:", + "log-action-filter-managetags": "Type of tag management action:", "log-action-filter-move": "తరలింపు రకం:", + "log-action-filter-newusers": "Type of account creation:", "log-action-filter-all": "అన్నీ", "log-action-filter-managetags-create": "ట్యాగు సృష్టి", "log-action-filter-managetags-delete": "ట్యాగు తొలగింపు", diff --git a/languages/i18n/tg-cyrl.json b/languages/i18n/tg-cyrl.json index 5a70fa64f5..e41b212e17 100644 --- a/languages/i18n/tg-cyrl.json +++ b/languages/i18n/tg-cyrl.json @@ -471,8 +471,9 @@ "minoredit": "Ин вироиши хурд аст", "watchthis": "Назар кардани ин саҳифа", "savearticle": "Саҳифа захира шавад", + "savechanges": "Захира кардан", "preview": "Пешнамоиш", - "showpreview": "Пеш намоиш", + "showpreview": "Пешнамоиш", "showdiff": "Намоиши тағйирот", "anoneditwarning": "'''Огоҳӣ:''' Шумо вуруд накардаед. Агар ягон вироиши кунед нишонаи IP Шумо ба ҳама намоён хоҳад буд. Агар Шумо [$1 ворид шавед] ё [$2 ҳисоберо эҷод кунед], вироишоти Шумо ба номи корбариатон ҳамроҳ бо дигар бартариҳо муталиқ хоҳад шуд.", "anonpreviewwarning": "Шумо вориди нашудаед. Захиракунӣ IP нишонаи шуморо дар таърихи вироиши ин саҳифа захира хоҳад кард.", diff --git a/languages/i18n/tr.json b/languages/i18n/tr.json index 84e047dd4a..0616922d24 100644 --- a/languages/i18n/tr.json +++ b/languages/i18n/tr.json @@ -99,7 +99,8 @@ "Botansahin", "Catrope", "Hedda", - "Fitoschido" + "Fitoschido", + "TmY e12" ] }, "tog-underline": "Bağlantıların altını çizme:", @@ -222,7 +223,7 @@ "subcategories": "Alt kategoriler", "category-media-header": "\"$1\" kategorisindeki ortam dosyaları", "category-empty": "Şu anda bu kategoride herhangi bir sayfa ya da ortam dosyası bulunmuyor.", - "hidden-categories": "{{PLURAL:$1|Gizli kategori|Gizli kategori}}", + "hidden-categories": "{{PLURAL:$1|Gizli kategori|Gizli kategoriler}}", "hidden-category-category": "Gizli kategoriler", "category-subcat-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki $1 alt kategori dâhil toplam $2 alt kategori vardır.}}", "category-subcat-count-limited": "Bu kategori aşağıdaki $1 alt kategoriye sahiptir.", @@ -699,7 +700,7 @@ "hr_tip": "Yatay çizgi (çok sık kullanmayın)", "summary": "Özet:", "subject": "Konu:", - "minoredit": "Bu küçük bir değişiklik", + "minoredit": "Bu bir küçük değişiklik", "watchthis": "Bu sayfayı izle", "savearticle": "Sayfayı kaydet", "savechanges": "Değişiklikleri kaydet", @@ -1022,7 +1023,7 @@ "searchmenu-exists": "'''Bu vikide \"[[:$1]]\" adında bir sayfa mevcut'''", "searchmenu-new": "\"[[:$1]]\" sayfasını oluşturabilirsiniz! {{PLURAL:$2|0=|Ayrıca aramanız sonucunda bulunan sayfayı görüntüleyebilirsiniz.|Ayrıca bulunan arama sonuçlarını görüntüleyebilirsiniz.}}", "searchprofile-articles": "İçerik sayfaları", - "searchprofile-images": "Çokluortam", + "searchprofile-images": "Çoklu ortam", "searchprofile-everything": "Her şey", "searchprofile-advanced": "Gelişmiş", "searchprofile-articles-tooltip": "$1 içinde ara", @@ -1211,6 +1212,7 @@ "group-autoconfirmed": "Otomatik onaylanmış kullanıcılar", "group-bot": "Botlar", "group-sysop": "Hizmetliler", + "group-interface-admin": "Arayüz yöneticisi", "group-bureaucrat": "Bürokratlar", "group-suppress": "Gözetmenler", "group-all": "(hepsi)", @@ -1218,12 +1220,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|otomatik onaylanmış kullanıcı}}", "group-bot-member": "{{GENDER:$1|bot}}", "group-sysop-member": "{{GENDER:$1|hizmetli}}", + "group-interface-admin-member": "arayüz yöneticisi", "group-bureaucrat-member": "{{GENDER:$1|bürokrat}}", "group-suppress-member": "{{GENDER:$1|gözetmen}}", "grouppage-user": "{{ns:project}}:Kullanıcılar", "grouppage-autoconfirmed": "{{ns:project}}:Otomatik onaylanmış kullanıcılar", "grouppage-bot": "{{ns:project}}:Botlar", "grouppage-sysop": "{{ns:project}}:Hizmetliler", + "grouppage-interface-admin": "Project:Arayüz yöneticileri", "grouppage-bureaucrat": "{{ns:project}}:Bürokratlar", "grouppage-suppress": "{{ns:project}}:Gözetmen", "right-read": "Sayfaları oku", @@ -1274,6 +1278,9 @@ "right-editusercss": "Diğer kullanıcıların CSS dosyalarında değişiklik yap", "right-edituserjson": "Diğer kullanıcıların JSON dosyalarını düzenle", "right-edituserjs": "Diğer kullanıcıların JS dosyalarında değişiklik yap", + "right-editsitecss": "Sitewide CSS düzenle", + "right-editsitejson": "Sitewide JSON'u düzenle", + "right-editsitejs": "Sitewide JavaScript'i düzenle", "right-editmyusercss": "Kendi kullanıcı CSS dosyaları düzenle", "right-editmyuserjson": "Kendi kullanıcı JSON dosyalarını düzenle", "right-editmyuserjs": "Kendi kullanıcı JavaScript dosyalarını düzenle", @@ -1398,7 +1405,7 @@ "recentchanges-notargetpage": "Bu sayfa ile ilgili değişiklikleri görmek için yukarıdaya bir sayfa adı girin.", "recentchanges-feed-description": "Bu beslemede, viki'de yapılan en son değişiklikleri takip edin.", "recentchanges-label-newpage": "Bu değişiklikle yeni bir sayfa oluşturuldu", - "recentchanges-label-minor": "Bu küçük bir değişiklik", + "recentchanges-label-minor": "Bu bir küçük değişiklik", "recentchanges-label-bot": "Bu değişiklik bir bot tarafından yapıldı", "recentchanges-label-unpatrolled": "Bu değişiklik henüz gözlenmemiş", "recentchanges-label-plusminus": "Sayfa boyutundaki değişikliğin bayt bazında değeri", @@ -1522,8 +1529,10 @@ "rcfilters-watchlist-markseen-button": "Tüm değişiklikleri görüldü olarak işaretle", "rcfilters-watchlist-edit-watchlist-button": "Ä°zlenen sayfaların listesini düzenle", "rcfilters-watchlist-showupdated": "Gerçekleştirilen değişikliklerden bu yana ziyaret etmediğiniz sayfalarda yapılan değişiklikler koyu renktedir.", - "rcfilters-preference-label": "Son Değişikliklerin geliştirilmiş sürümünü gizle", - "rcfilters-watchlist-preference-label": "Ä°zleme Listesinin geliştirilmiş sürümünü gizle", + "rcfilters-preference-label": "Son değişikliklerin geliştirilmiş sürümünü gizle", + "rcfilters-preference-help": "2017 arayüz tasarımını ve bu andan sonra eklenen tüm araçları geri alır.", + "rcfilters-watchlist-preference-label": "Ä°zleme listesinin geliştirilmiş sürümünü gizle", + "rcfilters-watchlist-preference-help": "2017 arayüz tasarımını ve bu andan sonra eklenen tüm araçları geri alır.", "rcfilters-target-page-placeholder": "Bir sayfa (ya da kategori) adı girin", "rcnotefrom": "$3, $4 tarihinden itibaren yapılan {{PLURAL:$5|değişiklik|değişiklik}} aşağıdadır ($1 tarhine kadar olanlar gösterilmektedir).", "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster", @@ -1633,7 +1642,7 @@ "uploadwarning": "Yükleme uyarısı", "uploadwarning-text": "Lütfen aşağıdaki dosya açıklamasını değiştirin ve tekrar deneyin.", "savefile": "Dosyayı kaydet", - "uploaddisabled": "Geçici olarak şu anda herhangi bir dosya yüklenmez. Biraz sonra bir daha deneyiniz.", + "uploaddisabled": "Geçici olarak şu anda bu wiki'ye herhangi bir dosya yüklenemez. Lütfen daha sonra bir daha deneyiniz.", "copyuploaddisabled": "URL ile yükleme devre dışı.", "uploaddisabledtext": "Dosya yüklemeleri devredışı bırakılmıştır.", "php-uploaddisabledtext": "PHP dosyası yüklemeleri devre dışıdır. Lütfen file_uploads ayarını kontrol edin.", @@ -2178,7 +2187,7 @@ "enotif_lastdiff": "Bu değişikliği görmek için, $1 sayfasına bakınız.", "enotif_anon_editor": "anonim kullanıcı $1", "enotif_body": "Sayın $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditörün girdiği özet: $PAGESUMMARY $PAGEMINOREDIT\n\nEditörün iletişim bilgileri:\ne-posta: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nBahsi geçen sayfayı oturum açarak ziyaret edinceye kadar sayfayla ilgili başka bildirim gönderilmeyecektir. Ayrıca izleme listenizdeki tüm sayfaların bildirim durumlarını sıfırlayabilirsiniz.\n\n{{SITENAME}} bildirim sistemi\n\n--\nE-posta bildirim ayarlarınızı değiştirmek için aşağıdaki sayfayı ziyaret ediniz:\n{{canonicalurl:{{#special:Preferences}}}}\n\nÄ°zleme listesi ayarlarınızı değiştirmek için aşağıdaki sayfayı ziyaret ediniz:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nSayfayı izleme listenizden silmek için aşağıdaki sayfayı ziyaret ediniz:\n$UNWATCHURL\n\nGeri bildirim ve daha fazla yardım için:\n$HELPPAGE", - "enotif_minoredit": "Bu küçük bir değişiklik", + "enotif_minoredit": "Bu bir küçük değişiklik", "created": "oluşturuldu", "changed": "değiştirildi", "deletepage": "Sayfayı sil", diff --git a/languages/i18n/tt-cyrl.json b/languages/i18n/tt-cyrl.json index ea93a9faab..f873f83e07 100644 --- a/languages/i18n/tt-cyrl.json +++ b/languages/i18n/tt-cyrl.json @@ -150,7 +150,7 @@ "category_header": "«$1» төркемендәге битләр", "subcategories": "Төркемчәләр", "category-media-header": "«$1» төркемендәге файллар", - "category-empty": "''Бу төркем әлегә буш.''", + "category-empty": "Бу төркем әлегә буш.", "hidden-categories": "{{PLURAL:$1|1=Яшерен төркем|Яшерен төркемнәр}}", "hidden-category-category": "Яшерен төркемнәр", "category-subcat-count": "{{PLURAL:$2|1=Әлеге төркем бары тик бу астөркемне генә үз өченә ала.|Әлеге төркемдә $2 астөркемдән бары тик $1 {{PLURAL:$1|астөркем}} генә күрсәтелгән.}}", @@ -224,7 +224,7 @@ "viewtalkpage": "Бәхәс битен карау", "otherlanguages": "Башка телләрдә", "redirectedfrom": "($1 битеннән юнәлтелде)", - "redirectpagesub": "Башка биткә юнәлтү бите", + "redirectpagesub": "Юнәлтү бите", "redirectto": "Шунда юнәлтелә:", "lastmodifiedat": "Бу бит соңгы тапкыр $2 $1 үзгәртелә.", "viewcount": "Бу биткә $1 {{PLURAL:$1|бер тапкыр|$1 тапкыр}} мөрәҗәгать иттеләр.", @@ -444,7 +444,7 @@ "password-login-forbidden": "Бу кулланучы исемен һәм серсүзне куллану тыелган", "mailmypassword": "Серсүзне бетерү", "passwordremindertitle": "{{SITENAME}} кулланучысына вакытлы серсүз тапшыру", - "passwordremindertext": "Кемдер (бәлки, сездер, IP адресы: $1) {{grammar:genitive|{{SITENAME}}}} ($4) өчен яңа серсүз соратты. $2 кулланучысы өчен яңа вакытлыча серсүз: $3. Әгәр бу сез булган булсагыз, системага керегез һәм яңа серсүз сайлагыз. Сезнең вакытлыча серсүз гамәлдә $5 {{PLURAL:$5|көн}} булачак.\n\nӘгәр сез серсүзне алмаштыруны сорамаган булсагыз яки, оныткан очракта, исегезгә төшергән булсагыз, бу хәбәргә игътибар бирмичә, иске серсүзегезне куллануны дәвам итегез.", + "passwordremindertext": "Кемдер ($1 IP адресылы) {{grammar:genitive|{{SITENAME}}}} ($4) өчен яңа серсүз соратты. $2 кулланучысы өчен яңа вакытлыча серсүз: $3. Әгәр бу сез булган булсагыз, системага керегез һәм яңа серсүз сайлагыз. Сезнең вакытлыча серсүз гамәлдә $5 {{PLURAL:$5|көн}} булачак.\n\nӘгәр сез серсүзне алмаштыруны сорамаган булсагыз яки, оныткан очракта, исегезгә төшергән булсагыз, бу хәбәргә игътибар бирмичә, иске серсүзегезне куллануны дәвам итегез.", "noemail": "$1 исемле кулланучы өчен электрон почта адресы язылмаган.", "noemailcreate": "Сез дөрес e-mail адресы күрсәтергә тиеш", "passwordsent": "Яңа серсүз $1 исемле кулланучының электрон почта адресына җибәрелде.\n\nЗинһар, серсүзне алгач, системага яңадан керегез.", @@ -566,7 +566,7 @@ "subject-preview": "Башисемне алдан карау:", "blockedtitle": "Кулланучы тыелды", "blockedtext": "Сезнең хисап язмагыз яки IP адресыгыз тыелган.\n\nТыючы идарәче: $1.\nКүрсәтелгән сәбәп: $2.\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны [[Special:Preferences|көйләнмәләрдә]] дәлилләмәгән булсагыз, сез бирелгән «{{int:emailuser}}» мөмкинчелекне куллана алмаячаксыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресыгыз — $3, тыю таныклыгы — $5.\nЗинһар, хатларда бу мәгълүматны күрсәтергә онытмагыз.", - "autoblockedtext": "Сезнең IP адресыгыз, аның тыелган кулланучы тарафыннан кулланылуы сәбәпле, автомат рәвештә тыелды.\nУл кулланучыны тыючы идарәче: $1. Күрсәтелгән сәбәп:\n\n:''$2''\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны дәлилләмәгән булсагыз ([[Special:Preferences|дәлилләү өчен шәхси көйләүләр монда]]), идарәчегә хат җибәрә алмыйсыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресы — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.", + "autoblockedtext": "Сезнең IP адресыгыз, аның тыелган кулланучы тарафыннан кулланылуы сәбәпле, автомат рәвештә тыелды.\nУл кулланучыны тыючы идарәче: $1. Күрсәтелгән сәбәп:\n\n:$2\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\n\nИсегездә тотыгыз: әгәр сез [[Special:Preferences|көйләнмәләрдә]] электрон почта адресыгызны күрсәтмәгән яки дәлилләмәгән булсагыз, шулай ук сез блокта булсагыз хат җибәреп булмаячак һәм сез \"{{int:emailuser}}\" мөмкинлеген куллана алмаячаксыз.\n\nСезнең IP адрес — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.", "blockednoreason": "сәбәп күрсәтелмәгән", "whitelistedittext": "Сез битләрне үзгәртү өчен $1 тиеш.", "confirmedittext": "Битләрне үзгәртү алдыннан сез электрон почта адресыгызны дәлилләргә тиеш.\nСез моны [[Special:Preferences|көйләүләр битендә]] башкара аласыз.", @@ -592,7 +592,7 @@ "userjspreview": "'''Бу бары тик JavaScript файлын алдан карау гына, ул әле сакланмаган!'''", "sitecsspreview": "'''онытмагыз, бу бары тик CSS-файлны алдан карау гына.'''\n'''Ул әле сакланмаган!'''", "sitejspreview": "'''Бу бары тик JavaScript файлын алдан карау гына.'''\n'''Ул әле сакланмаган!'''", - "userinvalidconfigtitle": "'''Игътибар:''' \"$1\" бизәү темасы табылмады. Кулланучының .css һәм .js битләре исемнәре бары тик кечкенә (юл) хәрефләрдән генә торырга тиеш икәнен онытмагыз. Мисалга: {{ns:user}}:Foo/vector.css, ә {{ns:user}}:Foo/Vector.css түгел!", + "userinvalidconfigtitle": "Игътибар: \"$1\" бизәү темасы табылмады. Кулланучының .css, .json һәм .js битләре исемнәре бары тик кечкенә (юл) хәрефләрдән генә торырга тиеш икәнен онытмагыз. Мисалга: {{ns:user}}:Foo/vector.css, ә {{ns:user}}:Foo/Vector.css түгел!", "updated": "(Яңартылды)", "note": "'''Искәрмә:'''", "previewnote": "Исегездә тотыгыз, бу алдан карау гына.\nТәзәтмәләрегез әлегә сакланмаган!", @@ -617,8 +617,8 @@ "longpageerror": "ХАТА: сакланучы текст зурлыгы - $1 {{PLURAL:$1|килобайт}}, бу $2 {{PLURAL:$2|килобайт}} чигеннән күбрәк. Бит саклана алмый.", "readonlywarning": "Кисәтү: мәгълүматлар базасында техник эшләр башкарыла, сезнең үзгәртүләр хәзер үк саклана алмый.\nБез сезгә әлеге текстны, югалмас өчен, берәр файлга сакларга тәкъдим итәбез.\n\nМәгълүматлар базасын япкан идарәче күрсәткән сәбәп: $1", "protectedpagewarning": "'''Кисәтү: сез бу битне үзгәртә алмыйсыз, бу хокукка идарәчеләр гына ия.'''\nТүбәндә көндәлекнең соңгы язуы бирелгән:", - "semiprotectedpagewarning": "'''Кисәтү:''' бу бит якланган. Аны теркәлгән кулланучылар гына үзгәртә ала.\nАста бу битне күзәтү көндәлеге бирелгән:", - "cascadeprotectedwarning": "Кисәтү: Бу битне идарәчеләр гына үзгәртә ала., чөнки бит {{PLURAL:$1|каскадлы яклау исемлегенә кертелгән}}:", + "semiprotectedpagewarning": "Кисәтү: бу бит якланган. Аны авторасланган кулланучылар гына үзгәртә ала.\nАста бу битнең күзәтү көндәлегендә булган соңгы язмасы бирелгән:", + "cascadeprotectedwarning": "Кисәтү: Бу бит якланган һәм аны бары [[Special:ListGroupRights|махсус вәкаләтләре]] булган кулланучылар гына үзгәртә ала, чөнки бит {{PLURAL:$1|каскадлы яклау исемлегенә кертелгән}}:", "titleprotectedwarning": "'''Кисәтү: Мондый исемле бит якланган, аны үзгәртү өчен [[Special:ListGroupRights|тиешле хокукка]] ия булу зарур.'''\nАста күзәтү көндәлегендәге соңгы язма бирелгән:", "templatesused": "Бу биттә кулланылган {{PLURAL:$1|1=калып|калыплар}} :", "templatesusedpreview": "Алдан карау мөмкинлегендә кулланылган {{PLURAL:$1|1=калып|калыплар}}:", @@ -762,6 +762,7 @@ "diff-multi-otherusers": "({{PLURAL:$2|Башка бер кулланучының|$2 кулланучының}} {{PLURAL:$1|бер арадаш юрамасы|$1 арадаш юрамасы}} күрсәтелмәгән)", "diff-multi-manyusers": "($2 күбрәк {{PLURAL:$2|кулланучының|кулланучының}} {{PLURAL:$1|Бер арадаш юрамасы|$1 арадаш юрамасы}} күрсәтелмәгән)", "searchresults": "Эзләү нәтиҗәләре", + "search-filter-title-prefix-reset": "Барлык битләрне эзләү", "searchresults-title": "«$1» өчен эзләү нәтиҗәләре", "titlematches": "Бит исемнәрендә тиңдәшлек", "textmatches": "Бит эчтәлегендә тиңдәшлек", @@ -791,6 +792,7 @@ "search-category": "($1 категориясе)", "search-file-match": "(файл эчтәлеге белән туры килә)", "search-suggest": "Бәлки, сез моны эзлисез: $1", + "search-rewritten": "$1 нәтижәсе күрсәтелгән. $2 урынына эзләргә.", "search-interwiki-caption": "Тугандаш проектлар нәтиҗәсе", "search-interwiki-default": "$1 нәтиҗә:", "search-interwiki-more": "(тагын)", @@ -828,15 +830,15 @@ "prefs-editwatchlist-clear": "Күзәтү исемлеген чистарту", "prefs-watchlist-days": "Күзәтү исемлегендә күрсәтелгән көннәр саны:", "prefs-watchlist-days-max": "Иң күбе $1 {{PLURAL:$1|1=көн|көн}}", - "prefs-watchlist-edits": "Киңәйтелгән күзәтү исемлегендә күрсәтелүче төзәтмәләрнең максималь саны:", - "prefs-watchlist-edits-max": "Максимум сан: 1000", + "prefs-watchlist-edits": "Күзәтү исемлегендә күрсәтелүче төзәтмәләрнең максималь саны:", + "prefs-watchlist-edits-max": "Иң күбе: 1000", "prefs-watchlist-token": "Күзәтү исемлеге токены:", "prefs-watchlist-managetokens": "Токеннар беләр идарә итү", "prefs-misc": "Башка көйләнмәләр", "prefs-resetpass": "Серсүзне үзгәртү", "prefs-changeemail": "Электрон әрҗә адресын үзгәртү яисә бетерү", "prefs-setemail": "Электрон почта адресын көйләү", - "prefs-email": "E-mail көйләнмәләре", + "prefs-email": "Электрон почта көйләнмәләре", "prefs-rendering": "Күренеш", "saveprefs": "Саклау", "restoreprefs": "Башлангыч көйләнмәләрне кире кайтару", @@ -847,8 +849,8 @@ "stub-threshold-disabled": "Сүнгән", "recentchangesdays": "Соңгы үзгәртүләрне күрсәтүче көннәр саны:", "recentchangesdays-max": "(иң күбе $1 {{PLURAL:$1|көн}})", - "recentchangescount": "Төп буларак кулланучы үзгәртүләр саны:", - "prefs-help-recentchangescount": "Максимум сан: 1000", + "recentchangescount": "Төп буларак кулланучы соңгы үзгәртүләр исемелегендә, тарихта һәм көндәлектә булган үзгәртүләр саны:", + "prefs-help-recentchangescount": "Иң күбе: 1000", "prefs-help-watchlist-token2": "Бу сезнең кузәтү исемлеге өчен ясалган веб-агымының серле ачкычы.\nАны белгән һәркем сезнең күзәтү исемлегегезне карый ала, шуңа да башкаларга аны күрсәтмәгез. [[Special:ResetTokens|Ачкычны ташларга теләсәгез, әлеге юрамага басыгыз]].", "savedprefs": "Көйләнмәләрегез сакланды.", "timezonelegend": "Сәгать поясы:", @@ -868,6 +870,8 @@ "timezoneregion-indian": "Һинд океаны", "timezoneregion-pacific": "Тын океан", "allowemail": "Башка кулланучыларга миңа хатлар язарга рөхсәт итү", + "email-allow-new-users-label": "Яңа кулланучылардан да электрон хатлар алуны рөхсәт итү", + "email-blacklist-label": "Әлеге кулланучыларга минем электрон почтага хат җибәрүне тыярга:", "prefs-searchoptions": "Эзләү", "prefs-namespaces": "Исемнәр мәйданы", "default": "килешү буенча", @@ -912,6 +916,7 @@ "prefs-editor": "Мөхәррир", "prefs-preview": "Алдан карау", "prefs-advancedrc": "Киңәйтелгән көйләүләр", + "prefs-opt-out": "Яхшыртулардан баш тарту", "prefs-advancedrendering": "Киңәйтелгән көйләүләр", "prefs-advancedsearchoptions": "Киңәйтелгән көйләүләр", "prefs-advancedwatchlist": "Киңәйтелгән көйләүләр", @@ -935,9 +940,13 @@ "userrights-changeable-col": "Сезнең тарафтан үзгәртелми торган төркемнәр", "userrights-unchangeable-col": "Сезнең тарафтан үзгәртелми торган төркемнәр", "userrights-irreversible-marker": "$1*", + "userrights-expiry-current": "$1 тәмамлана", + "userrights-expiry-none": "Чикләүсез", "userrights-expiry": "Бетә:", + "userrights-expiry-existing": "Хәзерге тәмамлану вакыты: $2 $3", "userrights-expiry-othertime": "Башка вакыт:", "userrights-expiry-options": "1 көн:1 day,1 атна:1 week,1 ай:1 month,3 ай:3 months,6 ай:6 months,1 ел:1 year", + "userrights-invalid-expiry": "«$1» төркеме өчен тәмамлану вакыты дөрес күрсәтеләгән.", "userrights-conflict": "Кулланучы хокукларын үзгәртү конфликты! Төзәтмәләрегезне тикшерегез, аннары кабатлагыз.", "group": "Төркем:", "group-user": "Кулланучылар", @@ -951,12 +960,14 @@ "group-autoconfirmed-member": "{{GENDER:$1|авторасланган кулланучы}}", "group-bot-member": "{{GENDER:$1|бот}}", "group-sysop-member": "{{GENDER:$1|идарәче}}", + "group-interface-admin-member": "{{GENDER:$1|интерфейс идарәчесе}}", "group-bureaucrat-member": "{{GENDER:$1|бюрократ}}", "group-suppress-member": "{{GENDER:$1|назир}}", "grouppage-user": "{{ns:project}}:Кулланучылар", "grouppage-autoconfirmed": "{{ns:project}}:Авторасланган кулланучылар", "grouppage-bot": "{{ns:project}}:Ботлар", "grouppage-sysop": "{{ns:project}}:Идарәчеләр", + "grouppage-interface-admin": "{{ns:project}}:Интерфейс идарәчесе", "grouppage-bureaucrat": "{{ns:project}}:Бюрократлар", "grouppage-suppress": "{{ns:project}}:Назирләр", "right-read": "Битләрне карау", @@ -977,6 +988,7 @@ "right-browsearchive": "Бетерелгән битләрне эзләү", "right-undelete": "Битләрне торгызу", "right-suppressionlog": "Шәхси журналларны карау", + "right-unblockself": "Үзеңне блоктан алу", "right-editinterface": "Кулланучы интерфейсын үзгәртү", "grant-group-email": "Хатлар җибәрү", "grant-uploadfile": "Яңа файллар йөкләү", @@ -1007,20 +1019,29 @@ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (шулай ук [[Special:NewPages|яңа битләр исемлеген]] карагыз)", "recentchanges-submit": "Күрсәт", "rcfilters-legend-heading": "Кыскартулар тезмәсе: ", + "rcfilters-group-results-by-page": "Нәтиҗәләрне биттә төркемләргә", "rcfilters-activefilters": "Актив фильтрлар", + "rcfilters-activefilters-hide": "Яшер", + "rcfilters-activefilters-show": "Күрсәт", "rcfilters-limit-title": "Күрсәтү өчен үзгәртүләр", + "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|үзгәртү}}, $2", + "rcfilters-date-popup-title": "Эзләү өчен вакыт аралыгы", "rcfilters-days-title": "Соңгы көннәр", "rcfilters-hours-title": "Соңгы сәгатьләр", "rcfilters-days-show-days": "$1 {{PLURAL:$1|көн}}", "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сәгать}}", "rcfilters-quickfilters": "Сакланган фильтрлар", "rcfilters-quickfilters-placeholder-title": "Әлегә сакланылган фильтрлар юк", + "rcfilters-savedqueries-rename": "Исемен үзгәртергә", "rcfilters-savedqueries-remove": "Бетерү", "rcfilters-savedqueries-new-name-label": "Исем", + "rcfilters-savedqueries-apply-label": "Фильтр кую", "rcfilters-savedqueries-cancel-label": "Баш тарту", "rcfilters-savedqueries-add-new-title": "Хәзерге фильтр көйләнмәләрен саклау", "rcfilters-clear-all-filters": "Барлык филтерләрне чистарту", "rcfilters-search-placeholder": "Фильтрланы соңгы үзгәртү (карау яисә кертүне башлау)", + "rcfilters-invalid-filter": "Яраксыз фильтр", + "rcfilters-filterlist-title": "Фильтрлар", "rcfilters-filterlist-feedbacklink": "Әлеге фильтрлау кораллары турында турында фикер калдырыгыз", "rcfilters-filtergroup-authorship": "Үзгәртүләрнең авторлыгы", "rcfilters-filter-editsbyself-label": "Сезнең үзгәртүләр", @@ -1031,6 +1052,7 @@ "rcfilters-filter-user-experience-level-unregistered-label": "Теркәлмәгәннәр", "rcfilters-filter-user-experience-level-unregistered-description": "Системага кермәгән мөхәррирләр.", "rcfilters-filter-user-experience-level-newcomer-label": "Яңа кулланучылар", + "rcfilters-filter-user-experience-level-learner-label": "Укучылар", "rcfilters-filter-user-experience-level-experienced-label": "Тәҗрибәле кулланучылар", "rcfilters-filter-user-experience-level-experienced-description": "Төзәтүләре 500 дән күбрәк һәм актив эш көннәре 30 дан артык теркәлгән мөхәррирләр", "rcfilters-filtergroup-automated": "Автоматлаштырылган кертем", @@ -1039,11 +1061,14 @@ "rcfilters-filter-humans-label": "Кеше (бот түгел)", "rcfilters-filter-humans-description": "Кешеләр ясаган үзгәртүләр.", "rcfilters-filtergroup-reviewstatus": "Тикшерү статусы", + "rcfilters-filter-reviewstatus-auto-label": "Автотикшеренүчеләр", + "rcfilters-filtergroup-significance": "Мәгънәсе", "rcfilters-filter-minor-label": "Кече үзгәртүләр", "rcfilters-filter-minor-description": "«Кече үзгәртү» дип тамгаланган үзгәртүләр", "rcfilters-filter-major-label": "Гади үзгәртүләр", "rcfilters-filter-major-description": "«Кече» дип тамгаланмаган үзгәртүләр", "rcfilters-filtergroup-watchlist": "Күзәтү исемлегегездәге битләр", + "rcfilters-filter-watchlist-watched-label": "Күзәтү исемлегендә", "rcfilters-filtergroup-changetype": "Үзгәртү төре", "rcfilters-filter-pageedits-label": "Бит үзгәртүләре", "rcfilters-filter-newpages-label": "Бит төзүләре", @@ -1059,6 +1084,7 @@ "rcfilters-liveupdates-button": "Автоматик яңарту", "rcfilters-watchlist-markseen-button": "Бар үзгәртүләрне каралган дип билгеләргә", "rcfilters-watchlist-edit-watchlist-button": "Күзәтү исемлегегезне үзгәртү", + "rcfilters-preference-label": "«Соңгы үзгәртүләр» битенең яңа юрамасын яшерү", "rcnotefrom": "Астарак $3, $4 өчен {{PLURAL:$5|үзгәртүләр күрсәтелгән}} ($1 артык түгел).", "rclistfrom": "$3 $2 башлап яңа үзгәртүләрне күрсәт", "rcshowhideminor": "кече үзгәртүләрне $1", @@ -1082,7 +1108,7 @@ "rcshowhidecategorization": "битләрне төркемләүне $1", "rcshowhidecategorization-show": "Күрсәт", "rcshowhidecategorization-hide": "Яшер", - "rclinks": "Соңгы $2 көн эчендә ясалган $1 үзгәртүне күрсәт", + "rclinks": "Соңгы $2 көндә ясалган $1 үзгәртүне күрсәтергә", "diff": "аерма", "hist": "тарих", "hide": "Яшер", @@ -1158,6 +1184,9 @@ "filewasdeleted": "Мондый исемле файл бетерелгән булган инде. Зинһар,яңадан йөкләү алдыннан $1 карагыз", "filename-bad-prefix": "Файлның исеме '''«$1»''' дип башлана. Зинһар, файлны тасвирлаучы исем бирегез.", "filename-prefix-blacklist": " #
    \n# Синтаксис төбәндәгечә:\n#   *  «#» дип башланган барлык нәрсә дә комментарий дип аталачак\n#   * Һәрбер буш рәт — файлның исеменең префиксы, цифрлы камера бирүче исем\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # кайсыбер кәрәзле телефоннар\nIMG # барлык\nJD # Jenoptik\nMGP # Pentax\nPICT # төрле\n #
    ", + "upload-proto-error": "Протокол дөрес түгел", + "upload-file-error": "Эчке хата", + "upload-misc-error": "Билгесез йөкләү хатасы", "upload-dialog-title": "Файл йөкләү", "upload-dialog-button-cancel": "Баш тарту", "upload-dialog-button-back": "Артка", @@ -1198,7 +1227,7 @@ "listfiles-summary": "Әлеге махсус бит Сез йөкләгән бөтен файлларны күрсәтә.", "listfiles_search_for": "Файл исеме буенча эзләү:", "imgfile": "файл", - "listfiles": "Сүрәтләр исемлеге", + "listfiles": "Файллар исемлеге", "listfiles_thumb": "Миниатюра", "listfiles_date": "Вакыт", "listfiles_name": "Файл исеме", @@ -1225,9 +1254,9 @@ "filehist-filesize": "Файлның зурлыгы", "filehist-comment": "Искәрмә", "imagelinks": "Файлны куллану", - "linkstoimage": "{{PLURAL:$1|Киләсе $1 бит|Киләсе $1 битләр|}} әлеге файлга сылтама ясый:", - "linkstoimage-more": "Бу файлга кимендә $1 {{PLURAL:$1|бит}} сылтама ясый.\nӘлеге исемлектә бу файлга {{PLURAL:$1| $1 сылтама}} китерелгән.\nШулай ук [[Special:WhatLinksHere/$2|тулы исемлекне]] дә карарга мөмкин.", - "nolinkstoimage": "Бу файлга сылтаган битләр юк.", + "linkstoimage": "{{PLURAL:$1|Киләсе бит|Киләсе $1 бит}} әлеге файлны куллана:", + "linkstoimage-more": "Бу файлны кимендә $1 {{PLURAL:$1|бит}} куллана.\nӘлеге исемлектә бу файлны кулланган {{PLURAL:$1| $1 бит}} күрсәтелгән.\nШулай ук [[Special:WhatLinksHere/$2|тулы исемлекне]] дә карарга мөмкин.", + "nolinkstoimage": "Бу файлны кулланган битләр юк.", "linkstoimage-redirect": "$1 (файл юнәлтүе) $2", "duplicatesoffile": "{{PLURAL:$1|Әлеге $1 файл }} астагы файлның күчерелмәсе булып тора ([[Special:FileDuplicateSearch/$2|тулырак]]):", "sharedupload": "Бу файл $1 проектыннан һәм башка проектларда кулланырга мөмкин", @@ -1413,7 +1442,7 @@ "trackingcategories": "Күзәтелүче төркемнәр", "trackingcategories-msg": "Күзәтүче төркем", "trackingcategories-name": "Хат исеме", - "emailuser": "Бу кулланучыга хат", + "emailuser": "Кулланучыга хат", "emailuser-title-target": "{{GENDER:$1|Кулланучыга}} электрон хат язу", "emailuser-title-notarget": "Кулланучыга хат җибәрү", "emailpagetext": "Әлеге форма ярдәмендә {{GENDER:$1|кулланучының}} электрон почта адресына хат җибәрергә мөмкин. Җибәрелгән адрес исемендә Сезнең [[Special:Preferences|көйләнмәләрдә]] күрсәтелгән адресыгыз күрсәтеләчәк, шуның ярдәмендә Сез ул кулланучы белән турыдан-туры сөйләшә аласыз.", @@ -2071,7 +2100,7 @@ "pipe-separator": " | ", "quotation-marks": "«$1»", "imgmultipageprev": "← алдагы бит", - "imgmultipagenext": "алдагы бит →", + "imgmultipagenext": "киләсе бит →", "imgmultigo": "Күчү!", "imgmultigoto": "$1 битенә күчү", "img-lang-go": "Башкару", @@ -2166,6 +2195,7 @@ "tags-deactivate": "сүндерү", "tags-hitcount": "$1 {{PLURAL:$1|үзгәртү}}", "tags-create-submit": "Төзү", + "tags-deactivate-submit": "Өзергә", "comparepages": "Битләрне чагыштыру", "compare-page1": "Беренче сәхифә", "compare-page2": "Икенче сәхифә", diff --git a/languages/i18n/uk.json b/languages/i18n/uk.json index bd8a3fb58e..b5d8c64fc3 100644 --- a/languages/i18n/uk.json +++ b/languages/i18n/uk.json @@ -1204,7 +1204,7 @@ "group-autoconfirmed-member": "{{GENDER:$1|автопідтверджений користувач|автопідтверджена користувачка}}", "group-bot-member": "{{GENDER:$1|бот}}", "group-sysop-member": "{{GENDER:$1|адміністратор|адміністраторка}}", - "group-interface-admin-member": "{{GENDER:$1|адміністратор інтерфейсу}}", + "group-interface-admin-member": "{{GENDER:$1|адміністратор інтерфейсу|адміністраторка інтерфейсу}}", "group-bureaucrat-member": "{{GENDER:$1|бюрократ|бюрократка}}", "group-suppress-member": "{{GENDER:$1|подавлювач|подавлювачка}}", "grouppage-user": "{{ns:project}}:Користувачі", @@ -1236,7 +1236,7 @@ "right-autoconfirmed": "без обмежень швидкості за IP", "right-bot": "автоматична обробка", "right-nominornewtalk": "незначні редагування на сторінках обговорень користувачів не викликають попередження про нові повідомлення", - "right-apihighlimits": "розширення обмежень на виконання API-запитів", + "right-apihighlimits": "використання вищих лімітів в API-запитах", "right-writeapi": "використання API для запису", "right-delete": "вилучення сторінок", "right-bigdelete": "вилучення сторінок з великою історією", @@ -1284,7 +1284,7 @@ "right-unwatchedpages": "перегляд списку сторінок, за якими ніхто не спостерігає", "right-mergehistory": "об'єднання історій редагувань сторінок", "right-userrights": "зміна всіх прав користувачів", - "right-userrights-interwiki": "Зміна прав користувачів у інших вікі", + "right-userrights-interwiki": "зміна прав користувачів у інших вікі", "right-siteadmin": "Блокування і розблокування бази даних", "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5", "right-sendemail": "надсилання електронної пошти іншим користувачам", @@ -2569,7 +2569,7 @@ "expiringblock": "закінчиться $1 $2", "anononlyblock": "тільки анонімів", "noautoblockblock": "автоблокування вимкнене", - "createaccountblock": "Створення облікових записів заблоковане", + "createaccountblock": "створення облікових записів заблоковане", "emailblock": "листи заборонені", "blocklist-nousertalk": "не може редагувати свою сторінку обговорення", "ipblocklist-empty": "Список блокувань порожній.", @@ -2873,12 +2873,14 @@ "print.css": "/* Розміщений тут CSS-код буде використаний для друкованої версії */", "noscript.css": "/* Розміщений тут CSS-код буде використаний для користувачів у яких вимкнено JavaScript */", "group-autoconfirmed.css": "/* Розміщений тут CSS-код буде використаний для автопідтверджених користувачів */", + "group-user.css": "/* CSS, прописані тут, вплинуть лише на зареєстрованих користувачів */", "group-bot.css": "/* Розміщений тут CSS-код буде використаний тільки для ботів */", "group-sysop.css": "/* Розміщений тут CSS-код буде використаний тільки для адміністраторів */", "group-bureaucrat.css": "/* Розміщений тут CSS-код буде використаний тільки для бюрократів */", "common.json": "/* Будь-який JSON тут завантажуватиметься для всіх користувачів при кожному завантаженні сторінки. */", "common.js": "/* Розміщений тут код JavaScript буде завантажений всім користувачам при зверненні до будь-якої сторінки */", "group-autoconfirmed.js": "/* Розміщений тут код JavaScript буде завантажений тільки для автопідтверджених користувачів */", + "group-user.js": "/* JS, прописана тут, вплине лише на зареєстрованих користувачів */", "group-bot.js": "/* Розміщений тут код JavaScript буде завантажений тільки для ботів */", "group-sysop.js": "/* Розміщений тут код JavaScript буде завантажений тільки для адміністраторів */", "group-bureaucrat.js": "/* Розміщений тут код JavaScript буде завантажений тільки для бюрократів */", diff --git a/languages/i18n/ur.json b/languages/i18n/ur.json index 29e111e983..ca421c90c7 100644 --- a/languages/i18n/ur.json +++ b/languages/i18n/ur.json @@ -1450,6 +1450,8 @@ "rcfilters-watchlist-showupdated": "تبدیلیوں کے رونما ہونے کے بعد جن صفحات کو آپ نے نہیں دیکھا وہ جلی حرفوں میں ٹھوس علامتوں کے ساتھ نظر آئیں گے۔", "rcfilters-preference-label": "حالیہ تبدیلیوں کا اصلاح شدہ نسخہ چھپائیں", "rcfilters-preference-help": "سنہ 2017ء کے انٹرفیس کو واپس لایا گیا ہے اور تمام آلات کو شامل کیا گیا ہے۔", + "rcfilters-watchlist-preference-label": "زیر نظر فہرست کے ترقی یافتہ نسخہ کو چھپائیں", + "rcfilters-watchlist-preference-help": "اسے فعال کرنے کے بعد 2017ء کا نسخہ واپس نافذ ہو جائے گا اور بعد میں شامل کیے جانے والے آلات بھی غیر فعال ہو جائیں گے۔", "rcfilters-filter-showlinkedfrom-label": "سے منسلک صفحات پر تبدیلیاں دکھائیں", "rcfilters-filter-showlinkedfrom-option-label": "صفحات سے منسلک چنندہ صفحہ", "rcfilters-filter-showlinkedto-label": "صفحات", diff --git a/languages/i18n/vi.json b/languages/i18n/vi.json index a40a8ff2c5..0473e43bad 100644 --- a/languages/i18n/vi.json +++ b/languages/i18n/vi.json @@ -84,7 +84,7 @@ "tog-watchlisthidepatrolled": "Ẩn sửa đổi đã tuần tra trong danh sách theo dõi", "tog-watchlisthidecategorization": "Ẩn việc xếp thể loại", "tog-ccmeonemails": "Gửi bản sao cho tôi khi gửi thư điện tử cho người khác", - "tog-diffonly": "Không hiển thị nội dung trang dưới phần so sánh phiên bản", + "tog-diffonly": "Ẩn nội dung trang dưới phần so sánh phiên bản", "tog-showhiddencats": "Hiển thị thể loại ẩn", "tog-norollbackdiff": "Bỏ qua bản so sánh sau khi lùi sửa", "tog-useeditwarning": "Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang", @@ -241,7 +241,7 @@ "redirectedfrom": "(đổi hướng từ $1)", "redirectpagesub": "Trang đổi hướng", "redirectto": "Đổi hướng đến:", - "lastmodifiedat": "Trang này được sửa đổi lần cuối lúc $2 $1.", + "lastmodifiedat": "Trang này được sửa đổi lần cuối vào $1 lúc $2.", "viewcount": "Trang này đã được đọc {{PLURAL:$1|một|$1}} lần.", "protectedpage": "Trang bị khóa", "jumpto": "Bước tới:", @@ -390,6 +390,9 @@ "customcssprotected": "Bạn không có quyền sửa đổi trang CSS này vì nó chứa các tùy chọn cá nhân của một thành viên khác.", "customjsonprotected": "Bạn không có quyền sửa đổi trang JSON này vì nó chứa các tùy chọn cá nhân của một thành viên khác.", "customjsprotected": "Bạn không có quyền sửa đổi trang JavaScript này vì nó chứa các tùy chọn cá nhân của một thành viên khác.", + "sitecssprotected": "Bạn không có quyền sửa đổi trang CSS này vì nó có thể ảnh hưởng đến tất cả mọi người đến trang", + "sitejsonprotected": "Bạn không có quyền sửa đổi trang JSON này vì nó có thể ảnh hưởng đến tất cả mọi người đến trang", + "sitejsprotected": "Bạn không có quyền sửa đổi trang JavaScript này vì nó có thể ảnh hưởng đến tất cả mọi người đến trang", "mycustomcssprotected": "Bạn không có quyền sửa đổi trang CSS này.", "mycustomjsonprotected": "Bạn không có quyền sửa đổi trang JSON này.", "mycustomjsprotected": "Bạn không có quyền sửa đổi trang JavaScript này.", @@ -792,9 +795,13 @@ "expansion-depth-exceeded-warning": "Trang bung bản mẫu sâu quá", "parser-unstrip-loop-warning": "Vòng lặp unstrip", "unstrip-depth-warning": "Đã vượt quá giới hạn về độ sâu đệ quy unstrip ($1)", + "unstrip-depth-category": "Trang vượt quá giới hạn về độ sâu đệ quy unstrip", + "unstrip-size-warning": "Đã vượt quá giới hạn về kích thước unstrip ($1)", + "unstrip-size-category": "Trang vượt quá giới hạn về kích thước unstrip", "converter-manual-rule-error": "Lỗi được phát hiện trong quy tắc chuyển đổi ngôn ngữ thủ công", "undo-success": "Các sửa đổi có thể được lùi lại. Xin hãy kiểm tra phần so sánh bên dưới để xác nhận lại những gì bạn muốn làm, sau đó lưu thay đổi ở dưới để hoàn tất việc lùi lại sửa đổi.", "undo-failure": "Sửa đổi không thể phục hồi vì đã có những sửa đổi mới ở sau.", + "undo-main-slot-only": "Sửa đổi không thể phục hồi vì nó có liên quan đến nội dung bên ngoài khe chính.", "undo-norev": "Sửa đổi không thể hồi phục vì nó không tồn tại hoặc đã bị xóa.", "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]])", @@ -1018,6 +1025,7 @@ "prefs-watchlist-edits": "Số lần sửa đổi lớn nhất trong danh sách theo dõi mở rộng:", "prefs-watchlist-edits-max": "Con số tối đa: 1.000", "prefs-watchlist-token": "Dấu hiệu cho danh sách theo dõi:", + "prefs-watchlist-managetokens": "Quản lý dấu hiệu", "prefs-misc": "Linh tinh", "prefs-resetpass": "Thay đổi mật khẩu", "prefs-changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử", @@ -1036,6 +1044,7 @@ "recentchangescount": "Số sửa đổi để hiển thị trong thay đổi gần đây, lịch sử trang, và nhật trình theo mặc định:", "prefs-help-recentchangescount": "Con số tối đa: 1.000", "prefs-help-watchlist-token2": "Đây là chìa khóa bí mật cho nguồn cấp dữ liệu danh sách theo dõi của bạn.\nBất cứ ai biết nó sẽ có thể để đọc danh sách theo dõi của bạn, vì vậy đừng chia sẻ nó.\nNếu cần, [[Special:ResetTokens|bạn có thể thiết lập lại nó]].", + "prefs-help-tokenmanagement": "Bạn có thể xem và đặt lại chìa khóa bí mật cho tài khoản của bạn, chài khóa này cho phép truy cập nguồn cấp danh sách theo dõi của bạn. Ai đó biết chìa khóa có thể đọc danh sách theo dõi của bạn, nên bạn đừng nên chia sẻ nó.", "savedprefs": "Đã lưu các tùy chọn cá nhân.", "savedrights": "Đã lưu các nhóm người dùng của {{GENDER:$1}}$1.", "timezonelegend": "Múi giờ:", @@ -1143,6 +1152,7 @@ "group-autoconfirmed": "Thành viên tự xác nhận", "group-bot": "Bot", "group-sysop": "Bảo quản viên", + "group-interface-admin": "Bảo quản viên giao diện", "group-bureaucrat": "Hành chính viên", "group-suppress": "Người xóa hẳn Flow", "group-all": "(tất cả)", @@ -1150,12 +1160,14 @@ "group-autoconfirmed-member": "{{GENDER:$1}}thành viên tự động xác nhận", "group-bot-member": "{{GENDER:$1}}bot", "group-sysop-member": "{{GENDER:$1}}bảo quản viên", + "group-interface-admin-member": "{{GENDER:$1}}bảo quản viên giao diện", "group-bureaucrat-member": "{{GENDER:$1}}hành chính viên", "group-suppress-member": "{{GENDER:$1}}người xóa hẳn Flow", "grouppage-user": "{{ns:project}}:Thành viên", "grouppage-autoconfirmed": "{{ns:project}}:Thành viên tự xác nhận", "grouppage-bot": "{{ns:project}}:Bot", "grouppage-sysop": "{{ns:project}}:Bảo quản viên", + "grouppage-interface-admin": "{{ns:project}}:Bảo quản viên giao diện", "grouppage-bureaucrat": "{{ns:project}}:Hành chính viên", "grouppage-suppress": "{{ns:project}}:Người xóa hẳn Flow", "right-read": "Đọc trang", @@ -1206,6 +1218,9 @@ "right-editusercss": "Sửa tập tin CSS của người dùng khác", "right-edituserjson": "Sửa tập tin JSON của người dùng khác", "right-edituserjs": "Sửa đổi tập tin JavaScript của người dùng khác", + "right-editsitecss": "Sửa đổi CSS toàn trang", + "right-editsitejson": "Sửa đổi JSON toàn trang", + "right-editsitejs": "Sửa đổi JavaScript toàn trang", "right-editmyusercss": "Sửa đổi tập tin CSS cá nhân của mình", "right-editmyuserjson": "Sửa đổi tập tin JSON cá nhân của mình", "right-editmyuserjs": "Sửa đổi tập tin JavaScript cá nhân của mình", @@ -1247,10 +1262,11 @@ "grant-createaccount": "Mở tài khoản", "grant-createeditmovepage": "Tạo, sửa đổi, và di chuyển trang", "grant-delete": "Xóa trang, phiên bản, và mục nhật trình", - "grant-editinterface": "Sửa không gian tên MediaWiki và CSS/JSON/JavaScript cá nhân", + "grant-editinterface": "Sửa không gian tên MediaWiki và JSON toàn trang hoặc cá nhân", "grant-editmycssjs": "Sửa đổi CSS/JSON/JavaScript cá nhân của bạn", "grant-editmyoptions": "Sửa đổi tùy chọn cá nhân của bạn", "grant-editmywatchlist": "Sửa danh sách theo dõi của bạn", + "grant-editsiteconfig": "Sửa đổi CSS/JS toàn trang và cá nhân", "grant-editpage": "Sửa đổi các trang đã tồn tại", "grant-editprotected": "Sửa đội các trang bị khóa", "grant-highvolume": "Sửa đổi tốc độ cao", @@ -1717,6 +1733,7 @@ "uploadstash-bad-path-unrecognized-thumb-name": "Tên hình thu nhỏ không nhận dạng được.", "uploadstash-bad-path-no-handler": "Không tìm thấy trình xử lý kiểu MIME $1 của tập tin $2.", "uploadstash-bad-path-bad-format": "Chìa khóa “$1” không tuân theo định dạng.", + "uploadstash-file-not-found": "Không tìm thấy chìa khóa “$1” trong hàng đợi.", "uploadstash-file-not-found-no-thumb": "Không thể tải hình thu nhỏ.", "uploadstash-file-not-found-no-local-path": "Không tìm thấy đường dẫn trên máy cho hình nhỏ.", "uploadstash-file-not-found-no-object": "Không tạo được đối tượng tập tin cục bộ cho hình thu nhỏ.", @@ -1731,7 +1748,7 @@ "uploadstash-zero-length": "Tập tin có dung lượng bằng không.", "invalid-chunk-offset": "Khúc lệch (chunk offset) không hợp lệ", "img-auth-accessdenied": "Không cho phép truy cập", - "img-auth-nopathinfo": "Thiếu PATH_INFO.\nMáy chủ của bạn không được thiết lập để truyền thông tin này.\nCó thể do nó dựa trên CGI và không hỗ trợ img_auth.\nXem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization hướng dẫn điều khiển truy cập hình ảnh].", + "img-auth-nopathinfo": "Thiếu thông tin đường dẫn.\nMáy chủ của bạn phải được thiết lập để truyền biến REQUEST_URI và/hoặc biến PATH_INFO.\nNếu đã được thiết lập, hãy thử kích hoạt $wgUsePathInfo.\nXem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization hướng dẫn điều khiển truy cập hình ảnh].", "img-auth-notindir": "Đường dẫn yêu cầu không nằm trong thư mục cấu hình tải lên.", "img-auth-badtitle": "Không thể tạo tựa đề hợp lệ từ “$1”.", "img-auth-nologinnWL": "Bạn chưa đăng nhập và “$1” không nằm trong danh sách trắng.", @@ -2070,7 +2087,7 @@ "cachedspecial-refresh-now": "Xem phiên bản mới nhất.", "categories": "Thể loại", "categories-submit": "Xem", - "categoriespagetext": "{{PLURAL:$1|Thể loại|Các thể loại}} dưới đây có trang hoặc tập tin phương tiện.\nNhững [[Special:UnusedCategories|thể loại trống]] không được hiển thị tại đây.\nXem thêm [[Special:WantedCategories|thể loại cần thiết]].", + "categoriespagetext": "{{PLURAL:$1|Thể loại|Các thể loại}} dưới đây tồn tại trên wiki không kể chúng được sử dụng hay không.\nXem thêm [[Special:WantedCategories|thể loại cần thiết]].", "categoriesfrom": "Hiển thị thể loại bằng đầu từ:", "deletedcontributions": "Đóng góp đã bị xóa của thành viên", "deletedcontributions-title": "Đóng góp đã bị xóa của thành viên", @@ -2739,7 +2756,7 @@ "tooltip-pt-login": "Đăng nhập sẽ có lợi hơn, tuy nhiên không bắt buộc.", "tooltip-pt-login-private": "Bạn cần phải đăng nhập để sử dụng wiki này", "tooltip-pt-logout": "Đăng xuất", - "tooltip-pt-createaccount": "Khuyến khích bạn mở tài khoản và đăng nhập; tuy nhiên, không phải bắt buộc phải có tài khoản", + "tooltip-pt-createaccount": "Khuyến khích bạn mở tài khoản và đăng nhập; tuy nhiên, không bắt buộc phải có tài khoản", "tooltip-ca-talk": "Thảo luận về trang này", "tooltip-ca-edit": "Sửa đổi trang này", "tooltip-ca-addsection": "Bắt đầu một đề mục mới", @@ -2770,7 +2787,7 @@ "tooltip-t-contributions": "Danh sách đóng góp của {{GENDER:$1|người này}}", "tooltip-t-emailuser": "Gửi thư cho {{GENDER:$1|người dùng này}}", "tooltip-t-info": "Thêm chi tiết về trang này", - "tooltip-t-upload": "Tải hình ảnh hoặc tập tin lên", + "tooltip-t-upload": "Tải tập tin lên", "tooltip-t-specialpages": "Danh sách các trang đặc biệt", "tooltip-t-print": "Bản để in ra của trang", "tooltip-t-permalink": "Liên kết thường trực đến phiên bản này của trang", @@ -3885,6 +3902,8 @@ "limitreport-templateargumentsize-value": "$1/$2 byte", "limitreport-expansiondepth": "Độ sâu bung cao nhất", "limitreport-expensivefunctioncount": "Số lời gọi hàm cú pháp cần mức độ xử lý cao", + "limitreport-unstrip-depth": "Độ sâu đệ quy unstrip", + "limitreport-unstrip-size": "Kích thước unstrip sau khi bung", "limitreport-unstrip-size-value": "$1/$2 byte", "expandtemplates": "Bung bản mẫu", "expand_templates_intro": "Trang đặc biệt này sẽ nhận vào mã wiki và bung tất cả các bản mẫu trong nó ra một cách đệ quy cho đến hết. Nó cũng bung cả những hàm cú pháp như {{#language:…}}, và những biến số như {{CURRENTDAY}}. Thực ra nó bung các dữ liệu bình thường đặt trong ngoặc móc.", @@ -4125,6 +4144,7 @@ "edit-error-long": "Lỗi:\n\n$1", "revid": "phiên bản $1", "pageid": "số trang $1", + "interfaceadmin-info": "$1\n\nMới đây phần mềm bắt đầu phân biệt quyền sửa đổi các tập tin CSS/JS/JSON toàn trang và quyền editinterface. Nếu bạn không hiểu lỗi này xuất hiện tại sao, hãy xem [[mw:MediaWiki_1.32/interface-admin]].", "rawhtml-notallowed": "Không thể sử dụng thẻ <html> bên ngoài trang bình thường.", "gotointerwiki": "Rời khỏi {{SITENAME}}", "gotointerwiki-invalid": "Tên trang chỉ định không hợp lệ.", @@ -4145,5 +4165,6 @@ "passwordpolicies-policy-passwordcannotmatchusername": "Mật khẩu không thể khớp với tên người dùng", "passwordpolicies-policy-passwordcannotmatchblacklist": "Mật khẩu không thể khớp với các mật khẩu trong danh sách đen", "passwordpolicies-policy-maximalpasswordlength": "Mật khẩu không thể vượt quá $1 ký tự", - "passwordpolicies-policy-passwordcannotbepopular": "Mật khẩu không thể {{PLURAL:$1|là mật khẩu phổ biến nhất|xuất hiện trong danh sách $1 mật khẩu phổ biến nhất}}" + "passwordpolicies-policy-passwordcannotbepopular": "Mật khẩu không thể {{PLURAL:$1|là mật khẩu phổ biến nhất|xuất hiện trong danh sách $1 mật khẩu phổ biến nhất}}", + "easydeflate-invaliddeflate": "Nội dung được cung cấp không được giải nén đúng cách" } diff --git a/languages/i18n/wa.json b/languages/i18n/wa.json index dfd60de310..3ab8c742c7 100644 --- a/languages/i18n/wa.json +++ b/languages/i18n/wa.json @@ -787,6 +787,47 @@ "recentchanges-legend-heading": "Ledjinde:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vey eto l' [[Special:NewPages|djivêye des nouvès pådjes]])", "recentchanges-submit": "Vey", + "rcfilters-legend-heading": "Djivêye des acourtixheures:", + "rcfilters-group-results-by-page": "Rigrouper les rzultats d' ene minme pådje", + "rcfilters-activefilters": "Passetes en alaedje", + "rcfilters-activefilters-hide": "Catchî", + "rcfilters-activefilters-show": "Mostrer", + "rcfilters-limit-title": "Rizultats a mostrer", + "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|candjmint|candjmints}}, $2", + "rcfilters-date-popup-title": "Termene a cweri dvins", + "rcfilters-days-title": "Dierins djoûs", + "rcfilters-hours-title": "Dierinnès eures", + "rcfilters-days-show-days": "$1 {{PLURAL:$1|djoû|djoûs}}", + "rcfilters-days-show-hours": "$1 {{PLURAL:$1|eure|eures}}", + "rcfilters-quickfilters": "Passetes schapêyes", + "rcfilters-filterlist-title": "Passetes", + "rcfilters-filter-editsbyself-label": "Vos candjmints", + "rcfilters-filter-editsbyself-description": "Les candjmints ki c' est vos-minme k' els a fwait.", + "rcfilters-filter-editsbyother-label": "Candjmint des ôtes", + "rcfilters-filter-editsbyother-description": "Tos les candjmints såf les cis da vosse.", + "rcfilters-filter-user-experience-level-newcomer-description": "Uzeus edjîstrés avou moens di 10 candjmints ou moens di cwate djoûs d' activité.", + "rcfilters-filter-user-experience-level-experienced-description": "Uzeus edjîstrés avou pus di 500 candjmints et 30 djoûs d' activité.", + "rcfilters-filter-bots-description": "Candjmints fwaits avou des usteyes otomatikes.", + "rcfilters-filter-humans-label": "Djin (nén robot)", + "rcfilters-filter-humans-description": "Candjmints fwaits pa des uzeus k' c' est des vraiyès djins.", + "rcfilters-filter-minor-label": "Pitits candjmints", + "rcfilters-filter-major-label": "Candjmints nén ptits", + "rcfilters-filter-watchlistactivity-unseen-label": "Candjmints nén co veyous", + "rcfilters-filter-watchlistactivity-unseen-description": "Candjmints so des pådjes ki vos n' avoz nén co vizité dispoy ki l' candjmint a stî fwait.", + "rcfilters-filter-watchlistactivity-seen-label": "Candjmints ddja veyous", + "rcfilters-filter-watchlistactivity-seen-description": "Candjmints so des pådjes ki vos avoz ddja vizité dispoy ki l' candjmint a stî fwait.", + "rcfilters-filtergroup-changetype": "Sôre di candjmint", + "rcfilters-filter-pageedits-label": "Candjmints d' pådje", + "rcfilters-filter-pageedits-description": "Candjmints do contnou wiki, des berdelaedjes, des discrijhaedjes di categoreyes…", + "rcfilters-filter-newpages-label": "Ahivaedjes", + "rcfilters-filter-newpages-description": "Ahivaedjes di novelès pådjes.", + "rcfilters-filter-categorization-label": "Categorijhaedjes", + "rcfilters-filter-categorization-description": "Djournå des pådjes ki sont radjoutêyes ou rsaetcheyes des categoreyes", + "rcfilters-filter-logactions-label": "Accions ezès djournås", + "rcfilters-filter-logactions-description": "Accions di manaedjaedje, ahivaedje di contes, disfaçaedje di pådjes, eberwetaedjes di fitchîs...", + "rcfilters-filter-lastrevision-label": "Dierinne modêye", + "rcfilters-filter-lastrevision-description": "Seulmint l' dierin candjmint fwait so tchaeke pådje.", + "rcfilters-filter-excluded": "Esclu", "rcnotefrom": "Chal pa dzo {{PLURAL:$5|li candjmint fwait|les candjmints fwaits}} dispoy li $3, $4 (afitchîs disk a $1).", "rclistfrom": "Mostrer les candjmints k' i gn a yeu a pårti do $3 $2", "rcshowhideminor": "$1 candjmints mineurs", @@ -796,6 +837,7 @@ "rcshowhidebots-show": "Mostrer", "rcshowhidebots-hide": "Catchî", "rcshowhideliu": "$1 uzeus edjîstrés", + "rcshowhideliu-show": "Vey", "rcshowhideliu-hide": "Catchî", "rcshowhideanons": "$1 uzeus anonimes", "rcshowhideanons-show": "Mostrer", @@ -1446,7 +1488,7 @@ "seconds": "$1 segonde{{PLURAL:$1||s}}", "minutes": "$1 munute{{PLURAL:$1||s}}", "hours": "$1 eures{{PLURAL:$1||s}}", - "days": "$1 djoû{{PLURAL:$1||s}}", + "days": "{{PLURAL:$1|$1 djoû|$1 djoûs}}", "ago": "i gn a $1", "bad_image_list": "Li fôrmat est l' shuvant:\n\nSeulmint les intrêyes di djivêye (dj' ô bén, les royes ki cmincèt avou ene sitoele «*») sont acontêyes.\nLi prumî loén d' ene roye doet esse on loyén viè on fitchî k' on vout bloker si eployaedje.\nLes ôtes loyéns dnés sol minme roye sont veyous come des foû-rîle, dj' ô bén les pådjes wice ki l' fitchî pout esse eployî", "metadata": "Meta-dnêyes", @@ -1539,6 +1581,7 @@ "exif-gpsspeed-k": "km/h", "exif-gpsspeed-m": "miles/h", "exif-gpsspeed-n": "nuks", + "exif-gpsdestdistance-k": "Kilometes", "namespacesall": "tos", "monthsall": "tos", "confirmemail": "Acertinaedje di l' adresse emile", diff --git a/languages/i18n/yue.json b/languages/i18n/yue.json index 9cf705988e..8e7d4dbf01 100644 --- a/languages/i18n/yue.json +++ b/languages/i18n/yue.json @@ -997,7 +997,7 @@ "stub-threshold-disabled": "閂咗", "recentchangesdays": "最近更改中嘅顯示日數:", "recentchangesdays-max": "最多 $1 日", - "recentchangescount": "預設顯示嘅編輯數:", + "recentchangescount": "喺最近修改、版歷史同日誌度預設顯示嘅編輯數:", "prefs-help-recentchangescount": "最大數目:1000", "prefs-help-watchlist-token2": "呢個係網上訂閱你個監視清單嘅密匙。\n任何人只要知道個密匙,就會睇到你個監視清單,所以唔好畀人知。\n如果有需要嘅話,[[Special:ResetTokens|你可以重設佢]]。", "savedprefs": "你嘅喜好設定已經儲存。", @@ -1203,7 +1203,7 @@ "grant-createaccount": "開戶口", "grant-createeditmovepage": "開版、改版同搬版", "grant-delete": "刪版、修訂同日誌紀錄", - "grant-editinterface": "改 MediaWiki 空間名同用戶 CSS/JSON/JavaScript", + "grant-editinterface": "改MediaWiki空間名同成個網站/用戶嘅JSON", "grant-editmycssjs": "改你嘅用戶CSS/JSON/JavaScript", "grant-editmyoptions": "改你嘅用戶設定", "grant-editmywatchlist": "改你嘅監視清單", @@ -1540,6 +1540,7 @@ "upload-too-many-redirects": "個URL有太多跳轉", "upload-http-error": "一個HTTP錯誤發生咗: $1", "upload-copy-upload-invalid-domain": "從嗰個域名度冇複製上傳功能", + "upload-dialog-disabled": "呢個wiki停用咗用呢個對話框來上載檔案嘅功能。", "upload-dialog-title": "上載檔案", "upload-dialog-button-cancel": "取消", "upload-dialog-button-back": "返轉頭", @@ -1591,6 +1592,7 @@ "uploadstash-errclear": "清除檔案唔成功。", "uploadstash-refresh": "更新檔案清單", "uploadstash-thumbnail": "睇縮圖", + "uploadstash-bad-path-unknown-type": "未知嘅類型「$1」。", "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 。", @@ -1609,6 +1611,7 @@ "http-timed-out": "HTTP請求已過時。", "http-curl-error": "擷取URL嗰陣出錯:$1", "http-bad-status": "當做緊HTTP請求嗰陣出現咗問題:$1 $2", + "http-internal-error": "HTTP内部錯。", "upload-curl-error6": "唔可以到嗰個URL", "upload-curl-error6-text": "輸入嘅URL唔能夠去到。請重新檢查個URL係正確嘅同埋個網站係已經上綫。", "upload-curl-error28": "上載遇時", @@ -1701,6 +1704,7 @@ "unwatchedpages": "未監視嘅頁面", "listredirects": "彈嚟彈去一覽", "listduplicatedfiles": "重覆檔案一覽", + "listduplicatedfiles-entry": "[[:File:$1|$1]]同[[$3|{{PLURAL:$2|另外$2個檔案重複}}]]。", "unusedtemplates": "未用嘅模", "unusedtemplatestext": "呢一頁列示喺{{ns:template}}空間名未包括喺其它頁面嘅全部頁面。請記得喺刪除佢哋之前檢查其它連結到呢個模嘅頁面。", "unusedtemplateswlh": "其它連結", @@ -1830,6 +1834,7 @@ "apisandbox-reset": "清除", "apisandbox-retry": "再試過", "apisandbox-examples": "範例", + "apisandbox-deprecated-parameters": "停用嘅參數", "apisandbox-results": "結果", "apisandbox-request-url-label": "請求URL:", "apisandbox-request-json-label": "請求JSON:", diff --git a/languages/i18n/zgh.json b/languages/i18n/zgh.json index cebaa6c7e8..7c64fcfd2b 100644 --- a/languages/i18n/zgh.json +++ b/languages/i18n/zgh.json @@ -34,16 +34,34 @@ "tog-enotifwatchlistpages": "ⴰⵣⵏ ⵢⵉ ⵏⵏ ⴳ ⵉⵎⴰⵢⵍ ⴰⴽⵓⴷ ⵏⵏⴰ ⵜⵡⴰⵙⵙⵏⴼⵍ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵏⵖ ⴰⴼⴰⵢⵍⵓ ⵉⵍⵍⴰⵏ ⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ ⵉⵏⵓ", "tog-enotifusertalkpages": "ⴰⵣⵏ ⵢⵢⵉ ⵏⵏ ⵉⵎⴰⵢⵍ ⴰⴽⵓⴷ ⵏⵏⴰ ⵜⵡⴰⵙⵙⵏⴼⵍ ⵜⴰⵙⵏⴰ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵉⵏⵓ", "tog-enotifminoredits": "ⴰⵣⵏ ⵢⵢⵉ ⵏⵏ ⴰⵍⵜⵓ ⵉⵎⴰⵢⵍ ⵅⴼ ⵉⵙⵏⴼⵍⵏ ⵉⵎⵣⵢⴰⵏⵏ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴷ ⵉⴼⴰⵢⵍⵓⵜⵏ", + "tog-enotifrevealaddr": "ⵙⵎⴰⵍ ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵉⵏⵓ ⴳ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ ⵏ ⵜⵎⵢⴰⵣⴰⵏⵉⵏ ⵜⵉⵍⵉⴽⵟⵔⵓⵏⵉⵏ", + "tog-shownumberswatching": "ⵙⵎⴰⵍ ⴰⵎⴹⴰⵏ ⵏ ⵉⵎⵙⵙⵎⵔⵙⵏ ⵉⵎⴹⴼⵓⵔⵏ", "tog-oldsig": "ⴰⵙⴳⵎⴹ ⵏⵏⴽ ⵏ ⴷⵖⵉⴽⴽ", + "tog-fancysig": "ⵙⵎⴽⵍ ⴰⵙⴳⵎⴹ ⴰⵎ ⵡⵉⴽⵉⴰⴹⵕⵉⵚ (ⵎⵉⵏ ⴰⵙⵖⵏ ⴰⵡⵓⵔⵎⴰⵏ)", + "tog-uselivepreview": "ⵙⴽⵏ ⴰⵣⵔⵣⵡⴰⵔ ⵎⵉⵏ ⴰⵍⵍⴰⵙ ⵏ ⵡⴰⴳⵎ ⵜⵓⵙⵏⴰ", + "tog-forceeditsummary": "ⵙⵎⵉⴳⵍ ⵉⵢ ⵉⵖ ⵓⵔ ⵙⴽⵛⵎⵖ ⵜⴰⴳⴹⵡⵉⵜ ⵏ ⵓⵙⵏⴼⵍ", "tog-watchlisthideown": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵏⵓ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ", "tog-watchlisthidebots": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵏ ⵉⵔⵓⴱⵓⵜⵏ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ", "tog-watchlisthideminor": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵎⵥⵢⴰⵏⴻⵏ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ", + "tog-watchlisthideliu": "ⵙⵏⵜⵍ ⵉⵙⵏⴼⵍⵏ ⵏ ⵉⵎⵙⵙⵎⵔⵙⵏ ⵉⵜⵜⵓⵣⵎⵎⴻⵎⵏ ⴳ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⵓⵔ", + "tog-watchlistreloadautomatically": "ⴰⵍⵙ ⵉ ⵡⴰⴳⵎ ⵏ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⵓⵔ ⵓⵡⵔⵎⴰⵏ ⴽⵓⴷ ⵏⵏⴰ ⵉⵜⵜⵙⵏⴼⵍ ⴽⵔⴰ ⵏ ⵜⵙⵜⴰⵢⵜ (ⵜⵙⵖⴰⵡⵙⴰ ⵊⴰⴱⴰⵙⴽⵔⵉⴱⵜ)", + "tog-watchlistunwatchlinks": "ⵔⵏⵓ ⵉⵔⵛⵓⵎⵏ ⵓⵙⵔⵉⴷⵏ ⴽⴽⵙ ⴰⴹⴼⵓⵔ/ⴹⴼⵓⵔ ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) ⵉ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵜⵜⵓⴹⴼⴰⵔⵏ ⴳ ⵍⵍⴰⵏ ⵉⵙⵏⴼⵍⵏ (ⵜⴰⵙⵖⵏⵜ ⴰⴷ ⵜⵙⵖⴰⵡⵙⴰ ⵊⴰⴱⴰⵙⴽⵔⵉⴱⵜ ⵃⵎⴰ ⴰⴷ ⵜⵙⵡⵓⵔⵉ)", + "tog-watchlisthideanons": "ⵙⵏⵜⵍ ⵉⵙⵏⴼⵍⵏ ⵏ ⵉⵎⵙⵙⵎⵔⵙⵏ ⵡⴰⵔ ⵉⵙⵎⴰⵡⵏ ⴳ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⵓⵔ", + "tog-watchlisthidepatrolled": "ⵙⵙⵏⵜⵍ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵜⵜⵡⴰⵣⵔⵉⵏ ⵙⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ", "tog-watchlisthidecategorization": "ⵙⵙⵏⵜⵍ ⴰⵙⵙⵓⵔⵜⵢ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ", "tog-ccmeonemails": "ⴰⵣⵏ ⵉⵢⵉ ⴷ ⵜⵓⵏⵖⵉⵍⵉⵏ ⵏ ⵉⵎⴰⵢⵍⵏ ⵏⵏⴰ ⵓⵣⵏⵖ ⵉ ⵉⵎⵙⵙⵎⵔⵙⵏ ⵢⴰⴹⵏ", "tog-diffonly": "ⴰⴷ ⵓⵔ ⵜⵙⵙⴽⴷ ⵜⵓⵎⴰⵢⵜ ⵏ ⵜⴰⵙⵏⴰ ⴷⴷⵓ ⵉⵎⵣⴰⵔⴰⵢⵏ", "tog-showhiddencats": "ⵙⴽⵏ ⵜⴰⴳⴳⴰⵢⵉⵏ ⵉⵜⵜⵓⵃⴹⴰⵏ", + "tog-norollbackdiff": "ⴰⴷ ⵓⵔ ⵜⵙⴽⵏⴷ ⴰⵎⵣⴰⵔⴰⵢ ⴹⴼⵉⵔ ⴰⵡⵔⵔⵉ", + "tog-useeditwarning": "ⵙⵎⵉⴳⵍ ⵢⵉ ⴽⵓⴷ ⵏⵏⴰ ⴼⵍⵖ ⵜⵙⵏⴰ ⵏⵏⴰ ⵙⵏⴼⵍⵖ ⵎⵉⵏ ⴰⵙ ⵜⵜ ⵃⵟⵟⵓⵖ", + "tog-prefershttps": "ⵙⵙⵎⵔⵙ ⴱⴷⴷⴰ ⴰⵣⴷⴰⵢ ⴰⵏⴼⵔⴰⵏ ⴽⵓⴷ ⵏⵏⴰ ⵣⴷⵉⵖ", "underline-always": "ⴽⵓ ⴰⵙⵙ", "underline-never": "ⵓⵙⴰⵔ", + "underline-default": "ⴰⵎⵕⴰⴹ ⵏ ⵜⵉⴼⵔⵉⵙⵜ ⵏⵖ ⴰⵎⵙⵙⴰⵔⴰ", + "editfont-style": "ⵜⴰⵎⴰⵎⴽⵜ ⵏ ⵜⵓⵏⵉⵖⵜ ⵏ ⵓⴷⵖⴰⵔ ⵏ ⵓⵙⵏⴼⵍ", + "editfont-monospace": "ⵜⵓⵏⵉⵖⵜ ⵎⵎⵓ ⵜⵣⴳⴰ ⵜⵓⵔⵔⵓⵜ", + "editfont-sansserif": "ⵜⵓⵏⵉⵖⵜ ⵏ sans-serif", + "editfont-serif": "ⵜⵓⵏⵉⵖⵜ serif", "sunday": "ⴰⵙⴰⵎⴰⵙ", "monday": "ⴰⵢⵏⴰⵙ", "tuesday": "ⴰⵙⵉⵏⴰⵙ", @@ -116,9 +134,13 @@ "hidden-categories": "{{PLURAL:$1|ⴰⵙⵎⵉⵍ ⵉⵎⵎⵏⵜⵍⵏ|ⵉⵙⵎⵉⵍⵏ ⵎⵎⵏⵜⵍⵏⵉⵏ}}", "hidden-category-category": "ⵜⴰⴳⴳⴰⵢⵉⵏ ⵉⵜⵜⵓⵏⵜⴰⵍⵏ", "category-subcat-count": "{{PLURAL:$2|ⴰⵙⵎⵉⵍ ⴰⴷ ⴷⵉⴳⵙ ⵖⴰⵙ ⵉⴷⵓⵙⵎⵉⵍⵏ ⴰⴷ.|ⴰⵙⵎⵉⵍ ⴰⴷ ⴷⵉⴳⵙ {{PLURAL:$1|ⴰⴷⵓⵙⵎⵉⵍ ⴰⴷ |$1 ⵉⴷⵓⵙⵎⵉⵍⵏ ⴰⴷ}}, ⵙⴳ $2 ⴳ ⵓⵖⵔⵓⴷ.}}", + "category-subcat-count-limited": "ⴰⵙⵎⵉⵍ ⴰⴷ ⴷⵉⴳⵙ {{PLURAL:$1|ⴰⴷⵓⵙⵎⵉⵍ|$1 ⵉⴷⵓⵙⵎⵉⵍⵏ}} ⴰⴷ.", "category-article-count": "{{PLURAL:$2|ⴰⵙⵎⵉⵍ ⴰⴷ ⵢⵓⵎⴰ ⵖⴰⵙ ⵜⴰⵙⵏⴰ ⴰⴷ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⴰⴷ ⵜⵍⵍⴰ|$1 ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⵍⵍⴰⵏⵜ}} ⴳ ⵓⵙⵎⵉⵍ ⴰⴷ, ⵙⴳ $2 ⴳ ⵓⵖⵔⵓⴷ.}}", + "category-article-count-limited": "{{PLURAL:$1|ⵜⴰⵙⵏⴰ ⴰⴷ ⵜⵍⵍⴰ|$1 ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⵍⵍⴰⵏⵜ}} ⴳ ⵓⵙⵎⵉⵍ ⴰⴷ.", "category-file-count": "{{PLURAL:$2|ⴰⵙⵎⵉⵍ ⴰⴷ ⵢⵓⵎⵢ ⵖⴰⵙ ⴰⴼⴰⵢⵍⵓ ⴰ.|{{PLURAL:$1|ⴰⴼⴰⵢⵍⵓ|$1 ⵏ ⵉⴼⵓⵢⵍⴰ}} ⴳ ⵓⵙⵎⵉⵍ ⴰ, ⵙⴳ $2 ⴰⵖⵔⵓⴷ.}}", + "category-file-count-limited": "{{PLURAL:$1|ⴰⴼⴰⵢⵍⵓ ⴰⴷ ⵉⵍⵍⴰ|$1 ⵉⴼⴰⵢⵍⵓⵜⵏ ⴰⴷ ⵍⵍⴰⵏ}} ⴳ ⵓⵙⵎⵉⵍ ⴰⴷ.", "listingcontinuesabbrev": "ⴹⴼⵓⵔ", + "index-category": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵜⵜⵡⵓⵙⴽⵉⵏⵏ", "noindex-category": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵎⵉ ⵓⵔ ⵉⵜⵜⵓⴳⵉ ⵓⵙⴳⴱⵔ", "broken-file-category": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴳ ⵍⵍⴰⵏ ⵉⵙⵖⵏⴻⵏ ⵏ ⵉⴼⵓⵢⵍⴰ ⵕⵥⴰⵏⵉⵏ", "about": "ⵅⴼ", @@ -142,14 +164,17 @@ "tagline": "ⵙⴳ {{SITENAME}}", "help": "ⵜⵉⵡⵉⵙⵉ", "search": "ⴰⵔⵣⵣⵓ", + "search-ignored-headings": " #
    \n# ⵉⵣⵡⵉⵍⵏ ⵏ ⵜⴰⵢⵢⴰⵡⵉⵏ ⵍⵍⵉ ⵔⴰ ⵉⵜⵜⵡⴰⵏⵅⵍ ⴳ ⵓⵔⵣⵣⵓ.\n# ⵉⵙⵏⴼⵍⵏ ⵖⵉ ⵔⴰ ⴰⴷ ⵙⵡⵓⵔⵉⵏ ⴽⵓⴷ ⵏⵏⴰ ⵜⵡⴰⵙⴽⵉⵏ ⵜⴰⵙⵏⴰ ⴳ ⵍⵍⴰⵏ ⵉⵣⵡⵍⵏ.\n# ⵜⵥⴹⴰⵕⴷ ⴰ ⵜⴰⵍⵙⴷ ⵉ ⵓⵙⴽⵉⵏ ⵏ ⵜⴰⵙⵏⴰ ⵙ ⵓⵙⵏⴼⵍ ⵢⵓⵔⴰⵏ.\n# ⵜⵙⴷⴷⴰⵙⵜ ⵜⴳⴰ ⵎⴽ ⴰⴷ:\n#   * ⴳⵔⴰⵢⴳⴰⵜ ⵜⵖⴰⵡⵙⴰ ⵙⴳ ⵜⴰⵎⴰⵜⴰⵔⵜ ⵏ \"#\" ⴰⵔ ⵉⵅⴼ ⵏ ⵉⵣⵔⵉⵔⵉ ⵜⴳⴰ ⴰⵅⴼⴰⵡⴰⵍ.\n#   * ⴳⵔⴰⵢⴳⴰⵜ ⵉⵣⵔⵉⵔⵉ ⵓⵔ ⵢⵓⵔⴰⵏ ⵏⵜⵜⴰⵏ ⴰⴷ ⵉⴳⴰⵏ ⴰⵣⵓⵍ ⵍⵍⵉ ⵔⴰ ⵉⵜⵜⵡⴰⵏⵅⵍ, ⴷ ⴰⵢⵏⵏⴰ ⴷⵉⴳⵙ.\nⵉⵙⴰⵖⵓⵍⵏ\nⵉⵙⴰⵖⵓⵍⵏ ⵉⴱⵕⵕⴰⵏⵉⵏ\nⵥⵔ ⵓⵍⴰ\n #
    ", "searchbutton": "ⵔⵣⵓ", "go": "ⵔⵣⵓ", "searcharticle": "ⴷⴷⵓ", "history": "ⴰⵎⵣⵔⴰⵢ ⵏ ⵜⴰⵙⵏⴰ", "history_short": "ⴰⵎⵣⵔⵓⵢ", "history_small": "ⴰⵎⵣⵔⵓⵢ", + "updatedmarker": "ⵜⵡⴰⵙⵙⵏⴼⵍ ⵜⵉⴳⵉⵔⴰ ⵏ ⵓⵔⵣⴰⴼ ⵉⵏⵓ", "printableversion": "ⵜⵓⵏⵖⵉⵍⵜ ⵉⵜⵜⵡⴰⵙⵉⴳⴳⵣⵏ", "permalink": "ⴰⵙⵖⵏ ⴰⵎⵖⵍⴰⵍ", + "print": "ⵙⵉⴳⴳⵣ", "view": "ⵙⴽⵏ", "view-foreign": "ⵙⴽⵏ ⴳ $1", "edit": "ⵙⵏⴼⵍ", @@ -157,6 +182,8 @@ "create": "ⵙⵏⵓⵍⴼⵓ", "create-local": "ⵔⵏⵓ ⴰⴳⵍⴰⵎ ⴰⴷⵖⴰⵔⴰⵏ", "delete": "ⴽⴽⵙ", + "undelete_short": "ⴰⵎⵔⴰⵔⴰ ⵏ {{PLURAL:$1|ⵢⴰⵏ ⵓⵙⵏⴼⵍ|$1 ⵉⵙⵏⴼⵍⵏ}}", + "viewdeleted_short": "ⵥⵕ {{PLURAL:$1|ⵢⴰⵏ ⵓⵙⵏⴼⵍ ⵉⵜⵜⵡⴰⴽⵙ|$1 ⵉⵙⵏⴼⵍⵏ ⵉⵜⵜⵡⴰⴽⵙⵏ}}", "protect": "ⴼⵔⴳ", "protect_change": "ⵙⵏⴼⵍ", "unprotect": "ⵙⵏⴼⵍ ⴰⴼⵔⴰⴳ", @@ -167,6 +194,9 @@ "talk": "ⴰⵎⵙⴰⵡⴰⵍ", "views": "ⵜⴰⵏⵏⴰⵢⵉⵏ", "toolbox": "ⵉⵎⴰⵙⵙⵏ", + "tool-link-userrights": "ⵙⵙⵏⴼⵍ ⵜⵉⵔⵓⴱⴱⴰ ⵏ {{GENDER:$1|ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵏⵙⵙⵎⵔⵙⵜ}}", + "tool-link-userrights-readonly": "ⵥⵕ ⵜⵉⵔⵓⴱⴱⴰ ⵏ {{GENDER:$1|ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵏⵙⵙⵎⵔⵙⵜ}}", + "tool-link-emailuser": "ⴰⵣⵏ ⵜⴰⵎⵢⴰⵣⴰⵏⵜ ⵜⴰⵍⵉⴽⵟⵕⵓⵏⵉⵜ ⵉ {{GENDER:$1|ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵏⵙⵙⵎⵔⵙⵜ}} ⴰⴷ", "imagepage": "ⵥⵕ ⵜⴰⵙⵏⴰ ⵏ ⵓⴼⴰⵢⵍⵓ", "mediawikipage": "ⵥⵕ ⵜⴰⵙⵏⴰ ⵏ ⵜⵓⵣⵓⵏⵜ", "templatepage": "ⵥⵔ ⵜⴰⵙⵏⴰ ⵏ ⵡⴰⵍⴱⵓⴹ", @@ -178,11 +208,18 @@ "redirectpagesub": "ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵡⴰⵍⴰ", "redirectto": "ⵙⵏⵉⵍ ⵖⵔ:", "lastmodifiedat": "ⵜⵏⵏⴼⵍ ⵜⴰⵙⵏⴰ ⴰ ⵉ ⵜⵉⴽⴽⵍⵜ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ ⴳ $1, ⴳ $2.", + "viewcount": "ⵜⵙⵏⴰ ⴰⴷ {{PLURAL:$1|0=ⵓⵔ ⵊⵊⵓ ⵜⵜⵡⴰⵥⵕⴰ|1=ⵜⵜⵡⴰⵥⵕⴰ ⵢⴰⵜ ⵜⴽⴽⵍⵉⵜ|ⵜⵜⵡⴰⵥⵕⴰ $1 ⵜⵉⴽⴽⴰⵍ}}.", "protectedpage": "ⵜⴰⵙⵏⴰ ⵉⵜⵜⵓⴼⵔⴰⴳⵏ", "jumpto": "ⵏⴹⵓ ⵖⵔ:", "jumptonavigation": "ⴰⵙⵜⴰⵔⴰ", "jumptosearch": "ⵔⵣⵓ", + "view-pool-error": "ⵙⵙⵓⵔⴼ, ⵉⵎⴰⴽⴽⴰⵢⵏ ⵓⵔ ⵜⵏ ⴷ ⵢⴰⵖ ⵖⵉⵍⴰⴷ.\nⴰⴳⵓⴷⵉ ⵏ ⵉⵎⵙⵙⵎⵔⵙⵏ ⴰⵔ ⵜⵜⴰⵔⵎⵏ ⴰⴷ ⵥⵕⵏ ⵜⴰⵙⵏⴰ ⴰⴷ.\nⴰⵎⵓⵔ ⵏⴽ ⵇⵇⵍ ⵉⵎⵉⴽ ⴼⴰⴷ ⴰ ⴷⴰⵖ ⵜⴰⵔⵎⴷ ⴰ ⵜⴽⵛⵍⵜ ⵙ ⵜⴰⵙⵏⴰ ⴰⴷ.\n\n$1", + "generic-pool-error": "ⵙⵙⵓⵔⴼ, ⵉⵎⴰⴽⴽⴰⵢⵏ ⵓⵔ ⵜⵏ ⴷ ⵢⴰⵖ ⵖⵉⵍⴰⴷ.\nⴰⴳⵓⴷⵉ ⵏ ⵉⵎⵙⵙⵎⵔⵙⵏ ⴰⵔ ⵜⵜⴰⵔⵎⵏ ⴰⴷ ⵥⵕⵏ ⴰⵙⴰⴳⵎ ⴰⴷ.\nⴰⵎⵓⵔ ⵏⴽ ⵇⵇⵍ ⵉⵎⵉⴽ ⴼⴰⴷ ⴰ ⴷⴰⵖ ⵜⴰⵔⵎⴷ ⴰ ⵜⴽⵛⵍⵜ ⵙ ⵓⵙⴰⴳⵎ ⴰⴷ.", + "pool-timeout": "ⵜⵣⵔⵉ ⵜⵉⵣⵉ ⵏ ⵓⵇⵇⵍ ⵙ ⵜⵔⴳⵍⵉⵡⵜ", + "pool-queuefull": "ⴰⴷⵔⴰⵙ ⵉⵏⵜⴰ", "pool-errorunknown": "ⵜⴰⵣⴳⴰⵍⵜ ⵜⴰⵔⵓⵙⵙⵉⵏⵜ", + "pool-servererror": "ⵜⴰⵏⴰⴼⵓⵜ ⵏ ⵓⵎⵙⵙⵉⴹⵏ ⵓⵔ ⵜⵍⵍⴰ ($1).", + "poolcounter-usage-error": "ⴰⵣⴳⴰⵍ ⵏ ⵓⵙⵙⵎⵔⵙ: $1", "aboutsite": "ⵖⴼ {{SITENAME}}", "aboutpage": "Project:ⵖⴼ", "copyright": "ⵜⵓⵎⴰⵢⵜ ⵜⵍⵍⴰ ⴷⴷⵓ ⵜⵓⵔⴰⴳⵜ $1 ⵖⴰⵙ ⵎⴰ ⵉⵜⵜⵡⴰⴱⴷⴰⵔ ⵓⵏⵎⴳⴰⵍⵏⵏⵙ.", @@ -200,6 +237,11 @@ "portal-url": "Project:ⴰⵡⵡⵓⵔ ⵏ ⵜⴳⵔⴰⵡⵜ", "privacy": "ⵜⴰⵙⵔⵜⵉⵜ ⵏ ⵜⵉⵏⵏⵓⵜⵍⴰ", "privacypage": "Project:ⵜⴰⵙⵔⵜⵉⵜ ⵏ ⵜⵉⵏⵏⵓⵜⵍⴰ", + "badaccess": "ⴰⵣⴳⴰⵍ ⵏ ⵜⵡⵓⵔⵉⵡⵉⵏ", + "badaccess-group0": "ⵓⵔ ⵖⵓⵔⴽ ⴰⵣⵔⴼ ⴼⴰⴷ ⴰ ⵜⵙⴽⵔⵜ ⵎⴰⵢⴰⴷ ⵜⴻⵜⵜⵔⴷ.", + "badaccess-groups": "ⵎⴰ ⵢⴰⴷ ⵍⵍⵉ ⵜⴻⵜⵜⵔⴷ ⵉⵥⵍⵉ ⵖⴰⵙ ⵙ ⵉⵏⵙⵙⵎⵔⵙⵏ ⵉⵍⵍⴰⵏ ⴳ {{PLURAL:$2|ⵜⵔⴰⴱⴱⵓⵜ ⴰⴷ|ⵢⴰⵜ ⴳ ⵜⵔⵓⴱⴱⴰ ⵢⴰⴷ}}: $1.", + "versionrequired": "ⵜⵜⵡⴰⵙⵖⴰⵡⵙ ⵜⵓⵏⵖⵉⵍⵜ $1 ⵏ ⵎⵉⴷⵢⴰⵡⵉⴽⵉ", + "versionrequiredtext": "ⵜⵜⵡⵙⵖⴰⵡⵙ ⵜⵓⵏⵖⵉⵍⵜ $1 ⵏ ⵎⵉⴷⵢⴰⵡⵉⴽⵉ ⴼⴰⴷ ⴰⴷ ⵜⵙⵡⵓⵔⵉ ⵜⴰⵙⵏⴰ ⴰⴷ.\nⵥⵕ [[Special:Version|ⵜⴰⵙⵏⴰ ⵏ ⵜⵓⵏⵖⵉⵍⵜ]].", "ok": "ⵡⴰⵅⵅⴰ", "retrievedfrom": "ⵉⵜⵜⵓⵙⴰⵖⵓⵍ ⵙⴳ $1", "youhavenewmessages": "{{PLURAL:$3|ⵖⵓⵔⴽ}} $1 ($2).", @@ -217,16 +259,27 @@ "toc": "ⵜⵓⵎⴰⵢⵉⵏ", "showtoc": "ⵙⴽⵏ", "hidetoc": "ⵙⵙⵏⵜⵍ", - "confirmable-confirm": "ⵉⵙ ⵜⵏⵥⵉⴷ", + "collapsible-collapse": "ⵙⵎⵓⵏ", + "collapsible-expand": "ⴼⵙⵉ", + "confirmable-confirm": "ⵉⵙ {{GENDER:$1|ⵜⵏⵥⵉⴷ}}?", "confirmable-yes": "ⵢⴰⵀ", "confirmable-no": "ⵓⵀⵓ", "thisisdeleted": "ⴰⴷ ⵜⵙⴽⵏⴷ ⵏⵖ ⴷ ⴰⴷ ⴷ ⵜⵔⴰⵔⴷ $1?", "viewdeleted": "ⵥⵕ $1?", + "restorelink": "{{PLURAL:$1|ⵢⴰⵏ ⵓⵙⵏⴼⵍ ⵉⵜⵜⵡⴰⴽⵙ|$1 ⵉⵙⵏⴼⵍⵏ ⵜⵜⵡⴰⴽⵙⵏ}}", + "feedlinks": "ⴰⵏⴳⵉ", + "feed-invalid": "ⴰⵏⴰⵡ ⵏ ⵓⴷⵔⵓ ⴳ ⵓⵏⴳⵉ ⵓⵔ ⵉⵙⵖⵣⵏ.", + "feed-unavailable": "ⴰⵙⵓⴼⵖ ⴳ ⵎⵏⵏⴰⵡ ⵉⵖⵎⵉⵙⵏ ⵏ ⵉⵏⴳⵉⵜⵏ ⵓⵔ ⵍⵍⴰⵏ", + "site-rss-feed": "ⴰⵏⴳⵉ ⵏ RSS ⵏ $1", "site-atom-feed": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ $1", + "page-rss-feed": "ⴰⵏⴳⵉ ⵉⵔ ⵉⵙ ⵉⵙ \"$1\"", "page-atom-feed": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ $1", "red-link-title": "$1 (ⵜⴰⵙⵏⴰ ⵓⵔ ⵜⵍⵍⵉ)", + "sort-descending": "ⴰⴼⵔⴰⵏ ⵜⴰⴽⵙⴰⵔⵜ", + "sort-ascending": "ⴰⴼⵔⴰⵏ ⵜⴰⵙⴰⵡⵏⵜ", "nstab-main": "ⵜⴰⵙⵏⴰ", "nstab-user": "ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵎⵔⴰⵙ", + "nstab-media": "ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵏⵖⵎⵙ", "nstab-special": "ⵜⴰⵙⵏⴰ ⵉⵥⵍⵉⵏ", "nstab-project": "ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵏⵜⵉ", "nstab-image": "ⴰⴼⴰⵢⵍⵓ", @@ -235,14 +288,29 @@ "nstab-help": "ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ", "nstab-category": "ⴰⵙⵎⵉⵍ", "mainpage-nstab": "ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵏⵓⴱⴳ", + "nosuchaction": "ⵎⴰ ⵢⴰⴷ ⵓⵔ ⵉⵍⵍⴰ", + "nosuchactiontext": "ⵜⵉⴳⴰⵡⵜ ⵉⵜⵜⵡⴰⵜⴻⵜⵜⵔⵏ ⵙⴳ URL ⵓⵔ ⵉⵙⵖⵣⵏ.\nⵉⵔⵡⵙ ⵉⵙ ⵜⵙⴽⵔⴷ ⴽⵔⴰ ⵓⵣⴳⴰⵍ ⴳ URL, ⵏⵖ ⴷ ⵉⵙ ⴷ ⵜⴹⴼⴰⵔⴷ ⴽⵔⴰ ⵓⵙⵖⵏ ⵓⵔ ⵉⵙⵡⵡⵓⵔⵉⵏ.\nⵎⴰ ⵢⴰⴷ ⵉⵣⴹⴰⵔ ⴰ ⵉⴳ ⵓⵍⴰ ⴳ ⵓⵣⴳⴰⵍ ⴳ ⵓⵖⴰⵡⴰⵙ ⵉⵜⵜⵡⴰⵙⵙⵎⵔⵙⵏ ⴳ {{SITENAME}}.", "nosuchspecialpage": "ⴰⵡⴷ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵉⵥⵍⵉⵏ.", "nospecialpagetext": "ⵜⴻⵜⵜⵔⴷ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵉⵥⵍⵉⵏ ⵓⵔ ⵉⴱⵓⵏⵉⵏ\n\nⵢⴰⵜ ⵜⵍⴳⴰⵎⵜ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵥⵍⵉⵏ ⵔⴰⴷ ⵜⵜ ⵜⴰⴼⴷ ⴳ [[Special:SpecialPages|{{int:specialpages}}]].", "error": "ⵜⴰⵣⴳⵍⵜ", + "databaseerror": "ⴰⵣⴳⴰⵍ ⴳ ⵜⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ", + "databaseerror-text": "ⴰⵣⴳⴰⵍ ⴳ ⵓⵙⵓⵜⵔ ⵏ ⵜⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ.\nⵎⴰ ⵢⴰⴷ ⵉⵣⴹⴰⵔ ⴰ ⵉⴳ ⵓⵍⴰ ⴰⵣⴳⴰⵍ ⴳ ⵓⵖⴰⵡⴰⵙ.", + "databaseerror-textcl": "ⴰⵣⴳⴰⵍ ⴳ ⵓⵙⵓⵜⵔ ⵏ ⵜⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ.", + "databaseerror-query": "ⴰⵙⵓⵜⵔ: $1", "databaseerror-function": "ⵜⴰⵙⵖⵏⵜ: $1", "databaseerror-error": "ⵜⴰⵣⴳⵍⵜ: $1", + "transaction-duration-limit-exceeded": "ⵃⵎⴰ ⴰⴷ ⵜⴰⵏⴼⴷ ⵉ ⵓⵎⴰⵟⵍ ⵉⴳⴳⵓⵜⵏ ⵏ ⵜⵎⵔⴰⵔⵓⵜ, ⵎⵢⴰⴷ ⵉⵜⵜⵡⴰⵙⵙⵔ ⵎⵉⵏⵣⵉ ⵜⵉⵣⵉ ⵏ ⵜⵉⵔⵔⴰ ($1) ⵜⵣⵔⵉ $2 ⵜⴰⵙⵉⵏⵜ.\nⵉⵖ ⴰ ⵜⵙⵙⵏⴼⵍⴷ ⴽⴰⴷⴰ ⵏ ⵉⴼⵔⴷⵉⵙⵏ ⵙ ⵢⴰⵜ ⵜⵉⴽⴽⵍⵜ, ⴰⵔⵎ ⴰⴰ ⵜⵙⴽⵔⴷ ⵎⵏⵏⴰⵡⵜ ⵜⵎⵀⴰⵍ ⵜⵉⵎⵣⵢⴰⵏⵉⵏ.", + "laggedslavemode": "ⴰⵙⵎⵉⴳⵍ: ⵜⴰⵙⵏⴰ ⴰⴷ ⵉⵣⴹⴰⵔ ⴰⴷ ⴷⵉⴳⵙ ⵓⵔ ⵉⵍⵉⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ.", + "readonly": "ⵜⴰⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ ⵜⵜⵡⴰⵔⴳⵍ", + "enterlockreason": "ⵎⵍ ⴰⵙⵔⴰⴳ ⵏ ⵜⵔⴳⵍⴰⵡⵜ, ⵓⵍⴰ ⵃⵜⵜⴰ ⵎⴰⵏⴰⴳⵓ ⵔⴰ ⴰⴷ ⵉⵙⵎⴷ", + "readonlytext": "ⵜⴰⵙⵉⵍⴰ ⵉ ⵉⵙⴼⴽⴰ ⵜⵜⵡⴰⵔⴳⵍ ⵖⵉⵍⴰⴷ ⵖⴼ ⵉⵙⴽⵛⵓⵎⵏ ⴷ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ ⵢⴰⴹⵏ, ⵉⵣⴹⴰⵔ ⵖⴰⵙ ⵖⴼ ⵓⵏⵀⵍⵍⴰ, ⵔⴰ ⴰⴷ ⵙⵓⵍ ⵜⵓⵔⵔⵉ ⵎⴽⵍⵍⵉ ⵢⴰⴷⵍⵍⵉ.\n\nⴰⵎⵙⵙⵓⴳⵓⵔ ⵏ ⵓⵏⴳⵔⴰⵡ ⵍⵍⵉ ⵙⵜⵜ ⵉⵔⴳⵍⵏ ⵉⴼⴽⴰ ⴷ ⵉⵙⵉⵙⴼⵉⵡⵏ ⴰⴷ: $1", + "missing-article": "ⵜⴰⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ ⵓⵔ ⵜⵓⴼⵉ ⴰⴹⵕⵉⵚ ⵏ ⵜⴰⵙⵏⴰ ⵍⵍⵉ ⵙ ⵉⵅⵚⵚⴰ ⴰ ⵜⵜ ⵜⴰⴼ, ⵉⵙⵎ ⵏⵏⵙ \"$1\" $2.\n\nⵎⴰⵢⴰⴷ ⴰⵔ ⵉⵜⵜⴳⴳⴰ ⴰⵙⵔⴰⴳ ⵏⵙ ⵉⵖ ⴷ ⴹⴼⴰⵔⴷ ⴽⵔⴰ ⵏ ⵓⵙⵖⵏ ⵏ ⵓⵎⵣⴰⵔⴰⵢ ⵏⵖ ⴰⵎⵣⵔⵓⵢ ⵖⵔ ⵉⵜⵜⵡⴰⴽⴽⵙⵏ.\n\nⵉⵖ ⴷ ⵓⵔ ⵎⴽⴰ ⴰⴷ, ⵉⵥⴹⵉⵔ ⴰⴷ ⵜⴰⴼⵜ ⴰⵣⴳⴰⵍ ⴳ ⵓⵖⴰⵡⴰⵙ.\nⴰⵎⵓⵔ ⵏⴽ ⵎⵍ ⵎⴰⵢⴰⴷ ⵉ ⴽⵔⴰ ⵏ [[Special:ListUsers/sysop|ⵓⵎⵙⵙⵓⴳⵓⵔ]], ⴰⴽⴷ ⴰⵙⵖⵏ.", + "missingarticle-rev": "(ⵓⵟⵟⵓⵏ ⵏ ⵓⵣⵣⵔⴰⵢ : $1)", "missingarticle-diff": "(ⴰⵎⵣⴰⵔⴰⵢ : $1, $2)", + "readonly_lag": "ⵜⴰⵙⵉⵍⴰ ⵏ ⵓⵙⴼⴽⴰ ⵜⵜⵡⴰⵔⴳⵍ ⵙ ⵡⵓⵔⵎⴰⵏ ⵃⵎⴰ ⴰⴷ ⵉⵥⴹⵉⵔⵏ ⵉⵎⴰⴽⴽⴰⵢⵏ ⵉⵙⵉⵏⴰⵏⵏ ⴰⴷ ⵍⴽⵎⵏ ⴰⵎⴰⴽⴽⴰⵢ ⴰⴷⵙⵍⴰⵏ", "internalerror": "ⴰⵣⴳⴰⵍ ⴰⴳⵏⵙⴰⵏ", "internalerror_info": "ⴰⵣⴳⴰⵍ ⴰⴳⵏⵙⴰⵏ : $1", + "filecopyerror": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⵙⵙⵏⵖⵍ ⵏ ⵓⴼⴰⵢⵍⵓ \"$1\" ⵖⵔ \"$2\".", "filedeleteerror": "ⵓⵔ ⵜⴰⵍⵍⴼⵓⵙ ⵜⵓⴽⴽⵙⴰ ⵏ ⵓⴼⴰⵢⵍⵓ « $1 ».", "directorycreateerror": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵓⴽⴰⵔⴰⵎ « $1 ».", "directoryreadonlyerror": "ⴰⴽⴰⵔⴰⵎ « $1 » ⵉⴳⴰ ⵖⴰⵙ ⵉ ⵜⵖⵔⵉ.", @@ -258,6 +326,8 @@ "actionthrottledtext": "ⴰⵎⵓⵔ ⵏⵏⴽ, ⴰⵔⵎ ⴷⵉⵖ ⴷⴼⴼⵉⵔ ⵢⴰⵏ ⵉⵎⵉⴽⴽ ⵏ ⵜⵓⵙⴷⵉⴷⵉⵏ.", "viewsourcetext": "ⵜⵣⵎⵔⴷ ⴰⴷ ⵜⵥⵔⴷ ⴷ ⴰⴷ ⵜⵙⵙⵏⵖⵍⴷ ⴰⵙⴰⴳⵎ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ", "exception-nologin": "ⵓⵔ ⵢⵓⴷⵉⴼ", + "exception-nologin-text": "ⴰⵎⵓⵔ ⵏⴽ ⴽⵛⵎ ⴼⴰⴷ ⴰ ⵜⵉⵥⴹⵓⵔⵜ ⴰⴷ ⵜⴽⵛⵎⴷ ⵙ ⵜⴰⵙⵏⴰ ⴰⴷ ⵏⵖ ⵜⵉⴳⴰⵡⵜ ⴰⴷ.", + "cannotlogoutnow-title": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵡⵓⴼⵓⵖ ⴷⵖⵉⴽⴽ", "welcomeuser": "ⴰⵏⵙⵓⴼ, $1!", "yourname": "ⵉⵙⵎ ⵏ ⵓⵙⵎⵔⴰⵙ", "userlogin-yourname": "ⵉⵙⵎ ⵏ ⵓⵙⵎⵔⴰⵙ", @@ -267,6 +337,7 @@ "userlogin-yourpassword": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ", "userlogin-yourpassword-ph": "ⵙⵙⴽⵛⵎ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴽ", "createacct-yourpassword-ph": "ⵙⵙⴽⵛⵎ ⴽⵔⴰ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⴰⵔⵢ", + "yourpasswordagain": "ⴰⵔⴰ ⴷⴰⵖ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ:", "createacct-yourpasswordagain": "ⵙⵙⵍⴽⵏ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ", "createacct-yourpasswordagain-ph": "ⵙⵙⴽⵛⵎ ⴷⴰⵖ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ", "userlogin-remembermypassword": "ⴰⴷⵊ ⵉⵢⵉ ⴽⵛⵎⵖ", @@ -274,20 +345,29 @@ "cannotlogin-text": "ⴰⴽⵛⵛⵓⵎ ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ.", "cannotloginnow-title": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⴽⵛⵛⵓⵎ ⴷⵖⵉⴽⴽ", "cannotcreateaccount-title": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵉⵎⵉⴹⴰⵏⴻⵏ", + "yourdomainname": "ⵉⴳⵔ ⵏⵏⴽ:", + "password-change-forbidden": "ⵓⵔ ⵜⵥⴹⴰⵕⴷ ⴰⴷ ⵜⵙⵏⴼⵍⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⴳ ⵓⵡⵉⴽⵉ ⴰⴷ.", + "externaldberror": "ⵉⵍⵍⴰ ⴽⵔⴰ ⵏ ⵓⵣⴳⵍⴰ ⵏ ⵓⵙⵎⴰⴳⵉ ⵏ ⵜⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ ⵏⵖ ⵓⵔ ⴷⴰⵔⴽ ⴰⵣⵔⴼ ⴰⴷ ⵜⵙⴷⵖⵉⴷ ⴰⵎⵉⴷⴰⵏ ⵏⴽ ⴰⴱⵔⵔⴰⵏⵉ.", "login": "ⴽⵛⵎ", "login-security": "ⵙⵙⵉⴷⴻⴷ ⵜⴰⵎⴰⴳⵉⵜ ⵏⵏⴽ", + "nav-login-createaccount": "ⴽⵛⵎ /ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ", "logout": "ⴼⴼⵖ", "userlogout": "ⴼⴼⵖ", + "notloggedin": "ⵓⵔ ⵜⴽⵛⵎⴷ", "userlogin-noaccount": "ⵓⵔ ⵖⵓⵔⴽ ⵉⵍⵍⵉ ⵓⵎⵉⴹⴰⵏ?", "userlogin-joinproject": "ⵍⴽⵎ {{SITENAME}}", "createaccount": "ⵔⵥⵎ ⴽⵔⴰ ⵏ ⵓⵎⵉⴹⴰⵏ", "userlogin-resetpassword-link": "ⵜⴻⵜⵜⵓⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⵎ/ⴽ?", "userlogin-helplink2": "ⵜⵉⵡⵉⵙⵉ ⴳ ⵓⴽⵛⵛⵓⵎ", + "userlogin-loggedin": "ⵜⴽⵛⵎⴷ ⵢⴰⴷ ⴰⵎ {{GENDER:$1|$1}}.\nⵙⵎⵔⵙ ⵜⴼⵔⵜ ⵏ ⵉⵙⴼⴽⴰ ⴰⵏⵏ ⵓⵣⴷⴷⴰⵔ ⵃⵎⴰ ⴰⴷ ⵜⴽⵛⵎⴷ ⴰⵎ ⴰⵏⵙⵙⵎⵔⵙ ⵢⴰⴹⵏ.", + "userlogin-reauth": "ⵉⴽⴽⴰⵏⴽ ⵉⴷ ⴰⴷ ⴷⴰⵖ ⵜⴽⵛⵎⴷ ⵃⵍⴰ ⴰⴷ ⵜⵙⵙⵉⴷⴷⴻⴷ ⵎⴰⵙ ⵜⴳⵉⵜ {{GENDER:$1|$1}}.", "userlogin-createanother": "ⵙⴽⵔ ⴰⵎⵉⴹⴰⵏ ⵢⴰⴹⵏ", "createacct-emailrequired": "ⵉⵎⴰⵢⵍ", "createacct-emailoptional": "ⵉⵎⴰⵢⵍ (ⴰⵔⵓⵛⵛⵉⵍ)", "createacct-email-ph": "ⵙⵙⴽⵛⵎ ⴰⵏⵙⴰ ⵉⵎⴰⵢⵍ ⵏⵏⴽ", "createacct-another-email-ph": "ⵙⵙⴽⵛⵎ ⴰⵏⵙⴰ ⵉⵎⴰⵢⵍ ⵏⵏⴽ", + "createaccountmail": "ⵙⵎⵔⵙ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⴷⵀⵎⴰⵙⵜ ⵜⴰⴽⵓⴷⴰⵏⵜ ⵜⴰⵣⵏⴷ ⵙⵜ ⵉ ⵡⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵉⵥⵍⵉⵏ", + "createaccountmail-help": "ⵉⵥⴹⴰⵕ ⴰ ⵜⵜⵡⴰⵙⵙⵎⵔⵙ ⴳ ⵓⵙⵏⴼⵍⵓⵍ ⵏ ⵓⵎⵉⴹⴰⵏ ⵏ ⴽⵔⴰ ⵏ ⵢⴰⵏ ⵢⴰⴹⵏ ⵎⵉⵏ ⴰⴷ ⵉⵙⵙⵏ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ.", "createacct-realname": "ⵉⵙⵎ ⵏ ⵜⵉⴷⵜ (‍ⵎ ⵜⵔⵉⵜ)", "createacct-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ", "createacct-reason-ph": "ⵎⴰⵖ ⴰⵍⵍⵉⴳ ⴰⵔ ⵜⵙⴽⴰⵔⴷ ⴰⵎⵉⴹⴰⵏ ⵢⴰⴹⵏ", @@ -306,6 +386,9 @@ "loginerror": "ⴰⵣⴳⴰⵍ ⴳ ⵓⴽⵛⵛⵓⵎ", "createacct-error": "ⴰⵣⴳⴰⵍ ⴳ ⵓⵙⵏⵓⵍⴼⵓ ⵏ ⵓⵎⵉⴹⴰⵏ", "createaccounterror": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⵙⴽⴽⵉⵔ ⵏ ⵓⵎⵉⴹⴰⵏ: $1", + "nocookiesnew": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵉⵜⵜⵡⴰⵙⵏⴼⵍⵓⵍ, ⵎⴰⵛ ⵓⵔ ⵜⴽⵛⵎⴷ.\n{{SITENAME}} ⴰⵔ ⵉⵙⵙⵎⵔⴰⵙ ⵉⴽⵓⴽⵉⵜⵏ ⴳ ⵓⴽⵛⵛⵓⵎ ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ.\nⵓⵔ ⵖⵓⵔⴽ ⵙⵡⵓⵔⵉⵏ ⵉⴽⵓⴽⵉⵜⵏ.\nⵉⵖ ⵜⵓⴼⵉⵜ ⴰ ⵜⵜⵏ ⵜⵙⵡⵓⵔⵉⴷ, ⴼⴰⴷ ⴰⴷ ⵜⴽⵛⵎⴷ ⵙ ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵏⴽ ⴰⵎⴰⵢⵏⵓ ⴷ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⴽ.", + "nocookieslogin": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵉⵜⵜⵡⴰⵙⵏⴼⵍⵓⵍ, ⵎⴰⵛ ⵓⵔ ⵜⴽⵛⵎⴷ.\n{{SITENAME}} ⴰⵔ ⵉⵙⵙⵎⵔⴰⵙ ⵉⴽⵓⴽⵉⵜⵏ ⴳ ⵓⴽⵛⵛⵓⵎ ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ.\nⵓⵔ ⵖⵓⵔⴽ ⵙⵡⵓⵔⵉⵏ ⵉⴽⵓⴽⵉⵜⵏ.\nⵉⵖ ⵜⵓⴼⵉⵜ ⴰ ⵜⵜⵏ ⵜⵙⵡⵓⵔⵉⴷ, ⵜⴰⵔⵎⴷ ⴷⴰⵖ.", + "nocookiesfornew": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵓⵔ ⵉⵜⵜⵡⴰⵙⵏⴼⵍⵓⵍ, ⵍⵍⵉⵖ ⵓⵔ ⵏⵥEⴰⵕ ⴰ ⵏⵙⵎⴰⴳⵉ ⴰⵙⴳⵎ ⵏⵏⵙ.\nⵙⵙⵉⴷⴻⴷ ⵉⵙ ⵖⵓⵔⴽ ⵙⵡⵓⵔⵉⵏ ⵉⴽⵓⴽⵉⵜⵏ, ⴰⵍⵙ ⴰⴳⵎ ⵜⴰⵙⵏⴰ ⴰⴷ ⵜⴰⵔⵎⴷ ⴷⴰⵖ.", "noname": "ⵓⵔ ⵜⵙⴽⵛⵉⵎⴷ ⵢⴰⵏ ⵢⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵉⴱⵓⵏⴰⵏ.", "loginsuccesstitle": "ⵜⴽⵛⵎⴷ", "loginsuccess": "ⵜⴽⵛⵎ ⴷⵖⵉⴽⴽ ⵙ {{SITENAME}} ⵙ ⵢⵉⵙⵎ ⵏ « $1 ».", @@ -313,21 +396,93 @@ "wrongpassword": "ⵓⵔ ⵉⴱⵓⵏⵉ ⵢⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵏⵖ ⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴰ ⵜⵙⴽⵛⵎⴷ.\nⴰⵎⵓⵔ ⵏⵏⴽ ⴰⵔⵎ ⴷⴰⵖ.", "wrongpasswordempty": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴰ ⵜⵙⴽⵛⵎⴷ ⵜⵓⵔⴰ.\nⴰⵎⵓⵔ ⵏⵏⴽ ⴰⵔⵎ ⴷⴰⵖ.", "mailmypassword": "ⵔⴰⵔ ⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ", + "noemailcreate": "ⵉⵍⵍⴰ ⴼⵍⵍⴰⴽ ⴰⴷ ⵜⴼⴽⴷ ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵉⵙⵖⵥⵏⵏ", + "passwordsent": "ⵢⴰⵜ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⵎⴰⵢⵏⵓⵜ ⵜⵢⴰⵣⴰⵏⵏ ⵙ ⵡⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵏ ⵓⵏⵙⵙⵎⵔⵙ \"$1\".\nⴰⵎⵓⵔ ⵏⴽ ⴽⵛⵎ ⴷⴰⵖ ⴽⵓⴷ ⵏⵏⴰ ⴽⵏ ⵜⵍⴽⵎ.", + "blocked-mailpassword": "ⴰⵏⵙⴰ ⵏ IP ⵏⴽ ⵉⵜⵜⵡⴰⴷⴳⵍ ⵖⴼ ⵓⵙⵏⴼⵍ. ⵃⵎⴰ ⴰ ⵏⵙⵙⵉⵏⴼ ⴳⴰⵔ ⴰⵙⵙⵎⵔⵙ ⵓⵔ ⵜⵓⴼⵉⵜ ⴰ ⵜⵙⵎⵔⵙⴷ IP ⴰⴷ ⴳ ⵜⵔⴰⵔⵉⵜ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ.", + "emailconfirmlink": "ⵙⵙⵏⵜⵎ ⴰⵏⵙⴰ ⵏ ⵉⵎⴰⵢⵍ ⵏⵏⴽ", + "accountcreated": "ⵉⵜⵜⵓⵙⵏⵓⵍⴼⴰ ⵓⵎⵉⴹⴰⵏ", + "accountcreatedtext": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵙⵎⵔⴰⵙ ⵏ [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ⵎⵙⴰⵡⴰⵍ]]) ⵉⵜⵜⵓⵙⵏⵓⵍⴼⴰ.", + "createaccount-title": "ⴰⵙⵏⵓⵍⴼⵓ ⵏ ⵓⵎⵉⴹⴰⵏ ⵉ {{SITENAME}}", "loginlanguagelabel": "ⵜⵓⵜⵍⴰⵢⵜ: $1", "pt-login": "ⴽⵛⵎ", "pt-login-button": "ⴽⵛⵎ", + "pt-login-continue-button": "ⴹⴼⵔ ⴰⴽⵛⵛⵓⵎ", "pt-createaccount": "ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ", "pt-userlogout": "ⴼⴼⵖ", + "changepassword": "ⵙⵏⴼⵍ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ", + "resetpass_announce": "ⴰⴼⴰⴷ ⴰⴷ ⵜⵙⵎⴷⵜ ⴰⴽⵛⵛⵓⵎ, ⵉⵍⵍⴰ ⴼⵍⵍⴰⴽ ⴰⴷ ⵜⵙⴽⵔⵜ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⵎⴰⵢⵏⵓⵜ.", + "resetpass_header": "ⵙⵏⴼⵍ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ", "oldpassword": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⵇⴱⵓⵔⵜ", "newpassword": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⵎⴰⵢⵏⵓⵜ", + "retypenew": "ⴰⵔⴰ ⴷⴰⵖ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ:", + "resetpass_submit": "ⵙⵏⴼⵍ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴽⵛⵎⴷ", + "changepassword-success": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⴽ ⵜⵜⵡⴰⵙⵏⴼⵍ!", + "changepassword-throttled": "ⵜⵓⵔⵎⴷ ⴰⴷ ⵜⴽⵛⵎⴷ ⵎⵏⵏⴰⵡⵜ ⵜⵉⴽⴽⴰⵍ.\nⴰⵎⵓⵔ ⵏⴽ ⵇⵇⵍ $1 ⴼⴰⴷ ⴰⴷ ⴷⴰⵖ ⵜⴰⵔⵎⴷ.", + "botpasswords": "ⵜⵉⴳⵓⵔⵉⵡⵉⵏ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ", + "botpasswords-summary": "ⵜⵉⴳⵓⵔⵉⵡⵉⵏ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⴰⵔ ⴽ ⵜⴰⴷⵊⴰⵏ ⴰⴷ ⵜⴽⵛⵎⴷ ⵙ ⵓⵎⵉⴹⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵙⴳ API ⵎⵉⵏ ⴰⴷ ⵜⵙⵎⵔⵙⴷ ⵉⵙⵎⴰⴳⵉⵜⵏ ⵏ ⵓⴽⵛⵛⵓⵎ ⵉⴷⵙⵍⴰⵏⵏ. ⵜⵓⵔⴰⴳⵉⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵉⵖ ⵜⵍⵛⵎⴷ ⵙ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⵉⵥⴹⵉⵕ ⴰⴷ ⴽⵔⵉⵏⵜ.\n\nⵉⵖ ⵓⵔ ⵜⵙⵙⵏⴷ ⵎⴰ ⵖⴼ ⵔⴰ ⴰⴷ ⵜⵉⵔⵉⴷ ⴰⴷ ⵜⵙⴽⵔⴷ ⵎⴰⵢⴰⴷ, ⵓⵔ ⴰⴽⴽⵯ ⴼⵍⵍⴰⴽ ⵉⵍⵍⵉ ⴰⴷ ⵜⵙⴽⵔⴷ. ⵃⵜⵜⴰ ⵢⴰⵏ ⵓⵔ ⴼⵍⵍⴰⵙ ⵉⵍⵍⵉ ⴰⴷ ⴰⴽ ⵙⴰⵔ ⵉⵏⵏⴰ ⴰⴷ ⵜⵃⵉⴷ ⴽⵔⴰ ⵏ ⵢⴰⵜ ⵙⴳ ⵜⵉⴷ ⴷ ⵡⴰⴷ ⴰⵙ ⵜⵜ ⵜⴼⴽⴷ.", + "botpasswords-disabled": "ⵜⵉⴳⵓⵔⵉⵡⵉⵏ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⵓⵔ ⵙⵡⵓⵔⵉⵏⵜ.", + "botpasswords-no-central-id": "ⵃⵍⴰ ⴰⴷ ⵜⵙⵎⵔⵙⴷ ⵜⵉⴳⵓⵔⵉⵡⵉⵏ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ, ⵉⵇⵇⴰⵏⴽ ⵉⴷ ⴰⴷ ⵜⴽⵛⵎⴷ ⵙ ⴽⵔⴰ ⵏ ⵓⵎⵉⴹⴰⵏ ⴰⵏⴰⵎⵎⴰⵙ.", + "botpasswords-existing": "ⵜⵉⴳⵓⵔⵉⵡⵉⵏ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⵍⵍⵉ ⵉⵍⵍⴰⵏ", + "botpasswords-createnew": "ⵙⵏⴼⵍⵓⵍ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ", + "botpasswords-editexisting": "ⵙⵏⴼⵍ ⴽⵔⴰ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⵍⵍⵉ ⵢⴰⴷ ⵉⵍⵍⴰⵏ", + "botpasswords-label-needsreset": "(ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⵙⵖⴰⵡⵙⴰ ⴰⵍⵍⴰⵙ)", + "botpasswords-label-appid": "ⵉⵙⵎ ⵏ ⵓⴱⵓⵜ:", "botpasswords-label-create": "ⵙⵏⵓⵍⴼⵓ", + "botpasswords-label-update": "ⴰⵙⴷⵖⵉ", "botpasswords-label-cancel": "ⵙⵔ", "botpasswords-label-delete": "ⴽⴽⵙ", + "botpasswords-label-resetpassword": "ⴰⵍⵙ ⵉ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ", + "botpasswords-label-grants": "ⵉⵣⵔⴼⴰⵏ ⵉⵙⵏⵉⵙⵏ:", + "botpasswords-help-grants": "ⵜⵓⵔⴰⴳⵉⵏ ⴰⵔ ⴰⴽⴽⴰⵏⵜ ⴰⴷⴷⴰⴼ ⵙ ⵉⵣⵔⴼⴰⵏ ⵍⵍⵉ ⵢⴰⴷ ⵉⵍⵍⴰⵏ ⵖⵓⵔ ⵓⵎⵉⴹⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵏⴽ. ⴰⵙⵏⵉⵙ ⵏ ⴽⵔⴰ ⵏ ⵜⵓⵔⴰⴳⵜ ⵖⵉⴷ ⵃⵜⵜⴰ ⵙ ⴽⵔⴰ ⵏ ⵓⵣⵔⴼ ⵙ ⵓⵔ ⵔⴰ ⵜⵉⵔⵉⴷ ⴰ ⵉⵍⵍⵉ ⵖⵓⵔ ⵓⵎⵉⴹⴰⵏ ⵏⴽ. ⵥⵕ [[Special:ListGrants|ⵜⴰⴼⵍⵉⵡⵜ ⵏ ⵜⵓⵔⴰⴳⵉⵏ]] ⵃⵎⴰ ⵓⴳⴳⴰⵔ ⵏ ⵉⴼⵔⵓⵔⵉⵜⵏ.", + "botpasswords-label-grants-column": "ⵉⵜⵜⵡⴰⵎⵙⴰⵙⴰ", + "botpasswords-bad-appid": "ⵉⵙⵎ ⵏ ⵓⴱⵓⵜ \"$1\" ⵓⵔ ⵉⵙⵖⵥⵏ.", + "botpasswords-insert-failed": "ⵓⵔ ⵉⵙⵎⵓⵔⵙ ⵓⵎⵔⵏⵓ ⵏ ⵉⵙⵎ ⵏ ⵓⴱⵓⵜ \"$1\". ⵢⴰⴽ ⵓⵔ ⵏ ⵢⴰⴷⵍⵍⵉ ⵉⵔⵏⴰ?", + "botpasswords-update-failed": "ⵓⵔ ⵉⵙⵎⵓⵔⵙ ⵓⵙⴷⵖⵉ ⵏ ⵉⵙⵎ ⵓⴱⵓⵜ \"$1\". ⵢⴰⴽ ⵓⵔ ⵉⵜⵜⵡⴰⴽⴽⵙ?", + "botpasswords-created-title": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⵜⵜⵙⵏⴼⵍⵓⵍ", + "botpasswords-created-body": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ \"$1\" ⵏ {{GENDER:$2|ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵏⵙⵙⵎⵔⵙⵜ}} \"$2\" ⵜⵜⵙⵏⴼⵍⵓⵍ.", + "botpasswords-updated-title": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⵜⵜⵡⴰⵙⴷⵖⵉ", + "botpasswords-updated-body": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ \"$1\" ⵏ {{GENDER:$2|ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵏⵙⵙⵎⵔⵙⵜ}} \"$2\" ⵜⵜⵡⴰⵙⴷⵖⵉ.", + "botpasswords-deleted-title": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⵜⵜⵡⴰⴽⴽⵙ", + "botpasswords-deleted-body": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ \"$1\" ⵏ {{GENDER:$2|ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵏⵙⵙⵎⵔⵙⵜ}} \"$2\" ⵜⵜⵡⴰⴽⴽⵙ.", + "botpasswords-newpassword": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴽⵛⵛⵓⵎ ⵙ $1 ⵜⴳⴰ $2. ⴰⵎⵓⵔ ⵏⴽ ⵣⵎⵎⴻⵎ ⵎⴰⵢⴰⴷ ⵉ ⵓⵙⴰⵖⵓⵍ ⴳ ⵎⴰ ⴰⴷ ⵢⵓⵙⴰⵏ.
    (ⵉ ⵉⴱⵓⵜⵏ ⵉⵇⴱⵓⵔⵏ ⵍⵍⵉ ⵉⵙⵖⴰⵡⵙⴰⵏ ⵉⵙⵎ ⵏ ⵓⴽⵛⵛⵓⵎ â´°â´· ⵉⴳ ⴰⵎ ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⴰⵎⵔⴷⵓ, ⵜⵥⴹⴰⵔⴷ ⵓⵍⴰ â´°â´· ⵜⵙⵎⵔⵙⴷ $3 ⴰⵎ ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ â´· $4 ⴰⵎ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ.)", + "botpasswords-no-provider": "BotPasswordsSessionProvider ⵓⵔ ⵉⵍⵍⵉ.", + "botpasswords-restriction-failed": "ⵜⵉⴽⵔⵔⴰⴼⵉⵏ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⴰⵔ ⵙⴳⴷⴰⵍⵏⵜ ⴰⵣⴷⴰⵢ â´°â´·.", + "botpasswords-invalid-name": "ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵉⵜⵜⵓⴼⴽⴰⵏ ⵓⵔ ⴷⵉⴳⵙ ⵉⵏⴱⴹⵉ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ (\"$1\").", + "botpasswords-not-exist": "{{GENDER:$1|ⴰⵏⵙⵙⵎⵔⵙ|ⵜⴰⵏⵙⵙⵎⵔⵙⵜ}} \"$1\" ⵓⵔ ⵖⵓⵔⵙ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ ⵎⵎⵓ ⵉⵙⵎ \"$2\".", + "botpasswords-needs-reset": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏ ⵓⴱⵓⵜ \"$2\" ⵏ {{GENDER:$1|ⵓⵏⵙⵙⵎⵔⵙ|ⵜⵏⵙⵙⵎⵔⵙⵜ}} \"$1\" ⵉⵇⵇⴰⵏⴷ ⵜⵜⵡⴰⵍⵍⵙ.", + "resetpass_forbidden": "ⵜⵉⴳⵓⵔⵉⵡⵉⵏ ⵏ ⵓⵣⵔⴰⵢ ⵓⵔ ⵉⵥⴹⵉⵔ â´°â´· ⵜⵜⵡⴰⵙⵏⴼⵍⵏⵜ", + "resetpass_forbidden-reason": "ⵜⵉⴳⵓⵔⵉⵡⵉⵏ ⵏ ⵓⵣⵔⴰⵢ ⵓⵔ ⵉⵥⴹⵉⵔ â´°â´· ⵜⵜⵡⴰⵙⵏⴼⵍⵏⵜ: $1", + "resetpass-no-info": "ⵉⵇⵇⴰⵏⴽ ⵉⴷ â´°â´· ⵜⴽⵛⵎⴷ ⴼⴰⴷ â´°â´· ⵜⴽⵛⵎⴷ ⵙ ⵜⴰⵙⵏⴰ â´°â´· ⵙ ⵓⵙⵔⵉⴷ.", + "resetpass-submit-loggedin": "ⵙⵏⴼⵍ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ", "resetpass-submit-cancel": "ⵙⵔ", + "resetpass-wrong-oldpass": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⴽⵓⴷⴰⵏⵜ ⵏⵖ ⵜⴰⵎⵉⵔⴰⵏⵜ ⵓⵔ ⵜⵙⵖⵥⵏ.\nⵉⵥⴹⵉⵔ ⵉⵙ ⵢⴰⴷⵍⵍⵉ ⵜⵙⵏⴼⵍ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⴽ ⵏⵖ â´· ⵉⵙ ⵜⴻⵜⵜⵔⴷ ⴽⵔⴰ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⵎⴰⵢⵏⵓⵜ ⵜⴰⴽⵓⴷⴰⵏⵜ.", + "resetpass-recycled": "ⴰⵎⵓⵔ ⵏⴽ ⵙⵏⴼⵍ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⴽ ⵙ ⴽⵔⴰ ⵢⴰⴹⵏ ⵎⵉⵏ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⴽ ⵜⴰⵎⵉⵔⴰⵏⵜ.", + "resetpass-temp-emailed": "ⵜⴽⵛⵎⴷ ⵙ ⵢⴰⵏ ⵉⵏⵉⴳⵍ ⴰⴽⵓⴷⴰⵏ ⵏⵏⴰ â´°â´½ ⵏ ⵉⵜⵜⵢⴰⵣⴰⵏⵏ â´³ ⵡⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ.\nⴰⴼⴰⴷ â´°â´· ⵜⵙⵎⴷ ⴰⴽⵛⵛⵓⵎ ⵏⴽ, ⵉⵍⵍⴰ ⴼⵍⵍⴰⴽ â´°â´· ⵜⴼⴽⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⵎⴰⵢⵏⵓⵜ ⵖⵉⴷ:", + "resetpass-temp-password": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⴽⵓⴷⴰⵏⵜ", + "resetpass-abort-generic": "ⴰⵙⵏⴼⵍ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴳⴷⵍⵜ ⴽⵔⴰ ⵏ ⵜⵍⵇⵇⵉⵎⵜ.", "passwordreset": "ⵔⴰⵔ â´· ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ", "passwordreset-username": "ⵉⵙⵎ ⵏ ⵓⵙⵎⵔⴰⵙ:", + "passwordreset-domain": "ⵉⴳⵔ:", + "passwordreset-email": "ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ", + "passwordreset-emailtitle": "ⵉⴼⵔⵓⵔⵉⵜⵏ ⵏ ⵓⵎⵉⴹⴰⵏ â´³ {{SITENAME}}", + "passwordreset-emailtext-ip": "ⴽⵔⴰⵢⴰⵏ (ⵉⵔⵡⴰⵙ ⵉⵣⴷ ⴽⵢⵢⵉ ⵏⵉⵜ, ⵙⴳ ⵡⴰⵏⵙⴰ ⵏ IP â´°â´· $1) ⵉⵜⵜⵔ ⴰⵍⵍⴰⵙ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵉ {{SITENAME}} ($4). {{PLURAL:$3|ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ â´°â´· ⵉⵣⴷⵉ|ⵉⵎⵉⴹⴰⵏⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ â´°â´· ⵣⴷⵉⵏ}}\nâ´· ⵡⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ â´°â´·:\n\n$2\n\n{{PLURAL:$3|ⵜⴳⵓⵔⵉ â´°â´· ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⴽⵓⴷⴰⵏⵜ|ⵜⵉⴳⵓⵔⵉⵡⵉⵏ â´°â´· ⵏ ⵓⵣⵔⴰⵢ ⵜⵉⴽⵓⴷⴰⵏⵉⵏ}} ⵔⴰ â´°â´· ⵙⴰⵍⴰⵏⵜ â´³ {{PLURAL:$5|ⵢⴰⵏ ⵡⴰⵙ|$5 ⵡⵓⵙⵙⴰⵏ}}.\nⵉⵍⵍⴰ ⵖⴼⴽ â´° ⵜⴽⵛⵎⴷ ⵜⵙⵜⵉⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⵎⴰⵢⵏⵓⵜ. ⵉⵖ â´· ⴽⵔⴰⵢⴰⵏ ⵢⴰⴹⵏ â´°â´· ⵉⵜⴻⵜⵜⵔⵏ ⵎⴰⵢⴰⴷ, ⵏⵖ â´· ⵉⵖ ⵜⴽⵜⵉⵜ ⵖⴼ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⴽ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ, â´· ⵉⵖ ⴰⴽⴽⵯ ⵙⵓⵍ ⵓⵔ ⵜⵔⵉⴷ ⴰⵙ ⵜⵜ ⵜⵙⵙⵏⴼⵍⴷ, ⵜⵥⴹⴰⵔⴷ â´° ⵜⵏⵅⵍⴷ ⵜⵓⵣⵉⵏⵜ â´°â´· ⵜⵇⵇⵉⵎⴷ ⴰⵔ ⵜⵙⵎⵔⵙⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⴽ ⵜⴰⵇⴱⵓⵔⵜ.", + "passwordreset-emailtext-user": "ⴰⵏⵙⵙⵎⵔⵙ $1 â´³ {{SITENAME}} ⵉⵜⴻⵜⵜⵔ ⴰⵍⵍⴰⵙ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵉ {{SITENAME}}\n($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-emailsentusername": "ⵉⵖ ⵉⵍⵍⴰ ⴽⵔⴰ ⵏ ⵓⴰⵏⵙⴰ ⴰⵍⵉⵇⵟⵕⵓⵏⵉ â´· ⵉⵙⵎ â´°â´· ⵏ ⵓⵏⵙⵙⵎⵔⵙ, ⵢⴰⵜ ⵜⵓⵣⵉⵏⵜ ⵏⵡⴰⵍⵍⴰⵙ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵔⴰ ⵏ ⵜⵢⴰⵣⴰⵏ.", + "passwordreset-nocaller": "ⴽⵔⴰ ⵏ ⵓⵎⵖⵓⵔⵉ ⵉⵇⵇⴰⵏⴷ â´° ⵉⵜⵜⵓⴼⴽⴰ", + "passwordreset-nosuchcaller": "ⴰⵎⵖⵓⵔⵉ ⵓⵔ ⵉⵍⵍⴰ: $1", + "passwordreset-ignored": "ⴰⵍⵍⴰⵙ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵓⵔ ⵜⵜⵓⵙⵡⵓⴷⴷⴰ. ⵉⵔⵡⴰⵙ ⵉⵣⴷ ⵜⵜⴰ ⴽⵔⴰ ⵏ ⵓⵏⴼⴽⴰⵢ ⵓⵔ ⵉⵜⵜⵡⴰⵙⵏⴰⵎ?", + "passwordreset-invalidemail": "ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵓⴰⵔⴰⵙⵖⵣⵏ", + "passwordreset-nodata": "ⵓⵔ ⵉⵜⵜⵓⴼⴽⴰ ⵜⵜⴰ ⴽⵔⴰ ⵏ ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵓⵍⴰ ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ", + "changeemail": "ⵙⵙⵏⴼⵍ ⵏⵖ ⵜⴽⴽⵙⴷ ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ", + "changeemail-header": "ⵙⵎⴷ ⵜⵉⴼⵔⵜ ⵏ ⵉⵙⴼⴽⴰ â´°â´· ⵃⵎⴰ â´° ⵜⵙⵙⵏⴼⵍⴷ ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵏⴽ. ⵉⵖ ⵜⵔⵉⴷ â´°â´· ⵜⴽⴽⵙⴷ ⴰⵙⴷⴰⵢ ⵏⴳⵔ ⴽⵔⴰ ⵏ ⵡⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ â´· ⵓⵎⵉⴹⴰⵏ ⵏⴽ, ⴼⵍ ⴰⵏⵙⴰ ⵍⵉⴽⵟⵕⵓⵏⵉ ⴰⵎⴰⵢⵏⵓ ⵢⵓⵔⴰⵏ ⴽⵓⴷⵏⵏⴰ ⵜⵚⵚⴰⴼⴹⴷ ⵜⵉⴼⵔⵜ â´°â´· ⵏ ⵉⵙⴼⴽⴰ.", + "changeemail-no-info": "ⵉⵇⵇⴰⵏⴽ ⵉⴷ â´°â´· ⵜⴽⵛⵎⴷ ⵃⵎⴰ â´°â´· ⵜⴽⵛⵎⴷ ⵙ ⵜⴰⵙⵏⴰ â´°â´· ⵙ ⵓⵙⵔⵉⴷ.", + "changeemail-oldemail": "ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⴰⵎⵉⵔⴰⵏ:", "changeemail-newemail": "ⵉⵎⴰⵢⵍ ⴰⵎⴰⵢⵏⵓ:", + "changeemail-newemail-help": "ⴰⵊⵊ ⵉⴳⵔ â´°â´· ⵢⵓⵔⴰⵏ ⵉⵖ ⵜⵔⵉⴷ â´°â´· ⵜⴽⴽⵙⴷ ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵏⴽ. ⵓⵔ ⵔⴰ ⵙⵓⵍ ⵜⵉⵥⴹⵓⵔⴷ â´°â´· ⵜⵔⴰⵔⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵉⵖ ⵜⵜ ⵜⵜⵓⴷ â´· ⵓⵔ ⵔⴰ ⴽⵉⵏ ⵙⵓⵍ ⵍⴽⴽⵎⵏⵜ ⵜⵓⵣⵉⵏⵉⵏ ⵜⴰⵍⵉⵟⵕⵓⵏⵉⵜⵉⵏ ⵙⴳ ⵓⵡⵉⴽⵉ â´°â´· ⵉⵖ ⵜⴽⴽⵙⴷ ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵏⴽ.", "changeemail-none": "(ⵓⵍⴰ ⵢⴰⵏ)", + "changeemail-password": "ⴰⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⴽ â´³ {{SITENAME}}:", "bold_sample": "ⴰⴹⵔⵉⵙ ⴰⵣⵓⵔⴰⵔ", "bold_tip": "ⴰⴹⵔⵉⵙ ⴰⵣⵓⵔⴰⵔ", "italic_sample": "ⴰⴹⵔⵉⵙ ⵓⵣⵍⵉⴳ", @@ -348,6 +503,7 @@ "minoredit": "ⵡⴰ â´· ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ", "watchthis": "ⵎⵎⴰⵜⵔ ⵜⴰⵙⵏⴰ â´°â´·", "savearticle": "ⵃⴹⵓ ⵜⴰⵙⵏⴰ", + "publishpage": "ⴼⵙⵔ ⵜⴰⵙⵏⴰ", "publishchanges": "ⴼⵙⵔ ⵉⵙⵏⴼⵍⵏ", "savearticle-start": "ⵃⴹⵓ ⵜⴰⵙⵏⴰ", "savechanges-start": "ⵃⴹⵓ ⵉⵙⵏⴼⵍⵏ", @@ -379,7 +535,7 @@ "template-semiprotected": "(ⵜⵎⵃⴹⴰ ⵙ ⵓⴳⵣⵎⴰⵏ)", "hiddencategories": "ⵜⴰⵙⵏⴰ â´° â´· ⴰⴳⵎⴰⵎ ⵏ {{PLURAL:$1|1 ⵏⵜⵍ ⴰⵙⵎⵉⵍ|$1 ⵏⵜⵍ ⵉⵙⵎⵉⵍⵏ}}:", "permissionserrors": "ⴰⵙⵙⵓⵔⴳ ⵉⵣⴳⵜ", - "permissionserrorstext-withaction": "ⵓⵔ ⴷⴰⵔⴽ ⵜⵓⵔⴰⴳⵜ ⴰⴼⴰⴷ â´°â´· $2, ⵙ {{PLURAL:$1|reason|reasons}}:", + "permissionserrorstext-withaction": "ⵓⵔ ⴷⴰⵔⴽ ⵜⵓⵔⴰⴳⵜ ⴰⴼⴰⴷ â´°â´· $2, ⵙ {{PLURAL:$1|ⵓⵙⵔⴰⴳ|ⵉⵙⵔⴰⴳⵏ}} â´°â´·:", "recreate-moveddeleted-warn": "ⴰⵡⵢ ⵉⵜⵏⴰⵏ : ⵀⴰⵜ ⴰⵔ ⵜⵙⴽⴰⵔⴷ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵏⵏⴰ ⵜⵜ ⵏⵏ ⵉⴽⴽⴰⵏ ⵜⴻⵜⵜⵡⴰⴽⴽⵙ.\n\nⵏⵥⵉ â´³ ⵉⵙ ⵉⵙⵙⵏ â´°â´· ⵜⵙⵎⴷⴻⴷ â´³ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵖⴼ ⵜⴰⵙⵏⴰ â´°â´·. \nⵜⵉⵎⵙⵙⴽⵜⵉⵜⵉⵏ ⵏ ⵜⵓⴽⴽⵙⵉⵡⵉⵏ â´· ⵉⵙⵎⵓⵜⵜⵓⵢⵏ ⵏ ⵜⴰⵙⵏⴰ â´°â´·, ⵍⵍⴰⵏⵜ â´·â´° ⵉ ⵓⵙⵏⵖⵎⵙ :", "moveddeleted-notice": "ⵜⴰⵙⵏⴰ â´°â´· ⵜⴻⵜⵜⵡⴰⴽⴽⵙ.\nⵜⵉⵎⵙⵙⴽⵜⵉⵜⵉⵏ ⵏ ⵜⵓⴽⴽⵙⵉⵡⵉⵏ, ⵉⴼⵔⴰⴳⵏ â´· ⵉⵙⵎⵓⵜⵜⵓⵢⵏ ⵉⵜⵜⵓⴳⴰⵏ ⵉ ⵜⴰⵙⵏⴰ ⵜⵜⵓⵙⴽⴰⵏⴻⵏ â´³ ⵢⵉⵣⴷⴰⵔ ⴰⵎ ⵉⵙⴰⵖⵓⵍⵏ.", "content-model-wikitext": "wikitext", @@ -417,6 +573,7 @@ "diff-multi-sameuser": "({{PLURAL:$1|ⴽⵔⴰ ⵏ ⵓⵣⵣⵔⴰⵢ ⵉⵏⵏⵓⵎⵎⵙⵏ ⵉⵙⴽⵔ ⵓⵏⵙⵙⵎⵔⵙ ⵉⴳⴰⵏ ⵢⴰⵏ ⵓⵔ ⵜⴻⵜⵜⵓⵙⴽⴰⵏ|$1 ⴽⵔⴰ ⵏ ⵉⵣⵣⵔⴰⵢⵏ ⵉⵏⵏⵓⵎⵎⵙⵏ ⵉⵙⴽⵔ ⵓⵏⵙⵙⵎⵔⵙ ⵉⴳⴰⵏ ⵢⴰⵏ ⵓⵔ ⵜⵜⵓⵙⴽⴰⵏⴻⵏⵜ}})", "diff-multi-otherusers": "({{PLURAL:$1|ⵢⴰⵏ ⵓⵣⵣⵔⴰⵢ ⴰⵎⵏⵏⵓⵎⵎⵙ|$1 ⵏ ⵉⵣⵣⵔⴰⵢⵏ ⵉⵎⵏⵏⵓⵎⵎⵙⵏ}} ⵏ {{PLURAL:$2|ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵢⴰⴹⵏ|$2 ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ}} ⵓⵔ ⵉⵜⵜⵓⵙⴽⴰⵏⴻⵏ).", "searchresults": "ⵜⵉⵢⴰⴼⵓⵜⵉⵏ ⵏ ⵓⵔⵣⵣⵓ", + "search-filter-title-prefix-reset": "ⵔⵣⵓ ⵅⴼ ⵎⴰⵕⵕⴰ ⵜⴰⵙⵏⵉⵡⵉⵏ", "searchresults-title": "ⵜⵉⵢⴰⴼⵓⵜⵉⵏ ⵏ ⵓⵔⵣⵣⵓ ⵖⴼ \"$1\"", "prevn": "{{PLURAL:$1|$1}} ⵉⵎⵣⵡⵓⵔⴰ", "nextn": "{{PLURAL:$1|$1}} ⴰⵎⴹⴼⵉⵔ", @@ -461,20 +618,115 @@ "grouppage-bot": "{{ns:project}}:ⵉⵔⵓⴱⵓⵜⵏ", "grouppage-sysop": "{{ns:project}}:ⵉⵎⵙⵙⵓⴳⵓⵔⵏ", "right-edit": "ⵙⵏⴼⵍ ⵜⴰⵙⵏⵉⵡⵉⵏ", + "right-createpage": "ⵙⵏⴼⵍ ⵜⴰⵙⵏⵉⵡⵉⵏ (ⵜⵉⴷ ⵓⵔ ⵉⴳⵉⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ)", + "right-createtalk": "ⵙⵏⴼⵍ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ", + "right-createaccount": "ⵙⴽⵔ ⵉⵎⵉⴹⴰⵏⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ", + "right-move": "ⵙⵎⵎⴰⵜⵜⵉ ⵜⴰⵙⵏⵉⵡⵉⵏ", + "right-move-subpages": "ⵙⵎⵎⴰⵜⵜⵉ ⵜⴰⵙⵏⵉⵡⵉⵏ â´· ⵜⴰⴷⵓⵙⵏⵉⵡⵉⵏ ⵏⵏⵙⵏⵜ", + "right-move-rootuserpages": "ⵙⵎⵎⴰⵜⵜⵉ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵉⵏⵙⵙⵎⵔⴰⵙⵏ ⵜⵉⴷⵙⵍⴰⵏⵉⵏ", + "right-move-categorypages": "ⵙⵎⵎⴰⵜⵜⵉ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵉⵙⵎⵉⵍⵏ", + "right-movefile": "ⵙⵎⵎⴰⵜⵜⵉ ⵉⴼⴰⵢⵍⵓⵜⵏ", + "right-suppressredirect": "â´°â´· ⵓⵔ ⵜⴼⴼⴰⵍⵜ ⴰⵙⵡⵓⵔⵔⵉ ⵙⴳ ⵉⵙⵎ ⴰⵇⴱⵓⵔ ⴽⵓⴷ ⵏⵏⴰ ⵜⵙⵎⵎⵓⵜⵜⵉⴷ ⵜⴰⵙⵏⵉⵡⵉⵏ", "right-upload": "ⵙⴽⵜⵔ ⵉⴼⴰⵢⵍⵓⵜⵏ", + "right-reupload": "ⵚⵚⴼⴹ ⵉⴼⴰⵢⵍⵓⵜⵏ ⵍⵍⵉ ⵢⴰⴷⵍⵍⵉ ⵉⵍⵍⴰⵏ", "right-upload_by_url": "ⵙⴽⵜⵔ ⴰⴼⴰⵢⵍⵓ ⵙⴳ URL", "right-writeapi": "ⴰⵙⵙⵎⵔⵙ ⵏ API ⵉ ⵜⵉⵔⵔⴰ", "right-delete": "ⴽⴽⵙ ⵜⴰⵙⵏⵉⵡⵉⵏ", + "right-undelete": "ⵔⴰⵔ â´· ⵜⴰⵙⵏⴰ ⵍⵍⵉ ⵉⵜⵜⵡⴰⴽⴽⵙⵏ", + "right-suppressionlog": "ⵥⵕ ⵜⵉⵎⵙⴽⵜⵉⵜⵉⵏ ⵜⵓⵙⵍⵉⴳⵉⵏ", + "right-block": "ⴳⴷⵍ ⵉⵏⵙⵙⵎⵔⴰⵙⵏ ⵢⴰⴹⵏ ⵖⴼ ⵓⵙⵙⵏⴼⵍ", + "right-blockemail": "ⴳⴷⵍ ⴰⵏⵙⵙⵎⵔⵙ ⵖⴼ ⵡⴰⵣⴰⵏ ⵏ ⵉⵎⴰⵢⵍ", + "right-viewmywatchlist": "ⵙⴽⵏ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⵓⵔ ⵏⴽ", + "right-editmywatchlist": "ⵙⵏⴼⵍ ⵜⴰⵙⵏ ⵏ ⵓⴹⴼⵓⵔ ⵏⴽ. ⵙⵙⵏ ⵎⴰⵙ â´· ⵍⵔⴰ ⵏ ⵜⴰⴳⴰⵡⵉⵏ ⵔⴰ ⵏⵏ ⵙⵓⵍ ⵔⵏⵏⵓⵏⵜ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵎⵉⵏ ⴰⵣⵔⴼ â´°â´·.", + "right-viewmyprivateinfo": "ⵥⵕ ⵉⵙⴼⴽⴰ ⵏⴽ ⵓⵙⵍⵉⴳⵏ (ⴰⵎ ⴰⵏⵙⴰ ⵏⴽ, ⵉⵙⵎ ⵏⴽ ⵉⵎⵉⴷⵉ)", + "right-editmyprivateinfo": "ⵙⵏⴼⵍ ⵉⵙⴼⴽⴰ ⵏⴽ ⵓⵙⵍⵉⴳⵏ (ⴰⵎ ⴰⵏⵙⴰ ⵏⴽ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ, ⵉⵙⵎ ⵏⴽ ⵉⵎⵉⴷⵉ)", + "right-editmyoptions": "ⵙⵏⴼⵍ ⵉⵙⵎⵏⵢⵉⴼⵏ ⵏⴽ", + "right-rollback": "ⵙⵓⵔⵔⵉ ⵉⵙⵏⴼⵍⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⴰⵎⴳⴳⴰⵔⵓ ⵍⵍⵉ ⵉⵙⵏⴼⵍⵏ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵙⵜⴼⵙⵙⵉ", + "right-markbotedits": "ⵔⵛⵎ ⵉⵙⵏⴼⵍⵏ ⵏ ⵓⵙⵓⵔⵔⵉ ⴰⵎ ⵉⵙⵏⴼⵍⵏ ⵏ ⵓⴱⵓⵜ", + "right-mergehistory": "ⵣⴷⵉ ⴰⵎⵣⵔⵓⵢ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ", + "right-userrights": "ⵙⵏⴼⵍ ⴰⴽⴽⵯ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ", + "right-userrights-interwiki": "ⵙⵏⴼⵍ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ â´³ ⵉⵡⵉⴽⵉⵜⵏ ⵢⴰⴹⵏ", + "right-siteadmin": "ⵔⴳⵍ ⵏⵖ ⵔⵣⵎ ⵜⴰⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ", + "right-override-export-depth": "ⵙⵉⴼⴹ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴽⴷ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴷⵉⵜⵙⵏⵜ ⵉⵇⵇⵏⵏ ⴰⵔ ⵜⵉⵖⴱⵉ ⵏ 5", + "right-sendemail": "ⴰⵣⵏ ⵜⴰⵎⵢⴰⵣⴰⵏⵜ ⵜⴰⵍⵉⴽⵟⵕⵓⵏⵉⵜ ⵉ ⵉⵏⵙⵙⵎⵔⵙⵏ ⵢⴰⴹⵏⵉⵏ", + "right-managechangetags": "ⵙⵏⴼⵍⵓⵍ â´· ⵙⵡⵓⵔⵉ(ⵙⴱⴷ) [[Special:Tags|ⵉⵔⵛⵓⵎⵏ]]", + "right-applychangetags": "ⵙⵏⵉⵙ [[Special:Tags|ⵉⵔⵛⵓⵎⵏ]] ⴰⴽⴷ ⵉⵙⵏⴼⵍⵏ ⵏⵙⵏ", + "right-changetags": "ⵔⵏⵓ â´· ⴽⴽⵙ ⵙ ⵓⵏⴰⵎⴽ ⴰⵏⴼⴳⵓⵔⴰⵏ [[Special:Tags|ⵉⵔⵛⵓⵎⵏ]] â´³ ⵉⵎⵣⵣⵔⴰⵢⵏ ⵓⴼⵔⵉⴷⵏ â´· ⵉⵙⴽⵛⵓⵎⵏ ⵏ ⵜⵎⵙⴽⵜⵉⵜ", + "right-deletechangetags": "ⴽⴽⵙ [[Special:Tags|ⵉⵔⵛⵓⵎⵏ]] ⵙⴳ ⵜⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ", + "grant-generic": "\"$1\" ⵓⴽⵔⵉⵙ ⵏ ⵉⵣⵔⴼⴰⵏ", + "grant-group-page-interaction": "ⵜⴰⵎⵢⴰⵖⵜ â´· ⵜⴰⵙⵏⵉⵡⵉⵏ", + "grant-group-file-interaction": "ⵜⴰⵎⵢⴰⵖⵜ â´· ⵓⵙⵏⵖⵎⵙ", + "grant-group-watchlist-interaction": "ⵜⴰⵎⵢⴰⵖⵜ â´· ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⵓⵔ ⵏⴽ", + "grant-group-email": "ⴰⵣⵏ ⴰⵏⵙⵉⵡⵏ ⵉⵍⵉⴽⵟⵕⵓⵏⵉⵜⵏ", + "grant-group-high-volume": "ⵙⴽⵔ ⴰⵎⵓⵙⵙⵓ ⵏ ⵓⴽⵙⴰⵢ ⵎⵇⵇⵓⵔⵏ", + "grant-group-customization": "ⴰⵙⵏⵉⵎⴰⵏ â´· ⵉⵙⵎⵏⵢⵉⴼⵏ", + "grant-group-administration": "ⵙⴽⵔ ⵜⵉⴳⴰⵡⵉⵏ ⵜⵉⵎⵙⵙⵓⴳⵓⵔⵉⵏ", + "grant-group-private-information": "â´°â´·â´°â´¼ ⵙ ⵉⵙⴼⴽⴰ ⵓⵙⵍⵉⴳⵏ ⵖⵉⴼⴽ", + "grant-group-other": "ⵉⵎⵓⵙⵙⵓⵜⵏ ⵉⵎⵢⴰⵏⴰⵡⵏ", + "grant-blockusers": "ⴳⴷⵍ â´· ⴽⴽⵙ ⴰⴳⴷⵍ ⵖⴼ ⵉⵏⵙⵙⵎⵔⵙⵏ", + "grant-createaccount": "ⵙⵏⴼⵍⵓⵍ ⵉⵎⵉⴹⴰⵏⵏ", + "grant-createeditmovepage": "ⵙⵏⵍⴼⵓⵍ, ⵙⵏⴼⵍ, â´· ⵙⵎⵎⴰⵜⵜⵉ ⵜⴰⵙⵏⵉⵡⵉⵏ", + "grant-delete": "ⵜⵡⴽⴽⴰⵙⵜ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ, ⵉⵣⵣⵔⴰⵢⵏ â´· ⵉⵙⴽⵛⴰⵎ ⵏ ⵜⵎⵙⴽⵜⵉⵜ", + "grant-editinterface": "ⵙⵏⴼⵍ ⴰⴷⵖⴰⵔ ⵏ ⵉⵙⵎ ⵏ ⵎⵉⴷⵢⴰⵡⵉⴽⵉ â´· JSON ⵏ ⴰⵙⵉⵜ/ⴰⵏⵙⵙⵎⵔⵙ", "newuserlogpage": "ⴰⵔⵔⴰ ⵏ ⵉⵙⵏⴼⴰⵍⵏ ⵏ ⵉⵎⵉⴹⴰⵏⴻⵏ ⵏ ⵉⵙⵙⵎⵔⴰⵙⵏ", "rightslog": "ⵜⴰⵎⵙⵙⴽⵜⵉⵜ ⵏ ⵢⵉⵣⵔⴼⴰⵏ ⵏ ⵢⵉⵏⵙⵙⵔⵎⴰⵙⵏ", + "action-read": "ⵖⵔ ⵜⵙⵏⴰ â´°â´·", "action-edit": "ⵙⵏⴼⵍ ⵜⴰⵙⵏⴰ â´°", "action-createpage": "ⵙⵏⵓⵍⴼⵓ ⵜⴰⵙⵏⴰ â´°", + "action-createtalk": "ⵙⵏⴼⵍ ⵜⴰⵙⵏⴰ â´°â´· ⵏ ⵓⵎⵙⴰⵡⴰⵍ", "action-createaccount": "ⵙⴽⵔ ⴰⵎⵉⴹⴰⵏ â´°â´· ⵏ ⵓⵏⵙⵙⵎⵔⵙ", + "action-history": "ⵥⵕ ⴰⵎⵣⵔⵓⵢ ⵏ ⵜⴰⵙⵏⴰ â´°â´·", + "action-minoredit": "ⵔⵛⵎ ⴰⵙⵏⴼⵍ â´°â´· ⴰⵎ ⴰⵎⵥⵢⴰⵏ", + "action-move": "ⵙⵎⵎⴰⵜⵜⵉ ⵜⴰⵙⵏⴰ â´°â´·", + "action-move-subpages": "ⵙⵎⵎⴰⵜⵜⵉ ⵜⴰⵙⵏⴰ â´°â´· â´· ⵜⴰⴷⵓⵙⵏⵉⵡⵉⵏ ⵏⵙ", + "action-move-rootuserpages": "ⵙⵎⵎⴰⵜⵜⵉ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⴰⴷⵙⵍⴰⵏⵉⵏ ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ", + "action-move-categorypages": "ⵙⵎⵎⴰⵜⵜⵉ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵉⵙⵎⵉⵍⵏ", + "action-movefile": "ⵙⵎⵎⴰⵜⵜⵉ ⴰⴼⴰⵢⵍⵓ â´°â´·", + "action-upload": "ⵙⴽⵜⵔ ⴰⴼⴰⵢⵍⵓ â´°â´·", + "action-reupload": "ⵚⵚⴼⴹ ⴰⴼⴰⵢⵍⵓ ⵍⵍⵉ ⵢⴰⴷ ⵍⵍⵉ ⵉⵍⵍⴰⵏ", + "action-delete": "ⴽⴽⵙ ⵜⴰⵙⵏⴰ â´°â´·", + "action-deleterevision": "ⴽⴽⵙ ⴰⵣⵣⵔⴰⵢ â´°â´·", + "action-deletelogentry": "ⴽⴽⵙ ⵉⵙⴽⵛⴰⵎⵏ ⵏ ⵜⴰⵎⵙⵙⴽⵜⵉⵜ", + "action-deletedhistory": "ⵥⵕ ⴰⵎⵣⵔⵓⵢ ⵏ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵉⵜⵜⵡⴰⴽⴽⵙⵏ", + "action-deletedtext": "ⵥⵕ ⴰⵎⵣⵔⵓⵢ ⵏ ⵉⵣⵣⵔⴰⵢⵏ ⵉⵜⵜⵡⴰⴽⴽⵙⵏ", + "action-browsearchive": "ⵔⵣⵓ ⵖⴼ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵍⵍⵉ ⵉⵜⵜⵡⴰⴽⴽⵙⵏ", + "action-undelete": "ⵔⴰⵔ â´· ⵜⴰⵙⵏⵉⵡⵉⵏ", + "action-suppressrevision": "ⴰⵏⵏⴰⵢ â´· ⵔⴰⵔ â´· ⵉⵣⵣⵔⴰⵢⵏ ⵉⵏⵜⵍⵏ", + "action-suppressionlog": "ⵙⴽⵏ ⵜⴰⵎⵙⵙⴽⵜⵉⵜ â´°â´· ⵜⵓⵙⵍⵉⴳⵜ", + "action-block": "ⴳⴷⵍ ⴰⵏⵙⵙⵎⵔⴰⵙⵏ â´°â´· ⵖⴼ ⵓⵙⵙⵏⴼⵍ", + "action-protect": "ⵙⵏⴼⵍ ⴰⵙⵡⵉⵔ ⵏ ⵡⴰⵔⴰⵢ ⵏ ⵜⴰⵙⵏⴰ â´°â´·", + "action-rollback": "ⵙⵓⵔⵔⵉ ⵉⵙⵏⴼⵍⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⴰⵎⴳⴳⴰⵔⵓ ⵍⵍⵉ ⵉⵙⵏⴼⵍⵏ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵙⵜⴼⵙⵙⵉ", + "action-import": "ⴰⵙⴽⵛⵎ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵙⴳ ⵓⵡⵉⴽⵉ ⵢⴰⴹⵏ", + "action-importupload": "ⴰⵙⴽⵛⵎ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵙⴳ ⵓⵙⴽⵜⵔ ⵏ ⴽⵔⴰ ⵏ ⵓⴼⴰⵢⵍⵓ", + "action-patrol": "ⵔⵛⵎ ⵉⵙⵏⴼⵍⵏ ⵏ ⵡⵉⵢⵢⴰⴹ ⴰⵎ ⵉⵜⵜⵡⴰⵣⵣⵔⴰⵢ ⵖⵉⴼ ⵙⵏⵜ", + "action-autopatrol": "â´°â´· ⵉⵜⵜⵡⴰⵔⵛⵎ ⵓⵙⵏⴼⵍ ⵏⴽ ⴰⵎ ⵉⵜⵜⵡⴰⵣⵔⴰⵢ ⵖⵉⴼⵙ", + "action-unwatchedpages": "ⵥⵕ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵓⵔ ⵉⵜⵜⵡⴰⴹⴼⴰⵔⵏ", + "action-mergehistory": "ⵣⴷⵉ ⴰⵎⵣⵔⵓⵢ ⵏ ⵜⴰⵙⵏⴰ â´°â´·", + "action-userrights": "ⵙⵏⴼⵍ ⴰⴽⴽⵯ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ", + "action-userrights-interwiki": "ⵙⵏⴼⵍ ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵏⵙⵙⵎⵔⵙ â´³ ⵉⵡⵉⴽⵉⵜⵏ ⵢⴰⴹⵏ", + "action-siteadmin": "ⵔⴳⵍ ⵏⵖ ⵔⵣⵎ ⵜⴰⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ", + "action-sendemail": "ⴰⵣⵏ ⴰⵏⵙⵉⵡⵏ ⵉⵍⵉⴽⵟⵕⵓⵏⵉⵜⵏ", + "action-editmyoptions": "ⵙⵏⴼⵍ ⵉⵙⵎⵏⵢⵉⴼⵏ ⵏⴽ", + "action-editmywatchlist": "ⵙⵏⴼⵍ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⵓⵔ ⵏⴽ", + "action-viewmywatchlist": "ⵙⴽⵏ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⵓⵔ ⵏⴽ", + "action-viewmyprivateinfo": "ⵥⵕ ⵓⵎⵍⴰⵏ ⵏⴽ ⵓⵙⵍⵉⴳⵏ", + "action-editmyprivateinfo": "ⵙⵏⴼⵍ ⵓⵎⵍⴰⵏ ⵏⴽ ⵓⵙⵍⵉⴳⵏ", + "action-editcontentmodel": "ⵙⵏⴼⵍ ⴰⵣⵓⵔⵜ ⵏ ⵜⵓⵎⴰⵢⵜ ⵏ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ", + "action-managechangetags": "ⵙⵏⴼⵍ ⵏⵖ ⵙⵡⵓⵔⵉ(ⵙⴱⵉⴷ) ⵉⵔⵛⵓⵎⵏ", + "action-applychangetags": "ⵙⵏⵉⵙ ⵉⵔⵛⵓⵎⵏ ⴰⴽⴷ ⵉⵙⵏⴼⵍⵏ ⵏⴽ", + "action-changetags": "ⵔⵏⵓ â´· ⴽⴽⵙ ⵙ ⵓⵏⴰⵎⴽ ⴰⵏⴼⴳⵓⵔⴰⵏ ⵉⵔⵛⵓⵎⵏ ⵙⴳ ⵉⵎⵣⵣⵔⴰⵢⵏ ⵓⴼⵔⵉⴷⵏ â´· ⵉⵙⴽⵛⵓⵎⵏ ⵏ ⵜⵎⵙⴽⵜⵉⵜ", + "action-deletechangetags": "ⴽⴽⵙ ⵉⵔⵛⵓⵎⵏ ⵙⴳ ⵜⵙⵉⵍⴰ ⵏ ⵉⵙⴼⴽⴰ", + "action-purge": "ⵙⵙⵓⴳⵓ ⵜⴰⵙⵏⴰ â´°â´·", + "nchanges": "$1 {{PLURAL:$1|ⵓⵙⵏⴼⵍ|ⵉⵙⵏⴼⵍⵏ}}", + "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ⵙⴳ ⵓⵔⵣⴰⴼ ⴰⵎⴳⴳⴰⵔⵓ}}", "enhancedrc-history": "ⴰⵎⵣⵔⴰⵢ", "recentchanges": "ⵉⵙⵏⴼⵍⵏ ⵉⵎⴳⴳⵓⵔⴰ", "recentchanges-legend": "ⵜⵉⴷⵖⵔⵉⵏ ⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴳⴳⵓⵔⴰ", "recentchanges-summary": "ⴹⴼⵔ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵎⴳⴳⵓⵔⴰ ⴰⴽⴽ ⵖⴼ ⵓⵡⵉⴽⵉ â´·â´³ ⵜⴰⵙⵏⴰ â´°â´·.", "recentchanges-noresult": "ⵓⵔ ⵍⵍⵉⵏ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵎⵙⴰⵙⴰⵏ â´· ⵉⵙⴼⵔⴰⵏⴻⵏ â´³ ⵜⵉⵣⵉ ⵉⵜⵜⵓⴼⴽⴰⵏ.", + "recentchanges-timeout": "ⴰⵔⵣⵓ â´°â´· ⵉⵣⵔⵉ ⵜⵉⵣⵉ ⵏⵙ. ⵜⵣⴹⴰⵔⴷ â´°â´· ⵜⴰⵔⴷ ⵜⵉⵙⵖⴰⵍ ⵏ ⵓⵔⵣⵓ ⵢⴰⴹⵏⵉⵏ.", + "recentchanges-network": "ⵙ ⵓⵙⵔⴰⴳ ⵏ ⵓⵣⴳⴰⵍ ⴰⵜⵉⵇⵏⵉ, ⵓⵔ ⵜⵜⵢⴰⴼⴰ ⵃⵜⵜⴰ ⴽⵔⴰ ⵏ ⵜⵢⴰⴼⵓⵜ. ⵜⵣⴹⴰⵔⴷ â´°â´· ⵜⵙⵎⵉⵔⵏⵜ ⵜⴰⵙⵏⴰ.", + "recentchanges-notargetpage": "ⵙⴽⵛⵎ ⵉⵙⵎ ⵏ ⴽⵔⴰ ⵜⴰⵙⵏⴰ â´³ ⵓⴼⵍⵍⴰ ⵃⵎⴰ â´°â´· ⵜⵥⵕⴷ ⵉⵙⵏⴼⵍⵏ ⵉⵇⵇⵏ â´· ⵜⴰⵙⵏⴰ â´°â´·.", "recentchanges-feed-description": "ⴹⴼⵔ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵎⴳⴳⵓⵔⴰ ⴰⴽⴽ ⵖⴼ ⵓⵡⵉⴽⵉ â´·â´³ ⵜⴰⵙⵏⴰ â´°â´·.", "recentchanges-label-newpage": "ⵉⵙⵏⴼⵍⵓⵍ ⵓⵙⵏⴼⵍ â´° ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵜⴰⵎⴰⵢⵏⵓⵜ", "recentchanges-label-minor": "ⵡⴰ â´· ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ", @@ -483,8 +735,53 @@ "recentchanges-label-plusminus": "ⵜⴰⵙⵎⴽⵜⴰ ⵏ ⵜⴰⵙⵏⴰ â´°â´· ⵜⵙⵙⵏⴼⵍ ⵙ ⵓⵎⴹⴰⵏ â´°â´· ⵏ ⵉⴱⴰⵢⵜⵏ", "recentchanges-legend-heading": "ⴰⵙⵙⴼⵔⵓ:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ⵥⵔ ⴰⵍⵜⵓ [[Special:NewPages|ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ]])", + "recentchanges-submit": "ⵙⵎⴰⵍ", + "rcfilters-tag-remove": "ⴽⴽⵙ '$1'", + "rcfilters-legend-heading": "ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵉⵣⴳⵣⴰⵍⵏ:", + "rcfilters-other-review-tools": "ⵉⵎⴰⵙⵙⵏ ⵏ ⵓⵣⵣⵔⴰⵢ ⵢⴰⴹⵏⵉⵏ", + "rcfilters-group-results-by-page": "ⵙⵎⵓⵏ ⵜⴰⵢⴰⴼⵓⵜⵉⵏ ⵖⴼ ⵜⴰⵙⵏⴰ", + "rcfilters-activefilters": "ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ ⵉⵙⵡⵓⵔⵉⵏ", + "rcfilters-activefilters-hide": "ⵙⵙⵏⵜⵍ", + "rcfilters-activefilters-show": "ⵙⵎⴰⵍ", + "rcfilters-activefilters-hide-tooltip": "ⵙⵏⵜⵍ ⴰⴷⵖⴰⵔ ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜ ⵉⵙⵡⵓⵔⵉⵏ", + "rcfilters-activefilters-show-tooltip": "ⵙⵎⴰⵍ ⴰⴷⵖⴰⵔ ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜ ⵉⵙⵡⵓⵔⵉⵏ", + "rcfilters-advancedfilters": "ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵓⵏⵣⵉⵢⵏ", + "rcfilters-limit-title": "ⵜⴰⵢⴰⴼⵓⵜⵉⵏ ⵉⵜⵜⵡⴰⵙⴽⵏⵏ", + "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|ⵓⵙⵏⴼⵍ|ⵉⵙⵏⴼⵍⵏ}}, $2", + "rcfilters-date-popup-title": "ⵜⵉⵣⵉ ⵏ ⵡⴰⴽⵓⴷ ⵏ ⵓⵔⵣⵓ", "rcfilters-days-title": "ⵓⵙⵙⴰⵏ ⵉⵎⴳⴳⵓⵔⴰ", + "rcfilters-hours-title": "ⵜⵉⵙⵔⴰⴳⵉⵏ ⵜⵉⵎⴳⴳⵓⵔⴰ", "rcfilters-days-show-days": "$1 ⵏ {{PLURAL:$1|ⵡⴰⵙⵙ|ⵡⵓⵙⵙⴰⵏ}}", + "rcfilters-days-show-hours": "$1 {{PLURAL:$1|ⵜⵙⵔⴰⴳⵜ|ⵜⵙⵔⴰⴳⵉⵏ}}", + "rcfilters-quickfilters": "ⵜⵉⵎⵣⵉⵣⴷⴳⵜⵉⵏ ⵉⵜⵜⵡⴰⵃⴹⴰⵏ", + "rcfilters-quickfilters-placeholder-title": "ⵃⵜⵜⴰ ⴽⵔⴰ ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜ ⵓⵔⵜⴰ ⵜⵜⵡⴰⵃⴹⴰ", + "rcfilters-quickfilters-placeholder-description": "ⵃⵎⴰ â´°â´· ⵜⵃⴹⵓⴷ ⵜⵉⵙⵖⴰⵍ ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜⵉⵏ ⵏⴽ â´· â´° ⵜⵜⵏ ⵜⵙⵎⵔⵙⴷ â´³ ⵎⴰ â´°â´· ⵢⵓⵙⴰⵏ, ⴽⵍⵉⴽⵉ ⵖⴼ ⵉⴽⵓⵏ ⵏ ⵓⵙⴰⵏⴼ â´³ ⵓⴷⵖⴰⵔ ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜ ⵉⵙⵡⵓⵔⵉⵏ, â´³ ⵓⵣⴷⴷⴰⵔ.", + "rcfilters-savedqueries-defaultlabel": "ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵉⵜⵜⵡⴰⵃⴹⴰⵏ", + "rcfilters-savedqueries-rename": "ⴰⵍⵙ ⵉ ⵉⵙⵎ", + "rcfilters-savedqueries-setdefault": "ⵙⵡⵓⵔⵉ ⵙ ⵓⵎⵕⴰⴹ", + "rcfilters-savedqueries-unsetdefault": "ⴽⴽⵙ ⵙ ⵓⵎⵕⴰⴹ", + "rcfilters-savedqueries-remove": "ⴽⴽⵙ", + "rcfilters-savedqueries-new-name-label": "ⵉⵙⵎ", + "rcfilters-savedqueries-new-name-placeholder": "ⴳⵍⵎ ⴰⵡⵜⵜⴰⵙ ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜ", + "rcfilters-savedqueries-apply-label": "ⵙⵏⴼⵍ ⵜⵉⵎⵣⵉⵣⴷⴳⵜ", + "rcfilters-savedqueries-apply-and-setdefault-label": "ⵙⵏⴼⵍ ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵙ ⵓⵎⵕⴰⴹ", + "rcfilters-savedqueries-cancel-label": "ⵙⵙⵔ", + "rcfilters-savedqueries-add-new-title": "ⵃⴹⵓ ⵉⵙⵖⴰⵍ â´°â´· ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜ", + "rcfilters-savedqueries-already-saved": "ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ â´°â´· ⵜⵜⵡⴰⵃⴹⴰⵏⵜ ⵢⴰⴷ. ⵙⵏⴼⵍ ⵜⵉⵙⵖⴰⵍ ⵏⴽ ⵃⵎⴰ â´°â´· ⵜⵙⵏⴼⵍⴷ ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ ⵉⵜⵜⵡⴰⵃⴹⴰⵏ.", + "rcfilters-restore-default-filters": "ⵔⴰⵔ â´· ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ ⵙ ⵓⵎⵕⴰⴹ", + "rcfilters-clear-all-filters": "ⵚⵚⴼⴹ ⴰⴽⴽⵯ ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ", + "rcfilters-show-new-changes": "ⵙⴽⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ", + "rcfilters-search-placeholder": "ⵣⵉⵣⴷⵉⴳ ⵉⵙⵏⴼⵍⵏ (ⵙⵎⵔⵙ ⵓⵎⵓⵖ ⵏⵖ ⵔⵣⵓ ⵖⴼ ⵉⵙⵎ ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜ)", + "rcfilters-invalid-filter": "ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵓⵔ ⵉⵖⵥⴰⵏⵏ", + "rcfilters-empty-filter": "ⵃⵜⵜⴰ ⴽⵔⴰ ⵏ ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵉⵙⵡⵓⵔⵉⵏ. ⴰⴽⴽⵯ ⵉⵙⵏⵍⵏ ⵜⵜⵡⴰⵙⴽⵏⵏ.", + "rcfilters-filterlist-title": "ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ", + "rcfilters-filterlist-whatsthis": "ⵎⴰⵎⵏⴽ ⵙ â´° ⵉⵙⵡⵓⵔⵉ?", + "rcfilters-filterlist-feedbacklink": "ⵉⵏⵉ ⴰⵖ ⵎ â´°â´· â´°â´½ ⵉⴹⵀⵔⵏ â´³ ⵉⵎⴰⵙⵙⵏ â´°â´· ⵏ ⵓⵣⵉⵣⴷⴳ", + "rcfilters-highlightbutton-title": "ⵙⵎⵉⵜⴰⵔ ⵜⴰⵢⴰⴼⵓⵜⵉⵏ", + "rcfilters-highlightmenu-title": "ⵙⵜⵉ ⴽⵔⴰ ⵏ ⵓⴽⵍⵓ", + "rcfilters-highlightmenu-help": "ⵙⵜⵉ ⴽⵔⴰ ⵏ ⵓⴽⵍⵓ ⵃⵎⴰ â´°â´· ⵜⵙⵎⵉⵜⵔⴷ ⵜⵉⵍⵉⵜ â´°â´·", + "rcfilters-filterlist-noresults": "ⵃⵜⵜⴰ ⵢⴰⵜ ⵜⵎⵣⵉⵣⴷⴳⵜ ⵓⵔ ⵜⵢⴰⴼⴰ", + "rcfilters-noresults-conflict": "ⵃⵜⵜⴰ ⴽⵔⴰ ⵏ ⵜⵢⴰⴼⵓⵜ ⵓⵔ ⵜⵢⴰⴼⴰ ⵎⵉⵏⵣⵉ ⴰⵙⴱⴷⴰⴷ ⵏ ⵓⵔⵣⵓ ⵉⵍⵍⴰ ⵏⴳⵔⴰⵜⵙⵏ ⵓⵎⵏⵣⴰⵖ", "rcnotefrom": "â´³ ⵢⵉⵣⴷⴰⵔ {{PLURAL:$5|ⴰⵙⵏⴼⵍ ⵉⵜⵜⵓⵙⴽⴰⵔⵏ|ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵜⵜⵓⵙⴽⴰⵔⵏ}} ⵙⴳ $3, $4 (ⵉⵜⵜⵓⵙⴽⴰⵏⴻⵏ ⴰⵔ $1).", "rclistfrom": "ⵙⴽⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ ⵙⴳ $2,$3", "rcshowhideminor": "$1 ⵉⵙⵏⴼⴰⵍ ⵓⵎⵥⵉⵢⵏ", @@ -551,9 +848,9 @@ "filehist-dimensions": "ⵉⵎⵏⴰⴷⵏ", "filehist-comment": "ⴰⵖⴼⴰⵡⴰⵍ", "imagelinks": "ⴰⵙⵎⵔⵙ ⵏ ⵓⴼⴰⵢⵍⵓ", - "linkstoimage": "{{PLURAL:$1|ⵉⵣⴷⴰⵢⵏ ⵏ ⵜⵙⵏⴰ|$1 ⴰⵣⴷⴰⵢ ⵏ ⵜⵙⵏⴰ}} ⵖⵔ ⵓⴼⴰⵢⵍⵓ â´°â´·:", - "linkstoimage-more": "ⵓⴳⴳⴰⵔ ⵏ {{PLURAL:$1|ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ| $1 ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ â´°â´·.\nⵜⵙⴽⴰⵏ ⵜⵍⴳⴰⵎⵜ â´°â´· ⵖⴰⵙ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ ⵉⵙⵙⵎⵔⴰⵙⵏ $1 ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⵣⵡⴰⵔⴰ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ â´°â´·.\nⵜⵍⵍⴰ ⵢⴰⵜ [[Special:WhatLinksHere/$2|ⵜⴰⵍⴳⴰⵎⵜ ⵉⵎⴷⵏ]].", - "nolinkstoimage": "ⵓⵔ ⵍⵍⵉⵏⵜ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏⵏⴰ ⵉⵇⵇⵏⴻⵏ ⵖⵔ ⵓⴼⴰⵢⵍⵓ â´°.", + "linkstoimage": "{{PLURAL:$1|ⵜⴰⵙⵏⴰ â´°â´· ⵜⵙⵎⵔⵙ|$1 ⵜⴰⵙⵏⵉⵡⵉⵏ â´°â´· ⵙⵎⵔⵙⵏⵜ}} ⴰⴼⴰⵢⵍⵓ â´°â´·:", + "linkstoimage-more": "ⵓⴳⴳⴰⵔ ⵏ {{PLURAL:$1|ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ| $1 ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ â´°â´·.\nⵜⵙⴽⴰⵏ ⵜⵍⴳⴰⵎⵜ â´°â´· ⵖⴰⵙ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ ⵉⵙⵙⵎⵔⴰⵙⵏ| $1 ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⵣⵡⴰⵔⴰ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ â´°â´·.\nⵜⵍⵍⴰ ⵢⴰⵜ [[Special:WhatLinksHere/$2|ⵜⴰⵍⴳⴰⵎⵜ ⵉⵎⴷⵏ]].", + "nolinkstoimage": "ⵓⵔ ⵍⵍⵉⵏⵜ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏⵏⴰ ⵉⵙⵎⵔⵙⵏ ⴰⴼⴰⵢⵍⵓ â´°.", "linkstoimage-redirect": "$1 (ⴰⵙⵡⴰⵍⴰ ⵏ ⵓⴼⴰⵢⵍⵓ) $2", "sharedupload-desc-here": "ⴰⵙⴷⴰⵡ â´°â´· ⵙⴳ $1 ⵉⵥⴹⴰⵔ â´° ⵉⵜⵜⵡⴰⵙⵎⵔⵙ â´³ ⵉⵙⵏⵜⴰⵢⵏ ⵢⴰⴹⵏ.\nⴰⵙⵏⵓⵎⵎⵍ ⵏⵙ â´³ [$2 ⵜⴰⵙⵏⴰ ⵏⵙ ⵏ ⵓⵙⵏⵓⵎⵎⵍ] ⵜⵡⴰⵙⵎⴰⵍ ⵙⴰⴷⵓ.", "filepage-nofile": "ⵓⵔ ⵓⴼⴰⵢⵍⵓ ⵙ ⵢⵉⵙⵎ â´°.", diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json index 5e803982e2..10922a6ae9 100644 --- a/languages/i18n/zh-hans.json +++ b/languages/i18n/zh-hans.json @@ -462,6 +462,7 @@ "ns-specialprotected": "特殊页面不可编辑。", "titleprotected": "此标题已被[[User:$1|$1]]保护以防止创建。理由是$2。", "filereadonlyerror": "因为媒体库“$2”处于只读模式而无法修改文件“$1”。\n\n锁定数据库的系统管理员做出如下解释:“$3”。", + "invalidtitle": "无效标题", "invalidtitle-knownnamespace": "使用名字空间“$2”和文本“$3”的无效标题", "invalidtitle-unknownnamespace": "使用未知名字空间编号$1和文本“$2”的无效标题", "exception-nologin": "未登录", @@ -1870,9 +1871,9 @@ "filehist-filesize": "文件大小", "filehist-comment": "备注", "imagelinks": "文件用途", - "linkstoimage": "以下$1个页面链接至本文件:", - "linkstoimage-more": "超过$1个{{PLURAL:$1|页面链接至}}本文件。下面的列表只显示链接至本文件的{{PLURAL:$1|首个页面|前$1个页面}}。[[Special:WhatLinksHere/$2|完整列表]]。", - "nolinkstoimage": "没有页面链接到本文件。", + "linkstoimage": "以下{{PLURAL:$1|页面使用|$1个页面使用}}本文件:", + "linkstoimage-more": "超过$1个{{PLURAL:$1|页面使用}}本文件。下面的列表只显示使用本文件的{{PLURAL:$1|首个页面|前$1个页面}}。[[Special:WhatLinksHere/$2|完整列表]]。", + "nolinkstoimage": "没有页面使用本文件。", "morelinkstoimage": "查看连接到这个文件的[[Special:WhatLinksHere/$1|更多链接]]。", "linkstoimage-redirect": "$1(文件重定向)$2", "duplicatesoffile": "以下{{PLURAL:$1|文件|$1个文件}}是本文件的副本([[Special:FileDuplicateSearch/$2|更多细节]]):", @@ -2150,7 +2151,7 @@ "cachedspecial-refresh-now": "查看最新的。", "categories": "分类", "categories-submit": "显示", - "categoriespagetext": "以下{{PLURAL:$1|分类包含}}页面或媒体文件。[[Special:UnusedCategories|未使用分类]]不在这里显示。另请见[[Special:WantedCategories|需要的分类]]。", + "categoriespagetext": "以下{{PLURAL:$1|分类}}在wiki存在,并且可能被也可能未被使用。另见[[Special:WantedCategories|需要的分类]]。", "categoriesfrom": "显示分类开始于:", "deletedcontributions": "被删除的用户贡献", "deletedcontributions-title": "被删除的用户贡献", diff --git a/languages/i18n/zh-hant.json b/languages/i18n/zh-hant.json index eba36f7b7b..a55372c15b 100644 --- a/languages/i18n/zh-hant.json +++ b/languages/i18n/zh-hant.json @@ -99,7 +99,8 @@ "Dongzn", "Shangkuanlc", "Kanashimi", - "Hello903hello" + "Hello903hello", + "Luuva" ] }, "tog-underline": "底線標示連結:", @@ -311,7 +312,7 @@ "pool-errorunknown": "不明錯誤", "pool-servererror": "無法使用程序計數服務 ($1)。", "poolcounter-usage-error": "用法錯誤:$1", - "aboutsite": "關於 {{SITENAME}}", + "aboutsite": "關於{{SITENAME}}", "aboutpage": "Project:關於", "copyright": "除非另有註明,否則所有內容皆以 $1 條款授權。", "copyrightpage": "{{ns:project}}:版權", @@ -457,6 +458,7 @@ "ns-specialprotected": "特殊頁面無法編輯。", "titleprotected": "此標題已經被 [[User:$1|$1]] 保護以防止建立,原因是 $2。", "filereadonlyerror": "無法修改檔案 \"$1\" 因為檔案庫 \"$2\" 目前處於唯讀模式。\n\n鎖定的系統管理員說明:\"$3\"。", + "invalidtitle": "無效標題", "invalidtitle-knownnamespace": "命名空間 \"$2\" 與名稱 \"$3\" 是無效的標題", "invalidtitle-unknownnamespace": "不明的命名空間編號 $1 與名稱 \"$2\" 是無效的標題", "exception-nologin": "未登入", @@ -1127,7 +1129,7 @@ "default": "預設", "prefs-files": "檔案", "prefs-custom-css": "自訂 CSS", - "prefs-custom-json": "自定義 JSON", + "prefs-custom-json": "自訂 JSON", "prefs-custom-js": "自訂 JavaScript", "prefs-common-config": "所有外觀共用的 CSS/JSON/JavaScript:", "prefs-reset-intro": "您可以使用此頁面重設您的偏好設定為網站預設值。\n這個動作將無法復原。", @@ -1401,7 +1403,7 @@ "recentchanges-summary": "追蹤 Wiki 中此頁面的近期變更。", "recentchanges-noresult": "於指定時間內沒有符合條件的變更。", "recentchanges-timeout": "此搜尋已逾時。您可以採用不同的搜尋參數試試。", - "recentchanges-network": "由於技術方面的錯誤,沒有結果被載入。請嘗試重新整理頁面。", + "recentchanges-network": "由於技術錯誤,沒有載入任何結果。請嘗試重新整理頁面。", "recentchanges-notargetpage": "在上方輸入頁面名稱來查看相關於該頁面的變更。", "recentchanges-feed-description": "追蹤 Wiki 中此摘要的近期變更。", "recentchanges-label-newpage": "該編輯建立了新頁面", @@ -1727,7 +1729,7 @@ "upload-form-label-infoform-categories": "分類", "upload-form-label-infoform-date": "日期", "upload-form-label-own-work-message-generic-local": "我確定我上傳的檔案已遵守下列 {{SITENAME}} 的服務條款與授權條款。", - "upload-form-label-not-own-work-message-generic-local": "若您無法同意遵守 {{SITENAME}} 的政策上傳檔案,請關閉此對話框並嘗試其他方法。", + "upload-form-label-not-own-work-message-generic-local": "若您無法同意遵守{{SITENAME}}的政策上傳檔案,請關閉此對話框並嘗試其他方法。", "upload-form-label-not-own-work-local-generic-local": "您也可嘗試[[Special:Upload|預設的上傳頁面]]。", "upload-form-label-own-work-message-generic-foreign": "我明白我將上傳此檔案到一個共享的儲存庫,我確認已遵守本站的服務條款與授權政策。", "upload-form-label-not-own-work-message-generic-foreign": "若您無法同意遵守共享儲存庫的政策上傳檔案,請關閉此對話框並嘗試其他方法。", @@ -1864,9 +1866,9 @@ "filehist-filesize": "檔案大小", "filehist-comment": "備註", "imagelinks": "檔案用途", - "linkstoimage": "下列 {{PLURAL:$1|頁面連結|$1 個頁面連結}}到此檔案:", - "linkstoimage-more": "超過 $1 個{{PLURAL:$1|頁面連結|頁面連結}}到此檔案。\n下列清單只列出前 {{PLURAL:$1|1 筆連結|$1 筆連結}}到此檔案的頁面。\n您也可以檢視 [[Special:WhatLinksHere/$2|完整清單]]。", - "nolinkstoimage": "沒有頁面連結到此檔案。", + "linkstoimage": "下列{{PLURAL:$1|頁面|$1個頁面}}有用到此檔案:", + "linkstoimage-more": "超過 $1 個{{PLURAL:$1|頁面|頁面}}有用到此檔案。\n下列清單只列出{{PLURAL:$1|首個|前 $1 筆}}有用到此檔案的頁面。\n您也可以檢視[[Special:WhatLinksHere/$2|完整清單]]。", + "nolinkstoimage": "沒有使用此檔案的頁面。", "morelinkstoimage": "檢視連結到這個檔案的[[Special:WhatLinksHere/$1|更多連結]]。", "linkstoimage-redirect": "$1 (檔案重新導向) $2", "duplicatesoffile": "以下 $1 個檔案與此檔案重複 ([[Special:FileDuplicateSearch/$2|瞭解詳細資料]]):", @@ -2110,7 +2112,7 @@ "magiclink-tracking-isbn": "使用 ISBN 魔法連結的頁面", "magiclink-tracking-isbn-desc": "此頁面使用 ISBN 魔法連結的頁面,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] 的如何遷移。", "specialloguserlabel": "執行者:", - "speciallogtitlelabel": "目標 (標題或以 {{ns:user}}:使用者 表示使用者):", + "speciallogtitlelabel": "目標(標題或以 {{ns:user}}:使用者名稱 表示使用者):", "log": "日誌", "logeventslist-submit": "顯示", "logeventslist-more-filters": "顯示額外日誌:", @@ -2143,7 +2145,7 @@ "cachedspecial-refresh-now": "檢視最新版本。", "categories": "分類", "categories-submit": "顯示", - "categoriespagetext": "下列為包含頁面或媒體的{{PLURAL:$1|分類}}。\n[[Special:UnusedCategories|未使用的分類]] 不會在此顯示。\n請參考 [[Special:WantedCategories|需要的分類]]。", + "categoriespagetext": "下列為存在於 wiki 裡可能有、或可能沒被使用到的{{PLURAL:$1|分類|分類}}。\n請參考[[Special:WantedCategories|所需的分類]]。", "categoriesfrom": "顯示分類開始於:", "deletedcontributions": "已刪除的使用者貢獻", "deletedcontributions-title": "已刪除的使用者貢獻", @@ -2241,7 +2243,7 @@ "watchlistanontext": "請先登入以檢視或修改在監視清單的項目。", "watchnologin": "尚未登入", "addwatch": "新增至監視清單", - "addedwatchtext": "已於[[Special:Watchlist|您的監視清單]]新增頁面 \"[[:$1]]\" 及其討論頁面。\n未來對此頁面及其關聯的對話頁面的變更將會在此清單中列出。", + "addedwatchtext": "「[[:$1]]」及其討論頁已加入至您的[[Special:Watchlist|監視列表]]中。", "addedwatchtext-talk": "\"[[:$1]]\" 及相關的頁面已加入至您的 [[Special:Watchlist|監視清單]]。", "addedwatchtext-short": "已於您的監視清單新增頁面 \"$1\"。", "removewatch": "從監視清單中移除", @@ -2591,7 +2593,7 @@ "blocklog-showsuppresslog": "此使用者先前被封鎖並且隱藏過。\n以下為禁止顯示紀錄以供參考:", "blocklogentry": "已封鎖 [[$1]] 的期限至 $2 $3", "reblock-logentry": "變更 [[$1]] 的封鎖設定,到期時間為 $2 $3", - "blocklogtext": "此為使用者的封鎖及取消封鎖動作的記錄。\n未列出自動封鎖的 IP 位址。\n請參考 [[Special:BlockList|封鎖清單]] 中的目前正在作業的阻止與封鎖。", + "blocklogtext": "此為使用者的封鎖及取消封鎖動作的記錄。未列出自動封鎖的IP位址。請參考[[Special:BlockList|封鎖清單]]中的目前正在作業的阻止與封鎖。", "unblocklogentry": "已解除封鎖 $1", "block-log-flags-anononly": "僅限匿名使用者", "block-log-flags-nocreate": "停用帳號建立", @@ -2894,7 +2896,7 @@ "anonusers": "{{SITENAME}} 匿名{{PLURAL:$2|使用者}} $1", "creditspage": "頁面製作群", "nocredits": "此頁面沒有製作群資訊。", - "spamprotectiontitle": "垃圾訊息過濾程式", + "spamprotectiontitle": "垃圾連結過濾器", "spamprotectiontext": "您輸入文字內容已被垃圾訊息過濾程式禁止儲存,可能因您的內容包含了已封鎖的外部連結。", "spamprotectionmatch": "以下文字內容觸發垃圾訊息過濾程式:$1", "spambot_username": "MediaWiki 垃圾訊息清理", diff --git a/languages/i18n/zh-hk.json b/languages/i18n/zh-hk.json index 4b15837726..0331aef9d9 100644 --- a/languages/i18n/zh-hk.json +++ b/languages/i18n/zh-hk.json @@ -16,7 +16,8 @@ "Liuxinyu970226", "Quest for Truth", "Wxyveronica", - "和平至上" + "和平至上", + "A2093064" ] }, "tog-watchlisthidebots": "隱藏監視清單中機械人的編輯", @@ -67,7 +68,7 @@ "jumpto": "跳到:", "jumptonavigation": "導覽", "jumptosearch": "搜尋", - "aboutsite": "關於 {{SITENAME}}", + "aboutsite": "關於{{SITENAME}}", "aboutpage": "Project:關於我們", "disclaimers": "免責聲明", "disclaimerpage": "本專案:一般免責聲明", diff --git a/languages/messages/MessagesHyw.php b/languages/messages/MessagesHyw.php new file mode 100644 index 0000000000..59e9c869d2 --- /dev/null +++ b/languages/messages/MessagesHyw.php @@ -0,0 +1,11 @@ + [ '모든내올린파일', '모든내파일' ], 'Allpages' => [ '모든문서' ], 'ApiHelp' => [ 'Api도움말' ], + 'ApiSandbox' => [ 'Api연습장' ], 'Ancientpages' => [ '오래된문서' ], 'AutoblockList' => [ '자동차단목록' ], 'Badtitle' => [ '잘못된제목', '인식불가제목', '잘못된이름', '인식불가이름' ], @@ -159,6 +160,7 @@ $specialPageAliases = [ 'Recentchanges' => [ '최근바뀜' ], 'Recentchangeslinked' => [ '링크최근바뀜' ], 'Redirect' => [ '넘겨주기' ], + 'RemoveCredentials' => [ '자격증명삭제', '자격증명제거' ], 'ResetTokens' => [ '토큰재설정' ], 'Revisiondelete' => [ '특정판삭제' ], 'RunJobs' => [ '작업실행' ], @@ -174,6 +176,7 @@ $specialPageAliases = [ 'Uncategorizedpages' => [ '분류안된문서' ], 'Uncategorizedtemplates' => [ '분류안된틀' ], 'Undelete' => [ '삭제취소', '삭제된문서' ], + 'UnlinkAccounts' => [ '계정연결해제' ], 'Unlockdb' => [ 'DB잠금해제', 'DB잠금취소' ], 'Unusedcategories' => [ '안쓰는분류', '쓰이지않는분류' ], 'Unusedimages' => [ '안쓰는파일', '안쓰는그림', '쓰이지않는파일', '쓰이지않는그림' ], diff --git a/languages/messages/MessagesMnw.php b/languages/messages/MessagesMnw.php new file mode 100644 index 0000000000..eea4896110 --- /dev/null +++ b/languages/messages/MessagesMnw.php @@ -0,0 +1,10 @@ + 'Û°', # ۰ + '1' => 'Û±', # ۱ + '2' => 'Û²', # ۲ + '3' => 'Û³', # ۳ + '4' => 'Û´', # ۴ + '5' => 'Ûµ', # ۵ + '6' => 'Û¶', # ۶ + '7' => 'Û·', # ۷ + '8' => 'Û¸', # ۸ + '9' => 'Û¹', # ۹ + '%' => 'Ùª', # ٪ +]; diff --git a/languages/messages/MessagesTg_cyrl.php b/languages/messages/MessagesTg_cyrl.php index bd107f54cb..59706d5ff8 100644 --- a/languages/messages/MessagesTg_cyrl.php +++ b/languages/messages/MessagesTg_cyrl.php @@ -55,11 +55,11 @@ $datePreferenceMigrationMap = [ $dateFormats = [ 'dmy time' => 'H:i', 'dmy date' => 'j xg Y', - 'dmy both' => 'H:i، j xg Y', + 'dmy both' => 'H:i, j xg Y', 'persian time' => 'H:i', 'persian date' => 'xij xiF xiY', - 'persian both' => 'H:i، xij xiF xiY', + 'persian both' => 'H:i, xij xiF xiY', 'ISO 8601 time' => 'xnH:xni:xns', 'ISO 8601 date' => 'xnY-xnm-xnd', diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php index c4a7594405..63777343d5 100644 --- a/maintenance/Maintenance.php +++ b/maintenance/Maintenance.php @@ -85,6 +85,9 @@ abstract class Maintenance { // This is the list of arguments that were actually passed protected $mArgs = []; + // Allow arbitrary options to be passed, or only specified ones? + protected $mAllowUnregisteredOptions = false; + // Name of the script currently running protected $mSelf; @@ -210,6 +213,16 @@ abstract class Maintenance { */ abstract public function execute(); + /** + * Checks to see if a particular option in supported. Normally this means it + * has been registered by the script via addOption. + * @param string $name The name of the option + * @return bool true if the option exists, false otherwise + */ + protected function supportsOption( $name ) { + return isset( $this->mParams[$name] ); + } + /** * Add a parameter to the script. Will be displayed on --help * with the associated description @@ -238,8 +251,8 @@ abstract class Maintenance { } /** - * Checks to see if a particular param exists. - * @param string $name The name of the param + * Checks to see if a particular option exists. + * @param string $name The name of the option * @return bool */ protected function hasOption( $name ) { @@ -289,6 +302,15 @@ abstract class Maintenance { unset( $this->mParams[$name] ); } + /** + * Sets whether to allow unregistered options, which are options passed to + * a script that do not match an expected parameter. + * @param bool $allow Should we allow? + */ + protected function setAllowUnregisteredOptions( $allow ) { + $this->mAllowUnregisteredOptions = $allow; + } + /** * Set the description text. * @param string $text The text of the description @@ -511,7 +533,7 @@ abstract class Maintenance { # Generic (non script dependant) options: $this->addOption( 'help', 'Display this help message', false, false, 'h' ); - $this->addOption( 'quiet', 'Whether to supress non-error output', false, false, 'q' ); + $this->addOption( 'quiet', 'Whether to suppress non-error output', false, false, 'q' ); $this->addOption( 'conf', 'Location of LocalSettings.php, if not default', false, true ); $this->addOption( 'wiki', 'For specifying the wiki ID', false, true ); $this->addOption( 'globals', 'Output globals at the end of processing for debugging' ); @@ -974,6 +996,15 @@ abstract class Maintenance { $die = true; } } + if ( !$this->mAllowUnregisteredOptions ) { + # Check for unexpected options + foreach ( $this->mOptions as $opt => $val ) { + if ( !$this->supportsOption( $opt ) ) { + $this->error( "Unexpected option $opt!" ); + $die = true; + } + } + } if ( $die ) { $this->maybeHelp( true ); @@ -1118,7 +1149,7 @@ abstract class Maintenance { * Handle some last-minute setup here. */ public function finalSetup() { - global $wgCommandLineMode, $wgShowSQLErrors, $wgServer; + global $wgCommandLineMode, $wgServer, $wgShowExceptionDetails, $wgShowHostnames; global $wgDBadminuser, $wgDBadminpassword, $wgDBDefaultGroup; global $wgDBuser, $wgDBpassword, $wgDBservers, $wgLBFactoryConf; @@ -1177,7 +1208,8 @@ abstract class Maintenance { $this->afterFinalSetup(); - $wgShowSQLErrors = true; + $wgShowExceptionDetails = true; + $wgShowHostnames = true; Wikimedia\suppressWarnings(); set_time_limit( 0 ); diff --git a/maintenance/archives/patch-recentchanges-rc_this_oldid-index.sql b/maintenance/archives/patch-recentchanges-rc_this_oldid-index.sql new file mode 100644 index 0000000000..364256b9da --- /dev/null +++ b/maintenance/archives/patch-recentchanges-rc_this_oldid-index.sql @@ -0,0 +1,6 @@ +-- Add an index to recentchanges on rc_this_oldid +-- +-- T139012 +-- + +CREATE INDEX /*i*/rc_this_oldid ON /*_*/recentchanges(rc_this_oldid); \ No newline at end of file diff --git a/maintenance/benchmarks/Benchmarker.php b/maintenance/benchmarks/Benchmarker.php index e1eef07e07..1559ee959d 100644 --- a/maintenance/benchmarks/Benchmarker.php +++ b/maintenance/benchmarks/Benchmarker.php @@ -53,6 +53,9 @@ abstract class Benchmarker extends Maintenance { $this->startBench(); $count = $this->getOption( 'count', $this->defaultCount ); $verbose = $this->hasOption( 'verbose' ); + + // Normalise + $normBenchs = []; foreach ( $benchs as $key => $bench ) { // Shortcut for simple functions if ( is_callable( $bench ) ) { @@ -64,6 +67,25 @@ abstract class Benchmarker extends Maintenance { $bench['args'] = []; } + // Name defaults to name of called function + if ( is_string( $key ) ) { + $name = $key; + } else { + if ( is_array( $bench['function'] ) ) { + $name = get_class( $bench['function'][0] ) . '::' . $bench['function'][1]; + } else { + $name = strval( $bench['function'] ); + } + $name = sprintf( "%s(%s)", + $name, + implode( ', ', $bench['args'] ) + ); + } + + $normBenchs[$name] = $bench; + } + + foreach ( $normBenchs as $name => $bench ) { // Optional setup called outside time measure if ( isset( $bench['setup'] ) ) { call_user_func( $bench['setup'] ); @@ -72,6 +94,10 @@ abstract class Benchmarker extends Maintenance { // Run benchmarks $stat = new RunningStat(); for ( $i = 0; $i < $count; $i++ ) { + // Setup outside of time measure for each loop + if ( isset( $bench['setupEach'] ) ) { + $bench['setupEach'](); + } $t = microtime( true ); call_user_func_array( $bench['function'], $bench['args'] ); $t = ( microtime( true ) - $t ) * 1000; @@ -81,21 +107,6 @@ abstract class Benchmarker extends Maintenance { $stat->addObservation( $t ); } - // Name defaults to name of called function - if ( is_string( $key ) ) { - $name = $key; - } else { - if ( is_array( $bench['function'] ) ) { - $name = get_class( $bench['function'][0] ) . '::' . $bench['function'][1]; - } else { - $name = strval( $bench['function'] ); - } - $name = sprintf( "%s(%s)", - $name, - implode( ', ', $bench['args'] ) - ); - } - $this->addResult( [ 'name' => $name, 'count' => $stat->getCount(), @@ -162,4 +173,18 @@ abstract class Benchmarker extends Maintenance { $this->lang->formatSize( memory_get_peak_usage( true ) ) ) ); } + + /** + * @since 1.32 + * @param string $file Path to file (maybe compressed with gzip) + * @return string Contents of file + */ + protected function loadFile( $file ) { + $content = file_get_contents( $file ); + // Detect GZIP compression header + if ( substr( $content, 0, 2 ) === "\037\213" ) { + $content = gzdecode( $content ); + } + return $content; + } } diff --git a/maintenance/benchmarks/australia-untidy.html.gz b/maintenance/benchmarks/australia-untidy.html.gz deleted file mode 100644 index 148481da6f..0000000000 Binary files a/maintenance/benchmarks/australia-untidy.html.gz and /dev/null differ diff --git a/maintenance/benchmarks/benchmarkCSSMin.php b/maintenance/benchmarks/benchmarkCSSMin.php index a7d998d2d7..8e2acb2987 100644 --- a/maintenance/benchmarks/benchmarkCSSMin.php +++ b/maintenance/benchmarks/benchmarkCSSMin.php @@ -61,15 +61,6 @@ class BenchmarkCSSMin extends Benchmarker { ], ] ); } - - private function loadFile( $file ) { - $css = file_get_contents( $file ); - // Detect GZIP compression header - if ( substr( $css, 0, 2 ) === "\037\213" ) { - $css = gzdecode( $css ); - } - return $css; - } } $maintClass = BenchmarkCSSMin::class; diff --git a/maintenance/benchmarks/benchmarkJavaScriptMinifier.php b/maintenance/benchmarks/benchmarkJavaScriptMinifier.php new file mode 100644 index 0000000000..bb75660522 --- /dev/null +++ b/maintenance/benchmarks/benchmarkJavaScriptMinifier.php @@ -0,0 +1,57 @@ +addDescription( 'Benchmark for JavaScriptMinifier.' ); + $this->addOption( 'file', 'Path to JavaScript file (may be gzipped)', false, true ); + } + + public function execute() { + $file = $this->getOption( 'file', __DIR__ . '/jsmin/jquery-3.2.1.js.gz' ); + $filename = basename( $file ); + $content = $this->loadFile( $file ); + if ( $content === false ) { + $this->fatalError( 'Unable to open input file' ); + } + + $this->bench( [ + "minify ($filename)" => [ + 'function' => [ JavaScriptMinifier::class, 'minify' ], + 'args' => [ $content ], + ], + ] ); + } +} + +$maintClass = BenchmarkJavaScriptMinifier::class; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/benchmarks/benchmarkTidy.php b/maintenance/benchmarks/benchmarkTidy.php index f2939b33df..e9a30f9b1f 100644 --- a/maintenance/benchmarks/benchmarkTidy.php +++ b/maintenance/benchmarks/benchmarkTidy.php @@ -1,11 +1,13 @@ addOption( 'file', 'A filename which contains the input text', true, true ); + $this->addOption( 'file', 'Path to file containing the input text', false, true ); $this->addOption( 'driver', 'The Tidy driver name, or false to use the configured instance', false, true ); $this->addOption( 'tidy-config', 'JSON encoded value for the tidy configuration array', @@ -13,7 +15,8 @@ class BenchmarkTidy extends Maintenance { } public function execute() { - $html = file_get_contents( $this->getOption( 'file' ) ); + $file = $this->getOption( 'file', __DIR__ . '/tidy/australia-untidy.html.gz' ); + $html = $this->loadFile( $file ); if ( $html === false ) { $this->fatalError( "Unable to open input file" ); } @@ -35,8 +38,7 @@ class BenchmarkTidy extends Maintenance { } private function benchmark( $driver, $html ) { - global $wgContLang; - + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); $times = []; $innerCount = 10; $outerCount = 10; @@ -44,7 +46,7 @@ class BenchmarkTidy extends Maintenance { $t = microtime( true ); for ( $i = 0; $i < $innerCount; $i++ ) { $driver->tidy( $html ); - print $wgContLang->formatSize( memory_get_usage( true ) ) . "\n"; + print $contLang->formatSize( memory_get_usage( true ) ) . "\n"; } $t = ( ( microtime( true ) - $t ) / $innerCount ) * 1000; $times[] = $t; @@ -67,10 +69,9 @@ class BenchmarkTidy extends Maintenance { print "Median: $median ms\n"; print "Mean: $mean ms\n"; print "Maximum: $max ms\n"; - print "Memory usage: " . - $wgContLang->formatSize( memory_get_usage( true ) ) . "\n"; + print "Memory usage: " . $contLang->formatSize( memory_get_usage( true ) ) . "\n"; print "Peak memory usage: " . - $wgContLang->formatSize( memory_get_peak_usage( true ) ) . "\n"; + $contLang->formatSize( memory_get_peak_usage( true ) ) . "\n"; } } diff --git a/maintenance/benchmarks/benchmarkTitleValue.php b/maintenance/benchmarks/benchmarkTitleValue.php new file mode 100644 index 0000000000..6bd7953971 --- /dev/null +++ b/maintenance/benchmarks/benchmarkTitleValue.php @@ -0,0 +1,144 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +use MediaWiki\MediaWikiServices; + +require_once __DIR__ . '/Benchmarker.php'; + +/** + * Maintenance script that benchmarks TitleValue vs Title. + * + * @ingroup Benchmark + */ +class BenchmarkTitleValue extends Benchmarker { + + /** + * @var TitleFormatter + */ + private $titleFormatter; + /** + * @var TitleParser + */ + private $titleParser; + + /** + * @var string + */ + private $dbKey = 'FooBar'; + /** + * @var TitleValue + */ + private $titleValue; + /** + * @var Title + */ + private $title; + + /** + * @var string + */ + private $toParse; + + public function __construct() { + parent::__construct(); + $this->addDescription( 'Benchmark TitleValue vs Title.' ); + } + + public function execute() { + $this->titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter(); + $this->titleParser = MediaWikiServices::getInstance()->getTitleParser(); + $this->titleValue = $this->constructTitleValue(); + $this->title = $this->constructTitle(); + $this->toParse = 'Category:FooBar'; + $this->bench( [ + [ + 'function' => [ $this, 'constructTitleValue' ], + ], + [ + 'function' => [ $this, 'constructTitle' ], + ], + [ + 'function' => [ $this, 'constructTitleSafe' ], + ], + [ + 'function' => [ $this, 'getPrefixedTextTitleValue' ], + ], + [ + 'function' => [ $this, 'getPrefixedTextTitle' ], + ], + 'parseTitleValue cached' => [ + 'function' => [ $this, 'parseTitleValue' ], + 'setup' => [ $this, 'randomize' ], + ], + 'parseTitle cached' => [ + 'function' => [ $this, 'parseTitle' ], + 'setup' => [ $this, 'randomize' ], + ], + 'parseTitleValue no cache' => [ + 'function' => [ $this, 'parseTitleValue' ], + 'setupEach' => [ $this, 'randomize' ], + ], + 'parseTitle no cache' => [ + 'function' => [ $this, 'parseTitle' ], + 'setupEach' => [ $this, 'randomize' ], + ], + ] ); + } + + /** + * Use a different dbKey each time to avoid influence of Title caches + */ + protected function randomize() { + $this->dbKey = ucfirst( wfRandomString( 10 ) ); + } + + protected function constructTitleValue() { + return new TitleValue( NS_CATEGORY, $this->dbKey ); + } + + protected function constructTitle() { + return Title::makeTitle( NS_CATEGORY, $this->dbKey ); + } + + protected function constructTitleSafe() { + return Title::makeTitleSafe( NS_CATEGORY, $this->dbKey ); + } + + protected function getPrefixedTextTitleValue() { + // This is really showing TitleFormatter aka MediaWikiTitleCodec perf + return $this->titleFormatter->getPrefixedText( $this->titleValue ); + } + + protected function getPrefixedTextTitle() { + return $this->title->getPrefixedText(); + } + + protected function parseTitleValue() { + // This is really showing TitleParser aka MediaWikiTitleCodec perf + $this->titleParser->parseTitle( 'Category:' . $this->dbKey, NS_MAIN ); + } + + protected function parseTitle() { + Title::newFromText( 'Category:' . $this->dbKey ); + } +} + +$maintClass = BenchmarkTitleValue::class; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/benchmarks/jsmin/jquery-3.2.1.js.gz b/maintenance/benchmarks/jsmin/jquery-3.2.1.js.gz new file mode 100644 index 0000000000..2e8e9b23cf Binary files /dev/null and b/maintenance/benchmarks/jsmin/jquery-3.2.1.js.gz differ diff --git a/maintenance/benchmarks/tidy/australia-untidy.html.gz b/maintenance/benchmarks/tidy/australia-untidy.html.gz new file mode 100644 index 0000000000..148481da6f Binary files /dev/null and b/maintenance/benchmarks/tidy/australia-untidy.html.gz differ diff --git a/maintenance/categoryChangesAsRdf.php b/maintenance/categoryChangesAsRdf.php index bf7a22d52a..564f7ced1b 100644 --- a/maintenance/categoryChangesAsRdf.php +++ b/maintenance/categoryChangesAsRdf.php @@ -39,6 +39,20 @@ INSERT DATA { SPARQL; + /** + * Delete query + */ + const SPARQL_DELETE = <<initialize(); - $startTS = new MWTimestamp( $this->getOption( "start" ) ); + $endTS = new MWTimestamp( $this->getOption( "end" ) ); $now = new MWTimestamp(); @@ -143,13 +157,29 @@ SPARQLDI; $this->handleMoves( $dbr, $output ); // We need to handle restores too since delete may have happened in previous update. $this->handleRestores( $dbr, $output ); + // Process newly added pages $this->handleAdds( $dbr, $output ); - $this->handleChanges( $dbr, $output ); + // Process page edits + $this->handleEdits( $dbr, $output ); + // Process categorization changes + $this->handleCategorization( $dbr, $output ); // Update timestamp fwrite( $output, $this->updateTS( $this->endTS ) ); } + /** + * Get the text of SPARQL INSERT DATA clause + * @return string + */ + private function getInsertRdf() { + $rdfText = $this->getRdf(); + if ( !$rdfText ) { + return ""; + } + return sprintf( self::SPARQL_INSERT, $rdfText ); + } + /** * Get SPARQL for updating set of categories * @param IDatabase $dbr @@ -167,15 +197,15 @@ SPARQLDI; $this->writeParentCategories( $dbr, $pages ); } - return "# $mark\n" . sprintf( self::SPARQL_DELETE_INSERT, - $this->getRdf(), - implode( ' ', $deleteUrls ) ); + return "# $mark\n" . sprintf( self::SPARQL_DELETE, implode( ' ', $deleteUrls ) ) . + $this->getInsertRdf(); } /** - * Write data for a set of categories + * Write parent data for a set of categories. + * The list has the child categories. * @param IDatabase $dbr - * @param string[] $pages List of categories: id => title + * @param string[] $pages List of child categories: id => title */ private function writeParentCategories( IDatabase $dbr, $pages ) { foreach ( $this->getCategoryLinksIterator( $dbr, array_keys( $pages ) ) as $row ) { @@ -331,16 +361,17 @@ SPARQL; } /** - * Fetch categorization changes + * Fetch categorization changes or edits * @param IDatabase $dbr * @return BatchRowIterator */ - protected function getChangedCatsIterator( IDatabase $dbr ) { - $it = $this->setupChangesIterator( $dbr ); + protected function getChangedCatsIterator( IDatabase $dbr, $type ) { + $it = + $this->setupChangesIterator( $dbr ); $it->addConditions( [ 'rc_namespace' => NS_CATEGORY, 'rc_new' => 0, - 'rc_type' => [ RC_EDIT, RC_CATEGORIZE ], + 'rc_type' => $type, ] ); $this->addIndex( $it ); return $it; @@ -483,7 +514,7 @@ SPARQL; $this->writeParentCategories( $dbr, $pages ); - fwrite( $output, sprintf( self::SPARQL_INSERT, $this->getRdf() ) ); + fwrite( $output, $this->getInsertRdf() ); } } @@ -510,19 +541,26 @@ SPARQL; } $this->writeParentCategories( $dbr, $pages ); - fwrite( $output, sprintf( self::SPARQL_INSERT, $this->getRdf() ) ); + fwrite( $output, $this->getInsertRdf() ); } } /** + * Handle edits for category texts * @param IDatabase $dbr * @param resource $output */ - public function handleChanges( IDatabase $dbr, $output ) { - foreach ( $this->getChangedCatsIterator( $dbr ) as $batch ) { + public function handleEdits( IDatabase $dbr, $output ) { + // Editing category can change hidden flag and add new parents. + // TODO: it's pretty expensive to update all edited categories, and most edits + // aren't actually interesting for us. Some way to know which are interesting? + // We can capture recategorization on the next step, but not change in hidden status. + foreach ( $this->getChangedCatsIterator( $dbr, RC_EDIT ) as $batch ) { $pages = []; $deleteUrls = []; foreach ( $batch as $row ) { + // Note that on categorization event, cur_id points to + // the child page, not the parent category! if ( isset( $this->processed[$row->rc_cur_id] ) ) { // We already captured this one before continue; @@ -533,6 +571,121 @@ SPARQL; $deleteUrls[] = '<' . $this->categoriesRdf->labelToUrl( $row->rc_title ) . '>'; } + fwrite( $output, $this->getCategoriesUpdate( $dbr, $deleteUrls, $pages, "Edits" ) ); + } + } + + /** + * Handles categorization changes + * @param IDatabase $dbr + * @param resource $output + */ + public function handleCategorization( IDatabase $dbr, $output ) { + $processedTitle = []; + // Categorization change can add new parents and change counts + // for the parent category. + foreach ( $this->getChangedCatsIterator( $dbr, RC_CATEGORIZE ) as $batch ) { + /* + * Note that on categorization event, cur_id points to + * the child page, not the parent category! + * So we need to have a two-stage process, since we have ID from one + * category and title from another, and we need both for proper updates. + * TODO: For now, we do full update even though some data hasn't changed, + * e.g. parents for parent cat and counts for child cat. + */ + foreach ( $batch as $row ) { + $childPages[$row->rc_cur_id] = true; + $parentCats[$row->rc_title] = true; + } + + $joinConditions = [ + 'page_props' => [ + 'LEFT JOIN', + [ 'pp_propname' => 'hiddencat', 'pp_page = page_id' ], + ], + 'category' => [ + 'LEFT JOIN', + [ 'cat_title = page_title' ], + ], + ]; + + $pages = []; + $deleteUrls = []; + + if ( !empty( $childPages ) ) { + // Load child rows by ID + $childRows = $dbr->select( + [ 'page', 'page_props', 'category' ], + [ + 'page_id', + 'rc_title' => 'page_title', + 'pp_propname', + 'cat_pages', + 'cat_subcats', + 'cat_files', + ], + [ 'page_namespace' => NS_CATEGORY, 'page_id' => array_keys( $childPages ) ], + __METHOD__, + [], + $joinConditions + ); + foreach ( $childRows as $row ) { + if ( isset( $this->processed[$row->page_id] ) ) { + // We already captured this one before + continue; + } + $this->writeCategoryData( $row ); + $deleteUrls[] = '<' . $this->categoriesRdf->labelToUrl( $row->rc_title ) . '>'; + $this->processed[$row->page_id] = true; + } + } + + if ( !empty( $parentCats ) ) { + // Load parent rows by title + $joinConditions = [ + 'page' => [ + 'LEFT JOIN', + [ 'page_title = cat_title', 'page_namespace' => NS_CATEGORY ], + ], + 'page_props' => [ + 'LEFT JOIN', + [ 'pp_propname' => 'hiddencat', 'pp_page = page_id' ], + ], + ]; + + $parentRows = $dbr->select( + [ 'category', 'page', 'page_props' ], + [ + 'page_id', + 'rc_title' => 'cat_title', + 'pp_propname', + 'cat_pages', + 'cat_subcats', + 'cat_files', + ], + [ 'cat_title' => array_keys( $parentCats ) ], + __METHOD__, + [], + $joinConditions + ); + foreach ( $parentRows as $row ) { + if ( $row->page_id && isset( $this->processed[$row->page_id] ) ) { + // We already captured this one before + continue; + } + if ( isset( $processedTitle[$row->rc_title] ) ) { + // We already captured this one before + continue; + } + $this->writeCategoryData( $row ); + $deleteUrls[] = '<' . $this->categoriesRdf->labelToUrl( $row->rc_title ) . '>'; + if ( $row->page_id ) { + $this->processed[$row->page_id] = true; + } + $processedTitle[$row->rc_title] = true; + } + } + fwrite( $output, $this->getCategoriesUpdate( $dbr, $deleteUrls, $pages, "Changes" ) ); } } diff --git a/maintenance/cleanupCaps.php b/maintenance/cleanupCaps.php index 2b47056f7e..1b49f0e221 100644 --- a/maintenance/cleanupCaps.php +++ b/maintenance/cleanupCaps.php @@ -29,6 +29,8 @@ * @ingroup Maintenance */ +use MediaWiki\MediaWikiServices; + require_once __DIR__ . '/cleanupTable.inc'; /** @@ -71,12 +73,10 @@ class CleanupCaps extends TableCleanup { } protected function processRowToUppercase( $row ) { - global $wgContLang; - $current = Title::makeTitle( $row->page_namespace, $row->page_title ); $display = $current->getPrefixedText(); $lower = $row->page_title; - $upper = $wgContLang->ucfirst( $row->page_title ); + $upper = MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $row->page_title ); if ( $upper == $lower ) { $this->output( "\"$display\" already uppercase.\n" ); @@ -109,12 +109,10 @@ class CleanupCaps extends TableCleanup { } protected function processRowToLowercase( $row ) { - global $wgContLang; - $current = Title::makeTitle( $row->page_namespace, $row->page_title ); $display = $current->getPrefixedText(); $upper = $row->page_title; - $lower = $wgContLang->lcfirst( $row->page_title ); + $lower = MediaWikiServices::getInstance()->getContentLanguage()->lcfirst( $row->page_title ); if ( $upper == $lower ) { $this->output( "\"$display\" already lowercase.\n" ); diff --git a/maintenance/cleanupImages.php b/maintenance/cleanupImages.php index 90364e26e2..305a41dddc 100644 --- a/maintenance/cleanupImages.php +++ b/maintenance/cleanupImages.php @@ -25,6 +25,8 @@ * @ingroup Maintenance */ +use MediaWiki\MediaWikiServices; + require_once __DIR__ . '/cleanupTable.inc'; /** @@ -46,8 +48,6 @@ class CleanupImages extends TableCleanup { } protected function processRow( $row ) { - global $wgContLang; - $source = $row->img_name; if ( $source == '' ) { // Ye olde empty rows. Just kill them. @@ -64,11 +64,13 @@ class CleanupImages extends TableCleanup { // We also have some HTML entities there $cleaned = Sanitizer::decodeCharReferences( $cleaned ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + // Some are old latin-1 - $cleaned = $wgContLang->checkTitleEncoding( $cleaned ); + $cleaned = $contLang->checkTitleEncoding( $cleaned ); // Many of remainder look like non-normalized unicode - $cleaned = $wgContLang->normalize( $cleaned ); + $cleaned = $contLang->normalize( $cleaned ); $title = Title::makeTitleSafe( NS_FILE, $cleaned ); diff --git a/maintenance/cleanupTitles.php b/maintenance/cleanupTitles.php index 234e1b1f2a..7f0e340a4a 100644 --- a/maintenance/cleanupTitles.php +++ b/maintenance/cleanupTitles.php @@ -45,9 +45,8 @@ class TitleCleanup extends TableCleanup { * @param object $row */ protected function processRow( $row ) { - global $wgContLang; $display = Title::makeName( $row->page_namespace, $row->page_title ); - $verified = $wgContLang->normalize( $display ); + $verified = MediaWikiServices::getInstance()->getContentLanguage()->normalize( $display ); $title = Title::newFromText( $verified ); if ( !is_null( $title ) diff --git a/maintenance/cleanupWatchlist.php b/maintenance/cleanupWatchlist.php index 5e3aee7402..8e4a353df8 100644 --- a/maintenance/cleanupWatchlist.php +++ b/maintenance/cleanupWatchlist.php @@ -29,6 +29,8 @@ * @ingroup Maintenance */ +use MediaWiki\MediaWikiServices; + require_once __DIR__ . '/cleanupTable.inc'; /** @@ -58,10 +60,9 @@ class CleanupWatchlist extends TableCleanup { } protected function processRow( $row ) { - global $wgContLang; $current = Title::makeTitle( $row->wl_namespace, $row->wl_title ); $display = $current->getPrefixedText(); - $verified = $wgContLang->normalize( $display ); + $verified = MediaWikiServices::getInstance()->getContentLanguage()->normalize( $display ); $title = Title::newFromText( $verified ); if ( $row->wl_user == 0 || is_null( $title ) || !$title->equals( $current ) ) { diff --git a/maintenance/commandLine.inc b/maintenance/commandLine.inc index 8232d52947..bb1443f6eb 100644 --- a/maintenance/commandLine.inc +++ b/maintenance/commandLine.inc @@ -24,7 +24,7 @@ require_once __DIR__ . '/Maintenance.php'; // phpcs:ignore MediaWiki.NamingConventions.ValidGlobalName.wgPrefix -global $optionsWithArgs, $optionsWithoutArgs; +global $optionsWithArgs, $optionsWithoutArgs, $allowUnregisteredOptions; if ( !isset( $optionsWithArgs ) ) { $optionsWithArgs = []; @@ -32,19 +32,25 @@ if ( !isset( $optionsWithArgs ) ) { if ( !isset( $optionsWithoutArgs ) ) { $optionsWithoutArgs = []; } +if ( !isset( $allowUnregisteredOptions ) ) { + $allowUnregisteredOptions = false; +} class CommandLineInc extends Maintenance { public function __construct() { // phpcs:ignore MediaWiki.NamingConventions.ValidGlobalName.wgPrefix - global $optionsWithArgs, $optionsWithoutArgs; + global $optionsWithArgs, $optionsWithoutArgs, $allowUnregisteredOptions; parent::__construct(); + foreach ( $optionsWithArgs as $name ) { $this->addOption( $name, '', false, true ); } foreach ( $optionsWithoutArgs as $name ) { $this->addOption( $name, '', false, false ); } + + $this->setAllowUnregisteredOptions( $allowUnregisteredOptions ); } /** diff --git a/maintenance/convertLinks.php b/maintenance/convertLinks.php index 8cd029762f..af60eaa2ba 100644 --- a/maintenance/convertLinks.php +++ b/maintenance/convertLinks.php @@ -21,6 +21,8 @@ * @ingroup Maintenance */ +use MediaWiki\MediaWikiServices; + require_once __DIR__ . '/Maintenance.php'; /** @@ -75,8 +77,6 @@ class ConvertLinks extends Maintenance { return; } - global $wgContLang; - # counters etc $numBadLinks = $curRowsRead = 0; @@ -153,7 +153,8 @@ class ConvertLinks extends Maintenance { foreach ( $res as $row ) { $title = $row->cur_title; if ( $row->cur_namespace ) { - $title = $wgContLang->getNsText( $row->cur_namespace ) . ":$title"; + $title = MediaWikiServices::getInstance()->getContentLanguage()-> + getNsText( $row->cur_namespace ) . ":$title"; } $ids[$title] = $row->cur_id; $curRowsRead++; diff --git a/maintenance/createCommonPasswordCdb.php b/maintenance/createCommonPasswordCdb.php index de611ec7de..0aa8ce89f7 100644 --- a/maintenance/createCommonPasswordCdb.php +++ b/maintenance/createCommonPasswordCdb.php @@ -1,6 +1,6 @@ addArg( 'inputfile', 'List of passwords (one per line) to use or - for stdin', true ); $this->addArg( 'output', - "Location to write CDB file to (Try $IP/serialized/commonpasswords.cdb)", + "Location to write CDB file to (Try $IP/includes/password/commonpasswords.cdb)", true ); } diff --git a/maintenance/deleteEqualMessages.php b/maintenance/deleteEqualMessages.php index cd9ef11160..89885d29d7 100644 --- a/maintenance/deleteEqualMessages.php +++ b/maintenance/deleteEqualMessages.php @@ -19,6 +19,8 @@ * @ingroup Maintenance */ +use MediaWiki\MediaWikiServices; + require_once __DIR__ . '/Maintenance.php'; /** @@ -44,15 +46,14 @@ class DeleteEqualMessages extends Maintenance { * @param array &$messageInfo */ protected function fetchMessageInfo( $langCode, array &$messageInfo ) { - global $wgContLang; - + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); if ( $langCode ) { $this->output( "\n... fetching message info for language: $langCode" ); - $nonContLang = true; + $nonContentLanguage = true; } else { $this->output( "\n... fetching message info for content language" ); - $langCode = $wgContLang->getCode(); - $nonContLang = false; + $langCode = $contLang->getCode(); + $nonContentLanguage = false; } /* Based on SpecialAllmessages::reallyDoQuery #filter=modified */ @@ -60,12 +61,12 @@ class DeleteEqualMessages extends Maintenance { $l10nCache = Language::getLocalisationCache(); $messageNames = $l10nCache->getSubitemList( 'en', 'messages' ); // Normalise message names for NS_MEDIAWIKI page_title - $messageNames = array_map( [ $wgContLang, 'ucfirst' ], $messageNames ); + $messageNames = array_map( [ $contLang, 'ucfirst' ], $messageNames ); $statuses = AllMessagesTablePager::getCustomisedStatuses( - $messageNames, $langCode, $nonContLang ); + $messageNames, $langCode, $nonContentLanguage ); // getCustomisedStatuses is stripping the sub page from the page titles, add it back - $titleSuffix = $nonContLang ? "/$langCode" : ''; + $titleSuffix = $nonContentLanguage ? "/$langCode" : ''; foreach ( $messageNames as $key ) { $customised = isset( $statuses['pages'][$key] ); diff --git a/maintenance/deleteLocalPasswords.php b/maintenance/deleteLocalPasswords.php new file mode 100644 index 0000000000..8e54026154 --- /dev/null +++ b/maintenance/deleteLocalPasswords.php @@ -0,0 +1,27 @@ +addOption( 'quiet', 'Don\'t dump status reports to stderr.' ); + $this->addOption( 'full', 'Dump all revisions of every page' ); $this->addOption( 'current', 'Base ETA on number of pages in database instead of all revisions' ); $this->addOption( 'spawn', 'Spawn a subprocess for loading text records' ); $this->addOption( 'buffersize', 'Buffer size in bytes to use for reading the stub. ' . @@ -705,7 +706,6 @@ TEXT * @throws MWException */ private function getTextDb( $id ) { - global $wgContLang; if ( !isset( $this->db ) ) { throw new MWException( __METHOD__ . "No database available" ); } @@ -718,7 +718,8 @@ TEXT return false; } $stripped = str_replace( "\r", "", $text ); - $normalized = $wgContLang->normalize( $stripped ); + $normalized = MediaWikiServices::getInstance()->getContentLanguage()-> + normalize( $stripped ); return $normalized; } @@ -797,8 +798,6 @@ TEXT } private function getTextSpawnedOnce( $id ) { - global $wgContLang; - $ok = fwrite( $this->spawnWrite, "$id\n" ); // $this->progress( ">> $id" ); if ( !$ok ) { @@ -853,7 +852,8 @@ TEXT // Do normalization in the dump thread... $stripped = str_replace( "\r", "", $text ); - $normalized = $wgContLang->normalize( $stripped ); + $normalized = MediaWikiServices::getInstance()->getContentLanguage()-> + normalize( $stripped ); return $normalized; } diff --git a/maintenance/generateSitemap.php b/maintenance/generateSitemap.php index ff3e2fce1a..70fdebf403 100644 --- a/maintenance/generateSitemap.php +++ b/maintenance/generateSitemap.php @@ -26,6 +26,8 @@ * @see http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd */ +use MediaWiki\MediaWikiServices; + require_once __DIR__ . '/Maintenance.php'; /** @@ -316,7 +318,7 @@ class GenerateSitemap extends Maintenance { * Main loop */ public function main() { - global $wgContLang; + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); fwrite( $this->findex, $this->openIndex() ); @@ -327,7 +329,7 @@ class GenerateSitemap extends Maintenance { $length = $this->limit[0]; $i = $smcount = 0; - $fns = $wgContLang->getFormattedNsText( $namespace ); + $fns = $contLang->getFormattedNsText( $namespace ); $this->output( "$namespace ($fns)\n" ); $skippedRedirects = 0; // Number of redirects skipped for that namespace foreach ( $res as $row ) { @@ -358,10 +360,10 @@ class GenerateSitemap extends Maintenance { $length += strlen( $entry ); $this->write( $this->file, $entry ); // generate pages for language variants - if ( $wgContLang->hasVariants() ) { - $variants = $wgContLang->getVariants(); + if ( $contLang->hasVariants() ) { + $variants = $contLang->getVariants(); foreach ( $variants as $vCode ) { - if ( $vCode == $wgContLang->getCode() ) { + if ( $vCode == $contLang->getCode() ) { continue; // we don't want default variant } $entry = $this->fileEntry( diff --git a/maintenance/importDump.php b/maintenance/importDump.php index 965906f229..98344734d1 100644 --- a/maintenance/importDump.php +++ b/maintenance/importDump.php @@ -24,6 +24,8 @@ * @ingroup Maintenance */ +use MediaWiki\MediaWikiServices; + require_once __DIR__ . '/Maintenance.php'; /** @@ -131,13 +133,13 @@ TEXT } private function getNsIndex( $namespace ) { - global $wgContLang; - $result = $wgContLang->getNsIndex( $namespace ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $result = $contLang->getNsIndex( $namespace ); if ( $result !== false ) { return $result; } $ns = intval( $namespace ); - if ( strval( $ns ) === $namespace && $wgContLang->getNsText( $ns ) !== false ) { + if ( strval( $ns ) === $namespace && $contLang->getNsText( $ns ) !== false ) { return $ns; } $this->fatalError( "Unknown namespace text / index specified: $namespace" ); diff --git a/maintenance/includes/DeleteLocalPasswords.php b/maintenance/includes/DeleteLocalPasswords.php new file mode 100644 index 0000000000..e3f8926969 --- /dev/null +++ b/maintenance/includes/DeleteLocalPasswords.php @@ -0,0 +1,186 @@ + true or disable it + * completely before running this, otherwise it might recreate passwords. + * + * This class can also be used directly to just delete all local passwords, or those for a specific + * user. Deleting all passwords is useful when the wiki has used local password login in the past + * but it has been disabled. + */ +class DeleteLocalPasswords extends Maintenance { + /** @var string|null User to run on, or null for all. */ + protected $user; + + /** @var int Number of deleted passwords. */ + protected $total; + + public function __construct() { + parent::__construct(); + $this->mDescription = "Deletes local password for users."; + $this->setBatchSize( 1000 ); + + $this->addOption( 'user', 'If specified, only checks the given user', false, true ); + $this->addOption( 'delete', 'Really delete. To prevent accidents, you must provide this flag.' ); + $this->addOption( 'prefix', "Instead of deleting, make passwords invalid by prefixing with " + . "':null:'. Make sure PasswordConfig has a 'null' entry. This is meant for testing before " + . "hard delete." ); + $this->addOption( 'unprefix', 'Instead of deleting, undo the effect of --prefix.' ); + } + + protected function initialize() { + if ( + $this->hasOption( 'delete' ) + $this->hasOption( 'prefix' ) + + $this->hasOption( 'unprefix' ) !== 1 + ) { + $this->fatalError( "Exactly one of the 'delete', 'prefix', 'unprefix' options must be used\n" ); + } + if ( $this->hasOption( 'prefix' ) || $this->hasOption( 'unprefix' ) ) { + $passwordHashTypes = MediaWikiServices::getInstance()->getPasswordFactory()->getTypes(); + if ( + !isset( $passwordHashTypes['null'] ) + || $passwordHashTypes['null']['class'] !== InvalidPassword::class + ) { + $this->fatalError( +<<<'ERROR' +'null' password entry missing. To use password prefixing, add + $wgPasswordConfig['null'] = [ 'class' => InvalidPassword::class ]; +to your configuration (and remove once the passwords were deleted). +ERROR + ); + } + } + + $user = $this->getOption( 'user', false ); + if ( $user !== false ) { + $this->user = User::getCanonicalName( $user ); + if ( $this->user === false ) { + $this->fatalError( "Invalid user name\n" ); + } + } + } + + public function execute() { + $this->initialize(); + + foreach ( $this->getUserBatches() as $userBatch ) { + $this->processUsers( $userBatch, $this->getUserDB() ); + } + + $this->output( "done. (wrote $this->total rows)\n" ); + } + + /** + * Get the master DB handle for the current user batch. This is provided for the benefit + * of authentication extensions which subclass this and work with wiki farms. + */ + protected function getUserDB() { + return $this->getDB( DB_MASTER ); + } + + protected function processUsers( array $userBatch, IDatabase $dbw ) { + if ( !$userBatch ) { + return; + } + if ( $this->getOption( 'delete' ) ) { + $dbw->update( 'user', + [ 'user_password' => PasswordFactory::newInvalidPassword()->toString() ], + [ 'user_name' => $userBatch ], + __METHOD__ + ); + } elseif ( $this->getOption( 'prefix' ) ) { + $dbw->update( 'user', + [ 'user_password = ' . $dbw->buildConcat( [ $dbw->addQuotes( ':null:' ), + 'user_password' ] ) ], + [ + 'NOT (user_password ' . $dbw->buildLike( ':null:', $dbw->anyString() ) . ')', + "user_password != " . $dbw->addQuotes( PasswordFactory::newInvalidPassword()->toString() ), + 'user_password IS NOT NULL', + 'user_name' => $userBatch, + ], + __METHOD__ + ); + } elseif ( $this->getOption( 'unprefix' ) ) { + $dbw->update( 'user', + [ 'user_password = ' . $dbw->buildSubString( 'user_password', strlen( ':null:' ) + 1 ) ], + [ + 'user_password ' . $dbw->buildLike( ':null:', $dbw->anyString() ), + 'user_name' => $userBatch, + ], + __METHOD__ + ); + } + $this->total += $dbw->affectedRows(); + } + + /** + * This method iterates through the requested users and returns their names in batches of + * self::$mBatchSize. + * + * Subclasses should reimplement this and locate users who use the specific authentication + * method. The default implementation just iterates through all users. Extensions that work + * with wikifarm should also update self::getUserDB() as necessary. + * @return Generator + */ + protected function getUserBatches() { + if ( !is_null( $this->user ) ) { + $this->output( "\t ... querying '$this->user'\n" ); + yield [ $this->user ]; + return; + } + + $lastUsername = ''; + $dbw = $this->getDB( DB_MASTER ); + do { + $this->output( "\t ... querying from '$lastUsername'\n" ); + $users = $dbw->selectFieldValues( + 'user', + 'user_name', + [ + 'user_name > ' .$dbw->addQuotes( $lastUsername ), + ], + __METHOD__, + [ + 'LIMIT' => $this->getBatchSize(), + 'ORDER BY' => 'user_name ASC', + ] + ); + if ( $users ) { + yield $users; + $lastUsername = end( $users ); + } + } while ( count( $users ) === $this->getBatchSize() ); + } +} diff --git a/maintenance/jsduck/eg-iframe.html b/maintenance/jsduck/eg-iframe.html index 2c7cd68823..7913aab83b 100644 --- a/maintenance/jsduck/eg-iframe.html +++ b/maintenance/jsduck/eg-iframe.html @@ -35,7 +35,9 @@ ' + ], + 'Simple' => [ + 'EXAMPLE.label("foo");', + '' + ], + 'Ampersand' => [ + 'EXAMPLE.is(a && b);', + '' + ], + 'HTML' => [ + 'EXAMPLE.label("");', + '' + ], + 'Script closing string' => [ + 'EXAMPLE.label("");', + // Broken: First ends the script in HTML + '");/*]]>*/' + ], + 'CDATA string' => [ + 'EXAMPLE.label("&> CDATA ]]>");', + // Broken: Works in HTML, but is invalid XML. + '' + ], + ]; + } + + /** + * @dataProvider provideInlineScript + * @covers Html::inlineScript + */ + public function testInlineScript( $code, $expected ) { + $this->assertSame( Html::inlineScript( $code ), $expected ); + } } class HtmlTestValue { diff --git a/tests/phpunit/includes/MediaWikiServicesTest.php b/tests/phpunit/includes/MediaWikiServicesTest.php index 4189e93d6b..c838fc3165 100644 --- a/tests/phpunit/includes/MediaWikiServicesTest.php +++ b/tests/phpunit/includes/MediaWikiServicesTest.php @@ -1,22 +1,9 @@ [ 'BootstrapConfig', Config::class ], - 'ConfigFactory' => [ 'ConfigFactory', ConfigFactory::class ], - 'MainConfig' => [ 'MainConfig', Config::class ], - 'SiteStore' => [ 'SiteStore', SiteStore::class ], - 'SiteLookup' => [ 'SiteLookup', SiteLookup::class ], - 'StatsdDataFactory' => [ 'StatsdDataFactory', IBufferingStatsdDataFactory::class ], - 'PerDbNameStatsdDataFactory' => - [ 'PerDbNameStatsdDataFactory', IBufferingStatsdDataFactory::class ], - 'InterwikiLookup' => [ 'InterwikiLookup', InterwikiLookup::class ], - 'EventRelayerGroup' => [ 'EventRelayerGroup', EventRelayerGroup::class ], - 'SearchEngineFactory' => [ 'SearchEngineFactory', SearchEngineFactory::class ], - 'SearchEngineConfig' => [ 'SearchEngineConfig', SearchEngineConfig::class ], - 'SkinFactory' => [ 'SkinFactory', SkinFactory::class ], - 'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', Wikimedia\Rdbms\LBFactory::class ], - 'DBLoadBalancer' => [ 'DBLoadBalancer', Wikimedia\Rdbms\LoadBalancer::class ], - 'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ], - 'WatchedItemQueryService' => [ 'WatchedItemQueryService', WatchedItemQueryService::class ], - 'CryptRand' => [ 'CryptRand', CryptRand::class ], - 'CryptHKDF' => [ 'CryptHKDF', CryptHKDF::class ], - 'MediaHandlerFactory' => [ 'MediaHandlerFactory', MediaHandlerFactory::class ], - 'Parser' => [ 'Parser', Parser::class ], - 'ParserCache' => [ 'ParserCache', ParserCache::class ], - 'GenderCache' => [ 'GenderCache', GenderCache::class ], - 'LinkCache' => [ 'LinkCache', LinkCache::class ], - 'LinkRenderer' => [ 'LinkRenderer', LinkRenderer::class ], - 'LinkRendererFactory' => [ 'LinkRendererFactory', LinkRendererFactory::class ], - '_MediaWikiTitleCodec' => [ '_MediaWikiTitleCodec', MediaWikiTitleCodec::class ], - 'MimeAnalyzer' => [ 'MimeAnalyzer', MimeAnalyzer::class ], - 'TitleFormatter' => [ 'TitleFormatter', TitleFormatter::class ], - 'TitleParser' => [ 'TitleParser', TitleParser::class ], - 'ProxyLookup' => [ 'ProxyLookup', ProxyLookup::class ], - 'MainObjectStash' => [ 'MainObjectStash', BagOStuff::class ], - 'MainWANObjectCache' => [ 'MainWANObjectCache', WANObjectCache::class ], - 'LocalServerObjectCache' => [ 'LocalServerObjectCache', BagOStuff::class ], - 'VirtualRESTServiceClient' => [ 'VirtualRESTServiceClient', VirtualRESTServiceClient::class ], - 'ShellCommandFactory' => [ 'ShellCommandFactory', CommandFactory::class ], - 'BlobStoreFactory' => [ 'BlobStoreFactory', BlobStoreFactory::class ], - 'BlobStore' => [ 'BlobStore', BlobStore::class ], - '_SqlBlobStore' => [ '_SqlBlobStore', SqlBlobStore::class ], - 'RevisionStore' => [ 'RevisionStore', RevisionStore::class ], - 'RevisionLookup' => [ 'RevisionLookup', RevisionLookup::class ], - 'RevisionFactory' => [ 'RevisionFactory', RevisionFactory::class ], - 'ContentModelStore' => [ 'ContentModelStore', NameTableStore::class ], - 'SlotRoleStore' => [ 'SlotRoleStore', NameTableStore::class ], - 'HttpRequestFactory' => [ 'HttpRequestFactory', HttpRequestFactory::class ], - 'CommentStore' => [ 'CommentStore', CommentStore::class ], - 'ChangeTagDefStore' => [ 'ChangeTagDefStore', NameTableStore::class ], - 'ConfiguredReadOnlyMode' => [ 'ConfiguredReadOnlyMode', ConfiguredReadOnlyMode::class ], - 'ReadOnlyMode' => [ 'ReadOnlyMode', ReadOnlyMode::class ], - 'UploadRevisionImporter' => [ 'UploadRevisionImporter', UploadRevisionImporter::class ], - 'OldRevisionImporter' => [ 'OldRevisionImporter', OldRevisionImporter::class ], - 'WikiRevisionOldRevisionImporterNoUpdates' => - [ 'WikiRevisionOldRevisionImporterNoUpdates', ImportableOldRevisionImporter::class ], - 'ExternalStoreFactory' => [ 'ExternalStoreFactory', ExternalStoreFactory::class ], - 'PreferencesFactory' => [ 'PreferencesFactory', PreferencesFactory::class ], - 'ActorMigration' => [ 'ActorMigration', ActorMigration::class ], - 'ConfigRepository' => [ 'ConfigRepository', \MediaWiki\Config\ConfigRepository::class ], - 'MagicWordFactory' => [ 'MagicWordFactory', MagicWordFactory::class ], - ]; + global $IP; + $serviceList = require "$IP/includes/ServiceWiring.php"; + $ret = []; + foreach ( $serviceList as $name => $callback ) { + $fun = new ReflectionFunction( $callback ); + if ( !$fun->hasReturnType() ) { + throw new MWException( 'All service callbacks must have a return type defined, ' . + "none found for $name" ); + } + $ret[$name] = [ $name, $fun->getReturnType()->__toString() ]; + } + return $ret; } /** @@ -397,7 +335,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase { public function testDefaultServiceWiringServicesHaveTests() { global $IP; $testedServices = array_keys( $this->provideGetService() ); - $allServices = array_keys( include $IP . '/includes/ServiceWiring.php' ); + $allServices = array_keys( require "$IP/includes/ServiceWiring.php" ); $this->assertEquals( [], array_diff( $allServices, $testedServices ), @@ -405,4 +343,24 @@ class MediaWikiServicesTest extends MediaWikiTestCase { ); } + public function testGettersAreSorted() { + $methods = ( new ReflectionClass( MediaWikiServices::class ) ) + ->getMethods( ReflectionMethod::IS_STATIC | ReflectionMethod::IS_PUBLIC ); + + $names = array_map( function ( $method ) { + return $method->getName(); + }, $methods ); + $serviceNames = array_map( function ( $name ) { + return "get$name"; + }, array_keys( $this->provideGetService() ) ); + $names = array_values( array_filter( $names, function ( $name ) use ( $serviceNames ) { + return in_array( $name, $serviceNames ); + } ) ); + + $sortedNames = $names; + sort( $sortedNames ); + + $this->assertSame( $sortedNames, $names, + 'Please keep service getters sorted alphabetically' ); + } } diff --git a/tests/phpunit/includes/MediaWikiVersionFetcherTest.php b/tests/phpunit/includes/MediaWikiVersionFetcherTest.php index 87a7dffde1..cb234b2c31 100644 --- a/tests/phpunit/includes/MediaWikiVersionFetcherTest.php +++ b/tests/phpunit/includes/MediaWikiVersionFetcherTest.php @@ -10,13 +10,14 @@ * * @author Jeroen De Dauw < jeroendedauw@gmail.com > */ -class MediaWikiVersionFetcherTest extends PHPUnit\Framework\TestCase { +class MediaWikiVersionFetcherTest extends MediaWikiTestCase { use MediaWikiCoversValidator; public function testReturnsResult() { + global $wgVersion; $versionFetcher = new MediaWikiVersionFetcher(); - $this->assertInternalType( 'string', $versionFetcher->fetchVersion() ); + $this->assertSame( $wgVersion, $versionFetcher->fetchVersion() ); } } diff --git a/tests/phpunit/includes/MergeHistoryTest.php b/tests/phpunit/includes/MergeHistoryTest.php index 54db581c05..4544e9bed8 100644 --- a/tests/phpunit/includes/MergeHistoryTest.php +++ b/tests/phpunit/includes/MergeHistoryTest.php @@ -28,6 +28,12 @@ class MergeHistoryTest extends MediaWikiTestCase { */ public function testIsValidMerge( $source, $dest, $timestamp, $error ) { $this->setMwGlobals( 'wgContentHandlerUseDB', false ); + if ( $timestamp === true ) { + // Although this timestamp is after the latest timestamp of both pages, + // MergeHistory should select the latest source timestamp up to this which should + // still work for the merge. + $timestamp = time() + ( 24 * 3600 ); + } $mh = new MergeHistory( Title::newFromText( $source ), Title::newFromText( $dest ), @@ -45,10 +51,8 @@ class MergeHistoryTest extends MediaWikiTestCase { return [ // for MergeHistory::isValidMerge [ 'Test', 'Test2', false, true ], - // Although this timestamp is after the latest timestamp of both pages, - // MergeHistory should select the latest source timestamp up to this which should - // still work for the merge. - [ 'Test', 'Test2', strtotime( 'tomorrow' ), true ], + // Timestamp of `true` is a placeholder for "in the future"" + [ 'Test', 'Test2', true, true ], [ 'Test', 'Test', false, 'mergehistory-fail-self-merge' ], [ 'Nonexistant', 'Test2', false, 'mergehistory-fail-invalid-source' ], [ 'Test', 'Nonexistant', false, 'mergehistory-fail-invalid-dest' ], diff --git a/tests/phpunit/includes/MessageTest.php b/tests/phpunit/includes/MessageTest.php index 3e3d04aeed..d75c0e5410 100644 --- a/tests/phpunit/includes/MessageTest.php +++ b/tests/phpunit/includes/MessageTest.php @@ -1,6 +1,6 @@ setMwGlobals( 'wgRawHtml', true ); // We have to reset the core hook registration. // to register the html hook MessageCache::destroyInstance(); $this->setMwGlobals( 'wgParser', - ObjectFactory::constructClassInstance( $wgParserConf['class'], [ $wgParserConf ] ) - ); + MediaWikiServices::getInstance()->getParserFactory()->create() ); $msg = new RawMessage( '' ); $txt = '<html> tags cannot be' . diff --git a/tests/phpunit/includes/OutputPageTest.php b/tests/phpunit/includes/OutputPageTest.php index efd61a7f93..b0cefc7333 100644 --- a/tests/phpunit/includes/OutputPageTest.php +++ b/tests/phpunit/includes/OutputPageTest.php @@ -241,6 +241,35 @@ class OutputPageTest extends MediaWikiTestCase { '' . $op->headElement( $op->getContext()->getSkin() ) ); } + /** + * @covers OutputPage::getHeadItemsArray + * @covers OutputPage::addParserOutputMetadata + */ + public function testHeadItemsParserOutput() { + $op = $this->newInstance(); + $stubPO1 = $this->createParserOutputStub( 'getHeadItems', [ 'a' => 'b' ] ); + $op->addParserOutputMetadata( $stubPO1 ); + $stubPO2 = $this->createParserOutputStub( 'getHeadItems', + [ 'c' => '&', 'e' => 'f', 'a' => 'q' ] ); + $op->addParserOutputMetadata( $stubPO2 ); + $stubPO3 = $this->createParserOutputStub( 'getHeadItems', [ 'e' => 'g' ] ); + $op->addParserOutputMetadata( $stubPO3 ); + $stubPO4 = $this->createParserOutputStub( 'getHeadItems', [ 'x' ] ); + $op->addParserOutputMetadata( $stubPO4 ); + + $this->assertSame( [ 'a' => 'q', 'c' => '&', 'e' => 'g', 'x' ], + $op->getHeadItemsArray() ); + + $this->assertTrue( $op->hasHeadItem( 'a' ) ); + $this->assertTrue( $op->hasHeadItem( 'c' ) ); + $this->assertTrue( $op->hasHeadItem( 'e' ) ); + $this->assertTrue( $op->hasHeadItem( '0' ) ); + $this->assertFalse( $op->hasHeadItem( 'b' ) ); + + $this->assertContains( "\nq\n&\ng\nx\n", + '' . $op->headElement( $op->getContext()->getSkin() ) ); + } + /** * @covers OutputPage::addBodyClasses */ @@ -603,7 +632,16 @@ class OutputPageTest extends MediaWikiTestCase { * * @covers OutputPage::buildBacklinkSubtitle */ - public function testBuildBacklinkSubtitle( Title $title, $query, $contains, $notContains ) { + public function testBuildBacklinkSubtitle( $titles, $queries, $contains, $notContains ) { + if ( count( $titles ) > 1 ) { + // Not applicable + $this->assertTrue( true ); + return; + } + + $title = Title::newFromText( $titles[0] ); + $query = $queries[0]; + $this->editPage( 'Page 1', '' ); $this->editPage( 'Page 2', '#REDIRECT [[Page 1]]' ); @@ -624,12 +662,14 @@ class OutputPageTest extends MediaWikiTestCase { * @covers OutputPage::addBacklinkSubtitle * @covers OutputPage::getSubtitle */ - public function testAddBacklinkSubtitle( Title $title, $query, $contains, $notContains ) { + public function testAddBacklinkSubtitle( $titles, $queries, $contains, $notContains ) { $this->editPage( 'Page 1', '' ); $this->editPage( 'Page 2', '#REDIRECT [[Page 1]]' ); $op = $this->newInstance(); - $op->addBacklinkSubtitle( $title, $query ); + foreach ( $titles as $i => $unused ) { + $op->addBacklinkSubtitle( Title::newFromText( $titles[$i] ), $queries[$i] ); + } $str = $op->getSubtitle(); @@ -643,48 +683,813 @@ class OutputPageTest extends MediaWikiTestCase { } public function provideBacklinkSubtitle() { - $page1 = Title::newFromText( 'Page 1' ); - $page2 = Title::newFromText( 'Page 2' ); - return [ - [ $page1, [], [ 'Page 1' ], [ 'redirect', 'Page 2' ] ], - [ $page2, [], [ 'redirect=no' ], [ 'Page 1' ] ], - [ $page1, [ 'action' => 'edit' ], [ 'action=edit' ], [] ], + [ + [ 'Page 1' ], + [ [] ], + [ 'Page 1' ], + [ 'redirect', 'Page 2' ], + ], + [ + [ 'Page 2' ], + [ [] ], + [ 'redirect=no' ], + [ 'Page 1' ], + ], + [ + [ 'Page 1' ], + [ [ 'action' => 'edit' ] ], + [ 'action=edit' ], + [], + ], + [ + [ 'Page 1', 'Page 2' ], + [ [], [] ], + [ 'Page 1', 'Page 2', "
    \n\t\t\t\t" ], + [], + ], // @todo Anything else to test? ]; } /** + * @covers OutputPage::setPrintable + * @covers OutputPage::isPrintable + */ + public function testPrintable() { + $op = $this->newInstance(); + + $this->assertFalse( $op->isPrintable() ); + + $op->setPrintable(); + + $this->assertTrue( $op->isPrintable() ); + } + + /** + * @covers OutputPage::disable + * @covers OutputPage::isDisabled + */ + public function testDisable() { + $op = $this->newInstance(); + + $this->assertFalse( $op->isDisabled() ); + $this->assertNotSame( '', $op->output( true ) ); + + $op->disable(); + + $this->assertTrue( $op->isDisabled() ); + $this->assertSame( '', $op->output( true ) ); + } + + /** + * @covers OutputPage::showNewSectionLink + * @covers OutputPage::addParserOutputMetadata + */ + public function testShowNewSectionLink() { + $op = $this->newInstance(); + + $this->assertFalse( $op->showNewSectionLink() ); + + $po = new ParserOutput(); + $po->setNewSection( true ); + $op->addParserOutputMetadata( $po ); + + $this->assertTrue( $op->showNewSectionLink() ); + } + + /** + * @covers OutputPage::forceHideNewSectionLink + * @covers OutputPage::addParserOutputMetadata + */ + public function testForceHideNewSectionLink() { + $op = $this->newInstance(); + + $this->assertFalse( $op->forceHideNewSectionLink() ); + + $po = new ParserOutput(); + $po->hideNewSection( true ); + $op->addParserOutputMetadata( $po ); + + $this->assertTrue( $op->forceHideNewSectionLink() ); + } + + /** + * @covers OutputPage::setSyndicated + * @covers OutputPage::isSyndicated + */ + public function testSetSyndicated() { + $op = $this->newInstance(); + $this->assertFalse( $op->isSyndicated() ); + + $op->setSyndicated(); + $this->assertTrue( $op->isSyndicated() ); + + $op->setSyndicated( false ); + $this->assertFalse( $op->isSyndicated() ); + } + + /** + * @covers OutputPage::isSyndicated + * @covers OutputPage::setFeedAppendQuery + * @covers OutputPage::addFeedLink + * @covers OutputPage::getSyndicationLinks() + */ + public function testFeedLinks() { + $op = $this->newInstance(); + $this->assertSame( [], $op->getSyndicationLinks() ); + + $op->addFeedLink( 'not a supported format', 'abc' ); + $this->assertFalse( $op->isSyndicated() ); + $this->assertSame( [], $op->getSyndicationLinks() ); + + $feedTypes = $op->getConfig()->get( 'AdvertisedFeedTypes' ); + + $op->addFeedLink( $feedTypes[0], 'def' ); + $this->assertTrue( $op->isSyndicated() ); + $this->assertSame( [ $feedTypes[0] => 'def' ], $op->getSyndicationLinks() ); + + $op->setFeedAppendQuery( false ); + $expected = []; + foreach ( $feedTypes as $type ) { + $expected[$type] = $op->getTitle()->getLocalURL( "feed=$type" ); + } + $this->assertSame( $expected, $op->getSyndicationLinks() ); + + $op->setFeedAppendQuery( 'apples=oranges' ); + foreach ( $feedTypes as $type ) { + $expected[$type] = $op->getTitle()->getLocalURL( "feed=$type&apples=oranges" ); + } + $this->assertSame( $expected, $op->getSyndicationLinks() ); + } + + /** + * @covers OutputPage::setArticleFlag + * @covers OutputPage::isArticle + * @covers OutputPage::setArticleRelated + * @covers OutputPage::isArticleRelated + */ + function testArticleFlags() { + $op = $this->newInstance(); + $this->assertFalse( $op->isArticle() ); + $this->assertTrue( $op->isArticleRelated() ); + + $op->setArticleRelated( false ); + $this->assertFalse( $op->isArticle() ); + $this->assertFalse( $op->isArticleRelated() ); + + $op->setArticleFlag( true ); + $this->assertTrue( $op->isArticle() ); + $this->assertTrue( $op->isArticleRelated() ); + + $op->setArticleFlag( false ); + $this->assertFalse( $op->isArticle() ); + $this->assertTrue( $op->isArticleRelated() ); + + $op->setArticleFlag( true ); + $op->setArticleRelated( false ); + $this->assertFalse( $op->isArticle() ); + $this->assertFalse( $op->isArticleRelated() ); + } + + /** + * @covers OutputPage::addLanguageLinks + * @covers OutputPage::setLanguageLinks + * @covers OutputPage::getLanguageLinks + * @covers OutputPage::addParserOutputMetadata + */ + function testLanguageLinks() { + $op = $this->newInstance(); + $this->assertSame( [], $op->getLanguageLinks() ); + + $op->addLanguageLinks( [ 'fr:A', 'it:B' ] ); + $this->assertSame( [ 'fr:A', 'it:B' ], $op->getLanguageLinks() ); + + $op->addLanguageLinks( [ 'de:C', 'es:D' ] ); + $this->assertSame( [ 'fr:A', 'it:B', 'de:C', 'es:D' ], $op->getLanguageLinks() ); + + $op->setLanguageLinks( [ 'pt:E' ] ); + $this->assertSame( [ 'pt:E' ], $op->getLanguageLinks() ); + + $po = new ParserOutput(); + $po->setLanguageLinks( [ 'he:F', 'ar:G' ] ); + $op->addParserOutputMetadata( $po ); + $this->assertSame( [ 'pt:E', 'he:F', 'ar:G' ], $op->getLanguageLinks() ); + } + + // @todo Are these category links tests too abstract and complicated for what they test? Would + // it make sense to just write out all the tests by hand with maybe some copy-and-paste? + + /** + * @dataProvider provideGetCategories + * * @covers OutputPage::addCategoryLinks * @covers OutputPage::getCategories + * @covers OutputPage::getCategoryLinks + * + * @param array $args Array of form [ category name => sort key ] + * @param array $fakeResults Array of form [ category name => value to return from mocked + * LinkBatch ] + * @param callback $variantLinkCallback Callback to replace findVariantLink() call + * @param array $expectedNormal Expected return value of getCategoryLinks['normal'] + * @param array $expectedHidden Expected return value of getCategoryLinks['hidden'] */ - public function testGetCategories() { - $fakeResultWrapper = new FakeResultWrapper( [ - (object)[ - 'pp_value' => 1, - 'page_title' => 'Test' - ], - (object)[ - 'page_title' => 'Test2' - ] - ] ); + public function testAddCategoryLinks( + array $args, array $fakeResults, callable $variantLinkCallback = null, + array $expectedNormal, array $expectedHidden + ) { + $expectedNormal = $this->extractExpectedCategories( $expectedNormal, 'add' ); + $expectedHidden = $this->extractExpectedCategories( $expectedHidden, 'add' ); + + $op = $this->setupCategoryTests( $fakeResults, $variantLinkCallback ); + + $op->addCategoryLinks( $args ); + + $this->doCategoryAsserts( $op, $expectedNormal, $expectedHidden ); + $this->doCategoryLinkAsserts( $op, $expectedNormal, $expectedHidden ); + } + + /** + * @dataProvider provideGetCategories + * + * @covers OutputPage::addCategoryLinks + * @covers OutputPage::getCategories + * @covers OutputPage::getCategoryLinks + */ + public function testAddCategoryLinksOneByOne( + array $args, array $fakeResults, callable $variantLinkCallback = null, + array $expectedNormal, array $expectedHidden + ) { + if ( count( $args ) <= 1 ) { + // @todo Should this be skipped instead of passed? + $this->assertTrue( true ); + return; + } + + $expectedNormal = $this->extractExpectedCategories( $expectedNormal, 'onebyone' ); + $expectedHidden = $this->extractExpectedCategories( $expectedHidden, 'onebyone' ); + + $op = $this->setupCategoryTests( $fakeResults, $variantLinkCallback ); + + foreach ( $args as $key => $val ) { + $op->addCategoryLinks( [ $key => $val ] ); + } + + $this->doCategoryAsserts( $op, $expectedNormal, $expectedHidden ); + $this->doCategoryLinkAsserts( $op, $expectedNormal, $expectedHidden ); + } + + /** + * @dataProvider provideGetCategories + * + * @covers OutputPage::setCategoryLinks + * @covers OutputPage::getCategories + * @covers OutputPage::getCategoryLinks + */ + public function testSetCategoryLinks( + array $args, array $fakeResults, callable $variantLinkCallback = null, + array $expectedNormal, array $expectedHidden + ) { + $expectedNormal = $this->extractExpectedCategories( $expectedNormal, 'set' ); + $expectedHidden = $this->extractExpectedCategories( $expectedHidden, 'set' ); + + $op = $this->setupCategoryTests( $fakeResults, $variantLinkCallback ); + + $op->setCategoryLinks( [ 'Initial page' => 'Initial page' ] ); + $op->setCategoryLinks( $args ); + + // We don't reset the categories, for some reason, only the links + $expectedNormalCats = array_merge( [ 'Initial page' ], $expectedNormal ); + $expectedCats = array_merge( $expectedHidden, $expectedNormalCats ); + + $this->doCategoryAsserts( $op, $expectedNormalCats, $expectedHidden ); + $this->doCategoryLinkAsserts( $op, $expectedNormal, $expectedHidden ); + } + + /** + * @dataProvider provideGetCategories + * + * @covers OutputPage::addParserOutputMetadata + * @covers OutputPage::getCategories + * @covers OutputPage::getCategoryLinks + */ + public function testParserOutputCategoryLinks( + array $args, array $fakeResults, callable $variantLinkCallback = null, + array $expectedNormal, array $expectedHidden + ) { + $expectedNormal = $this->extractExpectedCategories( $expectedNormal, 'pout' ); + $expectedHidden = $this->extractExpectedCategories( $expectedHidden, 'pout' ); + + $op = $this->setupCategoryTests( $fakeResults, $variantLinkCallback ); + + $stubPO = $this->createParserOutputStub( 'getCategories', $args ); + + $op->addParserOutputMetadata( $stubPO ); + + $this->doCategoryAsserts( $op, $expectedNormal, $expectedHidden ); + $this->doCategoryLinkAsserts( $op, $expectedNormal, $expectedHidden ); + } + + /** + * We allow different expectations for different tests as an associative array, like + * [ 'set' => [ ... ], 'default' => [ ... ] ] if setCategoryLinks() will give a different + * result. + */ + private function extractExpectedCategories( array $expected, $key ) { + if ( !$expected || isset( $expected[0] ) ) { + return $expected; + } + return $expected[$key] ?? $expected['default']; + } + + private function setupCategoryTests( + array $fakeResults, callable $variantLinkCallback = null + ) : OutputPage { + $this->setMwGlobals( 'wgUsePigLatinVariant', true ); + $op = $this->getMockBuilder( OutputPage::class ) ->setConstructorArgs( [ new RequestContext() ] ) ->setMethods( [ 'addCategoryLinksToLBAndGetResult' ] ) ->getMock(); + $op->expects( $this->any() ) ->method( 'addCategoryLinksToLBAndGetResult' ) - ->will( $this->returnValue( $fakeResultWrapper ) ); + ->will( $this->returnCallback( function ( array $categories ) use ( $fakeResults ) { + $return = []; + foreach ( $categories as $category => $unused ) { + if ( isset( $fakeResults[$category] ) ) { + $return[] = $fakeResults[$category]; + } + } + return new FakeResultWrapper( $return ); + } ) ); + + if ( $variantLinkCallback ) { + $mockContLang = $this->getMockBuilder( Language::class ) + ->setConstructorArgs( [ 'en' ] ) + ->setMethods( [ 'findVariantLink' ] ) + ->getMock(); + $mockContLang->expects( $this->any() ) + ->method( 'findVariantLink' ) + ->will( $this->returnCallback( $variantLinkCallback ) ); + $this->setContentLang( $mockContLang ); + } - $op->addCategoryLinks( [ - 'Test' => 'Test', - 'Test2' => 'Test2', + $this->assertSame( [], $op->getCategories() ); + + return $op; + } + + private function doCategoryAsserts( $op, $expectedNormal, $expectedHidden ) { + $this->assertSame( array_merge( $expectedHidden, $expectedNormal ), $op->getCategories() ); + $this->assertSame( $expectedNormal, $op->getCategories( 'normal' ) ); + $this->assertSame( $expectedHidden, $op->getCategories( 'hidden' ) ); + } + + private function doCategoryLinkAsserts( $op, $expectedNormal, $expectedHidden ) { + $catLinks = $op->getCategoryLinks(); + $this->assertSame( (bool)$expectedNormal + (bool)$expectedHidden, count( $catLinks ) ); + if ( $expectedNormal ) { + $this->assertSame( count( $expectedNormal ), count( $catLinks['normal'] ) ); + } + if ( $expectedHidden ) { + $this->assertSame( count( $expectedHidden ), count( $catLinks['hidden'] ) ); + } + + foreach ( $expectedNormal as $i => $name ) { + $this->assertContains( $name, $catLinks['normal'][$i] ); + } + foreach ( $expectedHidden as $i => $name ) { + $this->assertContains( $name, $catLinks['hidden'][$i] ); + } + } + + public function provideGetCategories() { + return [ + 'No categories' => [ [], [], null, [], [] ], + 'Simple test' => [ + [ 'Test1' => 'Some sortkey', 'Test2' => 'A different sortkey' ], + [ 'Test1' => (object)[ 'pp_value' => 1, 'page_title' => 'Test1' ], + 'Test2' => (object)[ 'page_title' => 'Test2' ] ], + null, + [ 'Test2' ], + [ 'Test1' ], + ], + 'Invalid title' => [ + [ '[' => '[', 'Test' => 'Test' ], + [ 'Test' => (object)[ 'page_title' => 'Test' ] ], + null, + [ 'Test' ], + [], + ], + 'Variant link' => [ + [ 'Test' => 'Test', 'Estay' => 'Estay' ], + [ 'Test' => (object)[ 'page_title' => 'Test' ] ], + function ( &$link, &$title ) { + if ( $link === 'Estay' ) { + $link = 'Test'; + $title = Title::makeTitleSafe( NS_CATEGORY, $link ); + } + }, + // For adding one by one, the variant gets added as well as the original category, + // but if you add them all together the second time gets skipped. + [ 'onebyone' => [ 'Test', 'Test' ], 'default' => [ 'Test' ] ], + [], + ], + ]; + } + + /** + * @covers OutputPage::getCategories + */ + public function testGetCategoriesInvalid() { + $this->setExpectedException( InvalidArgumentException::class, + 'Invalid category type given: hiddne' ); + + $op = $this->newInstance(); + $op->getCategories( 'hiddne' ); + } + + // @todo Should we test addCategoryLinksToLBAndGetResult? If so, how? Insert some test rows in + // the DB? + + /** + * @covers OutputPage::setIndicators + * @covers OutputPage::getIndicators + * @covers OutputPage::addParserOutputMetadata + */ + public function testIndicators() { + $op = $this->newInstance(); + $this->assertSame( [], $op->getIndicators() ); + + $op->setIndicators( [] ); + $this->assertSame( [], $op->getIndicators() ); + + // Test sorting alphabetically + $op->setIndicators( [ 'b' => 'x', 'a' => 'y' ] ); + $this->assertSame( [ 'a' => 'y', 'b' => 'x' ], $op->getIndicators() ); + + // Test overwriting existing keys + $op->setIndicators( [ 'c' => 'z', 'a' => 'w' ] ); + $this->assertSame( [ 'a' => 'w', 'b' => 'x', 'c' => 'z' ], $op->getIndicators() ); + + // Test with ParserOutput + $stubPO = $this->createParserOutputStub( 'getIndicators', [ 'c' => 'u', 'd' => 'v' ] ); + $op->addParserOutputMetadata( $stubPO ); + $this->assertSame( [ 'a' => 'w', 'b' => 'x', 'c' => 'u', 'd' => 'v' ], + $op->getIndicators() ); + } + + /** + * @covers OutputPage::addHelpLink + * @covers OutputPage::getIndicators + */ + public function testAddHelpLink() { + $op = $this->newInstance(); + + $op->addHelpLink( 'Manual:PHP unit testing' ); + $indicators = $op->getIndicators(); + $this->assertSame( [ 'mw-helplink' ], array_keys( $indicators ) ); + $this->assertContains( 'Manual:PHP_unit_testing', $indicators['mw-helplink'] ); + + $op->addHelpLink( 'https://phpunit.de', true ); + $indicators = $op->getIndicators(); + $this->assertSame( [ 'mw-helplink' ], array_keys( $indicators ) ); + $this->assertContains( 'https://phpunit.de', $indicators['mw-helplink'] ); + $this->assertNotContains( 'mediawiki', $indicators['mw-helplink'] ); + $this->assertNotContains( 'Manual:PHP', $indicators['mw-helplink'] ); + } + + /** + * @covers OutputPage::prependHTML + * @covers OutputPage::addHTML + * @covers OutputPage::addElement + * @covers OutputPage::clearHTML + * @covers OutputPage::getHTML + */ + public function testBodyHTML() { + $op = $this->newInstance(); + $this->assertSame( '', $op->getHTML() ); + + $op->addHTML( 'a' ); + $this->assertSame( 'a', $op->getHTML() ); + + $op->addHTML( 'b' ); + $this->assertSame( 'ab', $op->getHTML() ); + + $op->prependHTML( 'c' ); + $this->assertSame( 'cab', $op->getHTML() ); + + $op->addElement( 'p', [ 'id' => 'foo' ], 'd' ); + $this->assertSame( 'cab

    d

    ', $op->getHTML() ); + + $op->clearHTML(); + $this->assertSame( '', $op->getHTML() ); + } + + /** + * @dataProvider provideRevisionId + * @covers OutputPage::setRevisionId + * @covers OutputPage::getRevisionId + */ + public function testRevisionId( $newVal, $expected ) { + $op = $this->newInstance(); + + $this->assertNull( $op->setRevisionId( $newVal ) ); + $this->assertSame( $expected, $op->getRevisionId() ); + $this->assertSame( $expected, $op->setRevisionId( null ) ); + $this->assertNull( $op->getRevisionId() ); + } + + public function provideRevisionId() { + return [ + [ null, null ], + [ 7, 7 ], + [ -1, -1 ], + [ 3.2, 3 ], + [ '0', 0 ], + [ '32% finished', 32 ], + [ false, 0 ], + ]; + } + + /** + * @covers OutputPage::setRevisionTimestamp + * @covers OutputPage::getRevisionTimestamp + */ + public function testRevisionTimestamp() { + $op = $this->newInstance(); + $this->assertNull( $op->getRevisionTimestamp() ); + + $this->assertNull( $op->setRevisionTimestamp( 'abc' ) ); + $this->assertSame( 'abc', $op->getRevisionTimestamp() ); + $this->assertSame( 'abc', $op->setRevisionTimestamp( null ) ); + $this->assertNull( $op->getRevisionTimestamp() ); + } + + /** + * @covers OutputPage::setFileVersion + * @covers OutputPage::getFileVersion + */ + public function testFileVersion() { + $op = $this->newInstance(); + $this->assertNull( $op->getFileVersion() ); + + $stubFile = $this->createMock( File::class ); + $stubFile->method( 'exists' )->willReturn( true ); + $stubFile->method( 'getTimestamp' )->willReturn( '12211221123321' ); + $stubFile->method( 'getSha1' )->willReturn( 'bf3ffa7047dc080f5855377a4f83cd18887e3b05' ); + + $op->setFileVersion( $stubFile ); + + $this->assertEquals( + [ 'time' => '12211221123321', 'sha1' => 'bf3ffa7047dc080f5855377a4f83cd18887e3b05' ], + $op->getFileVersion() + ); + + $stubMissingFile = $this->createMock( File::class ); + $stubMissingFile->method( 'exists' )->willReturn( false ); + + $op->setFileVersion( $stubMissingFile ); + $this->assertNull( $op->getFileVersion() ); + + $op->setFileVersion( $stubFile ); + $this->assertNotNull( $op->getFileVersion() ); + + $op->setFileVersion( null ); + $this->assertNull( $op->getFileVersion() ); + } + + private function createParserOutputStub( $method = '', $retVal = [] ) { + $pOut = $this->getMock( ParserOutput::class ); + if ( $method !== '' ) { + $pOut->method( $method )->willReturn( $retVal ); + } + + $arrayReturningMethods = [ + 'getCategories', + 'getFileSearchOptions', + 'getHeadItems', + 'getIndicators', + 'getLanguageLinks', + 'getOutputHooks', + 'getTemplateIds', + ]; + + foreach ( $arrayReturningMethods as $method ) { + $pOut->method( $method )->willReturn( [] ); + } + + return $pOut; + } + + /** + * @covers OutputPage::getTemplateIds + * @covers OutputPage::addParserOutputMetadata + */ + public function testTemplateIds() { + $op = $this->newInstance(); + $this->assertSame( [], $op->getTemplateIds() ); + + // Test with no template id's + $stubPOEmpty = $this->createParserOutputStub(); + $op->addParserOutputMetadata( $stubPOEmpty ); + $this->assertSame( [], $op->getTemplateIds() ); + + // Test with some arbitrary template id's + $ids = [ + NS_MAIN => [ 'A' => 3, 'B' => 17 ], + NS_TALK => [ 'C' => 31 ], + NS_MEDIA => [ 'D' => -1 ], + ]; + + $stubPO1 = $this->createParserOutputStub( 'getTemplateIds', $ids ); + + $op->addParserOutputMetadata( $stubPO1 ); + $this->assertSame( $ids, $op->getTemplateIds() ); + + // Test merging with a second set of id's + $stubPO2 = $this->createParserOutputStub( 'getTemplateIds', [ + NS_MAIN => [ 'E' => 1234 ], + NS_PROJECT => [ 'F' => 5678 ], ] ); - $this->assertEquals( [ 0 => 'Test', '1' => 'Test2' ], $op->getCategories() ); - $this->assertEquals( [ 0 => 'Test2' ], $op->getCategories( 'normal' ) ); - $this->assertEquals( [ 0 => 'Test' ], $op->getCategories( 'hidden' ) ); + + $finalIds = [ + NS_MAIN => [ 'E' => 1234, 'A' => 3, 'B' => 17 ], + NS_TALK => [ 'C' => 31 ], + NS_MEDIA => [ 'D' => -1 ], + NS_PROJECT => [ 'F' => 5678 ], + ]; + + $op->addParserOutputMetadata( $stubPO2 ); + $this->assertSame( $finalIds, $op->getTemplateIds() ); + + // Test merging with an empty set of id's + $op->addParserOutputMetadata( $stubPOEmpty ); + $this->assertSame( $finalIds, $op->getTemplateIds() ); + } + + /** + * @covers OutputPage::getFileSearchOptions + * @covers OutputPage::addParserOutputMetadata + */ + public function testFileSearchOptions() { + $op = $this->newInstance(); + $this->assertSame( [], $op->getFileSearchOptions() ); + + // Test with no files + $stubPOEmpty = $this->createParserOutputStub(); + + $op->addParserOutputMetadata( $stubPOEmpty ); + $this->assertSame( [], $op->getFileSearchOptions() ); + + // Test with some arbitrary files + $files1 = [ + 'A' => [ 'time' => null, 'sha1' => '' ], + 'B' => [ + 'time' => '12211221123321', + 'sha1' => 'bf3ffa7047dc080f5855377a4f83cd18887e3b05', + ], + ]; + + $stubPO1 = $this->createParserOutputStub( 'getFileSearchOptions', $files1 ); + + $op->addParserOutputMetadata( $stubPO1 ); + $this->assertSame( $files1, $op->getFileSearchOptions() ); + + // Test merging with a second set of files + $files2 = [ + 'C' => [ 'time' => null, 'sha1' => '' ], + 'B' => [ 'time' => null, 'sha1' => '' ], + ]; + + $stubPO2 = $this->createParserOutputStub( 'getFileSearchOptions', $files2 ); + + $op->addParserOutputMetadata( $stubPO2 ); + $this->assertSame( array_merge( $files1, $files2 ), $op->getFileSearchOptions() ); + + // Test merging with an empty set of files + $op->addParserOutputMetadata( $stubPOEmpty ); + $this->assertSame( array_merge( $files1, $files2 ), $op->getFileSearchOptions() ); } + /** + * @dataProvider provideAddWikiText + * @covers OutputPage::addWikiText + * @covers OutputPage::addWikiTextWithTitle + * @covers OutputPage::addWikiTextTitle + * @covers OutputPage::getHTML + */ + public function testAddWikiText( $method, array $args, $expected ) { + $op = $this->newInstance(); + $this->assertSame( '', $op->getHTML() ); + + if ( in_array( + $method, + [ 'addWikiTextWithTitle', 'addWikiTextTitleTidy', 'addWikiTextTitle' ] + ) && count( $args ) >= 2 && $args[1] === null ) { + // Special placeholder because we can't get the actual title in the provider + $args[1] = $op->getTitle(); + } + + $op->$method( ...$args ); + $this->assertSame( $expected, $op->getHTML() ); + } + + public function provideAddWikiText() { + $tests = [ + 'addWikiText' => [ + 'Simple wikitext' => [ + [ "'''Bold'''" ], + "

    Bold\n

    ", + ], 'List at start' => [ + [ '* List' ], + "
    • List
    \n", + ], 'List not at start' => [ + [ '* Not a list', false ], + '* Not a list', + ], 'Non-interface' => [ + [ "'''Bold'''", true, false ], + "

    Bold\n

    ", + ], 'No section edit links' => [ + [ '== Title ==' ], + "

    Title

    \n", + ], + ], + 'addWikiTextWithTitle' => [ + 'With title at start' => [ + [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ) ], + "
    • Some page
    \n
    ", + ], 'With title at start' => [ + [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ), false ], + "
    * Some page
    ", + ], + ], + ]; + + // Test all the others on addWikiTextTitle as well + foreach ( $tests['addWikiText'] as $key => $val ) { + $args = [ $val[0][0], null, $val[0][1] ?? true, false, $val[0][2] ?? true ]; + $tests['addWikiTextTitle']["$key (addWikiTextTitle)"] = + array_merge( [ $args ], array_slice( $val, 1 ) ); + } + foreach ( $tests['addWikiTextWithTitle'] as $key => $val ) { + $args = [ $val[0][0], $val[0][1], $val[0][2] ?? true ]; + $tests['addWikiTextTitle']["$key (addWikiTextTitle)"] = + array_merge( [ $args ], array_slice( $val, 1 ) ); + } + + // We have to reformat our array to match what PHPUnit wants + $ret = []; + foreach ( $tests as $key => $subarray ) { + foreach ( $subarray as $subkey => $val ) { + $val = array_merge( [ $key ], $val ); + $ret[$subkey] = $val; + } + } + + return $ret; + } + + /** + * @covers OutputPage::addWikiText + */ + public function testAddWikiTextNoTitle() { + $this->setExpectedException( MWException::class, 'Title is null' ); + + $op = $this->newInstance( [], null, 'notitle' ); + $op->addWikiText( 'a' ); + } + + // @todo How should we cover the Tidy variants? + + /** + * @covers OutputPage::addParserOutputMetadata + */ + public function testNoGallery() { + $op = $this->newInstance(); + $this->assertFalse( $op->mNoGallery ); + + $stubPO1 = $this->createParserOutputStub( 'getNoGallery', true ); + $op->addParserOutputMetadata( $stubPO1 ); + $this->assertTrue( $op->mNoGallery ); + + $stubPO2 = $this->createParserOutputStub( 'getNoGallery', false ); + $op->addParserOutputMetadata( $stubPO2 ); + $this->assertFalse( $op->mNoGallery ); + } + + // @todo Make sure to test the following in addParserOutputMetadata() as well when we add tests + // for them: + // * enableClientCache() + // * addModules() + // * addModuleScripts() + // * addModuleStyles() + // * addJsConfigVars() + // * preventClickJacking() + // Otherwise those lines of addParserOutputMetadata() will be reported as covered, but we won't + // be testing they actually work. + /** * @covers OutputPage::haveCacheVaryCookies */ @@ -1311,7 +2116,7 @@ class OutputPageTest extends MediaWikiTestCase { /** * @return OutputPage */ - private function newInstance( $config = [], WebRequest $request = null ) { + private function newInstance( $config = [], WebRequest $request = null, $options = [] ) { $context = new RequestContext(); $context->setConfig( new MultiConfig( [ @@ -1330,7 +2135,9 @@ class OutputPageTest extends MediaWikiTestCase { $context->getConfig() ] ) ); - $context->setTitle( Title::newFromText( 'My test page' ) ); + if ( !in_array( 'notitle', (array)$options ) ) { + $context->setTitle( Title::newFromText( 'My test page' ) ); + } if ( $request ) { $context->setRequest( $request ); diff --git a/tests/phpunit/includes/PrefixSearchTest.php b/tests/phpunit/includes/PrefixSearchTest.php index 560692417f..0e357678e8 100644 --- a/tests/phpunit/includes/PrefixSearchTest.php +++ b/tests/phpunit/includes/PrefixSearchTest.php @@ -61,7 +61,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase { $this->originalHandlers = TestingAccessWrapper::newFromClass( Hooks::class )->handlers; TestingAccessWrapper::newFromClass( Hooks::class )->handlers = []; - SpecialPageFactory::resetList(); + $this->overrideMwServices(); } public function tearDown() { @@ -69,7 +69,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase { TestingAccessWrapper::newFromClass( Hooks::class )->handlers = $this->originalHandlers; - SpecialPageFactory::resetList(); + $this->overrideMwServices(); } protected function searchProvision( array $results = null ) { diff --git a/tests/phpunit/includes/RevisionDbTestBase.php b/tests/phpunit/includes/RevisionDbTestBase.php index 57b42f6a4a..ff4c198aec 100644 --- a/tests/phpunit/includes/RevisionDbTestBase.php +++ b/tests/phpunit/includes/RevisionDbTestBase.php @@ -1386,7 +1386,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase { */ public function testNewKnownCurrent() { // Setup the services - $this->resetGlobalServices(); + $this->overrideMwServices(); $cache = new WANObjectCache( [ 'cache' => new HashBagOStuff() ] ); $this->setService( 'MainWANObjectCache', $cache ); $db = wfGetDB( DB_MASTER ); diff --git a/tests/phpunit/includes/ServiceWiringTest.php b/tests/phpunit/includes/ServiceWiringTest.php new file mode 100644 index 0000000000..74e8e1b3ea --- /dev/null +++ b/tests/phpunit/includes/ServiceWiringTest.php @@ -0,0 +1,16 @@ +assertSame( $sortedServices, $services, + 'Please keep services sorted alphabetically' ); + } +} diff --git a/tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php b/tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php index 3a1f078c31..c7f83dedbf 100644 --- a/tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php +++ b/tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php @@ -94,8 +94,6 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase { * @covers \MediaWiki\Storage\DerivedPageDataUpdater::getCanonicalParserOptions() */ public function testGetCanonicalParserOptions() { - global $wgContLang; - $user = $this->getTestUser()->getUser(); $page = $this->getPage( __METHOD__ ); @@ -109,7 +107,8 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase { $updater->prepareContent( $user, $update, false ); $options1 = $updater->getCanonicalParserOptions(); - $this->assertSame( $wgContLang, $options1->getUserLangObj() ); + $this->assertSame( MediaWikiServices::getInstance()->getContentLanguage(), + $options1->getUserLangObj() ); $speculativeId = call_user_func( $options1->getSpeculativeRevIdCallback(), $page->getTitle() ); $this->assertSame( $parentRev->getId() + 1, $speculativeId ); diff --git a/tests/phpunit/includes/Storage/McrReadNewSchemaOverride.php b/tests/phpunit/includes/Storage/McrReadNewSchemaOverride.php index 195833304e..76bd59ad3a 100644 --- a/tests/phpunit/includes/Storage/McrReadNewSchemaOverride.php +++ b/tests/phpunit/includes/Storage/McrReadNewSchemaOverride.php @@ -28,7 +28,6 @@ trait McrReadNewSchemaOverride { } /** - * @override MediaWikiTestCase::getSchemaOverrides * @return array[] */ protected function getSchemaOverrides( IMaintainableDatabase $db ) { diff --git a/tests/phpunit/includes/Storage/McrWriteBothSchemaOverride.php b/tests/phpunit/includes/Storage/McrWriteBothSchemaOverride.php index 7275f90e6f..cdcba4f7b4 100644 --- a/tests/phpunit/includes/Storage/McrWriteBothSchemaOverride.php +++ b/tests/phpunit/includes/Storage/McrWriteBothSchemaOverride.php @@ -28,7 +28,6 @@ trait McrWriteBothSchemaOverride { } /** - * @override MediaWikiTestCase::getSchemaOverrides * @return array[] */ protected function getSchemaOverrides( IMaintainableDatabase $db ) { diff --git a/tests/phpunit/includes/Storage/PreMcrSchemaOverride.php b/tests/phpunit/includes/Storage/PreMcrSchemaOverride.php index 5d516e8258..bb72a573ce 100644 --- a/tests/phpunit/includes/Storage/PreMcrSchemaOverride.php +++ b/tests/phpunit/includes/Storage/PreMcrSchemaOverride.php @@ -27,7 +27,6 @@ trait PreMcrSchemaOverride { } /** - * @override MediaWikiTestCase::getSchemaOverrides * @return array[] */ protected function getSchemaOverrides( IMaintainableDatabase $db ) { diff --git a/tests/phpunit/includes/Storage/RevisionRecordTests.php b/tests/phpunit/includes/Storage/RevisionRecordTests.php index 607f78293d..30dacdb7ac 100644 --- a/tests/phpunit/includes/Storage/RevisionRecordTests.php +++ b/tests/phpunit/includes/Storage/RevisionRecordTests.php @@ -13,9 +13,6 @@ use MediaWiki\User\UserIdentityValue; use TextContent; use Title; -// PHPCS should not complain about @covers and @dataProvider being used in traits, see T192384 -// phpcs:disable MediaWiki.Commenting.PhpunitAnnotations.NotTestClass - /** * @covers \MediaWiki\Storage\RevisionRecord * diff --git a/tests/phpunit/includes/Storage/RevisionStoreFactoryTest.php b/tests/phpunit/includes/Storage/RevisionStoreFactoryTest.php new file mode 100644 index 0000000000..3f8bd4b6ab --- /dev/null +++ b/tests/phpunit/includes/Storage/RevisionStoreFactoryTest.php @@ -0,0 +1,165 @@ +getMockLoadBalancerFactory(), + $this->getMockBlobStoreFactory(), + $this->getHashWANObjectCache(), + $this->getMockCommentStore(), + ActorMigration::newMigration(), + MIGRATION_OLD, + $this->getMockLoggerSpi(), + true + ); + $this->assertTrue( true ); + } + + public function provideWikiIds() { + yield [ true ]; + yield [ false ]; + yield [ 'somewiki' ]; + yield [ 'somewiki', MIGRATION_OLD , false ]; + yield [ 'somewiki', MIGRATION_NEW , true ]; + } + + /** + * @dataProvider provideWikiIds + */ + public function testGetRevisionStore( + $wikiId, + $mcrMigrationStage = MIGRATION_OLD, + $contentHandlerUseDb = true + ) { + $lbFactory = $this->getMockLoadBalancerFactory(); + $blobStoreFactory = $this->getMockBlobStoreFactory(); + $cache = $this->getHashWANObjectCache(); + $commentStore = $this->getMockCommentStore(); + $actorMigration = ActorMigration::newMigration(); + $loggerProvider = $this->getMockLoggerSpi(); + + $factory = new RevisionStoreFactory( + $lbFactory, + $blobStoreFactory, + $cache, + $commentStore, + $actorMigration, + $mcrMigrationStage, + $loggerProvider, + $contentHandlerUseDb + ); + + $store = $factory->getRevisionStore( $wikiId ); + $wrapper = TestingAccessWrapper::newFromObject( $store ); + + // ensure the correct object type is returned + $this->assertInstanceOf( RevisionStore::class, $store ); + + // ensure the RevisionStore is for the given wikiId + $this->assertSame( $wikiId, $wrapper->wikiId ); + + // ensure all other required services are correctly set + $this->assertSame( $cache, $wrapper->cache ); + $this->assertSame( $commentStore, $wrapper->commentStore ); + $this->assertSame( $mcrMigrationStage, $wrapper->mcrMigrationStage ); + $this->assertSame( $actorMigration, $wrapper->actorMigration ); + $this->assertSame( $contentHandlerUseDb, $store->getContentHandlerUseDB() ); + + $this->assertInstanceOf( ILoadBalancer::class, $wrapper->loadBalancer ); + $this->assertInstanceOf( BlobStore::class, $wrapper->blobStore ); + $this->assertInstanceOf( NameTableStore::class, $wrapper->contentModelStore ); + $this->assertInstanceOf( NameTableStore::class, $wrapper->slotRoleStore ); + $this->assertInstanceOf( LoggerInterface::class, $wrapper->logger ); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ILoadBalancer + */ + private function getMockLoadBalancer() { + return $this->getMockBuilder( ILoadBalancer::class ) + ->disableOriginalConstructor()->getMock(); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ILBFactory + */ + private function getMockLoadBalancerFactory() { + $mock = $this->getMockBuilder( ILBFactory::class ) + ->disableOriginalConstructor()->getMock(); + + $mock->method( 'getMainLB' ) + ->willReturnCallback( function () { + return $this->getMockLoadBalancer(); + } ); + + return $mock; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|SqlBlobStore + */ + private function getMockSqlBlobStore() { + return $this->getMockBuilder( SqlBlobStore::class ) + ->disableOriginalConstructor()->getMock(); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|BlobStoreFactory + */ + private function getMockBlobStoreFactory() { + $mock = $this->getMockBuilder( BlobStoreFactory::class ) + ->disableOriginalConstructor()->getMock(); + + $mock->method( 'newSqlBlobStore' ) + ->willReturnCallback( function () { + return $this->getMockSqlBlobStore(); + } ); + + return $mock; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|CommentStore + */ + private function getMockCommentStore() { + return $this->getMockBuilder( CommentStore::class ) + ->disableOriginalConstructor()->getMock(); + } + + private function getHashWANObjectCache() { + return new WANObjectCache( [ 'cache' => new \HashBagOStuff() ] ); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|LoggerSpi + */ + private function getMockLoggerSpi() { + $mock = $this->getMock( LoggerSpi::class ); + + $mock->method( 'getLogger' ) + ->willReturn( new NullLogger() ); + + return $mock; + } + +} diff --git a/tests/phpunit/includes/TestUser.php b/tests/phpunit/includes/TestUser.php index 86f4ae789d..952a662fcd 100644 --- a/tests/phpunit/includes/TestUser.php +++ b/tests/phpunit/includes/TestUser.php @@ -1,5 +1,7 @@ init( RequestContext::getMain()->getConfig() ); + $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory(); if ( !$passwordFactory->newFromCiphertext( $row->user_password )->equals( $password ) ) { $passwordHash = $passwordFactory->newFromPlaintext( $password ); $dbw->update( diff --git a/tests/phpunit/includes/TimeAdjustTest.php b/tests/phpunit/includes/TimeAdjustTest.php index 93aef34b13..b59282dd79 100644 --- a/tests/phpunit/includes/TimeAdjustTest.php +++ b/tests/phpunit/includes/TimeAdjustTest.php @@ -1,5 +1,7 @@ setMwGlobals( 'wgLocalTZoffset', $localTZoffset ); $this->assertEquals( $expected, - strval( $wgContLang->userAdjust( $date, '' ) ), + strval( MediaWikiServices::getInstance()->getContentLanguage()-> + userAdjust( $date, '' ) ), "User adjust {$date} by {$localTZoffset} minutes should give {$expected}" ); } diff --git a/tests/phpunit/includes/TitlePermissionTest.php b/tests/phpunit/includes/TitlePermissionTest.php index 6600aa23c7..dd84b7eb01 100644 --- a/tests/phpunit/includes/TitlePermissionTest.php +++ b/tests/phpunit/includes/TitlePermissionTest.php @@ -1,5 +1,7 @@ user = $this->userUser; } + $this->overrideMwServices(); } protected function setUserPerm( $perm ) { @@ -96,11 +99,15 @@ class TitlePermissionTest extends MediaWikiLangTestCase { /** * @todo This test method should be split up into separate test methods and * data providers + * + * This test is failing per T201776. + * + * @group Broken * @covers Title::checkQuickPermissions */ public function testQuickPermissions() { - global $wgContLang; - $prefix = $wgContLang->getFormattedNsText( NS_PROJECT ); + $prefix = MediaWikiServices::getInstance()->getContentLanguage()-> + getFormattedNsText( NS_PROJECT ); $this->setUser( 'anon' ); $this->setTitle( NS_TALK ); @@ -640,12 +647,15 @@ class TitlePermissionTest extends MediaWikiLangTestCase { /** * @todo This test method should be split up into separate test methods and * data providers + * + * This test is failing per T201776. + * + * @group Broken * @covers Title::checkPageRestrictions */ public function testPageRestrictions() { - global $wgContLang; - - $prefix = $wgContLang->getFormattedNsText( NS_PROJECT ); + $prefix = MediaWikiServices::getInstance()->getContentLanguage()-> + getFormattedNsText( NS_PROJECT ); $this->setTitle( NS_MAIN ); $this->title->mRestrictionsLoaded = true; diff --git a/tests/phpunit/includes/TitleTest.php b/tests/phpunit/includes/TitleTest.php index f9ffeae924..d585240d52 100644 --- a/tests/phpunit/includes/TitleTest.php +++ b/tests/phpunit/includes/TitleTest.php @@ -449,7 +449,7 @@ class TitleTest extends MediaWikiTestCase { # Format: # - expected # - Title name - # - wgContLang (expected in most case) + # - content language (expected in most cases) # - wgLang (on some specific pages) # - wgDefaultLanguageVariant # - Optional message diff --git a/tests/phpunit/includes/api/ApiEditPageTest.php b/tests/phpunit/includes/api/ApiEditPageTest.php index 4c276d6273..852812bef5 100644 --- a/tests/phpunit/includes/api/ApiEditPageTest.php +++ b/tests/phpunit/includes/api/ApiEditPageTest.php @@ -399,7 +399,7 @@ class ApiEditPageTest extends ApiTestCase { "no edit conflict expected here" ); } - public function testEditConflict_bug41990() { + public function testEditConflict_T43990() { static $count = 0; $count++; @@ -410,11 +410,11 @@ class ApiEditPageTest extends ApiTestCase { */ // assume NS_HELP defaults to wikitext - $name = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_$count"; + $name = "Help:ApiEditPageTest_testEditConflict_redirect_T43990_$count"; $title = Title::newFromText( $name ); $page = WikiPage::factory( $title ); - $rname = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_r$count"; + $rname = "Help:ApiEditPageTest_testEditConflict_redirect_T43990_r$count"; $rtitle = Title::newFromText( $rname ); $rpage = WikiPage::factory( $rtitle ); diff --git a/tests/phpunit/includes/api/ApiLoginTest.php b/tests/phpunit/includes/api/ApiLoginTest.php index d382c83c18..384d7794e3 100644 --- a/tests/phpunit/includes/api/ApiLoginTest.php +++ b/tests/phpunit/includes/api/ApiLoginTest.php @@ -1,5 +1,6 @@ assertNotEquals( 0, $centralId, 'sanity check' ); $password = 'ngfhmjm64hv0854493hsj5nncjud2clk'; - $passwordFactory = new PasswordFactory(); - $passwordFactory->init( RequestContext::getMain()->getConfig() ); + $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory(); // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only $passwordHash = $passwordFactory->newFromPlaintext( $password ); diff --git a/tests/phpunit/includes/api/ApiQueryDisabledTest.php b/tests/phpunit/includes/api/ApiQueryDisabledTest.php new file mode 100644 index 0000000000..52f1fdf7e0 --- /dev/null +++ b/tests/phpunit/includes/api/ApiQueryDisabledTest.php @@ -0,0 +1,26 @@ +mergeMwGlobalArrayValue( 'wgAPIPropModules', + [ 'categories' => 'ApiQueryDisabled' ] ); + + $data = $this->doApiRequest( [ + 'action' => 'query', + 'prop' => 'categories', + ] ); + + $this->assertArrayHasKey( 'warnings', $data[0] ); + $this->assertArrayHasKey( 'categories', $data[0]['warnings'] ); + $this->assertArrayHasKey( 'warnings', $data[0]['warnings']['categories'] ); + + $this->assertEquals( 'The "categories" module has been disabled.', + $data[0]['warnings']['categories']['warnings'] ); + } +} diff --git a/tests/phpunit/includes/api/ApiQuerySiteinfoTest.php b/tests/phpunit/includes/api/ApiQuerySiteinfoTest.php new file mode 100644 index 0000000000..129b7f9d6a --- /dev/null +++ b/tests/phpunit/includes/api/ApiQuerySiteinfoTest.php @@ -0,0 +1,665 @@ + 'query', 'meta' => 'siteinfo' ]; + if ( $siprop !== null ) { + $params['siprop'] = $siprop; + } + $params = array_merge( $params, $extraParams ); + + $res = $this->doApiRequest( $params ); + + $this->assertArrayNotHasKey( 'warnings', $res[0] ); + $this->assertCount( 1, $res[0]['query'] ); + + return $res[0]['query'][$siprop === null ? 'general' : $siprop]; + } + + public function testGeneral() { + $this->setMwGlobals( [ + 'wgAllowExternalImagesFrom' => '//localhost/', + ] ); + + $data = $this->doQuery(); + + $this->assertSame( Title::newMainPage()->getPrefixedText(), $data['mainpage'] ); + $this->assertSame( PHP_VERSION, $data['phpversion'] ); + $this->assertSame( [ '//localhost/' ], $data['externalimages'] ); + } + + public function testLinkPrefixCharset() { + global $wgContLang; + + $this->setContentLang( 'ar' ); + $this->assertTrue( $wgContLang->linkPrefixExtension(), 'Sanity check' ); + + $data = $this->doQuery(); + + $this->assertSame( $wgContLang->linkPrefixCharset(), $data['linkprefixcharset'] ); + } + + public function testVariants() { + global $wgContLang; + + $this->setContentLang( 'zh' ); + $this->assertTrue( $wgContLang->hasVariants(), 'Sanity check' ); + + $data = $this->doQuery(); + + $expected = array_map( + function ( $code ) use ( $wgContLang ) { + return [ 'code' => $code, 'name' => $wgContLang->getVariantname( $code ) ]; + }, + $wgContLang->getVariants() + ); + + $this->assertSame( $expected, $data['variants'] ); + } + + public function testReadOnly() { + $svc = \MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode(); + $svc->setReason( 'Need more donations' ); + try { + $data = $this->doQuery(); + } finally { + $svc->setReason( false ); + } + + $this->assertTrue( $data['readonly'] ); + $this->assertSame( 'Need more donations', $data['readonlyreason'] ); + } + + public function testNamespaces() { + global $wgContLang; + + $this->setMwGlobals( 'wgExtraNamespaces', [ '138' => 'Testing' ] ); + + $this->assertSame( array_keys( $wgContLang->getFormattedNamespaces() ), + array_keys( $this->doQuery( 'namespaces' ) ) ); + } + + public function testNamespaceAliases() { + global $wgNamespaceAliases, $wgContLang; + + $expected = array_merge( $wgNamespaceAliases, $wgContLang->getNamespaceAliases() ); + $expected = array_map( + function ( $key, $val ) { + return [ 'id' => $val, 'alias' => strtr( $key, '_', ' ' ) ]; + }, + array_keys( $expected ), + $expected + ); + + // Test that we don't list duplicates + $this->mergeMwGlobalArrayValue( 'wgNamespaceAliases', [ 'Talk' => NS_TALK ] ); + + $this->assertSame( $expected, $this->doQuery( 'namespacealiases' ) ); + } + + public function testSpecialPageAliases() { + $this->assertCount( + count( MediaWikiServices::getInstance()->getSpecialPageFactory()->getNames() ), + $this->doQuery( 'specialpagealiases' ) + ); + } + + public function testMagicWords() { + global $wgContLang; + + $this->assertCount( + count( $wgContLang->getMagicWords() ), + $this->doQuery( 'magicwords' ) + ); + } + + /** + * @dataProvider interwikiMapProvider + */ + public function testInterwikiMap( $filter ) { + global $wgServer, $wgScriptPath; + + $dbw = wfGetDB( DB_MASTER ); + $dbw->insert( + 'interwiki', + [ + [ + 'iw_prefix' => 'self', + 'iw_url' => "$wgServer$wgScriptPath/index.php?title=$1", + 'iw_api' => "$wgServer$wgScriptPath/api.php", + 'iw_wikiid' => 'somedbname', + 'iw_local' => true, + 'iw_trans' => true, + ], + [ + 'iw_prefix' => 'foreign', + 'iw_url' => '//foreign.example/wiki/$1', + 'iw_api' => '', + 'iw_wikiid' => '', + 'iw_local' => false, + 'iw_trans' => false, + ], + ], + __METHOD__, + 'IGNORE' + ); + $this->tablesUsed[] = 'interwiki'; + + $this->setMwGlobals( [ + 'wgLocalInterwikis' => [ 'self' ], + 'wgExtraInterlanguageLinkPrefixes' => [ 'self' ], + 'wgExtraLanguageNames' => [ 'self' => 'Recursion' ], + ] ); + + MessageCache::singleton()->enable(); + + $this->editPage( 'MediaWiki:Interlanguage-link-self', 'Self!' ); + $this->editPage( 'MediaWiki:Interlanguage-link-sitename-self', 'Circular logic' ); + + $expected = []; + + if ( $filter === null || $filter === '!local' ) { + $expected[] = [ + 'prefix' => 'foreign', + 'url' => wfExpandUrl( '//foreign.example/wiki/$1', PROTO_CURRENT ), + 'protorel' => true, + ]; + } + if ( $filter === null || $filter === 'local' ) { + $expected[] = [ + 'prefix' => 'self', + 'local' => true, + 'trans' => true, + 'language' => 'Recursion', + 'localinterwiki' => true, + 'extralanglink' => true, + 'linktext' => 'Self!', + 'sitename' => 'Circular logic', + 'url' => "$wgServer$wgScriptPath/index.php?title=$1", + 'protorel' => false, + 'wikiid' => 'somedbname', + 'api' => "$wgServer$wgScriptPath/api.php", + ]; + } + + $data = $this->doQuery( 'interwikimap', + $filter === null ? [] : [ 'sifilteriw' => $filter ] ); + + $this->assertSame( $expected, $data ); + } + + public function interwikiMapProvider() { + return [ [ 'local' ], [ '!local' ], [ null ] ]; + } + + /** + * @dataProvider dbReplLagProvider + */ + public function testDbReplLagInfo( $showHostnames, $includeAll ) { + if ( !$showHostnames && $includeAll ) { + $this->setExpectedApiException( 'apierror-siteinfo-includealldenied' ); + } + + $mockLB = $this->getMockBuilder( LoadBalancer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'getMaxLag', 'getLagTimes', 'getServerName', '__destruct' ] ) + ->getMock(); + $mockLB->method( 'getMaxLag' )->willReturn( [ null, 7, 1 ] ); + $mockLB->method( 'getLagTimes' )->willReturn( [ 5, 7 ] ); + $mockLB->method( 'getServerName' )->will( $this->returnValueMap( [ + [ 0, 'apple' ], [ 1, 'carrot' ] + ] ) ); + $this->setService( 'DBLoadBalancer', $mockLB ); + + $this->setMwGlobals( 'wgShowHostnames', $showHostnames ); + + $expected = []; + if ( $includeAll ) { + $expected[] = [ 'host' => $showHostnames ? 'apple' : '', 'lag' => 5 ]; + } + $expected[] = [ 'host' => $showHostnames ? 'carrot' : '', 'lag' => 7 ]; + + $data = $this->doQuery( 'dbrepllag', $includeAll ? [ 'sishowalldb' => '' ] : [] ); + + $this->assertSame( $expected, $data ); + } + + public function dbReplLagProvider() { + return [ + 'no hostnames, no showalldb' => [ false, false ], + 'no hostnames, showalldb' => [ false, true ], + 'hostnames, no showalldb' => [ true, false ], + 'hostnames, showalldb' => [ true, true ] + ]; + } + + public function testStatistics() { + $this->setTemporaryHook( 'APIQuerySiteInfoStatisticsInfo', + function ( &$data ) { + $data['addedstats'] = 42; + } + ); + + $expected = [ + 'pages' => intval( SiteStats::pages() ), + 'articles' => intval( SiteStats::articles() ), + 'edits' => intval( SiteStats::edits() ), + 'images' => intval( SiteStats::images() ), + 'users' => intval( SiteStats::users() ), + 'activeusers' => intval( SiteStats::activeUsers() ), + 'admins' => intval( SiteStats::numberingroup( 'sysop' ) ), + 'jobs' => intval( SiteStats::jobs() ), + 'addedstats' => 42, + ]; + + $this->assertSame( $expected, $this->doQuery( 'statistics' ) ); + } + + /** + * @dataProvider groupsProvider + */ + public function testUserGroups( $numInGroup ) { + global $wgGroupPermissions, $wgAutopromote; + + $this->setGroupPermissions( 'viscount', 'perambulate', 'yes' ); + $this->setGroupPermissions( 'viscount', 'legislate', '0' ); + $this->setMwGlobals( [ + 'wgAddGroups' => [ 'viscount' => true, 'bot' => [] ], + 'wgRemoveGroups' => [ 'viscount' => [ 'sysop' ], 'bot' => [ '*', 'earl' ] ], + 'wgGroupsAddToSelf' => [ 'bot' => [ 'bureaucrat', 'sysop' ] ], + 'wgGroupsRemoveFromSelf' => [ 'bot' => [ 'bot' ] ], + ] ); + + $data = $this->doQuery( 'usergroups', $numInGroup ? [ 'sinumberingroup' => '' ] : [] ); + + $names = array_map( + function ( $val ) { + return $val['name']; + }, + $data + ); + + $this->assertSame( array_keys( $wgGroupPermissions ), $names ); + + foreach ( $data as $val ) { + if ( !$numInGroup ) { + $expectedSize = null; + } elseif ( $val['name'] === 'user' ) { + $expectedSize = SiteStats::users(); + } elseif ( $val['name'] === '*' || isset( $wgAutopromote[$val['name']] ) ) { + $expectedSize = null; + } else { + $expectedSize = SiteStats::numberingroup( $val['name'] ); + } + + if ( $expectedSize === null ) { + $this->assertArrayNotHasKey( 'number', $val ); + } else { + $this->assertSame( $expectedSize, $val['number'] ); + } + + if ( $val['name'] === 'viscount' ) { + $viscountFound = true; + $this->assertSame( [ 'perambulate' ], $val['rights'] ); + $this->assertSame( User::getAllGroups(), $val['add'] ); + } elseif ( $val['name'] === 'bot' ) { + $this->assertArrayNotHasKey( 'add', $val ); + $this->assertArrayNotHasKey( 'remove', $val ); + $this->assertSame( [ 'bureaucrat', 'sysop' ], $val['add-self'] ); + $this->assertSame( [ 'bot' ], $val['remove-self'] ); + } + } + } + + public function testFileExtensions() { + global $wgFileExtensions; + + $this->stashMwGlobals( 'wgFileExtensions' ); + // Add duplicate + $wgFileExtensions[] = 'png'; + + $expected = array_map( + function ( $val ) { + return [ 'ext' => $val ]; + }, + array_unique( $wgFileExtensions ) + ); + + $this->assertSame( $expected, $this->doQuery( 'fileextensions' ) ); + } + + public function groupsProvider() { + return [ + 'numingroup' => [ true ], + 'nonumingroup' => [ false ], + ]; + } + + public function testInstalledLibraries() { + // @todo Test no installed.json? Moving installed.json to a different name temporarily + // seems a bit scary, but I don't see any other way to do it. + // + // @todo Install extensions/skins somehow so that we can test they're filtered out + global $IP; + + $path = "$IP/vendor/composer/installed.json"; + if ( !file_exists( $path ) ) { + $this->markTestSkipped( 'No installed libraries' ); + } + + $expected = ( new ComposerInstalled( $path ) )->getInstalledDependencies(); + + $expected = array_filter( $expected, + function ( $info ) { + return strpos( $info['type'], 'mediawiki-' ) !== 0; + } + ); + + $expected = array_map( + function ( $name, $info ) { + return [ 'name' => $name, 'version' => $info['version'] ]; + }, + array_keys( $expected ), + array_values( $expected ) + ); + + $this->assertSame( $expected, $this->doQuery( 'libraries' ) ); + } + + public function testExtensions() { + $tmpdir = $this->getNewTempDirectory(); + touch( "$tmpdir/ErsatzExtension.php" ); + touch( "$tmpdir/LICENSE" ); + touch( "$tmpdir/AUTHORS.txt" ); + + $val = [ + 'path' => "$tmpdir/ErsatzExtension.php", + 'name' => 'Ersatz Extension', + 'namemsg' => 'ersatz-extension-name', + 'author' => 'John Smith', + 'version' => '0.0.2', + 'url' => 'https://www.example.com/software/ersatz-extension', + 'description' => 'An extension that is not what it seems.', + 'descriptionmsg' => 'ersatz-extension-desc', + 'license-name' => 'PD', + ]; + + $this->setMwGlobals( 'wgExtensionCredits', [ 'api' => [ + $val, + [ + 'author' => [ 'John Smith', 'John Smith Jr.', '...' ], + 'descriptionmsg' => [ 'another-extension-desc', 'param' ] ], + ] ] ); + + $data = $this->doQuery( 'extensions' ); + + $this->assertCount( 2, $data ); + + $this->assertSame( 'api', $data[0]['type'] ); + + $sharedKeys = [ 'name', 'namemsg', 'description', 'descriptionmsg', 'author', 'url', + 'version', 'license-name' ]; + foreach ( $sharedKeys as $key ) { + $this->assertSame( $val[$key], $data[0][$key] ); + } + + // @todo Test git info + + $this->assertSame( + Title::newFromText( 'Special:Version/License/Ersatz Extension' )->getLinkURL(), + $data[0]['license'] + ); + + $this->assertSame( + Title::newFromText( 'Special:Version/Credits/Ersatz Extension' )->getLinkURL(), + $data[0]['credits'] + ); + + $this->assertSame( 'another-extension-desc', $data[1]['descriptionmsg'] ); + $this->assertSame( [ 'param' ], $data[1]['descriptionmsgparams'] ); + $this->assertSame( 'John Smith, John Smith Jr., ...', $data[1]['author'] ); + } + + /** + * @dataProvider rightsInfoProvider + */ + public function testRightsInfo( $page, $url, $text, $expectedUrl, $expectedText ) { + $this->setMwGlobals( [ + 'wgRightsPage' => $page, + 'wgRightsUrl' => $url, + 'wgRightsText' => $text, + ] ); + + $this->assertSame( + [ 'url' => $expectedUrl, 'text' => $expectedText ], + $this->doQuery( 'rightsinfo' ) + ); + } + + public function rightsInfoProvider() { + $textUrl = wfExpandUrl( Title::newFromText( 'License' ), PROTO_CURRENT ); + $url = 'http://license.example/'; + + return [ + 'No rights info' => [ null, null, null, '', '' ], + 'Only page' => [ 'License', null, null, $textUrl, 'License' ], + 'Only URL' => [ null, $url, null, $url, '' ], + 'Only text' => [ null, null, '!!!', '', '!!!' ], + // URL is ignored if page is specified + 'Page and URL' => [ 'License', $url, null, $textUrl, 'License' ], + 'URL and text' => [ null, $url, '!!!', $url, '!!!' ], + 'Page and text' => [ 'License', null, '!!!', $textUrl, '!!!' ], + 'Page and URL and text' => [ 'License', $url, '!!!', $textUrl, '!!!' ], + 'Pagename "0"' => [ '0', null, null, + wfExpandUrl( Title::newFromText( '0' ), PROTO_CURRENT ), '0' ], + 'URL "0"' => [ null, '0', null, '0', '' ], + 'Text "0"' => [ null, null, '0', '', '0' ], + ]; + } + + public function testRestrictions() { + global $wgRestrictionTypes, $wgRestrictionLevels, $wgCascadingRestrictionLevels, + $wgSemiprotectedRestrictionLevels; + + $this->assertSame( [ + 'types' => $wgRestrictionTypes, + 'levels' => $wgRestrictionLevels, + 'cascadinglevels' => $wgCascadingRestrictionLevels, + 'semiprotectedlevels' => $wgSemiprotectedRestrictionLevels, + ], $this->doQuery( 'restrictions' ) ); + } + + /** + * @dataProvider languagesProvider + */ + public function testLanguages( $langCode ) { + $expected = Language::fetchLanguageNames( (string)$langCode ); + + $expected = array_map( + function ( $code, $name ) { + return [ + 'code' => $code, + 'name' => $name + ]; + }, + array_keys( $expected ), + array_values( $expected ) + ); + + $data = $this->doQuery( 'languages', + $langCode !== null ? [ 'siinlanguagecode' => $langCode ] : [] ); + + $this->assertSame( $expected, $data ); + } + + public function languagesProvider() { + return [ [ null ], [ 'fr' ] ]; + } + + public function testLanguageVariants() { + $expectedKeys = array_filter( LanguageConverter::$languagesWithVariants, + function ( $langCode ) { + return !Language::factory( $langCode )->getConverter() instanceof FakeConverter; + } + ); + sort( $expectedKeys ); + + $this->assertSame( $expectedKeys, array_keys( $this->doQuery( 'languagevariants' ) ) ); + } + + public function testLanguageVariantsDisabled() { + $this->setMwGlobals( 'wgDisableLangConversion', true ); + + $this->assertSame( [], $this->doQuery( 'languagevariants' ) ); + } + + /** + * @todo Test a skin with a description that's known to be different in a different language. + * Vector will do, but it's not installed by default. + * + * @todo Test that an invalid language code doesn't actually try reading any messages + * + * @dataProvider skinsProvider + */ + public function testSkins( $code ) { + $data = $this->doQuery( 'skins', $code !== null ? [ 'siinlanguagecode' => $code ] : [] ); + + $expectedAllowed = Skin::getAllowedSkins(); + $expectedDefault = Skin::normalizeKey( 'default' ); + + $i = 0; + foreach ( Skin::getSkinNames() as $name => $displayName ) { + $this->assertSame( $name, $data[$i]['code'] ); + + $msg = wfMessage( "skinname-$name" ); + if ( $code && Language::isValidCode( $code ) ) { + $msg->inLanguage( $code ); + } else { + $msg->inContentLanguage(); + } + if ( $msg->exists() ) { + $displayName = $msg->text(); + } + $this->assertSame( $displayName, $data[$i]['name'] ); + + if ( !isset( $expectedAllowed[$name] ) ) { + $this->assertTrue( $data[$i]['unusable'], "$name must be unusable" ); + } + if ( $name === $expectedDefault ) { + $this->assertTrue( $data[$i]['default'], "$expectedDefault must be default" ); + } + $i++; + } + } + + public function skinsProvider() { + return [ + 'No language specified' => [ null ], + 'Czech' => [ 'cs' ], + 'Invalid language' => [ '/invalid/' ], + ]; + } + + public function testExtensionTags() { + global $wgParser; + + $expected = array_map( + function ( $tag ) { + return "<$tag>"; + }, + $wgParser->getTags() + ); + + $this->assertSame( $expected, $this->doQuery( 'extensiontags' ) ); + } + + public function testFunctionHooks() { + global $wgParser; + + $this->assertSame( $wgParser->getFunctionHooks(), $this->doQuery( 'functionhooks' ) ); + } + + public function testVariables() { + $this->assertSame( MagicWord::getVariableIDs(), $this->doQuery( 'variables' ) ); + } + + public function testProtocols() { + global $wgUrlProtocols; + + $this->assertSame( $wgUrlProtocols, $this->doQuery( 'protocols' ) ); + } + + public function testDefaultOptions() { + $this->assertSame( User::getDefaultOptions(), $this->doQuery( 'defaultoptions' ) ); + } + + public function testUploadDialog() { + global $wgUploadDialog; + + $this->assertSame( $wgUploadDialog, $this->doQuery( 'uploaddialog' ) ); + } + + public function testGetHooks() { + global $wgHooks; + + // Make sure there's something to report on + $this->setTemporaryHook( 'somehook', + function () { + return; + } + ); + + $expectedNames = $wgHooks; + ksort( $expectedNames ); + + $actualNames = array_map( + function ( $val ) { + return $val['name']; + }, + $this->doQuery( 'showhooks' ) + ); + + $this->assertSame( array_keys( $expectedNames ), $actualNames ); + } + + public function testContinuation() { + // We make lots and lots of URL protocols that are each 100 bytes + global $wgAPIMaxResultSize, $wgUrlProtocols; + + $this->setMwGlobals( 'wgUrlProtocols', [] ); + + // Just under the limit + $chunks = $wgAPIMaxResultSize / 100 - 1; + + for ( $i = 0; $i < $chunks; $i++ ) { + $wgUrlProtocols[] = substr( str_repeat( "$i ", 50 ), 0, 100 ); + } + + $res = $this->doApiRequest( [ + 'action' => 'query', + 'meta' => 'siteinfo', + 'siprop' => 'protocols|languages', + ] ); + + $this->assertSame( + wfMessage( 'apiwarn-truncatedresult', Message::numParam( $wgAPIMaxResultSize ) ) + ->text(), + $res[0]['warnings']['result']['warnings'] + ); + + $this->assertSame( $wgUrlProtocols, $res[0]['query']['protocols'] ); + $this->assertArrayNotHasKey( 'languages', $res[0] ); + $this->assertTrue( $res[0]['batchcomplete'], 'batchcomplete should be true' ); + $this->assertSame( [ 'siprop' => 'languages', 'continue' => '-||' ], $res[0]['continue'] ); + } +} diff --git a/tests/phpunit/includes/api/PrefixUniquenessTest.php b/tests/phpunit/includes/api/PrefixUniquenessTest.php deleted file mode 100644 index d125a7d531..0000000000 --- a/tests/phpunit/includes/api/PrefixUniquenessTest.php +++ /dev/null @@ -1,30 +0,0 @@ -getModuleManager(); - - $modules = $moduleManager->getNames(); - $prefixes = []; - - foreach ( $modules as $name ) { - $module = $moduleManager->getModule( $name ); - $class = get_class( $module ); - - $prefix = $module->getModulePrefix(); - if ( $prefix !== '' && isset( $prefixes[$prefix] ) ) { - $this->fail( "Module prefix '{$prefix}' is shared between {$class} and {$prefixes[$prefix]}" ); - } - $prefixes[$module->getModulePrefix()] = $class; - } - $this->assertTrue( true ); // dummy call to make this test non-incomplete - } -} diff --git a/tests/phpunit/includes/auth/AuthManagerTest.php b/tests/phpunit/includes/auth/AuthManagerTest.php index 7170e557fe..0c5d02671c 100644 --- a/tests/phpunit/includes/auth/AuthManagerTest.php +++ b/tests/phpunit/includes/auth/AuthManagerTest.php @@ -38,7 +38,6 @@ class AuthManagerTest extends \MediaWikiTestCase { parent::setUp(); $this->setMwGlobals( [ 'wgAuth' => null ] ); - $this->stashMwGlobals( [ 'wgHooks' ] ); } /** @@ -48,11 +47,10 @@ class AuthManagerTest extends \MediaWikiTestCase { * @return object $mock->expects( $expect )->method( ... ). */ protected function hook( $hook, $expect ) { - global $wgHooks; $mock = $this->getMockBuilder( __CLASS__ ) ->setMethods( [ "on$hook" ] ) ->getMock(); - $wgHooks[$hook] = [ $mock ]; + $this->setTemporaryHook( $hook, $mock ); return $mock->expects( $expect )->method( "on$hook" ); } @@ -613,42 +611,35 @@ class AuthManagerTest extends \MediaWikiTestCase { ); } - public function testSetDefaultUserOptions() { + /** + * @dataProvider provideSetDefaultUserOptions + */ + public function testSetDefaultUserOptions( + $contLang, $useContextLang, $expectedLang, $expectedVariant + ) { $this->initializeManager(); + $this->setContentLang( $contLang ); $context = \RequestContext::getMain(); $reset = new ScopedCallback( [ $context, 'setLanguage' ], [ $context->getLanguage() ] ); $context->setLanguage( 'de' ); - $this->setContentLang( 'zh' ); - - $user = \User::newFromName( self::usernameForCreation() ); - $user->addToDatabase(); - $oldToken = $user->getToken(); - $this->managerPriv->setDefaultUserOptions( $user, false ); - $user->saveSettings(); - $this->assertNotEquals( $oldToken, $user->getToken() ); - $this->assertSame( 'zh', $user->getOption( 'language' ) ); - $this->assertSame( 'zh', $user->getOption( 'variant' ) ); $user = \User::newFromName( self::usernameForCreation() ); $user->addToDatabase(); $oldToken = $user->getToken(); - $this->managerPriv->setDefaultUserOptions( $user, true ); + $this->managerPriv->setDefaultUserOptions( $user, $useContextLang ); $user->saveSettings(); $this->assertNotEquals( $oldToken, $user->getToken() ); - $this->assertSame( 'de', $user->getOption( 'language' ) ); - $this->assertSame( 'zh', $user->getOption( 'variant' ) ); - - $this->setContentLang( 'fr' ); + $this->assertSame( $expectedLang, $user->getOption( 'language' ) ); + $this->assertSame( $expectedVariant, $user->getOption( 'variant' ) ); + } - $user = \User::newFromName( self::usernameForCreation() ); - $user->addToDatabase(); - $oldToken = $user->getToken(); - $this->managerPriv->setDefaultUserOptions( $user, true ); - $user->saveSettings(); - $this->assertNotEquals( $oldToken, $user->getToken() ); - $this->assertSame( 'de', $user->getOption( 'language' ) ); - $this->assertSame( null, $user->getOption( 'variant' ) ); + public function provideSetDefaultUserOptions() { + return [ + [ 'zh', false, 'zh', 'zh' ], + [ 'zh', true, 'de', 'zh' ], + [ 'fr', true, 'de', null ], + ]; } public function testForcePrimaryAuthenticationProviders() { @@ -2380,7 +2371,8 @@ class AuthManagerTest extends \MediaWikiTestCase { $wgGroupPermissions['*']['createaccount'] = true; $wgGroupPermissions['*']['autocreateaccount'] = false; - \ObjectCache::$instances[__METHOD__] = new \HashBagOStuff(); + $this->mergeMwGlobalArrayValue( 'wgObjectCaches', + [ __METHOD__ => [ 'class' => 'HashBagOStuff' ] ] ); $this->setMwGlobals( [ 'wgMainCacheType' => __METHOD__ ] ); // Set up lots of mocks... diff --git a/tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php b/tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php index 1708f1c063..8863aa2d3f 100644 --- a/tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php @@ -128,11 +128,10 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC $user = self::getMutableTestUser()->getUser(); $dbw = wfGetDB( DB_MASTER ); - - $passwordFactory = new \PasswordFactory(); - $passwordFactory->init( \RequestContext::getMain()->getConfig() ); + $config = MediaWikiServices::getInstance()->getMainConfig(); // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only - $passwordFactory->setDefaultType( 'A' ); + $passwordFactory = new \PasswordFactory( $config->get( 'PasswordConfig' ), 'A' ); + $pwhash = $passwordFactory->newFromPlaintext( 'password' )->toString(); $provider = $this->getProvider(); diff --git a/tests/phpunit/includes/cache/MessageCacheTest.php b/tests/phpunit/includes/cache/MessageCacheTest.php index b03eeba295..1edb9354ff 100644 --- a/tests/phpunit/includes/cache/MessageCacheTest.php +++ b/tests/phpunit/includes/cache/MessageCacheTest.php @@ -1,5 +1,7 @@ configureLanguages(); + MessageCache::destroyInstance(); MessageCache::singleton()->enable(); } @@ -57,12 +60,10 @@ class MessageCacheTest extends MediaWikiLangTestCase { * @param string|null $content Content of the created page, or null for a generic string */ protected function makePage( $title, $lang, $content = null ) { - global $wgContLang; - if ( $content === null ) { $content = $lang; } - if ( $lang !== $wgContLang->getCode() ) { + if ( $lang !== MediaWikiServices::getInstance()->getContentLanguage()->getCode() ) { $title = "$title/$lang"; } @@ -100,11 +101,9 @@ class MessageCacheTest extends MediaWikiLangTestCase { } public function testReplaceMsg() { - global $wgContLang; - $messageCache = MessageCache::singleton(); $message = 'go'; - $uckey = $wgContLang->ucfirst( $message ); + $uckey = MediaWikiServices::getInstance()->getContentLanguage()->ucfirst( $message ); $oldText = $messageCache->get( $message ); // "Ausführen" $dbw = wfGetDB( DB_MASTER ); diff --git a/tests/phpunit/includes/content/ContentHandlerTest.php b/tests/phpunit/includes/content/ContentHandlerTest.php index 323a63d788..43edf60fea 100644 --- a/tests/phpunit/includes/content/ContentHandlerTest.php +++ b/tests/phpunit/includes/content/ContentHandlerTest.php @@ -1,5 +1,6 @@ assertContains( 'Ferrari', ContentHandler::getContentModels() ); } + + /** + * @covers ContentHandler::getSlotDiffRenderer + */ + public function testGetSlotDiffRenderer_default() { + $this->mergeMwGlobalArrayValue( 'wgHooks', [ + 'GetSlotDiffRenderer' => [], + ] ); + + // test default renderer + $contentHandler = new WikitextContentHandler( CONTENT_MODEL_WIKITEXT ); + $slotDiffRenderer = $contentHandler->getSlotDiffRenderer( RequestContext::getMain() ); + $this->assertInstanceOf( TextSlotDiffRenderer::class, $slotDiffRenderer ); + } + + /** + * @covers ContentHandler::getSlotDiffRenderer + */ + public function testGetSlotDiffRenderer_bc() { + $this->mergeMwGlobalArrayValue( 'wgHooks', [ + 'GetSlotDiffRenderer' => [], + ] ); + + // test B/C renderer + $customDifferenceEngine = $this->getMockBuilder( DifferenceEngine::class ) + ->disableOriginalConstructor() + ->getMock(); + // hack to track object identity across cloning + $customDifferenceEngine->objectId = 12345; + $customContentHandler = $this->getMockBuilder( ContentHandler::class ) + ->setConstructorArgs( [ 'foo', [] ] ) + ->setMethods( [ 'createDifferenceEngine' ] ) + ->getMockForAbstractClass(); + $customContentHandler->expects( $this->any() ) + ->method( 'createDifferenceEngine' ) + ->willReturn( $customDifferenceEngine ); + /** @var $customContentHandler ContentHandler */ + $slotDiffRenderer = $customContentHandler->getSlotDiffRenderer( RequestContext::getMain() ); + $this->assertInstanceOf( DifferenceEngineSlotDiffRenderer::class, $slotDiffRenderer ); + $this->assertSame( + $customDifferenceEngine->objectId, + TestingAccessWrapper::newFromObject( $slotDiffRenderer )->differenceEngine->objectId + ); + } + + /** + * @covers ContentHandler::getSlotDiffRenderer + */ + public function testGetSlotDiffRenderer_nobc() { + $this->mergeMwGlobalArrayValue( 'wgHooks', [ + 'GetSlotDiffRenderer' => [], + ] ); + + // test that B/C renderer does not get used when getSlotDiffRendererInternal is overridden + $customDifferenceEngine = $this->getMockBuilder( DifferenceEngine::class ) + ->disableOriginalConstructor() + ->getMock(); + $customSlotDiffRenderer = $this->getMockBuilder( SlotDiffRenderer::class ) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $customContentHandler2 = $this->getMockBuilder( ContentHandler::class ) + ->setConstructorArgs( [ 'bar', [] ] ) + ->setMethods( [ 'createDifferenceEngine', 'getSlotDiffRendererInternal' ] ) + ->getMockForAbstractClass(); + $customContentHandler2->expects( $this->any() ) + ->method( 'createDifferenceEngine' ) + ->willReturn( $customDifferenceEngine ); + $customContentHandler2->expects( $this->any() ) + ->method( 'getSlotDiffRendererInternal' ) + ->willReturn( $customSlotDiffRenderer ); + /** @var $customContentHandler2 ContentHandler */ + $slotDiffRenderer = $customContentHandler2->getSlotDiffRenderer( RequestContext::getMain() ); + $this->assertSame( $customSlotDiffRenderer, $slotDiffRenderer ); + } + + /** + * @covers ContentHandler::getSlotDiffRenderer + */ + public function testGetSlotDiffRenderer_hook() { + $this->mergeMwGlobalArrayValue( 'wgHooks', [ + 'GetSlotDiffRenderer' => [], + ] ); + + // test that the hook handler takes precedence + $customDifferenceEngine = $this->getMockBuilder( DifferenceEngine::class ) + ->disableOriginalConstructor() + ->getMock(); + $customContentHandler = $this->getMockBuilder( ContentHandler::class ) + ->setConstructorArgs( [ 'foo', [] ] ) + ->setMethods( [ 'createDifferenceEngine' ] ) + ->getMockForAbstractClass(); + $customContentHandler->expects( $this->any() ) + ->method( 'createDifferenceEngine' ) + ->willReturn( $customDifferenceEngine ); + /** @var $customContentHandler ContentHandler */ + + $customSlotDiffRenderer = $this->getMockBuilder( SlotDiffRenderer::class ) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $customContentHandler2 = $this->getMockBuilder( ContentHandler::class ) + ->setConstructorArgs( [ 'bar', [] ] ) + ->setMethods( [ 'createDifferenceEngine', 'getSlotDiffRendererInternal' ] ) + ->getMockForAbstractClass(); + $customContentHandler2->expects( $this->any() ) + ->method( 'createDifferenceEngine' ) + ->willReturn( $customDifferenceEngine ); + $customContentHandler2->expects( $this->any() ) + ->method( 'getSlotDiffRendererInternal' ) + ->willReturn( $customSlotDiffRenderer ); + /** @var $customContentHandler2 ContentHandler */ + + $customSlotDiffRenderer2 = $this->getMockBuilder( SlotDiffRenderer::class ) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->setTemporaryHook( 'GetSlotDiffRenderer', + function ( $handler, &$slotDiffRenderer ) use ( $customSlotDiffRenderer2 ) { + $slotDiffRenderer = $customSlotDiffRenderer2; + } ); + + $slotDiffRenderer = $customContentHandler->getSlotDiffRenderer( RequestContext::getMain() ); + $this->assertSame( $customSlotDiffRenderer2, $slotDiffRenderer ); + $slotDiffRenderer = $customContentHandler2->getSlotDiffRenderer( RequestContext::getMain() ); + $this->assertSame( $customSlotDiffRenderer2, $slotDiffRenderer ); + } + } diff --git a/tests/phpunit/includes/content/TextContentTest.php b/tests/phpunit/includes/content/TextContentTest.php index 406bc96b95..b01a7db04a 100644 --- a/tests/phpunit/includes/content/TextContentTest.php +++ b/tests/phpunit/includes/content/TextContentTest.php @@ -1,5 +1,7 @@ context->getUser(), $wgContLang ); + $options = ParserOptions::newFromUserAndLang( $this->context->getUser(), + MediaWikiServices::getInstance()->getContentLanguage() ); $content = $this->newContent( $text ); $content = $content->preSaveTransform( @@ -143,8 +144,8 @@ class TextContentTest extends MediaWikiLangTestCase { * @covers TextContent::preloadTransform */ public function testPreloadTransform( $text, $expected ) { - global $wgContLang; - $options = ParserOptions::newFromUserAndLang( $this->context->getUser(), $wgContLang ); + $options = ParserOptions::newFromUserAndLang( $this->context->getUser(), + MediaWikiServices::getInstance()->getContentLanguage() ); $content = $this->newContent( $text ); $content = $content->preloadTransform( $this->context->getTitle(), $options ); diff --git a/tests/phpunit/includes/content/WikitextContentHandlerTest.php b/tests/phpunit/includes/content/WikitextContentHandlerTest.php index 4bb1ed2501..b4b2948ba8 100644 --- a/tests/phpunit/includes/content/WikitextContentHandlerTest.php +++ b/tests/phpunit/includes/content/WikitextContentHandlerTest.php @@ -80,8 +80,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase { * @covers WikitextContentHandler::makeRedirectContent */ public function testMakeRedirectContent( $title, $expected ) { - global $wgContLang; - $wgContLang->resetNamespaces(); + MediaWikiServices::getInstance()->getContentLanguage()->resetNamespaces(); MediaWikiServices::getInstance()->resetServiceForTesting( 'MagicWordFactory' ); diff --git a/tests/phpunit/includes/content/WikitextContentTest.php b/tests/phpunit/includes/content/WikitextContentTest.php index 687c7e034c..91255eb0f5 100644 --- a/tests/phpunit/includes/content/WikitextContentTest.php +++ b/tests/phpunit/includes/content/WikitextContentTest.php @@ -442,4 +442,19 @@ just a test" // @todo more...? ]; } + + /** + * @covers WikitextContent::preSaveTransform + * @covers WikitextContent::fillParserOutput + */ + public function testHadSignature() { + $titleObj = Title::newFromText( __CLASS__ ); + + $content = new WikitextContent( '~~~~' ); + $pstContent = $content->preSaveTransform( + $titleObj, $this->getTestUser()->getUser(), new ParserOptions() + ); + + $this->assertTrue( $pstContent->getParserOutput( $titleObj )->getFlag( 'user-signature' ) ); + } } diff --git a/tests/phpunit/includes/db/LoadBalancerTest.php b/tests/phpunit/includes/db/LoadBalancerTest.php index 5a748ccd0e..2c4e6b421b 100644 --- a/tests/phpunit/includes/db/LoadBalancerTest.php +++ b/tests/phpunit/includes/db/LoadBalancerTest.php @@ -311,6 +311,20 @@ class LoadBalancerTest extends MediaWikiTestCase { $lb->getAnyOpenConnection( $i, $lb::CONN_TRX_AUTOCOMMIT ) ); $this->assertEquals( $conn2, $lb->getConnection( $i, [], false, $lb::CONN_TRX_AUTOCOMMIT ) ); + + $conn2->startAtomic( __METHOD__ ); + try { + $lb->getConnection( $i, [], false, $lb::CONN_TRX_AUTOCOMMIT ); + $conn2->endAtomic( __METHOD__ ); + $this->fail( "No exception thrown." ); + } catch ( DBUnexpectedError $e ) { + $this->assertEquals( + 'Wikimedia\Rdbms\LoadBalancer::openConnection: ' . + 'CONN_TRX_AUTOCOMMIT handle has a transaction.', + $e->getMessage() + ); + } + $conn2->endAtomic( __METHOD__ ); } $lb->closeAll(); diff --git a/tests/phpunit/includes/diff/CustomDifferenceEngine.php b/tests/phpunit/includes/diff/CustomDifferenceEngine.php new file mode 100644 index 0000000000..c760d02978 --- /dev/null +++ b/tests/phpunit/includes/diff/CustomDifferenceEngine.php @@ -0,0 +1,23 @@ +getNativeData() . '|' . $new->getNativeData(); + } + + public function showDiffStyle() { + $this->getOutput()->addModules( 'foo' ); + } + + public function getDiffBodyCacheKeyParams() { + $params = parent::getDiffBodyCacheKeyParams(); + $params[] = 'foo'; + return $params; + } + +} diff --git a/tests/phpunit/includes/diff/DifferenceEngineSlotDiffRendererTest.php b/tests/phpunit/includes/diff/DifferenceEngineSlotDiffRendererTest.php new file mode 100644 index 0000000000..fe129b751a --- /dev/null +++ b/tests/phpunit/includes/diff/DifferenceEngineSlotDiffRendererTest.php @@ -0,0 +1,44 @@ +getDiff( $oldContent, $newContent ); + $this->assertEquals( 'xxx|yyy', $diff ); + + $diff = $slotDiffRenderer->getDiff( null, $newContent ); + $this->assertEquals( '|yyy', $diff ); + + $diff = $slotDiffRenderer->getDiff( $oldContent, null ); + $this->assertEquals( 'xxx|', $diff ); + } + + public function testAddModules() { + $output = $this->getMockBuilder( OutputPage::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'addModules' ] ) + ->getMock(); + $output->expects( $this->once() ) + ->method( 'addModules' ) + ->with( 'foo' ); + $differenceEngine = new CustomDifferenceEngine(); + $slotDiffRenderer = new DifferenceEngineSlotDiffRenderer( $differenceEngine ); + $slotDiffRenderer->addModules( $output ); + } + + public function testGetExtraCacheKeys() { + $differenceEngine = new CustomDifferenceEngine(); + $slotDiffRenderer = new DifferenceEngineSlotDiffRenderer( $differenceEngine ); + $extraCacheKeys = $slotDiffRenderer->getExtraCacheKeys(); + $this->assertSame( [ 'foo' ], $extraCacheKeys ); + } + +} diff --git a/tests/phpunit/includes/diff/DifferenceEngineTest.php b/tests/phpunit/includes/diff/DifferenceEngineTest.php index 57aeb20026..40f68077c9 100644 --- a/tests/phpunit/includes/diff/DifferenceEngineTest.php +++ b/tests/phpunit/includes/diff/DifferenceEngineTest.php @@ -1,5 +1,8 @@ assertEquals( $expected, $diffEngine->addLocalisedTitleTooltips( $input ) ); } + /** + * @dataProvider provideGenerateContentDiffBody + */ + public function testGenerateContentDiffBody( + Content $oldContent, Content $newContent, $expectedDiff + ) { + // Set $wgExternalDiffEngine to something bogus to try to force use of + // the PHP engine rather than wikidiff2. + $this->setMwGlobals( [ + 'wgExternalDiffEngine' => '/dev/null', + ] ); + + $differenceEngine = new DifferenceEngine(); + $diff = $differenceEngine->generateContentDiffBody( $oldContent, $newContent ); + $this->assertSame( $expectedDiff, $this->getPlainDiff( $diff ) ); + } + + public function provideGenerateContentDiffBody() { + $this->mergeMwGlobalArrayValue( 'wgContentHandlers', [ + 'testing-nontext' => DummyNonTextContentHandler::class, + ] ); + $content1 = ContentHandler::makeContent( 'xxx', null, CONTENT_MODEL_TEXT ); + $content2 = ContentHandler::makeContent( 'yyy', null, CONTENT_MODEL_TEXT ); + + return [ + 'self-diff' => [ $content1, $content1, '' ], + 'text diff' => [ $content1, $content2, '-xxx+yyy' ], + ]; + } + + public function testGenerateTextDiffBody() { + // Set $wgExternalDiffEngine to something bogus to try to force use of + // the PHP engine rather than wikidiff2. + $this->setMwGlobals( [ + 'wgExternalDiffEngine' => '/dev/null', + ] ); + + $oldText = "aaa\nbbb\nccc"; + $newText = "aaa\nxxx\nccc"; + $expectedDiff = " aaa aaa\n-bbb+xxx\n ccc ccc"; + + $differenceEngine = new DifferenceEngine(); + $diff = $differenceEngine->generateTextDiffBody( $oldText, $newText ); + $this->assertSame( $expectedDiff, $this->getPlainDiff( $diff ) ); + } + + public function testSetContent() { + // Set $wgExternalDiffEngine to something bogus to try to force use of + // the PHP engine rather than wikidiff2. + $this->setMwGlobals( [ + 'wgExternalDiffEngine' => '/dev/null', + ] ); + + $oldContent = ContentHandler::makeContent( 'xxx', null, CONTENT_MODEL_TEXT ); + $newContent = ContentHandler::makeContent( 'yyy', null, CONTENT_MODEL_TEXT ); + + $differenceEngine = new DifferenceEngine(); + $differenceEngine->setContent( $oldContent, $newContent ); + $diff = $differenceEngine->getDiffBody(); + $this->assertSame( "Line 1:\nLine 1:\n-xxx+yyy", $this->getPlainDiff( $diff ) ); + } + + public function testSetRevisions() { + $main1 = SlotRecord::newUnsaved( 'main', + ContentHandler::makeContent( 'xxx', null, CONTENT_MODEL_TEXT ) ); + $main2 = SlotRecord::newUnsaved( 'main', + ContentHandler::makeContent( 'yyy', null, CONTENT_MODEL_TEXT ) ); + $rev1 = $this->getRevisionRecord( $main1 ); + $rev2 = $this->getRevisionRecord( $main2 ); + + $differenceEngine = new DifferenceEngine(); + $differenceEngine->setRevisions( $rev1, $rev2 ); + $this->assertSame( $rev1, $differenceEngine->getOldRevision() ); + $this->assertSame( $rev2, $differenceEngine->getNewRevision() ); + $this->assertSame( true, $differenceEngine->loadRevisionData() ); + $this->assertSame( true, $differenceEngine->loadText() ); + + $differenceEngine->setRevisions( null, $rev2 ); + $this->assertSame( null, $differenceEngine->getOldRevision() ); + } + + /** + * @dataProvider provideGetDiffBody + */ + public function testGetDiffBody( + RevisionRecord $oldRevision = null, RevisionRecord $newRevision = null, $expectedDiff + ) { + // Set $wgExternalDiffEngine to something bogus to try to force use of + // the PHP engine rather than wikidiff2. + $this->setMwGlobals( [ + 'wgExternalDiffEngine' => '/dev/null', + ] ); + + if ( $expectedDiff instanceof Exception ) { + $this->setExpectedException( get_class( $expectedDiff ), $expectedDiff->getMessage() ); + } + $differenceEngine = new DifferenceEngine(); + $differenceEngine->setRevisions( $oldRevision, $newRevision ); + if ( $expectedDiff instanceof Exception ) { + return; + } + + $diff = $differenceEngine->getDiffBody(); + $this->assertSame( $expectedDiff, $this->getPlainDiff( $diff ) ); + } + + public function provideGetDiffBody() { + $main1 = SlotRecord::newUnsaved( 'main', + ContentHandler::makeContent( 'xxx', null, CONTENT_MODEL_TEXT ) ); + $main2 = SlotRecord::newUnsaved( 'main', + ContentHandler::makeContent( 'yyy', null, CONTENT_MODEL_TEXT ) ); + $slot1 = SlotRecord::newUnsaved( 'slot', + ContentHandler::makeContent( 'aaa', null, CONTENT_MODEL_TEXT ) ); + $slot2 = SlotRecord::newUnsaved( 'slot', + ContentHandler::makeContent( 'bbb', null, CONTENT_MODEL_TEXT ) ); + + return [ + 'revision vs. null' => [ + null, + $this->getRevisionRecord( $main1, $slot1 ), + '', + ], + 'revision vs. itself' => [ + $this->getRevisionRecord( $main1, $slot1 ), + $this->getRevisionRecord( $main1, $slot1 ), + '', + ], + 'different text in one slot' => [ + $this->getRevisionRecord( $main1, $slot1 ), + $this->getRevisionRecord( $main1, $slot2 ), + "slotLine 1:\nLine 1:\n-aaa+bbb", + ], + 'different text in two slots' => [ + $this->getRevisionRecord( $main1, $slot1 ), + $this->getRevisionRecord( $main2, $slot2 ), + "Line 1:\nLine 1:\n-xxx+yyy\nslotLine 1:\nLine 1:\n-aaa+bbb", + ], + 'new slot' => [ + $this->getRevisionRecord( $main1 ), + $this->getRevisionRecord( $main1, $slot1 ), + "slotLine 1:\nLine 1:\n- +aaa", + ], + ]; + } + + public function testRecursion() { + // Set up a ContentHandler which will return a wrapped DifferenceEngine as + // SlotDiffRenderer, then pass it a content which uses the same ContentHandler. + // This tests the anti-recursion logic in DifferenceEngine::generateContentDiffBody. + + $customDifferenceEngine = $this->getMockBuilder( DifferenceEngine::class ) + ->enableProxyingToOriginalMethods() + ->getMock(); + $customContentHandler = $this->getMockBuilder( ContentHandler::class ) + ->setConstructorArgs( [ 'foo', [] ] ) + ->setMethods( [ 'createDifferenceEngine' ] ) + ->getMockForAbstractClass(); + $customContentHandler->expects( $this->any() ) + ->method( 'createDifferenceEngine' ) + ->willReturn( $customDifferenceEngine ); + /** @var $customContentHandler ContentHandler */ + $customContent = $this->getMockBuilder( Content::class ) + ->setMethods( [ 'getContentHandler' ] ) + ->getMockForAbstractClass(); + $customContent->expects( $this->any() ) + ->method( 'getContentHandler' ) + ->willReturn( $customContentHandler ); + /** @var $customContent Content */ + $customContent2 = clone $customContent; + + $slotDiffRenderer = $customContentHandler->getSlotDiffRenderer( RequestContext::getMain() ); + $this->setExpectedException( Exception::class, + ': could not maintain backwards compatibility. Please use a SlotDiffRenderer.' ); + $slotDiffRenderer->getDiff( $customContent, $customContent2 ); + } + + /** + * Convert a HTML diff to a human-readable format and hopefully make the test less fragile. + * @param string diff + * @return string + */ + private function getPlainDiff( $diff ) { + $replacements = [ + html_entity_decode( ' ' ) => ' ', + html_entity_decode( '−' ) => '-', + ]; + return str_replace( array_keys( $replacements ), array_values( $replacements ), + trim( strip_tags( $diff ), "\n" ) ); + } + + /** + * @param SlotRecord[] $slots + * @return MutableRevisionRecord + */ + private function getRevisionRecord( ...$slots ) { + $title = Title::newFromText( 'Foo' ); + $revision = new MutableRevisionRecord( $title ); + foreach ( $slots as $slot ) { + $revision->setSlot( $slot ); + } + return $revision; + } + } diff --git a/tests/phpunit/includes/diff/TextSlotDiffRendererTest.php b/tests/phpunit/includes/diff/TextSlotDiffRendererTest.php new file mode 100644 index 0000000000..ec45e29d67 --- /dev/null +++ b/tests/phpunit/includes/diff/TextSlotDiffRendererTest.php @@ -0,0 +1,113 @@ +setExpectedException( get_class( $expectedResult ), $expectedResult->getMessage() ); + } + + $slotDiffRenderer = $this->getTextSlotDiffRenderer(); + $diff = $slotDiffRenderer->getDiff( $oldContent, $newContent ); + if ( $expectedResult instanceof Exception ) { + return; + } + $plainDiff = $this->getPlainDiff( $diff ); + $this->assertSame( $expectedResult, $plainDiff ); + } + + public function provideGetDiff() { + $this->mergeMwGlobalArrayValue( 'wgContentHandlers', [ + 'testing' => DummyContentHandlerForTesting::class, + 'testing-nontext' => DummyNonTextContentHandler::class, + ] ); + + return [ + 'same text' => [ + $this->makeContent( "aaa\nbbb\nccc" ), + $this->makeContent( "aaa\nbbb\nccc" ), + "", + ], + 'different text' => [ + $this->makeContent( "aaa\nbbb\nccc" ), + $this->makeContent( "aaa\nxxx\nccc" ), + " aaa aaa\n-bbb+xxx\n ccc ccc", + ], + 'no right content' => [ + $this->makeContent( "aaa\nbbb\nccc" ), + null, + "-aaa+ \n-bbb \n-ccc ", + ], + 'no left content' => [ + null, + $this->makeContent( "aaa\nbbb\nccc" ), + "- +aaa\n +bbb\n +ccc", + ], + 'no content' => [ + null, + null, + new InvalidArgumentException( '$oldContent and $newContent cannot both be null' ), + ], + 'non-text left content' => [ + $this->makeContent( '', 'testing-nontext' ), + $this->makeContent( "aaa\nbbb\nccc" ), + new InvalidArgumentException( 'TextSlotDiffRenderer does not handle DummyNonTextContent' ), + ], + 'non-text right content' => [ + $this->makeContent( "aaa\nbbb\nccc" ), + $this->makeContent( '', 'testing-nontext' ), + new InvalidArgumentException( 'TextSlotDiffRenderer does not handle DummyNonTextContent' ), + ], + ]; + } + + // no separate test for getTextDiff() as getDiff() is just a thin wrapper around it + + /** + * @return TextSlotDiffRenderer + */ + private function getTextSlotDiffRenderer() { + $slotDiffRenderer = new TextSlotDiffRenderer(); + $slotDiffRenderer->setStatsdDataFactory( new NullStatsdDataFactory() ); + $slotDiffRenderer->setLanguage( Language::factory( 'en' ) ); + $slotDiffRenderer->setWikiDiff2MovedParagraphDetectionCutoff( 0 ); + $slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_PHP ); + return $slotDiffRenderer; + } + + /** + * Convert a HTML diff to a human-readable format and hopefully make the test less fragile. + * @param string diff + * @return string + */ + private function getPlainDiff( $diff ) { + $replacements = [ + html_entity_decode( ' ' ) => ' ', + html_entity_decode( '−' ) => '-', + ]; + return str_replace( array_keys( $replacements ), array_values( $replacements ), + trim( strip_tags( $diff ), "\n" ) ); + } + + /** + * @param string $str + * @param string $model + * @return null|TextContent + */ + private function makeContent( $str, $model = CONTENT_MODEL_TEXT ) { + return ContentHandler::makeContent( $str, null, $model ); + } + +} diff --git a/tests/phpunit/includes/libs/CSSMinTest.php b/tests/phpunit/includes/libs/CSSMinTest.php index 04aecc9086..ef333f9420 100644 --- a/tests/phpunit/includes/libs/CSSMinTest.php +++ b/tests/phpunit/includes/libs/CSSMinTest.php @@ -667,7 +667,7 @@ class CSSMinTest extends MediaWikiTestCase { } /** - * Seperated because they are currently broken (T37492) + * Separated because they are currently broken (T37492) * * @group Broken * @dataProvider provideStringCases diff --git a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php index 61056784fb..54dc583b10 100644 --- a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php +++ b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php @@ -4,6 +4,19 @@ class JavaScriptMinifierTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; + protected function tearDown() { + parent::tearDown(); + // Reset + $this->setMaxLineLength( 1000 ); + } + + private function setMaxLineLength( $val ) { + $classReflect = new ReflectionClass( JavaScriptMinifier::class ); + $propertyReflect = $classReflect->getProperty( 'maxLineLength' ); + $propertyReflect->setAccessible( true ); + $propertyReflect->setValue( JavaScriptMinifier::class, $val ); + } + public static function provideCases() { return [ @@ -152,9 +165,6 @@ class JavaScriptMinifierTest extends PHPUnit\Framework\TestCase { ], [ "if(1)/a /g.exec('Pa ss');", "if(1)/a /g.exec('Pa ss');" ], - // newline insertion after 1000 chars: break after the "++", not before - [ str_repeat( ';', 996 ) . "if(x++);", str_repeat( ';', 996 ) . "if(x++\n);" ], - // Unicode letter characters should pass through ok in identifiers (T33187) [ "var KaŝSkatolVal = {}", 'var KaŝSkatolVal={}' ], @@ -203,40 +213,155 @@ class JavaScriptMinifierTest extends PHPUnit\Framework\TestCase { ); } - public static function provideExponentLineBreaking() { + public static function provideLineBreaker() { return [ [ - // This one gets interpreted all together by the prior code; - // no break at the 'E' happens. - '1.23456789E55', + // Regression tests for T34548. + // Must not break between 'E' and '+'. + 'var name = 1.23456789E55;', + [ + 'var', + 'name', + '=', + '1.23456789E55', + ';', + ], + ], + [ + 'var name = 1.23456789E+5;', + [ + 'var', + 'name', + '=', + '1.23456789E+5', + ';', + ], + ], + [ + 'var name = 1.23456789E-5;', + [ + 'var', + 'name', + '=', + '1.23456789E-5', + ';', + ], ], [ - // This one breaks under the bad code; splits between 'E' and '+' - '1.23456789E+5', + // Must not break before '++' + 'if(x++);', + [ + 'if', + '(', + 'x++', + ')', + ';', + ], ], [ - // This one breaks under the bad code; splits between 'E' and '-' - '1.23456789E-5', + // Regression test for T201606. + // Must not break between 'return' and Expression. + // Was caused by bad state after '{}' in property value. + <<assertEquals( $expected, $minified, "Line breaks must not occur in middle of exponent" ); + public function testLineBreaker( $code, array $expectedLines ) { + $this->setMaxLineLength( 1 ); + $actual = JavaScriptMinifier::minify( $code ); + $this->assertEquals( + array_merge( [ '' ], $expectedLines ), + explode( "\n", $actual ) + ); } } diff --git a/tests/phpunit/includes/libs/MapCacheLRUTest.php b/tests/phpunit/includes/libs/MapCacheLRUTest.php index a06ef62dfc..7147c6fa22 100644 --- a/tests/phpunit/includes/libs/MapCacheLRUTest.php +++ b/tests/phpunit/includes/libs/MapCacheLRUTest.php @@ -214,4 +214,54 @@ class MapCacheLRUTest extends PHPUnit\Framework\TestCase { $this->assertEquals( 1983, $cache->getField( 'MPs', 'Edwina Currie' ) ); $this->assertEquals( 1970, $cache->getField( 'MPs', 'Neil Kinnock' ) ); } + + /** + * @covers MapCacheLRU::has() + * @covers MapCacheLRU::get() + * @covers MapCacheLRU::set() + * @covers MapCacheLRU::hasField() + * @covers MapCacheLRU::getField() + * @covers MapCacheLRU::setField() + */ + public function testInvalidKeys() { + $cache = MapCacheLRU::newFromArray( [], 3 ); + + try { + $cache->has( 3.4 ); + $this->fail( "No exception" ); + } catch ( UnexpectedValueException $e ) { + $this->assertRegExp( '/must be string or integer/', $e->getMessage() ); + } + try { + $cache->get( false ); + $this->fail( "No exception" ); + } catch ( UnexpectedValueException $e ) { + $this->assertRegExp( '/must be string or integer/', $e->getMessage() ); + } + try { + $cache->set( 3.4, 'x' ); + $this->fail( "No exception" ); + } catch ( UnexpectedValueException $e ) { + $this->assertRegExp( '/must be string or integer/', $e->getMessage() ); + } + + try { + $cache->hasField( 'x', 3.4 ); + $this->fail( "No exception" ); + } catch ( UnexpectedValueException $e ) { + $this->assertRegExp( '/must be string or integer/', $e->getMessage() ); + } + try { + $cache->getField( 'x', false ); + $this->fail( "No exception" ); + } catch ( UnexpectedValueException $e ) { + $this->assertRegExp( '/must be string or integer/', $e->getMessage() ); + } + try { + $cache->setField( 'x', 3.4, 'x' ); + $this->fail( "No exception" ); + } catch ( UnexpectedValueException $e ) { + $this->assertRegExp( '/must be string or integer/', $e->getMessage() ); + } + } } diff --git a/tests/phpunit/includes/libs/StaticArrayWriterTest.php b/tests/phpunit/includes/libs/StaticArrayWriterTest.php new file mode 100644 index 0000000000..276fee3f6c --- /dev/null +++ b/tests/phpunit/includes/libs/StaticArrayWriterTest.php @@ -0,0 +1,49 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +use Wikimedia\StaticArrayWriter; + +/** + * @covers \Wikimedia\StaticArrayWriter + */ +class StaticArrayWriterTest extends PHPUnit\Framework\TestCase { + public function testCreate() { + $data = [ + 'foo' => 'bar', + 'baz' => 'rawr', + "they're" => '"quoted properly"', + ]; + $writer = new StaticArrayWriter(); + $actual = $writer->create( $data, "Header\nWith\nNewlines" ); + $expected = << 'bar', + 'baz' => 'rawr', + 'they\'re' => '"quoted properly"', +]; + +PHP; + $this->assertSame( $expected, $actual ); + } +} diff --git a/tests/phpunit/includes/libs/XhprofDataTest.php b/tests/phpunit/includes/libs/XhprofDataTest.php index 1cbd86f1ef..3e9379456d 100644 --- a/tests/phpunit/includes/libs/XhprofDataTest.php +++ b/tests/phpunit/includes/libs/XhprofDataTest.php @@ -19,8 +19,6 @@ */ /** - * @uses XhprofData - * @uses AutoLoader * @copyright © 2014 Wikimedia Foundation and contributors * @since 1.25 */ @@ -154,7 +152,6 @@ class XhprofDataTest extends PHPUnit\Framework\TestCase { /** * @covers XhprofData::getCallers * @covers XhprofData::getCallees - * @uses XhprofData */ public function testEdges() { $xhprofData = $this->getXhprofDataFixture(); @@ -170,7 +167,6 @@ class XhprofDataTest extends PHPUnit\Framework\TestCase { /** * @covers XhprofData::getCriticalPath - * @uses XhprofData */ public function testCriticalPath() { $xhprofData = $this->getXhprofDataFixture(); diff --git a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php index 662bb9617c..22aa6671bb 100644 --- a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php +++ b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php @@ -1569,6 +1569,44 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase { $wanCache->resetCheckKey( 'test' ); } + public function testEpoch() { + $bag = new HashBagOStuff(); + $cache = new WANObjectCache( [ 'cache' => $bag, 'pool' => 'testcache-hash' ] ); + $key = $cache->makeGlobalKey( 'The whole of the Law' ); + + $now = microtime( true ); + $cache->setMockTime( $now ); + + $cache->set( $key, 'Do what thou Wilt' ); + $cache->touchCheckKey( $key ); + + $then = $now; + $now += 30; + $this->assertEquals( 'Do what thou Wilt', $cache->get( $key ) ); + $this->assertEquals( $then, $cache->getCheckKeyTime( $key ), 'Check key init', 0.01 ); + + $cache = new WANObjectCache( [ + 'cache' => $bag, + 'pool' => 'testcache-hash', + 'epoch' => $now - 3600 + ] ); + $cache->setMockTime( $now ); + + $this->assertEquals( 'Do what thou Wilt', $cache->get( $key ) ); + $this->assertEquals( $then, $cache->getCheckKeyTime( $key ), 'Check key kept', 0.01 ); + + $now += 30; + $cache = new WANObjectCache( [ + 'cache' => $bag, + 'pool' => 'testcache-hash', + 'epoch' => $now + 3600 + ] ); + $cache->setMockTime( $now ); + + $this->assertFalse( $cache->get( $key ), 'Key rejected due to epoch' ); + $this->assertEquals( $now, $cache->getCheckKeyTime( $key ), 'Check key reset', 0.01 ); + } + /** * @dataProvider provideAdaptiveTTL * @covers WANObjectCache::adaptiveTTL() diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php index 8f4aae365f..abde37aed2 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php @@ -2,6 +2,7 @@ use Wikimedia\Rdbms\Database; use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DatabaseDomain; use Wikimedia\Rdbms\DatabaseMysqli; use Wikimedia\Rdbms\LBFactorySingle; use Wikimedia\Rdbms\TransactionProfiler; @@ -453,6 +454,7 @@ class DatabaseTest extends PHPUnit\Framework\TestCase { $wdb->trxProfiler = new TransactionProfiler(); $wdb->connLogger = new \Psr\Log\NullLogger(); $wdb->queryLogger = new \Psr\Log\NullLogger(); + $wdb->currentDomain = DatabaseDomain::newUnspecified(); return $db; } diff --git a/tests/phpunit/includes/libs/stats/PrefixingStatsdDataFactoryProxyTest.php b/tests/phpunit/includes/libs/stats/PrefixingStatsdDataFactoryProxyTest.php new file mode 100644 index 0000000000..b55d8697db --- /dev/null +++ b/tests/phpunit/includes/libs/stats/PrefixingStatsdDataFactoryProxyTest.php @@ -0,0 +1,58 @@ +getMock( + \Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface::class + ); + $innerFactory->expects( $this->once() ) + ->method( $method ) + ->with( 'testprefix.' . 'metricname' ); + + $proxy = new PrefixingStatsdDataFactoryProxy( $innerFactory, 'testprefix' ); + // 1,2,3,4 simply makes sure we provide enough parameters, without caring what they are + $proxy->$method( 'metricname', 1, 2, 3, 4 ); + } + + /** + * @dataProvider provideMethodNames + */ + public function testPrefixIsTrimmed( $method ) { + /** @var StatsdDataFactoryInterface|PHPUnit_Framework_MockObject_MockObject $innerFactory */ + $innerFactory = $this->getMock( + \Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface::class + ); + $innerFactory->expects( $this->once() ) + ->method( $method ) + ->with( 'testprefix.' . 'metricname' ); + + $proxy = new PrefixingStatsdDataFactoryProxy( $innerFactory, 'testprefix...' ); + // 1,2,3,4 simply makes sure we provide enough parameters, without caring what they are + $proxy->$method( 'metricname', 1, 2, 3, 4 ); + } + +} diff --git a/tests/phpunit/includes/media/ExifRotationTest.php b/tests/phpunit/includes/media/ExifRotationTest.php index fff101f3a2..e64d4afadc 100644 --- a/tests/phpunit/includes/media/ExifRotationTest.php +++ b/tests/phpunit/includes/media/ExifRotationTest.php @@ -190,6 +190,11 @@ class ExifRotationTest extends MediaWikiMediaTestCase { $file = $this->dataFile( $name, $type ); $thumb = $file->transform( $params, File::RENDER_NOW | File::RENDER_FORCE ); + if ( $thumb->isError() ) { + /** @var MediaTransformError $thumb */ + $this->fail( $thumb->toText() ); + } + $this->assertEquals( $out[0], $thumb->getWidth(), diff --git a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php index 6fbb47401b..7aef246fcc 100644 --- a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php +++ b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php @@ -26,6 +26,17 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase { $this->assertMetadata( $infile, $expected ); } + /** + * @dataProvider provideSvgUnits + */ + public function testScaleSVGUnit( $inUnit, $expected ) { + $this->assertEquals( + $expected, + SVGReader::scaleSVGUnit( $inUnit ), + 'SVG unit conversion and scaling failure' + ); + } + function assertMetadata( $infile, $expected ) { try { $data = SVGMetadataExtractor::getMetadata( $infile ); @@ -123,6 +134,16 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase { 'translations' => [] ], ], + [ + "$base/comma_separated_viewbox.svg", + [ + 'width' => 512, + 'height' => 594, + 'originalWidth' => '100%', + 'originalHeight' => '100%', + 'translations' => [] + ], + ], ]; } @@ -152,4 +173,34 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase { ], ]; } + + public static function provideSvgUnits() { + return [ + [ '1' , 1 ], + [ '1.1' , 1.1 ], + [ '0.1' , 0.1 ], + [ '.1' , 0.1 ], + [ '1e2' , 100 ], + [ '1E2' , 100 ], + [ '+1' , 1 ], + [ '-1' , -1 ], + [ '-1.1' , -1.1 ], + [ '1e+2' , 100 ], + [ '1e-2' , 0.01 ], + [ '10px' , 10 ], + [ '10pt' , 10 * 1.25 ], + [ '10pc' , 10 * 15 ], + [ '10mm' , 10 * 3.543307 ], + [ '10cm' , 10 * 35.43307 ], + [ '10in' , 10 * 90 ], + [ '10em' , 10 * 16 ], + [ '10ex' , 10 * 12 ], + [ '10%' , 51.2 ], + [ '10 px' , 10 ], + // Invalid values + [ '1e1.1', 10 ], + [ '10bp', 10 ], + [ 'p10', null ], + ]; + } } diff --git a/tests/phpunit/includes/parser/ParserFactoryTest.php b/tests/phpunit/includes/parser/ParserFactoryTest.php new file mode 100644 index 0000000000..f37bdfcbe3 --- /dev/null +++ b/tests/phpunit/includes/parser/ParserFactoryTest.php @@ -0,0 +1,55 @@ +assertSame( $instanceConstructor->getNumberOfParameters() - 1, + $factoryConstructor->getNumberOfParameters(), + 'Parser and ParserFactory constructors have an inconsistent number of parameters. ' . + 'Did you add a parameter to one and not the other?' ); + } + + public function testAllArgumentsWerePassed() { + $factoryConstructor = new ReflectionMethod( 'ParserFactory', '__construct' ); + $mocks = []; + foreach ( $factoryConstructor->getParameters() as $param ) { + $type = (string)$param->getType(); + if ( $type === 'array' ) { + $val = [ 'porcupines will tell me your secrets' . count( $mocks ) ]; + } elseif ( class_exists( $type ) || interface_exists( $type ) ) { + $val = $this->createMock( $type ); + } elseif ( $type === '' ) { + // Optimistically assume a string is okay + $val = 'I will de-quill them first' . count( $mocks ); + } else { + $this->fail( "Unrecognized parameter type $type in ParserFactory constructor" ); + } + $mocks[] = $val; + } + + $factory = new ParserFactory( ...$mocks ); + $parser = $factory->create(); + + foreach ( ( new ReflectionObject( $parser ) )->getProperties() as $prop ) { + $prop->setAccessible( true ); + foreach ( $mocks as $idx => $mock ) { + if ( $prop->getValue( $parser ) === $mock ) { + unset( $mocks[$idx] ); + } + } + } + + $this->assertCount( 0, $mocks, 'Not all arguments to the ParserFactory constructor were ' . + 'found in Parser member variables' ); + } +} diff --git a/tests/phpunit/includes/parser/ParserOptionsTest.php b/tests/phpunit/includes/parser/ParserOptionsTest.php index 29f1c8c598..8c17780fe5 100644 --- a/tests/phpunit/includes/parser/ParserOptionsTest.php +++ b/tests/phpunit/includes/parser/ParserOptionsTest.php @@ -45,9 +45,9 @@ class ParserOptionsTest extends MediaWikiTestCase { public function testNewCanonical() { $wgUser = $this->getMutableTestUser()->getUser(); $wgLang = Language::factory( 'fr' ); - $wgContLang = Language::factory( 'qqx' ); + $contLang = Language::factory( 'qqx' ); - $this->setContentLang( $wgContLang ); + $this->setContentLang( $contLang ); $this->setMwGlobals( [ 'wgUser' => $wgUser, 'wgLang' => $wgLang, @@ -80,13 +80,12 @@ class ParserOptionsTest extends MediaWikiTestCase { $this->assertSame( $user, $popt->getUser() ); $this->assertSame( $lang, $popt->getUserLangObj() ); - // Passing 'canonical' uses an anon and $wgContLang, and ignores - // any passed $userLang + // Passing 'canonical' uses an anon and $contLang, and ignores any passed $userLang $popt = ParserOptions::newCanonical( 'canonical' ); $this->assertTrue( $popt->getUser()->isAnon() ); - $this->assertSame( $wgContLang, $popt->getUserLangObj() ); + $this->assertSame( $contLang, $popt->getUserLangObj() ); $popt = ParserOptions::newCanonical( 'canonical', $lang2 ); - $this->assertSame( $wgContLang, $popt->getUserLangObj() ); + $this->assertSame( $contLang, $popt->getUserLangObj() ); // Passing an IContextSource uses the user and lang from it, and ignores // any passed $userLang diff --git a/tests/phpunit/includes/parser/ParserPreloadTest.php b/tests/phpunit/includes/parser/ParserPreloadTest.php index 77073955bd..560b921a8d 100644 --- a/tests/phpunit/includes/parser/ParserPreloadTest.php +++ b/tests/phpunit/includes/parser/ParserPreloadTest.php @@ -1,4 +1,7 @@ testParserOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang ); + $this->testParserOptions = ParserOptions::newFromUserAndLang( new User, + MediaWikiServices::getInstance()->getContentLanguage() ); $this->testParser = new Parser(); $this->testParser->Options( $this->testParserOptions ); diff --git a/tests/phpunit/includes/parser/PreprocessorTest.php b/tests/phpunit/includes/parser/PreprocessorTest.php index c415b58642..6b3e05da51 100644 --- a/tests/phpunit/includes/parser/PreprocessorTest.php +++ b/tests/phpunit/includes/parser/PreprocessorTest.php @@ -1,5 +1,7 @@ mOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang ); + $this->mOptions = ParserOptions::newFromUserAndLang( new User, + MediaWikiServices::getInstance()->getContentLanguage() ); $this->mPreprocessors = []; foreach ( self::$classNames as $className ) { diff --git a/tests/phpunit/includes/parser/TagHooksTest.php b/tests/phpunit/includes/parser/TagHooksTest.php index bc09adc809..06da7a53f7 100644 --- a/tests/phpunit/includes/parser/TagHooksTest.php +++ b/tests/phpunit/includes/parser/TagHooksTest.php @@ -1,5 +1,7 @@ getContentLanguage() ); return $popt; } @@ -54,8 +56,7 @@ class TagHooksTest extends MediaWikiTestCase { * @dataProvider provideValidNames */ public function testTagHooks( $tag ) { - global $wgParserConf; - $parser = new Parser( $wgParserConf ); + $parser = MediaWikiServices::getInstance()->getParserFactory()->create(); $parser->setHook( $tag, [ $this, 'tagCallback' ] ); $parserOutput = $parser->parse( @@ -73,8 +74,7 @@ class TagHooksTest extends MediaWikiTestCase { * @expectedException MWException */ public function testBadTagHooks( $tag ) { - global $wgParserConf; - $parser = new Parser( $wgParserConf ); + $parser = MediaWikiServices::getInstance()->getParserFactory()->create(); $parser->setHook( $tag, [ $this, 'tagCallback' ] ); $parser->parse( @@ -89,8 +89,7 @@ class TagHooksTest extends MediaWikiTestCase { * @dataProvider provideValidNames */ public function testFunctionTagHooks( $tag ) { - global $wgParserConf; - $parser = new Parser( $wgParserConf ); + $parser = MediaWikiServices::getInstance()->getParserFactory()->create(); $parser->setFunctionTagHook( $tag, [ $this, 'functionTagCallback' ], 0 ); $parserOutput = $parser->parse( @@ -108,8 +107,7 @@ class TagHooksTest extends MediaWikiTestCase { * @expectedException MWException */ public function testBadFunctionTagHooks( $tag ) { - global $wgParserConf; - $parser = new Parser( $wgParserConf ); + $parser = MediaWikiServices::getInstance()->getParserFactory()->create(); $parser->setFunctionTagHook( $tag, diff --git a/tests/phpunit/includes/password/PasswordFactoryTest.php b/tests/phpunit/includes/password/PasswordFactoryTest.php index 01b0de2c25..a7b3557516 100644 --- a/tests/phpunit/includes/password/PasswordFactoryTest.php +++ b/tests/phpunit/includes/password/PasswordFactoryTest.php @@ -4,6 +4,20 @@ * @covers PasswordFactory */ class PasswordFactoryTest extends MediaWikiTestCase { + public function testConstruct() { + $pf = new PasswordFactory(); + $this->assertEquals( [ '' ], array_keys( $pf->getTypes() ) ); + $this->assertEquals( '', $pf->getDefaultType() ); + + $pf = new PasswordFactory( [ + 'foo' => [ 'class' => 'FooPassword' ], + 'bar' => [ 'class' => 'BarPassword', 'baz' => 'boom' ], + ], 'foo' ); + $this->assertEquals( [ '', 'foo', 'bar' ], array_keys( $pf->getTypes() ) ); + $this->assertArraySubset( [ 'class' => 'BarPassword', 'baz' => 'boom' ], $pf->getTypes()['bar'] ); + $this->assertEquals( 'foo', $pf->getDefaultType() ); + } + public function testRegister() { $pf = new PasswordFactory; $pf->register( 'foo', [ 'class' => InvalidPassword::class ] ); diff --git a/tests/phpunit/includes/password/PasswordPolicyChecksTest.php b/tests/phpunit/includes/password/PasswordPolicyChecksTest.php index 5ddbe271eb..2d20f2c0ce 100644 --- a/tests/phpunit/includes/password/PasswordPolicyChecksTest.php +++ b/tests/phpunit/includes/password/PasswordPolicyChecksTest.php @@ -150,7 +150,7 @@ class PasswordPolicyChecksTest extends MediaWikiTestCase { global $IP; $this->setMwGlobals( [ 'wgSitename' => 'sitename', - 'wgPopularPasswordFile' => "$IP/serialized/commonpasswords.cdb" + 'wgPopularPasswordFile' => "$IP/includes/password/commonpasswords.cdb" ] ); $user = User::newFromName( 'username' ); $status = PasswordPolicyChecks::checkPopularPasswordBlacklist( PHP_INT_MAX, $user, $password ); diff --git a/tests/phpunit/includes/password/PasswordTestCase.php b/tests/phpunit/includes/password/PasswordTestCase.php index 80b9838d8e..7afdd0abb8 100644 --- a/tests/phpunit/includes/password/PasswordTestCase.php +++ b/tests/phpunit/includes/password/PasswordTestCase.php @@ -51,7 +51,6 @@ abstract class PasswordTestCase extends MediaWikiTestCase { * parameter (a password) should match. * @return array * @throws MWException - * @abstract */ public static function providePasswordTests() { throw new MWException( "Not implemented" ); diff --git a/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php b/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php index 296691d331..43c678e928 100644 --- a/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php +++ b/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php @@ -3,7 +3,6 @@ use MediaWiki\Auth\AuthManager; use MediaWiki\MediaWikiServices; use MediaWiki\Preferences\DefaultPreferencesFactory; -use Wikimedia\ObjectFactory; use Wikimedia\TestingAccessWrapper; /** @@ -38,13 +37,13 @@ class DefaultPreferencesFactoryTest extends MediaWikiTestCase { public function setUp() { parent::setUp(); - global $wgParserConf; $this->context = new RequestContext(); $this->context->setTitle( Title::newFromText( self::class ) ); - $this->setMwGlobals( 'wgParser', - ObjectFactory::constructClassInstance( $wgParserConf['class'], [ $wgParserConf ] ) - ); - $this->config = MediaWikiServices::getInstance()->getMainConfig(); + + $services = MediaWikiServices::getInstance(); + + $this->setMwGlobals( 'wgParser', $services->getParserFactory()->create() ); + $this->config = $services->getMainConfig(); } /** diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php index 71966b7570..20d4b54cd4 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php @@ -336,6 +336,23 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase { ); } + /** + * @covers ResourceLoaderFileModule::compileLessFile + */ + public function testLessFileCompilation() { + $context = $this->getResourceLoaderContext(); + $basePath = __DIR__ . '/../../data/less/module'; + $module = new ResourceLoaderFileTestModule( [ + 'localBasePath' => $basePath, + 'styles' => [ 'styles.less' ], + ], [ + 'lessVars' => [ 'foo' => '2px', 'Foo' => '#eeeeee' ] + ] ); + $module->setName( 'test.less' ); + $styles = $module->getStyles( $context ); + $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] ); + } + /** * @covers ResourceLoaderFileModule::getDefinitionSummary * @covers ResourceLoaderFileModule::getFileHashes diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php index c15eb2ce44..d9ad711190 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php @@ -8,15 +8,6 @@ class ResourceLoaderTest extends ResourceLoaderTestCase { parent::setUp(); $this->setMwGlobals( [ - 'wgResourceLoaderLESSVars' => [ - 'foo' => '2px', - 'Foo' => '#eeeeee', - 'bar' => 5, - ], - // Clear ResourceLoaderGetConfigVars hooks (called by StartupModule) - // to avoid notices during testMakeModuleResponse for missing - // wgResourceLoaderLESSVars keys in extension hooks. - 'wgHooks' => [], 'wgShowExceptionDetails' => true, ] ); } @@ -246,27 +237,12 @@ class ResourceLoaderTest extends ResourceLoaderTestCase { ); } - /** - * @covers ResourceLoaderFileModule::compileLessFile - */ - public function testLessFileCompilation() { - $context = $this->getResourceLoaderContext(); - $basePath = __DIR__ . '/../../data/less/module'; - $module = new ResourceLoaderFileModule( [ - 'localBasePath' => $basePath, - 'styles' => [ 'styles.less' ], - ] ); - $module->setName( 'test.less' ); - $styles = $module->getStyles( $context ); - $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] ); - } - /** * @covers ResourceLoader::getLessCompiler */ public function testLessImportDirs() { $rl = new EmptyResourceLoader(); - $lc = $rl->getLessCompiler( $rl->getLessVars() ); + $lc = $rl->getLessCompiler( [ 'foo' => '2px', 'Foo' => '#eeeeee' ] ); $basePath = dirname( dirname( __DIR__ ) ) . '/data/less'; $lc->SetImportDirs( [ "$basePath/common" => '', diff --git a/tests/phpunit/includes/search/SearchEnginePrefixTest.php b/tests/phpunit/includes/search/SearchEnginePrefixTest.php index 83df61a4bc..41c12188a8 100644 --- a/tests/phpunit/includes/search/SearchEnginePrefixTest.php +++ b/tests/phpunit/includes/search/SearchEnginePrefixTest.php @@ -69,7 +69,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase { $this->originalHandlers = TestingAccessWrapper::newFromClass( Hooks::class )->handlers; TestingAccessWrapper::newFromClass( Hooks::class )->handlers = []; - SpecialPageFactory::resetList(); + $this->overrideMwServices(); } public function tearDown() { @@ -77,7 +77,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase { TestingAccessWrapper::newFromClass( Hooks::class )->handlers = $this->originalHandlers; - SpecialPageFactory::resetList(); + $this->overrideMwServices(); } protected function searchProvision( array $results = null ) { diff --git a/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php b/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php index 476799406f..2298056265 100644 --- a/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php +++ b/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php @@ -2,6 +2,7 @@ namespace MediaWiki\Session; +use MediaWiki\MediaWikiServices; use Psr\Log\LogLevel; use MediaWikiTestCase; use Wikimedia\TestingAccessWrapper; @@ -63,8 +64,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase { } public function addDBDataOnce() { - $passwordFactory = new \PasswordFactory(); - $passwordFactory->init( \RequestContext::getMain()->getConfig() ); + $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory(); $passwordHash = $passwordFactory->newFromPlaintext( 'foobaz' ); $sysop = static::getTestSysop()->getUser(); diff --git a/tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php b/tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php index 784fed0c5e..04a89d2f15 100644 --- a/tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php +++ b/tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php @@ -1,4 +1,6 @@ assertContains( 'Specialpages', SpecialPageFactory::getNames() ); - } - public function testHookNotCalledTwice() { $count = 0; $this->mergeMwGlobalArrayValue( 'wgHooks', [ @@ -43,9 +33,10 @@ class SpecialPageFactoryTest extends MediaWikiTestCase { $count++; } ] ] ); - SpecialPageFactory::resetList(); - SpecialPageFactory::getNames(); - SpecialPageFactory::getNames(); + $this->overrideMwServices(); + $spf = MediaWikiServices::getInstance()->getSpecialPageFactory(); + $spf->getNames(); + $spf->getNames(); $this->assertEquals( 1, $count ); } @@ -80,7 +71,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase { */ public function testGetPage( $spec, $shouldReuseInstance ) { $this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => $spec ] ); - SpecialPageFactory::resetList(); + $this->overrideMwServices(); $page = SpecialPageFactory::getPage( 'testdummy' ); $this->assertInstanceOf( SpecialPage::class, $page ); @@ -94,7 +85,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase { */ public function testGetNames() { $this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => SpecialAllPages::class ] ); - SpecialPageFactory::resetList(); + $this->overrideMwServices(); $names = SpecialPageFactory::getNames(); $this->assertInternalType( 'array', $names ); @@ -106,7 +97,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase { */ public function testResolveAlias() { $this->setContentLang( 'de' ); - SpecialPageFactory::resetList(); + $this->overrideMwServices(); list( $name, $param ) = SpecialPageFactory::resolveAlias( 'Spezialseiten/Foo' ); $this->assertEquals( 'Specialpages', $name ); @@ -118,7 +109,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase { */ public function testGetLocalNameFor() { $this->setContentLang( 'de' ); - SpecialPageFactory::resetList(); + $this->overrideMwServices(); $name = SpecialPageFactory::getLocalNameFor( 'Specialpages', 'Foo' ); $this->assertEquals( 'Spezialseiten/Foo', $name ); @@ -129,7 +120,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase { */ public function testGetTitleForAlias() { $this->setContentLang( 'de' ); - SpecialPageFactory::resetList(); + $this->overrideMwServices(); $title = SpecialPageFactory::getTitleForAlias( 'Specialpages/Foo' ); $this->assertEquals( 'Spezialseiten/Foo', $title->getText() ); @@ -142,14 +133,13 @@ class SpecialPageFactoryTest extends MediaWikiTestCase { public function testConflictResolution( $test, $aliasesList, $alias, $expectedName, $expectedAlias, $expectWarnings ) { - global $wgContLang; - $lang = clone $wgContLang; + $lang = clone MediaWikiServices::getInstance()->getContentLanguage(); $lang->mExtendedSpecialPageAliases = $aliasesList; - $this->setContentLang( $lang ); $this->setMwGlobals( 'wgSpecialPages', array_combine( array_keys( $aliasesList ), array_keys( $aliasesList ) ) ); - SpecialPageFactory::resetList(); + $this->overrideMwServices(); + $this->setContentLang( $lang ); // Catch the warnings we expect to be raised $warnings = []; @@ -277,7 +267,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase { } ], ] ); - SpecialPageFactory::resetList(); + $this->overrideMwServices(); SpecialPageFactory::getLocalNameFor( 'Specialpages' ); $this->assertTrue( $called, 'Recursive call succeeded' ); } diff --git a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php index d53a9b8f80..4a171dfac0 100644 --- a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php +++ b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php @@ -7,6 +7,8 @@ * @author Antoine Musso */ +use MediaWiki\MediaWikiServices; + /** * @group Database * @covers QueryPage @@ -43,7 +45,8 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase { $class = $page[0]; $name = $page[1]; if ( !in_array( $class, $this->manualTest ) ) { - $this->queryPages[$class] = SpecialPageFactory::getPage( $name ); + $this->queryPages[$class] = + MediaWikiServices::getInstance()->getSpecialPageFactory()->getPage( $name ); } } } diff --git a/tests/phpunit/includes/specials/SpecialMyLanguageTest.php b/tests/phpunit/includes/specials/SpecialMyLanguageTest.php index 84fa71a2c6..bcd3d84946 100644 --- a/tests/phpunit/includes/specials/SpecialMyLanguageTest.php +++ b/tests/phpunit/includes/specials/SpecialMyLanguageTest.php @@ -35,7 +35,7 @@ class SpecialMyLanguageTest extends MediaWikiTestCase { * @param string $userLang */ public function testFindTitle( $expected, $subpage, $langCode, $userLang ) { - $this->setMwGlobals( 'wgLanguageCode', $langCode ); + $this->setContentLang( $langCode ); $special = new SpecialMyLanguage(); $special->getContext()->setLanguage( $userLang ); // Test with subpages both enabled and disabled diff --git a/tests/phpunit/includes/specials/SpecialPreferencesTest.php b/tests/phpunit/includes/specials/SpecialPreferencesTest.php index cd6cd3be1f..90f6ad9c84 100644 --- a/tests/phpunit/includes/specials/SpecialPreferencesTest.php +++ b/tests/phpunit/includes/specials/SpecialPreferencesTest.php @@ -21,7 +21,7 @@ class SpecialPreferencesTest extends MediaWikiTestCase { * Test specifications by Alexandre "ialex" Emsenhuber. * @todo give this test a real name explaining what is being tested here */ - public function testBug41337() { + public function testT43337() { // Set a low limit $this->setMwGlobals( 'wgMaxSigChars', 2 ); diff --git a/tests/phpunit/includes/specials/SpecialSearchTest.php b/tests/phpunit/includes/specials/SpecialSearchTest.php index 196321caed..6ff2110ee3 100644 --- a/tests/phpunit/includes/specials/SpecialSearchTest.php +++ b/tests/phpunit/includes/specials/SpecialSearchTest.php @@ -231,7 +231,7 @@ class SpecialSearchTest extends MediaWikiTestCase { $ctx = new RequestContext; $sp = Title::newFromText( 'Special:Search/foo_bar' ); - SpecialPageFactory::executePath( $sp, $ctx ); + MediaWikiServices::getInstance()->getSpecialPageFactory()->executePath( $sp, $ctx ); $url = $ctx->getOutput()->getRedirect(); // some older versions of hhvm have a bug that doesn't parse relative // urls with a port, so help it out a little bit. diff --git a/tests/phpunit/includes/tidy/RemexDriverTest.php b/tests/phpunit/includes/tidy/RemexDriverTest.php index b20557f2a8..a5ebaa5ddc 100644 --- a/tests/phpunit/includes/tidy/RemexDriverTest.php +++ b/tests/phpunit/includes/tidy/RemexDriverTest.php @@ -257,6 +257,11 @@ class RemexDriverTest extends MediaWikiTestCase { '
    x
    ', '

    x

    ', ], + [ + 'p-wrap ended by reparenting (T200827)', + '

    ', + '

    ', + ], ]; public function provider() { diff --git a/tests/phpunit/includes/upload/UploadStashTest.php b/tests/phpunit/includes/upload/UploadStashTest.php index 39acbb0740..e7960651cd 100644 --- a/tests/phpunit/includes/upload/UploadStashTest.php +++ b/tests/phpunit/includes/upload/UploadStashTest.php @@ -41,7 +41,7 @@ class UploadStashTest extends MediaWikiTestCase { /** * @todo give this test a real name explaining what is being tested here */ - public function testBug29408() { + public function testT31408() { $this->setMwGlobals( 'wgUser', self::$users['uploader']->getUser() ); $repo = RepoGroup::singleton()->getLocalRepo(); diff --git a/tests/phpunit/includes/user/BotPasswordTest.php b/tests/phpunit/includes/user/BotPasswordTest.php index 3bbc2dfaf2..0d22b21592 100644 --- a/tests/phpunit/includes/user/BotPasswordTest.php +++ b/tests/phpunit/includes/user/BotPasswordTest.php @@ -1,5 +1,6 @@ init( \RequestContext::getMain()->getConfig() ); + $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory(); $passwordHash = $passwordFactory->newFromPlaintext( 'foobaz' ); $dbw = wfGetDB( DB_MASTER ); @@ -350,8 +350,7 @@ class BotPasswordTest extends MediaWikiTestCase { * @param string|null $password */ public function testSave( $password ) { - $passwordFactory = new \PasswordFactory(); - $passwordFactory->init( \RequestContext::getMain()->getConfig() ); + $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory(); $bp = BotPassword::newUnsaved( [ 'centralId' => 42, diff --git a/tests/phpunit/includes/user/UserTest.php b/tests/phpunit/includes/user/UserTest.php index 2ac91d5b1e..3b8e71015d 100644 --- a/tests/phpunit/includes/user/UserTest.php +++ b/tests/phpunit/includes/user/UserTest.php @@ -634,7 +634,7 @@ class UserTest extends MediaWikiTestCase { $this->assertTrue( $user2->isBlocked() ); // Non-strict type-check. $this->assertEquals( true, $user2->getBlock()->isAutoblocking(), 'Autoblock does not work' ); - // Can't directly compare the objects becuase of member type differences. + // Can't directly compare the objects because of member type differences. // One day this will work: $this->assertEquals( $block, $user2->getBlock() ); $this->assertEquals( $block->getId(), $user2->getBlock()->getId() ); $this->assertEquals( $block->getExpiry(), $user2->getBlock()->getExpiry() ); diff --git a/tests/phpunit/languages/LanguageConverterTest.php b/tests/phpunit/languages/LanguageConverterTest.php index c97bdaf278..8ccacfc23a 100644 --- a/tests/phpunit/languages/LanguageConverterTest.php +++ b/tests/phpunit/languages/LanguageConverterTest.php @@ -103,9 +103,9 @@ class LanguageConverterTest extends MediaWikiLangTestCase { * @covers LanguageConverter::getUserVariant */ public function testGetPreferredVariantUserOptionForForeignLanguage() { - global $wgContLang, $wgUser; + global $wgUser; - $wgContLang = Language::factory( 'en' ); + $this->setContentLang( 'en' ); $wgUser = new User; $wgUser->load(); // from 'defaults' $wgUser->mId = 1; @@ -122,9 +122,9 @@ class LanguageConverterTest extends MediaWikiLangTestCase { * @covers LanguageConverter::getURLVariant */ public function testGetPreferredVariantHeaderUserVsUrl() { - global $wgContLang, $wgRequest, $wgUser; + global $wgRequest, $wgUser; - $wgContLang = Language::factory( 'tg-latn' ); + $this->setContentLang( 'tg-latn' ); $wgRequest->setVal( 'variant', 'tg' ); $wgUser = User::newFromId( "admin" ); $wgUser->setId( 1 ); @@ -150,9 +150,9 @@ class LanguageConverterTest extends MediaWikiLangTestCase { * @covers LanguageConverter::getURLVariant */ public function testGetPreferredVariantDefaultLanguageVsUrlVariant() { - global $wgDefaultLanguageVariant, $wgRequest, $wgContLang; + global $wgDefaultLanguageVariant, $wgRequest; - $wgContLang = Language::factory( 'tg-latn' ); + $this->setContentLang( 'tg-latn' ); $wgDefaultLanguageVariant = 'tg'; $wgRequest->setVal( 'variant', null ); $this->assertEquals( 'tg', $this->lc->getPreferredVariant() ); diff --git a/tests/phpunit/languages/classes/LanguageArTest.php b/tests/phpunit/languages/classes/LanguageArTest.php index f3f5a3f1f1..296ee60788 100644 --- a/tests/phpunit/languages/classes/LanguageArTest.php +++ b/tests/phpunit/languages/classes/LanguageArTest.php @@ -1,32 +1,61 @@ assertEquals( '١٬٢٣٤٬٥٦٧', $this->getLang()->formatNum( '1234567' ) ); - $this->assertEquals( '-١٢٫٨٩', $this->getLang()->formatNum( -12.89 ) ); + public function testFormatNum( $num, $formatted ) { + $this->assertEquals( $formatted, $this->getLang()->formatNum( $num ) ); + } + + public static function provideFormatNum() { + return [ + [ '1234567', '١٬٢٣٤٬٥٦٧' ], + [ -12.89, '-١٢٫٨٩' ], + ]; + } + + /** + * @covers LanguageAr::normalize + * @covers Language::normalize + * @dataProvider provideNormalize + */ + public function testNormalize( $input, $expected ) { + if ( $input === $expected ) { + throw new Exception( 'Expected output must differ.' ); + } + + $this->setMwGlobals( 'wgFixArabicUnicode', true ); + $this->assertSame( $expected, $this->getLang()->normalize( $input ), 'ar-normalised form' ); + + $this->setMwGlobals( 'wgFixArabicUnicode', false ); + $this->assertSame( $input, $this->getLang()->normalize( $input ), 'regular normalised form' ); + } + + public static function provideNormalize() { + return [ + [ + 'ﷅ', + 'صمم', + ], + ]; } /** * Mostly to test the raw ascii feature. - * @dataProvider providerSprintfDate + * @dataProvider provideSprintfDate * @covers Language::sprintfDate */ public function testSprintfDate( $format, $date, $expected ) { $this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) ); } - public static function providerSprintfDate() { + public static function provideSprintfDate() { return [ [ 'xg "vs" g', diff --git a/tests/phpunit/languages/classes/LanguageMlTest.php b/tests/phpunit/languages/classes/LanguageMlTest.php index 673b5c775f..59b7ba8d98 100644 --- a/tests/phpunit/languages/classes/LanguageMlTest.php +++ b/tests/phpunit/languages/classes/LanguageMlTest.php @@ -11,15 +11,15 @@ class LanguageMlTest extends LanguageClassesTestCase { /** - * @dataProvider providerFormatNum - * T31495 + * @dataProvider provideFormatNum * @covers Language::formatNum */ public function testFormatNum( $result, $value ) { + // For T31495 $this->assertEquals( $result, $this->getLang()->formatNum( $value ) ); } - public static function providerFormatNum() { + public static function provideFormatNum() { return [ [ '12,34,567', '1234567' ], [ '12,345', '12345' ], @@ -37,4 +37,30 @@ class LanguageMlTest extends LanguageClassesTestCase { [ '', null ], ]; } + + /** + * @covers LanguageMl::normalize + * @covers Language::normalize + * @dataProvider provideNormalize + */ + public function testNormalize( $input, $expected ) { + if ( $input === $expected ) { + throw new Exception( 'Expected output must differ.' ); + } + + $this->setMwGlobals( 'wgFixMalayalamUnicode', true ); + $this->assertSame( $expected, $this->getLang()->normalize( $input ), 'ml-normalised form' ); + + $this->setMwGlobals( 'wgFixMalayalamUnicode', false ); + $this->assertSame( $input, $this->getLang()->normalize( $input ), 'regular normalised form' ); + } + + public static function provideNormalize() { + return [ + [ + 'ല്‍', + 'ൽ', + ], + ]; + } } diff --git a/tests/phpunit/maintenance/backup_LogTest.php b/tests/phpunit/maintenance/backup_LogTest.php index c215b9973d..9357451481 100644 --- a/tests/phpunit/maintenance/backup_LogTest.php +++ b/tests/phpunit/maintenance/backup_LogTest.php @@ -2,6 +2,7 @@ namespace MediaWiki\Tests\Maintenance; +use MediaWiki\MediaWikiServices; use DumpBackup; use ManualLogEntry; use Title; @@ -145,8 +146,6 @@ class BackupDumperLoggerTest extends DumpTestCase { } function testPlain() { - global $wgContLang; - // Preparing the dump $fname = $this->getNewTempFile(); @@ -165,8 +164,9 @@ class BackupDumperLoggerTest extends DumpTestCase { $this->assertLogItem( $this->logId1, "BackupDumperLogUserA", $this->userId1, null, "type", "subtype", "PageA" ); - $this->assertNotNull( $wgContLang, "Content language object validation" ); - $namespace = $wgContLang->getNsText( NS_TALK ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $this->assertNotNull( $contLang, "Content language object validation" ); + $namespace = $contLang->getNsText( NS_TALK ); $this->assertInternalType( 'string', $namespace ); $this->assertGreaterThan( 0, strlen( $namespace ) ); $this->assertLogItem( $this->logId2, "BackupDumperLogUserB", @@ -181,8 +181,6 @@ class BackupDumperLoggerTest extends DumpTestCase { } function testXmlDumpsBackupUseCaseLogging() { - global $wgContLang; - $this->checkHasGzip(); // Preparing the dump @@ -218,8 +216,9 @@ class BackupDumperLoggerTest extends DumpTestCase { $this->assertLogItem( $this->logId1, "BackupDumperLogUserA", $this->userId1, null, "type", "subtype", "PageA" ); - $this->assertNotNull( $wgContLang, "Content language object validation" ); - $namespace = $wgContLang->getNsText( NS_TALK ); + $contLang = MediaWikiServices::getInstance()->getContentLanguage(); + $this->assertNotNull( $contLang, "Content language object validation" ); + $namespace = $contLang->getNsText( NS_TALK ); $this->assertInternalType( 'string', $namespace ); $this->assertGreaterThan( 0, strlen( $namespace ) ); $this->assertLogItem( $this->logId2, "BackupDumperLogUserB", diff --git a/tests/phpunit/maintenance/categoryChangesRdfTest.php b/tests/phpunit/maintenance/categoryChangesRdfTest.php index 30a56f49d4..701929a4b3 100644 --- a/tests/phpunit/maintenance/categoryChangesRdfTest.php +++ b/tests/phpunit/maintenance/categoryChangesRdfTest.php @@ -149,10 +149,10 @@ class CategoryChangesRdfTest extends MediaWikiLangTestCase { ], [ 22 => true ], ], - 'change in categories' => [ - __DIR__ . "/../data/categoriesrdf/change.sparql", + 'edit category' => [ + __DIR__ . "/../data/categoriesrdf/edit.sparql", 'getChangedCatsIterator', - 'handleChanges', + 'handleEdits', [ (object)[ 'rc_title' => 'Changed category', @@ -167,7 +167,7 @@ class CategoryChangesRdfTest extends MediaWikiLangTestCase { 'rc_title' => 'Changed again', 'rc_cur_id' => 30, 'pp_propname' => null, - 'cat_pages' => 10, + 'cat_pages' => 12, 'cat_subcats' => 2, 'cat_files' => 1, ], @@ -182,7 +182,7 @@ class CategoryChangesRdfTest extends MediaWikiLangTestCase { ], [ 31 => true ], ], - + // TODO: not sure how to test categorization changes, it uses the database select... ]; } diff --git a/tests/phpunit/phpunit.php b/tests/phpunit/phpunit.php index 7cf042d0b8..d83dedba41 100755 --- a/tests/phpunit/phpunit.php +++ b/tests/phpunit/phpunit.php @@ -29,6 +29,7 @@ class PHPUnitMaintClass extends Maintenance { public function __construct() { parent::__construct(); + $this->setAllowUnregisteredOptions( true ); $this->addOption( 'with-phpunitclass', 'Class name of the PHPUnit entry point to use', diff --git a/tests/phpunit/structure/ApiPrefixUniquenessTest.php b/tests/phpunit/structure/ApiPrefixUniquenessTest.php new file mode 100644 index 0000000000..4f95fbbb3e --- /dev/null +++ b/tests/phpunit/structure/ApiPrefixUniquenessTest.php @@ -0,0 +1,49 @@ +getModuleManager(); + + $modules = $moduleManager->getNames(); + $prefixes = []; + + foreach ( $modules as $name ) { + $module = $moduleManager->getModule( $name ); + $class = get_class( $module ); + + $prefix = $module->getModulePrefix(); + if ( $prefix === '' /* HACK: T196962 */ || $prefix === 'wbeu' ) { + continue; + } + + if ( isset( $prefixes[$prefix] ) ) { + $this->fail( + "Module prefix '{$prefix}' is shared between {$class} and {$prefixes[$prefix]}" + ); + } + $prefixes[$module->getModulePrefix()] = $class; + + if ( $module instanceof ApiQueryGeneratorBase ) { + // namespace with 'g', a generator can share a prefix with a module + $prefix = 'g' . $prefix; + if ( isset( $prefixes[$prefix] ) ) { + $this->fail( + "Module prefix '{$prefix}' is shared between {$class} and {$prefixes[$prefix]}" . + " (as a generator)" + ); + } + $prefixes[$module->getModulePrefix()] = $class; + } + } + $this->assertTrue( true ); // dummy call to make this test non-incomplete + } +} diff --git a/tests/phpunit/structure/SpecialPageFatalTest.php b/tests/phpunit/structure/SpecialPageFatalTest.php index abf1cddbbb..9d85fdebeb 100644 --- a/tests/phpunit/structure/SpecialPageFatalTest.php +++ b/tests/phpunit/structure/SpecialPageFatalTest.php @@ -1,5 +1,7 @@ getSpecialPageFactory(); + foreach ( $spf->getNames() as $name ) { + $specialPages[$name] = [ $spf->getPage( $name ) ]; } return $specialPages; } diff --git a/tests/phpunit/suite.xml b/tests/phpunit/suite.xml index e125b8a314..1917674f3e 100644 --- a/tests/phpunit/suite.xml +++ b/tests/phpunit/suite.xml @@ -73,6 +73,8 @@ ../../maintenance ../../languages/messages + ../../languages/data/normalize-ar.php + ../../languages/data/normalize-ml.php diff --git a/tests/qunit/.eslintrc.json b/tests/qunit/.eslintrc.json index e6d251146b..a1bd20abd1 100644 --- a/tests/qunit/.eslintrc.json +++ b/tests/qunit/.eslintrc.json @@ -1,8 +1,7 @@ { "extends": [ - "../../.eslintrc.json", - "plugin:qunit/recommended", - "plugin:qunit/two" + "wikimedia/qunit", + "../../.eslintrc.json" ], "env": { "qunit": true @@ -14,11 +13,7 @@ "operator-linebreak": 0, "quote-props": [ "error", "as-needed" ], "valid-jsdoc": 0, - "qunit/no-assert-equal": "error", - "qunit/no-early-return": "error", - "qunit/no-negated-ok": "error", "qunit/require-expect": 0, "qunit/resolve-async": 0 - }, - "plugins": [ "qunit" ] + } } diff --git a/tests/qunit/data/load.mock.php b/tests/qunit/data/load.mock.php index 3b710c4a50..2238fcebf5 100644 --- a/tests/qunit/data/load.mock.php +++ b/tests/qunit/data/load.mock.php @@ -103,7 +103,7 @@ if ( isset( $_GET['modules'] ) ) { . '} );'; } else { // Default - $response .= 'mw.loader.state(' . json_encode( $module ) . ', "missing" );' . "\n"; + $response .= 'mw.loader.state(' . json_encode( [ $module => 'missing' ] ) . ');' . "\n"; } } } diff --git a/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js b/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js index 2865cbbab7..e49110ffa0 100644 --- a/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js +++ b/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js @@ -90,7 +90,7 @@ [ '1', false, 1, 'A super malformed IP Address' ], [ 'Just text', false, -Infinity, 'A line with just text' ], [ '45.238.27.109Postfix', false, 45238027109, 'An IP address with a connected postfix' ], - [ '45.238.27.109 postfix', false, 45238027109, 'An IP address with a seperated postfix' ] + [ '45.238.27.109 postfix', false, 45238027109, 'An IP address with a separated postfix' ] ]; parserTest( 'IPv4', 'IPAddress', ipv4 ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js index c4159531ec..65765f2df5 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js @@ -123,4 +123,20 @@ ); } ); + QUnit.test( 'RLQ.push', function ( assert ) { + /* global RLQ */ + var loaded = 0, + done = assert.async(); + mw.loader.testCallback = function () { + loaded++; + delete mw.loader.testCallback; + }; + mw.loader.implement( 'test.rlq-push', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/mwLoaderTestCallback.js' ) ] ); + + RLQ.push( [ 'test.rlq-push', function () { + assert.strictEqual( loaded, 1, 'Load the required module' ); + done(); + } ] ); + } ); + }( mediaWiki ) ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js index 50fd581b7f..e4cf4461d5 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js @@ -364,7 +364,7 @@ QUnit.test( 'Match PHP parser', function ( assert ) { var tasks; mw.messages.set( mw.libs.phpParserData.messages ); - tasks = $.map( mw.libs.phpParserData.tests, function ( test ) { + tasks = mw.libs.phpParserData.tests.map( function ( test ) { var done = assert.async(); return function ( next, abort ) { getMwLanguage( test.lang ) diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js index de593d5039..1a1affa5f5 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js @@ -124,11 +124,11 @@ var done = assert.async(); mw.loader.register( [ - [ 'test.circle1', '0', [ 'test.circle2' ] ], - [ 'test.circle2', '0', [ 'test.circle3' ] ], - [ 'test.circle3', '0', [ 'test.circle1' ] ] + [ 'test.set.circleA', '0', [ 'test.set.circleB' ] ], + [ 'test.set.circleB', '0', [ 'test.set.circleC' ] ], + [ 'test.set.circleC', '0', [ 'test.set.circleA' ] ] ] ); - mw.loader.using( 'test.circle3' ).then( + mw.loader.using( 'test.set.circleC' ).then( function done() { assert.ok( false, 'Unexpected resolution, expected error.' ); }, @@ -154,11 +154,11 @@ mw.redefineFallbacksForTest(); mw.loader.register( [ - [ 'test.shim.circle1', '0', [ 'test.shim.circle2' ] ], - [ 'test.shim.circle2', '0', [ 'test.shim.circle3' ] ], - [ 'test.shim.circle3', '0', [ 'test.shim.circle1' ] ] + [ 'test.shim.circleA', '0', [ 'test.shim.circleB' ] ], + [ 'test.shim.circleB', '0', [ 'test.shim.circleC' ] ], + [ 'test.shim.circleC', '0', [ 'test.shim.circleA' ] ] ] ); - mw.loader.using( 'test.shim.circle3' ).then( + mw.loader.using( 'test.shim.circleC' ).then( function done() { assert.ok( false, 'Unexpected resolution, expected error.' ); }, @@ -172,9 +172,9 @@ QUnit.test( '.load() - Error: Circular dependency', function ( assert ) { var capture = []; mw.loader.register( [ - [ 'test.circleA', '0', [ 'test.circleB' ] ], - [ 'test.circleB', '0', [ 'test.circleC' ] ], - [ 'test.circleC', '0', [ 'test.circleA' ] ] + [ 'test.load.circleA', '0', [ 'test.load.circleB' ] ], + [ 'test.load.circleB', '0', [ 'test.load.circleC' ] ], + [ 'test.load.circleC', '0', [ 'test.load.circleA' ] ] ] ); this.sandbox.stub( mw, 'track', function ( topic, data ) { capture.push( { @@ -184,11 +184,11 @@ } ); } ); - mw.loader.load( 'test.circleC' ); + mw.loader.load( 'test.load.circleC' ); assert.deepEqual( [ { topic: 'resourceloader.exception', - error: 'Circular reference detected: test.circleB -> test.circleC', + error: 'Circular reference detected: test.load.circleB -> test.load.circleC', source: 'resolve' } ], capture, @@ -196,6 +196,31 @@ ); } ); + QUnit.test( '.load() - Error: Circular dependency (direct)', function ( assert ) { + var capture = []; + mw.loader.register( [ + [ 'test.load.circleDirect', '0', [ 'test.load.circleDirect' ] ] + ] ); + this.sandbox.stub( mw, 'track', function ( topic, data ) { + capture.push( { + topic: topic, + error: data.exception && data.exception.message, + source: data.source + } ); + } ); + + mw.loader.load( 'test.load.circleDirect' ); + assert.deepEqual( + [ { + topic: 'resourceloader.exception', + error: 'Circular reference detected: test.load.circleDirect -> test.load.circleDirect', + source: 'resolve' + } ], + capture, + 'Detect a direct self-dependency' + ); + } ); + QUnit.test( '.using() - Error: Unregistered', function ( assert ) { var done = assert.async(); @@ -640,7 +665,7 @@ assert.strictEqual( mw.loader.getState( 'test.module7' ), 'registered', 'Expected "registered" state for test.module7' ); assert.strictEqual( mw.loader.getState( 'test.module8' ), 'loaded', 'Expected "loaded" state for test.module8' ); assert.strictEqual( mw.loader.getState( 'test.module9' ), 'registered', 'Expected "registered" state for test.module9' ); - mw.loader.state( 'test.module7', 'missing' ); + mw.loader.state( { 'test.module7': 'missing' } ); assert.strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' ); assert.strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' ); assert.strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' ); @@ -656,7 +681,11 @@ }, function ( e, dependencies ) { assert.strictEqual( Array.isArray( dependencies ), true, 'Expected array of dependencies' ); - assert.deepEqual( dependencies, [ 'test.module7' ], 'Error callback called with module test.module7' ); + assert.deepEqual( + dependencies, + [ 'jquery', 'mediawiki.base', 'test.module7' ], + 'Error callback called with module test.module7' + ); } ); mw.loader.using( @@ -670,7 +699,7 @@ dependencies.sort(); assert.deepEqual( dependencies, - [ 'test.module7', 'test.module8', 'test.module9' ], + [ 'jquery', 'mediawiki.base', 'test.module7', 'test.module8', 'test.module9' ], 'Error callback called with all three modules as dependencies' ); } @@ -703,7 +732,7 @@ }, function ( e, badmodules ) { assert.ok( true, 'Error handler should be invoked.' ); - // As soon as server spits out state('testMissing', 'missing'); + // As soon as server sets state of 'testMissing' to 'missing' // it will bubble up and trigger the error callback. // Therefor the badmodules array is not testUsesMissing or testUsesNestedMissing. assert.deepEqual( badmodules, [ 'testMissing' ], 'Bad modules as expected.' ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js index 8a5e68a5c2..f0a354358d 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js @@ -1,4 +1,4 @@ -( function ( mw, $ ) { +( function ( mw ) { QUnit.module( 'mediawiki.user', QUnit.newMwEnvironment( { setup: function () { this.server = this.sandbox.useFakeServer(); @@ -69,7 +69,7 @@ result = mw.user.generateRandomSessionId(); assert.strictEqual( typeof result, 'string', 'type' ); - assert.strictEqual( $.trim( result ), result, 'no whitespace at beginning or end' ); + assert.strictEqual( result.trim(), result, 'no whitespace at beginning or end' ); assert.strictEqual( result.length, 16, 'size' ); result2 = mw.user.generateRandomSessionId(); @@ -90,7 +90,7 @@ result = mw.user.generateRandomSessionId(); assert.strictEqual( typeof result, 'string', 'type' ); - assert.strictEqual( $.trim( result ), result, 'no whitespace at beginning or end' ); + assert.strictEqual( result.trim(), result, 'no whitespace at beginning or end' ); assert.strictEqual( result.length, 16, 'size' ); result2 = mw.user.generateRandomSessionId(); @@ -109,7 +109,7 @@ var result = mw.user.sessionId(), result2 = mw.user.sessionId(); assert.strictEqual( typeof result, 'string', 'type' ); - assert.strictEqual( $.trim( result ), result, 'no leading or trailing whitespace' ); + assert.strictEqual( result.trim(), result, 'no leading or trailing whitespace' ); assert.strictEqual( result2, result, 'retained' ); } ); -}( mediaWiki, jQuery ) ); +}( mediaWiki ) ); diff --git a/tests/selenium/pageobjects/undo.page.js b/tests/selenium/pageobjects/undo.page.js new file mode 100644 index 0000000000..f0eff3f910 --- /dev/null +++ b/tests/selenium/pageobjects/undo.page.js @@ -0,0 +1,14 @@ +const Page = require( 'wdio-mediawiki/Page' ); + +class UndoPage extends Page { + + get save() { return browser.element( '#wpSave' ); } + + undo( title, previousRev, undoRev ) { + super.openTitle( title, { action: 'edit', undoafter: previousRev, undo: undoRev } ); + this.save.click(); + } + +} + +module.exports = new UndoPage(); diff --git a/tests/selenium/specs/page.js b/tests/selenium/specs/page.js index 032cbf085d..6a394d8b20 100644 --- a/tests/selenium/specs/page.js +++ b/tests/selenium/specs/page.js @@ -4,6 +4,7 @@ const assert = require( 'assert' ), RestorePage = require( '../pageobjects/restore.page' ), EditPage = require( '../pageobjects/edit.page' ), HistoryPage = require( '../pageobjects/history.page' ), + UndoPage = require( '../pageobjects/undo.page' ), UserLoginPage = require( '../pageobjects/userlogin.page' ), Util = require( 'wdio-mediawiki/Util' ); @@ -118,4 +119,26 @@ describe( 'Page', function () { // check assert.strictEqual( RestorePage.displayedContent.getText(), name + ' has been restored\nConsult the deletion log for a record of recent deletions and restorations.' ); } ); + + it( 'should be undoable', function () { + // create + browser.call( function () { + return Api.edit( name, content ); + } ); + + // edit + let previousRev, undoRev; + browser.call( function () { + return Api.edit( name, Util.getTestString( 'editContent-' ) ) + .then( ( response ) => { + previousRev = response.edit.oldrevid; + undoRev = response.edit.newrevid; + } ); + } ); + + UndoPage.undo( name, previousRev, undoRev ); + + assert.strictEqual( EditPage.displayedContent.getText(), content ); + } ); + } );