Merge "add LanguageTest::testEquals for Id7ed6a21c"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 23 May 2016 16:07:06 +0000 (16:07 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 23 May 2016 16:07:06 +0000 (16:07 +0000)
243 files changed:
.stylelintrc [new file with mode: 0644]
Gruntfile.js
RELEASE-NOTES-1.27
autoload.php
docs/hooks.txt
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Linker.php
includes/MediaWikiServices.php
includes/OutputHandler.php
includes/OutputPage.php
includes/ServiceWiring.php
includes/Services/SalvageableService.php [new file with mode: 0644]
includes/Services/ServiceContainer.php
includes/Setup.php
includes/Title.php
includes/WatchedItemStore.php
includes/WebStart.php
includes/actions/Action.php
includes/actions/RawAction.php
includes/api/ApiBase.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiStashEdit.php
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/ko.json
includes/api/i18n/pl.json
includes/api/i18n/tcy.json
includes/api/i18n/zh-hans.json
includes/cache/CacheDependency.php
includes/cache/localisation/LocalisationCache.php
includes/config/ConfigFactory.php
includes/content/ContentHandler.php
includes/debug/MWDebug.php
includes/deferred/LinksUpdate.php
includes/diff/DairikiDiff.php
includes/diff/DiffEngine.php [new file with mode: 0644]
includes/diff/DifferenceEngine.php
includes/diff/WikiDiff3.php [deleted file]
includes/diff/WordAccumulator.php [new file with mode: 0644]
includes/diff/WordLevelDiff.php [new file with mode: 0644]
includes/exception/BadRequestError.php [new file with mode: 0644]
includes/exception/BadTitleError.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLForm.php
includes/installer/Installer.php
includes/installer/WebInstallerOutput.php
includes/installer/i18n/anp.json [new file with mode: 0644]
includes/installer/i18n/en.json
includes/installer/i18n/ia.json
includes/installer/i18n/ksh.json
includes/installer/i18n/qqq.json
includes/installer/i18n/tcy.json
includes/interwiki/ClassicInterwikiLookup.php [new file with mode: 0644]
includes/interwiki/Interwiki.php
includes/interwiki/InterwikiLookup.php [new file with mode: 0644]
includes/libs/objectcache/BagOStuff.php
includes/linker/LinkTarget.php
includes/logging/LogEventsList.php
includes/objectcache/ObjectCache.php
includes/page/Article.php
includes/page/CategoryPage.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/parser/CoreTagHooks.php
includes/parser/Parser.php
includes/password/MWOldPassword.php
includes/password/MWSaltedPassword.php
includes/password/Pbkdf2Password.php
includes/skins/SkinTemplate.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/pre-authmanager/SpecialUserlogin.php
includes/upload/UploadBase.php
includes/user/User.php
jsduck.json
languages/i18n/anp.json
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bgn.json
languages/i18n/bn.json
languages/i18n/ca.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dty.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/inh.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jut.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/mai.json
languages/i18n/mk.json
languages/i18n/nap.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/nl.json
languages/i18n/olo.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/ses.json
languages/i18n/shn.json [new file with mode: 0644]
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/tcy.json
languages/i18n/th.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/xmf.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/convertExtensionToRegistration.php
maintenance/storage/recompressTracked.php
mw-config/config-cc.css
mw-config/config.css
package.json
resources/Resources.php
resources/ResourcesOOUI.php
resources/src/jquery.tipsy/jquery.tipsy.css
resources/src/jquery/jquery.arrowSteps.css
resources/src/jquery/jquery.badge.css
resources/src/jquery/jquery.confirmable.css
resources/src/jquery/jquery.farbtastic.css
resources/src/jquery/jquery.spinner.css
resources/src/jquery/jquery.suggestions.css
resources/src/mediawiki.action/mediawiki.action.history.css
resources/src/mediawiki.action/mediawiki.action.history.diff.css
resources/src/mediawiki.action/mediawiki.action.view.filepage.css
resources/src/mediawiki.action/mediawiki.action.view.postEdit.css
resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/content.externallinks.css
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.skinning/interface.css
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.preferences.styles.css
resources/src/mediawiki.special/mediawiki.special.search.css [changed mode: 0755->0644]
resources/src/mediawiki.special/mediawiki.special.userlogin.login.css
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.css
resources/src/mediawiki.toolbar/toolbar.less
resources/src/mediawiki.widgets.datetime/CalendarWidget.less
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.less
resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.definitions.less
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less
resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.less
resources/src/mediawiki/mediawiki.apihelp.css
resources/src/mediawiki/mediawiki.content.json.css
resources/src/mediawiki/mediawiki.debug.less
resources/src/mediawiki/mediawiki.feedback.css
resources/src/mediawiki/mediawiki.feedlink.css
resources/src/mediawiki/mediawiki.filewarning.less
resources/src/mediawiki/mediawiki.hlist.css
resources/src/mediawiki/mediawiki.htmlform.css
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.css
resources/src/mediawiki/mediawiki.searchSuggest.css
resources/src/mediawiki/mediawiki.util.js
resources/src/mediawiki/page/gallery.css
resources/src/mediawiki/page/patrol.ajax.js
resources/src/moment-dmy.js [new file with mode: 0644]
resources/src/moment-locale-overrides.js
tests/browser/features/edit_page.feature
tests/browser/features/view_history.feature
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/Services/ServiceContainerTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/WatchedItemStoreIntegrationTest.php
tests/phpunit/includes/WatchedItemStoreUnitTest.php
tests/phpunit/includes/api/ApiLoginTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiSetNotificationTimestampIntegrationTest.php [new file with mode: 0644]
tests/phpunit/includes/api/format/ApiFormatJsonTest.php
tests/phpunit/includes/config/ConfigFactoryTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/interwiki/ClassicInterwikiLookupTest.php [new file with mode: 0644]
tests/phpunit/includes/interwiki/InterwikiTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/user/BotPasswordTest.php
tests/phpunit/suite.xml

diff --git a/.stylelintrc b/.stylelintrc
new file mode 100644 (file)
index 0000000..6b94db6
--- /dev/null
@@ -0,0 +1,26 @@
+{
+       "rules": {
+               "color-hex-case": [ "lower" ],
+               "color-hex-length": [ "short" ],
+               "color-named": [ "never" ],
+               "color-no-invalid-hex": true,
+
+               "declaration-bang-space-after": [ "never" ],
+               "declaration-bang-space-before": [ "always" ],
+               "declaration-colon-space-after": [ "always" ],
+               "declaration-colon-space-before": [ "never" ],
+
+               "font-family-name-quotes": [ "single-unless-keyword" ],
+               "font-weight-notation": [ "named-where-possible" ],
+
+               "function-calc-no-unspaced-operator": true,
+               "function-comma-newline-after": "never-multi-line",
+               "function-comma-newline-before": "never-multi-line",
+               "function-comma-space-after": [ "always" ],
+               "function-comma-space-before": [ "never" ],
+               "function-parentheses-newline-inside": [ "never-multi-line" ],
+               "function-parentheses-space-inside": [ "always" ],
+               "function-url-quotes": [ "none" ],
+               "function-whitespace-after": [ "always" ],
+       }
+}
index 354f048..a08db5c 100644 (file)
@@ -2,6 +2,7 @@
 module.exports = function ( grunt ) {
        grunt.loadNpmTasks( 'grunt-contrib-copy' );
        grunt.loadNpmTasks( 'grunt-contrib-jshint' );
+       grunt.loadNpmTasks( 'grunt-stylelint' );
        grunt.loadNpmTasks( 'grunt-contrib-watch' );
        grunt.loadNpmTasks( 'grunt-banana-checker' );
        grunt.loadNpmTasks( 'grunt-jscs' );
@@ -39,9 +40,15 @@ module.exports = function ( grunt ) {
                        api: 'includes/api/i18n/',
                        installer: 'includes/installer/i18n/'
                },
+               stylelint: {
+                       options: {
+                               syntax: 'less'
+                       },
+                       src: '{resources/src/*,mw-config/**}/*.{css,less}'
+               },
                watch: {
                        files: [
-                               '.js*',
+                               '.{stylelintrc,jscsrc,jshintignore,jshintrc}',
                                '**/*',
                                '!{docs,extensions,node_modules,skins,vendor}/**'
                        ],
@@ -96,7 +103,7 @@ module.exports = function ( grunt ) {
                return !!( process.env.MW_SERVER && process.env.MW_SCRIPT_PATH );
        } );
 
-       grunt.registerTask( 'lint', [ 'jshint', 'jscs', 'jsonlint', 'banana' ] );
+       grunt.registerTask( 'lint', [ 'jshint', 'jscs', 'jsonlint', 'banana', 'stylelint' ] );
        grunt.registerTask( 'qunit', [ 'assert-mw-env', 'karma:main' ] );
 
        grunt.registerTask( 'test', [ 'lint' ] );
index 7c50e4f..e644ae4 100644 (file)
@@ -11,7 +11,7 @@ HHVM 3.1. Additionally, the following PHP extensions are required:
 * ctype
 * iconv
 * json
-* mbstring
+* mbstring (new requirement in 1.27)
 * xml
 The following PHP extensions are strongly recommended:
 * openssl
index f79bace..c68b703 100644 (file)
@@ -164,6 +164,7 @@ $wgAutoloadLocalClasses = [
        'BacklinkJobUtils' => __DIR__ . '/includes/jobqueue/utils/BacklinkJobUtils.php',
        'BackupDumper' => __DIR__ . '/maintenance/backup.inc',
        'BackupReader' => __DIR__ . '/maintenance/importDump.php',
+       'BadRequestError' => __DIR__ . '/includes/exception/BadRequestError.php',
        'BadTitleError' => __DIR__ . '/includes/exception/BadTitleError.php',
        'BagOStuff' => __DIR__ . '/includes/libs/objectcache/BagOStuff.php',
        'BaseDump' => __DIR__ . '/maintenance/backupPrefetch.inc',
@@ -352,7 +353,7 @@ $wgAutoloadLocalClasses = [
        'DerivativeResourceLoaderContext' => __DIR__ . '/includes/resourceloader/DerivativeResourceLoaderContext.php',
        'DescribeFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
        'Diff' => __DIR__ . '/includes/diff/DairikiDiff.php',
-       'DiffEngine' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffEngine' => __DIR__ . '/includes/diff/DiffEngine.php',
        'DiffFormatter' => __DIR__ . '/includes/diff/DiffFormatter.php',
        'DiffHistoryBlob' => __DIR__ . '/includes/HistoryBlob.php',
        'DiffOp' => __DIR__ . '/includes/diff/DairikiDiff.php',
@@ -772,13 +773,13 @@ $wgAutoloadLocalClasses = [
        'MagicWord' => __DIR__ . '/includes/MagicWord.php',
        'MagicWordArray' => __DIR__ . '/includes/MagicWordArray.php',
        'MailAddress' => __DIR__ . '/includes/mail/MailAddress.php',
+       'MainConfigDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
        'Maintenance' => __DIR__ . '/maintenance/Maintenance.php',
        'MaintenanceFormatInstallDoc' => __DIR__ . '/maintenance/formatInstallDoc.php',
        'MakeTestEdits' => __DIR__ . '/maintenance/makeTestEdits.php',
        'MalformedTitleException' => __DIR__ . '/includes/title/MalformedTitleException.php',
        'ManualLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
        'MapCacheLRU' => __DIR__ . '/includes/libs/MapCacheLRU.php',
-       'MappedDiff' => __DIR__ . '/includes/diff/DairikiDiff.php',
        'MappedIterator' => __DIR__ . '/includes/libs/MappedIterator.php',
        'MarkpatrolledAction' => __DIR__ . '/includes/actions/MarkpatrolledAction.php',
        'McTest' => __DIR__ . '/maintenance/mctest.php',
@@ -828,6 +829,9 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Auth\\Throttler' => __DIR__ . '/includes/auth/Throttler.php',
        'MediaWiki\\Auth\\UserDataAuthenticationRequest' => __DIR__ . '/includes/auth/UserDataAuthenticationRequest.php',
        'MediaWiki\\Auth\\UsernameAuthenticationRequest' => __DIR__ . '/includes/auth/UsernameAuthenticationRequest.php',
+       'MediaWiki\\Diff\\WordAccumulator' => __DIR__ . '/includes/diff/WordAccumulator.php',
+       'MediaWiki\\Interwiki\\ClassicInterwikiLookup' => __DIR__ . '/includes/interwiki/ClassicInterwikiLookup.php',
+       'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php',
        'MediaWiki\\Languages\\Data\\Names' => __DIR__ . '/languages/data/Names.php',
        'MediaWiki\\Languages\\Data\\ZhConversion' => __DIR__ . '/languages/data/ZhConversion.php',
        'MediaWiki\\Linker\\LinkTarget' => __DIR__ . '/includes/linker/LinkTarget.php',
@@ -850,6 +854,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Services\\ContainerDisabledException' => __DIR__ . '/includes/Services/ContainerDisabledException.php',
        'MediaWiki\\Services\\DestructibleService' => __DIR__ . '/includes/Services/DestructibleService.php',
        'MediaWiki\\Services\\NoSuchServiceException' => __DIR__ . '/includes/Services/NoSuchServiceException.php',
+       'MediaWiki\\Services\\SalvageableService' => __DIR__ . '/includes/Services/SalvageableService.php',
        'MediaWiki\\Services\\ServiceAlreadyDefinedException' => __DIR__ . '/includes/Services/ServiceAlreadyDefinedException.php',
        'MediaWiki\\Services\\ServiceContainer' => __DIR__ . '/includes/Services/ServiceContainer.php',
        'MediaWiki\\Services\\ServiceDisabledException' => __DIR__ . '/includes/Services/ServiceDisabledException.php',
@@ -1086,7 +1091,7 @@ $wgAutoloadLocalClasses = [
        'RCFeedFormatter' => __DIR__ . '/includes/rcfeed/RCFeedFormatter.php',
        'RSSFeed' => __DIR__ . '/includes/Feed.php',
        'RandomPage' => __DIR__ . '/includes/specials/SpecialRandompage.php',
-       'RangeDifference' => __DIR__ . '/includes/diff/WikiDiff3.php',
+       'RangeDifference' => __DIR__ . '/includes/diff/DiffEngine.php',
        'RawAction' => __DIR__ . '/includes/actions/RawAction.php',
        'RawMessage' => __DIR__ . '/includes/Message.php',
        'ReadOnlyError' => __DIR__ . '/includes/exception/ReadOnlyError.php',
@@ -1504,7 +1509,6 @@ $wgAutoloadLocalClasses = [
        'WebRequestUpload' => __DIR__ . '/includes/WebRequestUpload.php',
        'WebResponse' => __DIR__ . '/includes/WebResponse.php',
        'WikiCategoryPage' => __DIR__ . '/includes/page/WikiCategoryPage.php',
-       'WikiDiff3' => __DIR__ . '/includes/diff/WikiDiff3.php',
        'WikiExporter' => __DIR__ . '/includes/export/WikiExporter.php',
        'WikiFilePage' => __DIR__ . '/includes/page/WikiFilePage.php',
        'WikiImporter' => __DIR__ . '/includes/import/WikiImporter.php',
@@ -1517,7 +1521,7 @@ $wgAutoloadLocalClasses = [
        'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php',
        'WinCacheBagOStuff' => __DIR__ . '/includes/libs/objectcache/WinCacheBagOStuff.php',
        'WithoutInterwikiPage' => __DIR__ . '/includes/specials/SpecialWithoutinterwiki.php',
-       'WordLevelDiff' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'WordLevelDiff' => __DIR__ . '/includes/diff/WordLevelDiff.php',
        'WrapOldPasswords' => __DIR__ . '/maintenance/wrapOldPasswords.php',
        'XCFHandler' => __DIR__ . '/includes/media/XCF.php',
        'XCacheBagOStuff' => __DIR__ . '/includes/libs/objectcache/XCacheBagOStuff.php',
index f652786..9d2b3c2 100644 (file)
@@ -2494,6 +2494,12 @@ $context: (IContextSource) The RequestContext the skin is being created for.
 &$skin: A variable reference you may set a Skin instance or string key on to
   override the skin that will be used for the context.
 
+'RequestHasSameOriginSecurity': Called to determine if the request is somehow
+flagged to lack same-origin security. Return false to indicate the lack. Note
+if the "somehow" involves HTTP headers, you'll probably need to make sure
+the header is varied on.
+WebRequest $request: The request.
+
 'ResetPasswordExpiration': Allow extensions to set a default password expiration
 $user: The user having their password expiration reset
 &$newExpire: The new expiration date
index 0b70d16..c7a0c15 100644 (file)
@@ -4261,7 +4261,13 @@ $wgDebugTidy = false;
 $wgRawHtml = false;
 
 /**
- * Set a default target for external links, e.g. _blank to pop up a new window
+ * Set a default target for external links, e.g. _blank to pop up a new window.
+ *
+ * This will also set the "noreferrer" and "noopener" link rel to prevent the
+ * attack described at https://mathiasbynens.github.io/rel-noopener/ .
+ * Some older browsers may not support these link attributes, hence
+ * setting $wgExternalLinkTarget to _blank may represent a security risk
+ * to some of your users.
  */
 $wgExternalLinkTarget = false;
 
@@ -4844,7 +4850,7 @@ $wgSessionProviders = [
        MediaWiki\Session\BotPasswordSessionProvider::class => [
                'class' => MediaWiki\Session\BotPasswordSessionProvider::class,
                'args' => [ [
-                       'priority' => 40,
+                       'priority' => 75,
                ] ],
        ],
 ];
index 9a6950e..d2b3443 100644 (file)
@@ -305,3 +305,9 @@ define( 'CONTENT_FORMAT_JSON', 'application/json' );
 // for future use with the api, and for use by extensions
 define( 'CONTENT_FORMAT_XML', 'application/xml' );
 /**@}*/
+
+/**@{
+ * Max string length for shell invocations; based on binfmts.h
+ */
+define( 'SHELL_MAX_ARG_STRLEN', '100000' );
+/**@}*/
index 0f52983..8acd036 100644 (file)
@@ -2833,9 +2833,14 @@ class EditPage {
                                        "<div id='mw-anon-edit-warning' class='warningbox'>\n$1\n</div>",
                                        [ 'anoneditwarning',
                                                // Log-in link
-                                               '{{fullurl:Special:UserLogin|returnto={{FULLPAGENAMEE}}}}',
+                                               SpecialPage::getTitleFor( 'Userlogin' )->getFullURL( [
+                                                       'returnto' => $this->getTitle()->getPrefixedDBkey()
+                                               ] ),
                                                // Sign-up link
-                                               '{{fullurl:Special:CreateAccount|returnto={{FULLPAGENAMEE}}}}' ]
+                                               SpecialPage::getTitleFor( 'CreateAccount' )->getFullURL( [
+                                                       'returnto' => $this->getTitle()->getPrefixedDBkey()
+                                               ] )
+                                       ]
                                );
                        } else {
                                $wgOut->wrapWikiMsg( "<div id=\"mw-anon-preview-warning\" class=\"warningbox\">\n$1</div>",
index 618fa4c..d5c6553 100644 (file)
@@ -30,7 +30,6 @@ use MediaWiki\Session\SessionManager;
 
 // Hide compatibility functions from Doxygen
 /// @cond
-
 /**
  * Compatibility functions
  *
@@ -2457,6 +2456,15 @@ function wfShellExec( $cmd, &$retval = null, $environ = [],
        }
        wfDebug( "wfShellExec: $cmd\n" );
 
+       // Don't try to execute commands that exceed Linux's MAX_ARG_STRLEN.
+       // Other platforms may be more accomodating, but we don't want to be
+       // accomodating, because very long commands probably include user
+       // input. See T129506.
+       if ( strlen( $cmd ) > SHELL_MAX_ARG_STRLEN ) {
+               throw new Exception( __METHOD__ .
+                       '(): total length of $cmd must not exceed SHELL_MAX_ARG_STRLEN' );
+       }
+
        $desc = [
                0 => [ 'file', 'php://stdin', 'r' ],
                1 => [ 'pipe', 'w' ],
index 6a869dd..3baf865 100644 (file)
@@ -1084,7 +1084,16 @@ class Linker {
                if ( !$title ) {
                        $title = $wgTitle;
                }
-               $attribs['rel'] = Parser::getExternalLinkRel( $url, $title );
+               $newRel = Parser::getExternalLinkRel( $url, $title );
+               if ( !isset( $attribs['rel'] ) || $attribs['rel'] === '' ) {
+                       $attribs['rel'] = $newRel;
+               } elseif ( $newRel !== '' ) {
+                       // Merge the rel attributes.
+                       $newRels = explode( ' ', $newRel );
+                       $oldRels = explode( ' ', $attribs['rel'] );
+                       $combined = array_unique( array_merge( $newRels, $oldRels ) );
+                       $attribs['rel'] = implode( ' ', $combined );
+               }
                $link = '';
                $success = Hooks::run( 'LinkerMakeExternalLink',
                        [ &$url, &$text, &$link, &$attribs, $linktype ] );
index 891f426..4028aa2 100644 (file)
@@ -11,8 +11,10 @@ use LBFactory;
 use LinkCache;
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 use LoadBalancer;
+use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceContainer;
 use MWException;
+use ObjectCache;
 use ResourceLoader;
 use SearchEngine;
 use SearchEngineConfig;
@@ -23,6 +25,7 @@ use WatchedItemStore;
 use SkinFactory;
 use TitleFormatter;
 use TitleParser;
+use MediaWiki\Interwiki\InterwikiLookup;
 
 /**
  * Service locator for MediaWiki core services.
@@ -88,7 +91,7 @@ class MediaWikiServices extends ServiceContainer {
                        // even if it's just a file name or database credentials to load
                        // configuration from.
                        $bootstrapConfig = new GlobalVarConfig();
-                       self::$instance = self::newInstance( $bootstrapConfig );
+                       self::$instance = self::newInstance( $bootstrapConfig, 'load' );
                }
 
                return self::$instance;
@@ -121,7 +124,7 @@ class MediaWikiServices extends ServiceContainer {
        /**
         * Creates a new instance of MediaWikiServices and sets it as the global default
         * instance. getInstance() will return a different MediaWikiServices object
-        * after every call to resetGlobalServiceLocator().
+        * after every call to resetGlobalInstance().
         *
         * @since 1.28
         *
@@ -129,7 +132,7 @@ class MediaWikiServices extends ServiceContainer {
         * when the configuration has changed significantly since bootstrap time, e.g.
         * during the installation process or during testing.
         *
-        * @warning Calling resetGlobalServiceLocator() may leave the application in an inconsistent
+        * @warning Calling resetGlobalInstance() may leave the application in an inconsistent
         * state. Calling this is only safe under the ASSUMPTION that NO REFERENCE to
         * any of the services managed by MediaWikiServices exist. If any service objects
         * managed by the old MediaWikiServices instance remain in use, they may INTERFERE
@@ -150,11 +153,14 @@ class MediaWikiServices extends ServiceContainer {
         *        was no previous instance, a new GlobalVarConfig object will be used to
         *        bootstrap the services.
         *
+        * @param string $quick Set this to "quick" to allow expensive resources to be re-used.
+        * See SalvageableService for details.
+        *
         * @throws MWException If called after MW_SERVICE_BOOTSTRAP_COMPLETE has been defined in
         *         Setup.php (unless MW_PHPUNIT_TEST or MEDIAWIKI_INSTALL or RUN_MAINTENANCE_IF_MAIN
         *          is defined).
         */
-       public static function resetGlobalInstance( Config $bootstrapConfig = null ) {
+       public static function resetGlobalInstance( Config $bootstrapConfig = null, $quick = '' ) {
                if ( self::$instance === null ) {
                        // no global instance yet, nothing to reset
                        return;
@@ -166,9 +172,38 @@ class MediaWikiServices extends ServiceContainer {
                        $bootstrapConfig = self::$instance->getBootstrapConfig();
                }
 
-               self::$instance->destroy();
+               $oldInstance = self::$instance;
 
                self::$instance = self::newInstance( $bootstrapConfig );
+               self::$instance->importWiring( $oldInstance, [ 'BootstrapConfig' ] );
+
+               if ( $quick === 'quick' ) {
+                       self::$instance->salvage( $oldInstance );
+               } else {
+                       $oldInstance->destroy();
+               }
+
+       }
+
+       /**
+        * Salvages the state of any salvageable service instances in $other.
+        *
+        * @note $other will have been destroyed when salvage() returns.
+        *
+        * @param MediaWikiServices $other
+        */
+       private function salvage( self $other ) {
+               foreach ( $this->getServiceNames() as $name ) {
+                       $oldService = $other->peekService( $name );
+
+                       if ( $oldService instanceof SalvageableService ) {
+                               /** @var SalvageableService $newService */
+                               $newService = $this->getService( $name );
+                               $newService->salvage( $oldService );
+                       }
+               }
+
+               $other->destroy();
        }
 
        /**
@@ -177,21 +212,23 @@ class MediaWikiServices extends ServiceContainer {
         * ServiceWiringFiles setting are loaded, and the MediaWikiServices hook is called.
         *
         * @param Config|null $bootstrapConfig The Config object to be registered as the
-        *        'BootstrapConfig' service. This has to contain at least the information
-        *        needed to set up the 'ConfigFactory' service. If not provided, any call
-        *        to getBootstrapConfig(), getConfigFactory, or getMainConfig will fail.
-        *        A MediaWikiServices instance without access to configuration is called
-        *        "primordial".
+        *        'BootstrapConfig' service.
+        *
+        * @param string $loadWiring set this to 'load' to load the wiring files specified
+        *        in the 'ServiceWiringFiles' setting in $bootstrapConfig.
         *
         * @return MediaWikiServices
         * @throws MWException
+        * @throws \FatalError
         */
-       private static function newInstance( Config $bootstrapConfig ) {
+       private static function newInstance( Config $bootstrapConfig, $loadWiring = '' ) {
                $instance = new self( $bootstrapConfig );
 
                // Load the default wiring from the specified files.
-               $wiringFiles = $bootstrapConfig->get( 'ServiceWiringFiles' );
-               $instance->loadWiringFiles( $wiringFiles );
+               if ( $loadWiring === 'load' ) {
+                       $wiringFiles = $bootstrapConfig->get( 'ServiceWiringFiles' );
+                       $instance->loadWiringFiles( $wiringFiles );
+               }
 
                // Provide a traditional hook point to allow extensions to configure services.
                Hooks::run( 'MediaWikiServices', [ $instance ] );
@@ -222,6 +259,8 @@ class MediaWikiServices extends ServiceContainer {
                foreach ( $destroy as $name ) {
                        $services->disableService( $name );
                }
+
+               ObjectCache::clear();
        }
 
        /**
@@ -261,7 +300,7 @@ class MediaWikiServices extends ServiceContainer {
         * instances to clean up.
         *
         * @param string $name
-        * @param string $destroy Whether the service instance should be destroyed if it exists.
+        * @param bool $destroy Whether the service instance should be destroyed if it exists.
         *        When set to false, any existing service instance will effectively be detached
         *        from the container.
         *
@@ -381,6 +420,14 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'SiteStore' );
        }
 
+       /**
+        * @since 1.28
+        * @return InterwikiLookup
+        */
+       public function getInterwikiLookup() {
+               return $this->getService( 'InterwikiLookup' );
+       }
+
        /**
         * @since 1.27
         * @return StatsdDataFactory
index c9c326b..2f47006 100644 (file)
@@ -154,8 +154,8 @@ function wfGzipHandler( $s ) {
  */
 function wfMangleFlashPolicy( $s ) {
        # Avoid weird excessive memory usage in PCRE on big articles
-       if ( preg_match( '/\<\s*cross-domain-policy\s*\>/i', $s ) ) {
-               return preg_replace( '/\<\s*cross-domain-policy\s*\>/i', '<NOT-cross-domain-policy>', $s );
+       if ( preg_match( '/\<\s*cross-domain-policy(?=\s|\>)/i', $s ) ) {
+               return preg_replace( '/\<(\s*)(cross-domain-policy(?=\s|\>))/i', '<$1NOT-$2', $s );
        } else {
                return $s;
        }
index 67e9a4f..d8600c1 100644 (file)
@@ -2026,6 +2026,11 @@ class OutputPage extends ContextSource {
         * @return string
         */
        public function getVaryHeader() {
+               // If we vary on cookies, let's make sure it's always included here too.
+               if ( $this->getCacheVaryCookies() ) {
+                       $this->addVaryHeader( 'Cookie' );
+               }
+
                foreach ( SessionManager::singleton()->getVaryHeaders() as $header => $options ) {
                        $this->addVaryHeader( $header, $options );
                }
index 293e6eb..6bdacf0 100644 (file)
@@ -37,6 +37,7 @@
  *      MediaWiki code base.
  */
 
+use MediaWiki\Interwiki\ClassicInterwikiLookup;
 use MediaWiki\MediaWikiServices;
 
 return [
@@ -88,6 +89,19 @@ return [
                return $services->getConfigFactory()->makeConfig( 'main' );
        },
 
+       'InterwikiLookup' => function( MediaWikiServices $services ) {
+               global $wgContLang; // TODO: manage $wgContLang as a service
+               $config = $services->getMainConfig();
+               return new ClassicInterwikiLookup(
+                       $wgContLang,
+                       ObjectCache::getMainWANInstance(),
+                       $config->get( 'InterwikiExpiry' ),
+                       $config->get( 'InterwikiCache' ),
+                       $config->get( 'InterwikiScopes' ),
+                       $config->get( 'InterwikiFallbackSite' )
+               );
+       },
+
        'StatsdDataFactory' => function( MediaWikiServices $services ) {
                return new BufferingStatsdDataFactory(
                        rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' )
diff --git a/includes/Services/SalvageableService.php b/includes/Services/SalvageableService.php
new file mode 100644 (file)
index 0000000..a613050
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+namespace MediaWiki\Services;
+
+/**
+ * Interface for salvageable services.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ *
+ * @since 1.28
+ */
+
+/**
+ * SalvageableService defines an interface for services that are able to salvage state from a
+ * previous instance of the same class. The intent is to allow new service instances to re-use
+ * resources that would be expensive to re-create, such as cached data or network connections.
+ *
+ * @note There is no expectation that services will be destroyed when the process (or web request)
+ * terminates.
+ */
+interface SalvageableService {
+
+       /**
+        * Re-uses state from $other. $other must not be used after being passed to salvage(),
+        * and should be considered to be destroyed.
+        *
+        * @note Implementations are responsible for determining what parts of $other can be re-used
+        * safely. In particular, implementations should check that the relevant configuration of
+        * $other is the same as in $this before re-using resources from $other.
+        *
+        * @note Implementations must take care to detach any re-used resources from the original
+        * service instance. If $other is destroyed later, resources that are now used by the
+        * new service instance must not be affected.
+        *
+        * @note If $other is a DestructibleService, implementations should make sure that $other
+        * is in destroyed state after salvage finished. This may be done by calling $other->destroy()
+        * after carefully detaching all relevant resources.
+        *
+        * @param SalvageableService $other The object to salvage state from. $other must have the
+        * exact same type as $this.
+        */
+       public function salvage( SalvageableService $other );
+
+}
index 66ee918..b336795 100644 (file)
@@ -55,6 +55,11 @@ class ServiceContainer implements DestructibleService {
         */
        private $serviceInstantiators = [];
 
+       /**
+        * @var boolean[] disabled status, per service name
+        */
+       private $disabled = [];
+
        /**
         * @var array
         */
@@ -126,6 +131,28 @@ class ServiceContainer implements DestructibleService {
                }
        }
 
+       /**
+        * Imports all wiring defined in $container. Wiring defined in $container
+        * will override any wiring already defined locally. However, already
+        * existing service instances will be preserved.
+        *
+        * @since 1.28
+        *
+        * @param ServiceContainer $container
+        * @param string[] $skip A list of service names to skip during import
+        */
+       public function importWiring( ServiceContainer $container, $skip = [] ) {
+               $newInstantiators = array_diff_key(
+                       $container->serviceInstantiators,
+                       array_flip( $skip )
+               );
+
+               $this->serviceInstantiators = array_merge(
+                       $this->serviceInstantiators,
+                       $newInstantiators
+               );
+       }
+
        /**
         * Returns true if a service is defined for $name, that is, if a call to getService( $name )
         * would return a service instance.
@@ -220,6 +247,7 @@ class ServiceContainer implements DestructibleService {
                }
 
                $this->serviceInstantiators[$name] = $instantiator;
+               unset( $this->disabled[$name] );
        }
 
        /**
@@ -244,9 +272,7 @@ class ServiceContainer implements DestructibleService {
        public function disableService( $name ) {
                $this->resetService( $name );
 
-               $this->redefineService( $name, function() use ( $name ) {
-                       throw new ServiceDisabledException( $name );
-               } );
+               $this->disabled[$name] = true;
        }
 
        /**
@@ -282,6 +308,7 @@ class ServiceContainer implements DestructibleService {
                }
 
                unset( $this->services[$name] );
+               unset( $this->disabled[$name] );
        }
 
        /**
@@ -299,7 +326,8 @@ class ServiceContainer implements DestructibleService {
         * @param string $name The service name
         *
         * @throws NoSuchServiceException if $name is not a known service.
-        * @throws ServiceDisabledException if this container has already been destroyed.
+        * @throws ContainerDisabledException if this container has already been destroyed.
+        * @throws ServiceDisabledException if the requested service has been disabled.
         *
         * @return object The service instance
         */
@@ -308,6 +336,10 @@ class ServiceContainer implements DestructibleService {
                        throw new ContainerDisabledException();
                }
 
+               if ( isset( $this->disabled[$name] ) ) {
+                       throw new ServiceDisabledException( $name );
+               }
+
                if ( !isset( $this->services[$name] ) ) {
                        $this->services[$name] = $this->createService( $name );
                }
@@ -327,6 +359,7 @@ class ServiceContainer implements DestructibleService {
                                $this->serviceInstantiators[$name],
                                array_merge( [ $this ], $this->extraInstantiationParams )
                        );
+                       // NOTE: when adding more wiring logic here, make sure copyWiring() is kept in sync!
                } else {
                        throw new NoSuchServiceException( $name );
                }
index e57b96a..5b19b5f 100644 (file)
@@ -517,7 +517,7 @@ if ( !class_exists( 'AutoLoader' ) ) {
 
 // Reset the global service locator, so any services that have already been created will be
 // re-created while taking into account any custom settings and extensions.
-MediaWikiServices::resetGlobalInstance( new GlobalVarConfig() );
+MediaWikiServices::resetGlobalInstance( new GlobalVarConfig(), 'quick' );
 
 // Define a constant that indicates that the bootstrapping of the service locator
 // is complete.
index 3043ed4..4555f16 100644 (file)
@@ -22,6 +22,7 @@
  * @file
  */
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\Interwiki\InterwikiLookup;
 use MediaWiki\MediaWikiServices;
 
 /**
@@ -170,6 +171,18 @@ class Title implements LinkTarget {
                return MediaWikiServices::getInstance()->getTitleFormatter();
        }
 
+       /**
+        * B/C kludge: provide an InterwikiLookup for use by Title.
+        * Ideally, Title would have no methods that need this.
+        * Avoid usage of this singleton by using TitleValue
+        * and the associated services when possible.
+        *
+        * @return InterwikiLookup
+        */
+       private static function getInterwikiLookup() {
+               return MediaWikiServices::getInstance()->getInterwikiLookup();
+       }
+
        /**
         * @access protected
         */
@@ -760,7 +773,7 @@ class Title implements LinkTarget {
         */
        public function isLocal() {
                if ( $this->isExternal() ) {
-                       $iw = Interwiki::fetch( $this->mInterwiki );
+                       $iw = self::getInterwikiLookup()->fetch( $this->mInterwiki );
                        if ( $iw ) {
                                return $iw->isLocal();
                        }
@@ -808,7 +821,7 @@ class Title implements LinkTarget {
                        return false;
                }
 
-               return Interwiki::fetch( $this->mInterwiki )->isTranscludable();
+               return self::getInterwikiLookup()->fetch( $this->mInterwiki )->isTranscludable();
        }
 
        /**
@@ -821,7 +834,7 @@ class Title implements LinkTarget {
                        return false;
                }
 
-               return Interwiki::fetch( $this->mInterwiki )->getWikiID();
+               return self::getInterwikiLookup()->fetch( $this->mInterwiki )->getWikiID();
        }
 
        /**
@@ -908,7 +921,9 @@ class Title implements LinkTarget {
         * @return string Content model id
         */
        public function getContentModel( $flags = 0 ) {
-               if ( !$this->mContentModel && $this->getArticleID( $flags ) ) {
+               if ( ( !$this->mContentModel || $flags === Title::GAID_FOR_UPDATE ) &&
+                       $this->getArticleID( $flags )
+               ) {
                        $linkCache = LinkCache::singleton();
                        $linkCache->addLinkObj( $this ); # in case we already had an article ID
                        $this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' );
@@ -1675,7 +1690,7 @@ class Title implements LinkTarget {
 
                $query = self::fixUrlQueryArgs( $query, $query2 );
 
-               $interwiki = Interwiki::fetch( $this->mInterwiki );
+               $interwiki = self::getInterwikiLookup()->fetch( $this->mInterwiki );
                if ( $interwiki ) {
                        $namespace = $this->getNsText();
                        if ( $namespace != '' ) {
@@ -2971,6 +2986,8 @@ class Title implements LinkTarget {
 
        /**
         * Purge expired restrictions from the page_restrictions table
+        *
+        * This will purge no more than $wgUpdateRowsPerQuery page_restrictions rows
         */
        static function purgeExpiredRestrictions() {
                if ( wfReadOnly() ) {
@@ -2981,11 +2998,24 @@ class Title implements LinkTarget {
                        wfGetDB( DB_MASTER ),
                        __METHOD__,
                        function ( IDatabase $dbw, $fname ) {
-                               $dbw->delete(
+                               $config = MediaWikiServices::getInstance()->getMainConfig();
+                               $ids = $dbw->selectFieldValues(
                                        'page_restrictions',
+                                       'pr_id',
                                        [ 'pr_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ],
-                                       $fname
+                                       $fname,
+                                       [ 'LIMIT' => $config->get( 'UpdateRowsPerQuery' ) ] // T135470
                                );
+                               if ( $ids ) {
+                                       $dbw->delete( 'page_restrictions', [ 'pr_id' => $ids ], $fname );
+                               }
+                       }
+               ) );
+
+               DeferredUpdates::addUpdate( new AtomicSectionUpdate(
+                       wfGetDB( DB_MASTER ),
+                       __METHOD__,
+                       function ( IDatabase $dbw, $fname ) {
                                $dbw->delete(
                                        'protected_titles',
                                        [ 'pt_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ],
index eb652ce..f0619d6 100644 (file)
@@ -145,16 +145,28 @@ class WatchedItemStore implements StatsdAwareInterface {
        }
 
        private function uncacheLinkTarget( LinkTarget $target ) {
+               $this->stats->increment( 'WatchedItemStore.uncacheLinkTarget' );
                if ( !isset( $this->cacheIndex[$target->getNamespace()][$target->getDBkey()] ) ) {
                        return;
                }
-               $this->stats->increment( 'WatchedItemStore.uncacheLinkTarget' );
                foreach ( $this->cacheIndex[$target->getNamespace()][$target->getDBkey()] as $key ) {
                        $this->stats->increment( 'WatchedItemStore.uncacheLinkTarget.items' );
                        $this->cache->delete( $key );
                }
        }
 
+       private function uncacheUser( User $user ) {
+               $this->stats->increment( 'WatchedItemStore.uncacheUser' );
+               foreach ( $this->cacheIndex as $ns => $dbKeyArray ) {
+                       foreach ( $dbKeyArray as $dbKey => $userArray ) {
+                               if ( isset( $userArray[$user->getId()] ) ) {
+                                       $this->stats->increment( 'WatchedItemStore.uncacheUser.items' );
+                                       $this->cache->delete( $userArray[$user->getId()] );
+                               }
+                       }
+               }
+       }
+
        /**
         * @param User $user
         * @param LinkTarget $target
@@ -667,6 +679,41 @@ class WatchedItemStore implements StatsdAwareInterface {
                return $success;
        }
 
+       /**
+        * @param User $user The user to set the timestamp for
+        * @param string $timestamp Set the update timestamp to this value
+        * @param LinkTarget[] $targets List of targets to update. Default to all targets
+        *
+        * @return bool success
+        */
+       public function setNotificationTimestampsForUser( User $user, $timestamp, array $targets = [] ) {
+               // Only loggedin user can have a watchlist
+               if ( $user->isAnon() ) {
+                       return false;
+               }
+
+               $dbw = $this->getConnection( DB_MASTER );
+
+               $conds = [ 'wl_user' => $user->getId() ];
+               if ( $targets ) {
+                       $batch = new LinkBatch( $targets );
+                       $conds[] = $batch->constructSet( 'wl', $dbw );
+               }
+
+               $success = $dbw->update(
+                       'watchlist',
+                       [ 'wl_notificationtimestamp' => $dbw->timestamp( $timestamp ) ],
+                       $conds,
+                       __METHOD__
+               );
+
+               $this->reuseConnection( $dbw );
+
+               $this->uncacheUser( $user );
+
+               return $success;
+       }
+
        /**
         * @param User $editor The editor that triggered the update. Their notification
         *  timestamp will not be updated(they have already seen it)
index 29ad456..d063ce3 100644 (file)
  * @file
  */
 
+if ( ini_get( 'mbstring.func_overload' ) ) {
+       die( 'MediaWiki does not support installations where mbstring.func_overload is non-zero.' );
+}
+
 # bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
 # We're adding it here so that it's *always* set, even for alternate entry
 # points and when $wgOut gets disabled or overridden.
index 839d7b2..84bf16e 100644 (file)
@@ -62,7 +62,7 @@ abstract class Action {
         * the action is disabled, or null if it's not recognised
         * @param string $action
         * @param array $overrides
-        * @return bool|null|string|callable
+        * @return bool|null|string|callable|Action
         */
        final private static function getClass( $action, array $overrides ) {
                global $wgActions;
index c7b18a4..5bf24f6 100644 (file)
@@ -80,6 +80,12 @@ class RawAction extends FormlessAction {
                        }
                }
 
+               // Set standard Vary headers so cache varies on cookies and such (T125283)
+               $response->header( $this->getOutput()->getVaryHeader() );
+               if ( $config->get( 'UseKeyHeader' ) ) {
+                       $response->header( $this->getOutput()->getKeyHeader() );
+               }
+
                $response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
                // Output may contain user-specific data;
                // vary generated content for open sessions on private wikis
index 7d0ae32..639f6be 100644 (file)
@@ -503,7 +503,13 @@ abstract class ApiBase extends ContextSource {
         * @return bool
         */
        public function lacksSameOriginSecurity() {
-               return $this->getMain()->getRequest()->getVal( 'callback' ) !== null;
+               // Main module has this method overridden
+               // Safety - avoid infinite loop:
+               if ( $this->isMain() ) {
+                       ApiBase::dieDebug( __METHOD__, 'base method was called on main module.' );
+               }
+
+               return $this->getMain()->lacksSameOriginSecurity();
        }
 
        /**
index 41de925..814450e 100644 (file)
@@ -103,9 +103,9 @@ class ApiFormatJson extends ApiFormatBase {
                // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API, so we need to
                // work around it.
-               if ( preg_match( '/\<\s*cross-domain-policy\s*\>/i', $json ) ) {
+               if ( preg_match( '/\<\s*cross-domain-policy(?=\s|\>)/i', $json ) ) {
                        $json = preg_replace(
-                               '/\<(\s*cross-domain-policy\s*)\>/i', '\\u003C$1\\u003E', $json
+                               '/\<(\s*cross-domain-policy(?=\s|\>))/i', '\\u003C$1', $json
                        );
                }
 
index d111af5..fc25f47 100644 (file)
@@ -65,7 +65,7 @@ class ApiFormatPhp extends ApiFormatBase {
                // just be broken in a useful manner.
                if ( $this->getConfig()->get( 'MangleFlashPolicy' ) &&
                        in_array( 'wfOutputHandler', ob_list_handlers(), true ) &&
-                       preg_match( '/\<\s*cross-domain-policy\s*\>/i', $text )
+                       preg_match( '/\<\s*cross-domain-policy(?=\s|\>)/i', $text )
                ) {
                        $this->dieUsage(
                                'This response cannot be represented using format=php. ' .
index b944385..60f2832 100644 (file)
@@ -148,6 +148,9 @@ class ApiMain extends ApiBase {
        private $mCacheControl = [];
        private $mParamsUsed = [];
 
+       /** @var bool|null Cached return value from self::lacksSameOriginSecurity() */
+       private $lacksSameOriginSecurity = null;
+
        /**
         * Constructs an instance of ApiMain that utilizes the module and format specified by $request.
         *
@@ -245,6 +248,35 @@ class ApiMain extends ApiBase {
                return $this->mResult;
        }
 
+       /**
+        * Get the security flag for the current request
+        * @return bool
+        */
+       public function lacksSameOriginSecurity() {
+               if ( $this->lacksSameOriginSecurity !== null ) {
+                       return $this->lacksSameOriginSecurity;
+               }
+
+               $request = $this->getRequest();
+
+               // JSONP mode
+               if ( $request->getVal( 'callback' ) !== null ) {
+                       $this->lacksSameOriginSecurity = true;
+                       return true;
+               }
+
+               // Header to be used from XMLHTTPRequest when the request might
+               // otherwise be used for XSS.
+               if ( $request->getHeader( 'Treat-as-Untrusted' ) !== false ) {
+                       $this->lacksSameOriginSecurity = true;
+                       return true;
+               }
+
+               // Allow extensions to override.
+               $this->lacksSameOriginSecurity = !Hooks::run( 'RequestHasSameOriginSecurity', [ $request ] );
+               return $this->lacksSameOriginSecurity;
+       }
+
        /**
         * Get the ApiErrorFormatter object associated with current request
         * @return ApiErrorFormatter
@@ -730,6 +762,8 @@ class ApiMain extends ApiBase {
                $response = $this->getRequest()->response();
                $out = $this->getOutput();
 
+               $out->addVaryHeader( 'Treat-as-Untrusted' );
+
                $config = $this->getConfig();
 
                if ( $config->get( 'VaryOnXFP' ) ) {
@@ -1645,9 +1679,14 @@ class ApiMain extends ApiBase {
                        $tocnumber = &$options['tocnumber'];
 
                        $header = $this->msg( 'api-help-datatypes-header' )->parse();
+
+                       // Add an additional span with sanitized ID
+                       if ( !$this->getConfig()->get( 'ExperimentalHtmlIds' ) ) {
+                               $header = Html::element( 'span', [ 'id' => Sanitizer::escapeId( 'main/datatypes' ) ] ) .
+                                       $header;
+                       }
                        $help['datatypes'] .= Html::rawElement( 'h' . min( 6, $level ),
                                [ 'id' => 'main/datatypes', 'class' => 'apihelp-header' ],
-                               Html::element( 'span', [ 'id' => Sanitizer::escapeId( 'main/datatypes' ) ] ) .
                                $header
                        );
                        $help['datatypes'] .= $this->msg( 'api-help-datatypes' )->parseAsBlock();
@@ -1663,10 +1702,14 @@ class ApiMain extends ApiBase {
                                ];
                        }
 
+                       // Add an additional span with sanitized ID
+                       if ( !$this->getConfig()->get( 'ExperimentalHtmlIds' ) ) {
+                               $header = Html::element( 'span', [ 'id' => Sanitizer::escapeId( 'main/credits' ) ] ) .
+                                       $header;
+                       }
                        $header = $this->msg( 'api-credits-header' )->parse();
                        $help['credits'] .= Html::rawElement( 'h' . min( 6, $level ),
                                [ 'id' => 'main/credits', 'class' => 'apihelp-header' ],
-                               Html::element( 'span', [ 'id' => Sanitizer::escapeId( 'main/credits' ) ] ) .
                                $header
                        );
                        $help['credits'] .= $this->msg( 'api-credits' )->useDatabase( false )->parseAsBlock();
index 2fbd50e..29e67b0 100644 (file)
@@ -72,6 +72,11 @@ class ApiMove extends ApiBase {
                        }
                }
 
+               // Rate limit
+               if ( $user->pingLimiter( 'move' ) ) {
+                       $this->dieUsageMsg( 'actionthrottledtext' );
+               }
+
                // Move the page
                $toTitleExists = $toTitle->exists();
                $status = $this->movePage( $fromTitle, $toTitle, $params['reason'], !$params['noredirect'] );
index a08740a..0774651 100644 (file)
@@ -485,7 +485,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                $data = [];
                $result = $this->getResult();
-               $allGroups = User::getAllGroups();
+               $allGroups = array_values( User::getAllGroups() );
                foreach ( $config->get( 'GroupPermissions' ) as $group => $permissions ) {
                        $arr = [
                                'name' => $group,
@@ -512,7 +512,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                        foreach ( $groupArr as $type => $rights ) {
                                if ( isset( $rights[$group] ) ) {
-                                       $groups = array_intersect( $rights[$group], $allGroups );
+                                       if ( $rights[$group] === true ) {
+                                               $groups = $allGroups;
+                                       } else {
+                                               $groups = array_intersect( $rights[$group], $allGroups );
+                                       }
                                        if ( $groups ) {
                                                $arr[$type] = $groups;
                                                ApiResult::setArrayType( $arr[$type], 'BCarray' );
index ea52e14..f335682 100644 (file)
@@ -24,6 +24,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * API interface for setting the wl_notificationtimestamp field
@@ -98,13 +99,14 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        }
                }
 
+               $watchedItemStore = MediaWikiServices::getInstance()->getWatchedItemStore();
                $apiResult = $this->getResult();
                $result = [];
                if ( $params['entirewatchlist'] ) {
                        // Entire watchlist mode: Just update the thing and return a success indicator
-                       $dbw->update( 'watchlist', [ 'wl_notificationtimestamp' => $timestamp ],
-                               [ 'wl_user' => $user->getId() ],
-                               __METHOD__
+                       $watchedItemStore->setNotificationTimestampsForUser(
+                               $user,
+                               $timestamp
                        );
 
                        $result['notificationtimestamp'] = is_null( $timestamp )
@@ -133,23 +135,17 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
                        if ( $pageSet->getTitles() ) {
                                // Now process the valid titles
-                               $lb = new LinkBatch( $pageSet->getTitles() );
-                               $dbw->update( 'watchlist', [ 'wl_notificationtimestamp' => $timestamp ],
-                                       [ 'wl_user' => $user->getId(), $lb->constructSet( 'wl', $dbw ) ],
-                                       __METHOD__
+                               $watchedItemStore->setNotificationTimestampsForUser(
+                                       $user,
+                                       $timestamp,
+                                       $pageSet->getTitles()
                                );
 
                                // Query the results of our update
-                               $timestamps = [];
-                               $res = $dbw->select(
-                                       'watchlist',
-                                       [ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ],
-                                       [ 'wl_user' => $user->getId(), $lb->constructSet( 'wl', $dbw ) ],
-                                       __METHOD__
+                               $timestamps = $watchedItemStore->getNotificationTimestampsBatch(
+                                       $user,
+                                       $pageSet->getTitles()
                                );
-                               foreach ( $res as $row ) {
-                                       $timestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
-                               }
 
                                // Now, put the valid titles into the result
                                /** @var $title Title */
index 3539eed..93003cc 100644 (file)
@@ -294,9 +294,17 @@ class ApiStashEdit extends ApiBase {
                        $logger->debug( "Timestamp-based cache hit for key '$key' (age: $age sec)." );
                        return $editInfo; // assume nothing changed
                } elseif ( isset( $editInfo->edits ) && $editInfo->edits === $user->getEditCount() ) {
+                       // Logged-in user made no local upload/template edits in the meantime
                        $stats->increment( 'editstash.cache_hits.presumed_fresh' );
                        $logger->debug( "Edit count based cache hit for key '$key' (age: $age sec)." );
-                       return $editInfo; // use made no local upload/template edits in the meantime
+                       return $editInfo;
+               } elseif ( $user->isAnon()
+                       && self::lastEditTime( $user ) < $editInfo->output->getCacheTime()
+               ) {
+                       // Logged-out user made no local upload/template edits in the meantime
+                       $stats->increment( 'editstash.cache_hits.presumed_fresh' );
+                       $logger->debug( "Edit check based cache hit for key '$key' (age: $age sec)." );
+                       return $editInfo;
                }
 
                $dbr = wfGetDB( DB_SLAVE );
@@ -359,6 +367,21 @@ class ApiStashEdit extends ApiBase {
                return $editInfo;
        }
 
+       /**
+        * @param User $user
+        * @return string|null TS_MW timestamp or null
+        */
+       private static function lastEditTime( User $user ) {
+               $time = wfGetDB( DB_SLAVE )->selectField(
+                       'recentchanges',
+                       'MAX(rc_timestamp)',
+                       [ 'rc_user_text' => $user->getName() ],
+                       __METHOD__
+               );
+
+               return wfTimestampOrNull( TS_MW, $time );
+       }
+
        /**
         * Get the temporary prepared edit stash key for a user
         *
@@ -371,7 +394,7 @@ class ApiStashEdit extends ApiBase {
         * @param User $user User to get parser options from
         * @return string
         */
-       protected static function getStashKey( Title $title, Content $content, User $user ) {
+       private static function getStashKey( Title $title, Content $content, User $user ) {
                $hash = sha1( implode( ':', [
                        $content->getModel(),
                        $content->getDefaultFormat(),
@@ -394,7 +417,7 @@ class ApiStashEdit extends ApiBase {
         * @param User $user
         * @return array (stash info array, TTL in seconds) or (null, 0)
         */
-       protected static function buildStashValue(
+       private static function buildStashValue(
                Content $pstContent, ParserOutput $parserOutput, $timestamp, User $user
        ) {
                // If an item is renewed, mind the cache TTL determined by config and parser functions.
index 5402ab4..938a61a 100644 (file)
        "apihelp-import-param-namespace": "In diesen Namensraum importieren. Kann nicht zusammen mit <var>$1rootpage</var> verwendet werden.",
        "apihelp-import-param-rootpage": "Als Unterseite dieser Seite importieren. Kann nicht zusammen mit <var>$1namespace</var> verwendet werden.",
        "apihelp-import-example-import": "Importiere [[meta:Help:ParserFunctions]] mit der kompletten Versionsgeschichte in den Namensraum 100.",
-       "apihelp-login-description": "Anmelden und Authentifizierungs-Cookies beziehen.\n\nFalls das Anmelden erfolgreich war, werden die benötigten Cookies im Header der HTTP-Antwort des Servers übermittelt. Bei fehlgeschlagenen Anmeldeversuchen können weitere Versuche gedrosselt werden, um automatische Passwortermittlungsattacken zu verhinden.",
+       "apihelp-login-description": "Anmelden und Authentifizierungs-Cookies beziehen.\n\nDiese Aktion sollte nur in Kombination mit [[Special:BotPasswords]] verwendet werden. Die Verwendung für die Anmeldung beim Hauptkonto ist veraltet und kann ohne Warnung fehlschlagen. Um sich sicher beim Hauptkonto anzumelden, verwende <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "Benutzername.",
        "apihelp-login-param-password": "Passwort.",
        "apihelp-login-param-domain": "Domain (optional).",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Fügt die Seiten- und Versionskennung hinzu.",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel der Bearbeitung.",
        "apihelp-query+usercontribs-paramvalue-prop-comment": "Fügt den Kommentar der Bearbeitung hinzu.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Markiert kontrollierte Bearbeitungen.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "Listet die Markierungen für die Bearbeitung auf.",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Markiert, ob der aktuelle Benutzer gesperrt ist, von wem und aus welchem Grund.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Ergänzt den Bearbeitungszähler des aktuellen Benutzers.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Fügt den bürgerlichen Namen des Benutzers hinzu.",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "Listet alle Gruppen auf, bei denen der Benutzer automatisch Mitglied ist.",
        "apihelp-query+users-paramvalue-prop-rights": "Listet alle Rechte auf, die jeder Benutzer hat.",
        "apihelp-query+users-paramvalue-prop-editcount": "Ergänzt den Bearbeitungszähler des Benutzers.",
+       "apihelp-query+users-param-users": "Eine Liste der Benutzer, für die Informationen abgerufen werden sollen.",
        "apihelp-query+users-example-simple": "Gibt Informationen für den Benutzer <kbd>Example</kbd> zurück.",
+       "apihelp-query+watchlist-param-user": "Listet nur Änderungen von diesem Benutzer auf.",
+       "apihelp-query+watchlist-param-excludeuser": "Listet keine Änderungen von diesem Benutzer auf.",
        "apihelp-query+watchlist-param-prop": "Zusätzlich zurückzugebende Eigenschaften:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "Ergänzt die Versions- und Seitenkennungen.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Ergänzt den Titel der Seite.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "Ergänzt die Markierungen für die Bearbeitungen.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Ergänzt den Benutzer, der die Bearbeitung ausgeführt hat.",
        "apihelp-query+watchlist-paramvalue-prop-userid": "Ergänzt die Kennung des Benutzers, der die Bearbeitung ausgeführt hat.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Ergänzt den Kommentar der Bearbeitung.",
index a802cc7..4e9309e 100644 (file)
@@ -48,7 +48,7 @@
 
        "apihelp-clientlogin-description": "Log in to the wiki using the interactive flow.",
        "apihelp-clientlogin-example-login": "Start the process of logging in to the wiki as user <kbd>Example</kbd> with password <kbd>ExamplePassword</kbd>.",
-       "apihelp-clientlogin-example-login2": "Continue logging in after a UI response for two-factor auth, supplying an <var>OATHToken</var> of <kbd>987654</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continue logging in after a <samp>UI</samp> response for two-factor auth, supplying an <var>OATHToken</var> of <kbd>987654</kbd>.",
 
        "apihelp-compare-description": "Get the difference between 2 pages.\n\nA revision number, a page title, or a page ID for both \"from\" and \"to\" must be passed.",
        "apihelp-compare-param-fromtitle": "First title to compare.",
        "api-help-right-apihighlimits": "Use higher limits in API queries (slow queries: $1; fast queries: $2). The limits for slow queries also apply to multivalue parameters.",
        "api-help-open-in-apisandbox": "<small>[open in sandbox]</small>",
 
-       "api-help-authmanager-general-usage": "The general procedure to use this module is:\n# Fetch the fields available from <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> with <kbd>amirequestsfor=$4</kbd>, and a <kbd>$5</kbd> token from <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]].\n# Present the fields to the user, and obtain their submission.\n# Post to this module, supplying <var>$1returnurl</var> and any relevant fields.\n# Check the <samp>status</samp> in the response.\n#* If you received <samp>PASS</samp> or <samp>FAIL</samp>, you're done. The operation either succeeded or it didn't.\n#* If you received <samp>UI</samp>, present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* If you received <samp>REDIRECT</samp>, direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* If you received <samp>RESTART</samp>, that means the authentication worked but we don't have an linked user account. You might treat this as UI or as FAIL.",
+       "api-help-authmanager-general-usage": "The general procedure to use this module is:\n# Fetch the fields available from <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> with <kbd>amirequestsfor=$4</kbd>, and a <kbd>$5</kbd> token from <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Present the fields to the user, and obtain their submission.\n# Post to this module, supplying <var>$1returnurl</var> and any relevant fields.\n# Check the <samp>status</samp> in the response.\n#* If you received <samp>PASS</samp> or <samp>FAIL</samp>, you're done. The operation either succeeded or it didn't.\n#* If you received <samp>UI</samp>, present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* If you received <samp>REDIRECT</samp>, direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* If you received <samp>RESTART</samp>, that means the authentication worked but we don't have a linked user account. You might treat this as <samp>UI</samp> or as <samp>FAIL</samp>.",
        "api-help-authmanagerhelper-requests": "Only use these authentication requests, by the <samp>id</samp> returned from <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> with <kbd>amirequestsfor=$1</kbd> or from a previous response from this module.",
        "api-help-authmanagerhelper-request": "Use this authentication request, by the <samp>id</samp> returned from <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> with <kbd>amirequestsfor=$1</kbd>.",
        "api-help-authmanagerhelper-messageformat": "Format to use for returning messages.",
index 284c23c..5d65c44 100644 (file)
@@ -18,7 +18,9 @@
                        "AlvaroMolina",
                        "Ciencia Al Poder",
                        "Lemondoge",
-                       "Mgpena"
+                       "Mgpena",
+                       "Rubentl134",
+                       "2axterix2"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correos]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API de anuncios]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> Todas las características que se muestran en esta página debería funcionar, pero la API aún está en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se envía un encabezado HTTP con la clave \"MediaWiki-API-Error\" y ambos valores, del encabezado y el código de error, se establecerán en el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].\n\n<strong>Pruebas:</strong> para facilitar las pruebas de solicitudes a la API, consulta [[Special:ApiSandbox]].",
        "apihelp-query+allusers-param-limit": "Cuántos nombres de usuario se devolverán.",
        "apihelp-query+allusers-param-activeusers": "Solo listar usuarios activos en {{PLURAL:$1|el último día|los $1 últimos días}}.",
        "apihelp-query+allusers-example-Y": "Listar usuarios que empiecen por <kbd>Y</kbd>.",
+       "apihelp-query+filerepoinfo-example-login": "Captura de las solicitudes que puede ser utilizadas al comienzo de inicio de sesión.",
        "apihelp-query+backlinks-param-pageid": "Identificador de página que buscar. No puede usarse junto con <var>$1title</var>",
        "apihelp-query+backlinks-param-limit": "Cuántas páginas en total se devolverán. Si está activo <var>$1redirect</var>, el límite aplica a cada nivel por separado (lo que significa que se pueden devolver hasta 2 * <var>$1limit</var> resultados).",
        "apihelp-query+backlinks-example-simple": "Mostrar enlaces a <kbd>Main page</kbd>.",
        "apihelp-query+blocks-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+blocks-paramvalue-prop-userid": "Añade el identificador del usuario bloqueado.",
        "apihelp-query+blocks-paramvalue-prop-timestamp": "Añade la fecha y hora de cuando se aplicó el bloque.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Añade la razón dada para el bloqueo.",
        "apihelp-query+blocks-example-simple": "Listar bloques.",
        "apihelp-query+categories-param-prop": "Qué propiedades adicionales obtener para cada categoría:",
        "apihelp-query+categories-param-show": "Qué tipo de categorías mostrar.",
        "apihelp-unblock-description": "Desbloquear un usuario.",
        "apihelp-unblock-param-user": "Nombre de usuario, dirección IP o rango de direcciones IP para desbloquear. No se puede utilizar junto con <var>$1id</var>.",
        "apihelp-unblock-param-reason": "Motivo del desbloqueo.",
+       "apihelp-unblock-example-id": "Desbloquear el bloqueo de ID #<kbd>105</kbd>",
        "apihelp-unblock-example-user": "Desbloquear al usuario <kbd>Bob</kbd> con el motivo <kbd>Sorry Bob</kbd>",
        "apihelp-undelete-param-reason": "Motivo de la restauración.",
        "apihelp-undelete-example-revisions": "Restaurar dos revisiones de la página <kbd>Main Page</kbd>.",
index 4c0d177..b6d69cd 100644 (file)
@@ -23,7 +23,8 @@
                        "Umherirrender",
                        "Elfix",
                        "Lbayle",
-                       "Verdy p"
+                       "Verdy p",
+                       "Yasten"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].",
@@ -52,6 +53,8 @@
        "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.",
        "apihelp-block-example-ip-simple": "Bloquer l’adresse IP <kbd>192.0.2.5</kbd> pour trois jours avec le motif <kbd>Premier avertissement</kbd>.",
        "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur <kbd>Vandal</kbd> avec le motif <kbd>Vandalism</kbd>, et empêcher la création de nouveau compte et l'envoi de courriel.",
+       "apihelp-changeauthenticationdata-description": "Modifier les données d’authentification pour l’utilisateur actuel.",
+       "apihelp-changeauthenticationdata-example-password": "Tentative de modification du mot de passe de l’utilisateur actuel en <kbd>ExempleMotDePasse</kbd>.",
        "apihelp-checktoken-description": "Vérifier la validité d'un jeton de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Type de jeton testé",
        "apihelp-checktoken-param-token": "Jeton à tester.",
@@ -59,6 +62,9 @@
        "apihelp-checktoken-example-simple": "Tester la validité d'un jeton de <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Efface le drapeau <code>hasmsg</code> pour l’utilisateur courant.",
        "apihelp-clearhasmsg-example-1": "Effacer le drapeau <code>hasmsg</code> pour l’utilisateur courant",
+       "apihelp-clientlogin-description": "Se connecter au wiki en utilisant le flux interactif.",
+       "apihelp-clientlogin-example-login": "Commencer le processus de connexion au wiki en tant qu’utilisateur <kbd>Exemple</kbd> avec le mot de passe <kbd>ExempleMotDePasse</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continuer la connexion après une réponse de l’IHM pour l’authentification à deux facteurs, en fournissant un <var>OATHToken</var> valant <kbd>987654</kbd>.",
        "apihelp-compare-description": "Obtenir la différence entre 2 pages.\n\nVous devez passer un numéro de révision, un titre de page, ou un ID de page, à la fois pour « from » et « to ».",
        "apihelp-compare-param-fromtitle": "Premier titre à comparer.",
        "apihelp-compare-param-fromid": "ID de la première page à comparer.",
@@ -68,6 +74,7 @@
        "apihelp-compare-param-torev": "Seconde révision à comparer.",
        "apihelp-compare-example-1": "Créer une différence entre les révisions 1 et 2",
        "apihelp-createaccount-description": "Créer un nouveau compte utilisateur.",
+       "apihelp-createaccount-example-create": "Commencer le processus de création d’un utilisateur <kbd>Exemple</kbd> avec le mot de passe <kbd>ExempleMotDePasse</kbd>.",
        "apihelp-createaccount-param-name": "Nom d’utilisateur.",
        "apihelp-createaccount-param-password": "Mot de passe (ignoré si <var>$1mailpassword</var> est défini).",
        "apihelp-createaccount-param-domain": "Domaine pour l’authentification externe (facultatif).",
        "apihelp-import-param-namespace": "Importer vers cet espace de noms. Impossible à utiliser avec <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importer comme une sous-page de cette page. Impossible à utiliser avec <var>$1namespace</var>.",
        "apihelp-import-example-import": "Importer [[meta:Help:ParserFunctions]] vers l’espace de noms 100 avec tout l’historique.",
-       "apihelp-login-description": "Se connecter et obtenir les cookies d’authentification.\n\nDans le cas d’une connexion réussie, les cookies nécessaires seront inclus dans les entêtes de la réponse HTTP. Dans le cas d’une connexion en échec, les essais ultérieurs pourront être réduits afin de limiter les attaques automatisées de découverte du mot de passe.",
+       "apihelp-linkaccount-description": "Lier un compte d’un fournisseur tiers à l’utilisateur actuel.",
+       "apihelp-linkaccount-example-link": "Commencer le processus de liaison d’un compte depuis <kbd>Exemple</kbd>.",
+       "apihelp-login-description": "Se connecter et obtenir les cookies d’authentification.\n\nCette action ne devrait être utilisée qu’en lien avec [[Special:BotPasswords]] ; l’utiliser pour la connexion du compte principal est obsolète et peut échouer sans avertissement. Pour se connecter sans problème au compte principal, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "Se connecter et obtenir les cookies d’authentification.\n\nCette action est obsolète et peut échouer sans prévenir. Pour se connecter sans problème, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nonauthmanager": "Se connecter et obtenir les cookies d’authentification.\n\nDans le cas d’une connexion réussie, les cookies nécessaires seront inclus dans les entêtes HTTP de la réponse. Dans le cas d’une connexion en échec, des tentatives ultérieures pourront être limitées pour éviter les attaques automatiques pour deviner les mots de passe.",
        "apihelp-login-param-name": "Nom d’utilisateur.",
        "apihelp-login-param-password": "Mot de passe.",
        "apihelp-login-param-domain": "Domaine (facultatif).",
        "apihelp-query+allusers-param-activeusers": "Lister uniquement les utilisateurs actifs durant {{PLURAL:$1|le dernier jour|les $1 derniers jours}}.",
        "apihelp-query+allusers-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer aussi si l’utilisateur est attaché avec le wiki identifié par cet ID.",
        "apihelp-query+allusers-example-Y": "Lister les utilisateurs en commençant à <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "Récupérer les informations concernant l’état d’authentification actuel.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Tester si l’état d’authentification actuel de l’utilisateur est suffisant pour l’opération spécifiée comme sensible du point de vue sécurité.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Récupérer les informations sur les requêtes d’authentification nécessaires pour l’action d’authentification spécifiée.",
+       "apihelp-query+filerepoinfo-example-login": "Récupérer les requêtes qui peuvent être utilisées en commençant une connexion.",
+       "apihelp-query+filerepoinfo-example-login-merged": "Récupérer les requêtes qui peuvent être utilisées au début de la connexion, avec les champs de formulaire intégrés.",
+       "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "Tester si l’authentification est suffisante pour l’action <kbd>foo</kbd>.",
        "apihelp-query+backlinks-description": "Trouver toutes les pages qui ont un lien vers la page donnée.",
        "apihelp-query+backlinks-param-title": "Titre à rechercher. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "ID de la page à chercher. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste des IDs de variable.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste des protocoles qui sont autorisés dans les liens externes.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Renvoie les valeurs par défaut pour les préférences utilisateur.",
+       "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Renvoie la configuration du dialogue de téléversement.",
        "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.",
        "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.",
        "apihelp-query+users-paramvalue-prop-emailable": "Marque si l’utilisateur peut et veut recevoir des courriels via [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Marque le sexe de l’utilisateur. Renvoie « male », « female », ou « unknown ».",
        "apihelp-query+users-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.",
+       "apihelp-query+users-paramvalue-prop-cancreate": "Indique si un compte peut être créé pour les noms d’utilisateurs valides mais non enregistrés.",
        "apihelp-query+users-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer si l’utilisateur est attaché au wiki identifié par cet ID.",
        "apihelp-query+users-param-users": "Une liste des utilisateurs sur lesquels obtenir de l’information.",
        "apihelp-query+users-param-token": "Utiliser plutôt <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+watchlistraw-param-totitle": "Terminer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :",
        "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel",
        "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel",
+       "apihelp-removeauthenticationdata-description": "Supprimer les données d’authentification pour l’utilisateur actuel.",
+       "apihelp-removeauthenticationdata-example-simple": "Tentative de suppression des données de l’utilisateur pour <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "Envoyer un courriel de réinitialisation du mot de passe à un utilisateur.",
+       "apihelp-resetpassword-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> pour utiliser ce module.",
+       "apihelp-resetpassword-param-user": "Utilisateur ayant été réinitialisé.",
+       "apihelp-resetpassword-param-email": "Adresse courriel de l’utilisateur ayant été réinitialisé.",
+       "apihelp-resetpassword-param-capture": "Renvoyer les mots de passe temporaires déjà envoyés. Nécessite le droit utilisateur <code>passwordreset</code>.",
+       "apihelp-resetpassword-example-user": "Envoyer un courriel de réinitialisation du mot de passe à l’utilisateur <kbd>Exemple</kbd>.",
+       "apihelp-resetpassword-example-email": "Envoyer un courriel pour la réinitialisation de mot de passe à tous les utilisateurs avec une adresse email <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Supprimer et annuler la suppression des révisions.",
        "apihelp-revisiondelete-param-type": "Type de suppression de révision en cours de traitement.",
        "apihelp-revisiondelete-param-target": "Titre de page pour la suppression de révision, s’il est nécessaire pour le type.",
        "apihelp-undelete-param-watchlist": "Ajouter ou supprimer la page de la liste de suivi de l’utilisateur actuel sans condition, utiliser les préférences ou ne pas modifier le suivi.",
        "apihelp-undelete-example-page": "Annuler la suppression de la page <kbd>Main Page</kbd>.",
        "apihelp-undelete-example-revisions": "Annuler la suppression de deux révisions de la page <kbd>Main Page</kbd>.",
+       "apihelp-unlinkaccount-description": "Supprimer un compte tiers lié de l’utilisateur actuel.",
+       "apihelp-unlinkaccount-example-simple": "Essayer de supprimer le lien de l’utilisateur actuel pour le fournisseur associé avec <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-upload-description": "Téléverser un fichier, ou obtenir l’état des téléversements en cours.\n\nPlusieurs méthodes sont disponibles :\n* Téléverser directement le contenu du fichier, en utilisant le paramètre <var>$1file</var>.\n* Téléverser le fichier par morceaux, en utilisant les paramètres <var>$1filesize</var>, <var>$1chunk</var>, and <var>$1offset</var>.\n* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utilisez le paramètre <var>$1url</var>.\n* Terminer un téléversement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre <var>$1filekey</var>.\nNoter que le POST HTTP doit être fait comme un téléversement de fichier (par ex. en utilisant <code>multipart/form-data</code>) en envoyant le <code>multipart/form-data</code>.",
        "apihelp-upload-param-filename": "Nom de fichier cible.",
        "apihelp-upload-param-comment": "Télécharger le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si <var>$1text</var> n’est pas spécifié.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Accordé à}} : $2",
        "api-help-right-apihighlimits": "Utiliser des valeurs plus hautes dans les requêtes de l’API (requêtes lentes : $1 ; requêtes rapides : $2). Les limites pour les requêtes lentes s’appliquent aussi aux paramètres multivalués.",
        "api-help-open-in-apisandbox": "<small>[ouvrir dans le bac à sable]</small>",
+       "api-help-authmanager-general-usage": "La procédure générale pour utiliser ce module est la suivante :\n# Récupérer les champs disponibles avec <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$4</kbd>, et un jeton <kbd>$5</kbd> avec <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]].\n# Présenter les champs à l’utilisateur, et les lui faire soumettre.\n# Faire un envoi à ce module, en fournissant <var>$1returnurl</var> et les champs appropriés.\n# Vérifier le <samp>status</samp> dans la réponse.\n#* Si vous avez reçu <samp>PASS</samp> ou <samp>FAIL</samp>, c’est terminé. L’opération a soit réussi, soit échoué.\n#* Si vous avez reçu <samp>UI</samp>, affichez les nouveaux champs à l’utilisateur et faites-les-lui soumettre. Puis envoyez-les à ce module avec <var>$1continue</var> et l’ensemble des champs appropriés, et recommencez l’étape 4.\n#* Si vous avez reçu <samp>REDIRECT</samp>, envoyez l’utilisateur vers la cible <samp>redirecttarget</samp> et attendez le retour vers <var>$1returnurl</var>. Puis envoyez à ce module avec <var>$1continue</var> et tous les champs passés à l’URL de retour, puis répétez l’étape 4.\n#* Si vous avez reçu <samp>RESTART</samp>, cela veut dire que l’authentification a fonctionné, mais nous n’avons pas de compte utilisateur lié. Vous pouvez traiter cela comme un <samp>UI</samp> ou un <samp>FAIL</samp>.",
+       "api-help-authmanagerhelper-requests": "Utiliser uniquement ces requêtes d’authentification, avec l’<samp>id</samp> renvoyé par <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$1</kbd> ou depuis une réponse précédente de ce module.",
+       "api-help-authmanagerhelper-request": "Utiliser cette requête d’authentification, avec l’<samp>id</samp> renvoyé par <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$1</kbd>.",
+       "api-help-authmanagerhelper-messageformat": "Format à utiliser pour retourner les messages.",
+       "api-help-authmanagerhelper-mergerequestfields": "Fusionner dans un tableau le champ information de toutes les demandes d'authentification.",
+       "api-help-authmanagerhelper-preservestate": "Conserver l'état d'une précédente tentative de connexion qui a échoué, si possible.",
+       "api-help-authmanagerhelper-returnurl": "Renvoyer l’URL pour les flux d’authentification tiers, qui doit être absolue. Cela ou <var>$1continue</var> est obligatoire.\n\nDès réception d’une réponse <samp>REDIRECT</samp>, vous ouvrirez typiquement un navigateur ou un affichage web vers l’URL <samp>redirecttarget</samp> spécifiée pour un flux d’authentification tiers. Une fois ceci terminé, le tiers renverra le navigateur ou l’affichage web vers cette URL. Vous devez extraire toute requête ou paramètre POST de l’URL et les passer comme une requête <var>$1continue</var> à ce module de l’API.",
+       "api-help-authmanagerhelper-continue": "Cette requête est une continuation après une précédente réponse <samp>UI</samp> ou <samp>REDIRECT</samp>. Cela ou <var>$1returnurl</var> est obligatoire.",
+       "api-help-authmanagerhelper-additional-params": "Ce module accepte des paramètres supplémentaires selon les requêtes d’authentification disponibles. Utiliser <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$1</kbd> (ou une réponse précédente de ce module, le cas échéant) pour déterminer les requêtes disponibles et les champs qu’elles utilisent.",
        "api-credits-header": "Remerciements",
        "api-credits": "Développeurs de l’API :\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://phabricator.wikimedia.org/."
 }
index 7a842f4..080e0dd 100644 (file)
@@ -40,6 +40,8 @@
        "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
        "apihelp-block-example-ip-simple": "חסימת כתובת ה־IP‏ <kbd>192.0.2.5</kbd> לשלושה ימים עם הסיבה <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "חסימת המשתמש <kbd>Vandal</kbd> ללא הגבלת זמן עם הסיבה <kbd>Vandalism</kbd>, ומניעת יצירת חשבונות חדשים ושליחת דוא\"ל.",
+       "apihelp-changeauthenticationdata-description": "שינוי נתוני אימות עבור המשתמש הנוכחי.",
+       "apihelp-changeauthenticationdata-example-password": "ניסיון לשנות את הססמה של המשתמש הנוכחי ל־<kbd>ExamplePassword</kbd>.",
        "apihelp-checktoken-description": "בדיקת התקינות של האסימון מ־<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "סוג האסימון שבבדיקה.",
        "apihelp-checktoken-param-token": "איזה אסימון לבדוק.",
@@ -47,6 +49,9 @@
        "apihelp-checktoken-example-simple": "בדיקת התקינות של אסימון <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "מנקה את דגל <code>hasmsg</code> עבור המשתמש הנוכחי.",
        "apihelp-clearhasmsg-example-1": "לנקות את דגל <code>hasmsg</code> עבור המשתמש הנוכחי.",
+       "apihelp-clientlogin-description": "כניסה לוויקי באמצעות זרימה הידודית.",
+       "apihelp-clientlogin-example-login": "תחילת תהליך כניסה לוויקי בתור משתמש <kbd>Example</kbd> עם הססמה <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "המשך כניסה אחרי תשובת <samp>UI</samp> לאימות דו־גורמי, עם <var>OATHToken</var> של <kbd>987654</kbd>.",
        "apihelp-compare-description": "קבלת ההבדל בין 2 דפים.\n\nיש להעביר מספר גרסה, כותרת דף או מזהה דף גם ל־\"from\" וגם ל־\"to\".",
        "apihelp-compare-param-fromtitle": "כותרת ראשונה להשוואה.",
        "apihelp-compare-param-fromid": "מס׳ זיהוי של העמוד הראשון להשוואה.",
@@ -56,6 +61,7 @@
        "apihelp-compare-param-torev": "גרסה שנייה להשוואה.",
        "apihelp-compare-example-1": "יצירת תיעוד שינוי בין גרסה 1 ל־2.",
        "apihelp-createaccount-description": "יצירת חשבון משתמש חדש.",
+       "apihelp-createaccount-example-create": "תחילת תהליך יצירת המשתמש <kbd>Example</kbd> עם הססמה <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "שם משתמש.",
        "apihelp-createaccount-param-password": "ססמה (לא ישפיע אם הוגדר <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "שם מתחם לאימות חיצוני (רשות).",
        "apihelp-import-param-namespace": "לייבא למרחב השם הזה. לא ניתן להשתמש בזה יחד עם <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "לייבא בתור תת־משנה של הדף הזה. לא ניתן להשתמש בזה יחד עם <var>$1namespace</var>.",
        "apihelp-import-example-import": "לייבא את [[meta:Help:ParserFunctions]] למרחב השם 100 עם היסטוריה מלאה.",
-       "apihelp-login-description": "להיכנס ולקבל עוגיות אימות.\n\nבמקרה של כניסה מוצלחת, העוגיות הדרושות תיכללנה בכותרות תשובות של HTTP. במקרה של כניסה לא מוצלחת, הניסיונות הבאים עשויים להיות חנוקים כדי להגביל תקיפות ניחוש ססמה אוטומטי.",
+       "apihelp-linkaccount-description": "קישור חשבון של ספק צד־שלישי למשתמש הנוכחי.",
+       "apihelp-linkaccount-example-link": "תחילת תהליך הקישור לחשבון מ־<kbd>Example</kbd>.",
+       "apihelp-login-description": "להיכנס ולקבל עוגיות אימות.\n\nהפעולה הזאת צריכה לשמש רק בשילוב [[Special:BotPasswords]]; שימוש לכניסה לחשבון ראשי מיושן ועשוי להיכשל ללא אזהרה. כדי להיכנס בבטחה לחשבון הראשי, יש להשתמש ב־<kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "להיכנס ולקבל עוגיות אימות.\n\nהפעולה הזאת מיושנת ועשויה להיכשל ללא אזהרה. כדי להיכנס בבטחה, יש להשתמש ב־<kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nonauthmanager": "להיכנס ולקבל עוגיות אימות.\n\nבמקרה של כניסה מוצלחת, העוגיות המקוננות תיכללנה בכותרות תשובות ה־HTTP. במקרה של כניסה כושלת, הניסיונות הבאים יוגבלו למספר ניסויי ניחוש הססמה האוטומטיים.",
        "apihelp-login-param-name": "שם משתמש.",
        "apihelp-login-param-password": "ססמה.",
        "apihelp-login-param-domain": "שם מתחם (רשות).",
        "apihelp-query+allusers-param-activeusers": "לרשום רק משתמשים שהיו פעילים {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.",
        "apihelp-query+allusers-param-attachedwiki": "עם <kbd>$1prop=centralids</kbd>, לציין גם האם המשתמש משויך לוויקי עם המזהה הזה.",
        "apihelp-query+allusers-example-Y": "לרשום משתמשים שמתחילים ב־<kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "אחזור מידע אודות מצב האימות הנוכחי.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "בדיקה האם מצב האימות הנוכחי של המשתמש מספיק בשביל הפעולה הרגישה מבחינת אבטחה שצוינה.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "אחזור מידע על בקשות האימות הדרושות לפעולת האימות המבוקשת.",
+       "apihelp-query+filerepoinfo-example-login": "אחזור הבקשות שיכולות לשמש לתחילת הכניסה.",
+       "apihelp-query+filerepoinfo-example-login-merged": "אחזור הבקשות שיכולות לשמש לתחילת הכניסה, עם שדות טופס ממוזגים.",
+       "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "בדיקה האם האימות מספיק בשביל הפעולה <kbd>foo</kbd>.",
        "apihelp-query+backlinks-description": "מציאת כל הדפים שמקשרים לדף הנתון.",
        "apihelp-query+backlinks-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "מזהה דף לחיפוש. לא ניתן להשתמש בזה יחד עם <var>$1title</var>.",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "החזרת מזהי משתנים.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "החזרת רשימת הפרוטוקולים המותרים בקישורים חיצוניים.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "החזרת הערכים ההתחלתיים של העדפות משתמש.",
+       "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "החזרת הגדרות תיבת ההעלאה.",
        "apihelp-query+siteinfo-param-filteriw": "החזרה רק של עיולים מקומיים או רק של עיולים לא מקומיים ממפת הבינוויקי.",
        "apihelp-query+siteinfo-param-showalldb": "רשימת כל שרתי מסד הנתונים, לא רק אלה שהכי מתעכבים.",
        "apihelp-query+siteinfo-param-numberingroup": "רשימת מספרי משתמשים בקבוצות משתמשים.",
        "apihelp-query+users-paramvalue-prop-emailable": "מתייג אם המשתמש יכול ורוצה לקבל דואר אלקטרוני דרך [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "מתייג את המגדר של המשתמש. מחזיר \"male\"‏, \"female\" או \"unknown\".",
        "apihelp-query+users-paramvalue-prop-centralids": "הוספת המזהה המרכזי ומצב השיוך למשתמש.",
+       "apihelp-query+users-paramvalue-prop-cancreate": "ציון האם אפשר ליצור חשבון עבור שמות משתמש תקינים, אבל לא רשומים.",
        "apihelp-query+users-param-attachedwiki": "עם <kbd>$1prop=centralids</kbd>, לציין האם המשתמש משויך לוויקי עם המזהה הזה.",
        "apihelp-query+users-param-users": "רשימת משתמשים שעליהם צריך לקבל מידע.",
        "apihelp-query+users-param-token": "יש להשתמש ב־<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> במקום.",
        "apihelp-query+watchlistraw-param-totitle": "באיזו כותרת (עם תחילית מרחב שם) להפסיק למנות.",
        "apihelp-query+watchlistraw-example-simple": "לרשום דפים ברשימת המעקב של המשתמש הנוכחי.",
        "apihelp-query+watchlistraw-example-generator": "אחזור מידע על הדפים עבור דפים ברשימת המעקב של המשתמש הנוכחי.",
+       "apihelp-removeauthenticationdata-description": "הסרת נתוני אימות עבור המשתמש הנוכחי.",
+       "apihelp-removeauthenticationdata-example-simple": "לנסות להסיר את נתוני המשתמש הנוכחי בשביל <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "שליחת דוא\"ל איפוס סיסמה למשתמש.",
+       "apihelp-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
+       "apihelp-resetpassword-param-user": "המשתמש שמאופס.",
+       "apihelp-resetpassword-param-email": "כתובת הדוא\"ל של המשתמש שהסיסמה שלו מאופסת.",
+       "apihelp-resetpassword-param-capture": "החזרת הססמאות הזמניות שנשלחו. דורש את ההרשאה <code>passwordreset</code>.",
+       "apihelp-resetpassword-example-user": "שליחת מכתב איפוס ססמה למשתמש <kbd>Example</kbd>.",
+       "apihelp-resetpassword-example-email": "שליחת מכתב איפוס ססמה לכל המשתמשים שהכתובת שלהם היא <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "מחיקה ושחזור ממחיקה של גרסאות.",
        "apihelp-revisiondelete-param-type": "סוג מחיקת הגרסה שמתבצע.",
        "apihelp-revisiondelete-param-target": "שם הדף למחיקת גרסה, אם זה נחוץ לסוג.",
        "apihelp-undelete-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-undelete-example-page": "שחזור ממחיקה של הדף <kbd>Main Page</kbd>.",
        "apihelp-undelete-example-revisions": "שחזור שתי גרסאות של הדף <kbd>Main Page</kbd>.",
+       "apihelp-unlinkaccount-description": "ביטול קישור של חשבון צד־שלישי מהמשתמש הנוכחי.",
+       "apihelp-unlinkaccount-example-simple": "לנסות להסיר את הקישור של המשתמש הנוכחי לספק המשויך עם <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-upload-description": "העלאת קובץ, או קבלת מצב ההעלאות הממתינות.\n\nיש מספר שיטות:\n* להעלות את הקובץ ישירות, באמצעות הפרמטר <var>$1file</var>.\n* להעלות את הקובץ בחלקים, באמצעות הפרמטרים <var>$1filesize</var>‏, <var>$1chunk</var> ו־<var>$1offset</var>.\n* לגרום לשרת מדיה־ויקי לאחזר את הקובץ מ־URL באמצעות הפרמטר <var>$1url</var>.\n* להשלים העלאה קודמת שנכשלה בשל אזהרות באמצעות הפרמטר <var>$1filekey</var>.\nלתשומך לבך, יש לעשות את HTTP POST בתור העלאת קובץ (כלומר באמצעות <code>multipart/form-data</code>) בעת שליחת ה־<var>$1file</var>.",
        "apihelp-upload-param-filename": "שם קובץ היעד.",
        "apihelp-upload-param-comment": "הערת העלאה. משמש גם בתור טקסט הדף ההתחלתי עבור קבצים חדשים אם <var>$1text</var> אינו מצוין.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|הוענק ל|הוענקו ל}}: $2",
        "api-help-right-apihighlimits": "להשתמש במגבלות גבוהות יותר בשאילתות API (שאילתות אטיות: $1; שאילתות מהירות: $2). המגבלות לשאילתות אטיות חלות גם על פרמטרים מרובי־ערכים.",
        "api-help-open-in-apisandbox": "<small>[פתיחה בארגז חול]</small>",
+       "api-help-authmanager-general-usage": "הנוהל הכללי לשימוש במודול הזה הוא:\n# אחזור השדות הזמינים מ־<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>  עם <kbd>amirequestsfor=$4</kbd> ואסימון <kbd>$5</kbd> מתוך <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# הצגת השדות למשתמש וקבלת אישור ממנו.\n# שליחה (Post) למודול הזה עם <var>$1returnurl</var> וכל השדות הרלוונטיים.\n# בדיקת ה־<samp>status</samp> בתשובה.\n#* אם קיבלת <samp>PASS</samp> או <samp>FAIL</samp>, זה הסיום. הפעולה שלך הצליחה או נכשלה.\n#* אם קיבלת <samp>UI</samp>, יש להציג את השדות החדשים למשתמש ולקבל את מה שהוא ישלח. אחר־כך יש לשלוח (post) למודול הזה עם <var>$1continue</var> ועם הגדרות של השדות הרלוונטיים ולחזור על צעד 4.\n#* אם קיבלת <samp>REDIRECT</samp>, יש להפנות את המשתמש ל־<samp>redirecttarget</samp> ולחכות לחזרה אל <var>$1returnurl</var>. אחר־כך לשלוח (post) למודול הזה עם <var>$1continue</var> ועם כל השדות שהועברו ל־URL שחוזרים אליו ולחזור על צעד 4.\n#* אם קיבלת <samp>RESTART</samp>, זה אומר שהאימות עבד אבל אין חשבון משתמש מקושר. באפשרותך לטפל בזה כמו ב־<samp>UI</samp> או ב־<samp>FAIL</samp>.",
+       "api-help-authmanagerhelper-requests": "להשתמש רק בבקשות האימות האלו, מאת <samp>id</samp> שהוחזר מ־<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> עם <kbd>amirequestsfor=$1</kbd> או מתשובה קודמת למודול הזה.",
+       "api-help-authmanagerhelper-request": "להשתמש בבקשת האימות הזאת, מאת <samp>id</samp> שהוחזר מ־<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> עם <kbd>amirequestsfor=$1</kbd>.",
+       "api-help-authmanagerhelper-messageformat": "תסדיר לשימוש בהחזרת הודעות.",
+       "api-help-authmanagerhelper-mergerequestfields": "מיזוג מידע של שדות עבור כל בקשות האימות למערך אחד.",
+       "api-help-authmanagerhelper-preservestate": "שימור מצב מניסיון כניסה קודם, אם אפשר.",
+       "api-help-authmanagerhelper-returnurl": "כתובת URL לחזרה עם זרימות אימות צד־שלישי, חייב להיות מוחלט. נדרש או זה או <var>$1continue</var>.\n\nעם קבלת תשובת <samp>REDIRECT</samp>, בדרך־כלל תפתח דפדפן או תצוגת וב בכתובת ה־<samp>redirecttarget</samp> שצוינה בשביל זרימת אימות צד־שלישי. כשזה יושלם, הצד השלישי ישלח את הדפדפן או את תצוגת הווב לכתובת הזאת. יש לחלץ את כל הפרמטרים של שאילתה או בקשת POST מה־URL ולהעביר אותם בתור בקשת <var>$1continue</var> למודול ה־API הזה.",
+       "api-help-authmanagerhelper-continue": "הבקשה הזאת היא המשך אחרי תשובת <samp>UI</samp> או <samp>REDIRECT</samp> קודמת. נדרש זה או <var>$1returnurl</var>.",
+       "api-help-authmanagerhelper-additional-params": "המודול הזה מקבל פרמטרים נוספים בהתאם לבקשות אימות זמינות. יש להשתמש ב־<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> עם <kbd>amirequestsfor=$1</kbd> (או תגובה קודמת מהמודול הזה, אם זה זמין) כדי להבין מה הבקשות הזמינות ובאילו שדות הן משתמשות.",
        "api-credits-header": "קרדיטים",
        "api-credits": "מפתחי ה־API:\n* רואן קטאו (מפתח מוביל 2007–2009)\n* ויקטור וסילייב\n* בריאן טונג מין\n* סאם ריד\n* יורי אסטרחן (יוצר, מפתח מוביל מספטמבר 2006 עד ספטמבר 2007)\n* בראד יורש (מפתח מוביל מאז 2013)\n\nאנא שלחו הערות, הצעות ושאלות לכתובת mediawiki-api@lists.wikimedia.org או כתבו דיווח באג באתר https://phabricator.wikimedia.org."
 }
index a33dedf..ccfc005 100644 (file)
@@ -49,9 +49,9 @@
        "apihelp-compare-param-fromtitle": "비교할 첫 이름.",
        "apihelp-compare-param-fromid": "비교할 첫 문서 ID.",
        "apihelp-compare-param-fromrev": "비교할 첫 판.",
-       "apihelp-compare-param-totitle": "비교할 두번째 제목.",
-       "apihelp-compare-param-toid": "비교할 두번째 문서 ID.",
-       "apihelp-compare-param-torev": "비교할 두번째 판.",
+       "apihelp-compare-param-totitle": "비교할 두 번째 제목.",
+       "apihelp-compare-param-toid": "비교할 두 번째 문서 ID.",
+       "apihelp-compare-param-torev": "비교할 두 번째 판.",
        "apihelp-compare-example-1": "판 1과 2의 차이를 생성합니다.",
        "apihelp-createaccount-description": "새 사용자 계정을 만듭니다.",
        "apihelp-createaccount-param-name": "사용자 이름",
index a9b9099..2acc27b 100644 (file)
        "apihelp-query+watchlist-paramvalue-prop-comment": "Dodaje komentarz do edycji.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Dodaje znacznik czasu edycji.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Dodaje starą i nową długość strony.",
+       "apihelp-resetpassword-description": "Wyślij użytkownikowi e-mail do resetowania hasła.",
+       "apihelp-resetpassword-example-email": "Wyślij e-mail do resetowania hasła do wszystkich użytkowników posiadających adres <kbd>user@example.com</kbd>.",
        "apihelp-stashedit-param-title": "Tytuł edytowanej strony.",
        "apihelp-stashedit-param-sectiontitle": "Tytuł nowej sekcji.",
        "apihelp-stashedit-param-text": "Zawartość strony.",
index d776a06..2f3d4c9 100644 (file)
@@ -2,9 +2,20 @@
        "@metadata": {
                "authors": [
                        "Bharathesha Alasandemajalu",
-                       "Vishwanatha Badikana"
+                       "Vishwanatha Badikana",
+                       "VASANTH S.N."
                ]
        },
+       "apihelp-createaccount-param-name": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
+       "apihelp-delete-description": "ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ",
+       "apihelp-edit-param-minor": "ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
+       "apihelp-edit-example-edit": "ಪುಟೊನ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
+       "apihelp-feedcontributions-param-year": "ಈ ಒರ್ಸೊರ್ದು(ಬೊಕ್ಕ ದುಂಬುದ):",
+       "apihelp-feedcontributions-param-month": "ಈ ತಿಂಗೊಲುರ್ದ್ (ಬೊಕ್ಕ ದುಂಬುದ):",
+       "apihelp-feedrecentchanges-example-simple": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲೆನ್ ತೋಜಾಲೆ.",
+       "apihelp-login-param-name": "ಸದಸ್ಯೆರೆನ ಪುದರ್",
+       "apihelp-login-param-password": "ಪ್ರವೇಶ ಪದೊ",
+       "apihelp-login-example-login": "ಲಾಗಿನ್ ಆಲೆ",
        "apihelp-query+watchlist-param-type": "ವಾ ನಮೂನೆದ ಬದಲಾವಣೆ ತೊಜವೋಡು",
        "apihelp-query+watchlist-paramvalue-type-external": "ಪಿದಯೀದ ಬದಲಾವಣೇ",
        "apihelp-query+watchlist-paramvalue-type-new": "ಪುಟೊ ಉಂಡುಮಾನ್ಪುನಾ"
index 71daba7..65ae10e 100644 (file)
@@ -47,6 +47,8 @@
        "apihelp-block-param-watchuser": "监视用户或该 IP 的用户页和讨论页。",
        "apihelp-block-example-ip-simple": "封禁IP地址<kbd>192.0.2.5</kbd>三天,原因<kbd>First strike</kbd>。",
        "apihelp-block-example-user-complex": "无限期封禁用户<kbd>Vandal</kbd>,原因<kbd>Vandalism</kbd>,并阻止新账户创建和电子邮件发送。",
+       "apihelp-changeauthenticationdata-description": "更改当前用户的身份验证数据。",
+       "apihelp-changeauthenticationdata-example-password": "尝试更改当前用户的密码至<kbd>ExamplePassword</kbd>。",
        "apihelp-checktoken-description": "从<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>检查令牌有效性。",
        "apihelp-checktoken-param-type": "已开始测试的令牌类型。",
        "apihelp-checktoken-param-token": "要测试的令牌。",
@@ -54,6 +56,9 @@
        "apihelp-checktoken-example-simple": "测试<kbd>csrf</kbd>令牌的有效性。",
        "apihelp-clearhasmsg-description": "清除当前用户的<code>hasmsg</code>标记。",
        "apihelp-clearhasmsg-example-1": "清除当前用户的<code>hasmsg</code>标记。",
+       "apihelp-clientlogin-description": "使用交互式流登录wiki。",
+       "apihelp-clientlogin-example-login": "开始作为用户<kbd>Example</kbd>和密码<kbd>ExamplePassword</kbd>登录至wiki的过程。",
+       "apihelp-clientlogin-example-login2": "在<samp>UI</samp>响应双因素验证后继续登录,补充<var>OATHToken</var> <kbd>987654</kbd>。",
        "apihelp-compare-description": "获取2个页面之间的差别。\n\n用于“from”和“to”的修订版本号、页面标题或页面 ID 必须获得通过。",
        "apihelp-compare-param-fromtitle": "要比较的第一个标题。",
        "apihelp-compare-param-fromid": "要比较的第一个页面 ID。",
@@ -63,6 +68,7 @@
        "apihelp-compare-param-torev": "要比较的第二个修订版本。",
        "apihelp-compare-example-1": "在版本1和2中创建差异。",
        "apihelp-createaccount-description": "创建一个新用户账户。",
+       "apihelp-createaccount-example-create": "开始创建用户<kbd>Example</kbd>和密码<kbd>ExamplePassword</kbd>的过程。",
        "apihelp-createaccount-param-name": "用户名。",
        "apihelp-createaccount-param-password": "密码(如果设置<var>$1mailpassword</var>则忽略)。",
        "apihelp-createaccount-param-domain": "外部身份验证域 (可选)。",
        "apihelp-import-param-namespace": "导入至此名字空间。不能与<var>$1rootpage</var>一起使用。",
        "apihelp-import-param-rootpage": "作为此页面的子页面导入。不能与<var>$1namespace</var>一起使用。",
        "apihelp-import-example-import": "将页面[[meta:Help:ParserFunctions]]连带完整历史导入至100名字空间。",
-       "apihelp-login-description": "登录并获得身份验证Cookie。\n\n在成功登录的情况下,所需的Cookie将包含在HTTP响应头中。在登录失败的情况下,进一步的尝试可能会被自动密码猜解攻击的限制所遏制。",
+       "apihelp-linkaccount-description": "将来自第三方提供商的账户链接至当前用户。",
+       "apihelp-linkaccount-example-link": "开始从<kbd>Example</kbd>链接至账户的过程。",
+       "apihelp-login-description": "登录并获取身份验证Cookie。\n\n此操作只应与[[Special:BotPasswords]]一起使用;用于主账户登录的方式已弃用,并可能在没有警告的情况下失败。要安全登录主账户,请使用<kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>。",
+       "apihelp-login-description-nobotpasswords": "登录并获取身份验证Cookie。\n\n此操作已弃用,并可能在没有警告的情况下失败。要安全登录,请使用<kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>。",
+       "apihelp-login-description-nonauthmanager": "登录并获取身份验证Cookie。\n\n在成功登录的情况下,所需的Cookie将包含在HTTP响应头中。在登录失败的情况下,进一步的尝试可能会被自动密码猜解攻击的限制所遏制。",
        "apihelp-login-param-name": "用户名。",
        "apihelp-login-param-password": "密码。",
        "apihelp-login-param-domain": "域名(可选)。",
        "apihelp-move-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-move-param-ignorewarnings": "忽略任何警告。",
        "apihelp-move-example-move": "移动<kbd>Badtitle</kbd>到<kbd>Goodtitle</kbd>,不保留重定向。",
-       "apihelp-opensearch-description": "使用OpenSearch协议搜索wiki。",
+       "apihelp-opensearch-description": "使用OpenSearch协议搜索wiki。",
        "apihelp-opensearch-param-search": "搜索字符串。",
        "apihelp-opensearch-param-limit": "要返回的结果最大数。",
        "apihelp-opensearch-param-namespace": "搜索的名字空间。",
        "apihelp-opensearch-param-warningsaserror": "如果警告通过<kbd>format=json</kbd>提升,返回一个API错误而不是忽略它们。",
        "apihelp-opensearch-example-te": "查找以<kbd>Te</kbd>开头的页面。",
        "apihelp-options-description": "更改当前用户的偏好设置。\n\n只有注册在核心或者已安装扩展中的选项,或者具有<code>userjs-</code>键值前缀(旨在被用户脚本使用)的选项可被设置。",
-       "apihelp-options-param-reset": "重置偏好设置到网站默认设置。",
+       "apihelp-options-param-reset": "将参数设置重置为网站默认值。",
        "apihelp-options-param-resetkinds": "当<var>$1reset</var>选项被设置时,要重置的选项类型列表。",
        "apihelp-options-param-change": "更改列表,以name=value格式化(例如skin=vector)。值不能包含管道字符。如果没提供值(甚至没有等号),例如optionname|otheroption|...,选项将重置为默认值。",
        "apihelp-options-param-optionname": "应设置为由<var>$1optionvalue</var>提供值的选项名称。",
        "apihelp-parse-description": "解析内容并返回解析器输出。\n\n参见<kbd>[[Special:ApiHelp/query|action=query]]</kbd>的各种prop-module以从页面的当前版本获得信息。\n\n这里有几种方法可以指定解析的文本:\n# 指定一个页面或修订,使用<var>$1page</var>、<var>$1pageid</var>或<var>$1oldid</var>。\n# 明确指定内容,使用<var>$1text</var>、<var>$1title</var>和<var>$1contentmodel</var>。\n# 只指定一段摘要解析。<var>$1prop</var>应提供一个空值。",
        "apihelp-parse-param-title": "文本属于的页面标题。如果省略,<var>$1contentmodel</var>就必须被指定,且[[API]]将作为标题使用。",
        "apihelp-parse-param-text": "要解析的文本。使用<var>$1title</var>或<var>$1contentmodel</var>以控制内容模型。",
-       "apihelp-parse-param-summary": "要解析的摘要。",
+       "apihelp-parse-param-summary": "要解析的摘要。",
        "apihelp-parse-param-page": "解析此页的内容。不能与<var>$1text</var>和<var>$1title</var>一起使用。",
        "apihelp-parse-param-pageid": "解析此页的内容。覆盖<var>$1page</var>。",
        "apihelp-parse-param-redirects": "如果<var>$1page</var>或<var>$1pageid</var>被设置为一个重定向,则解析它。",
        "apihelp-query+allusers-param-activeusers": "只列出最近$1{{PLURAL:$1|天}}内活跃的用户。",
        "apihelp-query+allusers-param-attachedwiki": "与<kbd>$1prop=centralids</kbd>一起使用,也表明用户是否附加于此ID定义的wiki。",
        "apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>开头的用户。",
+       "apihelp-query+filerepoinfo-example-login": "检索当开始登录时可能使用的请求。",
+       "apihelp-query+filerepoinfo-example-login-merged": "检索当开始登录时可能使用的请求,并合并表单字段。",
+       "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "测试身份验证对操作<kbd>foo</kbd>是否足够。",
        "apihelp-query+backlinks-description": "查找所有链接至指定页面的页面。",
        "apihelp-query+backlinks-param-title": "要搜索的标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-query+backlinks-param-pageid": "要搜索的页面ID。不能与<var>$1title</var>一起使用。",
        "apihelp-query+search-paramvalue-prop-timestamp": "添加页面上次编辑时的时间戳。",
        "apihelp-query+search-paramvalue-prop-snippet": "Adds a parsed snippet of the page.",
        "apihelp-query+search-paramvalue-prop-titlesnippet": "Adds a parsed snippet of the page title.",
-       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Adds a parsed snippet of the redirect title.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "添加被解析的重定向标题的片段。",
        "apihelp-query+search-paramvalue-prop-redirecttitle": "Adds the title of the matching redirect.",
        "apihelp-query+search-paramvalue-prop-sectionsnippet": "Adds a parsed snippet of the matching section title.",
        "apihelp-query+search-paramvalue-prop-sectiontitle": "Adds the title of the matching section.",
        "apihelp-query+search-paramvalue-prop-categorysnippet": "Adds a parsed snippet of the matching category.",
        "apihelp-query+search-paramvalue-prop-isfilematch": "Adds a boolean indicating if the search matched file content.",
        "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">已弃用并已忽略。</span>",
-       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Deprecated and ignored.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">已弃用并已忽略。</span>",
        "apihelp-query+search-param-limit": "返回的总计页面数。",
        "apihelp-query+search-param-interwiki": "搜索结果中包含跨wiki结果,如果可用。",
        "apihelp-query+search-param-backend": "要使用的搜索后端,如果没有则为默认。",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "返回变量ID列表。",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "返回外部链接中允许的协议列表。",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "返回用户设置的默认值。",
+       "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "返回上传对话框的配置。",
        "apihelp-query+siteinfo-param-filteriw": "只返回跨wiki地图中的本地或非本地记录。",
        "apihelp-query+siteinfo-param-showalldb": "列出所有数据库服务器,不只是最落后的那个。",
        "apihelp-query+siteinfo-param-numberingroup": "列出用户组中的用户数。",
        "apihelp-query+watchlistraw-param-totitle": "要列举的最终标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-example-simple": "列出当前用户的监视列表中的页面。",
        "apihelp-query+watchlistraw-example-generator": "检索当前用户监视列表上的页面的页面信息。",
+       "apihelp-removeauthenticationdata-description": "从当前用户移除身份验证数据。",
+       "apihelp-removeauthenticationdata-example-simple": "尝试移除当前用户的<kbd>FooAuthenticationRequest</kbd>数据。",
+       "apihelp-resetpassword-description": "向用户发送密码重置邮件。",
+       "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>中启用路由以使用此模块。",
+       "apihelp-resetpassword-param-user": "正在重置的用户。",
+       "apihelp-resetpassword-param-email": "正在重置用户的电子邮件地址。",
+       "apihelp-resetpassword-param-capture": "返回已发送的临时密码。需要<code>passwordreset</code>用户权限。",
+       "apihelp-resetpassword-example-user": "向用户<kbd>Example</kbd>发送密码重置邮件。",
+       "apihelp-resetpassword-example-email": "向所有电子邮件地址为<kbd>user@example.com</kbd>的用户发送密码重置邮件。",
        "apihelp-revisiondelete-description": "删除和恢复修订版本。",
        "apihelp-revisiondelete-param-type": "正在执行的修订版本删除类型。",
        "apihelp-revisiondelete-param-target": "要进行修订版本删除的页面标题,如果对某一类型需要。",
        "apihelp-undelete-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-undelete-example-page": "恢复页面<kbd>Main Page</kbd>。",
        "apihelp-undelete-example-revisions": "恢复<kbd>Main Page</kbd>的两个修订。",
+       "apihelp-unlinkaccount-description": "从当前用户移除已连接的第三方账户。",
+       "apihelp-unlinkaccount-example-simple": "尝试移除当前用户的,与<kbd>FooAuthenticationRequest</kbd>相关联提供方的链接。",
        "apihelp-upload-description": "上传一个文件,或获取正在等待中的上传的状态。\n\n可以使用的几种方法:\n* 直接上传文件内容,使用<var>$1file</var>参数。\n* 成批上传文件,使用<var>$1filesize</var>、<var>$1chunk</var>和<var>$1offset</var>参数。\n* 有MediaWiki服务器从URL检索一个文件,使用<var>$1url</var>参数。\n* 完成一次由于警告而失败的早前上传,使用<var>$1filekey</var>参数。\n需要注意,当发送<var>$1file</var>时,HTTP POST必须做为一次文件上传(也就是使用<code>multipart/form-data</code>)完成。",
        "apihelp-upload-param-filename": "目标文件名。",
        "apihelp-upload-param-comment": "上传注释。如果没有指定<var>$1text</var>,那么它也被用于新文件的初始页面文本。",
        "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
        "api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。",
        "api-help-open-in-apisandbox": "<small>[在沙盒中打开]</small>",
+       "api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>。",
+       "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。",
        "api-credits-header": "制作人员",
        "api-credits": "API 开发人员:\n* Yuri Astrakhan(创建者,2006年9月~2007年9月的开发组领导)\n* Roan Kattouw(2007年9月~2009年的开发组领导)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch(2013年至今的开发组领导)\n\n请将您的评论、建议和问题发送至mediawiki-api@lists.wikimedia.org,或提交错误请求至https://phabricator.wikimedia.org/。"
 }
index 2d29d86..a59ba97 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Cache
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * This class stores an arbitrary value along with its dependencies.
@@ -244,6 +245,34 @@ class GlobalDependency extends CacheDependency {
        }
 }
 
+/**
+ * @ingroup Cache
+ */
+class MainConfigDependency extends CacheDependency {
+       private $name;
+       private $value;
+
+       function __construct( $name ) {
+               $this->name = $name;
+               $this->value = $this->getConfig()->get( $this->name );
+       }
+
+       private function getConfig() {
+               return MediaWikiServices::getInstance()->getMainConfig();
+       }
+
+       /**
+        * @return bool
+        */
+       function isExpired() {
+               if ( !$this->getConfig()->has( $this->name ) ) {
+                       return true;
+               }
+
+               return $this->getConfig()->get( $this->name ) != $this->value;
+       }
+}
+
 /**
  * @ingroup Cache
  */
index dd7d81a..0fb9ed8 100644 (file)
@@ -23,6 +23,7 @@
 use Cdb\Reader as CdbReader;
 use Cdb\Writer as CdbWriter;
 use CLDRPluralRuleParser\Evaluator;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class for caching the contents of localisation files, Messages*.php
@@ -802,12 +803,15 @@ class LocalisationCache {
         * @return array
         */
        public function getMessagesDirs() {
-               global $wgMessagesDirs, $IP;
+               global $IP;
+
+               $config = MediaWikiServices::getInstance()->getMainConfig();
+               $messagesDirs = $config->get( 'MessagesDirs' );
                return [
                        'core' => "$IP/languages/i18n",
                        'api' => "$IP/includes/api/i18n",
                        'oojs-ui' => "$IP/resources/lib/oojs-ui/i18n",
-               ] + $wgMessagesDirs;
+               ] + $messagesDirs;
        }
 
        /**
@@ -958,8 +962,9 @@ class LocalisationCache {
 
                # Add cache dependencies for any referenced globals
                $deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
-               // $wgMessagesDirs is used in LocalisationCache::getMessagesDirs()
-               $deps['wgMessagesDirs'] = new GlobalDependency( 'wgMessagesDirs' );
+               // The 'MessagesDirs' config setting is used in LocalisationCache::getMessagesDirs().
+               // We use the key 'wgMessagesDirs' for historical reasons.
+               $deps['wgMessagesDirs'] = new MainConfigDependency( 'MessagesDirs' );
                $deps['version'] = new ConstantDependency( 'LocalisationCache::VERSION' );
 
                # Add dependencies to the cache entry
index 09b0baa..cd25352 100644 (file)
  *
  * @file
  */
+use MediaWiki\Services\SalvageableService;
+use Wikimedia\Assert\Assert;
 
 /**
  * Factory class to create Config objects
  *
  * @since 1.23
  */
-class ConfigFactory {
+class ConfigFactory implements SalvageableService {
 
        /**
         * Map of config name => callback
@@ -50,6 +52,41 @@ class ConfigFactory {
                return \MediaWiki\MediaWikiServices::getInstance()->getConfigFactory();
        }
 
+       /**
+        * Re-uses existing Cache objects from $other. Cache objects are only re-used if the
+        * registered factory function for both is the same. Cache config is not copied,
+        * and only instances of caches defined on this instance with the same config
+        * are copied.
+        *
+        * @see SalvageableService::salvage()
+        *
+        * @param SalvageableService $other The object to salvage state from. $other must have the
+        * exact same type as $this.
+        */
+       public function salvage( SalvageableService $other ) {
+               Assert::parameterType( self::class, $other, '$other' );
+
+               /** @var ConfigFactory $other */
+               foreach ( $other->factoryFunctions as $name => $otherFunc ) {
+                       if ( !isset( $this->factoryFunctions[$name] ) ) {
+                               continue;
+                       }
+
+                       // if the callback function is the same, salvage the Cache object
+                       // XXX: Closures are never equal!
+                       if ( isset( $other->configs[$name] )
+                               && $this->factoryFunctions[$name] == $otherFunc
+                       ) {
+                               $this->configs[$name] = $other->configs[$name];
+                               unset( $other->configs[$name] );
+                       }
+               }
+
+               // disable $other
+               $other->factoryFunctions = [];
+               $other->configs = [];
+       }
+
        /**
         * @return string[]
         */
@@ -67,23 +104,11 @@ class ConfigFactory {
         * @throws InvalidArgumentException If an invalid callback is provided
         */
        public function register( $name, $callback ) {
-               if ( $callback instanceof Config ) {
-                       $instance = $callback;
-
-                       // Register a callback anyway, for consistency. Note that getConfigNames()
-                       // relies on $factoryFunctions to have all config names.
-                       $callback = function() use ( $instance ) {
-                               return $instance;
-                       };
-               } else {
-                       $instance = null;
-               }
-
-               if ( !is_callable( $callback ) ) {
+               if ( !is_callable( $callback ) && !( $callback instanceof Config ) ) {
                        throw new InvalidArgumentException( 'Invalid callback provided' );
                }
 
-               $this->configs[$name] = $instance;
+               unset( $this->configs[$name] );
                $this->factoryFunctions[$name] = $callback;
        }
 
@@ -105,7 +130,13 @@ class ConfigFactory {
                        if ( !isset( $this->factoryFunctions[$key] ) ) {
                                throw new ConfigException( "No registered builder available for $name." );
                        }
-                       $conf = call_user_func( $this->factoryFunctions[$key], $this );
+
+                       if ( $this->factoryFunctions[$key] instanceof Config ) {
+                               $conf = $this->factoryFunctions[$key];
+                       } else {
+                               $conf = call_user_func( $this->factoryFunctions[$key], $this );
+                       }
+
                        if ( $conf instanceof Config ) {
                                $this->configs[$name] = $conf;
                        } else {
index f3d6781..e225fb7 100644 (file)
@@ -641,7 +641,12 @@ abstract class ContentHandler {
         *
         * @since 1.21
         *
-        * @return array Always an empty array.
+        * @return array An array mapping action names (typically "view", "edit", "history" etc.) to
+        *  either the full qualified class name of an Action class, a callable taking ( Page $page,
+        *  IContextSource $context = null ) as parameters and returning an Action object, or an actual
+        *  Action object. An empty array in this default implementation.
+        *
+        * @see Action::factory
         */
        public function getActionOverrides() {
                return [];
index 13d25a8..d90ef8a 100644 (file)
@@ -75,6 +75,15 @@ class MWDebug {
                self::$enabled = true;
        }
 
+       /**
+        * Disable the debugger.
+        *
+        * @since 1.28
+        */
+       public static function deinit() {
+               self::$enabled = false;
+       }
+
        /**
         * Add ResourceLoader modules to the OutputPage object if debugging is
         * enabled.
index ac08374..1f7f3b0 100644 (file)
@@ -389,14 +389,14 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                foreach ( $deleteWheres as $deleteWhere ) {
                        $this->mDb->delete( $table, $deleteWhere, __METHOD__ );
                        $this->mDb->commit( __METHOD__, 'flush' );
-                       wfGetLBFactory()->waitForReplication();
+                       wfGetLBFactory()->waitForReplication( [ 'wiki' => $this->mDb->getWikiID() ] );
                }
 
                $insertBatches = array_chunk( $insertions, self::BATCH_SIZE );
                foreach ( $insertBatches as $insertBatch ) {
                        $this->mDb->insert( $table, $insertBatch, __METHOD__, 'IGNORE' );
                        $this->mDb->commit( __METHOD__, 'flush' );
-                       wfGetLBFactory()->waitForReplication();
+                       wfGetLBFactory()->waitForReplication( [ 'wiki' => $this->mDb->getWikiID() ] );
                }
 
                if ( count( $insertions ) ) {
index e5e082f..dbb32e6 100644 (file)
@@ -191,244 +191,6 @@ class DiffOpChange extends DiffOp {
        }
 }
 
-/**
- * Class used internally by Diff to actually compute the diffs.
- *
- * The algorithm used here is mostly lifted from the perl module
- * Algorithm::Diff (version 1.06) by Ned Konz, which is available at:
- *     http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip
- *
- * More ideas are taken from:
- *     http://www.ics.uci.edu/~eppstein/161/960229.html
- *
- * Some ideas (and a bit of code) are from analyze.c, from GNU
- * diffutils-2.7, which can be found at:
- *     ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz
- *
- * closingly, some ideas (subdivision by NCHUNKS > 2, and some optimizations)
- * are my own.
- *
- * Line length limits for robustness added by Tim Starling, 2005-08-31
- * Alternative implementation added by Guy Van den Broeck, 2008-07-30
- *
- * @author Geoffrey T. Dairiki, Tim Starling, Guy Van den Broeck
- * @private
- * @ingroup DifferenceEngine
- */
-class DiffEngine {
-       const MAX_XREF_LENGTH = 10000;
-
-       protected $xchanged, $ychanged;
-
-       protected $xv = [], $yv = [];
-       protected $xind = [], $yind = [];
-
-       protected $seq = [], $in_seq = [];
-
-       protected $lcs = 0;
-
-       /**
-        * @param string[] $from_lines
-        * @param string[] $to_lines
-        *
-        * @return DiffOp[]
-        */
-       public function diff( $from_lines, $to_lines ) {
-
-               // Diff and store locally
-               $this->diffLocal( $from_lines, $to_lines );
-
-               // Merge edits when possible
-               $this->shiftBoundaries( $from_lines, $this->xchanged, $this->ychanged );
-               $this->shiftBoundaries( $to_lines, $this->ychanged, $this->xchanged );
-
-               // Compute the edit operations.
-               $n_from = count( $from_lines );
-               $n_to = count( $to_lines );
-
-               $edits = [];
-               $xi = $yi = 0;
-               while ( $xi < $n_from || $yi < $n_to ) {
-                       assert( $yi < $n_to || $this->xchanged[$xi] );
-                       assert( $xi < $n_from || $this->ychanged[$yi] );
-
-                       // Skip matching "snake".
-                       $copy = [];
-                       while ( $xi < $n_from && $yi < $n_to
-                               && !$this->xchanged[$xi] && !$this->ychanged[$yi]
-                       ) {
-                               $copy[] = $from_lines[$xi++];
-                               ++$yi;
-                       }
-                       if ( $copy ) {
-                               $edits[] = new DiffOpCopy( $copy );
-                       }
-
-                       // Find deletes & adds.
-                       $delete = [];
-                       while ( $xi < $n_from && $this->xchanged[$xi] ) {
-                               $delete[] = $from_lines[$xi++];
-                       }
-
-                       $add = [];
-                       while ( $yi < $n_to && $this->ychanged[$yi] ) {
-                               $add[] = $to_lines[$yi++];
-                       }
-
-                       if ( $delete && $add ) {
-                               $edits[] = new DiffOpChange( $delete, $add );
-                       } elseif ( $delete ) {
-                               $edits[] = new DiffOpDelete( $delete );
-                       } elseif ( $add ) {
-                               $edits[] = new DiffOpAdd( $add );
-                       }
-               }
-
-               return $edits;
-       }
-
-       /**
-        * @param string[] $from_lines
-        * @param string[] $to_lines
-        */
-       private function diffLocal( $from_lines, $to_lines ) {
-               $wikidiff3 = new WikiDiff3();
-               $wikidiff3->diff( $from_lines, $to_lines );
-               $this->xchanged = $wikidiff3->removed;
-               $this->ychanged = $wikidiff3->added;
-       }
-
-       /**
-        * Adjust inserts/deletes of identical lines to join changes
-        * as much as possible.
-        *
-        * We do something when a run of changed lines include a
-        * line at one end and has an excluded, identical line at the other.
-        * We are free to choose which identical line is included.
-        * `compareseq' usually chooses the one at the beginning,
-        * but usually it is cleaner to consider the following identical line
-        * to be the "change".
-        *
-        * This is extracted verbatim from analyze.c (GNU diffutils-2.7).
-        */
-       private function shiftBoundaries( $lines, &$changed, $other_changed ) {
-               $i = 0;
-               $j = 0;
-
-               assert( count( $lines ) == count( $changed ) );
-               $len = count( $lines );
-               $other_len = count( $other_changed );
-
-               while ( 1 ) {
-                       /*
-                        * Scan forwards to find beginning of another run of changes.
-                        * Also keep track of the corresponding point in the other file.
-                        *
-                        * Throughout this code, $i and $j are adjusted together so that
-                        * the first $i elements of $changed and the first $j elements
-                        * of $other_changed both contain the same number of zeros
-                        * (unchanged lines).
-                        * Furthermore, $j is always kept so that $j == $other_len or
-                        * $other_changed[$j] == false.
-                        */
-                       while ( $j < $other_len && $other_changed[$j] ) {
-                               $j++;
-                       }
-
-                       while ( $i < $len && !$changed[$i] ) {
-                               assert( $j < $other_len && ! $other_changed[$j] );
-                               $i++;
-                               $j++;
-                               while ( $j < $other_len && $other_changed[$j] ) {
-                                       $j++;
-                               }
-                       }
-
-                       if ( $i == $len ) {
-                               break;
-                       }
-
-                       $start = $i;
-
-                       // Find the end of this run of changes.
-                       while ( ++$i < $len && $changed[$i] ) {
-                               continue;
-                       }
-
-                       do {
-                               /*
-                                * Record the length of this run of changes, so that
-                                * we can later determine whether the run has grown.
-                                */
-                               $runlength = $i - $start;
-
-                               /*
-                                * Move the changed region back, so long as the
-                                * previous unchanged line matches the last changed one.
-                                * This merges with previous changed regions.
-                                */
-                               while ( $start > 0 && $lines[$start - 1] == $lines[$i - 1] ) {
-                                       $changed[--$start] = 1;
-                                       $changed[--$i] = false;
-                                       while ( $start > 0 && $changed[$start - 1] ) {
-                                               $start--;
-                                       }
-                                       assert( $j > 0 );
-                                       while ( $other_changed[--$j] ) {
-                                               continue;
-                                       }
-                                       assert( $j >= 0 && !$other_changed[$j] );
-                               }
-
-                               /*
-                                * Set CORRESPONDING to the end of the changed run, at the last
-                                * point where it corresponds to a changed run in the other file.
-                                * CORRESPONDING == LEN means no such point has been found.
-                                */
-                               $corresponding = $j < $other_len ? $i : $len;
-
-                               /*
-                                * Move the changed region forward, so long as the
-                                * first changed line matches the following unchanged one.
-                                * This merges with following changed regions.
-                                * Do this second, so that if there are no merges,
-                                * the changed region is moved forward as far as possible.
-                                */
-                               while ( $i < $len && $lines[$start] == $lines[$i] ) {
-                                       $changed[$start++] = false;
-                                       $changed[$i++] = 1;
-                                       while ( $i < $len && $changed[$i] ) {
-                                               $i++;
-                                       }
-
-                                       assert( $j < $other_len && ! $other_changed[$j] );
-                                       $j++;
-                                       if ( $j < $other_len && $other_changed[$j] ) {
-                                               $corresponding = $i;
-                                               while ( $j < $other_len && $other_changed[$j] ) {
-                                                       $j++;
-                                               }
-                                       }
-                               }
-                       } while ( $runlength != $i - $start );
-
-                       /*
-                        * If possible, move the fully-merged run of changes
-                        * back to a corresponding run in the other file.
-                        */
-                       while ( $corresponding < $i ) {
-                               $changed[--$start] = 1;
-                               $changed[--$i] = 0;
-                               assert( $j > 0 );
-                               while ( $other_changed[--$j] ) {
-                                       continue;
-                               }
-                               assert( $j >= 0 && !$other_changed[$j] );
-                       }
-               }
-       }
-}
-
 /**
  * Class representing a 'diff' between two sequences of strings.
  * @todo document
@@ -559,236 +321,7 @@ class Diff {
 }
 
 /**
- * @todo document, bad name.
- * @private
- * @ingroup DifferenceEngine
- */
-class MappedDiff extends Diff {
-       /**
-        * Constructor.
-        *
-        * Computes diff between sequences of strings.
-        *
-        * This can be used to compute things like
-        * case-insensitve diffs, or diffs which ignore
-        * changes in white-space.
-        *
-        * @param string[] $from_lines An array of strings.
-        *   Typically these are lines from a file.
-        * @param string[] $to_lines An array of strings.
-        * @param string[] $mapped_from_lines This array should
-        *   have the same size number of elements as $from_lines.
-        *   The elements in $mapped_from_lines and
-        *   $mapped_to_lines are what is actually compared
-        *   when computing the diff.
-        * @param string[] $mapped_to_lines This array should
-        *   have the same number of elements as $to_lines.
-        */
-       public function __construct( $from_lines, $to_lines,
-               $mapped_from_lines, $mapped_to_lines ) {
-
-               assert( count( $from_lines ) == count( $mapped_from_lines ) );
-               assert( count( $to_lines ) == count( $mapped_to_lines ) );
-
-               parent::__construct( $mapped_from_lines, $mapped_to_lines );
-
-               $xi = $yi = 0;
-               $editCount = count( $this->edits );
-               for ( $i = 0; $i < $editCount; $i++ ) {
-                       $orig = &$this->edits[$i]->orig;
-                       if ( is_array( $orig ) ) {
-                               $orig = array_slice( $from_lines, $xi, count( $orig ) );
-                               $xi += count( $orig );
-                       }
-
-                       $closing = &$this->edits[$i]->closing;
-                       if ( is_array( $closing ) ) {
-                               $closing = array_slice( $to_lines, $yi, count( $closing ) );
-                               $yi += count( $closing );
-                       }
-               }
-       }
-}
-
-/**
- * Additions by Axel Boldt follow, partly taken from diff.php, phpwiki-1.3.3
+ * @deprecated Alias for WordAccumulator, to be soon removed
  */
-
-/**
- * @todo document
- * @private
- * @ingroup DifferenceEngine
- */
-class HWLDFWordAccumulator {
-       public $insClass = ' class="diffchange diffchange-inline"';
-       public $delClass = ' class="diffchange diffchange-inline"';
-
-       private $lines = [];
-       private $line = '';
-       private $group = '';
-       private $tag = '';
-
-       /**
-        * @param string $new_tag
-        */
-       private function flushGroup( $new_tag ) {
-               if ( $this->group !== '' ) {
-                       if ( $this->tag == 'ins' ) {
-                               $this->line .= "<ins{$this->insClass}>" .
-                                       htmlspecialchars( $this->group ) . '</ins>';
-                       } elseif ( $this->tag == 'del' ) {
-                               $this->line .= "<del{$this->delClass}>" .
-                                       htmlspecialchars( $this->group ) . '</del>';
-                       } else {
-                               $this->line .= htmlspecialchars( $this->group );
-                       }
-               }
-               $this->group = '';
-               $this->tag = $new_tag;
-       }
-
-       /**
-        * @param string $new_tag
-        */
-       private function flushLine( $new_tag ) {
-               $this->flushGroup( $new_tag );
-               if ( $this->line != '' ) {
-                       array_push( $this->lines, $this->line );
-               } else {
-                       # make empty lines visible by inserting an NBSP
-                       array_push( $this->lines, '&#160;' );
-               }
-               $this->line = '';
-       }
-
-       /**
-        * @param string[] $words
-        * @param string $tag
-        */
-       public function addWords( $words, $tag = '' ) {
-               if ( $tag != $this->tag ) {
-                       $this->flushGroup( $tag );
-               }
-
-               foreach ( $words as $word ) {
-                       // new-line should only come as first char of word.
-                       if ( $word == '' ) {
-                               continue;
-                       }
-                       if ( $word[0] == "\n" ) {
-                               $this->flushLine( $tag );
-                               $word = substr( $word, 1 );
-                       }
-                       assert( !strstr( $word, "\n" ) );
-                       $this->group .= $word;
-               }
-       }
-
-       /**
-        * @return string[]
-        */
-       public function getLines() {
-               $this->flushLine( '~done' );
-
-               return $this->lines;
-       }
-}
-
-/**
- * @todo document
- * @private
- * @ingroup DifferenceEngine
- */
-class WordLevelDiff extends MappedDiff {
-       const MAX_LINE_LENGTH = 10000;
-
-       /**
-        * @param string[] $orig_lines
-        * @param string[] $closing_lines
-        */
-       public function __construct( $orig_lines, $closing_lines ) {
-
-               list( $orig_words, $orig_stripped ) = $this->split( $orig_lines );
-               list( $closing_words, $closing_stripped ) = $this->split( $closing_lines );
-
-               parent::__construct( $orig_words, $closing_words,
-                       $orig_stripped, $closing_stripped );
-       }
-
-       /**
-        * @param string[] $lines
-        *
-        * @return array[]
-        */
-       private function split( $lines ) {
-
-               $words = [];
-               $stripped = [];
-               $first = true;
-               foreach ( $lines as $line ) {
-                       # If the line is too long, just pretend the entire line is one big word
-                       # This prevents resource exhaustion problems
-                       if ( $first ) {
-                               $first = false;
-                       } else {
-                               $words[] = "\n";
-                               $stripped[] = "\n";
-                       }
-                       if ( strlen( $line ) > self::MAX_LINE_LENGTH ) {
-                               $words[] = $line;
-                               $stripped[] = $line;
-                       } else {
-                               $m = [];
-                               if ( preg_match_all( '/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
-                                       $line, $m )
-                               ) {
-                                       foreach ( $m[0] as $word ) {
-                                               $words[] = $word;
-                                       }
-                                       foreach ( $m[1] as $stripped_word ) {
-                                               $stripped[] = $stripped_word;
-                                       }
-                               }
-                       }
-               }
-
-               return [ $words, $stripped ];
-       }
-
-       /**
-        * @return string[]
-        */
-       public function orig() {
-               $orig = new HWLDFWordAccumulator;
-
-               foreach ( $this->edits as $edit ) {
-                       if ( $edit->type == 'copy' ) {
-                               $orig->addWords( $edit->orig );
-                       } elseif ( $edit->orig ) {
-                               $orig->addWords( $edit->orig, 'del' );
-                       }
-               }
-               $lines = $orig->getLines();
-
-               return $lines;
-       }
-
-       /**
-        * @return string[]
-        */
-       public function closing() {
-               $closing = new HWLDFWordAccumulator;
-
-               foreach ( $this->edits as $edit ) {
-                       if ( $edit->type == 'copy' ) {
-                               $closing->addWords( $edit->closing );
-                       } elseif ( $edit->closing ) {
-                               $closing->addWords( $edit->closing, 'ins' );
-                       }
-               }
-               $lines = $closing->getLines();
-
-               return $lines;
-       }
-
+class HWLDFWordAccumulator extends MediaWiki\Diff\WordAccumulator {
 }
diff --git a/includes/diff/DiffEngine.php b/includes/diff/DiffEngine.php
new file mode 100644 (file)
index 0000000..1853b86
--- /dev/null
@@ -0,0 +1,825 @@
+<?php
+/**
+ * New version of the difference engine
+ *
+ * Copyright © 2008 Guy Van den Broeck <guy@guyvdb.eu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup DifferenceEngine
+ */
+
+/**
+ * This diff implementation is mainly lifted from the LCS algorithm of the Eclipse project which
+ * in turn is based on Myers' "An O(ND) difference algorithm and its variations"
+ * (http://citeseer.ist.psu.edu/myers86ond.html) with range compression (see Wu et al.'s
+ * "An O(NP) Sequence Comparison Algorithm").
+ *
+ * This implementation supports an upper bound on the execution time.
+ *
+ * Some ideas (and a bit of code) are from analyze.c, from GNU
+ * diffutils-2.7, which can be found at:
+ *     ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz
+ *
+ * Complexity: O((M + N)D) worst case time, O(M + N + D^2) expected time, O(M + N) space
+ *
+ * @author Guy Van den Broeck, Geoffrey T. Dairiki, Tim Starling
+ * @ingroup DifferenceEngine
+ */
+class DiffEngine {
+
+       // Input variables
+       private $from;
+       private $to;
+       private $m;
+       private $n;
+
+       private $tooLong;
+       private $powLimit;
+
+       // State variables
+       private $maxDifferences;
+       private $lcsLengthCorrectedForHeuristic = false;
+
+       // Output variables
+       public $length;
+       public $removed;
+       public $added;
+       public $heuristicUsed;
+
+       function __construct( $tooLong = 2000000, $powLimit = 1.45 ) {
+               $this->tooLong = $tooLong;
+               $this->powLimit = $powLimit;
+       }
+
+       /**
+        * Performs diff
+        *
+        * @param string[] $from_lines
+        * @param string[] $to_lines
+        *
+        * @return DiffOp[]
+        */
+       public function diff( $from_lines, $to_lines ) {
+
+               // Diff and store locally
+               $this->diffInternal( $from_lines, $to_lines );
+
+               // Merge edits when possible
+               $this->shiftBoundaries( $from_lines, $this->removed, $this->added );
+               $this->shiftBoundaries( $to_lines, $this->added, $this->removed );
+
+               // Compute the edit operations.
+               $n_from = count( $from_lines );
+               $n_to = count( $to_lines );
+
+               $edits = [];
+               $xi = $yi = 0;
+               while ( $xi < $n_from || $yi < $n_to ) {
+                       assert( $yi < $n_to || $this->removed[$xi] );
+                       assert( $xi < $n_from || $this->added[$yi] );
+
+                       // Skip matching "snake".
+                       $copy = [];
+                       while ( $xi < $n_from && $yi < $n_to
+                                       && !$this->removed[$xi] && !$this->added[$yi]
+                       ) {
+                               $copy[] = $from_lines[$xi++];
+                               ++$yi;
+                       }
+                       if ( $copy ) {
+                               $edits[] = new DiffOpCopy( $copy );
+                       }
+
+                       // Find deletes & adds.
+                       $delete = [];
+                       while ( $xi < $n_from && $this->removed[$xi] ) {
+                               $delete[] = $from_lines[$xi++];
+                       }
+
+                       $add = [];
+                       while ( $yi < $n_to && $this->added[$yi] ) {
+                               $add[] = $to_lines[$yi++];
+                       }
+
+                       if ( $delete && $add ) {
+                               $edits[] = new DiffOpChange( $delete, $add );
+                       } elseif ( $delete ) {
+                               $edits[] = new DiffOpDelete( $delete );
+                       } elseif ( $add ) {
+                               $edits[] = new DiffOpAdd( $add );
+                       }
+               }
+
+               return $edits;
+       }
+
+       /**
+        * Adjust inserts/deletes of identical lines to join changes
+        * as much as possible.
+        *
+        * We do something when a run of changed lines include a
+        * line at one end and has an excluded, identical line at the other.
+        * We are free to choose which identical line is included.
+        * `compareseq' usually chooses the one at the beginning,
+        * but usually it is cleaner to consider the following identical line
+        * to be the "change".
+        *
+        * This is extracted verbatim from analyze.c (GNU diffutils-2.7).
+        *
+        * @param string[] $lines
+        * @param string[] $changed
+        * @param string[] $other_changed
+        */
+       private function shiftBoundaries( array $lines, array &$changed, array $other_changed ) {
+               $i = 0;
+               $j = 0;
+
+               assert( count( $lines ) == count( $changed ) );
+               $len = count( $lines );
+               $other_len = count( $other_changed );
+
+               while ( 1 ) {
+                       /*
+                        * Scan forwards to find beginning of another run of changes.
+                        * Also keep track of the corresponding point in the other file.
+                        *
+                        * Throughout this code, $i and $j are adjusted together so that
+                        * the first $i elements of $changed and the first $j elements
+                        * of $other_changed both contain the same number of zeros
+                        * (unchanged lines).
+                        * Furthermore, $j is always kept so that $j == $other_len or
+                        * $other_changed[$j] == false.
+                        */
+                       while ( $j < $other_len && $other_changed[$j] ) {
+                               $j++;
+                       }
+
+                       while ( $i < $len && !$changed[$i] ) {
+                               assert( $j < $other_len && ! $other_changed[$j] );
+                               $i++;
+                               $j++;
+                               while ( $j < $other_len && $other_changed[$j] ) {
+                                       $j++;
+                               }
+                       }
+
+                       if ( $i == $len ) {
+                               break;
+                       }
+
+                       $start = $i;
+
+                       // Find the end of this run of changes.
+                       while ( ++$i < $len && $changed[$i] ) {
+                               continue;
+                       }
+
+                       do {
+                               /*
+                                * Record the length of this run of changes, so that
+                                * we can later determine whether the run has grown.
+                                */
+                               $runlength = $i - $start;
+
+                               /*
+                                * Move the changed region back, so long as the
+                                * previous unchanged line matches the last changed one.
+                                * This merges with previous changed regions.
+                                */
+                               while ( $start > 0 && $lines[$start - 1] == $lines[$i - 1] ) {
+                                       $changed[--$start] = 1;
+                                       $changed[--$i] = false;
+                                       while ( $start > 0 && $changed[$start - 1] ) {
+                                               $start--;
+                                       }
+                                       assert( $j > 0 );
+                                       while ( $other_changed[--$j] ) {
+                                               continue;
+                                       }
+                                       assert( $j >= 0 && !$other_changed[$j] );
+                               }
+
+                               /*
+                                * Set CORRESPONDING to the end of the changed run, at the last
+                                * point where it corresponds to a changed run in the other file.
+                                * CORRESPONDING == LEN means no such point has been found.
+                                */
+                               $corresponding = $j < $other_len ? $i : $len;
+
+                               /*
+                                * Move the changed region forward, so long as the
+                                * first changed line matches the following unchanged one.
+                                * This merges with following changed regions.
+                                * Do this second, so that if there are no merges,
+                                * the changed region is moved forward as far as possible.
+                                */
+                               while ( $i < $len && $lines[$start] == $lines[$i] ) {
+                                       $changed[$start++] = false;
+                                       $changed[$i++] = 1;
+                                       while ( $i < $len && $changed[$i] ) {
+                                               $i++;
+                                       }
+
+                                       assert( $j < $other_len && ! $other_changed[$j] );
+                                       $j++;
+                                       if ( $j < $other_len && $other_changed[$j] ) {
+                                               $corresponding = $i;
+                                               while ( $j < $other_len && $other_changed[$j] ) {
+                                                       $j++;
+                                               }
+                                       }
+                               }
+                       } while ( $runlength != $i - $start );
+
+                       /*
+                        * If possible, move the fully-merged run of changes
+                        * back to a corresponding run in the other file.
+                        */
+                       while ( $corresponding < $i ) {
+                               $changed[--$start] = 1;
+                               $changed[--$i] = 0;
+                               assert( $j > 0 );
+                               while ( $other_changed[--$j] ) {
+                                       continue;
+                               }
+                               assert( $j >= 0 && !$other_changed[$j] );
+                       }
+               }
+       }
+
+       /**
+        * @param string[] $from
+        * @param string[] $to
+        */
+       protected function diffInternal( array $from, array $to ) {
+               // remember initial lengths
+               $m = count( $from );
+               $n = count( $to );
+
+               $this->heuristicUsed = false;
+
+               // output
+               $removed = $m > 0 ? array_fill( 0, $m, true ) : [];
+               $added = $n > 0 ? array_fill( 0, $n, true ) : [];
+
+               // reduce the complexity for the next step (intentionally done twice)
+               // remove common tokens at the start
+               $i = 0;
+               while ( $i < $m && $i < $n && $from[$i] === $to[$i] ) {
+                       $removed[$i] = $added[$i] = false;
+                       unset( $from[$i], $to[$i] );
+                       ++$i;
+               }
+
+               // remove common tokens at the end
+               $j = 1;
+               while ( $i + $j <= $m && $i + $j <= $n && $from[$m - $j] === $to[$n - $j] ) {
+                       $removed[$m - $j] = $added[$n - $j] = false;
+                       unset( $from[$m - $j], $to[$n - $j] );
+                       ++$j;
+               }
+
+               $this->from = $newFromIndex = $this->to = $newToIndex = [];
+
+               // remove tokens not in both sequences
+               $shared = [];
+               foreach ( $from as $key ) {
+                       $shared[$key] = false;
+               }
+
+               foreach ( $to as $index => &$el ) {
+                       if ( array_key_exists( $el, $shared ) ) {
+                               // keep it
+                               $this->to[] = $el;
+                               $shared[$el] = true;
+                               $newToIndex[] = $index;
+                       }
+               }
+               foreach ( $from as $index => &$el ) {
+                       if ( $shared[$el] ) {
+                               // keep it
+                               $this->from[] = $el;
+                               $newFromIndex[] = $index;
+                       }
+               }
+
+               unset( $shared, $from, $to );
+
+               $this->m = count( $this->from );
+               $this->n = count( $this->to );
+
+               $this->removed = $this->m > 0 ? array_fill( 0, $this->m, true ) : [];
+               $this->added = $this->n > 0 ? array_fill( 0, $this->n, true ) : [];
+
+               if ( $this->m == 0 || $this->n == 0 ) {
+                       $this->length = 0;
+               } else {
+                       $this->maxDifferences = ceil( ( $this->m + $this->n ) / 2.0 );
+                       if ( $this->m * $this->n > $this->tooLong ) {
+                               // limit complexity to D^POW_LIMIT for long sequences
+                               $this->maxDifferences = floor( pow( $this->maxDifferences, $this->powLimit - 1.0 ) );
+                               wfDebug( "Limiting max number of differences to $this->maxDifferences\n" );
+                       }
+
+                       /*
+                        * The common prefixes and suffixes are always part of some LCS, include
+                        * them now to reduce our search space
+                        */
+                       $max = min( $this->m, $this->n );
+                       for ( $forwardBound = 0; $forwardBound < $max
+                               && $this->from[$forwardBound] === $this->to[$forwardBound];
+                               ++$forwardBound
+                       ) {
+                               $this->removed[$forwardBound] = $this->added[$forwardBound] = false;
+                       }
+
+                       $backBoundL1 = $this->m - 1;
+                       $backBoundL2 = $this->n - 1;
+
+                       while ( $backBoundL1 >= $forwardBound && $backBoundL2 >= $forwardBound
+                               && $this->from[$backBoundL1] === $this->to[$backBoundL2]
+                       ) {
+                               $this->removed[$backBoundL1--] = $this->added[$backBoundL2--] = false;
+                       }
+
+                       $temp = array_fill( 0, $this->m + $this->n + 1, 0 );
+                       $V = [ $temp, $temp ];
+                       $snake = [ 0, 0, 0 ];
+
+                       $this->length = $forwardBound + $this->m - $backBoundL1 - 1
+                               + $this->lcs_rec(
+                                       $forwardBound,
+                                       $backBoundL1,
+                                       $forwardBound,
+                                       $backBoundL2,
+                                       $V,
+                                       $snake
+                       );
+               }
+
+               $this->m = $m;
+               $this->n = $n;
+
+               $this->length += $i + $j - 1;
+
+               foreach ( $this->removed as $key => &$removed_elem ) {
+                       if ( !$removed_elem ) {
+                               $removed[$newFromIndex[$key]] = false;
+                       }
+               }
+               foreach ( $this->added as $key => &$added_elem ) {
+                       if ( !$added_elem ) {
+                               $added[$newToIndex[$key]] = false;
+                       }
+               }
+               $this->removed = $removed;
+               $this->added = $added;
+       }
+
+       function diff_range( $from_lines, $to_lines ) {
+               // Diff and store locally
+               $this->diff( $from_lines, $to_lines );
+               unset( $from_lines, $to_lines );
+
+               $ranges = [];
+               $xi = $yi = 0;
+               while ( $xi < $this->m || $yi < $this->n ) {
+                       // Matching "snake".
+                       while ( $xi < $this->m && $yi < $this->n
+                               && !$this->removed[$xi]
+                               && !$this->added[$yi]
+                       ) {
+                               ++$xi;
+                               ++$yi;
+                       }
+                       // Find deletes & adds.
+                       $xstart = $xi;
+                       while ( $xi < $this->m && $this->removed[$xi] ) {
+                               ++$xi;
+                       }
+
+                       $ystart = $yi;
+                       while ( $yi < $this->n && $this->added[$yi] ) {
+                               ++$yi;
+                       }
+
+                       if ( $xi > $xstart || $yi > $ystart ) {
+                               $ranges[] = new RangeDifference( $xstart, $xi, $ystart, $yi );
+                       }
+               }
+
+               return $ranges;
+       }
+
+       private function lcs_rec( $bottoml1, $topl1, $bottoml2, $topl2, &$V, &$snake ) {
+               // check that both sequences are non-empty
+               if ( $bottoml1 > $topl1 || $bottoml2 > $topl2 ) {
+                       return 0;
+               }
+
+               $d = $this->find_middle_snake( $bottoml1, $topl1, $bottoml2,
+                       $topl2, $V, $snake );
+
+               // need to store these so we don't lose them when they're
+               // overwritten by the recursion
+               $len = $snake[2];
+               $startx = $snake[0];
+               $starty = $snake[1];
+
+               // the middle snake is part of the LCS, store it
+               for ( $i = 0; $i < $len; ++$i ) {
+                       $this->removed[$startx + $i] = $this->added[$starty + $i] = false;
+               }
+
+               if ( $d > 1 ) {
+                       return $len
+                       + $this->lcs_rec( $bottoml1, $startx - 1, $bottoml2,
+                               $starty - 1, $V, $snake )
+                       + $this->lcs_rec( $startx + $len, $topl1, $starty + $len,
+                               $topl2, $V, $snake );
+               } elseif ( $d == 1 ) {
+                       /*
+                        * In this case the sequences differ by exactly 1 line. We have
+                        * already saved all the lines after the difference in the for loop
+                        * above, now we need to save all the lines before the difference.
+                        */
+                       $max = min( $startx - $bottoml1, $starty - $bottoml2 );
+                       for ( $i = 0; $i < $max; ++$i ) {
+                               $this->removed[$bottoml1 + $i] =
+                                       $this->added[$bottoml2 + $i] = false;
+                       }
+
+                       return $max + $len;
+               }
+
+               return $len;
+       }
+
+       private function find_middle_snake( $bottoml1, $topl1, $bottoml2, $topl2, &$V, &$snake ) {
+               $from = &$this->from;
+               $to = &$this->to;
+               $V0 = &$V[0];
+               $V1 = &$V[1];
+               $snake0 = &$snake[0];
+               $snake1 = &$snake[1];
+               $snake2 = &$snake[2];
+               $bottoml1_min_1 = $bottoml1 - 1;
+               $bottoml2_min_1 = $bottoml2 - 1;
+               $N = $topl1 - $bottoml1_min_1;
+               $M = $topl2 - $bottoml2_min_1;
+               $delta = $N - $M;
+               $maxabsx = $N + $bottoml1;
+               $maxabsy = $M + $bottoml2;
+               $limit = min( $this->maxDifferences, ceil( ( $N + $M ) / 2 ) );
+
+               // value_to_add_forward: a 0 or 1 that we add to the start
+               // offset to make it odd/even
+               if ( ( $M & 1 ) == 1 ) {
+                       $value_to_add_forward = 1;
+               } else {
+                       $value_to_add_forward = 0;
+               }
+
+               if ( ( $N & 1 ) == 1 ) {
+                       $value_to_add_backward = 1;
+               } else {
+                       $value_to_add_backward = 0;
+               }
+
+               $start_forward = -$M;
+               $end_forward = $N;
+               $start_backward = -$N;
+               $end_backward = $M;
+
+               $limit_min_1 = $limit - 1;
+               $limit_plus_1 = $limit + 1;
+
+               $V0[$limit_plus_1] = 0;
+               $V1[$limit_min_1] = $N;
+               $limit = min( $this->maxDifferences, ceil( ( $N + $M ) / 2 ) );
+
+               if ( ( $delta & 1 ) == 1 ) {
+                       for ( $d = 0; $d <= $limit; ++$d ) {
+                               $start_diag = max( $value_to_add_forward + $start_forward, -$d );
+                               $end_diag = min( $end_forward, $d );
+                               $value_to_add_forward = 1 - $value_to_add_forward;
+
+                               // compute forward furthest reaching paths
+                               for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
+                                       if ( $k == -$d || ( $k < $d
+                                                       && $V0[$limit_min_1 + $k] < $V0[$limit_plus_1 + $k] )
+                                       ) {
+                                               $x = $V0[$limit_plus_1 + $k];
+                                       } else {
+                                               $x = $V0[$limit_min_1 + $k] + 1;
+                                       }
+
+                                       $absx = $snake0 = $x + $bottoml1;
+                                       $absy = $snake1 = $x - $k + $bottoml2;
+
+                                       while ( $absx < $maxabsx && $absy < $maxabsy && $from[$absx] === $to[$absy] ) {
+                                               ++$absx;
+                                               ++$absy;
+                                       }
+                                       $x = $absx - $bottoml1;
+
+                                       $snake2 = $absx - $snake0;
+                                       $V0[$limit + $k] = $x;
+                                       if ( $k >= $delta - $d + 1 && $k <= $delta + $d - 1
+                                               && $x >= $V1[$limit + $k - $delta]
+                                       ) {
+                                               return 2 * $d - 1;
+                                       }
+
+                                       // check to see if we can cut down the diagonal range
+                                       if ( $x >= $N && $end_forward > $k - 1 ) {
+                                               $end_forward = $k - 1;
+                                       } elseif ( $absy - $bottoml2 >= $M ) {
+                                               $start_forward = $k + 1;
+                                               $value_to_add_forward = 0;
+                                       }
+                               }
+
+                               $start_diag = max( $value_to_add_backward + $start_backward, -$d );
+                               $end_diag = min( $end_backward, $d );
+                               $value_to_add_backward = 1 - $value_to_add_backward;
+
+                               // compute backward furthest reaching paths
+                               for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
+                                       if ( $k == $d
+                                               || ( $k != -$d && $V1[$limit_min_1 + $k] < $V1[$limit_plus_1 + $k] )
+                                       ) {
+                                               $x = $V1[$limit_min_1 + $k];
+                                       } else {
+                                               $x = $V1[$limit_plus_1 + $k] - 1;
+                                       }
+
+                                       $y = $x - $k - $delta;
+
+                                       $snake2 = 0;
+                                       while ( $x > 0 && $y > 0
+                                               && $from[$x + $bottoml1_min_1] === $to[$y + $bottoml2_min_1]
+                                       ) {
+                                               --$x;
+                                               --$y;
+                                               ++$snake2;
+                                       }
+                                       $V1[$limit + $k] = $x;
+
+                                       // check to see if we can cut down our diagonal range
+                                       if ( $x <= 0 ) {
+                                               $start_backward = $k + 1;
+                                               $value_to_add_backward = 0;
+                                       } elseif ( $y <= 0 && $end_backward > $k - 1 ) {
+                                               $end_backward = $k - 1;
+                                       }
+                               }
+                       }
+               } else {
+                       for ( $d = 0; $d <= $limit; ++$d ) {
+                               $start_diag = max( $value_to_add_forward + $start_forward, -$d );
+                               $end_diag = min( $end_forward, $d );
+                               $value_to_add_forward = 1 - $value_to_add_forward;
+
+                               // compute forward furthest reaching paths
+                               for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
+                                       if ( $k == -$d
+                                               || ( $k < $d && $V0[$limit_min_1 + $k] < $V0[$limit_plus_1 + $k] )
+                                       ) {
+                                               $x = $V0[$limit_plus_1 + $k];
+                                       } else {
+                                               $x = $V0[$limit_min_1 + $k] + 1;
+                                       }
+
+                                       $absx = $snake0 = $x + $bottoml1;
+                                       $absy = $snake1 = $x - $k + $bottoml2;
+
+                                       while ( $absx < $maxabsx && $absy < $maxabsy && $from[$absx] === $to[$absy] ) {
+                                               ++$absx;
+                                               ++$absy;
+                                       }
+                                       $x = $absx - $bottoml1;
+                                       $snake2 = $absx - $snake0;
+                                       $V0[$limit + $k] = $x;
+
+                                       // check to see if we can cut down the diagonal range
+                                       if ( $x >= $N && $end_forward > $k - 1 ) {
+                                               $end_forward = $k - 1;
+                                       } elseif ( $absy - $bottoml2 >= $M ) {
+                                               $start_forward = $k + 1;
+                                               $value_to_add_forward = 0;
+                                       }
+                               }
+
+                               $start_diag = max( $value_to_add_backward + $start_backward, -$d );
+                               $end_diag = min( $end_backward, $d );
+                               $value_to_add_backward = 1 - $value_to_add_backward;
+
+                               // compute backward furthest reaching paths
+                               for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
+                                       if ( $k == $d
+                                               || ( $k != -$d && $V1[$limit_min_1 + $k] < $V1[$limit_plus_1 + $k] )
+                                       ) {
+                                               $x = $V1[$limit_min_1 + $k];
+                                       } else {
+                                               $x = $V1[$limit_plus_1 + $k] - 1;
+                                       }
+
+                                       $y = $x - $k - $delta;
+
+                                       $snake2 = 0;
+                                       while ( $x > 0 && $y > 0
+                                               && $from[$x + $bottoml1_min_1] === $to[$y + $bottoml2_min_1]
+                                       ) {
+                                               --$x;
+                                               --$y;
+                                               ++$snake2;
+                                       }
+                                       $V1[$limit + $k] = $x;
+
+                                       if ( $k >= -$delta - $d && $k <= $d - $delta
+                                               && $x <= $V0[$limit + $k + $delta]
+                                       ) {
+                                               $snake0 = $bottoml1 + $x;
+                                               $snake1 = $bottoml2 + $y;
+
+                                               return 2 * $d;
+                                       }
+
+                                       // check to see if we can cut down our diagonal range
+                                       if ( $x <= 0 ) {
+                                               $start_backward = $k + 1;
+                                               $value_to_add_backward = 0;
+                                       } elseif ( $y <= 0 && $end_backward > $k - 1 ) {
+                                               $end_backward = $k - 1;
+                                       }
+                               }
+                       }
+               }
+               /*
+                * computing the true LCS is too expensive, instead find the diagonal
+                * with the most progress and pretend a midle snake of length 0 occurs
+                * there.
+                */
+
+               $most_progress = self::findMostProgress( $M, $N, $limit, $V );
+
+               $snake0 = $bottoml1 + $most_progress[0];
+               $snake1 = $bottoml2 + $most_progress[1];
+               $snake2 = 0;
+               wfDebug( "Computing the LCS is too expensive. Using a heuristic.\n" );
+               $this->heuristicUsed = true;
+
+               return 5; /*
+               * HACK: since we didn't really finish the LCS computation
+               * we don't really know the length of the SES. We don't do
+               * anything with the result anyway, unless it's <=1. We know
+               * for a fact SES > 1 so 5 is as good a number as any to
+               * return here
+               */
+       }
+
+       private static function findMostProgress( $M, $N, $limit, $V ) {
+               $delta = $N - $M;
+
+               if ( ( $M & 1 ) == ( $limit & 1 ) ) {
+                       $forward_start_diag = max( -$M, -$limit );
+               } else {
+                       $forward_start_diag = max( 1 - $M, -$limit );
+               }
+
+               $forward_end_diag = min( $N, $limit );
+
+               if ( ( $N & 1 ) == ( $limit & 1 ) ) {
+                       $backward_start_diag = max( -$N, -$limit );
+               } else {
+                       $backward_start_diag = max( 1 - $N, -$limit );
+               }
+
+               $backward_end_diag = -min( $M, $limit );
+
+               $temp = [ 0, 0, 0 ];
+
+               $max_progress = array_fill( 0, ceil( max( $forward_end_diag - $forward_start_diag,
+                               $backward_end_diag - $backward_start_diag ) / 2 ), $temp );
+               $num_progress = 0; // the 1st entry is current, it is initialized
+               // with 0s
+
+               // first search the forward diagonals
+               for ( $k = $forward_start_diag; $k <= $forward_end_diag; $k += 2 ) {
+                       $x = $V[0][$limit + $k];
+                       $y = $x - $k;
+                       if ( $x > $N || $y > $M ) {
+                               continue;
+                       }
+
+                       $progress = $x + $y;
+                       if ( $progress > $max_progress[0][2] ) {
+                               $num_progress = 0;
+                               $max_progress[0][0] = $x;
+                               $max_progress[0][1] = $y;
+                               $max_progress[0][2] = $progress;
+                       } elseif ( $progress == $max_progress[0][2] ) {
+                               ++$num_progress;
+                               $max_progress[$num_progress][0] = $x;
+                               $max_progress[$num_progress][1] = $y;
+                               $max_progress[$num_progress][2] = $progress;
+                       }
+               }
+
+               $max_progress_forward = true; // initially the maximum
+               // progress is in the forward
+               // direction
+
+               // now search the backward diagonals
+               for ( $k = $backward_start_diag; $k <= $backward_end_diag; $k += 2 ) {
+                       $x = $V[1][$limit + $k];
+                       $y = $x - $k - $delta;
+                       if ( $x < 0 || $y < 0 ) {
+                               continue;
+                       }
+
+                       $progress = $N - $x + $M - $y;
+                       if ( $progress > $max_progress[0][2] ) {
+                               $num_progress = 0;
+                               $max_progress_forward = false;
+                               $max_progress[0][0] = $x;
+                               $max_progress[0][1] = $y;
+                               $max_progress[0][2] = $progress;
+                       } elseif ( $progress == $max_progress[0][2] && !$max_progress_forward ) {
+                               ++$num_progress;
+                               $max_progress[$num_progress][0] = $x;
+                               $max_progress[$num_progress][1] = $y;
+                               $max_progress[$num_progress][2] = $progress;
+                       }
+               }
+
+               // return the middle diagonal with maximal progress.
+               return $max_progress[(int)floor( $num_progress / 2 )];
+       }
+
+       /**
+        * @return mixed
+        */
+       public function getLcsLength() {
+               if ( $this->heuristicUsed && !$this->lcsLengthCorrectedForHeuristic ) {
+                       $this->lcsLengthCorrectedForHeuristic = true;
+                       $this->length = $this->m - array_sum( $this->added );
+               }
+
+               return $this->length;
+       }
+
+}
+
+/**
+ * Alternative representation of a set of changes, by the index
+ * ranges that are changed.
+ *
+ * @ingroup DifferenceEngine
+ */
+class RangeDifference {
+
+       /** @var int */
+       public $leftstart;
+
+       /** @var int */
+       public $leftend;
+
+       /** @var int */
+       public $leftlength;
+
+       /** @var int */
+       public $rightstart;
+
+       /** @var int */
+       public $rightend;
+
+       /** @var int */
+       public $rightlength;
+
+       function __construct( $leftstart, $leftend, $rightstart, $rightend ) {
+               $this->leftstart = $leftstart;
+               $this->leftend = $leftend;
+               $this->leftlength = $leftend - $leftstart;
+               $this->rightstart = $rightstart;
+               $this->rightend = $rightend;
+               $this->rightlength = $rightend - $rightstart;
+       }
+
+}
index e2345ca..f35356c 100644 (file)
@@ -474,16 +474,17 @@ class DifferenceEngine extends ContextSource {
                        if ( !$linkInfo ) {
                                $this->mMarkPatrolledLink = '';
                        } else {
-                               $this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
-                                       $this->mNewPage,
-                                       $this->msg( 'markaspatrolleddiff' )->escaped(),
-                                       [],
-                                       [
-                                               'action' => 'markpatrolled',
-                                               'rcid' => $linkInfo['rcid'],
-                                               'token' => $linkInfo['token'],
-                                       ]
-                               ) . ']</span>';
+                               $this->mMarkPatrolledLink = ' <span class="patrollink" data-mw="interface">[' .
+                                       Linker::linkKnown(
+                                               $this->mNewPage,
+                                               $this->msg( 'markaspatrolleddiff' )->escaped(),
+                                               [],
+                                               [
+                                                       'action' => 'markpatrolled',
+                                                       'rcid' => $linkInfo['rcid'],
+                                                       'token' => $linkInfo['token'],
+                                               ]
+                                       ) . ']</span>';
                        }
                }
                return $this->mMarkPatrolledLink;
@@ -842,19 +843,36 @@ class DifferenceEngine extends ContextSource {
         * @return bool|string
         */
        public function generateTextDiffBody( $otext, $ntext ) {
-               $time = microtime( true );
+               $diff = function() use ( $otext, $ntext ) {
+                       $time = microtime( true );
 
-               $result = $this->textDiff( $otext, $ntext );
+                       $result = $this->textDiff( $otext, $ntext );
 
-               $time = intval( ( microtime( true ) - $time ) * 1000 );
-               $this->getStats()->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}" );
+                       $time = intval( ( microtime( true ) - $time ) * 1000 );
+                       $this->getStats()->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;
+               };
+
+               $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 $result;
+               return $diff();
        }
 
        /**
diff --git a/includes/diff/WikiDiff3.php b/includes/diff/WikiDiff3.php
deleted file mode 100644 (file)
index f35e30f..0000000
+++ /dev/null
@@ -1,621 +0,0 @@
-<?php
-/**
- * New version of the difference engine
- *
- * Copyright © 2008 Guy Van den Broeck <guy@guyvdb.eu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup DifferenceEngine
- */
-
-/**
- * This diff implementation is mainly lifted from the LCS algorithm of the Eclipse project which
- * in turn is based on Myers' "An O(ND) difference algorithm and its variations"
- * (http://citeseer.ist.psu.edu/myers86ond.html) with range compression (see Wu et al.'s
- * "An O(NP) Sequence Comparison Algorithm").
- *
- * This implementation supports an upper bound on the execution time.
- *
- * Complexity: O((M + N)D) worst case time, O(M + N + D^2) expected time, O(M + N) space
- *
- * @author Guy Van den Broeck
- * @ingroup DifferenceEngine
- */
-class WikiDiff3 {
-
-       // Input variables
-       private $from;
-       private $to;
-       private $m;
-       private $n;
-
-       private $tooLong;
-       private $powLimit;
-
-       // State variables
-       private $maxDifferences;
-       private $lcsLengthCorrectedForHeuristic = false;
-
-       // Output variables
-       public $length;
-       public $removed;
-       public $added;
-       public $heuristicUsed;
-
-       function __construct( $tooLong = 2000000, $powLimit = 1.45 ) {
-               $this->tooLong = $tooLong;
-               $this->powLimit = $powLimit;
-       }
-
-       public function diff( /*array*/ $from, /*array*/ $to ) {
-               // remember initial lengths
-               $m = count( $from );
-               $n = count( $to );
-
-               $this->heuristicUsed = false;
-
-               // output
-               $removed = $m > 0 ? array_fill( 0, $m, true ) : [];
-               $added = $n > 0 ? array_fill( 0, $n, true ) : [];
-
-               // reduce the complexity for the next step (intentionally done twice)
-               // remove common tokens at the start
-               $i = 0;
-               while ( $i < $m && $i < $n && $from[$i] === $to[$i] ) {
-                       $removed[$i] = $added[$i] = false;
-                       unset( $from[$i], $to[$i] );
-                       ++$i;
-               }
-
-               // remove common tokens at the end
-               $j = 1;
-               while ( $i + $j <= $m && $i + $j <= $n && $from[$m - $j] === $to[$n - $j] ) {
-                       $removed[$m - $j] = $added[$n - $j] = false;
-                       unset( $from[$m - $j], $to[$n - $j] );
-                       ++$j;
-               }
-
-               $this->from = $newFromIndex = $this->to = $newToIndex = [];
-
-               // remove tokens not in both sequences
-               $shared = [];
-               foreach ( $from as $key ) {
-                       $shared[$key] = false;
-               }
-
-               foreach ( $to as $index => &$el ) {
-                       if ( array_key_exists( $el, $shared ) ) {
-                               // keep it
-                               $this->to[] = $el;
-                               $shared[$el] = true;
-                               $newToIndex[] = $index;
-                       }
-               }
-               foreach ( $from as $index => &$el ) {
-                       if ( $shared[$el] ) {
-                               // keep it
-                               $this->from[] = $el;
-                               $newFromIndex[] = $index;
-                       }
-               }
-
-               unset( $shared, $from, $to );
-
-               $this->m = count( $this->from );
-               $this->n = count( $this->to );
-
-               $this->removed = $this->m > 0 ? array_fill( 0, $this->m, true ) : [];
-               $this->added = $this->n > 0 ? array_fill( 0, $this->n, true ) : [];
-
-               if ( $this->m == 0 || $this->n == 0 ) {
-                       $this->length = 0;
-               } else {
-                       $this->maxDifferences = ceil( ( $this->m + $this->n ) / 2.0 );
-                       if ( $this->m * $this->n > $this->tooLong ) {
-                               // limit complexity to D^POW_LIMIT for long sequences
-                               $this->maxDifferences = floor( pow( $this->maxDifferences, $this->powLimit - 1.0 ) );
-                               wfDebug( "Limiting max number of differences to $this->maxDifferences\n" );
-                       }
-
-                       /*
-                        * The common prefixes and suffixes are always part of some LCS, include
-                        * them now to reduce our search space
-                        */
-                       $max = min( $this->m, $this->n );
-                       for ( $forwardBound = 0; $forwardBound < $max
-                               && $this->from[$forwardBound] === $this->to[$forwardBound];
-                               ++$forwardBound
-                       ) {
-                               $this->removed[$forwardBound] = $this->added[$forwardBound] = false;
-                       }
-
-                       $backBoundL1 = $this->m - 1;
-                       $backBoundL2 = $this->n - 1;
-
-                       while ( $backBoundL1 >= $forwardBound && $backBoundL2 >= $forwardBound
-                               && $this->from[$backBoundL1] === $this->to[$backBoundL2]
-                       ) {
-                               $this->removed[$backBoundL1--] = $this->added[$backBoundL2--] = false;
-                       }
-
-                       $temp = array_fill( 0, $this->m + $this->n + 1, 0 );
-                       $V = [ $temp, $temp ];
-                       $snake = [ 0, 0, 0 ];
-
-                       $this->length = $forwardBound + $this->m - $backBoundL1 - 1
-                               + $this->lcs_rec(
-                                       $forwardBound,
-                                       $backBoundL1,
-                                       $forwardBound,
-                                       $backBoundL2,
-                                       $V,
-                                       $snake
-                       );
-               }
-
-               $this->m = $m;
-               $this->n = $n;
-
-               $this->length += $i + $j - 1;
-
-               foreach ( $this->removed as $key => &$removed_elem ) {
-                       if ( !$removed_elem ) {
-                               $removed[$newFromIndex[$key]] = false;
-                       }
-               }
-               foreach ( $this->added as $key => &$added_elem ) {
-                       if ( !$added_elem ) {
-                               $added[$newToIndex[$key]] = false;
-                       }
-               }
-               $this->removed = $removed;
-               $this->added = $added;
-       }
-
-       function diff_range( $from_lines, $to_lines ) {
-               // Diff and store locally
-               $this->diff( $from_lines, $to_lines );
-               unset( $from_lines, $to_lines );
-
-               $ranges = [];
-               $xi = $yi = 0;
-               while ( $xi < $this->m || $yi < $this->n ) {
-                       // Matching "snake".
-                       while ( $xi < $this->m && $yi < $this->n
-                               && !$this->removed[$xi]
-                               && !$this->added[$yi]
-                       ) {
-                               ++$xi;
-                               ++$yi;
-                       }
-                       // Find deletes & adds.
-                       $xstart = $xi;
-                       while ( $xi < $this->m && $this->removed[$xi] ) {
-                               ++$xi;
-                       }
-
-                       $ystart = $yi;
-                       while ( $yi < $this->n && $this->added[$yi] ) {
-                               ++$yi;
-                       }
-
-                       if ( $xi > $xstart || $yi > $ystart ) {
-                               $ranges[] = new RangeDifference( $xstart, $xi, $ystart, $yi );
-                       }
-               }
-
-               return $ranges;
-       }
-
-       private function lcs_rec( $bottoml1, $topl1, $bottoml2, $topl2, &$V, &$snake ) {
-               // check that both sequences are non-empty
-               if ( $bottoml1 > $topl1 || $bottoml2 > $topl2 ) {
-                       return 0;
-               }
-
-               $d = $this->find_middle_snake( $bottoml1, $topl1, $bottoml2,
-                       $topl2, $V, $snake );
-
-               // need to store these so we don't lose them when they're
-               // overwritten by the recursion
-               $len = $snake[2];
-               $startx = $snake[0];
-               $starty = $snake[1];
-
-               // the middle snake is part of the LCS, store it
-               for ( $i = 0; $i < $len; ++$i ) {
-                       $this->removed[$startx + $i] = $this->added[$starty + $i] = false;
-               }
-
-               if ( $d > 1 ) {
-                       return $len
-                       + $this->lcs_rec( $bottoml1, $startx - 1, $bottoml2,
-                               $starty - 1, $V, $snake )
-                       + $this->lcs_rec( $startx + $len, $topl1, $starty + $len,
-                               $topl2, $V, $snake );
-               } elseif ( $d == 1 ) {
-                       /*
-                        * In this case the sequences differ by exactly 1 line. We have
-                        * already saved all the lines after the difference in the for loop
-                        * above, now we need to save all the lines before the difference.
-                        */
-                       $max = min( $startx - $bottoml1, $starty - $bottoml2 );
-                       for ( $i = 0; $i < $max; ++$i ) {
-                               $this->removed[$bottoml1 + $i] =
-                                       $this->added[$bottoml2 + $i] = false;
-                       }
-
-                       return $max + $len;
-               }
-
-               return $len;
-       }
-
-       private function find_middle_snake( $bottoml1, $topl1, $bottoml2, $topl2, &$V, &$snake ) {
-               $from = &$this->from;
-               $to = &$this->to;
-               $V0 = &$V[0];
-               $V1 = &$V[1];
-               $snake0 = &$snake[0];
-               $snake1 = &$snake[1];
-               $snake2 = &$snake[2];
-               $bottoml1_min_1 = $bottoml1 - 1;
-               $bottoml2_min_1 = $bottoml2 - 1;
-               $N = $topl1 - $bottoml1_min_1;
-               $M = $topl2 - $bottoml2_min_1;
-               $delta = $N - $M;
-               $maxabsx = $N + $bottoml1;
-               $maxabsy = $M + $bottoml2;
-               $limit = min( $this->maxDifferences, ceil( ( $N + $M ) / 2 ) );
-
-               // value_to_add_forward: a 0 or 1 that we add to the start
-               // offset to make it odd/even
-               if ( ( $M & 1 ) == 1 ) {
-                       $value_to_add_forward = 1;
-               } else {
-                       $value_to_add_forward = 0;
-               }
-
-               if ( ( $N & 1 ) == 1 ) {
-                       $value_to_add_backward = 1;
-               } else {
-                       $value_to_add_backward = 0;
-               }
-
-               $start_forward = -$M;
-               $end_forward = $N;
-               $start_backward = -$N;
-               $end_backward = $M;
-
-               $limit_min_1 = $limit - 1;
-               $limit_plus_1 = $limit + 1;
-
-               $V0[$limit_plus_1] = 0;
-               $V1[$limit_min_1] = $N;
-               $limit = min( $this->maxDifferences, ceil( ( $N + $M ) / 2 ) );
-
-               if ( ( $delta & 1 ) == 1 ) {
-                       for ( $d = 0; $d <= $limit; ++$d ) {
-                               $start_diag = max( $value_to_add_forward + $start_forward, -$d );
-                               $end_diag = min( $end_forward, $d );
-                               $value_to_add_forward = 1 - $value_to_add_forward;
-
-                               // compute forward furthest reaching paths
-                               for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
-                                       if ( $k == -$d || ( $k < $d
-                                                       && $V0[$limit_min_1 + $k] < $V0[$limit_plus_1 + $k] )
-                                       ) {
-                                               $x = $V0[$limit_plus_1 + $k];
-                                       } else {
-                                               $x = $V0[$limit_min_1 + $k] + 1;
-                                       }
-
-                                       $absx = $snake0 = $x + $bottoml1;
-                                       $absy = $snake1 = $x - $k + $bottoml2;
-
-                                       while ( $absx < $maxabsx && $absy < $maxabsy && $from[$absx] === $to[$absy] ) {
-                                               ++$absx;
-                                               ++$absy;
-                                       }
-                                       $x = $absx - $bottoml1;
-
-                                       $snake2 = $absx - $snake0;
-                                       $V0[$limit + $k] = $x;
-                                       if ( $k >= $delta - $d + 1 && $k <= $delta + $d - 1
-                                               && $x >= $V1[$limit + $k - $delta]
-                                       ) {
-                                               return 2 * $d - 1;
-                                       }
-
-                                       // check to see if we can cut down the diagonal range
-                                       if ( $x >= $N && $end_forward > $k - 1 ) {
-                                               $end_forward = $k - 1;
-                                       } elseif ( $absy - $bottoml2 >= $M ) {
-                                               $start_forward = $k + 1;
-                                               $value_to_add_forward = 0;
-                                       }
-                               }
-
-                               $start_diag = max( $value_to_add_backward + $start_backward, -$d );
-                               $end_diag = min( $end_backward, $d );
-                               $value_to_add_backward = 1 - $value_to_add_backward;
-
-                               // compute backward furthest reaching paths
-                               for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
-                                       if ( $k == $d
-                                               || ( $k != -$d && $V1[$limit_min_1 + $k] < $V1[$limit_plus_1 + $k] )
-                                       ) {
-                                               $x = $V1[$limit_min_1 + $k];
-                                       } else {
-                                               $x = $V1[$limit_plus_1 + $k] - 1;
-                                       }
-
-                                       $y = $x - $k - $delta;
-
-                                       $snake2 = 0;
-                                       while ( $x > 0 && $y > 0
-                                               && $from[$x + $bottoml1_min_1] === $to[$y + $bottoml2_min_1]
-                                       ) {
-                                               --$x;
-                                               --$y;
-                                               ++$snake2;
-                                       }
-                                       $V1[$limit + $k] = $x;
-
-                                       // check to see if we can cut down our diagonal range
-                                       if ( $x <= 0 ) {
-                                               $start_backward = $k + 1;
-                                               $value_to_add_backward = 0;
-                                       } elseif ( $y <= 0 && $end_backward > $k - 1 ) {
-                                               $end_backward = $k - 1;
-                                       }
-                               }
-                       }
-               } else {
-                       for ( $d = 0; $d <= $limit; ++$d ) {
-                               $start_diag = max( $value_to_add_forward + $start_forward, -$d );
-                               $end_diag = min( $end_forward, $d );
-                               $value_to_add_forward = 1 - $value_to_add_forward;
-
-                               // compute forward furthest reaching paths
-                               for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
-                                       if ( $k == -$d
-                                               || ( $k < $d && $V0[$limit_min_1 + $k] < $V0[$limit_plus_1 + $k] )
-                                       ) {
-                                               $x = $V0[$limit_plus_1 + $k];
-                                       } else {
-                                               $x = $V0[$limit_min_1 + $k] + 1;
-                                       }
-
-                                       $absx = $snake0 = $x + $bottoml1;
-                                       $absy = $snake1 = $x - $k + $bottoml2;
-
-                                       while ( $absx < $maxabsx && $absy < $maxabsy && $from[$absx] === $to[$absy] ) {
-                                               ++$absx;
-                                               ++$absy;
-                                       }
-                                       $x = $absx - $bottoml1;
-                                       $snake2 = $absx - $snake0;
-                                       $V0[$limit + $k] = $x;
-
-                                       // check to see if we can cut down the diagonal range
-                                       if ( $x >= $N && $end_forward > $k - 1 ) {
-                                               $end_forward = $k - 1;
-                                       } elseif ( $absy - $bottoml2 >= $M ) {
-                                               $start_forward = $k + 1;
-                                               $value_to_add_forward = 0;
-                                       }
-                               }
-
-                               $start_diag = max( $value_to_add_backward + $start_backward, -$d );
-                               $end_diag = min( $end_backward, $d );
-                               $value_to_add_backward = 1 - $value_to_add_backward;
-
-                               // compute backward furthest reaching paths
-                               for ( $k = $start_diag; $k <= $end_diag; $k += 2 ) {
-                                       if ( $k == $d
-                                               || ( $k != -$d && $V1[$limit_min_1 + $k] < $V1[$limit_plus_1 + $k] )
-                                       ) {
-                                               $x = $V1[$limit_min_1 + $k];
-                                       } else {
-                                               $x = $V1[$limit_plus_1 + $k] - 1;
-                                       }
-
-                                       $y = $x - $k - $delta;
-
-                                       $snake2 = 0;
-                                       while ( $x > 0 && $y > 0
-                                               && $from[$x + $bottoml1_min_1] === $to[$y + $bottoml2_min_1]
-                                       ) {
-                                               --$x;
-                                               --$y;
-                                               ++$snake2;
-                                       }
-                                       $V1[$limit + $k] = $x;
-
-                                       if ( $k >= -$delta - $d && $k <= $d - $delta
-                                               && $x <= $V0[$limit + $k + $delta]
-                                       ) {
-                                               $snake0 = $bottoml1 + $x;
-                                               $snake1 = $bottoml2 + $y;
-
-                                               return 2 * $d;
-                                       }
-
-                                       // check to see if we can cut down our diagonal range
-                                       if ( $x <= 0 ) {
-                                               $start_backward = $k + 1;
-                                               $value_to_add_backward = 0;
-                                       } elseif ( $y <= 0 && $end_backward > $k - 1 ) {
-                                               $end_backward = $k - 1;
-                                       }
-                               }
-                       }
-               }
-               /*
-                * computing the true LCS is too expensive, instead find the diagonal
-                * with the most progress and pretend a midle snake of length 0 occurs
-                * there.
-                */
-
-               $most_progress = self::findMostProgress( $M, $N, $limit, $V );
-
-               $snake0 = $bottoml1 + $most_progress[0];
-               $snake1 = $bottoml2 + $most_progress[1];
-               $snake2 = 0;
-               wfDebug( "Computing the LCS is too expensive. Using a heuristic.\n" );
-               $this->heuristicUsed = true;
-
-               return 5; /*
-               * HACK: since we didn't really finish the LCS computation
-               * we don't really know the length of the SES. We don't do
-               * anything with the result anyway, unless it's <=1. We know
-               * for a fact SES > 1 so 5 is as good a number as any to
-               * return here
-               */
-       }
-
-       private static function findMostProgress( $M, $N, $limit, $V ) {
-               $delta = $N - $M;
-
-               if ( ( $M & 1 ) == ( $limit & 1 ) ) {
-                       $forward_start_diag = max( -$M, -$limit );
-               } else {
-                       $forward_start_diag = max( 1 - $M, -$limit );
-               }
-
-               $forward_end_diag = min( $N, $limit );
-
-               if ( ( $N & 1 ) == ( $limit & 1 ) ) {
-                       $backward_start_diag = max( -$N, -$limit );
-               } else {
-                       $backward_start_diag = max( 1 - $N, -$limit );
-               }
-
-               $backward_end_diag = -min( $M, $limit );
-
-               $temp = [ 0, 0, 0 ];
-
-               $max_progress = array_fill( 0, ceil( max( $forward_end_diag - $forward_start_diag,
-                               $backward_end_diag - $backward_start_diag ) / 2 ), $temp );
-               $num_progress = 0; // the 1st entry is current, it is initialized
-               // with 0s
-
-               // first search the forward diagonals
-               for ( $k = $forward_start_diag; $k <= $forward_end_diag; $k += 2 ) {
-                       $x = $V[0][$limit + $k];
-                       $y = $x - $k;
-                       if ( $x > $N || $y > $M ) {
-                               continue;
-                       }
-
-                       $progress = $x + $y;
-                       if ( $progress > $max_progress[0][2] ) {
-                               $num_progress = 0;
-                               $max_progress[0][0] = $x;
-                               $max_progress[0][1] = $y;
-                               $max_progress[0][2] = $progress;
-                       } elseif ( $progress == $max_progress[0][2] ) {
-                               ++$num_progress;
-                               $max_progress[$num_progress][0] = $x;
-                               $max_progress[$num_progress][1] = $y;
-                               $max_progress[$num_progress][2] = $progress;
-                       }
-               }
-
-               $max_progress_forward = true; // initially the maximum
-               // progress is in the forward
-               // direction
-
-               // now search the backward diagonals
-               for ( $k = $backward_start_diag; $k <= $backward_end_diag; $k += 2 ) {
-                       $x = $V[1][$limit + $k];
-                       $y = $x - $k - $delta;
-                       if ( $x < 0 || $y < 0 ) {
-                               continue;
-                       }
-
-                       $progress = $N - $x + $M - $y;
-                       if ( $progress > $max_progress[0][2] ) {
-                               $num_progress = 0;
-                               $max_progress_forward = false;
-                               $max_progress[0][0] = $x;
-                               $max_progress[0][1] = $y;
-                               $max_progress[0][2] = $progress;
-                       } elseif ( $progress == $max_progress[0][2] && !$max_progress_forward ) {
-                               ++$num_progress;
-                               $max_progress[$num_progress][0] = $x;
-                               $max_progress[$num_progress][1] = $y;
-                               $max_progress[$num_progress][2] = $progress;
-                       }
-               }
-
-               // return the middle diagonal with maximal progress.
-               return $max_progress[(int)floor( $num_progress / 2 )];
-       }
-
-       /**
-        * @return mixed
-        */
-       public function getLcsLength() {
-               if ( $this->heuristicUsed && !$this->lcsLengthCorrectedForHeuristic ) {
-                       $this->lcsLengthCorrectedForHeuristic = true;
-                       $this->length = $this->m - array_sum( $this->added );
-               }
-
-               return $this->length;
-       }
-
-}
-
-/**
- * Alternative representation of a set of changes, by the index
- * ranges that are changed.
- *
- * @ingroup DifferenceEngine
- */
-class RangeDifference {
-
-       /** @var int */
-       public $leftstart;
-
-       /** @var int */
-       public $leftend;
-
-       /** @var int */
-       public $leftlength;
-
-       /** @var int */
-       public $rightstart;
-
-       /** @var int */
-       public $rightend;
-
-       /** @var int */
-       public $rightlength;
-
-       function __construct( $leftstart, $leftend, $rightstart, $rightend ) {
-               $this->leftstart = $leftstart;
-               $this->leftend = $leftend;
-               $this->leftlength = $leftend - $leftstart;
-               $this->rightstart = $rightstart;
-               $this->rightend = $rightend;
-               $this->rightlength = $rightend - $rightstart;
-       }
-
-}
diff --git a/includes/diff/WordAccumulator.php b/includes/diff/WordAccumulator.php
new file mode 100644 (file)
index 0000000..a26775f
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Copyright © 2000, 2001 Geoffrey T. Dairiki <dairiki@dairiki.org>
+ * You may copy this code freely under the conditions of the GPL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup DifferenceEngine
+ * @defgroup DifferenceEngine DifferenceEngine
+ */
+
+namespace MediaWiki\Diff;
+
+/**
+ * Stores, escapes and formats the results of word-level diff
+ *
+ * @private
+ * @ingroup DifferenceEngine
+ */
+class WordAccumulator {
+       public $insClass = ' class="diffchange diffchange-inline"';
+       public $delClass = ' class="diffchange diffchange-inline"';
+
+       private $lines = [];
+       private $line = '';
+       private $group = '';
+       private $tag = '';
+
+       /**
+        * @param string $new_tag
+        */
+       private function flushGroup( $new_tag ) {
+               if ( $this->group !== '' ) {
+                       if ( $this->tag == 'ins' ) {
+                               $this->line .= "<ins{$this->insClass}>" .
+                                                          htmlspecialchars( $this->group ) . '</ins>';
+                       } elseif ( $this->tag == 'del' ) {
+                               $this->line .= "<del{$this->delClass}>" .
+                                                          htmlspecialchars( $this->group ) . '</del>';
+                       } else {
+                               $this->line .= htmlspecialchars( $this->group );
+                       }
+               }
+               $this->group = '';
+               $this->tag = $new_tag;
+       }
+
+       /**
+        * @param string $new_tag
+        */
+       private function flushLine( $new_tag ) {
+               $this->flushGroup( $new_tag );
+               if ( $this->line != '' ) {
+                       array_push( $this->lines, $this->line );
+               } else {
+                       # make empty lines visible by inserting an NBSP
+                       array_push( $this->lines, '&#160;' );
+               }
+               $this->line = '';
+       }
+
+       /**
+        * @param string[] $words
+        * @param string $tag
+        */
+       public function addWords( $words, $tag = '' ) {
+               if ( $tag != $this->tag ) {
+                       $this->flushGroup( $tag );
+               }
+
+               foreach ( $words as $word ) {
+                       // new-line should only come as first char of word.
+                       if ( $word == '' ) {
+                               continue;
+                       }
+                       if ( $word[0] == "\n" ) {
+                               $this->flushLine( $tag );
+                               $word = substr( $word, 1 );
+                       }
+                       assert( !strstr( $word, "\n" ) );
+                       $this->group .= $word;
+               }
+       }
+
+       /**
+        * @return string[]
+        */
+       public function getLines() {
+               $this->flushLine( '~done' );
+
+               return $this->lines;
+       }
+}
diff --git a/includes/diff/WordLevelDiff.php b/includes/diff/WordLevelDiff.php
new file mode 100644 (file)
index 0000000..12cf376
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+/**
+ * Copyright © 2000, 2001 Geoffrey T. Dairiki <dairiki@dairiki.org>
+ * You may copy this code freely under the conditions of the GPL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup DifferenceEngine
+ * @defgroup DifferenceEngine DifferenceEngine
+ */
+
+use MediaWiki\Diff\WordAccumulator;
+
+/**
+ * Performs a word-level diff on several lines
+ *
+ * @ingroup DifferenceEngine
+ */
+class WordLevelDiff extends \Diff {
+       const MAX_LINE_LENGTH = 10000;
+
+       /**
+        * @param string[] $linesBefore
+        * @param string[] $linesAfter
+        */
+       public function __construct( $linesBefore, $linesAfter ) {
+
+               list( $wordsBefore, $wordsBeforeStripped ) = $this->split( $linesBefore );
+               list( $wordsAfter, $wordsAfterStripped ) = $this->split( $linesAfter );
+
+               parent::__construct( $wordsBeforeStripped, $wordsAfterStripped );
+
+               $xi = $yi = 0;
+               $editCount = count( $this->edits );
+               for ( $i = 0; $i < $editCount; $i++ ) {
+                       $orig = &$this->edits[$i]->orig;
+                       if ( is_array( $orig ) ) {
+                               $orig = array_slice( $wordsBefore, $xi, count( $orig ) );
+                               $xi += count( $orig );
+                       }
+
+                       $closing = &$this->edits[$i]->closing;
+                       if ( is_array( $closing ) ) {
+                               $closing = array_slice( $wordsAfter, $yi, count( $closing ) );
+                               $yi += count( $closing );
+                       }
+               }
+
+       }
+
+       /**
+        * @param string[] $lines
+        *
+        * @return array[]
+        */
+       private function split( $lines ) {
+
+               $words = [];
+               $stripped = [];
+               $first = true;
+               foreach ( $lines as $line ) {
+                       # If the line is too long, just pretend the entire line is one big word
+                       # This prevents resource exhaustion problems
+                       if ( $first ) {
+                               $first = false;
+                       } else {
+                               $words[] = "\n";
+                               $stripped[] = "\n";
+                       }
+                       if ( strlen( $line ) > self::MAX_LINE_LENGTH ) {
+                               $words[] = $line;
+                               $stripped[] = $line;
+                       } else {
+                               $m = [];
+                               if ( preg_match_all( '/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
+                                       $line, $m )
+                               ) {
+                                       foreach ( $m[0] as $word ) {
+                                               $words[] = $word;
+                                       }
+                                       foreach ( $m[1] as $stripped_word ) {
+                                               $stripped[] = $stripped_word;
+                                       }
+                               }
+                       }
+               }
+
+               return [ $words, $stripped ];
+       }
+
+       /**
+        * @return string[]
+        */
+       public function orig() {
+               $orig = new WordAccumulator;
+
+               foreach ( $this->edits as $edit ) {
+                       if ( $edit->type == 'copy' ) {
+                               $orig->addWords( $edit->orig );
+                       } elseif ( $edit->orig ) {
+                               $orig->addWords( $edit->orig, 'del' );
+                       }
+               }
+               $lines = $orig->getLines();
+
+               return $lines;
+       }
+
+       /**
+        * @return string[]
+        */
+       public function closing() {
+               $closing = new WordAccumulator;
+
+               foreach ( $this->edits as $edit ) {
+                       if ( $edit->type == 'copy' ) {
+                               $closing->addWords( $edit->closing );
+                       } elseif ( $edit->closing ) {
+                               $closing->addWords( $edit->closing, 'ins' );
+                       }
+               }
+               $lines = $closing->getLines();
+
+               return $lines;
+       }
+
+}
diff --git a/includes/exception/BadRequestError.php b/includes/exception/BadRequestError.php
new file mode 100644 (file)
index 0000000..5fcf0e6
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * An error page that emits an HTTP 400 Bad Request status code.
+ *
+ * @since 1.28
+ * @ingroup Exception
+ */
+class BadRequestError extends ErrorPageError {
+
+       public function report() {
+               global $wgOut;
+               $wgOut->setStatusCode( 400 );
+               parent::report();
+       }
+}
index 3f4c213..40c18a4 100644 (file)
 
 /**
  * Show an error page on a badtitle.
- * Similar to ErrorPage, but emit a 400 HTTP error code to let mobile
- * browser it is not really a valid content.
+ *
+ * Uses BadRequestError to emit a 400 HTTP error code to ensure caching proxies and
+ * mobile browsers know not to cache it as valid content. (T35646)
  *
  * @since 1.19
  * @ingroup Exception
  */
-class BadTitleError extends ErrorPageError {
+class BadTitleError extends BadRequestError {
        /**
         * @param string|Message|MalformedTitleException $msg A message key (default: 'badtitletext'), or
         *     a MalformedTitleException to figure out things from
@@ -45,17 +46,4 @@ class BadTitleError extends ErrorPageError {
                        parent::__construct( 'badtitle', $msg, $params );
                }
        }
-
-       /**
-        * Just like ErrorPageError::report() but additionally set
-        * a 400 HTTP status code (bug 33646).
-        */
-       public function report() {
-               global $wgOut;
-
-               // bug 33646: a badtitle error page need to return an error code
-               // to let mobile browser now that it is not a normal page.
-               $wgOut->setStatusCode( 400 );
-               parent::report();
-       }
 }
index f7275fc..2a15fd7 100644 (file)
@@ -1920,12 +1920,15 @@ class LocalFile extends File {
                        // Also, that would cause contention on INSERT of similarly named rows.
                        $backend = $this->getRepo()->getBackend();
                        $lockPaths = [ $this->getPath() ]; // represents all versions of the file
-                       $status = $backend->lockFiles( $lockPaths, LockManager::LOCK_EX, 5 );
+                       $start = microtime( true );
+                       $status = $backend->lockFiles( $lockPaths, LockManager::LOCK_EX, 10 );
+                       $waited = microtime( true ) - $start;
                        if ( !$status->isGood() ) {
                                if ( $this->lockedOwnTrx ) {
                                        $dbw->rollback( __METHOD__ );
                                }
-                               throw new LocalFileLockError( "Could not acquire lock for '{$this->getName()}.'" );
+                               throw new LocalFileLockError(
+                                       "Could not acquire lock for '{$this->getName()}' ($waited sec)." );
                        }
                        // Release the lock *after* commit to avoid row-level contention
                        $this->locked++;
index 0dab3bb..e891c9c 100644 (file)
@@ -1226,17 +1226,25 @@ class HTMLForm extends ContextSource {
        /**
         * Identify that the submit button in the form has a destructive action
         * @since 1.24
+        *
+        * @return HTMLForm $this for chaining calls (since 1.28)
         */
        public function setSubmitDestructive() {
                $this->mSubmitFlags = [ 'destructive', 'primary' ];
+
+               return $this;
        }
 
        /**
         * Identify that the submit button in the form has a progressive action
         * @since 1.25
+        *
+        * @return HTMLForm $this for chaining calls (since 1.28)
         */
        public function setSubmitProgressive() {
                $this->mSubmitFlags = [ 'progressive', 'primary' ];
+
+               return $this;
        }
 
        /**
index a9f219f..85b1013 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Deployment
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * This documentation group collects source code files with deployment functionality.
@@ -383,14 +384,24 @@ abstract class Installer {
 
                $configOverrides->set( 'MessagesDirs', $messageDirs );
 
-               return new MultiConfig( [ $configOverrides, $baseConfig ] );
+               $installerConfig = new MultiConfig( [ $configOverrides, $baseConfig ] );
+
+               // make sure we use the installer config as the main config
+               $configRegistry = $baseConfig->get( 'ConfigRegistry' );
+               $configRegistry['main'] = function() use ( $installerConfig ) {
+                       return $installerConfig;
+               };
+
+               $configOverrides->set( 'ConfigRegistry', $configRegistry );
+
+               return $installerConfig;
        }
 
        /**
         * Constructor, always call this from child classes.
         */
        public function __construct() {
-               global $wgMemc, $wgUser;
+               global $wgMemc, $wgUser, $wgObjectCaches;
 
                $defaultConfig = new GlobalVarConfig(); // all the stuff from DefaultSettings.php
                $installerConfig = self::getInstallerConfig( $defaultConfig );
@@ -411,6 +422,7 @@ abstract class Installer {
 
                // Disable object cache (otherwise CACHE_ANYTHING will try CACHE_DB and
                // SqlBagOStuff will then throw since we just disabled wfGetDB)
+               $wgObjectCaches = MediaWikiServices::getInstance()->getMainConfig()->get( 'ObjectCaches' );
                $wgMemc = ObjectCache::getInstance( CACHE_NONE );
 
                // Having a user with id = 0 safeguards us from DB access via User::loadOptions().
index b4c8aa8..f8dc8ee 100644 (file)
@@ -115,7 +115,10 @@ class WebInstallerOutput {
 
        public function output() {
                $this->flush();
-               $this->outputFooter();
+
+               if ( !$this->redirectTarget ) {
+                       $this->outputFooter();
+               }
        }
 
        /**
diff --git a/includes/installer/i18n/anp.json b/includes/installer/i18n/anp.json
new file mode 100644 (file)
index 0000000..a55ba75
--- /dev/null
@@ -0,0 +1,13 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Angpradesh"
+               ]
+       },
+       "config-desc": "मिडियाविकि लेली इंस्टॉलर",
+       "config-title": "मीडियाविकी  $1 इंस्टॉलेशन",
+       "config-information": "जानकारी",
+       "config-localsettings-upgrade": "<code>LocalSettings.php</code> फ़ाइल पैलऽ गेलै ।\nई स्थापना क॑ अपग्रेड करै लेली , नीचाँ देलऽ गेलऽ बॉक्स म॑ <code>$wgUpgradeKey</code>  के मान दर्ज करऽ।\nआपन॑ क॑ <code>LocalSettings.php</code> म॑ मिली जैतै ।",
+       "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> फ़ाइल पैलऽ गेलऽ छै ।\nई स्थापना क॑ अपग्रेड करै लेली , बदला म॑ कृपया करी क॑ ई चलाबऽ <code>update.php</code>",
+       "config-localsettings-key": "नवीनीकरण कुंजी"
+}
index b97cc96..e278714 100644 (file)
        "config-db-wiki-help": "Enter the username and password that will be used to connect to the database during normal wiki operation.\nIf the account does not exist, and the installation account has sufficient privileges, this user account will be created with the minimum privileges required to operate the wiki.",
        "config-db-prefix": "Database table prefix:",
        "config-db-prefix-help": "If you need to share one database between multiple wikis, or between MediaWiki and another web application, you may choose to add a prefix to all the table names to avoid conflicts.\nDo not use spaces.\n\nThis field is usually left empty.",
-       "config-db-charset": "Database character set",
-       "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
-       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-       "config-charset-mysql4": "MySQL 4.0 backwards-compatible UTF-8",
-       "config-charset-help": "<strong>Warning:</strong> If you use <strong>backwards-compatible UTF-8</strong> on MySQL 4.1+, and subsequently back up the database with <code>mysqldump</code>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!\n\nIn <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately,\nbut it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mysql-old": "MySQL $1 or later is required. You have $2.",
        "config-db-port": "Database port:",
        "config-db-schema": "Schema for MediaWiki:",
index 5e15c8d..813ab24 100644 (file)
@@ -12,7 +12,7 @@
        "config-localsettings-upgrade": "Un file <code>LocalSettings.php</code> ha essite detegite.\nPro actualisar iste installation, per favor entra le valor de <code>$wgUpgradeKey</code> in le quadro hic infra.\nIste se trova in <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Un file <code>LocalSettings.php</code> file ha essite detegite.\nPro actualisar iste installation, per favor executa <code>update.php</code>.",
        "config-localsettings-key": "Clave de actualisation:",
-       "config-localsettings-badkey": "Le clave que tu forniva es incorrecte",
+       "config-localsettings-badkey": "Le clave de actualisation fornite es incorrecte.",
        "config-upgrade-key-missing": "Un installation existente de MediaWiki ha essite detegite.\nPro actualisar iste installation, es necessari adjunger le sequente linea al fin del file <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Le file <code>LocalSettings.php</code> existente pare esser incomplete.\nLe variabile $1 non es definite.\nPer favor cambia <code>LocalSettings.php</code> de sorta que iste variabile es definite, e clicca \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "Un error ha essite incontrate durante le connexion al base de datos usante le configuration specificate in <code>LocalSettings.php</code>. Per favor corrige iste configuration e reproba.\n\n$1",
        "config-ctype": "'''Fatal''': PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
        "config-iconv": "<strong>Fatal:</strong> PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/iconv.installation.php extension iconv].",
        "config-json": "'''Fatal:''' PHP ha essite compilate sin supporto de JSON.\nTu debe installar le extension JSON de PHP o le extension [http://pecl.php.net/package/jsonc PECL jsonc] extension ante de installar MediaWiki.\n* Le extension de PHP es includite in Red Hat Enterprise Linux (CentOS) 5 e 6, ma debe esser activate in <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Alcun distributiones de Linux liberate post maio 2013 omitte iste extension de PHP, forniente in su loco le extension PECL como <code>php5-json</code> o <code>php-pecl-jsonc</code>.",
+       "config-mbstring-absent": "<strong>Fatal:</strong> PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/mbstring.setup.php extension mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] es installate",
        "config-apc": "[http://www.php.net/apc APC] es installate",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] es installate",
+       "config-no-cache-apcu": "<strong>Attention:</strong> Impossibile trovar [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nLe cache de objectos non es activate.",
        "config-mod-security": "'''Attention''': [http://modsecurity.org/ mod_security] es active in tu servitor web. Si mal configurate, isto pote causar problemas pro MediaWiki o altere software que permitte al usatores de publicar contento arbitrari.\nConsulta le [http://modsecurity.org/documentation/ documentation de mod_security] o contacta le servicio de adjuta de tu host si tu incontra estranie errores.",
        "config-diff3-bad": "GNU diff3 non trovate.",
        "config-git": "Systema de controlo de version Git trovate: <code>$1</code>",
        "config-ns-site-name": "Mesme nomine que le wiki: $1",
        "config-ns-other": "Altere (specifica)",
        "config-ns-other-default": "MiWiki",
-       "config-project-namespace-help": "Sequente le exemplo de Wikipedia, multe wikis tene lor paginas de politica separate de lor paginas de contento, in un \"'''spatio de nomines de projecto'''\".\nTote le titulos de pagina in iste spatio de nomines comencia con un certe prefixo, le qual tu pote specificar hic.\nTraditionalmente, iste prefixo deriva del nomine del wiki, ma illo non pote continer characteres de punctuation como \"#\" o \":\".",
+       "config-project-namespace-help": "Sequente le exemplo de Wikipedia, multe wikis tene lor paginas de politica separate de lor paginas de contento, in un '''spatio de nomines de projecto'''.\nTote le titulos de pagina in iste spatio de nomines comencia con un certe prefixo, le qual tu pote specificar hic.\nNormalmente, iste prefixo deriva del nomine del wiki, ma illo non pote continer characteres de punctuation como \"#\" o \":\".",
        "config-ns-invalid": "Le spatio de nomines specificate \"<nowiki>$1</nowiki>\" es invalide.\nSpecifica un altere spatio de nomines de projecto.",
        "config-ns-conflict": "Le spatio de nomines specificate \"<nowiki>$1</nowiki>\" conflige con un spatio de nomines predefinite de MediaWiki.\nSpecifica un altere spatio de nomines pro le projecto.",
        "config-admin-box": "Conto de administrator",
        "config-install-mainpage": "Crea pagina principal con contento predefinite",
        "config-install-extension-tables": "Creation de tabellas pro le extensiones activate",
        "config-install-mainpage-failed": "Non poteva inserer le pagina principal: $1",
-       "config-install-done": "'''Felicitationes!'''\nTu ha installate MediaWiki con successo.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, es possibile recomenciar le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n'''Nota''': Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
+       "config-install-done": "<strong>Felicitationes!</strong>\nTu ha installate MediaWiki.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, recomencia le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n<strong>Nota:</strong> Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote <strong>[$2 entrar in tu wiki]</strong>.",
        "config-download-localsettings": "Discargar <code>LocalSettings.php</code>",
        "config-help": "adjuta",
        "config-help-tooltip": "clicca pro displicar",
        "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
        "config-extension-link": "Sapeva tu que tu wiki supporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per category] o le [//www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
        "mainpagetext": "<strong>MediaWiki ha essite installate.</strong>",
-       "mainpagedocfooter": "Consulta le [//meta.wikimedia.org/wiki/Help:Contents Guida del usator] pro informationes super le uso del software wiki.\n\n== Pro initiar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de configurationes]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ a proposito de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducer MediaWiki in tu lingua]"
+       "mainpagedocfooter": "Consulta le [//meta.wikimedia.org/wiki/Help:Contents Guida del usator] pro information sur le uso del software wiki.\n\n== Pro initiar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de configurationes]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ a proposito de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducer MediaWiki in tu lingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Como combatter le spam in tu wiki]"
 }
index b16addd..7e7ceac 100644 (file)
@@ -64,6 +64,7 @@
        "config-ctype": "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för der [http://www.php.net/manual/en/ctype.installation.php <code lang=\"en\">Ctype</code> Zohsaz] övversaz woode sin.",
        "config-iconv": "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för der [http://www.php.net/manual/en/iconv.installation.php <code lang=\"en\">iconv</code> Zohsaz] övversaz woode sin.",
        "config-json": "'''Dä!:''' PHP wood der ohne <i lang=\"en\" xml:lang=\"en\">JSON</i> övversaz.\nJäz moß de äntweeder dä PHP-<i lang=\"en\" xml:lang=\"en\">JSON</i>-Zohsaz enschtallere udder der <i lang=\"en\" xml:lang=\"en\">[http://pecl.php.net/package/jsonc PECL jsonc]</i>-Zohsaz, ih dat de MedijaWikki enschtallere kanns.\n* Dä PHP-Zohsaz es em <i lang=\"en\" xml:lang=\"en\">Red Hat Enterprise Linux (CentOS)</i> 5 un 6 änthallde, moß ävver en de <code lang=\"en\" xml:lang=\"en\">/etc/php.ini</code> udder <code lang=\"en\" xml:lang=\"en\">/etc/php.d/json.ini</code> enjeschalldt wääde.\n* E paa Linux Destrebuzjohne lohß zigg_em Mai 2013 dä PHP-Zohsaz fott un packe doför der PECL-Zohsaz als <code lang=\"en\" xml:lang=\"en\">php5-json</code> udder <code lang=\"en\" xml:lang=\"en\">php-pecl-jsonc</code> med ein.",
+       "config-mbstring-absent": "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för singe Zohsaz [http://www.php.net/manual/en/mbstring.setup.php <code lang=\"en\">mbstring </code>] övversaz woode sin.",
        "config-xcache": "Dä <code lang=\"en\">[http://xcache.lighttpd.net/ XCache]</code> es ennjeresht.",
        "config-apc": "Dä <code lang=\"en\">[http://www.php.net/apc APC]</code> es ennjeresht.",
        "config-wincache": "Dä <code lang=\"en\">[http://www.iis.net/download/WinCacheForPhp WinCache]</code> es ennjeresht.",
index 7010be0..b2ff103 100644 (file)
        "config-db-wiki-help": "Help text for database user information.",
        "config-db-prefix": "Field label for database prefix (a piece of text that all tables for a MediaWiki instance are prefixed with).",
        "config-db-prefix-help": "Help text for database prefix form field.",
-       "config-db-charset": "Fieldset label for MySQL database character set choice.",
-       "config-charset-mysql5-binary": "Option for MySQL database character set choice.",
-       "config-charset-mysql5": "Option for MySQL database character set choice.",
-       "config-charset-mysql4": "Option for MySQL database character set choice.",
-       "config-charset-help": "Help text for database character set.",
        "config-mysql-old": "Used as error message. Parameters:\n* $1 - minimum version\n* $2 - the version of MySQL that has been installed\n{{Related|Config-old}}",
        "config-db-port": "Field label in MediaWiki installer for database port.",
        "config-db-schema": "Field label in MediaWiki installer for database schema.",
index a899133..a71988e 100644 (file)
@@ -1,5 +1,47 @@
 {
-       "@metadata": [],
-       "mainpagetext": "'''ಮೀಡಿಯವಿಕಿ ಯಶಸ್ವಿಯಾದ್ ಇನ್’ಸ್ಟಾಲ್ ಆಂಡ್.'''",
+       "@metadata": {
+               "authors": [
+                       "VASANTH S.N."
+               ]
+       },
+       "config-title": "ಮೀಡಿಯಾವಿಕಿ ಆವೃತ್ತಿ $1 ರ ಅನುಸ್ಥಾಪನೆ",
+       "config-information": "ಮಾಹಿತಿ",
+       "config-localsettings-key": "ಉನ್ನತೀಕರಣ ಕೀಲಿ",
+       "config-session-error": "ಅವಧಿ ಪ್ರಾರಂಭದ ದೋಷ: $1",
+       "config-your-language": "ಇರೆನಾ ಬಾಸೆ",
+       "config-wiki-language": "ವಿಕಿ ಭಾಷೆ:",
+       "config-back": "← ಪಿರ",
+       "config-continue": "ಮುಂದುವರೆಸಾಲೆ →",
+       "config-page-language": "ಭಾಸೆ",
+       "config-page-welcome": "ಮಾಧ್ಯಮವಿಕಿಗ್ ಸ್ವಾಗತ",
+       "config-page-dbconnect": "ದತ್ತಾಂಶಸಂಚಯಗ್ ಸಂಪರ್ಕಕೊರ್ಲೆ",
+       "config-page-name": "ಪುದರ್",
+       "config-page-options": "ಆಯ್ಕೆಲು",
+       "config-page-install": "ಸ್ಥಾಪಿಸಾಲೆ",
+       "config-page-complete": "ಪೂರ್ಣ!",
+       "config-page-readme": "ಎನನ್ ಓದುಲೇ",
+       "config-page-releasenotes": "ಬುಡುಗೊಡೆದ ಟಿಪ್ಪಣಿಲು",
+       "config-page-copying": "ನಕಲ್ ಮಲ್ತೊಂದುಂಡು",
+       "config-page-upgradedoc": "ಪರಿಷ್ಕರಣೆ ಆವೊಂದುಂಡು",
+       "config-page-existingwiki": "ಪ್ರಸ್ತುತ ವಿಕಿ",
+       "config-restart": "ಸರಿ,ಕುಡ ಪ್ರಾರಂಭ ಮಲ್ಪುಲೆ",
+       "config-db-type": "ದತ್ತಾಂಶಸಂಚಯ ಮಾದರಿ:",
+       "config-db-host-oracle": "ದತ್ತಾಂಶಸಂಚಯ TNS:",
+       "config-db-wiki-settings": "ಈ ವಿಕಿಯನ್ನು ಗುರುತಿಸಾಲೆ",
+       "config-db-name": "ದತ್ತಾಂಶಸಂಚಯ ಪುದರ್:",
+       "config-db-username": "ದತ್ತಾಂಶಸಂಚಯ ಪುದರ್:",
+       "config-db-password": "ದತ್ತಾಂಶಸಂಚಯ ಪ್ರವೇಶಪದ:",
+       "config-ns-generic": "ಯೋಜನೆ",
+       "config-admin-password": "ಪ್ರವೇಶ ಪದೊ",
+       "config-admin-password-confirm": "ಪುನಃ ಪ್ರವೇಶ ಪದೊ:",
+       "config-admin-password-mismatch": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
+       "config-admin-email": "ಇ-ಅಂಚೆ ವಿಳಾಸೊ",
+       "config-license": "ಕೃತಿಸ್ವಾಮ್ಯ ಬೊಕ್ಕ ಪರವಾನಗಿ:",
+       "config-license-pd": "ಸಾರ್ವಜನಿಕೊ ಕ್ಷೇತ್ರೊ",
+       "config-extensions": "ವಿಸ್ತರಣೆಲು",
+       "config-install-step-failed": "ವಿಫಲವಾತ್‍ಂಡ್",
+       "config-install-extensions": "ವಿಸ್ತರಣೆಲೆನ್ ಸೇರಾದ್",
+       "config-help": "ಸಹಾಯೊ",
+       "mainpagetext": "'''ಮೀಡಿಯವಿಕಿ ಯಶಸ್ವಿಯಾದ್ ಸ್ಥಾಪನೆ ಆಂಡ್.'''",
        "mainpagedocfooter": "ವಿಕಿ ತಂತ್ರಾಂಶನ್ ಉಪಗೋಗ ಮನ್ಪುನ ಬಗ್ಗೆ ಮಾಹಿತಿಗ್ [//meta.wikimedia.org/wiki/Help:Contents ಸದಸ್ಯೆರ್ನ ನಿರ್ದೇಶನ ಪುಟ] ತೂಲೆ.\n\n== ಎಂಚ ಶುರು ಮಲ್ಪುನಿ ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
 }
diff --git a/includes/interwiki/ClassicInterwikiLookup.php b/includes/interwiki/ClassicInterwikiLookup.php
new file mode 100644 (file)
index 0000000..6ac165a
--- /dev/null
@@ -0,0 +1,453 @@
+<?php
+namespace MediaWiki\Interwiki;
+
+/**
+ * InterwikiLookup implementing the "classic" interwiki storage (hardcoded up to MW 1.26).
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+use \Cdb\Exception as CdbException;
+use \Cdb\Reader as CdbReader;
+use Database;
+use Hooks;
+use Interwiki;
+use Language;
+use MapCacheLRU;
+use WANObjectCache;
+
+/**
+ * InterwikiLookup implementing the "classic" interwiki storage (hardcoded up to MW 1.26).
+ *
+ * This implements two levels of caching (in-process array and a WANObjectCache)
+ * and tree storage backends (SQL, CDB, and plain PHP arrays).
+ *
+ * All information is loaded on creation when called by $this->fetch( $prefix ).
+ * All work is done on slave, because this should *never* change (except during
+ * schema updates etc, which aren't wiki-related)
+ *
+ * @since 1.28
+ */
+class ClassicInterwikiLookup implements InterwikiLookup {
+
+       /**
+        * @var MapCacheLRU
+        */
+       private $localCache;
+
+       /**
+        * @var Language
+        */
+       private $contentLanguage;
+
+       /**
+        * @var WANObjectCache
+        */
+       private $objectCache;
+
+       /**
+        * @var int
+        */
+       private $objectCacheExpiry;
+
+       /**
+        * @var bool|array|string
+        */
+       private $cdbData;
+
+       /**
+        * @var int
+        */
+       private $interwikiScopes;
+
+       /**
+        * @var string
+        */
+       private $fallbackSite;
+
+       /**
+        * @var CdbReader|null
+        */
+       private $cdbReader = null;
+
+       /**
+        * @var string|null
+        */
+       private $thisSite = null;
+
+       /**
+        * @param Language $contentLanguage 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
+        *        an array resembling the contents of a CDB file,
+        *        or false to use the database.
+        * @param int $interwikiScopes Specify number of domains to check for messages:
+        *    - 1: Just local wiki level
+        *    - 2: wiki and global levels
+        *    - 3: site level as well as wiki and global levels
+        * @param string $fallbackSite The code to assume for the local site,
+        */
+       function __construct(
+               Language $contentLanguage,
+               WANObjectCache $objectCache,
+               $objectCacheExpiry,
+               $cdbData,
+               $interwikiScopes,
+               $fallbackSite
+       ) {
+               $this->localCache = new MapCacheLRU( 100 );
+
+               $this->contentLanguage = $contentLanguage;
+               $this->objectCache = $objectCache;
+               $this->objectCacheExpiry = $objectCacheExpiry;
+               $this->cdbData = $cdbData;
+               $this->interwikiScopes = $interwikiScopes;
+               $this->fallbackSite = $fallbackSite;
+       }
+
+       /**
+        * Check whether an interwiki prefix exists
+        *
+        * @param string $prefix Interwiki prefix to use
+        * @return bool Whether it exists
+        */
+       public function isValidInterwiki( $prefix ) {
+               $result = $this->fetch( $prefix );
+
+               return (bool)$result;
+       }
+
+       /**
+        * Fetch an Interwiki object
+        *
+        * @param string $prefix Interwiki prefix to use
+        * @return Interwiki|null|bool
+        */
+       public function fetch( $prefix ) {
+               if ( $prefix == '' ) {
+                       return null;
+               }
+
+               $prefix = $this->contentLanguage->lc( $prefix );
+               if ( $this->localCache->has( $prefix ) ) {
+                       return $this->localCache->get( $prefix );
+               }
+
+               if ( $this->cdbData ) {
+                       $iw = $this->getInterwikiCached( $prefix );
+               } else {
+                       $iw = $this->load( $prefix );
+                       if ( !$iw ) {
+                               $iw = false;
+                       }
+               }
+               $this->localCache->set( $prefix, $iw );
+
+               return $iw;
+       }
+
+       /**
+        * Resets locally cached Interwiki objects. This is intended for use during testing only.
+        * This does not invalidate entries in the persistent cache, as invalidateCache() does.
+        * @since 1.27
+        */
+       public function resetLocalCache() {
+               $this->localCache->clear();
+       }
+
+       /**
+        * Purge the in-process and object cache for an interwiki prefix
+        * @param string $prefix
+        */
+       public function invalidateCache( $prefix ) {
+               $this->localCache->clear( $prefix );
+
+               $key = $this->objectCache->makeKey( 'interwiki', $prefix );
+               $this->objectCache->delete( $key );
+       }
+
+       /**
+        * Fetch interwiki prefix data from local cache in constant database.
+        *
+        * @note More logic is explained in DefaultSettings.
+        *
+        * @param string $prefix Interwiki prefix
+        * @return Interwiki
+        */
+       private function getInterwikiCached( $prefix ) {
+               $value = $this->getInterwikiCacheEntry( $prefix );
+
+               if ( $value ) {
+                       // Split values
+                       list( $local, $url ) = explode( ' ', $value, 2 );
+                       return new Interwiki( $prefix, $url, '', '', (int)$local );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Get entry from interwiki cache
+        *
+        * @note More logic is explained in DefaultSettings.
+        *
+        * @param string $prefix Database key
+        * @return bool|string The interwiki entry or false if not found
+        */
+       private function getInterwikiCacheEntry( $prefix ) {
+               wfDebug( __METHOD__ . "( $prefix )\n" );
+               $value = false;
+               try {
+                       // Resolve site name
+                       if ( $this->interwikiScopes >= 3 && !$this->thisSite ) {
+                               $this->thisSite = $this->getCacheValue( '__sites:' . wfWikiID() );
+                               if ( $this->thisSite == '' ) {
+                                       $this->thisSite = $this->fallbackSite;
+                               }
+                       }
+
+                       $value = $this->getCacheValue( wfMemcKey( $prefix ) );
+                       // Site level
+                       if ( $value == '' && $this->interwikiScopes >= 3 ) {
+                               $value = $this->getCacheValue( "_{$this->thisSite}:{$prefix}" );
+                       }
+                       // Global Level
+                       if ( $value == '' && $this->interwikiScopes >= 2 ) {
+                               $value = $this->getCacheValue( "__global:{$prefix}" );
+                       }
+                       if ( $value == 'undef' ) {
+                               $value = '';
+                       }
+               } catch ( CdbException $e ) {
+                       wfDebug( __METHOD__ . ": CdbException caught, error message was "
+                               . $e->getMessage() );
+               }
+
+               return $value;
+       }
+
+       private function getCacheValue( $key ) {
+               if ( $this->cdbReader === null ) {
+                       if ( is_string( $this->cdbData ) ) {
+                               $this->cdbReader = \Cdb\Reader::open( $this->cdbData );
+                       } elseif ( is_array( $this->cdbData ) ) {
+                               $this->cdbReader = new \Cdb\Reader\Hash( $this->cdbData );
+                       } else {
+                               $this->cdbReader = false;
+                       }
+               }
+
+               if ( $this->cdbReader ) {
+                       return $this->cdbReader->get( $key );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Load the interwiki, trying first memcached then the DB
+        *
+        * @param string $prefix The interwiki prefix
+        * @return Interwiki|bool Interwiki if $prefix is valid, otherwise false
+        */
+       private function load( $prefix ) {
+               $iwData = [];
+               if ( !Hooks::run( 'InterwikiLoadPrefix', [ $prefix, &$iwData ] ) ) {
+                       return $this->loadFromArray( $iwData );
+               }
+
+               if ( is_array( $iwData ) ) {
+                       $iw = $this->loadFromArray( $iwData );
+                       if ( $iw ) {
+                               return $iw; // handled by hook
+                       }
+               }
+
+               $iwData = $this->objectCache->getWithSetCallback(
+                       $this->objectCache->makeKey( 'interwiki', $prefix ),
+                       $this->objectCacheExpiry,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $prefix ) {
+                               $dbr = wfGetDB( DB_SLAVE ); // TODO: inject LoadBalancer
+
+                               $setOpts += Database::getCacheSetOptions( $dbr );
+
+                               $row = $dbr->selectRow(
+                                       'interwiki',
+                                       ClassicInterwikiLookup::selectFields(),
+                                       [ 'iw_prefix' => $prefix ],
+                                       __METHOD__
+                               );
+
+                               return $row ? (array)$row : '!NONEXISTENT';
+                       }
+               );
+
+               if ( is_array( $iwData ) ) {
+                       return $this->loadFromArray( $iwData ) ?: false;
+               }
+
+               return false;
+       }
+
+       /**
+        * Fill in member variables from an array (e.g. memcached result, Database::fetchRow, etc)
+        *
+        * @param array $mc Associative array: row from the interwiki table
+        * @return Interwiki|bool Interwiki object or false if $mc['iw_url'] is not set
+        */
+       private function loadFromArray( $mc ) {
+               if ( isset( $mc['iw_url'] ) ) {
+                       $url = $mc['iw_url'];
+                       $local = isset( $mc['iw_local'] ) ? $mc['iw_local'] : 0;
+                       $trans = isset( $mc['iw_trans'] ) ? $mc['iw_trans'] : 0;
+                       $api = isset( $mc['iw_api'] ) ? $mc['iw_api'] : '';
+                       $wikiId = isset( $mc['iw_wikiid'] ) ? $mc['iw_wikiid'] : '';
+
+                       return new Interwiki( null, $url, $api, $wikiId, $local, $trans );
+               }
+
+               return false;
+       }
+
+       /**
+        * Fetch all interwiki prefixes from interwiki cache
+        *
+        * @param null|string $local If not null, limits output to local/non-local interwikis
+        * @return array List of prefixes, where each row is an associative array
+        */
+       private function getAllPrefixesCached( $local ) {
+               wfDebug( __METHOD__ . "()\n" );
+               $data = [];
+               try {
+                       /* Resolve site name */
+                       if ( $this->interwikiScopes >= 3 && !$this->thisSite ) {
+                               $site = $this->getCacheValue( '__sites:' . wfWikiID() );
+
+                               if ( $site == '' ) {
+                                       $this->thisSite = $this->fallbackSite;
+                               } else {
+                                       $this->thisSite = $site;
+                               }
+                       }
+
+                       // List of interwiki sources
+                       $sources = [];
+                       // Global Level
+                       if ( $this->interwikiScopes >= 2 ) {
+                               $sources[] = '__global';
+                       }
+                       // Site level
+                       if ( $this->interwikiScopes >= 3 ) {
+                               $sources[] = '_' . $this->thisSite;
+                       }
+                       $sources[] = wfWikiID();
+
+                       foreach ( $sources as $source ) {
+                               $list = $this->getCacheValue( '__list:' . $source );
+                               foreach ( explode( ' ', $list ) as $iw_prefix ) {
+                                       $row = $this->getCacheValue( "{$source}:{$iw_prefix}" );
+                                       if ( !$row ) {
+                                               continue;
+                                       }
+
+                                       list( $iw_local, $iw_url ) = explode( ' ', $row );
+
+                                       if ( $local !== null && $local != $iw_local ) {
+                                               continue;
+                                       }
+
+                                       $data[$iw_prefix] = [
+                                               'iw_prefix' => $iw_prefix,
+                                               'iw_url' => $iw_url,
+                                               'iw_local' => $iw_local,
+                                       ];
+                               }
+                       }
+               } catch ( CdbException $e ) {
+                       wfDebug( __METHOD__ . ": CdbException caught, error message was "
+                               . $e->getMessage() );
+               }
+
+               ksort( $data );
+
+               return array_values( $data );
+       }
+
+       /**
+        * Fetch all interwiki prefixes from DB
+        *
+        * @param string|null $local If not null, limits output to local/non-local interwikis
+        * @return array[] Interwiki rows
+        */
+       private function getAllPrefixesDB( $local ) {
+               $db = wfGetDB( DB_SLAVE ); // TODO: inject DB LoadBalancer
+
+               $where = [];
+
+               if ( $local !== null ) {
+                       if ( $local == 1 ) {
+                               $where['iw_local'] = 1;
+                       } elseif ( $local == 0 ) {
+                               $where['iw_local'] = 0;
+                       }
+               }
+
+               $res = $db->select( 'interwiki',
+                       $this->selectFields(),
+                       $where, __METHOD__, [ 'ORDER BY' => 'iw_prefix' ]
+               );
+
+               $retval = [];
+               foreach ( $res as $row ) {
+                       $retval[] = (array)$row;
+               }
+
+               return $retval;
+       }
+
+       /**
+        * Returns all interwiki prefixes
+        *
+        * @param string|null $local If set, limits output to local/non-local interwikis
+        * @return array[] Interwiki rows, where each row is an associative array
+        */
+       public function getAllPrefixes( $local = null ) {
+               if ( $this->cdbData ) {
+                       return $this->getAllPrefixesCached( $local );
+               }
+
+               return $this->getAllPrefixesDB( $local );
+       }
+
+       /**
+        * Return the list of interwiki fields that should be selected to create
+        * a new Interwiki object.
+        * @return string[]
+        */
+       private static function selectFields() {
+               return [
+                       'iw_prefix',
+                       'iw_url',
+                       'iw_api',
+                       'iw_wikiid',
+                       'iw_local',
+                       'iw_trans'
+               ];
+       }
+
+}
index 5a0dd36..558e32c 100644 (file)
  *
  * @file
  */
-use \Cdb\Exception as CdbException;
-use \Cdb\Reader as CdbReader;
+use MediaWiki\MediaWikiServices;
 
 /**
- * The interwiki class
- * All information is loaded on creation when called by Interwiki::fetch( $prefix ).
- * All work is done on slave, because this should *never* change (except during
- * schema updates etc, which aren't wiki-related)
+ * Value object for representing interwiki records.
  */
 class Interwiki {
-       // Cache - removes oldest entry when it hits limit
-       protected static $smCache = [];
-       const CACHE_LIMIT = 100; // 0 means unlimited, any other value is max number of entries.
 
        /** @var string The interwiki prefix, (e.g. "Meatball", or the language prefix "de") */
        protected $mPrefix;
@@ -67,335 +60,48 @@ class Interwiki {
        /**
         * Check whether an interwiki prefix exists
         *
+        * @deprecated since 1.28, use InterwikiLookup instead
+        *
         * @param string $prefix Interwiki prefix to use
         * @return bool Whether it exists
         */
        public static function isValidInterwiki( $prefix ) {
-               $result = self::fetch( $prefix );
-
-               return (bool)$result;
+               return MediaWikiServices::getInstance()->getInterwikiLookup()->isValidInterwiki( $prefix );
        }
 
        /**
         * Fetch an Interwiki object
         *
+        * @deprecated since 1.28, use InterwikiLookup instead
+        *
         * @param string $prefix Interwiki prefix to use
         * @return Interwiki|null|bool
         */
        public static function fetch( $prefix ) {
-               global $wgContLang;
-
-               if ( $prefix == '' ) {
-                       return null;
-               }
-
-               $prefix = $wgContLang->lc( $prefix );
-               if ( isset( self::$smCache[$prefix] ) ) {
-                       return self::$smCache[$prefix];
-               }
-
-               global $wgInterwikiCache;
-               if ( $wgInterwikiCache ) {
-                       $iw = Interwiki::getInterwikiCached( $prefix );
-               } else {
-                       $iw = Interwiki::load( $prefix );
-                       if ( !$iw ) {
-                               $iw = false;
-                       }
-               }
-
-               if ( self::CACHE_LIMIT && count( self::$smCache ) >= self::CACHE_LIMIT ) {
-                       reset( self::$smCache );
-                       unset( self::$smCache[key( self::$smCache )] );
-               }
-
-               self::$smCache[$prefix] = $iw;
-
-               return $iw;
-       }
-
-       /**
-        * Resets locally cached Interwiki objects. This is intended for use during testing only.
-        * This does not invalidate entries in the persistent cache, as invalidateCache() does.
-        * @since 1.27
-        */
-       public static function resetLocalCache() {
-               static::$smCache = [];
+               return MediaWikiServices::getInstance()->getInterwikiLookup()->fetch( $prefix );
        }
 
        /**
         * Purge the cache (local and persistent) for an interwiki prefix.
+        *
         * @param string $prefix
         * @since 1.26
         */
        public static function invalidateCache( $prefix ) {
-               $cache = ObjectCache::getMainWANInstance();
-               $key = wfMemcKey( 'interwiki', $prefix );
-               $cache->delete( $key );
-               unset( static::$smCache[$prefix] );
-       }
-
-       /**
-        * Fetch interwiki prefix data from local cache in constant database.
-        *
-        * @note More logic is explained in DefaultSettings.
-        *
-        * @param string $prefix Interwiki prefix
-        * @return Interwiki
-        */
-       protected static function getInterwikiCached( $prefix ) {
-               $value = self::getInterwikiCacheEntry( $prefix );
-
-               $s = new Interwiki( $prefix );
-               if ( $value ) {
-                       // Split values
-                       list( $local, $url ) = explode( ' ', $value, 2 );
-                       $s->mURL = $url;
-                       $s->mLocal = (bool)$local;
-               } else {
-                       $s = false;
-               }
-
-               return $s;
-       }
-
-       /**
-        * Get entry from interwiki cache
-        *
-        * @note More logic is explained in DefaultSettings.
-        *
-        * @param string $prefix Database key
-        * @return bool|string The interwiki entry or false if not found
-        */
-       protected static function getInterwikiCacheEntry( $prefix ) {
-               global $wgInterwikiScopes, $wgInterwikiFallbackSite;
-               static $site;
-
-               $value = false;
-               try {
-                       // Resolve site name
-                       if ( $wgInterwikiScopes >= 3 && !$site ) {
-                               $site = self::getCacheValue( '__sites:' . wfWikiID() );
-                               if ( $site == '' ) {
-                                       $site = $wgInterwikiFallbackSite;
-                               }
-                       }
-
-                       $value = self::getCacheValue( wfMemcKey( $prefix ) );
-                       // Site level
-                       if ( $value == '' && $wgInterwikiScopes >= 3 ) {
-                               $value = self::getCacheValue( "_{$site}:{$prefix}" );
-                       }
-                       // Global Level
-                       if ( $value == '' && $wgInterwikiScopes >= 2 ) {
-                               $value = self::getCacheValue( "__global:{$prefix}" );
-                       }
-                       if ( $value == 'undef' ) {
-                               $value = '';
-                       }
-               } catch ( CdbException $e ) {
-                       wfDebug( __METHOD__ . ": CdbException caught, error message was "
-                               . $e->getMessage() );
-               }
-
-               return $value;
-       }
-
-       private static function getCacheValue( $key ) {
-               global $wgInterwikiCache;
-               static $reader;
-               if ( $reader === null ) {
-                       $reader = is_array( $wgInterwikiCache ) ? false : CdbReader::open( $wgInterwikiCache );
-               }
-               if ( $reader ) {
-                       return $reader->get( $key );
-               } else {
-                       return isset( $wgInterwikiCache[$key] ) ? $wgInterwikiCache[$key] : false;
-               }
-       }
-
-       /**
-        * Load the interwiki, trying first memcached then the DB
-        *
-        * @param string $prefix The interwiki prefix
-        * @return Interwiki|bool Interwiki if $prefix is valid, otherwise false
-        */
-       protected static function load( $prefix ) {
-               global $wgInterwikiExpiry;
-
-               $iwData = [];
-               if ( !Hooks::run( 'InterwikiLoadPrefix', [ $prefix, &$iwData ] ) ) {
-                       return Interwiki::loadFromArray( $iwData );
-               }
-
-               if ( is_array( $iwData ) ) {
-                       $iw = Interwiki::loadFromArray( $iwData );
-                       if ( $iw ) {
-                               return $iw; // handled by hook
-                       }
-               }
-
-               $iwData = ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       wfMemcKey( 'interwiki', $prefix ),
-                       $wgInterwikiExpiry,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $prefix ) {
-                               $dbr = wfGetDB( DB_SLAVE );
-
-                               $setOpts += Database::getCacheSetOptions( $dbr );
-
-                               $row = $dbr->selectRow(
-                                       'interwiki',
-                                       Interwiki::selectFields(),
-                                       [ 'iw_prefix' => $prefix ],
-                                       __METHOD__
-                               );
-
-                               return $row ? (array)$row : '!NONEXISTENT';
-                       }
-               );
-
-               if ( is_array( $iwData ) ) {
-                       return Interwiki::loadFromArray( $iwData ) ?: false;
-               }
-
-               return false;
-       }
-
-       /**
-        * Fill in member variables from an array (e.g. memcached result, Database::fetchRow, etc)
-        *
-        * @param array $mc Associative array: row from the interwiki table
-        * @return Interwiki|bool Interwiki object or false if $mc['iw_url'] is not set
-        */
-       protected static function loadFromArray( $mc ) {
-               if ( isset( $mc['iw_url'] ) ) {
-                       $iw = new Interwiki();
-                       $iw->mURL = $mc['iw_url'];
-                       $iw->mLocal = isset( $mc['iw_local'] ) ? (bool)$mc['iw_local'] : false;
-                       $iw->mTrans = isset( $mc['iw_trans'] ) ? (bool)$mc['iw_trans'] : false;
-                       $iw->mAPI = isset( $mc['iw_api'] ) ? $mc['iw_api'] : '';
-                       $iw->mWikiID = isset( $mc['iw_wikiid'] ) ? $mc['iw_wikiid'] : '';
-
-                       return $iw;
-               }
-
-               return false;
-       }
-
-       /**
-        * Fetch all interwiki prefixes from interwiki cache
-        *
-        * @param null|string $local If not null, limits output to local/non-local interwikis
-        * @return array List of prefixes
-        * @since 1.19
-        */
-       protected static function getAllPrefixesCached( $local ) {
-               global $wgInterwikiScopes, $wgInterwikiFallbackSite;
-               static $site;
-
-               wfDebug( __METHOD__ . "()\n" );
-               $data = [];
-               try {
-                       /* Resolve site name */
-                       if ( $wgInterwikiScopes >= 3 && !$site ) {
-                               $site = self::getCacheValue( '__sites:' . wfWikiID() );
-
-                               if ( $site == '' ) {
-                                       $site = $wgInterwikiFallbackSite;
-                               }
-                       }
-
-                       // List of interwiki sources
-                       $sources = [];
-                       // Global Level
-                       if ( $wgInterwikiScopes >= 2 ) {
-                               $sources[] = '__global';
-                       }
-                       // Site level
-                       if ( $wgInterwikiScopes >= 3 ) {
-                               $sources[] = '_' . $site;
-                       }
-                       $sources[] = wfWikiID();
-
-                       foreach ( $sources as $source ) {
-                               $list = self::getCacheValue( '__list:' . $source );
-                               foreach ( explode( ' ', $list ) as $iw_prefix ) {
-                                       $row = self::getCacheValue( "{$source}:{$iw_prefix}" );
-                                       if ( !$row ) {
-                                               continue;
-                                       }
-
-                                       list( $iw_local, $iw_url ) = explode( ' ', $row );
-
-                                       if ( $local !== null && $local != $iw_local ) {
-                                               continue;
-                                       }
-
-                                       $data[$iw_prefix] = [
-                                               'iw_prefix' => $iw_prefix,
-                                               'iw_url' => $iw_url,
-                                               'iw_local' => $iw_local,
-                                       ];
-                               }
-                       }
-               } catch ( CdbException $e ) {
-                       wfDebug( __METHOD__ . ": CdbException caught, error message was "
-                               . $e->getMessage() );
-               }
-
-               ksort( $data );
-
-               return array_values( $data );
-       }
-
-       /**
-        * Fetch all interwiki prefixes from DB
-        *
-        * @param string|null $local If not null, limits output to local/non-local interwikis
-        * @return array List of prefixes
-        * @since 1.19
-        */
-       protected static function getAllPrefixesDB( $local ) {
-               $db = wfGetDB( DB_SLAVE );
-
-               $where = [];
-
-               if ( $local !== null ) {
-                       if ( $local == 1 ) {
-                               $where['iw_local'] = 1;
-                       } elseif ( $local == 0 ) {
-                               $where['iw_local'] = 0;
-                       }
-               }
-
-               $res = $db->select( 'interwiki',
-                       self::selectFields(),
-                       $where, __METHOD__, [ 'ORDER BY' => 'iw_prefix' ]
-               );
-
-               $retval = [];
-               foreach ( $res as $row ) {
-                       $retval[] = (array)$row;
-               }
-
-               return $retval;
+               return MediaWikiServices::getInstance()->getInterwikiLookup()->invalidateCache( $prefix );
        }
 
        /**
         * Returns all interwiki prefixes
         *
+        * @deprecated since 1.28, unused. Use InterwikiLookup instead.
+        *
         * @param string|null $local If set, limits output to local/non-local interwikis
         * @return array List of prefixes
         * @since 1.19
         */
        public static function getAllPrefixes( $local = null ) {
-               global $wgInterwikiCache;
-
-               if ( $wgInterwikiCache ) {
-                       return self::getAllPrefixesCached( $local );
-               }
-
-               return self::getAllPrefixesDB( $local );
+               return MediaWikiServices::getInstance()->getInterwikiLookup()->getAllPrefixes( $local );
        }
 
        /**
@@ -476,19 +182,4 @@ class Interwiki {
                return !$msg->exists() ? '' : $msg->text();
        }
 
-       /**
-        * Return the list of interwiki fields that should be selected to create
-        * a new Interwiki object.
-        * @return string[]
-        */
-       public static function selectFields() {
-               return [
-                       'iw_prefix',
-                       'iw_url',
-                       'iw_api',
-                       'iw_wikiid',
-                       'iw_local',
-                       'iw_trans'
-               ];
-       }
 }
diff --git a/includes/interwiki/InterwikiLookup.php b/includes/interwiki/InterwikiLookup.php
new file mode 100644 (file)
index 0000000..459910a
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+namespace MediaWiki\Interwiki;
+
+/**
+ * Service interface for looking up Interwiki records.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+use Interwiki;
+
+/**
+ * Service interface for looking up Interwiki records.
+ *
+ * @singe 1.28
+ */
+interface InterwikiLookup {
+
+       /**
+        * Check whether an interwiki prefix exists
+        *
+        * @param string $prefix Interwiki prefix to use
+        * @return bool Whether it exists
+        */
+       public function isValidInterwiki( $prefix );
+
+       /**
+        * Fetch an Interwiki object
+        *
+        * @param string $prefix Interwiki prefix to use
+        * @return Interwiki|null|bool
+        */
+       public function fetch( $prefix );
+
+       /**
+        * Returns all interwiki prefixes
+        *
+        * @param string|null $local If set, limits output to local/non-local interwikis
+        * @return string[] List of prefixes
+        */
+       public function getAllPrefixes( $local = null );
+
+       /**
+        * Purge the in-process and persistent object cache for an interwiki prefix
+        * @param string $prefix
+        */
+       public function invalidateCache( $prefix );
+
+}
index bf46ce1..dd22d91 100644 (file)
@@ -252,10 +252,12 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        abstract public function delete( $key );
 
        /**
-        * Merge changes into the existing cache value (possibly creating a new one).
+        * Merge changes into the existing cache value (possibly creating a new one)
+        *
         * The callback function returns the new value given the current value
         * (which will be false if not present), and takes the arguments:
-        * (this BagOStuff, cache key, current value).
+        * (this BagOStuff, cache key, current value, TTL).
+        * The TTL parameter is reference set to $exptime. It can be overriden in the callback.
         *
         * @param string $key
         * @param callable $callback Callback method to be executed
@@ -296,7 +298,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                        }
 
                        // Derive the new value from the old value
-                       $value = call_user_func( $callback, $this, $key, $currentValue );
+                       $value = call_user_func( $callback, $this, $key, $currentValue, $exptime );
 
                        $this->clearLastError();
                        if ( $value === false ) {
@@ -355,7 +357,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                        $success = false;
                } else {
                        // Derive the new value from the old value
-                       $value = call_user_func( $callback, $this, $key, $currentValue );
+                       $value = call_user_func( $callback, $this, $key, $currentValue, $exptime );
                        if ( $value === false ) {
                                $success = true; // do nothing
                        } else {
index da48e00..dbd97a7 100644 (file)
@@ -28,6 +28,7 @@ interface LinkTarget {
 
        /**
         * Get the namespace index.
+        * @since 1.27
         *
         * @return int Namespace index
         */
@@ -35,6 +36,7 @@ interface LinkTarget {
 
        /**
         * Convenience function to test if it is in the namespace
+        * @since 1.27
         *
         * @param int $ns
         * @return bool
@@ -43,6 +45,7 @@ interface LinkTarget {
 
        /**
         * Get the link fragment (i.e. the bit after the #) in text form.
+        * @since 1.27
         *
         * @return string link fragment
         */
@@ -50,6 +53,7 @@ interface LinkTarget {
 
        /**
         * Whether the link target has a fragment
+        * @since 1.27
         *
         * @return bool
         */
@@ -57,6 +61,7 @@ interface LinkTarget {
 
        /**
         * Get the main part with underscores.
+        * @since 1.27
         *
         * @return string Main part of the link, with underscores (for use in href attributes)
         */
@@ -64,8 +69,8 @@ interface LinkTarget {
 
        /**
         * Returns the link in text form, without namespace prefix or fragment.
-        *
         * This is computed from the DB key by replacing any underscores with spaces.
+        * @since 1.27
         *
         * @return string
         */
@@ -75,6 +80,7 @@ interface LinkTarget {
         * Creates a new LinkTarget for a different fragment of the same page.
         * It is expected that the same type of object will be returned, but the
         * only requirement is that it is a LinkTarget.
+        * @since 1.27
         *
         * @param string $fragment The fragment name, or "" for the entire page.
         *
@@ -84,6 +90,7 @@ interface LinkTarget {
 
        /**
         * Whether this LinkTarget has an interwiki component
+        * @since 1.27
         *
         * @return bool
         */
@@ -91,6 +98,7 @@ interface LinkTarget {
 
        /**
         * The interwiki component of this LinkTarget
+        * @since 1.27
         *
         * @return string
         */
index da5527e..f29c9e4 100644 (file)
@@ -553,6 +553,7 @@ class LogEventsList extends ContextSource {
         * - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
         * - useRequestParams boolean Set true to use Pager-related parameters in the WebRequest
         * - useMaster boolean Use master DB
+        * - extraUrlParams array|bool Additional url parameters for "full log" link (if it is shown)
         * @return int Number of total log items (not limited by $lim)
         */
        public static function showLogExtract(
@@ -567,6 +568,7 @@ class LogEventsList extends ContextSource {
                        'flags' => 0,
                        'useRequestParams' => false,
                        'useMaster' => false,
+                       'extraUrlParams' => false,
                ];
                # The + operator appends elements of remaining keys from the right
                # handed array to the left handed, whereas duplicated keys are NOT overwritten.
@@ -578,6 +580,8 @@ class LogEventsList extends ContextSource {
                $msgKey = $param['msgKey'];
                $wrap = $param['wrap'];
                $flags = $param['flags'];
+               $extraUrlParams = $param['extraUrlParams'];
+
                $useRequestParams = $param['useRequestParams'];
                if ( !is_array( $msgKey ) ) {
                        $msgKey = [ $msgKey ];
@@ -664,7 +668,11 @@ class LogEventsList extends ContextSource {
                                $urlParam['type'] = $types[0];
                        }
 
-                       $s .= Linker::link(
+                       if ( $extraUrlParams !== false ) {
+                               $urlParam = array_merge( $urlParam, $extraUrlParams );
+                       }
+
+                       $s .= Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Log' ),
                                $context->msg( 'log-fulllog' )->escaped(),
                                [],
index 24846e6..e1bb2db 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Services\ServiceDisabledException;
 
 /**
  * Functions to get cache objects
@@ -226,7 +227,18 @@ class ObjectCache {
                                return self::getInstance( $candidate );
                        }
                }
-               return self::getInstance( CACHE_DB );
+
+               try {
+                       // Make sure we actually have a DB backend before falling back to CACHE_DB
+                       MediaWikiServices::getInstance()->getDBLoadBalancer();
+                       $candidate = CACHE_DB;
+               } catch ( ServiceDisabledException $e ) {
+                       // The LoadBalancer is disabled, probably because
+                       // MediaWikiServices::disableStorageBackend was called.
+                       $candidate = CACHE_NONE;
+               }
+
+               return self::getInstance( $candidate );
        }
 
        /**
index 6c42e34..eccf36f 100644 (file)
@@ -1216,7 +1216,7 @@ class Article implements Page {
                );
 
                $outputPage->addHTML(
-                       "<div class='patrollink'>" .
+                       "<div class='patrollink' data-mw='interface'>" .
                                wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
                        '</div>'
                );
@@ -2204,7 +2204,7 @@ class Article implements Page {
 
        /**
         * Call to WikiPage function for backwards compatibility.
-        * @see WikiPage::getActionOverrides
+        * @see ContentHandler::getActionOverrides
         */
        public function getActionOverrides() {
                return $this->mPage->getActionOverrides();
index 55fe156..d493002 100644 (file)
@@ -71,13 +71,13 @@ class CategoryPage extends Article {
                }
 
                $title = $this->getTitle();
-               if ( NS_CATEGORY == $title->getNamespace() ) {
+               if ( $title->inNamespace( NS_CATEGORY ) ) {
                        $this->openShowCategory();
                }
 
                parent::view();
 
-               if ( NS_CATEGORY == $title->getNamespace() ) {
+               if ( $title->inNamespace( NS_CATEGORY ) ) {
                        $this->closeShowCategory();
                }
        }
index 040a6f3..8702156 100644 (file)
@@ -183,18 +183,12 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Returns overrides for action handlers.
-        * Classes listed here will be used instead of the default one when
-        * (and only when) $wgActions[$action] === true. This allows subclasses
-        * to override the default behavior.
-        *
         * @todo Move this UI stuff somewhere else
         *
-        * @return array
+        * @see ContentHandler::getActionOverrides
         */
        public function getActionOverrides() {
-               $content_handler = $this->getContentHandler();
-               return $content_handler->getActionOverrides();
+               return $this->getContentHandler()->getActionOverrides();
        }
 
        /**
index 3b8b513..6b847e5 100644 (file)
@@ -460,6 +460,7 @@ class CoreParserFunctions {
                                return '';
                        }
                } else {
+                       $parser->addTrackingCategory( 'restricted-displaytitle-ignored' );
                        $converter = $parser->getConverterLanguage()->getConverter();
                        return '<span class="error">' .
                                wfMessage( 'restricted-displaytitle',
@@ -774,6 +775,10 @@ class CoreParserFunctions {
                // fetch revision from cache/database and return the value
                $rev = self::getCachedRevisionObject( $parser, $title );
                $length = $rev ? $rev->getSize() : 0;
+               if ( $length === null ) {
+                       // We've had bugs where rev_len was not being recorded for empty pages, see T135414
+                       $length = 0;
+               }
                return self::formatRaw( $length, $raw );
        }
 
index d4c4f6d..c943b7c 100644 (file)
@@ -56,9 +56,14 @@ class CoreTagHooks {
                $content = StringUtils::delimiterReplace( '<nowiki>', '</nowiki>', '$1', $text, 'i' );
 
                $attribs = Sanitizer::validateTagAttributes( $attribs, 'pre' );
-               return Xml::openElement( 'pre', $attribs ) .
-                       Xml::escapeTagsOnly( $content ) .
-                       '</pre>';
+               // We need to let both '"' and '&' through,
+               // for strip markers and entities respectively.
+               $content = str_replace(
+                       [ '>', '<' ],
+                       [ '&gt;', '&lt;' ],
+                       $content
+               );
+               return Html::rawElement( 'pre', $attribs, $content );
        }
 
        /**
@@ -98,8 +103,17 @@ class CoreTagHooks {
         * @return array
         */
        public static function nowiki( $content, $attributes, $parser ) {
-               $content = strtr( $content, [ '-{' => '-&#123;', '}-' => '&#125;-' ] );
-               return [ Xml::escapeTagsOnly( $content ), 'markerType' => 'nowiki' ];
+               $content = strtr( $content, [
+                       // lang converter
+                       '-{' => '-&#123;',
+                       '}-' => '&#125;-',
+                       // html tags
+                       '<' => '&lt;',
+                       '>' => '&gt;'
+                       // Note: Both '"' and '&' are not converted.
+                       // This allows strip markers and entities through.
+               ] );
+               return [ $content, 'markerType' => 'nowiki' ];
        }
 
        /**
index 96674be..b5e5d80 100644 (file)
@@ -121,9 +121,14 @@ class Parser {
         *
         * Must not consist of all title characters, or else it will change
         * the behavior of <nowiki> in a link.
+        *
+        * Must have a character that needs escaping in attributes, otherwise
+        * someone could put a strip marker in an attribute, to get around
+        * escaping quote marks, and break out of the attribute. Thus we add
+        * `'".
         */
-       const MARKER_SUFFIX = "-QINU\x7f";
-       const MARKER_PREFIX = "\x7fUNIQ-";
+       const MARKER_SUFFIX = "-QINU`\"'\x7f";
+       const MARKER_PREFIX = "\x7f'\"`UNIQ-";
 
        # Markers used for wrapping the table of contents
        const TOC_START = '<mw:toc>';
@@ -1858,11 +1863,22 @@ class Parser {
         */
        public function getExternalLinkAttribs( $url = false ) {
                $attribs = [];
-               $attribs['rel'] = self::getExternalLinkRel( $url, $this->mTitle );
-
-               if ( $this->mOptions->getExternalLinkTarget() ) {
-                       $attribs['target'] = $this->mOptions->getExternalLinkTarget();
+               $rel = self::getExternalLinkRel( $url, $this->mTitle );
+
+               $target = $this->mOptions->getExternalLinkTarget();
+               if ( $target ) {
+                       $attribs['target'] = $target;
+                       if ( !in_array( $target, [ '_self', '_parent', '_top' ] ) ) {
+                               // T133507. New windows can navigate parent cross-origin.
+                               // Including noreferrer due to lacking browser
+                               // support of noopener. Eventually noreferrer should be removed.
+                               if ( $rel !== '' ) {
+                                       $rel .= ' ';
+                               }
+                               $rel .= 'noreferrer noopener';
+                       }
                }
+               $attribs['rel'] = $rel;
                return $attribs;
        }
 
index 2150e56..84675c1 100644 (file)
@@ -44,5 +44,9 @@ class MWOldPassword extends ParameterizedPassword {
                        $this->args = [];
                        $this->hash = md5( $plaintext );
                }
+
+               if ( !is_string( $this->hash ) || strlen( $this->hash ) < 32 ) {
+                       throw new PasswordError( 'Error when hashing password.' );
+               }
        }
 }
index 26730b1..733984c 100644 (file)
@@ -42,5 +42,9 @@ class MWSaltedPassword extends ParameterizedPassword {
                }
 
                $this->hash = md5( $this->args[0] . '-' . md5( $plaintext ) );
+
+               if ( !is_string( $this->hash ) || strlen( $this->hash ) < 32 ) {
+                       throw new PasswordError( 'Error when hashing password.' );
+               }
        }
 }
index 8ef6f8d..6ffada3 100644 (file)
@@ -55,8 +55,15 @@ class Pbkdf2Password extends ParameterizedPassword {
                                (int)$this->params['length'],
                                true
                        );
+                       if ( !is_string( $hash ) ) {
+                               throw new PasswordError( 'Error when hashing password.' );
+                       }
                } else {
-                       $hashLen = strlen( hash( $this->params['algo'], '', true ) );
+                       $hashLenHash = hash( $this->params['algo'], '', true );
+                       if ( !is_string( $hashLenHash ) ) {
+                               throw new PasswordError( 'Error when hashing password.' );
+                       }
+                       $hashLen = strlen( $hashLenHash );
                        $blockCount = ceil( $this->params['length'] / $hashLen );
 
                        $hash = '';
index 10d9cb9..cefc5bc 100644 (file)
@@ -695,11 +695,6 @@ class SkinTemplate extends Skin {
 
                        // No need to show Talk and Contributions to anons if they can't contribute!
                        if ( User::groupHasPermission( '*', 'edit' ) ) {
-                               // Show the text "Not logged in"
-                               $personal_urls['anonuserpage'] = [
-                                       'text' => $this->msg( 'notloggedin' )->text()
-                               ];
-
                                // Because of caching, we can't link directly to the IP talk and
                                // contributions pages. Instead we use the special page shortcuts
                                // (which work correctly regardless of caching). This means we can't
index 45c5f7d..73efa4e 100644 (file)
@@ -83,7 +83,7 @@ class SpecialPageFactory {
 
                // Authentication
                'Userlogin' => 'SpecialUserLogin',
-               'Userlogout' => 'SpecialUserLogoutPreAuthManager',
+               'Userlogout' => 'SpecialUserlogoutPreAuthManager',
                'CreateAccount' => 'SpecialCreateAccountPreAuthManager',
                'LinkAccounts' => 'SpecialLinkAccounts',
                'UnlinkAccounts' => 'SpecialUnlinkAccounts',
@@ -266,6 +266,7 @@ class SpecialPageFactory {
                                self::$list = array_map( function ( $class ) {
                                        return preg_replace( '/PreAuthManager$/', '', $class );
                                }, self::$list );
+                               self::$list['Userlogout'] = 'SpecialUserLogout'; // case matters
                        } else {
                                self::$list['Userlogin'] = 'LoginForm';
                                self::$list = array_diff_key( self::$list, array_fill_keys( [
index b13f27b..f2eb88d 100644 (file)
@@ -52,6 +52,7 @@ class SpecialTrackingCategories extends SpecialPage {
                'broken-file-category',
                'node-count-exceeded-category',
                'expansion-depth-exceeded-category',
+               'restricted-displaytitle-ignored',
        ];
 
        function execute( $par ) {
index c6d3f6e..5d230c0 100644 (file)
@@ -872,7 +872,7 @@ class SpecialUndelete extends SpecialPage {
                        "ids" => $revisions,
                        "target" => $this->mTargetObj->getPrefixedText()
                ];
-               $url = SpecialPage::getTitleFor( "RevisionDelete" )->getFullURL( $query );
+               $url = SpecialPage::getTitleFor( 'Revisiondelete' )->getFullURL( $query );
                $this->getOutput()->redirect( $url );
        }
 
index b4ea732..baa55f0 100644 (file)
@@ -75,7 +75,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $this->target = Title::newFromText( $opts->getValue( 'target' ) );
                if ( !$this->target ) {
                        if ( !$this->including() ) {
-                               $this->buildForm();
+                               $out->addHTML( $this->whatlinkshereForm() );
                        }
 
                        return;
@@ -200,8 +200,12 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                ) {
                        if ( 0 == $level ) {
                                if ( !$this->including() ) {
-                                       $this->buildForm();
+                                       $out->addHTML( $this->whatlinkshereForm() );
 
+                                       // Show filters only if there are links
+                                       if ( $hidelinks || $hidetrans || $hideredirs || $hideimages ) {
+                                               $out->addHTML( $this->getFilterPanel() );
+                                       }
                                        $errMsg = is_int( $namespace ) ? 'nolinkshere-ns' : 'nolinkshere';
                                        $out->addWikiMsg( $errMsg, $this->target->getPrefixedText() );
                                        $out->setStatusCode( 404 );
@@ -265,7 +269,8 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                if ( $level == 0 ) {
                        if ( !$this->including() ) {
-                               $this->buildForm();
+                               $out->addHTML( $this->whatlinkshereForm() );
+                               $out->addHTML( $this->getFilterPanel() );
                                $out->addWikiMsg( 'linkshere', $this->target->getPrefixedText() );
 
                                $prevnext = $this->getPrevNext( $prevId, $nextId );
@@ -439,7 +444,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                return $this->msg( 'viewprevnext' )->rawParams( $prev, $next, $nums )->escaped();
        }
 
-       protected function buildForm() {
+       function whatlinkshereForm() {
                // We get nicer value from the title object
                $this->opts->consumeValue( 'target' );
                // Reset these for new requests
@@ -450,57 +455,88 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $nsinvert = $this->opts->consumeValue( 'invert' );
 
                # Build up the form
+               $f = Xml::openElement( 'form', [ 'action' => wfScript() ] );
 
-               $hiddenFields = [
-                       'title' => $this->getPageTitle()->getPrefixedDBkey(),
-               ];
+               # Values that should not be forgotten
+               $f .= Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() );
+               foreach ( $this->opts->getUnconsumedValues() as $name => $value ) {
+                       $f .= Html::hidden( $name, $value );
+               }
 
-               $formDescriptor = [
-                       'target' => [
-                               'type' => 'title',
-                               'name' => 'target',
-                               'label-message' => 'whatlinkshere-page',
-                               'default' => $this->opts->getValue( 'target' ),
-                       ],
+               $f .= Xml::fieldset( $this->msg( 'whatlinkshere' )->text() );
 
-                       'namespace' => [
-                               'type' => 'namespaceselect',
-                               'name' => 'namespace',
-                               'label-message' => 'namespace',
+               # Target input (.mw-searchInput enables suggestions)
+               $f .= Xml::inputLabel( $this->msg( 'whatlinkshere-page' )->text(), 'target',
+                       'mw-whatlinkshere-target', 40, $target, [ 'class' => 'mw-searchInput' ] );
+
+               $f .= ' ';
+
+               # Namespace selector
+               $f .= Html::namespaceSelector(
+                       [
+                               'selected' => $namespace,
                                'all' => '',
-                       ],
-
-                       'invert' => [
-                               'type' => 'check',
-                               'name' => 'invert',
-                               'label-message' => 'invert',
-                               'default' => false,
-                       ],
-               ];
+                               'label' => $this->msg( 'namespace' )->text()
+                       ], [
+                               'name' => 'namespace',
+                               'id' => 'namespace',
+                               'class' => 'namespaceselector',
+                       ]
+               );
+
+               $f .= '&#160;' .
+                       Xml::checkLabel(
+                               $this->msg( 'invert' )->text(),
+                               'invert',
+                               'nsinvert',
+                               $nsinvert,
+                               [ 'title' => $this->msg( 'tooltip-whatlinkshere-invert' )->text() ]
+                       );
+
+               $f .= ' ';
+
+               # Submit
+               $f .= Xml::submitButton( $this->msg( 'whatlinkshere-submit' )->text() );
 
-               $filters = [ 'hidetrans', 'hidelinks', 'hideredirs' ];
-               if ( $this->target instanceof Title &&
-                       $this->target->getNamespace() == NS_FILE ) {
-                       $filters[] = 'hideimages';
+               # Close
+               $f .= Xml::closeElement( 'fieldset' ) . Xml::closeElement( 'form' ) . "\n";
+
+               return $f;
+       }
+
+       /**
+        * Create filter panel
+        *
+        * @return string HTML fieldset and filter panel with the show/hide links
+        */
+       function getFilterPanel() {
+               $show = $this->msg( 'show' )->escaped();
+               $hide = $this->msg( 'hide' )->escaped();
+
+               $changed = $this->opts->getChangedValues();
+               unset( $changed['target'] ); // Already in the request title
+
+               $links = [];
+               $types = [ 'hidetrans', 'hidelinks', 'hideredirs' ];
+               if ( $this->target->getNamespace() == NS_FILE ) {
+                       $types[] = 'hideimages';
                }
 
-               foreach ( $filters as $filter ) {
-                       $formDescriptor[$filter] = [
-                               'type' => 'check',
-                               'name' => $filter,
-                               'label' => $this->msg( 'whatlinkshere-' . $filter ),
-                               'value' => false,
-                       ];
+               // Combined message keys: 'whatlinkshere-hideredirs', 'whatlinkshere-hidetrans',
+               // 'whatlinkshere-hidelinks', 'whatlinkshere-hideimages'
+               // To be sure they will be found by grep
+               foreach ( $types as $type ) {
+                       $chosen = $this->opts->getValue( $type );
+                       $msg = $chosen ? $show : $hide;
+                       $overrides = [ $type => !$chosen ];
+                       $links[] = $this->msg( "whatlinkshere-{$type}" )->rawParams(
+                               $this->makeSelfLink( $msg, array_merge( $changed, $overrides ) ) )->escaped();
                }
 
-               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
-                       ->addHiddenFields( $hiddenFields )
-                       ->setWrapperLegendMsg( 'whatlinkshere' )
-                       ->setSubmitTextMsg( 'whatlinkshere-submit' )
-                       ->setAction( $this->getPageTitle()->getLocalURL() )
-                       ->setMethod( 'get' )
-                       ->prepareForm()
-                       ->displayForm( false );
+               return Xml::fieldset(
+                       $this->msg( 'whatlinkshere-filters' )->text(),
+                       $this->getLanguage()->pipeList( $links )
+               );
        }
 
        /**
index e8c13e3..e745129 100644 (file)
@@ -894,7 +894,8 @@ class LoginFormPreAuthManager extends SpecialPage {
         */
        public static function incrementLoginThrottle( $username ) {
                global $wgPasswordAttemptThrottle, $wgRequest;
-               $username = User::getCanonicalName( $username, 'usable' ) ?: $username;
+               $canUsername = User::getCanonicalName( $username, 'usable' );
+               $username = $canUsername !== false ? $canUsername : $username;
 
                $throttleCount = 0;
                if ( is_array( $wgPasswordAttemptThrottle ) ) {
@@ -979,7 +980,8 @@ class LoginFormPreAuthManager extends SpecialPage {
         */
        public static function clearLoginThrottle( $username ) {
                global $wgRequest, $wgPasswordAttemptThrottle;
-               $username = User::getCanonicalName( $username, 'usable' ) ?: $username;
+               $canUsername = User::getCanonicalName( $username, 'usable' );
+               $username = $canUsername !== false ? $canUsername : $username;
 
                if ( is_array( $wgPasswordAttemptThrottle ) ) {
                        $throttleConfig = $wgPasswordAttemptThrottle;
@@ -1197,7 +1199,7 @@ class LoginFormPreAuthManager extends SpecialPage {
        protected function resetLoginForm( Message $msg ) {
                // Allow hooks to explain this password reset in more detail
                Hooks::run( 'LoginPasswordResetMessage', [ &$msg, $this->mUsername ] );
-               $reset = new SpecialChangePassword();
+               $reset = new SpecialChangePasswordPreAuthManager();
                $derivative = new DerivativeContext( $this->getContext() );
                $derivative->setTitle( $reset->getPageTitle() );
                $reset->setContext( $derivative );
index 1185c4d..ba5171f 100644 (file)
@@ -1422,7 +1422,7 @@ abstract class UploadBase {
                                && strpos( $value, '#' ) !== 0
                        ) {
                                if ( !( $strippedElement === 'a'
-                                       && preg_match( '!^https?://!im', $value ) )
+                                       && preg_match( '!^https?://!i', $value ) )
                                ) {
                                        wfDebug( __METHOD__ . ": Found href attribute <$strippedElement "
                                                . "'$attrib'='$value' in uploaded file.\n" );
index 71023c0..ce2ac83 100644 (file)
@@ -3859,6 +3859,7 @@ class User implements IDBAccessObject {
                if ( !$session->canSetUser() ) {
                        \MediaWiki\Logger\LoggerFactory::getInstance( 'session' )
                                ->warning( __METHOD__ . ": Cannot log out of an immutable session" );
+                       $error = 'immutable';
                } elseif ( !$session->getUser()->equals( $this ) ) {
                        \MediaWiki\Logger\LoggerFactory::getInstance( 'session' )
                                ->warning( __METHOD__ .
@@ -3866,6 +3867,7 @@ class User implements IDBAccessObject {
                                );
                        // But we still may as well make this user object anon
                        $this->clearInstanceCache( 'defaults' );
+                       $error = 'wronguser';
                } else {
                        $this->clearInstanceCache( 'defaults' );
                        $delay = $session->delaySave();
@@ -3874,7 +3876,13 @@ class User implements IDBAccessObject {
                        $session->setUser( new User );
                        $session->set( 'wsUserID', 0 ); // Other code expects this
                        ScopedCallback::consume( $delay );
+                       $error = false;
                }
+               \MediaWiki\Logger\LoggerFactory::getInstance( 'authmanager' )->info( 'Logout', [
+                       'event' => 'logout',
+                       'successful' => $error === false,
+                       'status' => $error ?: 'success',
+               ] );
        }
 
        /**
index 53300c5..5b18365 100644 (file)
@@ -7,7 +7,7 @@
        "--builtin-classes": true,
        "--processes": "0",
        "--warnings-exit-nonzero": true,
-       "--external": "HTMLElement,HTMLDocument,Window,Blob,File,MouseEvent,KeyboardEvent,HTMLIframeElement,HTMLInputElement,XMLDocument",
+       "--external": "Blob,File,HTMLDocument,HTMLElement,HTMLIframeElement,HTMLInputElement,KeyboardEvent,MouseEvent,Node,Window,XMLDocument",
        "--output": "docs/js",
        "--": [
                "maintenance/jsduck/external.js",
index 2621af9..29cfc34 100644 (file)
@@ -5,7 +5,8 @@
                        "Vinitutpal",
                        "아라",
                        "Samyo",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": " कड़ी अधोरेखित करना:",
        "loginreqlink": "लॉग-इन",
        "newarticle": "(नया)",
        "newarticletext": "आपनॆ जे लेख चाहै छियै वू अखनी तलक लिखलॊ नै गेलॊ छै. इ लेख लिखै लेली नीचे टाइप करॊ. सहायता लेली [$1 ऐन्जां] क्लीक करॊ.\n\nजों आपनॆ यहां पर गलती सॆं आबी गेलॊ छियै तॆ आपनॊ ब्राउज़र कॆ बॅक (back) पर क्लीक करॊ.",
-       "noarticletext": "\nHindi (hi)फ़िलहाल इ पन्ना पर कोनो सामग्री नै छै.\nआपन॑ अन्य पन्ना मं॑ [[Special:Search/{{PAGENAME}}|इ सामग्री के खोज]] कर॑ सकै छियै,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित चिट्ठा मं॑ खोज कर॑ सकै छियै],\nया [{{fullurl:{{FULLPAGENAME}}|action=edit}} इ पन्ना क॑ संपादित कर॑ सक॑ छियै]</span>.",
+       "noarticletext": "फ़िलहाल ई पन्ना पर कोनो सामग्री नै छै.\nआपन॑ अन्य पन्ना मं॑ [[Special:Search/{{PAGENAME}}|ई सामग्री के खोज]] कर॑ सकै छियै,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित चिट्ठा मं॑ खोज कर॑ सकै छियै],\nया [{{fullurl:{{FULLPAGENAME}}|action=edit}} इ पन्ना क॑ संपादित कर॑ सक॑ छियै]</span>.",
        "noarticletext-nopermission": "\nफ़िलहाल इ पन्ना पर कोय सामग्री नै छै.\nआपने अन्य पन्ना म॑ [[Special:Search/{{PAGENAME}}|इ सामग्री केरऽ खोज]] कर॑ सकै छियै,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित चिट्ठा मं॑ खोज कर॑ सकै छियै],\nया फेरू [{{fullurl:{{FULLPAGENAME}}|action=edit}} इ पन्ना क॑ संपादित कर॑ सकै छियै]</span>.",
        "previewnote": "'''याद रखॊ, इ केवल एगॊ झलक छेकै आरू अभी तलक सुरक्षित  नै करलॊ गेलॊ छै!'''",
        "editing": "$1 केरऽ सम्पादन चली रहलऽ छै.",
        "contributions": "{{GENDER:$1|सदस्य}} योगदान",
        "contributions-title": "$1 लेली सदस्यॊ के योगदान",
        "mycontris": "योगदान",
+       "anoncontribs": "योगदान",
        "contribsub2": "$1 लेली ($2)",
        "uctop": "(उपर)",
        "month": "इ महिना स॑ (आरू पुरान॑):",
        "revertmove": "पुरानॊ अवतरण पर लॆ चलॊ (रिवर्ट)",
        "export": "पन्ना क॑ निर्यात करऽ",
        "thumbnail-more": "बड़ा करऽ",
-       "tooltip-pt-userpage": "आपन॑ के प्रयोक्ता पन्ना",
-       "tooltip-pt-mytalk": "आपन॑ के वार्ता पन्ना",
-       "tooltip-pt-preferences": "आपन॑ के वरीयता",
+       "tooltip-pt-userpage": "{{GENDER:|आपन॑ के प्रयोक्ता}} पन्ना",
+       "tooltip-pt-mytalk": "{{GENDER:|आपन॑ के}} वार्ता पृष्ठ",
+       "tooltip-pt-preferences": "{{GENDER:|आपन॑ के}} वरीयता",
        "tooltip-pt-watchlist": "आपन॑ के ध्यान देलऽ पन्ना के सूची",
-       "tooltip-pt-mycontris": "आपन॑ के योगदानऽ के सूची",
+       "tooltip-pt-mycontris": "{{GENDER:|आपन॑ के}} योगदान",
        "tooltip-pt-login": "आपन॑ सं॑ सत्रारंभ करै के गुज़ारिश छै; लेकिन इ अनिवार्य नै छै.",
        "tooltip-pt-logout": "सत्रांत",
        "tooltip-pt-createaccount": "हमरऽ सुझाव छै कि तोंय खाता बनाबऽ आरू लॉगिन करऽ, हालाँकि अंदर प्रवेश करै लेली इ अनिवार्य नै छै",
        "tooltip-t-recentchangeslinked": "इ पन्ना स॑ जुड़लऽ पन्ना पर होलऽ हाल केरऽ बदलाव",
        "tooltip-feed-rss": "इ पन्ना के आरएसएस फ़ीड",
        "tooltip-feed-atom": "इ पन्ना के अणु फ़ीड",
-       "tooltip-t-contributions": " सदस्य के योगदान केरऽ सूची देखियै",
+       "tooltip-t-contributions": "{{GENDER:$1| केरऽ ई साल}} म॑ सदस्य के योगदान केरऽ सूची देखियै",
        "tooltip-t-emailuser": "इस सदस्य कॆ इमेल भेजॊ",
        "tooltip-t-upload": "फाईल लादऽ (अपलोड )",
        "tooltip-t-specialpages": "ख़ास पन्ना केरऽ सूची",
index 9755531..ef642ef 100644 (file)
        "tog-ccmeonemails": "أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين",
        "tog-diffonly": "لا تعرض محتوى الصفحة أسفل الفرق",
        "tog-showhiddencats": "أظهر التصنيفات المخفية",
-       "tog-norollbackdiff": "أزÙ\84 Ø§Ù\84Ù\81رÙ\82 Ø¨Ø¹Ø¯ Ø¥Ø­Ø¯Ø§Ø« Ø§Ø³ØªØ±Ø¬Ø§Ø¹",
+       "tog-norollbackdiff": "بعد Ø§Ù\84إرجاع Ù\84ا ØªØ¹Ø±Ø¶ Ø§Ù\84Ù\81رÙ\82",
        "tog-useeditwarning": "حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها",
        "tog-prefershttps": "دائما استخدم اتصالا آمنا بعد الدخول",
        "underline-always": "دائما",
        "botpasswords-no-provider": "BotPasswordsSessionProvider غير متاح.",
        "botpasswords-restriction-failed": "قيود كلمة مرور البوت تمنع هذا الولوج.",
        "resetpass_forbidden": "كلمات السر لا يمكن تغييرها",
+       "resetpass_forbidden-reason": "لا يمكن تغيير كلمة المرور: $1",
        "resetpass-no-info": "يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.",
        "resetpass-submit-loggedin": "تغيير كلمة السر",
        "resetpass-submit-cancel": "إلغاء",
        "parser-unstrip-recursion-limit": "تعدى حد العودية Unstrip  ($1)",
        "converter-manual-rule-error": "خطأ تم اكتشافه في قاعدة تحويل اللغة اليدوية",
        "undo-success": "يمكن استرجاع التعديل.\nتحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، ثم احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.",
-       "undo-failure": "Ù\84Ù\85 Ù\8aÙ\85Ù\83Ù\86 Ø§Ø³ØªØ±Ø¬Ø§Ø¹ Ø§Ù\84تعدÙ\8aÙ\84 Ø¨Ø³Ø¨Ø¨ ØªØ¹Ø¯Ù\8aÙ\84ات Ù\85تعارضة ØªÙ\85ت Ø¹Ù\84Ù\89 Ø§Ù\84صÙ\81حة.",
+       "undo-failure": "Ù\84Ù\85 Ù\8aÙ\85Ù\83Ù\86 Ø¥Ù\84غاء Ø§Ù\84تعدÙ\8aÙ\84 Ù\84حدÙ\88Ø« ØªØ¹Ø¯Ù\8aÙ\84ات Ø¹Ù\84Ù\89 Ø§Ù\84صÙ\81حة Ù\85Ù\86 Ø¨Ø¹Ø¯Ù\87.",
        "undo-norev": "فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.",
        "undo-nochange": "التعديل يبدو أنه قد تم الترجع عنه بالفعل.",
        "undo-summary": "الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
        "lineno": "سطر $1:",
        "compareselectedversions": "قارن بين النسختين المختارتين",
        "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
-       "editundo": "رجÙ\88ع",
+       "editundo": "Ø¥Ù\84غاء",
        "diff-empty": "(لا فرق)",
        "diff-multi-sameuser": "({{PLURAL:$1|لا مراجعات متوسطة|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة نفس المستخدم غير {{PLURAL:$1|معروضة|معروضة|معروضتين|معروضة}})",
        "diff-multi-otherusers": "({{PLURAL:$1|لا مراجعات|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة {{PLURAL:$2|ولا مستخدم|مستخدم واحد آخر|مستخدمين اثنين آخرين|$2 مستخدمين|$2 مستخدماً|$2 مستخدم}} غير {{PLURAL:$1|معروضة|معروضة|معروضتين|معروضة}})",
        "grant-highvolume": "تعديل كبير الحجم",
        "grant-patrol": "تغييرات دورية للصفحات",
        "grant-protect": "حماية وإزالة حماية الصفحات",
-       "grant-rollback": "استرجاع Ø§Ù\84تغÙ\8aÙ\8aرات في الصفحات",
+       "grant-rollback": "Ø¥Ù\84غاء Ø§Ù\84تعدÙ\8aÙ\84ات في الصفحات",
        "grant-sendemail": "إرسال بريد إلكتروني للمستخدمين الآخرين",
        "grant-uploadeditmovefile": "رفع وإزاحة ونقل الملفات",
        "grant-uploadfile": "ارفع ملفات جديدة",
        "delete-warning-toobig": "لهذه الصفحة تاريخ تعديل طويل، أكثر من {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}}.\nقد يؤدي حذفها إلى اضطراب عمليات قاعدة البيانات في {{SITENAME}}؛\nاستمر مع الحذر.",
        "deleteprotected": "لا يمكنك حذف هذه الصفحة لأنها محمية.",
        "deleting-backlinks-warning": "[[Special:WhatLinksHere/{{FULLPAGENAME}}|تتصل صفحات أخرى]] بالصفحة التي تريد حذفها.",
-       "rollback": "استرجاع التعديلات",
-       "rollbacklink": "استرجع",
-       "rollbacklinkcount": "استرجع {{PLURAL:$1|Ù\84ا ØªØ¹Ø¯Ù\8aÙ\84ات|تعدÙ\8aÙ\84ا Ù\88احدا|تعدÙ\8aÙ\84Ù\8aÙ\86|$1 ØªØ¹Ø¯Ù\8aÙ\84ات|$1 ØªØ¹Ø¯Ù\8aÙ\84اÙ\8b|تعديل}}",
-       "rollbacklinkcount-morethan": "استرجاع Ø£Ù\83ثر Ù\85Ù\86 {{PLURAL:$1||تعديل|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}",
+       "rollback": "Ø¥Ù\84غاء التعديلات",
+       "rollbacklink": "إرجاع",
+       "rollbacklinkcount": "Ø¥Ù\84غاء {{PLURAL:$1|تعدÙ\8aÙ\84ات|تعدÙ\8aÙ\84|تعدÙ\8aÙ\84Ù\8aÙ\86|$1 ØªØ¹Ø¯Ù\8aÙ\84ات|$1 ØªØ¹Ø¯Ù\8aÙ\84ا|$1 تعديل}}",
+       "rollbacklinkcount-morethan": "Ø£Ù\84غ Ø£Ù\83ثر Ù\85Ù\86 {{PLURAL:$1|تعدÙ\8aÙ\84|تعديل|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}",
        "rollbackfailed": "لم ينجح الاسترجاع",
        "cantrollback": "لم يمكن استرجاع التعديل؛\nآخر مساهم هو المؤلف الوحيد لهذه الصفحة.",
        "alreadyrolled": "لم يمكن استرجاع آخر تعديل ل[[$1]] بواسطة [[User:$2|$2]] ([[User talk:$2|نقاش]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])؛\nشخص آخر عدل أو استرجع الصفحة بالفعل.\n\nآخر تعديل كان بواسطة [[User:$3|$3]] ([[User talk:$3|نقاش]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "ملخص التعديل كان:<em>$1</em>.",
        "revertpage": "استرجع تعديلات [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]]) حتى آخر مراجعة ل[[User:$1|$1]]",
        "revertpage-nouser": "استرجع تعديلات مستخدم مخفيّ حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "استرجع ØªØ¹Ø¯Ù\8aÙ\84ات $1Ø\9b\nاسترجع Ø­ØªÙ\89 Ø¢Ø®Ø± Ù\86سخة Ø¨Ù\88اسطة $2.",
+       "rollback-success": "Ø¥Ù\84غاء ØªØ¹Ø¯Ù\8aÙ\84ات $1Ø\9b\nÙ\88إرجاع Ø¢Ø®Ø± Ù\86سخة Ù\84â\80\8d$2.",
        "sessionfailure-title": "فشل في الجلسة",
        "sessionfailure": "يبدو أنه هناك مشكلة في هذه جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
        "changecontentmodel": "غير نموذج المحتوى لصفحة",
        "log-action-filter-protect-unprotect": "رفع الحماية",
        "log-action-filter-rights-rights": "تغيير يدوي",
        "log-action-filter-upload-upload": "رفع جديد",
-       "log-action-filter-upload-overwrite": "إعادة الرفع"
+       "log-action-filter-upload-overwrite": "إعادة الرفع",
+       "authmanager-email-label": "البريد الإلكتروني",
+       "authmanager-email-help": "عنوان البريد الإلكتروني",
+       "authmanager-realname-label": "الاسم الحقيقي",
+       "authmanager-realname-help": "الاسم الحقيقي للمستخدم",
+       "authmanager-provider-password": "توثيق مبني على كلمة المرور",
+       "authmanager-provider-password-domain": "توثيق مبني على كلمة المرور والنطاق",
+       "authmanager-provider-temporarypassword": "كلمة مرور مؤقتة",
+       "authprovider-resetpass-skip-label": "تخطى",
+       "authprovider-resetpass-skip-help": "تخطي إعادة تعيين كلمة المرور",
+       "cannotauth-not-allowed-title": "الإذن مرفوض",
+       "credentialsform-account": "اسم الحساب:",
+       "cannotlink-no-provider-title": "لا توجد حسابات قابلة للربط",
+       "cannotlink-no-provider": "لا توجد حسابات قابلة للربط",
+       "linkaccounts": "ربط الحسابات",
+       "linkaccounts-submit": "اربط الحسابات",
+       "unlinkaccounts": "إزالة ربط الحسابات"
 }
index a8ab056..6ee3dc7 100644 (file)
@@ -11,7 +11,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Fitoschido",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Sorrayar enllaces:",
        "whatlinkshere-prev": "{{PLURAL:$1|anterior|anteriores $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|siguiente|siguientes $1}}",
        "whatlinkshere-links": "← enllaces",
-       "whatlinkshere-hideredirs": "Anubrir redireiciones",
-       "whatlinkshere-hidetrans": "Anubrir tresclusiones",
-       "whatlinkshere-hidelinks": "Tapecer enllaces",
-       "whatlinkshere-hideimages": "Anubrir los enllaces al ficheru",
+       "whatlinkshere-hideredirs": "$1 redireiciones",
+       "whatlinkshere-hidetrans": "$1 tresclusiones",
+       "whatlinkshere-hidelinks": "$1 enllaces",
+       "whatlinkshere-hideimages": "$1 los enllaces al ficheru",
        "whatlinkshere-filters": "Peñeres",
        "whatlinkshere-submit": "Dir",
        "autoblockid": "Autobloquiar #$1",
index 9771d45..4ce3c93 100644 (file)
        "logentry-newusers-byemail": "$3 ایستیفاده‌چی حسابی، $1 ایله {{GENDER:$2|یارادیلیب}} و رمز، ایمیل ایله گؤندریلیب‌دیر",
        "logentry-newusers-autocreate": "$1 ایشلدن حسابی اوْتوماتیک {{GENDER:$2|یارادیلدی}}",
        "logentry-protect-protect": "$1 $3-ی/و  {{GENDER:$2|قوْرودو}} $4",
-       "logentry-rights-rights": "$1، $3-ین قروپ عوضولوگونو $4-دن $5-ه {{GENDER:$2|دَییشدیردی}}",
+       "logentry-rights-rights": "$1، $3-ین قروپ عۆضولوگونو $4-دن $5-ه {{GENDER:$2|دَییشدیردی}}",
        "logentry-rights-rights-legacy": "$1، $3-ین قروپ عوضولوگونو {{GENDER:$2|دَییشدیردی}}",
        "logentry-rights-autopromote": "$1-ین مقامی اوتوماتیک $4-دن $5-ه {{GENDER:$2|آرتیریلدی}}",
        "logentry-upload-upload": "$1 $3 را {{GENDER:$2|یوکلندیردی}}",
index 38de629..358562f 100644 (file)
@@ -25,7 +25,8 @@
                        "Айсар",
                        "Lizalizaufa",
                        "Кутлубаева Кунсулу Закиевна",
-                       "Вильданова Гюзель"
+                       "Вильданова Гюзель",
+                       "Ilmira"
                ]
        },
        "tog-underline": "Һылтанмалар аҫтына һыҙыу:",
        "log-action-filter-protect-modify": "Яңынан тейәү",
        "log-action-filter-protect-unprotect": "Һаҡты алып ташлау",
        "log-action-filter-upload-upload": "Яңы күсереү",
-       "log-action-filter-upload-overwrite": "Ҡабаттан тейәү"
+       "log-action-filter-upload-overwrite": "Ҡабаттан тейәү",
+       "authmanager-userdoesnotexist": "\"$1\" иҫәп яҙмаһы теркәлмәгән.",
+       "authmanager-email-label": "Электрон почта адресы",
+       "authmanager-email-help": "Электрон почта адресы",
+       "authmanager-realname-label": "Ысын исемегеҙ",
+       "changecredentials-submit": "Үҙгәртергә",
+       "removecredentials-submit-cancel": "Кире алырға"
 }
index 7a39fa8..dba6036 100644 (file)
        "userlogin-resetpassword-link": "Забылі пароль?",
        "userlogin-helplink2": "Дапамога з уваходам у сыстэму",
        "userlogin-loggedin": "Вы ўжо ўвайшлі як {{GENDER:$1|$1}}.\nДля ўваходу пад іншым удзельнікам скарыстайцеся формай унізе.",
+       "userlogin-reauth": "Вы мусіце ўвайсьці яшчэ раз, каб пацьвердзіць, што вы — гэта {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Стварыць іншы рахунак",
        "createacct-emailrequired": "Адрас электроннай пошты",
        "createacct-emailoptional": "Адрас электроннай пошты (неабавязкова)",
        "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
        "createacct-reason-ph": "Зь якой мэтай вы ствараеце іншы рахунак",
+       "createacct-reason-help": "Паведамленьне, якое паказваецца ў журнале стварэньня рахункаў",
        "createacct-submit": "Стварыць рахунак",
        "createacct-another-submit": "Стварыць рахунак",
+       "createacct-continue-submit": "Працягнуць стварэньне рахунку",
+       "createacct-another-continue-submit": "Працягнуць стварэньне рахунку",
        "createacct-benefit-heading": "{{SITENAME}} створаная людзьмі, такімі як вы.",
        "createacct-benefit-body1": "{{PLURAL:$1|праўка|праўкі|правак}}",
        "createacct-benefit-body2": "{{PLURAL:$1|старонка|старонкі|старонак}}",
        "passwordsent": "Новы пароль быў дасланы на адрас электроннай пошты ўдзельніка «$1».\nКалі ласка, увайдзіце ў сыстэму пасьля яго атрыманьня.",
        "blocked-mailpassword": "З Вашага IP-адрасу забароненыя рэдагаваньні. Каб пазьбегнуць злоўжываньняў, з гэтага IP-адрасу забаронена аднаўляць пароль.",
        "eauthentsent": "Пацьверджаньне было дасланае на пазначаны адрас электроннай пошты.\nУ лісьце ўтрымліваюцца інструкцыі, па выкананьні якіх Вы зможаце пацьвердзіць, што адрас сапраўды належыць Вам, і на гэты адрас будзе дасылацца пошта адсюль.",
-       "throttled-mailpassword": "Ліст пра скіданьне паролю ўжо было даслана за {{PLURAL:$1|$1 апошнюю гадзіну|$1 апошнія гадзіны|$1 апошніх гадзінаў}}.\nДля прадухіленьня злоўжываньняў напамін будзе дасылацца не часьцей як аднойчы ў $1 {{PLURAL:$1|гадзіну|гадзіны|гадзінаў}}.",
+       "throttled-mailpassword": "Ліст пра скіданьне паролю ўжо быў дасланы за $1 {{PLURAL:$1|апошнюю гадзіну|апошнія гадзіны|апошніх гадзінаў}}.\nКаб пазьбегнуць злоўжываньняў напамін будзе дасылацца не часьцей як аднойчы за $1 {{PLURAL:$1|гадзіну|гадзіны|гадзінаў}}.",
        "mailerror": "Памылка пры адпраўцы электроннай пошты: $1",
        "acct_creation_throttle_hit": "Наведвальнікі гэтай вікі, якія карысталіся Вашым ІР-адрасам, ужо стварылі $1 {{PLURAL:$1|рахунак у|рахункі ў|рахункаў у}} апошнія дні, што перавышае максымальную дазволеную колькасьць за гэты пэрыяд.\nУ выніку, наведвальнікі, якія карыстаюцца гэтым ІР-адрасам, ня могуць стварыць зараз болей рахункаў.",
        "emailauthenticated": "Ваш адрас электроннай пошты быў пацьверджаны $2 у $3.",
        "whatlinkshere-prev": "{{PLURAL:$1|папярэдняя|папярэднія}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|наступная|наступныя}} $1",
        "whatlinkshere-links": "← спасылкі",
-       "whatlinkshere-hideredirs": "Схаваць перанакіраваньні",
-       "whatlinkshere-hidetrans": "Схаваць уключэньні",
-       "whatlinkshere-hidelinks": "Схаваць спасылкі",
-       "whatlinkshere-hideimages": "Схаваць спасылкі на файлы",
+       "whatlinkshere-hideredirs": "$1 перанакіраваньні",
+       "whatlinkshere-hidetrans": "$1 уключэньні",
+       "whatlinkshere-hidelinks": "$1 спасылкі",
+       "whatlinkshere-hideimages": "$1 спасылкі на файлы",
        "whatlinkshere-filters": "Фільтры",
        "whatlinkshere-submit": "Перайсьці",
        "autoblockid": "Аўтаматычнае блякаваньне №$1",
index fceab4d..3936c64 100644 (file)
@@ -27,7 +27,8 @@
                        "Matma Rex",
                        "Goshaproject",
                        "Nemo bis",
-                       "SamGold"
+                       "SamGold",
+                       "Liashko"
                ]
        },
        "tog-underline": "Падкрэсліваць спасылкі:",
        "createacct-reason-ph": "Чаму вы ствараеце іншы ўліковы запіс",
        "createacct-submit": "Стварыць уліковы запіс",
        "createacct-another-submit": "Стварыць уліковы запіс",
+       "createacct-continue-submit": "Працягнуць стварэнне ўліковага запісу",
        "createacct-benefit-heading": "{{SITENAME}} зроблены такімі ж людзьмі, як вы.",
        "createacct-benefit-body1": "{{PLURAL:$1|праўка|праўкі|правак}}",
        "createacct-benefit-body2": "{{PLURAL:$1|старонка|старонкі|старонак}}",
        "createacct-another-realname-tip": "Сапраўднае імя паведамляць неабавязкова.\nКалі вы паведаміце яго, яно будзе выкарыстоўвацца для пазначэння вашага ўкладу.",
        "pt-login": "Увайсці",
        "pt-login-button": "Увайсці",
+       "pt-login-continue-button": "Працягнуць уваход",
        "pt-createaccount": "Стварыць уліковы запіс",
        "pt-userlogout": "Выйсці",
        "php-mail-error-unknown": "Невядомая памылка ў функцыі PHP-пошты",
        "botpasswords-invalid-name": "Паказанае імя ўдзельніка не ўтрымлівае падзяляльнік паролю робата (\"$1\").",
        "botpasswords-not-exist": "Удзельнік \"$1\" не мае паролю для робата з назвай \"$2\".",
        "resetpass_forbidden": "Не дазволена мяняць паролі",
+       "resetpass_forbidden-reason": "Не дазволена мяняць паролі: $1",
        "resetpass-no-info": "Трэба ўвайсці ў сістэму, каб звяртацца да гэтай старонкі наўпрост.",
        "resetpass-submit-loggedin": "Змяніць пароль",
        "resetpass-submit-cancel": "Нічога",
        "passwordreset-emailsentusername": "Калі ёсць адрас электроннай пошты, злучаны з гэтым імем удзельніка, то будзе дасланы ліст пра скід пароля.",
        "passwordreset-emailsent-capture": "Ніжэй прыведзены адпраўлены ліст пра скід пароля.",
        "passwordreset-emailerror-capture": "Ніжэй прыведзены створаны ліст пра скід пароля, яго адпраўка не атрымалася па прычыне: $1",
+       "passwordreset-invalideamil": "Няслушны адрас электроннай пошты",
        "changeemail": "Змяніць або выдаліць адрас электроннай пошты",
        "changeemail-header": "Запоўніце гэтую форму, каб змяніць свой адрас электроннай пошты. Калі хочаце выдаліць адрас электроннай пошты, злучаны з вашым уліковым запісам, пакіньце поле новага адраса электроннай пошты пустым пры адпраўцы формы.",
        "changeemail-passwordrequired": "Вам трэба будзе ўвесці свой пароль, каб пацвердзіць гэта змяненне.",
        "accmailtext": "На адрас $2 быў дасланы згенераваны пароль для [[User talk:$1|$1]]. Ён можа быць зменены на <em>[[Special:ChangePassword|старонцы змены пароля]]</em> пасля ўваходу ў сістэму.",
        "newarticle": "(Новы)",
        "newarticletext": "Вы перайшлі па спасылцы на старонку, якой яшчэ няма.\nКаб яе стварыць, набярыце яе тэкст у ніжэйпаказаным акне рэдагавання (падрабязнасці гл. ў [$1 даведцы]).\nКалі вы тут выпадкова, проста націсніце <strong>назад</strong> у браўзеры.",
-       "anontalkpagetext": "----''Гэта старонка размовы з ананімным удзельнікам, які або не мае свайго рахунка, або ім не карыстаўся. Таму дзеля яго ці яе ідэнтыфікацыі мы мусім выкарыстаць лічбавы IP-адрас. Такі адрас IP могуць дзяліць між сабою некалькі асоб. Калі вы ананімны ўдзельнік, і лічыце, што атрымліваеце няслушныя заўвагі,[[Special:CreateAccount|стварыце рахунак]] або [[Special:UserLogin|зайдзіце ў сістэму]], каб вас больш не блыталі з іншымі ананімнымі ўдзельнікамі.''",
+       "anontalkpagetext": "----\n<em>Гэта старонка размовы з ананімным удзельнікам, які або не мае свайго рахунка, або ім не карыстаўся.</em>\nТаму дзеля яго ці яе ідэнтыфікацыі мы мусім выкарыстаць лічбавы IP-адрас.\nТакі адрас IP могуць дзяліць між сабою некалькі асоб.\nКалі вы ананімны ўдзельнік, і лічыце, што атрымліваеце няслушныя заўвагі,[[Special:CreateAccount|стварыце рахунак]] або [[Special:UserLogin|зайдзіце ў сістэму]], каб вас больш не блыталі з іншымі ананімнымі ўдзельнікамі.",
        "noarticletext": "Старонка не ўтрымлівае тэксту. Вы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэткую назву]] ў іншых старонках ці <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах],\nабо [{{fullurl:{{FULLPAGENAME}}|action=edit}} папрацаваць з гэтай старонкай]</span>.",
        "noarticletext-nopermission": "Старонка не ўтрымлівае тэксту.\nВы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэткую назву]] ў іншых старонках,\nці <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах]</span>, але вы не маеце дазволу на стварэнне гэтай старонкі.",
        "missing-revision": "Няма версіі #$1 у старонкі з назвай \"{{FULLPAGENAME}}\".\n\nЗвычайна такое здараецца, калі прайсці па састарэлай спасылцы з гісторыі на старонку, якая была сцёрта.\nПадрабязнасці можна пабачыць у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале сціранняў].",
        "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": "Узаемадзейнічаць з медыяфайламі",
        "action-viewmyprivateinfo": "бачыць свае асабістыя звесткі",
        "action-editmyprivateinfo": "правіць свае асабістыя звесткі",
        "action-editcontentmodel": "правіць мадэль змесціва старонкі",
-       "action-managechangetags": "ствараць і выдаляць біркі з базы даных",
+       "action-managechangetags": "ствараць і (дэ)актываваць біркі",
        "action-applychangetags": "прымяняць біркі з сваімі праўкамі",
        "action-changetags": "дадаваць і выдаляць адвольныя біркі да асобных версій і запісаў у журнале падзей",
+       "action-deletechangetags": "выдаляць біркі з базы даных",
        "nchanges": "$1 {{PLURAL:$1|змена|змены|змен}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з часу апошняга наведвання}}",
        "enhancedrc-history": "гісторыя",
        "apisandbox-dynamic-parameters-add-placeholder": "Назва параметра",
        "apisandbox-dynamic-error-exists": "Параметр з назвай \"$1\" ужо існуе.",
        "apisandbox-deprecated-parameters": "Састарэлыя параметры",
+       "apisandbox-submit-invalid-fields-title": "Некаторыя палі недапушчальныя",
+       "apisandbox-submit-invalid-fields-message": "Калі ласка, выпраўце адзначаныя палі і паспрабуйце ізноў.",
        "apisandbox-results": "Вынікі",
        "apisandbox-alert-page": "Палі на гэтай старонцы недапушчальныя.",
        "apisandbox-alert-field": "Значэнне гэтага поля недапушчальнае.",
        "log-edit-tags": "Правіць біркі да выбраных запісаў журнала",
        "checkbox-select": "Выбраць: $1",
        "checkbox-all": "Усе",
+       "checkbox-none": "Нічога",
+       "checkbox-invert": "Інвертаваць",
        "allpages": "Усе старонкі",
        "nextpage": "Наступная старонка ($1)",
        "prevpage": "Папярэдняя старонка ($1)",
        "listgrouprights-namespaceprotection-header": "Абмежаванні прасторы назваў",
        "listgrouprights-namespaceprotection-namespace": "Прастора назваў",
        "listgrouprights-namespaceprotection-restrictedto": "Дазвол(ы), неабходныя для праўкі",
+       "listgrants-rights": "Правы",
        "trackingcategories": "Катэгорыі для асочвання",
        "trackingcategories-summary": "На гэтай старонцы пералічаны катэгорыі для асочвання, якія аўтаматычна напаўняюцца праграмным забеспячэннем MediaWiki. Іх можна перайменаваць, змяніўшы адпаведныя сістэмныя паведамленні ў прасторы назваў {{ns:8}}.",
        "trackingcategories-msg": "Катэгорыя для асочвання",
        "whatlinkshere-prev": "{{PLURAL:$1|папярэдняя|папярэднія $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|наступная|наступныя $1}}",
        "whatlinkshere-links": "← спасылкі",
-       "whatlinkshere-hideredirs": "$1 перасылак",
-       "whatlinkshere-hidetrans": "$1 Ñ\83лÑ\83Ñ\87Ñ\8dннÑ\8fÑ\9e",
-       "whatlinkshere-hidelinks": "$1 Ñ\81паÑ\81Ñ\8bлак",
-       "whatlinkshere-hideimages": "$1 Ñ\81паÑ\81Ñ\8bлак на выявы",
+       "whatlinkshere-hideredirs": "$1 перанакіраваньні",
+       "whatlinkshere-hidetrans": "$1 Ñ\83клÑ\8eÑ\87Ñ\8dнÑ\8cнÑ\96",
+       "whatlinkshere-hidelinks": "$1 Ñ\81паÑ\81Ñ\8bлкÑ\96",
+       "whatlinkshere-hideimages": "$1 Ñ\81паÑ\81Ñ\8bлкÑ\96 на выявы",
        "whatlinkshere-filters": "Фільтры",
        "autoblockid": "Аўтаблакіроўка #$1",
        "block": "Заблакаваць удзельніка",
index a239396..a954573 100644 (file)
@@ -7,7 +7,8 @@
                        "Mjbmr",
                        "Macofe",
                        "Hosseinblue",
-                       "Dalba"
+                       "Dalba",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "لینکانی جهلگا خط کشیتین",
        "logentry-delete-delete": "$1 ، $3 تاکدیما {{GENDER:$2|پاک کورت}}",
        "logentry-delete-restore": "$1 ، $3 ئی تاکدیما {{GENDER:$2|پدا جۆڑ کورت}}",
        "logentry-delete-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاه چال|$5 مورد سیاه چال}} ئا بئ $3 {{GENDER:$2|تا تغیر دات}}: $4",
-       "logentry-delete-revision": "$1 پیدایی {{PLURAL:$5|یک نخسه|$5 نخسه}} تاکدیم $3 ئا {{GENDER:$2|تغییر دات}}: $4",
+       "logentry-delete-revision": "$1 ،  $3 تاکدیمئ  {{PLURAL:$5|یک نخسه|$5 نخسه}}‌ئی پیدایي‌ئا   {{GENDER:$2|تغییر دات}}: $4",
        "logentry-suppress-delete": "$1 $3 ئی تاکدیما {{GENDER:$2| سرکوب کورت}}",
        "logentry-suppress-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاه چال|$5 مورد سیاه چال}} ئا بئ $3 {{GENDER:$2|تا چیهر دات}}: $4",
-       "logentry-suppress-revision": "$1 پیدایی {{PLURAL:$5|یک نخسه|$5 نخسه}} تاکدیم $3 ئا چیهراکائی {{GENDER:$2|تغییر دات}}: $4",
+       "logentry-suppress-revision": "$1 ،  $3 تاکدیمئ  {{PLURAL:$5|یک نخسه|$5 نخسه}}‌ئی پیدایي‌ئا  چیهراکائی  {{GENDER:$2|تغییر دات}}: $4",
        "revdelete-content-hid": "محتوائانه چیهر کورت",
        "revdelete-summary-hid": "ایڈیٹ ئی خلاصه ئا چیهر کورت",
        "revdelete-uname-hid": "چیهرین کار زوروکئ نام",
index 18d2978..c715e9e 100644 (file)
@@ -27,7 +27,8 @@
                        "Aashaa",
                        "Sayma Jahan",
                        "Macofe",
-                       "Bodhisattwa"
+                       "Bodhisattwa",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "সংযোগগুলির নিচে দাগ দেখানো হোক:",
        "accmailtext": "[[User talk:$1|$1]] এর জন্য দৈব ভাবে উৎপন্ন শব্দ চাবি $2 এ পাঠানো হয়েছে।\nলগ-ইন করার পর ''[[Special:ChangePassword|পাসওয়ার্ড পরিবর্তন]]'' পাতা থেকে এটি পরিবর্তন করা যাব।",
        "newarticle": "(নতুন)",
        "newarticletext": "আপনি এমন একটি লিংক অনুসরণ করছেন, যা নেই।\nপাতাটি তৈরি করতে, নিচের বাক্সে তা টাইপ করা শুরু করুন (আরও তথ্য জানতে [$1 সহায়িকা পাতা] দেখুন)।\nআপনি যদি ভুল করে এখানে এসে থাকেন, তাহলে আপনার ব্রাউজারের '''back''' বোতাম ক্লিক করুন।",
-       "anontalkpagetext": "----''এটি একটি বেনামী ব্যবহারকারীর আলাপের পাতা, যিনি এখনও কোন অ্যাকাউন্ট তৈরি করেননি, কিংবা তিনি অ্যাকাউন্টটি ব্যবহার করছেন না।\nআমরা তাই সাংখ্যিক আইপি ঠিকানা ব্যবহার করে তাঁকে শনাক্ত করছি।\nএকাধিক ব্যবহারকারী এরকম একটি আইপি ঠিকানা ব্যবহার করতে পারেন।\nআপনি যদি একজন বেনামী ব্যবহারকারী হয়ে থাকেন এবং যদি অনুভব করেন যে আপনার প্রতি অপ্রাসঙ্গিক মন্তব্য করা হয়েছে, তাহলে অন্যান্য বেনামী ব্যবহারকারীর সাথে ভবিষ্যতে বিভ্রান্তি এড়াতে অনুগ্রহ করে [[Special:CreateAccount|একটি অ্যাকাউন্ট তৈরি করুন]] অথবা  [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ করুন]]।''",
+       "anontalkpagetext": "----\n<em>এটি একটি বেনামী ব্যবহারকারীর আলাপের পাতা, যিনি এখনও কোন অ্যাকাউন্ট তৈরি করেননি, কিংবা তিনি অ্যাকাউন্টটি ব্যবহার করছেন না।</em>\nআমরা তাই সাংখ্যিক আইপি ঠিকানা ব্যবহার করে তাঁকে শনাক্ত করছি।\nএকাধিক ব্যবহারকারী এরকম একটি আইপি ঠিকানা ব্যবহার করতে পারেন।\nআপনি যদি একজন বেনামী ব্যবহারকারী হয়ে থাকেন এবং যদি অনুভব করেন যে আপনার প্রতি অপ্রাসঙ্গিক মন্তব্য করা হয়েছে, তাহলে অন্যান্য বেনামী ব্যবহারকারীর সাথে ভবিষ্যতে বিভ্রান্তি এড়াতে অনুগ্রহ করে [[Special:CreateAccount|একটি অ্যাকাউন্ট তৈরি করুন]] অথবা  [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ করুন]]।",
        "noarticletext": "বর্তমানে এই পাতায় কোন লেখা নেই।\nআপনি চাইলে অন্যান্য পাতায় [[Special:Search/{{PAGENAME}}| এই শিরোনামটি অনুসন্ধান করতে পারেন]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} এ সম্পর্কিত লগ অনুসন্ধান করতে পারেন], \nকিংবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পাতাটি তৈরি করতে পারেন]</span>।",
        "noarticletext-nopermission": "বর্তমানে এই পাতায় কোন লেখা নেই।\nআপনি চাইলে অন্য পাতায় [[Special:Search/{{PAGENAME}}| শিরোনামটি অনুসন্ধান করতে পারেন]], অথবা <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পর্কিত লগ অনুসন্ধান করতে পারেন]</span>, কিন্তু আপনার এই পাতাটি তৈরী করার অনুমতি নেই।",
        "missing-revision": "\"{{FULLPAGENAME}}\" এর #$1তম সংস্করণটি প্রদর্শন সম্ভব নয়।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক ওপেন করার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
        "whatlinkshere-prev": "{{PLURAL:$1|পূর্ববর্তী|পূর্ববর্তী $1টি}}",
        "whatlinkshere-next": "{{PLURAL:$1|পরবর্তী|পরবর্তী $1টি}}",
        "whatlinkshere-links": "← সংযোগগুলি",
-       "whatlinkshere-hideredirs": "পুননির্দেশনা আড়াল করো",
-       "whatlinkshere-hidetrans": "অন্তর্ভুক্তকরণ আড়াল করো",
-       "whatlinkshere-hidelinks": "সংযোগ আড়াল করো",
-       "whatlinkshere-hideimages": "ফাইল সংযোগ আড়াল করো",
+       "whatlinkshere-hideredirs": "পুননির্দেশনা $1",
+       "whatlinkshere-hidetrans": "অন্তর্ভুক্তকরণ $1",
+       "whatlinkshere-hidelinks": "সংযোগ $1",
+       "whatlinkshere-hideimages": "ফাইল সংযোগ $1",
        "whatlinkshere-filters": "ছাকনী",
        "whatlinkshere-submit": "চলো",
        "autoblockid": "স্বয়ংক্রিয় বাধা #$1",
index 31ccf1d..e059776 100644 (file)
@@ -54,7 +54,8 @@
                        "Matma Rex",
                        "KRLS",
                        "Jaumeortola",
-                       "Kippelboy"
+                       "Kippelboy",
+                       "Syum90"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "userlogin-resetpassword-link": "Heu oblidat la contrasenya?",
        "userlogin-helplink2": "Ajuda amb el registre",
        "userlogin-loggedin": "Heu iniciat una sessió com {{GENDER:$1|$1}}.\nFeu servir el formulari de sota per iniciar la sessió com un altre usuari.",
+       "userlogin-reauth": "Heu d'iniciar sessió de nou per comprovar que sou {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crea un altre compte",
        "createacct-emailrequired": "Adreça electrònica",
        "createacct-emailoptional": "Adreça electrònica (opcional)",
        "noname": "No heu especificat un nom vàlid d'usuari.",
        "loginsuccesstitle": "Sessió iniciada",
        "loginsuccess": "Heu iniciat la sessió a {{SITENAME}} com a «$1».",
-       "nosuchuser": "No hi ha cap usuari anomenat «$1».\nReviseu-ne l'ortografia (recordeu que es distingeixen les majúscules i minúscules), o [[Special:CreateAccount|creeu un compte d'usuari nou]].",
+       "nosuchuser": "No hi ha cap usuari anomenat «$1».\nEls noms d'usuari distingeixen majúscules i minúscules.\nComproveu l'ortografia o [[Special:CreateAccount|creeu un compte nou]].",
        "nosuchusershort": "No hi ha cap usuari anomenat «$1». Comproveu que ho hàgiu escrit correctament.",
        "nouserspecified": "Heu d'especificar un nom d'usuari.",
        "login-userblocked": "Aquest usuari està bloquejat. Inici de sessió no permès.",
        "createacct-another-realname-tip": "El nom real és opcional.\nSi decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
        "pt-login": "Inicia la sessió",
        "pt-login-button": "Inicia sessió",
+       "pt-login-continue-button": "Continua l'inici de sessió",
        "pt-createaccount": "Crea un compte",
        "pt-userlogout": "Finalitza la sessió",
        "php-mail-error-unknown": "Error desconegut en la funció mail() de PHP",
        "passwordreset-emailsentemail": "Si aquesta adreça electrònica està associada al vostre compte, s’enviarà un missatge de restabliment de contrasenya.",
        "passwordreset-emailsent-capture": "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
        "passwordreset-emailerror-capture": "S'ha generat un correu electrònic de renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|S'ha enviat el correu|S'han enviat els correus}} de restabliment de {{PLURAL:$1|contrasenya|contrasenyes}}. A continuació es mostra {{PLURAL:$1|l'usuari i contrasenya|la llista d'usuaris i contrasenyes}}.",
+       "passwordreset-invalideamil": "Adreça de correu electrònic no vàlida",
        "changeemail": "Canvia o elimina l’adreça electrònica",
        "changeemail-header": "Empleneu aquest formulari per canviar la vostra adreça electrònica. Si voleu eliminar qualssevol associacions d’adreces electròniques del vostre compte, deixeu en blanc el camp i envieu el formulari.",
        "changeemail-passwordrequired": "Cal que introduïu la vostra contrasenya per confirmar el canvi.",
        "accmailtext": "S'ha enviat una contrasenya aleatòria a $2 per a {{GENDER:$1|l'usuari|la usuària}} [[User talk:$1|$1]].\n\nLa contrasenya per aquest nou compte pot ser canviada a la pàgina de ''[[Special:ChangePassword|canvi de contrasenya]]'' un cop connectat.",
        "newarticle": "(Nou)",
        "newarticletext": "Heu seguit un enllaç a una pàgina que encara no existeix.\nPer a crear-la, comenceu a escriure en l'espai de sota\n(vegeu l'[$1 ajuda] per a més informació).\nSi sou ací per error, simplement cliqueu al botó «Enrere» del vostre navegador.",
-       "anontalkpagetext": "----''Aquesta és la pàgina de discussió d'un usuari anònim que encara no ha creat un compte o que no fa servir el seu nom registrat. Per tant, hem de fer servir la seua adreça IP numèrica per a identificar-lo. Una adreça IP pot ser compartida per molts usuaris. Si sou un usuari anònim, i trobeu que us han adreçat comentaris inoportuns, si us plau, [[Special:CreateAccount|creeu-vos un compte]], o [[Special:UserLogin|entreu en el vostre compte]] si ja en teniu un, per a evitar futures confusions amb altres usuaris anònims.''",
+       "anontalkpagetext": "----\n<em>Aquesta és la pàgina de discussió d'un usuari anònim que encara no ha creat un compte o que no fa servir el seu nom registrat. Per tant, hem de fer servir la seua adreça IP numèrica per a identificar-lo. Una adreça IP pot ser compartida per diversos usuaris. Si sou un usuari anònim i trobeu que us han adreçat comentaris no apropiats, [[Special:CreateAccount|creeu un compte]] o [[Special:UserLogin|inicieu sessió]] per a evitar futures confusions amb altres usuaris anònims.",
        "noarticletext": "Actualment no hi ha text en aquesta pàgina.\nPodeu [[Special:Search/{{PAGENAME}}|cercar aquest títol]] en altres pàgines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar en els registres]\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear-la ara]</span>.",
        "noarticletext-nopermission": "Actualment no hi ha text en aquesta pàgina.\nPodeu [[Special:Search/{{PAGENAME}}|cercar aquest títol]] en altres pàgines o bé <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar en els registres relacionats]</span>, però no teniu permisos per crear la pàgina.",
        "missing-revision": "La revisió núm. $1 de la pàgina anomenada «{{FULLPAGENAME}}» no existeix.\n\nNormalment això ocorre quan seguiu un enllaç d’historial desactualitzat que apunta a una pàgina que s’ha suprimit.\nPodeu trobar detalls en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "userpage-userdoesnotexist": "Atenció: El compte d'usuari «<nowiki>$1</nowiki>» no està registrat. En principi no hauríeu de crear ni editar aquesta pàgina.",
        "userpage-userdoesnotexist-view": "El compte d'usuari \"$1\" no està registrat.",
        "blocked-notice-logextract": "En aquests moments aquest compte d'usuari es troba blocat.\nPer més detalls, la darrera entrada del registre es mostra a continuació:",
-       "clearyourcache": "'''Nota:''' Després de desar, possiblement necessiteu refrescar la memòria cau del vostre navegador per a veure'n els canvis.\n* '''Firefox / Safari:''' Premeu ''Shift'' mentre cliqueu el botó ''Actualitzar'', o pressioneu ''Ctrl+F5'' o ''Ctrl+R'' (''⌘+R'' a Mac)\n* '''Google Chrome:''' Premeu ''Ctrl+Shift+R'' (''⌘+Shift+R'' a Mac)\n* '''Internet Explorer:''' Premeu la tecla ''Ctrl'' mentre cliqueu a ''Actualitzar'' o pressioneu ''Ctrl+F5''\n* '''Opera:''' Netegeu la memòria cau ''Eines → Preferències''",
+       "clearyourcache": "<strong>Nota:</strong> Després de desar, possiblement necessitareu refrescar la memòria cau del vostre navegador per a veure'n els canvis.\n* <strong>Firefox / Safari:</strong> Premeu <em>Shift</em> i alhora cliqueu el botó <em>Actualitza</em>, o pressioneu <em>Ctrl+F5</em> o <em>Ctrl+R</em> (<em>⌘+R</em> en un Mac)\n* <strong>Google Chrome:</strong> Premeu <em>Ctrl+Shift+R</em> (<em>⌘+Shift+R</em> en un Mac)\n* <strong>Internet Explorer:</strong> Premeu <em>Ctrl</em> i alhora cliqueu a <em>Actualitza</em> o pressioneu <em>Ctrl+F5</em>\n* <strong>Opera:</strong> Aneu a <em>Menú → Preferències</em> (<em>Opera → Preferències</em> en un Mac) i llavors a <em>Privadesa i seguretat → Neteja dades de navegació → Imatges i fitxers en memòria cau</em>.",
        "usercssyoucanpreview": "'''Consell:''' Utilitzeu el botó \"{{int:showpreview}}\" per provar el vostre nou CSS abans de desar-lo.",
        "userjsyoucanpreview": "'''Consell:''' Utilitzeu el botó \"{{int:showpreview}}\" per provar el vostre nou JavaScript abans de desar-lo.",
        "usercsspreview": "'''Recordeu que esteu previsualitzant el vostre CSS d'usuari.'''\n'''Encara no s'ha desat!'''",
        "group-bot": "Bots",
        "group-sysop": "Administradors",
        "group-bureaucrat": "Buròcrates",
-       "group-suppress": "Supressors",
+       "group-suppress": "Supressors de Flow",
        "group-all": "(tots)",
        "group-user-member": "{{GENDER:$1|usuari|usuària}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usuari autoconfirmat|usuària autoconfirmada}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
        "group-bureaucrat-member": "{{GENDER:$1|buròcrata}}",
-       "group-suppress-member": "{{GENDER:$1|supressor|supressora}}",
+       "group-suppress-member": "{{GENDER:$1|supressor|supressora}} de Flow",
        "grouppage-user": "{{ns:project}}:Usuaris",
        "grouppage-autoconfirmed": "{{ns:project}}:Usuaris autoconfirmats",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administradors",
        "grouppage-bureaucrat": "{{ns:project}}:Buròcrates",
-       "grouppage-suppress": "{{ns:project}}:Supress",
+       "grouppage-suppress": "{{ns:project}}:Supressors de Flow",
        "right-read": "Llegir pàgines",
        "right-edit": "Modificar pàgines",
        "right-createpage": "Crear pàgines (que no són de discussió)",
        "grant-editprotected": "Modifica pàgines protegides",
        "grant-highvolume": "Edició d'alt volum",
        "grant-oversight": "Amaga usuaris i suprimeix revisions",
+       "grant-protect": "Protecció i desprotecció de pàgines",
+       "grant-rollback": "Reversió de canvis en pàgines",
+       "grant-sendemail": "Enviament de correus a altres usuaris",
+       "grant-uploadeditmovefile": "Penjar, substituir i reanomenar fitxers",
        "grant-uploadfile": "Carrega fitxers nous",
        "grant-basic": "Permisos bàsics",
        "grant-viewdeleted": "Mostra fitxers eliminats i pàgines",
        "action-viewmyprivateinfo": "mostra la informació personal",
        "action-editmyprivateinfo": "edita la informació personal",
        "action-editcontentmodel": "editar el model de contingut d'una pàgina",
-       "action-managechangetags": "crear i suprimir etiquetes de la base de dades",
+       "action-managechangetags": "crear i (des)activar etiquetes",
        "action-applychangetags": "aplica les etiquetes juntament amb els canvis",
        "action-changetags": "afegeix i elimina etiquetes a les revisions i les entrades de registre individuals",
        "nchanges": "$1 {{PLURAL:$1|canvi|canvis}}",
        "upload-options": "Opcions de càrrega",
        "watchthisupload": "Vigila aquest fitxer",
        "filewasdeleted": "Prèviament es va carregar un fitxer d'aquest nom i després va ser esborrat. Hauríeu de verificar $1 abans de procedir a carregar-lo una altra vegada.",
+       "filename-thumb-name": "Aquest títol sembla que és d'una miniatura. No pengeu versions en miniatura en el mateix wiki. Si no és el cas, corregiu el nom del fitxer per a que sigui més descriptiu i que no tingui un prefix de miniatura.",
        "filename-bad-prefix": "El nom del fitxer que esteu penjant comença amb '''«$1»''', que és un nom no descriptiu que les càmeres digitals normalment assignen de forma automàtica. Trieu un de més descriptiu per al vostre fitxer.",
        "upload-proto-error": "El protocol és incorrecte",
        "upload-proto-error-text": "Per a les càrregues remotes cal que els URL comencin amb <code>http://</code> o <code>ftp://</code>.",
        "apisandbox-dynamic-parameters": "Paràmetres adicionals",
        "apisandbox-dynamic-parameters-add-label": "Afegeix un paràmetre:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nom del paràmetre",
+       "apisandbox-dynamic-error-exists": "Ja existeix un paràmetre anomenat \"$1\".",
        "apisandbox-deprecated-parameters": "Paràmetres obsolets",
        "apisandbox-submit-invalid-fields-title": "Alguns camps no són vàlids",
        "apisandbox-results": "Resultats",
        "whatlinkshere-prev": "{{PLURAL:$1|anterior|anteriors $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|següent|següents $1}}",
        "whatlinkshere-links": "← enllaços",
-       "whatlinkshere-hideredirs": "Amaga les redireccions",
-       "whatlinkshere-hidetrans": "Amagar transclusions",
-       "whatlinkshere-hidelinks": "Amagar enllaços",
+       "whatlinkshere-hideredirs": "$1 redireccions",
+       "whatlinkshere-hidetrans": "$1 inclusions",
+       "whatlinkshere-hidelinks": "$1 enllaços",
        "whatlinkshere-hideimages": "$1 enllaços de fitxers",
        "whatlinkshere-filters": "Filtres",
        "whatlinkshere-submit": "Vés-hi",
        "lockedbyandtime": "(per $1 el $2 a les $3)",
        "move-page": "Reanomena $1",
        "move-page-legend": "Reanomena la pàgina",
-       "movepagetext": "Amb el formulari següent reanomenareu una pàgina, movent tot el seu historial al nou nom.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol.\nPodeu actualitzar automàticament les redireccions que apuntin al títol original.\nSi no ho feu, assegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nSerà de la vostra responsabilitat verificar que els enllaços segueixin apuntant cap a on se suposa que ho han de fer.\n\nTingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció sense més historial.\nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n\n'''Atenció!'''\nAçò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; \nassegureu-vos d'entendre les conseqüències que comporta abans de seguir endavant.",
+       "movepagetext": "Amb el formulari següent reanomenareu una pàgina, movent tot el seu historial al nou nom.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol.\nPodeu actualitzar automàticament les redireccions que apuntin al títol original.\nSi no ho feu, assegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nSerà de la vostra responsabilitat verificar que els enllaços segueixin apuntant cap a on se suposa que ho han de fer.\n\nTingueu en compte que la pàgina <strong>no</strong> serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció sense més historial.\nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n\n<strong>Nota:</strong>\nAçò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; \nassegureu-vos d'entendre les conseqüències que comporta abans de seguir endavant.",
        "movepagetext-noredirectfixer": "Amb el formulari següent podeu reanomenar una pàgina movent tot el seu historial al nom nou.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol. \nAssegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nÉs responsabilitat vostra assegurar que els enllaços continuen apuntant cap a on se suposa que han d'anar. \n\nTingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció i no tingui més historial. \nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n \n'''Atenció!''' \nAixò pot ser un canvi dràstic i inesperat per una pàgina popular; \nassegureu-vos que sabeu el que feu abans de continuar.",
        "movepagetalktext": "La pàgina de discussió associada també serà traslladada automàticament '''tret que''':\n* Ja existeixi una pàgina de discussió no buida amb el nou nom, o\n* Desactiveu l'opció de més avall.\n\nEn aquests casos, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
        "moveuserpage-warning": "'''Atenció:''' Esteu a punt de moure una pàgina d'usuari. Tingueu en compte que només la pàgina es desplaçarà i que el compte d'usuari ''no'' canviarà de nom.",
        "tooltip-pt-preferences": "{{GENDER:|Les vostres}} preferències",
        "tooltip-pt-watchlist": "La llista de pàgines de les quals vigileu els canvis.",
        "tooltip-pt-mycontris": "Llista de {{GENDER:|les vostres}} contribucions",
+       "tooltip-pt-anoncontribs": "Una llista de les modificacions fetes des d'aquesta adreça IP",
        "tooltip-pt-login": "Us animem a registrar-vos, però no és obligatori",
        "tooltip-pt-logout": "Finalitza la sessió d'usuari",
        "tooltip-pt-createaccount": "Us animem a què creeu un compte i inicieu sessió, encara que no és obligatori",
        "log-action-filter-protect-modify": "Modificació de la protecció",
        "log-action-filter-protect-unprotect": "Desprotecció",
        "log-action-filter-upload-upload": "Nova càrrega",
-       "log-action-filter-upload-overwrite": "Torna a carregar"
+       "log-action-filter-upload-overwrite": "Torna a carregar",
+       "authmanager-realname-label": "Nom real",
+       "authmanager-realname-help": "Nom real de l'usuari"
 }
index 732d94b..f8362e4 100644 (file)
@@ -29,7 +29,8 @@
                        "Cvanca",
                        "Macofe",
                        "Urbanecm",
-                       "LordMsz"
+                       "LordMsz",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podtrhávat odkazy:",
        "password-change-forbidden": "Na této wiki nemůžete měnit hesla.",
        "externaldberror": "Buď nastala chyba externí autentizační databáze, nebo nemáte dovoleno měnit svůj externí účet.",
        "login": "Přihlaste se",
+       "login-security": "Ověřte svou identitu",
        "nav-login-createaccount": "Přihlášení / vytvoření účtu",
        "userlogin": "Přihlášení / vytvoření účtu",
        "userloginnocreate": "Přihlášení",
        "userlogin-resetpassword-link": "Zapomněli jste heslo?",
        "userlogin-helplink2": "Nápověda k přihlašování",
        "userlogin-loggedin": "Již jste {{GENDER:$1|přihlášen|přihlášena}} jako $1.\nPomocí formuláře níže se můžete přihlásit jako jiný uživatel.",
+       "userlogin-reauth": "Abyste {{GENDER:$1|prokázal|prokázala|prokázali}}, že jste $1, musíte se znovu přihlásit.",
        "userlogin-createanother": "Vytvořit jiný účet",
        "createacct-emailrequired": "E-mailová adresa",
        "createacct-emailoptional": "E-mailová adresa (nepovinné)",
        "nocookiesnew": "Uživatelský účet byl vytvořen, ale nejste přihlášeni. {{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím, zapněte je a poté se přihlaste svým novým uživatelským jménem a heslem.",
        "nocookieslogin": "{{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a zkuste znovu.",
        "nocookiesfornew": "Uživatelský účet nebyl založen, neboť jsme nebyli schopni potvrdit jeho původ.\nUjistěte se, že máte povoleny cookies, obnovte tuto stránku a zkuste to znovu.",
+       "createacct-loginerror": "Účet byl úspěšně vytvořen, ale nemohli jste být automaticky přihlášeni. Pokračujte prosím na [[Special:UserLogin|ruční přihlášení]].",
        "noname": "{{GENDER:|Nezadal|Nezadala|Nezadali}} jste platné uživatelské jméno.",
        "loginsuccesstitle": "Přihlášení bylo úspěšné",
        "loginsuccess": "<strong>Nyní jste na {{grammar:6sg|{{SITENAME}}}} {{GENDER:$1|přihlášen jako uživatel|přihlášena jako uživatelka}} „$1“.</strong>",
-       "nosuchuser": "Neexistuje uživatel se jménem „$1“. U uživatelských jmen se rozlišují malá/velká písmena. Zkontrolujte zápis, nebo si [[Special:CreateAccount|vytvořte nový účet]].",
+       "nosuchuser": "Neexistuje uživatel se jménem „$1“.\nU uživatelských jmen se rozlišují malá/velká písmena.\nZkontrolujte zápis, nebo si [[Special:CreateAccount|vytvořte nový účet]].",
        "nosuchusershort": "Neexistuje uživatel se jménem „$1“. Zkontrolujte zápis.",
        "nouserspecified": "Musíte zadat uživatelské jméno.",
        "login-userblocked": "{{GENDER:$1|Tento uživatel je zablokován|Tato uživatelka je zablokována}}. Přihlášení není dovoleno.",
        "createacct-another-realname-tip": "Skutečné jméno je nepovinné.\nPokud se ho rozhodnete uvést, bude použito pro označení autorství vaší práce.",
        "pt-login": "Přihlášení",
        "pt-login-button": "Přihlásit se",
+       "pt-login-continue-button": "Pokračovat v přihlášení",
        "pt-createaccount": "Vytvoření účtu",
        "pt-userlogout": "Odhlásit se",
        "php-mail-error-unknown": "Neznámá chyba v PHP funkci mail()",
        "botpasswords-invalid-name": "Uvedené uživatelské jméno neobsahuje oddělovač hesel pro boty („$1“).",
        "botpasswords-not-exist": "Uživatel „$1“ nemá heslo pro bota nazvaného „$2“.",
        "resetpass_forbidden": "Hesla nelze změnit.",
+       "resetpass_forbidden-reason": "Hesla nelze změnit: $1",
        "resetpass-no-info": "K této stránce mají přímý přístup jen přihlášení uživatelé.",
        "resetpass-submit-loggedin": "Změnit heslo",
        "resetpass-submit-cancel": "Storno",
        "whatlinkshere-prev": "{{PLURAL:$1|předchozí|předchozí $1|předchozích $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|následující|následující $1|následujících $1}}",
        "whatlinkshere-links": "← odkazy",
-       "whatlinkshere-hideredirs": "Skrýt přesměrování",
-       "whatlinkshere-hidetrans": "Skrýt vložení",
-       "whatlinkshere-hidelinks": "Skrýt odkazy",
-       "whatlinkshere-hideimages": "Skrýt vložení souboru",
+       "whatlinkshere-hideredirs": "$1 přesměrování",
+       "whatlinkshere-hidetrans": "$1 vložení",
+       "whatlinkshere-hidelinks": "$1 odkazy",
+       "whatlinkshere-hideimages": "$1 vložení souboru",
        "whatlinkshere-filters": "Filtry",
        "whatlinkshere-submit": "Přejít",
        "autoblockid": "Autoblok #$1",
index efe2990..0981b43 100644 (file)
        "suppressionlog": "Пытару журналĕ",
        "history-title": "\"$1\" улшăннисен историйĕ",
        "lineno": "$1-мĕш йĕрке:",
-       "editundo": "пăрахăçла",
+       "editundo": "унчченхи",
        "searchresults": "Шыранă результачĕсем",
        "textmatches": "Статьясенчи текст пĕрпеклĕхĕ",
        "prevn": "унчченхи {{PLURAL:$1|$1}}",
        "categories": "Категорисем",
        "categories-submit": "Кăтарт",
        "categoriespagetext": "Викинче çак категорисем пур.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
-       "special-categories-sort-count": "шучĕ тăрăх йĕркеле",
-       "special-categories-sort-abc": "алфавит тăрăх йĕркеле",
        "deletedcontributions": "Тулашран тунă ӳсĕм",
        "linksearch-ns": "Ят хушши:",
        "linksearch-ok": "Шырамалли",
        "ipaddressorusername": "IP адрес е усă куракан ят:",
        "ipbreason": "Сăлтавĕ",
        "ipbother": "Урăх вăхăт:",
-       "ipboptions": "2 Ñ\81еÑ\85еÑ\82:2 hours,1 ÐºÑ\83н:1 day,3 ÐºÑ\83н:3 days,1 Ñ\8dÑ\80не:1 week,2 Ñ\8dÑ\80не:2 weeks,1 Ñ\83йÄ\83Ñ\85:1 month,3 Ñ\83йÄ\83Ñ\85:3 months,6 Ñ\83йÄ\83Ñ\85:6 months,1 Ã§Ñ\83л:1 year,Ñ\8fванлÄ\83Ñ\85а:infinite",
+       "ipboptions": "2 Ñ\81еÑ\85еÑ\82:2 hours,1 ÐºÑ\83н:1 day,3 ÐºÑ\83н:3 days,1 Ñ\8dÑ\80не:1 week,2 Ñ\8dÑ\80не:2 weeks,1 Ñ\83йÄ\83Ñ\85:1 month,3 Ñ\83йÄ\83Ñ\85:3 months,6 Ñ\83йÄ\83Ñ\85:6 months,1 Ã§Ñ\83л:1 year,Ñ\8fлана:infinite",
        "badipaddress": "IP-адрес формачĕ тĕрĕс мар, е ку ятлă хутшăнакан кунта çук.",
        "blockipsuccesssub": "Ĕçлеме чартăмăр",
        "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] ĕçлеме чарнă.\n<br />[[Special:BlockList|ĕçлеме чарнă IP-адрессен списокне]] пăх.",
        "version": "Верси",
        "redirect-submit": "Куç",
        "fileduplicatesearch": "Пĕр пек файлсен шыравĕ",
-       "fileduplicatesearch-legend": "Дубликатсен шыравĕ",
        "fileduplicatesearch-filename": "Файл ячĕ:",
        "fileduplicatesearch-submit": "Туп",
        "specialpages": "Ятарлă страницăсем",
index 7a43083..a168d1b 100644 (file)
@@ -57,7 +57,8 @@
                        "Stefan2",
                        "Ribewiki",
                        "Jens Jensen",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Anders Feder"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
@@ -75,6 +76,7 @@
        "tog-watchdefault": "Tilføj sider og filer, jeg redigerer, til min overvågningsliste",
        "tog-watchmoves": "Tilføj sider og filer, jeg flytter, til min overvågningsliste",
        "tog-watchdeletion": "Tilføj sider og filer, jeg sletter, til min overvågningsliste",
+       "tog-watchuploads": "Tilføj nye filer jeg uploader til min overvågningsliste",
        "tog-watchrollback": "Tilføj sider, hvor jeg har udført en tilbagerulning til min overvågningsliste",
        "tog-minordefault": "Markér som standard alle redigeringer som mindre",
        "tog-previewontop": "Vis forhåndsvisning over redigeringsboksen",
        "october-date": "$1. oktober",
        "november-date": "$1. november",
        "december-date": "$1. december",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategorier}}",
        "category_header": "Sider i kategorien \"$1\"",
        "subcategories": "Underkategorier",
        "databaseerror-query": "Forespørgsel: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fejl: $1",
+       "transaction-duration-limit-exceeded": "For at undgå høje replikationsforsinkelser blev denne transaktion afbrudt fordi tiden det tog at lagre ($1) oversteg maksimumsgrænsen på $2 {{PLURAL:$2|sekund|sekunder}}.\nHvis du er ved at ændre mange emner på en gang, så prøv at udføre flere mindre operationer i stedet.",
        "laggedslavemode": "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.",
        "readonly": "Databasen er skrivebeskyttet",
        "enterlockreason": "Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornår skrivebeskyttelsen ophæves igen",
-       "readonlytext": "Databasen er i øjeblikket låst for nye poster og andre ændringer, sandsynligvis for rutinemæssig databasevedligeholdelse, hvorefter den vil være tilbage til normal.\n\nDen administrator som har låst, gav denne forklaring: $1",
+       "readonlytext": "Databasen er i øjeblikket låst for nye poster og andre ændringer, formentlig pga. rutinemæssig databasevedligeholdelse, hvorefter den vil være tilbage til normalen.\n\nSystemadministratoren som låste den, gav denne forklaring: $1",
        "missing-article": "Databasen burde indeholde siden \"$1\" $2, men det gør den ikke.\n\nDen sandsynlige årsag er at du har fulgt et forældet link til en forskel eller en gammel version af en side der er blevet slettet.\n\nHvis det ikke er tilfældet, har du muligvis fundet en software-fejl.\nGør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, og husk at fortælle hvilken URL du har fulgt.",
        "missingarticle-rev": "(versionsnummer: $1)",
        "missingarticle-diff": "(Forskel: $1, $2)",
        "readonly_lag": "Databasen er automatisk blevet låst mens slave database serverne synkronisere med master databasen",
+       "nonwrite-api-promise-error": "HTTP-headeren 'Promise-Non-Write-API-Action' blev sendt, men forespørgslen var til et API skrivemodul.",
        "internalerror": "Intern fejl",
        "internalerror_info": "Intern fejl: $1",
        "internalerror-fatal-exception": "Alvorlig undtagelse af typen \"$1\"",
        "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 <em>$2</em>.",
-       "filereadonlyerror": "Ude af stand til at redigere filen \"$1\", fordi fildatabasen \"$2\" er skrivebeskyttet.\n\nAdministratoren, som skrivebeskyttede den, gav følgende begrundelse: \"$3\".",
+       "filereadonlyerror": "Ude af stand til at redigere filen \"$1\", fordi fildatabasen \"$2\" er skrivebeskyttet.\n\nSystemadministratoren, som skrivebeskyttede den, gav denne begrundelse: \"$3\".",
        "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å",
        "password-change-forbidden": "Du kan ikke ændre adgangskoder på denne wiki.",
        "externaldberror": "Der er opstået en fejl i en ekstern adgangsdatabase, eller du har ikke rettigheder til at opdatere denne.",
        "login": "Log på",
+       "login-security": "Bekræft din identitet",
        "nav-login-createaccount": "Opret en konto eller log på",
        "userlogin": "Opret en konto eller log på",
        "userloginnocreate": "Log på",
        "userlogin-resetpassword-link": "Glemt din adgangskode?",
        "userlogin-helplink2": "Hjælp med at logge på",
        "userlogin-loggedin": "Du er allerede logget på som {{GENDER:$1|$1}}.\nBrug formularen nedenfor til at logge på som en anden bruger.",
+       "userlogin-reauth": "Du skal logge på igen for at bekræfte, at du er {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Opret en anden konto",
        "createacct-emailrequired": "E-mailadresse",
        "createacct-emailoptional": "E-mailadresse (valgfri)",
        "createacct-email-ph": "Indtast din e-mailadresse",
        "createacct-another-email-ph": "Indtast e-mailadresse",
        "createaccountmail": "Brug en midlertidig tilfældig adgangskode og send den til den angivne e-mailadresse",
+       "createaccountmail-help": "Kan bruges til at oprette konto til en anden person uden at lære deres adgangskode.",
        "createacct-realname": "Dit rigtige navn (valgfrit)",
        "createaccountreason": "Begrundelse:",
        "createacct-reason": "Årsag",
        "whatlinkshere-prev": "{{PLURAL:$1|forrige|forrige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|næste|næste $1}}",
        "whatlinkshere-links": "← henvisninger",
-       "whatlinkshere-hideredirs": "Skjul omdirigeringer",
-       "whatlinkshere-hidetrans": "Skjul inkluderinger",
-       "whatlinkshere-hidelinks": "Skjul henvisninger",
+       "whatlinkshere-hideredirs": "$1 omdirigeringer",
+       "whatlinkshere-hidetrans": "$1 inkluderinger",
+       "whatlinkshere-hidelinks": "$1 henvisninger",
        "whatlinkshere-hideimages": "$1 filhenvisninger",
        "whatlinkshere-filters": "Filtre",
        "autoblockid": "Autoblock #$1",
index f3d076b..3817f79 100644 (file)
@@ -86,7 +86,8 @@
                        "MGChecker",
                        "FriedhelmW",
                        "Schniggendiller",
-                       "Predatorix"
+                       "Predatorix",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "password-change-forbidden": "Du kannst auf diesem Wiki keine Passwörter ändern.",
        "externaldberror": "Entweder liegt ein Fehler bei der externen Authentifizierung vor oder du darfst dein externes Benutzerkonto nicht aktualisieren.",
        "login": "Anmelden",
+       "login-security": "Verifiziere deine Identität",
        "nav-login-createaccount": "Anmelden / Benutzerkonto erstellen",
        "userlogin": "Anmelden / Benutzerkonto anlegen",
        "userloginnocreate": "Anmelden",
        "userlogin-resetpassword-link": "Passwort vergessen?",
        "userlogin-helplink2": "Hilfe beim Anmelden",
        "userlogin-loggedin": "Du bist bereits als {{GENDER:$1|$1}} angemeldet.\nBenutze das unten stehende Formular, um dich unter einem anderen Benutzernamen anzumelden.",
+       "userlogin-reauth": "Du musst dich erneut anmelden, um zu verifizieren, dass du {{GENDER:$1|$1}} bist.",
        "userlogin-createanother": "Ein weiteres Benutzerkonto erstellen",
        "createacct-emailrequired": "E-Mail-Adresse",
        "createacct-emailoptional": "E-Mail-Adresse (optional)",
        "createacct-email-ph": "Gib deine E-Mail-Adresse ein",
        "createacct-another-email-ph": "E-Mail-Adresse",
        "createaccountmail": "Ein temporäres Zufallspasswort verwenden und an die angegebene E-Mail-Adresse versenden",
+       "createaccountmail-help": "Kann verwendet werden, um für eine andere Person ein Benutzerkonto zu erstellen, ohne das Passwort zu erfahren.",
        "createacct-realname": "Bürgerlicher Name (optional)",
        "createaccountreason": "Grund:",
        "createacct-reason": "Begründung",
        "createacct-reason-ph": "Warum erstellst du ein anderes Benutzerkonto?",
+       "createacct-reason-help": "Im Neuanmeldungs-Logbuch angezeigte Nachricht",
        "createacct-submit": "Benutzerkonto erstellen",
        "createacct-another-submit": "Benutzerkonto erstellen",
+       "createacct-continue-submit": "Benutzerkontenerstellung fortfahren",
+       "createacct-another-continue-submit": "Benutzerkontenerstellung fortfahren",
        "createacct-benefit-heading": "{{SITENAME}} wird von Menschen wie dir geschaffen.",
        "createacct-benefit-body1": "{{PLURAL:$1|Bearbeitung|Bearbeitungen}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Seite|Seiten}}",
        "nocookiesnew": "Der Benutzerzugang wurde erstellt, aber du bist nicht angemeldet. {{SITENAME}} benötigt für diese Funktion Cookies, bitte aktiviere diese und melde dich dann mit deinem neuen Benutzernamen und dem zugehörigen Passwort an.",
        "nocookieslogin": "{{SITENAME}} benutzt Cookies zur Anmeldung der Benutzer. Du hast Cookies deaktiviert, bitte aktiviere diese und versuche es erneut.",
        "nocookiesfornew": "Das Benutzerkonto wurde nicht erstellt, da die Datenherkunft nicht ermittelt werden konnte.\nBitte stelle sicher, dass du Cookies aktiviert hast. Lade diese Seite danach erneut und versuche es noch einmal.",
+       "createacct-loginerror": "Das Benutzerkonto wurde erfolgreich erstellt, aber du konntest nicht automatisch angemeldet werden. Bitte fahre mit der [[Special:UserLogin|manuellen Anmeldung]] fort.",
        "noname": "Du musst einen gültigen Benutzernamen angeben.",
        "loginsuccesstitle": "Angemeldet",
        "loginsuccess": "<strong>Du bist jetzt als „$1“ bei {{SITENAME}} angemeldet.</strong>",
        "createacct-another-realname-tip": "Der bürgerliche Name ist optional.\nWenn du ihn angibst, wird er für die Zuordnung der Beiträge verwendet.",
        "pt-login": "Anmelden",
        "pt-login-button": "Anmelden",
+       "pt-login-continue-button": "Anmeldung fortfahren",
        "pt-createaccount": "Benutzerkonto erstellen",
        "pt-userlogout": "Abmelden",
        "php-mail-error-unknown": "Unbekannter Fehler in der PHP-Funktion mail().",
        "botpasswords-invalid-name": "Der angegebene Benutzername enthält keinen Botpassworttrenner („$1“).",
        "botpasswords-not-exist": "Der Benutzer „$1“ hat kein Botpasswort mit dem Namen „$2“.",
        "resetpass_forbidden": "Das Passwort kann nicht geändert werden.",
+       "resetpass_forbidden-reason": "Die Passwörter können nicht geändert werden: $1",
        "resetpass-no-info": "Du musst dich anmelden, um auf diese Seite direkt zuzugreifen.",
        "resetpass-submit-loggedin": "Passwort ändern",
        "resetpass-submit-cancel": "Abbrechen",
        "passwordreset-emailsentusername": "Falls es eine E-Mail-Adresse gibt, die mit diesem Benutzernamen verknüpft ist, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
        "passwordreset-emailsent-capture": "Eine Passwortzurücksetzungs-E-Mail wurde versandt, die unten angezeigt wird.",
        "passwordreset-emailerror-capture": "Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an {{GENDER:$2|den Benutzer|die Benutzerin}} gescheitert: $1",
+       "passwordreset-emailsent-capture2": "Die Passwort-Zurücksetzungs-{{PLURAL:$1|E-Mail wurde|E-Mails wurden}} versandt. {{PLURAL:$1|Der Benutzername und das Passwort|Die Liste der Benutzernamen und Passwörter}} wird unten angezeigt.",
+       "passwordreset-emailerror-capture2": "Das Senden der E-Mail an {{GENDER:$2|den Benutzer|die Benutzerin}} ist fehlgeschlagen: $1 {{PLURAL:$3|Der Benutzername und das Passwort|Die Liste der Benutzernamen und Passwörter}} wird unten angezeigt.",
+       "passwordreset-nocaller": "Es muss ein Rufer angegeben werden",
+       "passwordreset-nosuchcaller": "Rufer ist nicht vorhanden: $1",
+       "passwordreset-ignored": "Die Passwortzurücksetzung konnte nicht verarbeitet werden. Vielleicht wurde kein Dienstanbieter konfiguriert?",
+       "passwordreset-invalideamil": "Ungültige E-Mail-Adresse",
+       "passwordreset-nodata": "Weder ein Benutzername noch eine E-Mail-Adresse wurde angegeben",
        "changeemail": "E-Mail-Adresse ändern oder entfernen",
        "changeemail-header": "Fülle dieses Formular vollständig aus, um deine E-Mail-Adresse zu ändern. Falls du die Zuweisung einer E-Mail-Adresse zu deinem Benutzerkonto entfernen möchtest, lasse beim Übermitteln des Formulars das Feld für die neue E-Mail-Adresse leer.",
        "changeemail-passwordrequired": "Du musst dein Passwort eingeben, um diese Änderung zu bestätigen.",
        "accmailtext": "Ein zufällig generiertes Passwort für [[User talk:$1|$1]] wurde an $2 versandt. Es kann auf der Seite ''[[Special:ChangePassword|Passwort ändern]]'' nach der Anmeldung geändert werden.",
        "newarticle": "(Neu)",
        "newarticletext": "Du bist einem Link zu einer Seite gefolgt, die nicht vorhanden ist.\nUm diese Seite anzulegen, trage deinen Text in das untenstehende Bearbeitungsfeld ein (weitere Informationen auf der [$1 Hilfeseite]).\nSofern du fälschlicherweise hier bist, klicke auf die Schaltfläche '''Zurück''' deines Browsers.",
-       "anontalkpagetext": "----''Diese Seite dient dazu, einem nicht angemeldeten Benutzer Nachrichten zu hinterlassen. Es wird seine IP-Adresse zur Identifizierung verwendet. IP-Adressen können von mehreren Benutzern gemeinsam verwendet werden. Wenn du mit den Kommentaren auf dieser Seite nichts anfangen kannst, richten sie sich vermutlich an einen früheren Inhaber deiner IP-Adresse und du kannst sie ignorieren. Du kannst dir auch ein [[Special:CreateAccount|Benutzerkonto erstellen]] oder dich [[Special:UserLogin|anmelden]], um künftig Verwechslungen mit anderen anonymen Benutzern zu vermeiden.''",
+       "anontalkpagetext": "----\n<em>Diese Seite dient dazu, einem nicht angemeldeten Benutzer Nachrichten zu hinterlassen.</em>\nEs wird seine IP-Adresse zur Identifizierung verwendet.\nIP-Adressen können von mehreren Benutzern gemeinsam verwendet werden.\nWenn du mit den Kommentaren auf dieser Seite nichts anfangen kannst, richten sie sich vermutlich an einen früheren Inhaber deiner IP-Adresse und du kannst sie ignorieren.\nDu kannst dir auch ein [[Special:CreateAccount|Benutzerkonto erstellen]] oder dich [[Special:UserLogin|anmelden]], um künftig Verwechslungen mit anderen anonymen Benutzern zu vermeiden.",
        "noarticletext": "Diese Seite enthält momentan noch keinen Text.\nDu kannst sie <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}} erstellen]</span>,\nihren Titel auf anderen Seiten [[Special:Search/{{PAGENAME}}|suchen]]\noder die zugehörigen <span class=\"plainlinks\">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbücher betrachten]</span>.",
        "noarticletext-nopermission": "Diese Seite enthält momentan noch keinen Text und du bist auch nicht dazu berechtigt, diese Seite zu erstellen.\nDu kannst ihren Titel auf anderen Seiten [[Special:Search/{{PAGENAME}}|suchen]] oder die zugehörigen <span class=\"plainlinks\">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbücher betrachten].</span>",
        "missing-revision": "Die Version $1 der Seite namens „{{FULLPAGENAME}}“ ist nicht vorhanden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] einsehbar.",
        "whatlinkshere-prev": "{{PLURAL:$1|vorheriger|vorherige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|nächster|nächste $1}}",
        "whatlinkshere-links": "← Links",
-       "whatlinkshere-hideredirs": "Weiterleitungen ausblenden",
-       "whatlinkshere-hidetrans": "Vorlageneinbindungen ausblenden",
-       "whatlinkshere-hidelinks": "Links ausblenden",
-       "whatlinkshere-hideimages": "Dateilinks ausblenden",
+       "whatlinkshere-hideredirs": "Weiterleitungen $1",
+       "whatlinkshere-hidetrans": "Vorlageneinbindungen $1",
+       "whatlinkshere-hidelinks": "Links $1",
+       "whatlinkshere-hideimages": "Dateilinks $1",
        "whatlinkshere-filters": "Filter",
        "whatlinkshere-submit": "Los",
        "autoblockid": "Automatische Sperrung #$1",
        "log-action-filter-suppress-block": "Benutzerunterdrückung durch Sperre",
        "log-action-filter-suppress-reblock": "Benutzerunterdrückung durch Neusperre",
        "log-action-filter-upload-upload": "Neue Hochladung",
-       "log-action-filter-upload-overwrite": "Wiederhochladung"
+       "log-action-filter-upload-overwrite": "Wiederhochladung",
+       "authmanager-authn-not-in-progress": "Die Authentifizierung ist nicht im Gang oder es sind Sitzungsdaten verloren gegangen. Bitte beginne von vorn.",
+       "authmanager-authn-no-primary": "Die angegebenen Anmeldeinformationen konnten nicht überprüft werden.",
+       "authmanager-authn-no-local-user": "Die angegebenen Anmeldeinformationen sind mit keinem Benutzer auf diesem Wiki verknüpft.",
+       "authmanager-authn-no-local-user-link": "Die angegebenen Anmeldeinformationen sind gültig, aber sind mit keinem Benutzer auf diesem Wiki verknüpft. Melde dich auf andere Weise an oder erstelle ein neues Benutzerkonto und du wirst die Möglichkeit haben, deine früheren Anmeldeinformationen mit diesem Konto zu verknüpfen.",
+       "authmanager-authn-autocreate-failed": "Die automatische Erstellung des lokalen Benutzerkontos ist fehlgeschlagen: $1",
+       "authmanager-change-not-supported": "Die angegebenen Anmeldeinformationen konnten nicht geändert werden, da sie von nichts genutzt werden würden.",
+       "authmanager-create-disabled": "Die Benutzerkontenerstellung ist deaktiviert.",
+       "authmanager-create-from-login": "Um dein Benutzerkonto zu erstellen, fülle bitte die unten stehenden Felder aus.",
+       "authmanager-create-not-in-progress": "Die Benutzerkontenerstellung ist nicht im Gang oder es sind Sitzungsdaten verloren gegangen. Bitte beginne von vorn.",
+       "authmanager-create-no-primary": "Die angegebenen Anmeldeinformationen konnten nicht für die Benutzerkontenerstellung verwendet werden.",
+       "authmanager-link-no-primary": "Die angegebenen Anmeldeinformationen konnten nicht für die Benutzerkontenverknüpfung verwendet werden.",
+       "authmanager-link-not-in-progress": "Die Benutzerkontenverknüpfung ist nicht im Gang oder es sind Sitzungsdaten verloren gegangen. Bitte beginne von vorn.",
+       "authmanager-authplugin-setpass-failed-title": "Passwortänderung fehlgeschlagen",
+       "authmanager-authplugin-setpass-failed-message": "Das Authentifizierungs-Plugin hat die Passwortänderung abgelehnt.",
+       "authmanager-authplugin-create-fail": "Das Authentifizierungs-Plugin hat die Benutzerkontenerstellung abgelehnt.",
+       "authmanager-authplugin-setpass-denied": "Das Authentifizierungs-Plugin erlaubt keine Passwortänderungen.",
+       "authmanager-authplugin-setpass-bad-domain": "Ungültige Domain.",
+       "authmanager-autocreate-noperm": "Die automatische Benutzerkontenerstellung ist nicht erlaubt.",
+       "authmanager-autocreate-exception": "Die automatische Benutzerkontenerstellung ist aufgrund früherer Fehler vorübergehend deaktiviert.",
+       "authmanager-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht registriert.",
+       "authmanager-userlogin-remembermypassword-help": "Ob das Passwort länger als die Sitzungslänge behalten werden soll.",
+       "authmanager-username-help": "Benutzername für die Authentifizierung.",
+       "authmanager-password-help": "Passwort für die Authentifizierung.",
+       "authmanager-domain-help": "Domain für die externe Authentifizierung.",
+       "authmanager-retype-help": "Passwort erneut zur Bestätigung eingeben.",
+       "authmanager-email-label": "E-Mail",
+       "authmanager-email-help": "E-Mail-Adresse",
+       "authmanager-realname-label": "Bürgerlicher Name",
+       "authmanager-realname-help": "Bürgerlicher Name des Benutzers",
+       "authmanager-provider-password": "Passwortbasierte Authentifizierung",
+       "authmanager-provider-password-domain": "Passwort- und domainbasierte Authentifizierung",
+       "authmanager-provider-temporarypassword": "Temporäres Passwort",
+       "authprovider-confirmlink-message": "Basierend auf deinen letzten Anmeldeversuchen können die folgenden Benutzerkonten mit deinem Wiki-Benutzerkonto verknüpft werden. Das Verknüpfen ermöglicht die Anmeldung über diese Konten. Bitte wähle das Benutzerkonto aus, das verknüpft werden soll.",
+       "authprovider-confirmlink-request-label": "Benutzerkonten, die verknüpft werden sollen",
+       "authprovider-confirmlink-success-line": "$1: Erfolgreich verknüpft.",
+       "authprovider-confirmlink-failed": "Die Benutzerkontenverknüpfung war nicht vollständig erfolgreich: $1",
+       "authprovider-confirmlink-ok-help": "Nach der Anzeige von Verknüpfungsfehlermeldungen fortfahren.",
+       "authprovider-resetpass-skip-label": "Überspringen",
+       "authprovider-resetpass-skip-help": "Das Zurücksetzen des Passworts überspringen.",
+       "authform-nosession-login": "Die Authentifizierung war erfolgreich, aber dein Browser kann sich deine Anmeldung nicht „merken“.\n\n$1",
+       "authform-nosession-signup": "Das Benutzerkonto wurde erstellt, aber dein Browser kann sich deine Anmeldung nicht „merken“.\n\n$1",
+       "authform-newtoken": "Fehlender Token. $1",
+       "authform-notoken": "Fehlender Token",
+       "authform-wrongtoken": "Falscher Token",
+       "specialpage-securitylevel-not-allowed-title": "Nicht erlaubt",
+       "specialpage-securitylevel-not-allowed": "Leider bist du nicht berechtigt, diese Seite zu benutzen, da deine Identität nicht verifiziert werden konnte.",
+       "authpage-cannot-login": "Anmeldung konnte nicht gestartet werden.",
+       "authpage-cannot-login-continue": "Anmeldung konnte nicht fortgeführt werden. Vielleicht liegt bei deiner Sitzung eine Zeitüberschreitung vor.",
+       "authpage-cannot-create": "Benutzerkontenerstellung konnte nicht gestartet werden.",
+       "authpage-cannot-create-continue": "Die Benutzerkontenerstellung konnte nicht fortgeführt werden. Vielleicht liegt bei deiner Sitzung eine Zeitüberschreitung vor.",
+       "authpage-cannot-link": "Die Benutzerkontenverknüpfung konnte nicht gestartet werden.",
+       "authpage-cannot-link-continue": "Die Benutzerkontenverknüpfung konnte nicht fortgeführt werden. Vielleicht liegt bei deiner Sitzung eine Zeitüberschreitung vor.",
+       "cannotauth-not-allowed-title": "Zugriff verweigert",
+       "cannotauth-not-allowed": "Du bist nicht berechtigt, diese Seite zu verwenden.",
+       "changecredentials": "Anmeldeinformationen ändern",
+       "changecredentials-submit": "Ändern",
+       "changecredentials-submit-cancel": "Abbrechen",
+       "changecredentials-invalidsubpage": "$1 ist kein gültiger Typ für Anmeldeinformationen.",
+       "changecredentials-success": "Deine Anmeldeinformationen wurden geändert.",
+       "removecredentials": "Anmeldeinformationen entfernen",
+       "removecredentials-submit": "Entfernen",
+       "removecredentials-submit-cancel": "Abbrechen",
+       "removecredentials-invalidsubpage": "$1 ist kein gültiger Typ für Anmeldeinformationen.",
+       "removecredentials-success": "Deine Anmeldeinformationen wurden entfernt.",
+       "credentialsform-provider": "Typ der Anmeldeinformationen:",
+       "credentialsform-account": "Benutzerkontenname:",
+       "cannotlink-no-provider-title": "Es gibt keine verknüpfbaren Benutzerkonten",
+       "cannotlink-no-provider": "Es gibt keine verknüpfbaren Benutzerkonten.",
+       "linkaccounts": "Benutzerkonten verknüpfen",
+       "linkaccounts-success-text": "Das Benutzerkonto wurde verknüpft.",
+       "linkaccounts-submit": "Benutzerkonten verknüpfen",
+       "unlinkaccounts": "Benutzerkonten trennen",
+       "unlinkaccounts-success": "Das Benutzerkonto wurde getrennt."
 }
index 88c2891..e882088 100644 (file)
        "noname": "Yew nameyo maqbul bınuse.",
        "loginsuccesstitle": "Hesab abıya",
        "loginsuccess": "'''{{SITENAME}} dı name dê \"$1\" şıma hesab akerdo.'''",
-       "nosuchuser": "Ebe namey \"$1\"i yew karber çıniyo.\nNuştışê namanê karberan de herfa pil u qıce rê diqet kerên.\nNuştışê xo qonrol kerên, ya zi [[Special:CreateAccount|yew hesabo newe akerên]].",
+       "nosuchuser": "\"$1\" ya yew namey karberi çıniyo.\nNuştışê namanê karberan de herfa pil u qıce rê diqet kerên.\nNuştışê xo qontrol kerên, ya zi [[Special:CreateAccount|yew hesabo newe akerê]].",
        "nosuchusershort": "No \"$1\" name de yew ten çino. Kontrolê nuştışi bıkere.",
        "nouserspecified": "Şıma gani yew name bıde.",
        "login-userblocked": "No karber/na karbere blokekerdeyo/blokekerdiya. Cıkewtışi rê musade çıniyo.",
        "whatlinkshere-prev": "{{PLURAL:$1|veror|veror $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|verni|verni $1}}",
        "whatlinkshere-links": "← gırey",
-       "whatlinkshere-hideredirs": "Hetenayışan bınımne",
-       "whatlinkshere-hidetrans": "Gırêyanê açarnayışan bınımne",
-       "whatlinkshere-hidelinks": "Gırêyan bınımne",
+       "whatlinkshere-hideredirs": "Hetenayışê $1",
+       "whatlinkshere-hidetrans": "Açarnayışê $1",
+       "whatlinkshere-hidelinks": "Greyê $1",
        "whatlinkshere-hideimages": "Gıreyê dosya $1",
        "whatlinkshere-filters": "Avrêci",
        "autoblockid": "Otomatik vındarnayış #$1",
index 051f1a8..8aa0040 100644 (file)
        "versionrequiredtext": "ये पाना प्रयोग गर्नका लागि MediaWiki $1 संस्करण चाहिन्छ ।\nहेर  [[Special:Version|version page]]",
        "ok": "भयो",
        "retrievedfrom": " \"$1\" बठे निकालिया",
-       "youhavenewmessages": "तमखी लेखा($2)मी $1 छ।",
+       "youhavenewmessages": "तमखी लेखा($2)मी $1 छ ।",
        "youhavenewmessagesfromusers": "तमखी लेखा {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्तान}}($2)बठे$1",
        "youhavenewmessagesmanyusers": "तमलाई धेरै प्रयोगकर्ताहरू($2) बठे $1 छ ।",
        "newmessageslinkplural": "{{PLURAL:$1|एक नौलो रैबार|999=नौला रैबारहरू}}",
        "viewsource-title": " $1 को स्रोत हेर",
        "actionthrottled": "कार्य रोकिईयो",
        "actionthrottledtext": "स्पामको रोकथामको लागि , तमीलाई यो कार्य नापै समयमी मैथै पटक गद्दाबठे सिमित गरियाको छ, र तमीले आफ्नो सिमा पार गरिसक्याछौ ।\nकृपया केही मिनेट पछि पुन: प्रयास गर  ।",
+       "viewsourcetext": "तम ये पृष्ठको स्रोत हेद्दु सकुन्छौ और उईको नक्कल उताद्दु सकुन्छौ |",
        "viewyourtext": "यै पानामी रह्याका '''तमरा सम्पादनहरू''' हेद्द या प्रतिलिपी गद्द सक्द्या हौ :",
        "editinginterface": "<strong>चेतावनी:</strong> तमी यै पानालाई सम्पादन गद्द लाग्याछौ, जनले सफ्टवेयरको लागि \nइन्टरफेस सामग्रीहरू प्रदान गरन्छ।\nयै पानामी गरियाको परिवर्तनले यै विकिमी अरु प्रयोगकर्तानको इन्टरफेसको प्रदर्शनमी प्रभाव पडन्छ ।",
        "namespaceprotected": "तमलाई '''$1'''  नेमस्पेसमी रह्याका पानाहरू सम्पादन गद्या अनुमति छैन ।",
        "resetpass_submit": "पासवर्ड व्यवस्थित गरी र प्रवेशगर्ने",
        "changepassword-success": "तमरो पासवर्ड सफलतापूर्वक परिवर्तन भयो!",
        "changepassword-throttled": "तमले अलै भौत फेर प्रवेशका निम्ति प्रयास गरया छौ।\nकृपया $1 थोक्कै जागी मात्र प्रयास गर।",
+       "botpasswords-label-grants-column": "प्रदान भयो",
+       "botpasswords-created-title": "बोट को पासवर्ड बन्यो",
+       "botpasswords-updated-title": "बोट को पासवर्ड अपडेट भयो",
+       "botpasswords-deleted-title": "बोट को पासवर्ड मेटियो",
        "resetpass_forbidden": "पासवर्ड परिवर्तन गर्न नाइँमिल्लो",
+       "resetpass_forbidden-reason": "पासवर्ड परिवर्तन गद्दु नाइँमिल्लो:$1",
        "resetpass-no-info": "ये पाना सिधाई हेद्दाई तमले प्रवेश गद्दु पडून्छ ।",
        "resetpass-submit-loggedin": "पासवर्ड परिवर्तन गर",
        "resetpass-submit-cancel": "रद्द",
        "passwordreset-emailtitle": "{{SITENAME}}मा खाता विवरण",
        "passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
        "passwordreset-emailsentemail": "पासवर्ड परिवर्तनका लागि इमेल पठाइया छ।",
-       "changeemail": "इमेल ठेगाना बदेल",
+       "changeemail": "इमेल ठेगाना बदेल वा हटा",
        "changeemail-header": "आफ्नो इमेल ठेगाना परिवर्तन गद्द यो फारम भर । यैलाई पुष्टि गद्द तमीले आफ्नो पासवर्ड हाल्नु पडन्छ।",
        "changeemail-oldemail": "अईलको इमेल-ठेगाना:",
        "changeemail-newemail": "नयाँ इमेल-ठेगाना:",
        "minoredit": "यो नानो सम्पादन हो",
        "watchthis": "यै पानाको ध्यान राख",
        "savearticle": "सङ्ग्रह गर",
+       "publishpage": "प्रकाशित पृष्ठ",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वालोकन धेकाउन्या",
        "showdiff": "परिवर्तन धेकाउन्या",
        "converter-manual-rule-error": "म्यानुअल भाषा अनुवाद सिध्दान्तमी समस्या धेखियो",
        "cantcreateaccounttitle": "खाता बनाउन सकिएन",
        "viewpagelogs": "यै पानाका लगहरू हेर",
+       "nohistory": "ये पृष्ठका लागी कोइ सम्पादन इतिहास छैन।",
        "currentrev": "अहिलको पुनरावलोकन",
        "currentrev-asof": "$1को रुपमी अहिलको पुनरावलोकनहरू",
        "revisionasof": "$1 जस्तै गरी पुनरावलोकन",
        "prefs-rc": "नौला परिवर्तनहरू",
        "prefs-watchlist": "मेरो ध्यान सूची",
        "prefs-editwatchlist": "अवलोकनसूची सम्पादन",
+       "prefs-editwatchlist-raw": "कच्चा अवलोकनसूची सम्पादन गद्दा",
        "prefs-watchlist-days": "ध्यान सूचीमी धेकाउने दिनहरू:",
        "prefs-watchlist-edits-max": "सबै है ज्यादा संख्या : १०००",
        "prefs-watchlist-token": "अवलोकन सूची टोकन:",
        "columns": "स्तम्भहरू :",
        "searchresultshead": "खोज",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
+       "stub-threshold-sample-link": "उदाहरण",
        "stub-threshold-disabled": "निष्क्रिय",
        "recentchangesdays": "हालको परिवर्तनमी धेकाउने दिनहरू:",
        "recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिन|दिन}}",
        "timezoneregion-australia": "अष्ट्रेलिया",
        "timezoneregion-indian": "हिन्द महासागर",
        "prefs-files": "फाइलहरू",
+       "youremail": "ईमेल",
+       "yourrealname": "वास्तविक नाम:",
+       "yourlanguage": "भाषा",
+       "yournick": "नयाँ हस्ताक्षर:",
        "prefs-help-signature": "कुरडी पानाका टिप्पणीहरू \"<nowiki>~~~~</nowiki>\" द्वारा दस्तखत गरिनुपडन्छ ,त्यो पछि तमरो दस्तखत र समयरेखामी रुपान्तरित हुनेछ ।",
        "badsiglength": "तमरो दस्तखत मैथै लामो छ।\nयो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।",
+       "email": "ईमेल",
        "prefs-help-realname": "वास्तविक नाम ऐच्छिक हो ।\nतमीले खुलायौ भण्या तमरो कामको श्रेय दिनको लेखा यैको प्रयोग गरिन्या छ ।",
+       "prefs-editor": "सम्पादक",
+       "prefs-preview": "पूर्वावलोकन",
+       "prefs-tokenwatchlist": "टोकन",
+       "prefs-diffs": "फरक",
        "prefs-help-prefershttps": "यो रोजाई तमरो अर्को  लग इन बठे लागु हुन्याछ ।",
+       "userrights-reason": "कारण:",
        "userrights-unchangeable-col": "तमीले परिवर्तन गद्द नसक्ने समूहहरू",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमी मतभेद भयो ! कृपया तमरो परिवर्तन पुनरावलोकन तथा पुष्टि गर ।",
        "userrights-removed-self": "तमीले सफलतापूर्वक आफ्नो अधिकारहरूलाई मेटायौ । त्यै कारण तमी अब यो पानो हेद्द नाइसक्दा ।",
+       "group": "समूह:",
        "group-user": "प्रयोगकर्ताहरू",
        "group-autoconfirmed": "स्वत स्थापित प्रयोगकर्ताहरू",
+       "group-bot": "बोटहरू",
+       "group-sysop": "प्रवन्धकहरू",
        "right-move-subpages": "तिनीहरूको उपपाना सहित पानाको नाम बदल्ने",
        "right-move-rootuserpages": "मूल(root) प्रयोगकर्ताको पानाहरू साद्या",
        "right-movefile": "फाइलहरूको नाम बदल्न्या",
index 2500688..726a7cb 100644 (file)
@@ -47,7 +47,8 @@
                        "SucreRouge",
                        "Gts-tg",
                        "Nemo bis",
-                       "Αντιγόνη"
+                       "Αντιγόνη",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "resetpass-abort-generic": "Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.",
        "resetpass-expired": "Ο κωδικός πρόσβασης έχει λήξει. Ορίστε έναν νέο κωδικό πρόσβασης για να συνδεθείτε.",
        "resetpass-expired-soft": "Ο κωδικός πρόσβασης έχει λήξει και πρέπει να γίνει επαναφορά του. Επιλέξτε έναν νέο κωδικό πρόσβασης τώρα ή πατήστε «{{int:resetpass-submit-cancel}}» για τον επαναφέρετε αργότερα.",
-       "resetpass-validity-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81οÏ\82: $1\n\nÎ\95Ï\80ιλέξÏ\84ε Î­Î½Î±Î½ Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α ή πατήστε «{{int:resetpass-submit-cancel}}» για να τον επαναφέρετε αργότερα.",
+       "resetpass-validity-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81οÏ\82: $1\n\nΠαÏ\81ακαλοÏ\8dμε ÎµÏ\80ιλέξÏ\84ε Î­Î½Î±Î½ Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α, ή πατήστε «{{int:resetpass-submit-cancel}}» για να τον επαναφέρετε αργότερα.",
        "passwordreset": "Επαναφορά κωδικού",
        "passwordreset-text-one": "Συμπληρώστε την παρακάτω φόρμα για να επαναφέρετε τον κωδικό πρόσβασής σας.",
        "passwordreset-text-many": "{{PLURAL:$1|Συμπληρώστε ένα από τα πεδία για να λάβετε προσωρινό κωδικό πρόσβαση μέσω ηλεκτρονικού ταχυδρομείου.}}",
        "whatlinkshere-prev": "{{PLURAL:$1|προηγούμενη|προηγούμενες $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|επόμενη|επόμενες $1}}",
        "whatlinkshere-links": "← σύνδεσμοι",
-       "whatlinkshere-hideredirs": "Απόκρυψη ανακατευθύνσεων",
-       "whatlinkshere-hidetrans": "Απόκρυψη ενσωματώσεων",
-       "whatlinkshere-hidelinks": "Απόκρυψη συνδέσμων",
+       "whatlinkshere-hideredirs": "$1 ανακατευθύνσεων",
+       "whatlinkshere-hidetrans": "$1 ενσωματώσεων",
+       "whatlinkshere-hidelinks": "$1 συνδέσμων",
        "whatlinkshere-hideimages": "$1 σύνδεσμοι αρχείων",
        "whatlinkshere-filters": "Φίλτρα",
        "whatlinkshere-submit": "Μετάβαση",
index 8b9fefe..37ad263 100644 (file)
        "trackingcategories-msg": "Tracking category",
        "trackingcategories-name": "Message name",
        "trackingcategories-desc": "Category inclusion criteria",
+       "restricted-displaytitle-ignored": "Pages with ignored display titles",
+       "restricted-displaytitle-ignored-desc": "The page has an ignored <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> because it is not equivalent to the page's actual title.",
        "noindex-category-desc": "The page is not indexed by robots because it has the magic word <code><nowiki>__NOINDEX__</nowiki></code> on it and is in a namespace where that flag is allowed.",
        "index-category-desc": "The page has a <code><nowiki>__INDEX__</nowiki></code> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
        "post-expand-template-inclusion-category-desc": "The page size is bigger than <code>$wgMaxArticleSize</code> after expanding all the templates, so some templates were not expanded.",
        "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
        "whatlinkshere-links": "← links",
-       "whatlinkshere-hideredirs": "Hide redirects",
-       "whatlinkshere-hidetrans": "Hide transclusions",
-       "whatlinkshere-hidelinks": "Hide links",
-       "whatlinkshere-hideimages": "Hide file links",
+       "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hidelinks": "$1 links",
+       "whatlinkshere-hideimages": "$1 file links",
        "whatlinkshere-filters": "Filters",
        "whatlinkshere-submit": "Go",
        "autoblockid": "Autoblock #$1",
index 7277348..66b168b 100644 (file)
        "password-change-forbidden": "Ve ne povas ŝanĝi pasvortojn en ĉi tiu vikio.",
        "externaldberror": "Aŭ estis datenbaza eraro rilate al ekstera aŭtentikigado, aŭ vi ne rajtas ĝisdatigi vian eksteran konton.",
        "login": "Ensaluti",
+       "login-security": "Kontrolu vian identecon",
        "nav-login-createaccount": "Ensaluti / Krei novan konton",
        "userlogin": "Ensaluti / Krei novan konton",
        "userloginnocreate": "Ensaluti",
        "userlogin-resetpassword-link": "Ĉu vi forgesis vian pasvorton?",
        "userlogin-helplink2": "Helpo pri ensaluto",
        "userlogin-loggedin": "Vi jam estas ensalutita kiel {{GENDER:$1|$1}}.\nUzu la formularon suben por ensaluti kiel alia uzanto.",
+       "userlogin-reauth": "Vi devas ensaluti denove por konfirmi ke vi estas {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Krei alian konton",
        "createacct-emailrequired": "Retpoŝta adreso",
        "createacct-emailoptional": "Retpoŝta adreso (nedeviga)",
        "createacct-email-ph": "Enigu vian retpoŝtan adreson",
        "createacct-another-email-ph": "Enigu la retpoŝtan adreson",
        "createaccountmail": "Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝta adreso ĉi-suba",
+       "createaccountmail-help": "Uzebla por krei konton de alia persono sen lerni la pasvorton.",
        "createacct-realname": "Vera nomo (nedeviga)",
        "createaccountreason": "Kialo:",
        "createacct-reason": "Kialo",
        "createacct-reason-ph": "Kial vi kreas plian konton",
+       "createacct-reason-help": "Mesaĝo vidigita en la protokolo pri kreado de konto",
        "createacct-submit": "Krei konton",
        "createacct-another-submit": "Krei konton",
+       "createacct-continue-submit": "Daŭri kreadon de konto",
+       "createacct-another-continue-submit": "Daŭri kreadon de konto",
        "createacct-benefit-heading": "{{SITENAME}} estas kreata de homoj kiel vi.",
        "createacct-benefit-body1": "{{PLURAL:$1|redakto|redaktoj}}",
        "createacct-benefit-body2": "{{PLURAL:$1|paĝo|paĝoj}}",
        "nocookiesnew": "La uzantokonto estis kreita sed vi ne estas ensalutinta. {{SITENAME}} uzas kuketojn por akcepti uzantojn. Kuketoj esta malaktivigitaj ĉe vi. Bonvolu aktivigi ilin kaj ensalutu per viaj novaj salutnomo kaj pasvorto.",
        "nocookieslogin": "{{SITENAME}} uzas kuketojn por akcepti uzantojn. Kuketoj esta malaktivigitaj ĉe vi. Bonvolu aktivigi ilin kaj provu denove.",
        "nocookiesfornew": "La uzantokonto ne estis kreita, ĉar ne konfirmeblas ĝia fonto. Certiginte ke kuketoj estas ebligitaj, reŝargu tiun ĉi paĝon kaj reprovu.",
+       "createacct-loginerror": "La konto estis sukcese kreita sed vi ne povus esti ensalutita aŭtomate. Bonvolu procedi [[Special:UserLogin|malaŭtomatan ensaluton]].",
        "noname": "Vi ne tajpis validan salutnomon.",
        "loginsuccesstitle": "Ensalutis",
        "loginsuccess": "Vi ensalutis ĉe {{SITENAME}} kiel uzanto \"$1\".",
        "createacct-another-realname-tip": "La vera nomo estas nenecesa.\nSe vi decidas indiki ĝin, ĝi estos uzata por montri atribuadon de viaj kontribuoj.",
        "pt-login": "Ensaluti",
        "pt-login-button": "Ensaluti",
+       "pt-login-continue-button": "Daŭri ensaluton",
        "pt-createaccount": "Krei konton",
        "pt-userlogout": "Elsaluti",
        "php-mail-error-unknown": "Nekonata eraro en la funkcio mail() de PHP",
        "botpasswords-invalid-name": "La difinita uzantnomo malenhavas la robotopasvortan disigilon (\"$1\").",
        "botpasswords-not-exist": "Uzanto \"$1\" ne havas robotopasvorton, kiu nomiĝas \"$2\".",
        "resetpass_forbidden": "Pasvortoj ne estas ŝanĝeblaj",
+       "resetpass_forbidden-reason": "Pasvortoj ne povas esti ŝanĝita: $1",
        "resetpass-no-info": "Vi devas ensaluti por atingi ĉi tiun paĝon rekte.",
        "resetpass-submit-loggedin": "Ŝanĝi pasvorton",
        "resetpass-submit-cancel": "Nuligi",
        "passwordreset-emailsentusername": "Se estas retpoŝta adreso, kiu estas asociita kun tiu uzantnomo, tiam ni sendos retpoŝtan mesaĝon pri reagordado de la pasvorto.",
        "passwordreset-emailsent-capture": "Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata malsupre.",
        "passwordreset-emailerror-capture": "Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al la {{GENDER:$2|uzanto}} malsukcesis: $1",
+       "passwordreset-emailsent-capture2": "La {{PLURAL:$1|retpoŝto|retpoŝtojn}} de pasvorta reensignado estis sendita. La {{PLURAL:$1|salutnomo kaj pasvorto|listo de salutnomoj kaj pasvortoj}} estas vidigita sube.",
+       "passwordreset-emailerror-capture2": "Retpoŝtado al la {{GENDER:$2|uzantiĉo|uzantino|uzanto}} malsukcesis: $1 La {{PLURAL:$3|salutnomo kaj pasvorta|listo de salutnomoj kaj pasvortoj}} estas vidigita sube.",
+       "passwordreset-nocaller": "Vokanto devas esti provizita",
+       "passwordreset-nosuchcaller": "Vokanto ne ekzistas: $1",
+       "passwordreset-ignored": "La pasvorta reensignado ne estis pritraktita. Eble neniu provizanto estis formita?",
+       "passwordreset-invalideamil": "Nevalida retpoŝta adreso",
+       "passwordreset-nodata": "Nek salutnomo nek retpoŝta adreso estis provizita",
        "changeemail": "Ŝanĝi aŭ forigi retpoŝtadreson",
        "changeemail-header": "Plenigu ĉi tiun formularon por ŝanĝi vian retpoŝtadreson. Se vi volas forigi la difinon de retpoŝtadreso por via uzantokonto, lasu la kampon por la nova retpoŝtadreso malplena ĉe la transigo.",
        "changeemail-passwordrequired": "Vi devas entajpi vian pasvorton, por konfirmi ĉi tiun ŝanĝon.",
        "whatlinkshere-prev": "{{PLURAL:$1|antaŭa|antaŭaj $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|posta|postaj $1}}",
        "whatlinkshere-links": "← ligiloj",
-       "whatlinkshere-hideredirs": "Kaŝi alidirektilojn",
-       "whatlinkshere-hidetrans": "Kaŝi transinkluzivaĵojn",
-       "whatlinkshere-hidelinks": "Kaŝi ligilojn",
-       "whatlinkshere-hideimages": "Malvidigi ligojn al dosiero",
+       "whatlinkshere-hideredirs": "$1 alidirektilojn",
+       "whatlinkshere-hidetrans": "$1 transinkluzivaĵojn",
+       "whatlinkshere-hidelinks": "$1 ligilojn",
+       "whatlinkshere-hideimages": "$1 ligiloj al bildo",
        "whatlinkshere-filters": "Filtriloj",
        "whatlinkshere-submit": "Ek",
        "autoblockid": "Aŭtomata forbaro #$1",
        "htmlform-cloner-create": "Aldoni plian",
        "htmlform-cloner-delete": "Forigi",
        "htmlform-cloner-required": "Almenaŭ unu valoro estas nepra.",
+       "htmlform-title-badnamespace": "[[:$1]] ne  estas en \"{{ns:$2}}\" nomspaco.",
+       "htmlform-title-not-creatable": "\"$1\" estas nekreebla titolo por paĝo",
        "htmlform-title-not-exists": "$1 ne ekzistas.",
        "htmlform-user-not-exists": "<strong>$1</strong> ne ekzistas.",
        "htmlform-user-not-valid": "<strong>$1</strong> ne estas valida salutnomo.",
        "pagelang-language": "Lingvo",
        "pagelang-use-default": "Uzi defaŭltan lingvon",
        "pagelang-select-lang": "Elekti la lingvon",
+       "pagelang-submit": "Ek!",
        "right-pagelang": "Ŝanĝi paĝan lingvon",
        "action-pagelang": "ŝanĝi la lingvon de la paĝo",
-       "log-name-pagelang": "Ŝanĝi la lingvan protokolon",
+       "log-name-pagelang": "Protokolo pri lingvajn ŝanĝojn",
        "log-description-pagelang": "Jen protokolo pri ŝanĝoj de paĝaj lingvoj.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ŝanĝis}} la paĝan lingvon por $3 de $4 al $5.",
        "default-skin-not-found": "Ups! La defaŭlta etoso por via vikio, difinita en <code dir=\"ltr\">$wgDefaultSkin</code> kiel <code>$1</code> ne estas disponebla.\n\nŜajnas, ke via instalaĵo enhavas {{PLURAL:$4|jenan etoson|jenajn etosojn}}. Vidu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manlibro:Agordado de etosoj] por informoj kiel {{PLURAL:$4|ĝin ŝalti|ilin ŝalti kaj elekti la defaŭltan}}.\n\n$2\n\n; Se vi ĵus instalis MediaWiki:\n: Vi probable instalis de git aŭ rekte de fontokodo per alia metodo. Tio estas antaŭsupozata. MediaWiki 1.24 kaj pli novaj versioj enhavas neniun etoson en la ĉefa deponejo. Provu instali iujn etosojn de [https://www.mediawiki.org/wiki/Category:All_skins etosa dosierujo en mediawiki.org] per jenaj metodoj:\n:* Elŝutu [https://www.mediawiki.org/wiki/Download pakitan instalilon], kiu enhavas kelkajn etosojn kaj etendaĵojn. Vi povas de ĝi kopii kaj alglui la dosierujon <code>skins/</code>.\n:* Elŝutu unuopajn pakitajn etosojn de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Uzu Git por elŝuti etosojn].\n: Tio maldevus interkolizii kun via git-deponejo se vi estas evoluiganto de MediaWiki.\n\n; Se vi ĵus promociis MediaWiki:\n: MediaWiki 1.24 kaj pli novaj ne plu aŭtomate ŝaltas instalitajn etosojn (vidu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manlibro:Aŭtomata malkovrado de etosoj]). Vi povas alglui {{PLURAL:$5|jenan linion|jenajn liniojn}} al <code>LocalSettings.php</code> por ŝalti {{PLURAL:$5|la instalitan etoson|ĉiujn instalitajn etosojn}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se vi ĵus modifis <code>LocalSettings.php</code>:\n: Denove kontrolu nomon de etosoj pro eblaj mistajpoj.",
        "mediastatistics-header-text": "Tekstaj",
        "mediastatistics-header-executable": "Plenumeblaj dosieroj",
        "mediastatistics-header-archive": "Densigitaj formoj",
+       "mediastatistics-header-total": "Ĉiuj dosieroj",
        "json-warn-trailing-comma": "De JSON estis {{PLURAL:$1|forigita fina komo|forigitaj finaj komoj}}",
        "json-error-unknown": "Okazis problemo pri JSON. Eraro: $1",
        "json-error-depth": "Maksimuma profundeco de stako estis superita",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simboloj",
        "special-characters-group-greek": "Greka",
+       "special-characters-group-greekextended": "Greka etendita",
        "special-characters-group-cyrillic": "Cirila",
        "special-characters-group-arabic": "Araba",
        "special-characters-group-arabicextended": "araba etendite",
        "special-characters-title-endash": "mallonga streketo",
        "special-characters-title-emdash": "longa streketo",
        "special-characters-title-minus": "minus-signo",
+       "mw-widgets-dateinput-no-date": "Neniu dato elektita",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "paĝo ankoraŭ ne ekzistas",
        "mw-widgets-titleinput-description-redirect": "alidirekti al $1",
        "api-error-blacklisted": "Bonvolu elekti alian, priskriban titolon.",
+       "sessionmanager-tie": "Kombini diversajn tipojn de ensaluta peto ne estas permisita: $1.",
        "sessionprovider-generic": "$1 seancoj",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "kuketaj seancoj",
        "randomrootpage": "Hazarda radika paĝo",
+       "log-action-filter-block": "Tipo de forbaro:",
+       "log-action-filter-contentmodel": "Tipo de enhavomodela ŝanĝo:",
+       "log-action-filter-delete": "Tipo de forviŝigado:",
+       "log-action-filter-import": "Tipo de importado:",
+       "log-action-filter-move": "Tipo de alinomado:",
+       "log-action-filter-newusers": "Tipo de konta kreado:",
+       "log-action-filter-patrol": "Tipo de patrolado:",
+       "log-action-filter-protect": "Tipo de protektad:",
+       "log-action-filter-rights": "Tipo de rajta ŝanĝo",
+       "log-action-filter-suppress": "Tipo de forigado",
+       "log-action-filter-upload": "Tipo de alŝutado:",
        "log-action-filter-all": "Ĉia",
        "log-action-filter-block-block": "Forbari",
+       "log-action-filter-block-reblock": "Forbari ŝanĝon",
+       "log-action-filter-block-unblock": "Malforbari",
+       "log-action-filter-delete-delete": "Forviŝigado de paĝo",
+       "log-action-filter-delete-restore": "Malforviŝigado de paĝo",
+       "log-action-filter-delete-event": "Forviŝigado de protokolo",
+       "log-action-filter-delete-revision": "Forviŝigado de rivizio",
+       "log-action-filter-import-interwiki": "Importado de Transwiki",
        "log-action-filter-protect-unprotect": "Malprotektado",
        "log-action-filter-upload-upload": "Novalŝuta",
-       "log-action-filter-upload-overwrite": "Realŝuta"
+       "log-action-filter-upload-overwrite": "Realŝuta",
+       "authmanager-email-help": "Retpoŝtadreso",
+       "authmanager-realname-label": "Vera nomo",
+       "authmanager-realname-help": "Vera nomo de la uzanto",
+       "changecredentials-submit": "Ŝanĝi",
+       "changecredentials-submit-cancel": "Nuligi",
+       "removecredentials-submit": "Forigi",
+       "removecredentials-submit-cancel": "Nuligi",
+       "linkaccounts": "Ligi kontojn",
+       "linkaccounts-submit": "Ligi kontojn"
 }
index 7fe4263..87bb4f0 100644 (file)
                        "Jdforrester",
                        "Indiralena",
                        "Rubentl134",
-                       "Codynguyen1116"
+                       "Codynguyen1116",
+                       "2axterix2",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "password-change-forbidden": "No puedes cambiar las contraseñas en este wiki.",
        "externaldberror": "Hubo un error de autenticación en la base de datos, o bien no tienes autorización para actualizar tu cuenta externa.",
        "login": "Acceder",
+       "login-security": "Verifica tu identidad",
        "nav-login-createaccount": "Acceder/crear cuenta",
        "userlogin": "Acceder/crear cuenta",
        "userloginnocreate": "Acceder",
        "userlogin-resetpassword-link": "¿Has olvidado tu contraseña?",
        "userlogin-helplink2": "Ayuda con el acceso",
        "userlogin-loggedin": "Ya estás {{GENDER:$1|conectado|conectada}} como $1.\nUsa el formulario de abajo para iniciar sesión como otro usuario.",
+       "userlogin-reauth": "Debes iniciar sesión de nuevo para verificar que eres {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crear otra cuenta",
        "createacct-emailrequired": "Dirección de correo electrónico",
        "createacct-emailoptional": "Dirección de correo electrónico (opcional)",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por qué estás creando otra cuenta",
+       "createacct-reason-help": "Mensaje que se muestra en el registro de creación de cuentas",
        "createacct-submit": "Crea tu cuenta",
        "createacct-another-submit": "Crear cuenta",
+       "createacct-continue-submit": "Continuar con la creación de la cuenta",
+       "createacct-another-continue-submit": "Continuar con la creación de la cuenta",
        "createacct-benefit-heading": "Personas como tú son las que construyen {{SITENAME}}.",
        "createacct-benefit-body1": "{{PLURAL:$1|edición|ediciones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "nocookiesnew": "Se ha creado la cuenta de usuario, pero aún no has iniciado sesión.\n{{SITENAME}} usa <em>cookies</em> para identificar a los usuarios registrados.\nTu navegador tiene desactivadas las cookies.\nPor favor, actívalas e inicia sesión con tu nuevo nombre de usuario y contraseña.",
        "nocookieslogin": "{{SITENAME}} utiliza <em>cookies</em> para la autenticación de usuarios. Las <em>cookies</em> están desactivadas en tu navegador. Por favor, actívalas e inténtalo de nuevo.",
        "nocookiesfornew": "No se pudo crear la cuenta de usuario, porque no pudimos confirmar su origen.\nAsegúrate de que tienes las cookies activadas, luego recarga esta página e inténtalo de nuevo.",
+       "createacct-loginerror": "La cuenta se ha creado correctamente, pero no se pudo ingresar automáticamente. Procede al [[Special:UserLogin|acceso manual]].",
        "noname": "No se ha especificado un nombre de usuario válido.",
        "loginsuccesstitle": "Has accedido",
        "loginsuccess": "<strong>Has accedido a {{SITENAME}} como «$1».</strong>",
        "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\".",
        "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.",
        "resetpass-submit-loggedin": "Cambiar contraseña",
        "resetpass-submit-cancel": "Cancelar",
        "passwordreset-emailsentusername": "Si existe una dirección de correo electrónico asociada a este nombre de usuario, entonces se enviará un correo para restablecer la contraseña.",
        "passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
        "passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
+       "passwordreset-invalideamil": "Dirección de correo electrónico no válida.",
        "changeemail": "Cambiar o eliminar la dirección de correo electrónico",
        "changeemail-header": "Completa este formulario para cambiar tu dirección de correo electrónico. Si quieres eliminar la asociación de cualquier dirección de correo electrónico con tu cuenta, deja en blanco la nueva dirección de correo electrónico cuando envíes el formulario.",
        "changeemail-passwordrequired": "Tendrás que escribir tu contraseña para confirmar este cambio.",
        "accmailtext": "Se ha enviado a $2 una contraseña generada aleatoriamente para [[User talk:$1|$1]]. Una vez iniciada la sesión, se puede cambiar en la página [[Special:ChangePassword|destinada para ello]].",
        "newarticle": "(Nuevo)",
        "newarticletext": "Has seguido un enlace a una página que aún no existe.\nPara crear esta página, escribe en el cuadro que aparece a continuación. Para más información, consulta la [$1 página de ayuda].\nSi llegaste aquí por error, vuelve a la página anterior.",
-       "anontalkpagetext": "---- ''Esta es la página de discusión de un usuario anónimo que aún no ha creado una cuenta, o no la usa. Por lo tanto, tenemos que usar su dirección IP para identificarlo. Puede que varios usuarios compartan una misma dirección IP. Si eres un usuario anónimo y crees que se han dirigido a ti con comentarios improcedentes, por favor [[Special:CreateAccount|crea una cuenta]] o, si ya la tienes, [[Special:UserLogin|identifícate]] para evitar confusiones futuras con otros usuarios anónimos.''",
+       "anontalkpagetext": "----\n<em>Esta es la página de discusión de un usuario anónimo que aún no ha creado una cuenta, o no la usa.</em>\nPor lo tanto, tenemos que usar su dirección IP para identificarlo.\nPuede que varios usuarios compartan una misma dirección IP.\nSi eres un usuario anónimo y crees que se han dirigido a ti con comentarios improcedentes, [[Special:CreateAccount|crea una cuenta]] o [[Special:UserLogin|inicia sessión]] para evitar confusiones futuras con otros usuarios anónimos.",
        "noarticletext": "En este momento no hay texto en esta página.\nPuedes [[Special:Search/{{PAGENAME}}|buscar el título de esta página]] en otras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros relacionados],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear esta página]</span>.",
        "noarticletext-nopermission": "Actualmente no hay texto en esta página.\nPuedes [[Special:Search/{{PAGENAME}}|buscar este título de página]] en otras páginas, o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros relacionados]</span>, pero no tienes permiso para crear esta página.",
        "missing-revision": "La revisión n.º $1 de la página «{{FULLPAGENAME}}» no existe.\n\nEsto suele ocurrir cuando se sigue un enlace de historial obsoleto que apunta a una página ya borrada.\nPuedes encontrar detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
        "group-bot": "Bots",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burócratas",
-       "group-suppress": "Supresores",
+       "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|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
        "group-bureaucrat-member": "{{GENDER:$1|burócrata}}",
-       "group-suppress-member": "{{GENDER:$1|supresor|supresora}}",
+       "group-suppress-member": "{{GENDER:$1|supresor|supresora}} de Flow",
        "grouppage-user": "{{ns:project}}:Usuarios",
        "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmados",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burócratas",
-       "grouppage-suppress": "{{ns:project}}:Supresores",
+       "grouppage-suppress": "{{ns:project}}:Supresores de Flow",
        "right-read": "Leer páginas",
        "right-edit": "Editar páginas",
        "right-createpage": "Crear páginas que no sean de discusión",
        "whatlinkshere-prev": "{{PLURAL:$1|previa|previas $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|siguiente|siguientes $1}}",
        "whatlinkshere-links": "← enlaces",
-       "whatlinkshere-hideredirs": "Ocultar redirecciones",
-       "whatlinkshere-hidetrans": "Ocultar transclusiones",
-       "whatlinkshere-hidelinks": "Ocultar enlaces",
-       "whatlinkshere-hideimages": "Ocultar los vínculos de archivo",
+       "whatlinkshere-hideredirs": "$1 redirecciones",
+       "whatlinkshere-hidetrans": "$1 transclusiones",
+       "whatlinkshere-hidelinks": "$1 enlaces",
+       "whatlinkshere-hideimages": "$1 enlaces a archivos",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Ir",
        "autoblockid": "Bloqueo automático #$1",
        "log-action-filter-suppress-block": "Usuario supppression por bloque",
        "log-action-filter-suppress-reblock": "Usuario supresión de rebloqueo",
        "log-action-filter-upload-upload": "Subida nueva",
-       "log-action-filter-upload-overwrite": "Volver a subir"
+       "log-action-filter-upload-overwrite": "Volver a subir",
+       "authmanager-authn-no-local-user": "Las credenciales suministradas no están asociadas con ningún usuario en este wiki.",
+       "authmanager-create-disabled": "Está desactivada la creación de cuentas.",
+       "authmanager-create-from-login": "Para crear tu cuenta, completa los campos a continuación.",
+       "authmanager-create-not-in-progress": "El proceso de creación de la cuenta no está en progreso o se perdieron los datos de la sesión. Empieza de nuevo desde el principio.",
+       "authmanager-create-no-primary": "Las credenciales suministradas no pueden usarse para la creación de la cuenta.",
+       "authmanager-authplugin-setpass-failed-message": "El complemento de autenticación denegó el cambio de contraseña.",
+       "authmanager-authplugin-create-fail": "El complemento de autenticación denegó la creación de la cuenta.",
+       "authmanager-authplugin-setpass-denied": "El complemento de autenticación no permite el cambio de contraseñas.",
+       "authmanager-autocreate-noperm": "La creación automática de cuentas no está permitida.",
+       "authmanager-autocreate-exception": "La creación automática de cuentas ha sido temporalmente desactivada debido a errores previos.",
+       "authmanager-userdoesnotexist": "El usuario «$1» no está registrado.",
+       "authmanager-password-help": "Contraseña para autenticación.",
+       "authmanager-retype-help": "La contraseña de nuevo para confirmar.",
+       "authmanager-email-label": "Correo electrónico",
+       "authmanager-email-help": "Dirección de correo electrónico",
+       "authmanager-realname-label": "Nombre real",
+       "authmanager-realname-help": "Nombre real del usuario",
+       "authmanager-provider-password": "Autenticación basada en contraseña",
+       "authmanager-provider-temporarypassword": "Contraseña temporal",
+       "authprovider-confirmlink-success-line": "$1: vinculado exitosamente.",
+       "authprovider-resetpass-skip-label": "Omitir",
+       "authform-nosession-login": "La autenticación fue exitosa, pero tu navegador no puede \"recordar\" haber iniciado sesión.\n\n$1",
+       "authform-nosession-signup": "La cuenta ha sido creada, pero tu navegador no \"recuerda\" haber iniciado sesión.\n\n$1",
+       "specialpage-securitylevel-not-allowed": "Lo siento, no tienes permitido usar esta página, porque tu identidad no pudo verificarse.",
+       "authpage-cannot-login-continue": "No se puede continuar con el inicio de sesión. Lo más probable es que tu sesión haya expirado.",
+       "authpage-cannot-create": "No se puede iniciar la creación de la cuenta.",
+       "authpage-cannot-link-continue": "No se puede continuar con la vinculación de la cuenta. Lo más probable es que tu sesión haya expirado.",
+       "cannotauth-not-allowed-title": "Permiso denegado",
+       "changecredentials": "Cambiar las credenciales",
+       "changecredentials-submit": "Cambiar",
+       "changecredentials-submit-cancel": "Cancelar",
+       "changecredentials-success": "Tus credenciales han sido cambiadas.",
+       "removecredentials": "Eliminar credenciales",
+       "removecredentials-submit": "Eliminar",
+       "removecredentials-submit-cancel": "Cancelar",
+       "removecredentials-success": "Tus credenciales han sido eliminadas.",
+       "credentialsform-account": "Nombre de la cuenta:",
+       "cannotlink-no-provider": "No hay cuentas vinculables.",
+       "linkaccounts": "Vincular cuentas",
+       "linkaccounts-success-text": "La cuenta fue vinculada.",
+       "linkaccounts-submit": "Vincular cuentas",
+       "unlinkaccounts": "Desvincular cuentas"
 }
index bb7c10d..d3be7b8 100644 (file)
@@ -24,7 +24,8 @@
                        "Sator",
                        "Macofe",
                        "Xð",
-                       "Asierog"
+                       "Asierog",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Azpimarratu loturak:",
        "whatlinkshere-links": "← loturak",
        "whatlinkshere-hideredirs": "$1 birzuzenketak",
        "whatlinkshere-hidetrans": "$1 transklusioak",
-       "whatlinkshere-hidelinks": "Ezkutatu loturak",
+       "whatlinkshere-hidelinks": "$1 loturak",
        "whatlinkshere-hideimages": "$1 irudi loturak",
        "whatlinkshere-filters": "Iragazleak",
        "whatlinkshere-submit": "Joan",
index 99ac9c4..6324b22 100644 (file)
@@ -52,7 +52,8 @@
                        "Arian Ar",
                        "Ms96",
                        "Freshman404",
-                       "Hamisun"
+                       "Hamisun",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "whatlinkshere-prev": "{{PLURAL:$1|قبلی|$1 مورد قبلی}}",
        "whatlinkshere-next": "{{PLURAL:$1|بعدی|$1 مورد بعدی}}",
        "whatlinkshere-links": "→ پیوندها",
-       "whatlinkshere-hideredirs": "پنهان‌کردن تغییرمسیرها",
-       "whatlinkshere-hidetrans": "پنهان‌کردن تراگنجانش‌ها",
-       "whatlinkshere-hidelinks": "پنهان‌کردن پیوندها",
+       "whatlinkshere-hideredirs": "$1 تغییرمسیر",
+       "whatlinkshere-hidetrans": "$1 تراگنجانش‌ها",
+       "whatlinkshere-hidelinks": "$1 پیوند",
        "whatlinkshere-hideimages": "$1 پیوندهای پرونده",
        "whatlinkshere-filters": "پالایه‌ها",
        "whatlinkshere-submit": "برو",
index 7c6a371..f085e45 100644 (file)
@@ -49,7 +49,8 @@
                        "Pyscowicz",
                        "Olimar",
                        "Mikahama",
-                       "01miki10"
+                       "01miki10",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "whatlinkshere-prev": "← {{PLURAL:$1|edellinen sivu|$1 edellistä sivua}}",
        "whatlinkshere-next": "{{PLURAL:$1|seuraava sivu|$1 seuraavaa sivua}} →",
        "whatlinkshere-links": "viittaukset",
-       "whatlinkshere-hideredirs": "Piilota ohjaukset",
-       "whatlinkshere-hidetrans": "Piilota sisällytykset",
-       "whatlinkshere-hidelinks": "Piilota linkit",
-       "whatlinkshere-hideimages": "Piilota tiedostolinkit",
+       "whatlinkshere-hideredirs": "$1 ohjaukset",
+       "whatlinkshere-hidetrans": "$1 sisällytykset",
+       "whatlinkshere-hidelinks": "$1 linkit",
+       "whatlinkshere-hideimages": "$1 tiedostolinkit",
        "whatlinkshere-filters": "Suotimet",
        "whatlinkshere-submit": "Siirry",
        "autoblockid": "Automaattinen esto #$1",
index 416ed94..ba9ea8f 100644 (file)
                        "Lemondoge",
                        "Jdforrester",
                        "Yasten",
-                       "Psychoslave"
+                       "Psychoslave",
+                       "Trial",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "password-change-forbidden": "Vous ne pouvez pas modifier les mots de passe sur ce wiki.",
        "externaldberror": "Soit une erreur s’est produite sur la base de données d’authentification, soit vous n’êtes pas autorisé à mettre à jour votre compte externe.",
        "login": "Connexion",
+       "login-security": "Vérifier votre identité",
        "nav-login-createaccount": "Créer un compte ou se connecter",
        "userlogin": "Créer un compte ou se connecter",
        "userloginnocreate": "Connexion",
        "userlogin-resetpassword-link": "Mot de passe oublié ?",
        "userlogin-helplink2": "Aide pour se connecter",
        "userlogin-loggedin": "Vous êtes déjà connecté{{GENDER:$1||e|(e)}} en tant que $1.\nUtilisez le formulaire ci-dessous pour vous connecter avec un autre compte utilisateur.",
+       "userlogin-reauth": "Vous devez vous reconnecter pour vérifier que vous êtes {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Créer un autre compte",
        "createacct-emailrequired": "Adresse de courriel",
        "createacct-emailoptional": "Adresse de courriel (facultative)",
        "createacct-email-ph": "Entrez votre adresse de courriel",
        "createacct-another-email-ph": "Entrez l’adresse de courriel",
        "createaccountmail": "Utiliser un mot de passe aléatoire temporaire et l’envoyer à l’adresse de courriel spécifiée",
+       "createaccountmail-help": "Peut être utilisé pour créer un compte pour une autre personne sans connaître le mot de passe.",
        "createacct-realname": "Nom réel (facultatif)",
        "createaccountreason": "Motif :",
        "createacct-reason": "Motif",
        "createacct-reason-ph": "Pourquoi créez-vous un autre compte",
+       "createacct-reason-help": "Message affiché dans le journal de création de compte",
        "createacct-submit": "Créez votre compte",
        "createacct-another-submit": "Créer le compte",
+       "createacct-continue-submit": "Continuer la création de compte",
+       "createacct-another-continue-submit": "Continuer la création de compte",
        "createacct-benefit-heading": "{{SITENAME}} est écrit par des gens comme vous.",
        "createacct-benefit-body1": "modification{{PLURAL:$1||s}}",
        "createacct-benefit-body2": "page{{PLURAL:$1||s}}",
        "nocookiesnew": "Le compte utilisateur a été créé, mais vous n’êtes pas connecté{{GENDER:||e|(e)}}.\n{{SITENAME}} utilise des cookies pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
        "nocookieslogin": "{{SITENAME}} utilise des cookies pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter.",
        "nocookiesfornew": "Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.\nVérifiez que vous avez activé les cookies, rechargez la page et essayez à nouveau.",
+       "createacct-loginerror": "Le compte a bien été créé mais vous ne pouvez pas vous connecter automatiquement? Veuillez vous [[Special:UserLogin|connecter manuellement]].",
        "noname": "Vous n’avez pas saisi un nom d’utilisateur valide.",
        "loginsuccesstitle": "Connecté",
        "loginsuccess": "<strong>Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».</strong>",
-       "nosuchuser": "L'utilisateur « $1 » n’existe pas.\nLes noms d’utilisateurs sont sensibles à la casse.\nVérifiez l’orthographe, ou [[Special:CreateAccount|créez un nouveau compte]].",
+       "nosuchuser": "L’utilisateur « $1 » n’existe pas.\nLes noms d’utilisateurs sont sensibles à la casse.\nVérifiez l’orthographe, ou [[Special:CreateAccount|créez un nouveau compte]].",
        "nosuchusershort": "Il n’y a pas de contributeur avec le nom « $1 ».\nVeuillez vérifier l’orthographe.",
        "nouserspecified": "Vous devez saisir un nom d’utilisateur.",
        "login-userblocked": "Cet utilisateur est bloqué. Connexion non autorisée.",
        "createacct-another-realname-tip": "Le véritable nom est optionnel.\nSi vous décidez de le fournir, il sera utilisé pour créditer l’auteur de ses travaux.",
        "pt-login": "Se connecter",
        "pt-login-button": "Se connecter",
+       "pt-login-continue-button": "Continuer la connexion",
        "pt-createaccount": "Créer un compte",
        "pt-userlogout": "Se déconnecter",
        "php-mail-error-unknown": "Erreur inconnue dans la fonction <code>mail()</code> de PHP.",
        "botpasswords-invalid-name": "Le nom d’utilisateur spécifié ne contient pas de séparateur de mot de passe de robots (« $1 »).",
        "botpasswords-not-exist": "L’utilisateur « $1 » n’a pas de nom de mot de passe de robots appelé « $2 ».",
        "resetpass_forbidden": "Les mots de passe ne peuvent pas être changés",
+       "resetpass_forbidden-reason": "Les mots de passe ne peuvent pas être modifiés : $1",
        "resetpass-no-info": "Vous devez être connecté pour avoir accès à cette page.",
        "resetpass-submit-loggedin": "Changer de mot de passe",
        "resetpass-submit-cancel": "Annuler",
        "passwordreset-emailsentusername": "S’il y a une adresse de courriel associée à ce nom d’utilisateur, alors un courriel de réinitialisation de mot de passe sera envoyé.",
        "passwordreset-emailsent-capture": "Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.",
        "passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur|utilisatrice}} a échoué : $1",
+       "passwordreset-emailsent-capture2": "The password reset {{PLURAL:$1|Le courriel de réinitialisation du mot de passe a été envoyé|Les courriels de réinitialisation du mot de passe ont été envoyés}}. {{PLURAL:$1|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et mots de passe est affichée}} ci-dessous.",
+       "passwordreset-emailerror-capture2": "L’envoi de courriel à {{GENDER:$2|l’utilisateur|l’utilisatrice}} a échoué : $1 {{PLURAL:$3|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et des mots de passe est affichée}} ci-dessous.",
+       "passwordreset-nocaller": "Un appelant doit être fourni",
+       "passwordreset-nosuchcaller": "L’appelant n’existe pas : $1",
+       "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être aucun fournisseur n’a été configuré ?",
+       "passwordreset-invalideamil": "Adresse de messagerie non valide",
+       "passwordreset-nodata": "Aucun nom d’utilisateur ni adresse de messagerie n’a été fourni",
        "changeemail": "Changer ou supprimer l’adresse de courriel",
        "changeemail-header": "Complétez ce formulaire pour modifier votre adresse de courriel. Si vous voulez supprimer l’association d’une adresse de courriel avec votre compte, laissez la nouvelle adresse de courriel vide lors de la soumission du formulaire.",
        "changeemail-passwordrequired": "Vous devrez saisir votre mot de passe pour confirmer cette modification.",
        "accmailtext": "Un mot de passe généré aléatoirement pour [[User talk:$1|$1]] a été envoyé à $2.\nIl peut être modifié sur la page ''[[Special:ChangePassword|Changement de mot de passe]]'' après connexion.",
        "newarticle": "(Nouveau)",
        "newarticletext": "Vous avez suivi un lien vers une page qui n’existe pas encore. \nAfin de créer cette page, entrez votre texte dans la boîte ci-après (vous pouvez consulter [$1 la page d’aide] pour plus d’informations). \nSi vous êtes arrivé{{GENDER:||e}} ici par erreur, cliquez sur le bouton '''retour''' de votre navigateur.",
-       "anontalkpagetext": "---- ''Vous êtes sur la page de discussion d'un utilisateur anonyme qui n'a pas encore créé de compte ou qui n'en utilise pas. Pour cette raison, nous devons utiliser son adresse IP pour l'identifier. Une adresse IP peut être partagée par plusieurs utilisateurs. Si vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:CreateAccount|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d'éviter toute confusion future avec d'autres contributeurs anonymes.''",
+       "anontalkpagetext": "----\n<em>Vous êtes sur la page de discussion d’un utilisateur anonyme qui n’a pas encore créé de compte ou qui n’en utilise pas</em>.\nPour cette raison, nous devons utiliser son adresse IP pour l’identifier.\nUne adresse IP peut être partagée par plusieurs utilisateurs.\nSi vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:CreateAccount|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d’éviter toute confusion future avec d’autres contributeurs anonymes.",
        "noarticletext": "Il n’y a pour l’instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|lancer une recherche sur ce titre]] dans les autres pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les opérations liées]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer cette page]</span>.",
        "noarticletext-nopermission": "Il n'y a pour l'instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|faire une recherche sur ce titre]] dans les autres pages,\nou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les journaux associés]</span>.",
        "missing-revision": "La révision n° $1 de la page intitulée « {{FULLPAGENAME}} » n'existe pas.\n\nCela survient en général en suivant un lien historique obsolète vers une page qui a été supprimée.\nVous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "whatlinkshere-prev": "{{PLURAL:$1|précédente|$1 précédentes}}",
        "whatlinkshere-next": "{{PLURAL:$1|suivante|$1 suivantes}}",
        "whatlinkshere-links": "← liens",
-       "whatlinkshere-hideredirs": "Masquer les redirections",
-       "whatlinkshere-hidetrans": "Masquer les inclusions",
-       "whatlinkshere-hidelinks": "Masquer les liens",
-       "whatlinkshere-hideimages": "Masquer les liens vers le fichier",
+       "whatlinkshere-hideredirs": "$1 les redirections",
+       "whatlinkshere-hidetrans": "$1 les inclusions",
+       "whatlinkshere-hidelinks": "$1 les liens",
+       "whatlinkshere-hideimages": "$1 les liens vers le fichier",
        "whatlinkshere-filters": "Filtres",
        "whatlinkshere-submit": "Lister",
        "autoblockid": "Blocage automatique #$1",
        "timezone-local": "Local",
        "duplicate-defaultsort": "Attention : la clé de tri par défaut « $2 » écrase la précédente clé « $1 ».",
        "duplicate-displaytitle": "<strong>Attention :</strong> Le titre d'affichage « $2 » remplace l'ancien titre d'affichage « $1 ».",
-       "restricted-displaytitle": "<strong>Avertissement :</strong> le titre d’affichae \"$1\" a été ignoré car il n'est pas équivalent au titre effectif de la page.",
+       "restricted-displaytitle": "<strong>Avertissement :</strong> le titre d’affichage \"$1\" a été ignoré car il n'est pas équivalent au titre effectif de la page.",
        "invalid-indicator-name": "<strong>Erreur :</strong> L’attribut <code>name</code> des indicateurs d’état de la page ne doit pas être vide.",
        "version": "Version",
        "version-extensions": "Extensions installées",
        "log-action-filter-suppress-block": "Suppression d’utilisateur par blocage",
        "log-action-filter-suppress-reblock": "Suppression d’utilisateur par blocage réitéré",
        "log-action-filter-upload-upload": "Nouveau téléversement",
-       "log-action-filter-upload-overwrite": "Réitérer le téléversement"
+       "log-action-filter-upload-overwrite": "Réitérer le téléversement",
+       "authmanager-authn-not-in-progress": "L’authentification n’est pas en cours ou les données de session ont été perdues. Veuillez recommencer depuis le début.",
+       "authmanager-authn-no-primary": "Les informations d’identification fournies n’ont pas pu être authentifiées.",
+       "authmanager-authn-no-local-user": "Les informations d’identification ne sont associées à aucun utilisateur sur ce wiki.",
+       "authmanager-authn-no-local-user-link": "Les informations d’authentification sont valides mais ne sont associées à aucun utilisateur sur ce wiki. Connectez-vous d’une autre manière, ou créez un nouvel utilisateur, et vous aurez la possibilité de lier vos informations précédentes à ce compte.",
+       "authmanager-authn-autocreate-failed": "La création automatique d’un compte local a échoué : $1",
+       "authmanager-change-not-supported": "Les informations d’identification fournies ne peuvent pas être modifiées, car rien ne les utiliserait.",
+       "authmanager-create-disabled": "La création de compte est désactivée.",
+       "authmanager-create-from-login": "Pour créer votre compte, veuillez remplir les champs ci-dessous.",
+       "authmanager-create-not-in-progress": "La création de compte n’est pas en cours, ou les données de session ont été perdues. Veuillez recommencer depuis le début.",
+       "authmanager-create-no-primary": "Les informations d’identification fournies n’ont pas pu être utilisées pour la création de compte.",
+       "authmanager-link-no-primary": "Les informations d’identification fournies n’ont pas pu être utilisées pour lier un compte.",
+       "authmanager-link-not-in-progress": "La liaison de compte n’est pas en cours ou les données de session ont été perdues. Veuillez recommencer depuis le début.",
+       "authmanager-authplugin-setpass-failed-title": "Échec du changement de mot de passe",
+       "authmanager-authplugin-setpass-failed-message": "Le module d’authentification a refusé le changement de mot de passe.",
+       "authmanager-authplugin-create-fail": "Le module d’authentification a refusé la création de compte.",
+       "authmanager-authplugin-setpass-denied": "Le module d’authentification ne permet pas la modification des mots de passe.",
+       "authmanager-authplugin-setpass-bad-domain": "Domaine non valide.",
+       "authmanager-autocreate-noperm": "La création automatique de compte n’est pas autorisée.",
+       "authmanager-autocreate-exception": "La création automatique de compte est désactivée temporairement, du fait d’erreurs antérieures.",
+       "authmanager-userdoesnotexist": "Le compte utilisateur « $1 » n’est pas inscrit.",
+       "authmanager-userlogin-remembermypassword-help": "Indique si le mot de passe doit être mémorisé au-delà de la durée de la session.",
+       "authmanager-username-help": "Nom d’utilisateur pour l’authentification.",
+       "authmanager-password-help": "Mot de passe pour l’authentification.",
+       "authmanager-domain-help": "Domaine pour l’authentification externe.",
+       "authmanager-retype-help": "Mot de passe de nouveau pour confirmation.",
+       "authmanager-email-label": "Courriel",
+       "authmanager-email-help": "Adresse de messagerie",
+       "authmanager-realname-label": "Nom réel",
+       "authmanager-realname-help": "Nom réel de l’utilisateur",
+       "authmanager-provider-password": "Authentification par mot de passe",
+       "authmanager-provider-password-domain": "Authentification par mot de passe et domaine",
+       "authmanager-provider-temporarypassword": "Mot de passe temporaire",
+       "authprovider-confirmlink-message": "D’après vos dernières tentatives de connexion, les comptes suivants peuvent être liés à votre compte wiki. Les lier vous permettra de se connecter via ces comptes. Veuillez sélectionner lesquels doivent être liés.",
+       "authprovider-confirmlink-request-label": "Comptes qui doivent être liés",
+       "authprovider-confirmlink-success-line": "$1 : Liés avec succès.",
+       "authprovider-confirmlink-failed": "La liaison du compte n’a pas bien réussi : $1",
+       "authprovider-confirmlink-ok-help": "Continuer après l’affichage des messages d’échec de liaison.",
+       "authprovider-resetpass-skip-label": "Sauter",
+       "authprovider-resetpass-skip-help": "Sauter la réinitialisation du mot de passe.",
+       "authform-nosession-login": "L’authentification a réussi, mais votre navigateur ne peut pas se « souvenir » d’avoir été connecté.\n\n$1",
+       "authform-nosession-signup": "Le compte a été créé, mais votre navigateur ne peut pas se « souvenir » avoir été connecté.\n\n$1",
+       "authform-newtoken": "Jeton manquant. $1",
+       "authform-notoken": "Jeton manquant",
+       "authform-wrongtoken": "Mauvais jeton",
+       "specialpage-securitylevel-not-allowed-title": "Interdit",
+       "specialpage-securitylevel-not-allowed": "Désolé, vous n’êtes pas autorisé à utiliser cette page car votre identité n’a pu être vérifiée.",
+       "authpage-cannot-login": "Impossible de démarrer la connexion.",
+       "authpage-cannot-login-continue": "Impossible de continuer la connexion. Votre session a certainement expiré.",
+       "authpage-cannot-create": "Impossible de commencer la création de compte.",
+       "authpage-cannot-create-continue": "Impossible de poursuivre la création du compte. Votre session a sans doute expiré.",
+       "authpage-cannot-link": "Impossible de commencer la liaison du compte.",
+       "authpage-cannot-link-continue": "Impossible de continuer la liaison du compte. Votre session a sans doute expiré.",
+       "cannotauth-not-allowed-title": "Autorisation refusée",
+       "cannotauth-not-allowed": "Vous n’êtes pas autorisé à utiliser cette page",
+       "changecredentials": "Modifier les informations d’identification",
+       "changecredentials-submit": "Modifier",
+       "changecredentials-submit-cancel": "Annuler",
+       "changecredentials-invalidsubpage": "$1 n’est pas un type d’information d’identification valide.",
+       "changecredentials-success": "Vos informations d’identification ont été modifiées.",
+       "removecredentials": "Supprimer les informations d’identification",
+       "removecredentials-submit": "Supprimer",
+       "removecredentials-submit-cancel": "Annuler",
+       "removecredentials-invalidsubpage": "$1 n’est pas un type d’information d’identification valide.",
+       "removecredentials-success": "Vos informations d’identification ont été supprimées.",
+       "credentialsform-provider": "Type d’information d’identification :",
+       "credentialsform-account": "Nom de compte :",
+       "cannotlink-no-provider-title": "Il n’y a pas de comptes pouvant être liés",
+       "cannotlink-no-provider": "Il n’y a pas de compte pouvant être lié.",
+       "linkaccounts": "Lier les comptes",
+       "linkaccounts-success-text": "Le compte a été lié.",
+       "linkaccounts-submit": "Lier les comptes",
+       "unlinkaccounts": "Dissocier les comptes",
+       "unlinkaccounts-success": "Le compte a été dissocié."
 }
index 0fda562..bb64d80 100644 (file)
        "password-change-forbidden": "Non pode mudar os contrasinais neste wiki.",
        "externaldberror": "Ou ben se produciu un erro da base de datos na autenticación externa ou ben non se lle permite actualizar a súa conta externa.",
        "login": "Acceder ao sistema",
+       "login-security": "Verifique a súa identidade",
        "nav-login-createaccount": "Rexistro",
        "userlogin": "Rexistro",
        "userloginnocreate": "Rexistro",
        "userlogin-resetpassword-link": "Esqueceu o contrasinal?",
        "userlogin-helplink2": "Axuda co rexistro",
        "userlogin-loggedin": "Xa accedeu ao sistema como {{GENDER:$1|$1}}.\nUtilice o formulario inferior para acceder como outro usuario.",
+       "userlogin-reauth": "Debe conectarse de novo para verificar que é {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crear outra conta",
        "createacct-emailrequired": "Enderezo de correo electrónico",
        "createacct-emailoptional": "Enderezo de correo electrónico (opcional)",
        "createacct-email-ph": "Insira o seu enderezo de correo electrónico",
        "createacct-another-email-ph": "Insira o enderezo de correo electrónico",
        "createaccountmail": "Utilizar un contrasinal aleatorio temporal e envialo ao enderezo de correo electrónico especificado",
+       "createaccountmail-help": "Pode usarse para crear unha conta para outra persoa sen coñecer o contrasinal.",
        "createacct-realname": "Nome real (opcional)",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que crea outra conta?",
+       "createacct-reason-help": "Mensaxe que se mostra no rexistro de creación de contas",
        "createacct-submit": "Crear a conta",
        "createacct-another-submit": "Crear conta",
+       "createacct-continue-submit": "Continuar a creación da conta",
+       "createacct-another-continue-submit": "Continuar a creación da conta",
        "createacct-benefit-heading": "Xente coma vostede elabora {{SITENAME}}.",
        "createacct-benefit-body1": "{{PLURAL:$1|edición|edicións}}",
        "createacct-benefit-body2": "{{PLURAL:$1|páxina|páxinas}}",
        "nocookiesnew": "A conta de usuario foi creada, pero non accedeu ao sistema.\n{{SITENAME}} para rexistrar os usuarios.\nVostede ten as cookies deshabilitadas.\nPor favor, habilíteas e logo acceda ao sistema co seu novo nome de usuario e contrasinal.",
        "nocookieslogin": "{{SITENAME}} usa cookies para rexistrar os usuarios.\nVostede ten as cookies deshabilitadas.\nPor favor, habilíteas e inténteo de novo.",
        "nocookiesfornew": "Non se creou a conta de usuario porque non puidemos confirmar a súa orixe.\nAsegúrese de que ten as cookies habilitadas, volva cargar a páxina e inténteo de novo.",
+       "createacct-loginerror": "A conta creouse correctamente, pero non se puido conectar automaticamente. Proceda ó [[Special:UserLogin|acceso manual]].",
        "noname": "Non especificou un nome de usuario válido.",
        "loginsuccesstitle": "Conectado",
        "loginsuccess": "<strong>Accedeu ao sistema de {{SITENAME}} como \"$1\".</strong>",
-       "nosuchuser": "Non existe ningún usuario chamado \"$1\".\nOs nomes de usuario diferencian entre maiúsculas e minúsculas.\nVerifique o nome que inseriu ou [[Special:CreateAccount|cree unha nova conta]].",
+       "nosuchuser": "Non existe ningún usuario chamado \"$1\".\nOs nomes de usuario diferencian entre maiúsculas e minúsculas.\nVerifique a ortografía ou [[Special:CreateAccount|cree unha nova conta]].",
        "nosuchusershort": "Non existe ningún usuario chamado \"$1\".\nVerifique o nome que inseriu.",
        "nouserspecified": "Cómpre especificar un nome de usuario.",
        "login-userblocked": "Este usuario está bloqueado. Acceso non autorizado.",
        "createacct-another-realname-tip": "O nome real é opcional.\nSe escolle dalo utilizarase para atribuír ao usuario o seu traballo.",
        "pt-login": "Acceder ao sistema",
        "pt-login-button": "Acceder ao sistema",
+       "pt-login-continue-button": "Continuar a conexión",
        "pt-createaccount": "Crear unha conta",
        "pt-userlogout": "Saír",
        "php-mail-error-unknown": "Erro descoñecido na función mail() do PHP.",
        "botpasswords-invalid-name": "O nome de usuario especificado non contén o separador de contrasinal de bot (\"$1\").",
        "botpasswords-not-exist": "O usuario \"$1\" non ten un contrasinal de bot de nome \"$2\".",
        "resetpass_forbidden": "Non se poden mudar os contrasinais",
+       "resetpass_forbidden-reason": "Os contrasinais non poden cambiarse: $1",
        "resetpass-no-info": "Debe rexistrarse para acceder directamente a esta páxina.",
        "resetpass-submit-loggedin": "Cambiar o contrasinal",
        "resetpass-submit-cancel": "Cancelar",
        "passwordreset-emailsentusername": "Se hai unha dirección de correo electrónico asociada con este nome de usuario, entón enviarase un correo electrónico para o restablecemento do contrasinal.",
        "passwordreset-emailsent-capture": "Enviouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación.",
        "passwordreset-emailerror-capture": "Xerouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación, pero o envío {{GENDER:$2|ao usuario|á usuaria}} fallou: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|O correo de reinicialización do contrasinal foi enviado|Os correos de reinicialización do contrasinal foron enviados}}. {{PLURAL:$1|O nome de usuario e contrasinal móstrase abaixo|A lista de nomes de usuarios e contrasinais móstranse abaixo}}.",
+       "passwordreset-emailerror-capture2": "O envío do correo {{GENDER:$2|ó usuario|á usuaria}} fallou: $1 {{PLURAL:$3|O nome de usuario e contrasinal móstrase abaixo|A lista de usuarios e contrasinais móstranse abaixo}}.",
+       "passwordreset-ignored": "A reinicialización do contrasinal non puido realizarse. Quizais non configurou o provedor?",
+       "passwordreset-invalideamil": "O enderezo de correo electrónico non é válido",
+       "passwordreset-nodata": "Non se indicou o nome de usuario ou a dirección de correo electrónico",
        "changeemail": "Cambiar ou eliminar o enderezo de correo electrónico",
        "changeemail-header": "Encha este formulario para cambiar o seu enderezo de correo electrónico. Se vostede quere eliminar a asociación da dirección de correo electrónico da súa conta, deixe en branco a nova dirección de correo electrónico cando envíe o formulario.",
        "changeemail-passwordrequired": "Terá que escribir o seu contrasinal para confirmar este cambio.",
        "accmailtext": "Un contrasinal xerado ao chou para [[User talk:$1|$1]] foi enviado a $2. Pode modificarse na páxina de [[Special:ChangePassword|cambio de contrasinais]] tras acceder ao sistema.",
        "newarticle": "(Novo)",
        "newarticletext": "Seguiu unha ligazón a unha páxina que aínda non existe.\nPara crear a páxina, comece a escribir na caixa inferior (consulte a [$1 páxina de axuda] para obter máis información).\nSe chegou aquí por erro, simplemente prema no botón '''atrás''' do seu navegador.",
-       "anontalkpagetext": "----''Esta é a páxina de conversa dun usuario anónimo que aínda non creou unha conta ou que non a usa. Polo tanto, empregamos o enderezo IP para a súa identificación. Este enderezo IP pódeno compartir varios usuarios distintos. Se pensa que foron dirixidos contra a súa persoa comentarios inadecuados, por favor, [[Special:CreateAccount|cree unha conta]] ou [[Special:UserLogin|acceda ao sistema]] para evitar futuras confusións con outros usuarios anónimos.''",
+       "anontalkpagetext": "----\n<em>Esta é a páxina de conversa dun usuario anónimo que aínda non creou unha conta ou que non a usa.</em> Polo tanto, empregamos o enderezo IP para a súa identificación. Este enderezo IP pódeno compartir varios usuarios distintos. Se pensa que foron dirixidos contra a súa persoa comentarios inadecuados, por favor, [[Special:CreateAccount|cree unha conta]] ou [[Special:UserLogin|acceda ao sistema]] para evitar futuras confusións con outros usuarios anónimos.",
        "noarticletext": "Actualmente non hai ningún texto nesta páxina.\nPode [[Special:Search/{{PAGENAME}}|procurar polo título desta páxina]] noutras páxinas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ollar os rexistros relacionados]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear a páxina]</span>.",
        "noarticletext-nopermission": "Actualmente non hai ningún texto nesta páxina.\nPode [[Special:Search/{{PAGENAME}}|procurar polo título desta páxina]] noutras páxinas ou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ollar os rexistros relacionados]</span>, pero non ten os permisos necesarios para crear esta páxina.",
        "missing-revision": "A revisión nº$1 da páxina chamada \"{{FULLPAGENAME}}\" non existe.\n\nA miúdo, isto está provocado por seguir unha ligazón de historial obsoleta cara a unha páxina que foi borrada.\nO [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados] contén máis detalles.",
        "whatlinkshere-prev": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "whatlinkshere-next": "{{PLURAL:$1|seguinte|$1 seguintes}}",
        "whatlinkshere-links": "← ligazóns",
-       "whatlinkshere-hideredirs": "Ocultar as redireccións",
-       "whatlinkshere-hidetrans": "Ocultar as inclusións",
-       "whatlinkshere-hidelinks": "Ocultar as ligazóns",
-       "whatlinkshere-hideimages": "Ocultar as ligazóns ao ficheiro",
+       "whatlinkshere-hideredirs": "$1 redireccións",
+       "whatlinkshere-hidetrans": "$1 inclusións",
+       "whatlinkshere-hidelinks": "$1 ligazóns",
+       "whatlinkshere-hideimages": "$1 ligazóns ao ficheiro",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Ir",
        "autoblockid": "Bloqueo automático nº$1",
        "log-action-filter-suppress-block": "Supresión de usuario por bloqueo",
        "log-action-filter-suppress-reblock": "Supresión de usuario por bloqueo reiterado",
        "log-action-filter-upload-upload": "Nova subida",
-       "log-action-filter-upload-overwrite": "Resubida"
+       "log-action-filter-upload-overwrite": "Resubida",
+       "authmanager-authn-no-primary": "A información de identificación proporcionada non pode ser autenticada.",
+       "authmanager-authn-no-local-user": "As credenciais proporcionadas non están asociadas con ningún usuario neste wiki.",
+       "authmanager-authn-autocreate-failed": "A creación automatica dunha conta local fallou: $1",
+       "authmanager-create-disabled": "A creación de contas está desactivada.",
+       "authmanager-email-label": "Correo electrónico",
+       "authmanager-email-help": "Enderezo de correo electrónico",
+       "authmanager-realname-label": "Nome real",
+       "authmanager-realname-help": "Nome real do usuario",
+       "authmanager-provider-temporarypassword": "Contrasinal temporal",
+       "authprovider-resetpass-skip-label": "Omitir",
+       "authprovider-resetpass-skip-help": "Saltar a reinicialización do contrasinal.",
+       "specialpage-securitylevel-not-allowed-title": "Non permitido",
+       "changecredentials-submit": "Cambiar",
+       "changecredentials-submit-cancel": "Cancelar",
+       "removecredentials-submit": "Eliminar",
+       "removecredentials-submit-cancel": "Cancelar",
+       "credentialsform-account": "Nome da conta:"
 }
index 2e12a73..e3ae604 100644 (file)
        "accmailtitle": "ગુપ્તસંજ્ઞા મોકલવામાં આવી છે.",
        "accmailtext": "[[User talk:$1|$1]] માટે રચેલ ગુપ્તસંજ્ઞા $2 ને મોકલાવી દેવાઇ છે. આ નવા ખાતાનીગુપ્તસંજ્ઞા પ્રવેશ કર્યા બાદ ''[[Special:ChangePassword|ગુપ્તસંજ્ઞા બદલો]]'' વાપરીને બદલી શકાશે.",
        "newarticle": "(નવીન)",
-       "newarticletext": "<div style=\"background: #F9F9F9; margin-top: 1em; padding: 1em; border: 1px solid #ccc; border-right: 2px solid #ccc; border-bottom: 2px solid #ccc\"><center>'''આ વિકિ પ્રકલ્પ પર આ પ્રકારનો લેખ હાલમાં નથી'''</center>\n----\n* [[Image:Searchtool.svg|25px|alt=|link=]] '''[[{{ns:special}}:Search/{{PAGENAME}}|“{{PAGENAME}}”]]''' માટે શોધો.\n* [[Image:Nuvola apps fonts.png|25px|alt=|link=]] જે લેખોનું શીર્ષક આ પ્રત્યય સાથે શરુ થાય છે તેનો  [[{{ns:special}}:Prefixindex/{{FULLPAGENAME}}|ઉપસર્ગ]] જૂઓ.\n* [[Image:Nuvola apps ksig.png|25px|alt=|link=]] <span class=\"plainlinks\">'''[{{SERVER}}{{localurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} આ શીર્ષકનું નવું પૃષ્ઠ બનાવો.]'''</span> \n* [[Image:WP-TranslationProject TwoFlags.svg|25px|alt=|link=]] ''વૈશ્વિક લેખ યોજના'' દ્વારા આ લેખને [//vs.aka-online.de/cgi-bin/globalwpsearch.pl?search={{PAGENAMEE}} અન્ય ભાષાઓમાં શોધો.]\n<div style=\"margin: 1em 2em 1em 3em; font-size: 90%;\">\nયોગદાનકર્તાઓ માટે:\n* જો આપ હાલમાં આ લેખ બનાવી રહ્યા છો તો પોતાના બ્રાઉઝરની <span class=\"plainlinks\">[{{SERVER}}{{localurl:{{NAMESPACE}}:{{PAGENAME}}|action=purge}} કૈશ ખાલી]</span> કરો, અથવા થોડી વધુ રાહ જૂઓ, પછી કામ આગળ વધારો.\n* કદાચ આ પાનું દૂર કરાયું છે, આ જોવા માટે કૃપા કરીને <span class=\"plainlinks\">[{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} આ પાનાનો વિલોપન ઇતિહાસ]</span> જૂઓ.\n* આપ આ લેખ બનાવવા માગો છો તો ક્રુપા કરીને નીચે આપેલા ખાનામાં લખવાનું શરુ કરો.\n* જો આપ ભૂલમાં અહીં આવી ગયા છો તો આપના બ્રાઉઝરના બૅક બટન પર ક્લિક કરીને પરત ફરો.</div></div>",
+       "newarticletext": "તમે અસ્તિત્વ ન ધરાવતા પાનાંની કડી ખોલી છે.\nપાનું બનાવવા માટે, નીચેની જગ્યામાં લખવાનું શરૂ કરો (વધુ માહિતી માટે જુઓ [$1 મદદ પાનું]).\nજો તમે ભૂલથી અહીં આવી ગયા હોવ તો, તમારા બ્રાઉઝરનું <strong>પાછાં જાવ</strong> બટન ક્લિક કરી પાછાં જાવ.",
        "anontalkpagetext": "----\n<em>આ એક અજ્ઞાત સભ્યનું ચર્ચા પાનું છે જેમણે ક્યાં તો પોતાનું ખાતું ખોલ્યું નથી અથવા તો તેને વાપરતા નથી.</em>\nઆથી તેમને ઓળખવા માટે અમારે સાંખ્યિક IP સરનામાની મદદ લેવી પડી છે.\nઆવું IP સરનામું ઘણાં અન્ય સભ્યો પણ વાપરતા હોઇ શકે.\nજો તમે અજ્ઞાત સભ્ય હોવ અને માનતા હોવ કે અસંધિત ટિપ્પણીઓ તમારી તરફ વાળવામાં આવી છે, તો કૃપયા  [[Special:CreateAccount|create an account]] અથવા [[Special:UserLogin|log in]]નો ઉપયોગ કરશો જેથી તમને કોઈ અજ્ઞાત સભ્ય સમજવાની ભૂલ ભવિષ્યમાં ટાળી શકાય.",
-       "noarticletext": "àª\86 àªªàª¾àª¨àª¾àª®àª¾àª\82 àª¹àª¾àª²àª®àª¾àª\82 àª\95à«\8bàª\87 àª®àª¾àª¹àª¿àª¤àª¿ àª¨àª¥à«\80.\nતમà«\87  [[Special:Search/{{PAGENAME}}|àª\86 àª¶àª¬à«\8dદ]] àª§àª°àª¾àªµàª¤àª¾àª\82 àª\85નà«\8dય àª²à«\87àª\96à«\8b àª¶à«\8bધà«\80 àª¶àª\95à«\8b àª\9bà«\8b, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} àª¸àª\82લàª\97à«\8dન àª®àª¾àª¹àª¿àª¤àª¿ àªªàª¤à«\8dરàª\95à«\8bમાàª\82 àª¶à«\8bધà«\80 àª¶àª\95à«\8b àª\9bà«\8b],\nàª\85થવા  [{{fullurl:{{FULLPAGENAME}}|action=edit}} àª\86 àªªàª¾àª¨àª¾àª®àª¾àª\82 àª«à«\87રફાર àª\95રà«\80] àª®àª¾àª¹àª¿àª¤àª¿ àª\89મà«\87રવાનà«\81àª\82 àª¶àª°à«\82 àª\95રà«\80 àª¶àª\95à«\8b àª\9bà«\8b</span>.",
+       "noarticletext": "àª\86 àªªàª¾àª¨àª¾àª®àª¾àª\82 àª¹àª¾àª²àª®àª¾àª\82 àª\95à«\8bàª\87 àª²àª\96ાણ àª¨àª¥à«\80.\nતમà«\87 àª¬à«\80àª\9cાàª\82 àªªàª¾àª¨àª¾àª\82માàª\82 [[Special:Search/{{PAGENAME}}|àª\86 àªªàª¾àª¨àª¾àª\82ના àª¶à«\80રà«\8dષàª\95 àª®àª¾àª\9fà«\87 àª¶à«\8bધà«\80 àª¶àª\95à«\8b àª\9bà«\8b]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} àª¸àª\82લàª\97à«\8dન àª®àª¾àª¹àª¿àª¤àª¿ àªªàª¤à«\8dરàª\95à«\8bમાàª\82 àª¶à«\8bધà«\80 àª¶àª\95à«\8b àª\9bà«\8b],\nàª\85થવા [{{fullurl:{{FULLPAGENAME}}|action=edit}} àª\86 àªªàª¾àª¨à«\81àª\82 àª¬àª¨àª¾àªµà«\80 àª¶àª\95à«\8b àª\9bà«\8b]</span>.",
        "noarticletext-nopermission": "આ પાનામાં હાલમાં કોઇ માહિતિ નથી.\nતમે  [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, અથવા <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો], પરંતુ તમને આ પાનું બનાવવાની મંજૂરી નથી.",
        "userpage-userdoesnotexist": "સભ્ય ખાતું \"<nowiki>$1</nowiki>\"ની નોંધણીનથી થઈ.\nશું તમે ખરેખર આ પાનાની રચના કે ફેરફાર કરવા માંગો છો",
        "userpage-userdoesnotexist-view": "સભ્યના ખાતા $1 ની નોંધણી નથી થઈ",
        "editingsection": "$1 (પરિચ્છેદ)નો ફેરફાર કરી રહ્યા છો",
        "editingcomment": "$1 (પરિચ્છેદ)નો ફેરફાર કરી રહ્યા છો",
        "editconflict": "ફેરફારમાં વિસંગતતા: $1",
-       "explainconflict": "તમà«\87 àª«à«\87રફાર àª\95રવાનà«\80 àª¶àª°à«\82àª\86ત àª\95રà«\80 àª¤à«\87 àª¦àª°àª®à«\8dયાન àª\85મà«\81àª\95 àª\95à«\8bàª\87àª\95à«\87 àªªàª£ àª¤à«\87માàª\82 àª«à«\87રફાર àª\95રà«\8dયાàª\82 àª\9bà«\87.\nàª\89પરનà«\8b àª\85àª\95à«\8dષર àª¦à«\87હ àª\85તà«\8dયરનà«\8b àªµàª¿àª¹àª°àª®àª¾àª¨ àª¸à«\8dથિતિ àª¬àª¤àª¾àªµà«\87 àª\9bà«\87.\nતમારા àª¦à«\8dવારા àª\95રાયà«\87લ àª«à«\87રફાર àª¨à«\80àª\9aà«\87ના àª\95à«\8dષà«\87તà«\8dરમાàª\82 àª¦à«\87àª\96ાય àª\9bà«\87.\nતમારà«\87 àª¤àª®àª¾àª°àª¾ àª«à«\87રફારà«\8b àªµàª¿àª¹àª°àª®àª¾àª¨ àª¹àª¯àª¾àª¤ àª²à«\87àª\96માàª\82 àªµàª¿àª²àª¿àª¨ àª\95રવà«\8b àªªàª¡àª¶à«\87. \n àª\9cà«\8b àª¤àª®à«\87  \"{{int:savearticle}}\" àª\86 àª¬àª¾àª¨ àª¦àª¬àª¾àªµàª¶à«\8b àª¤à«\8b '''ફàª\95à«\8dત''' ઉપરનો લેખ સચવાશે.",
+       "explainconflict": "તમà«\87 àª«à«\87રફાર àª\95રવાનà«\80 àª¶àª°à«\82àª\86ત àª\95રà«\80 àª¤à«\87 àª¦àª°àª®à«\8dયાન àª\85મà«\81àª\95 àª\95à«\8bàª\87àª\95à«\87 àªªàª£ àª¤à«\87માàª\82 àª«à«\87રફાર àª\95રà«\8dયાàª\82 àª\9bà«\87.\nàª\89પરનà«\8b àª\85àª\95à«\8dષર àª¦à«\87હ àª\85તà«\8dયારનà«\8b àªµàª¿àª¹àª°àª®àª¾àª¨ àª¸à«\8dથિતિ àª¬àª¤àª¾àªµà«\87 àª\9bà«\87.\nતમારા àª¦à«\8dવારા àª\95રાયà«\87લ àª«à«\87રફાર àª¨à«\80àª\9aà«\87ના àª\95à«\8dષà«\87તà«\8dરમાàª\82 àª¦à«\87àª\96ાય àª\9bà«\87.\nતમારà«\87 àª¤àª®àª¾àª°àª¾ àª«à«\87રફારà«\8b àªµàª¿àª¹àª°àª®àª¾àª¨ àª¹àª¯àª¾àª¤ àª²à«\87àª\96માàª\82 àªµàª¿àª²àª¿àª¨ àª\95રવા àªªàª¡àª¶à«\87. \nàª\9cà«\8b àª¤àª®à«\87  \"{{int:savearticle}}\" àª\86 àª¬àª\9fન àª¦àª¬àª¾àªµàª¶à«\8b àª¤à«\8b <strong>ફàª\95à«\8dત</strong> ઉપરનો લેખ સચવાશે.",
        "yourtext": "તમારું લખાણ",
        "storedversion": "સંગ્રહેલ પુનરાવર્તન",
        "nonunicodebrowser": "'''ચેતવણી: તમારું બ્રાઉઝર યુનિકોડ ઉકેલવા સક્ષમ નથી.'''\nઅહીં તમે સુરક્ષિત રીતે ફેરફારો નહીં કરી શકો: ASCII સિવાયના અક્ષરો સંપાદન ચોકઠામાં હેક્સાડેસિમલ સ્વરૂપે દેખાશે.",
        "whatlinkshere-prev": "{{PLURAL:$1|પહેલાનું|પહેલાનાં $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|પછીનું|પછીનાં $1}}",
        "whatlinkshere-links": "←  કડીઓ",
-       "whatlinkshere-hideredirs": "અન્યત્ર વાળેલાં પાનાં $1",
-       "whatlinkshere-hidetrans": "$1 àª\86રપાર àª¸àª®àª¾àªµà«\87શનો",
-       "whatlinkshere-hidelinks": "કડીઓ $1",
+       "whatlinkshere-hideredirs": "$1 અન્યત્ર વાળેલ",
+       "whatlinkshere-hidetrans": "$1 àª¸àª®àª¾àªµà«\87શો",
+       "whatlinkshere-hidelinks": "$1 કડીઓ",
        "whatlinkshere-hideimages": "$1 ફાઇલની કડીઓ",
        "whatlinkshere-filters": "ચાળણીઓ",
        "autoblockid": "ઓટોબ્લોક #$1",
index 9196f2d..acdfe92 100644 (file)
@@ -34,7 +34,8 @@
                        "Geagea",
                        "פוילישער",
                        "DatGuy",
-                       "IKhitron"
+                       "IKhitron",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "tog-showtoolbar": "הצגת סרגל העריכה",
        "tog-editondblclick": "עריכת דפים בלחיצה כפולה",
        "tog-editsectiononrightclick": "עריכת פסקאות באמצעות לחיצה ימנית על כותרות הפסקאות",
-       "tog-watchcreations": "×\94×\95ספת ×\93פ×\99×\9d ×©×\99צרת×\99 ×\95ק×\91צ×\99×\9d ×©×\94×¢×\9c×\99ת×\99 לרשימת המעקב שלי",
-       "tog-watchdefault": "×\94×\95ספת ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×¢×¨×\9bת×\99 לרשימת המעקב שלי",
-       "tog-watchmoves": "×\94×\95ספת ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\94×¢×\91רת×\99 לרשימת המעקב שלי",
-       "tog-watchdeletion": "×\94×\95ספת ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\9e×\97קת×\99 לרשימת המעקב שלי",
-       "tog-watchuploads": "×\94×\95ספת ×§×\91צ×\99×\9d ×\97×\93ש×\99×\9d ×©×\94×¢×\9c×\99ת×\99 לרשימת המעקב שלי",
-       "tog-watchrollback": "×\94×\95ספת ×\93פ×\99×\9d ×©×\91×\99צעת×\99 בהם שחזור מהיר לרשימת המעקב שלי",
+       "tog-watchcreations": "×\94×\95ספת ×\93פ×\99×\9d ×©×\90× ×\99 {{GENDER:|×\99×\95צר|×\99×\95צרת}} ×\95ק×\91צ×\99×\9d ×©×\90× ×\99 ×\9e×¢×\9c×\94 לרשימת המעקב שלי",
+       "tog-watchdefault": "×\94×\95ספת ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\90× ×\99 {{GENDER:|×¢×\95ר×\9a|×¢×\95ר×\9bת}} לרשימת המעקב שלי",
+       "tog-watchmoves": "×\94×\95ספת ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\90× ×\99 {{GENDER:|×\9e×¢×\91×\99ר|×\9e×¢×\91×\99ר×\94}} לרשימת המעקב שלי",
+       "tog-watchdeletion": "×\94×\95ספת ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\90× ×\99 {{GENDER:|×\9e×\95×\97ק|×\9e×\95×\97קת}} לרשימת המעקב שלי",
+       "tog-watchuploads": "×\94×\95ספת ×§×\91צ×\99×\9d ×\97×\93ש×\99×\9d ×©×\90× ×\99 ×\9e×¢×\9c×\94 לרשימת המעקב שלי",
+       "tog-watchrollback": "×\94×\95ספת ×\93פ×\99×\9d ×©×\90× ×\99 {{GENDER:|×\9e×\91צע|×\9e×\91צעת}} בהם שחזור מהיר לרשימת המעקב שלי",
        "tog-minordefault": "סימון כל עריכה כמשנית כברירת מחדל",
        "tog-previewontop": "הצגת תצוגה מקדימה לפני תיבת העריכה",
        "tog-previewonfirst": "הצגת תצוגה מקדימה בעריכה הראשונה",
@@ -74,7 +75,7 @@
        "tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
        "tog-watchlisthidecategorization": "הסתרת שינויים בקטגוריות של דפים",
-       "tog-ccmeonemails": "×\9cש×\9c×\95×\97 ×\90×\9c×\99×\99 ×\94עתק×\99×\9d ×©×\9c ×\94×\95×\93×¢×\95ת ×\93×\95×\90\"×\9c ×©×©×\9c×\97ת×\99 למשתמשים אחרים",
+       "tog-ccmeonemails": "×\9cש×\9c×\95×\97 ×\90×\9c×\99×\99 ×\94עתק×\99×\9d ×©×\9c ×\94×\95×\93×¢×\95ת ×\93×\95×\90\"×\9c ×©×\90× ×\99 {{GENDER:|ש×\95×\9c×\97|ש×\95×\9c×\97ת}} למשתמשים אחרים",
        "tog-diffonly": "ביטול הצגת תוכן הדף מתחת להשוואת הגרסאות",
        "tog-showhiddencats": "הצגת קטגוריות מוסתרות",
        "tog-norollbackdiff": "לא להציג את ההבדלים בין הגרסאות לאחר ביצוע שחזור",
@@ -82,7 +83,7 @@
        "tog-prefershttps": "תמיד להשתמש בתקשורת מאובטחת לאחר הכניסה לחשבון",
        "underline-always": "תמיד",
        "underline-never": "לעולם לא",
-       "underline-default": "×\91ר×\99רת ×\94×\9e×\97×\93×\9c ×©×\9c ×\94×¢×\99צ×\95×\91 ×\90×\95 ×©×\9c ×\94×\93פ×\93פ×\9f",
+       "underline-default": "ברירת המחדל של העיצוב או הדפדפן",
        "editfont-style": "הגופן בתיבת העריכה:",
        "editfont-default": "ברירת המחדל של הדפדפן",
        "editfont-monospace": "גופן ברוחב קבוע (monospace)",
        "searchbutton": "חיפוש",
        "go": "הצגה",
        "searcharticle": "לדף",
-       "history": "היסטוריית הדף",
+       "history": "×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\92רס×\90×\95ת ×©×\9c ×\94×\93×£",
        "history_short": "היסטוריה",
        "updatedmarker": "עודכן מאז ביקורך האחרון",
-       "printableversion": "×\92רסת הדפסה",
+       "printableversion": "×\92רס×\94 ×\9cהדפסה",
        "permalink": "קישור קבוע",
        "print": "גרסה להדפסה",
        "view": "צפייה",
        "currentevents-url": "Project:אקטואליה",
        "disclaimers": "הבהרה משפטית",
        "disclaimerpage": "Project:הבהרה משפטית",
-       "edithelp": "×¢×\96ר×\94 ×\9cעריכה",
+       "edithelp": "×¢×\96ר×\94 ×\91עריכה",
        "helppage-top-gethelp": "עזרה",
        "mainpage": "עמוד ראשי",
        "mainpage-description": "עמוד ראשי",
        "viewsourceold": "הצגת מקור",
        "editlink": "עריכה",
        "viewsourcelink": "הצגת מקור",
-       "editsectionhint": "עריכת פסקה: $1",
+       "editsectionhint": "עריכת פסקה: \"$1\"",
        "toc": "תוכן עניינים",
        "showtoc": "הצגה",
        "hidetoc": "הסתרה",
        "confirmable-confirm": "האם {{GENDER:$1|ברצונך}} להמשיך?",
        "confirmable-yes": "כן",
        "confirmable-no": "לא",
-       "thisisdeleted": "×\9cש×\97×\96ר ×\90×\95 ×\9c×\94צ×\99×\92 $1?",
+       "thisisdeleted": "×\9c×\94צ×\99×\92 ×\90×\95 ×\9cש×\97×\96ר $1?",
        "viewdeleted": "להציג $1?",
        "restorelink": "{{PLURAL:$1|גרסה מחוקה אחת|$1 גרסאות מחוקות}}",
        "feedlinks": "הזנה:",
        "virus-badscanner": "הגדרות שגויות: סורק הווירוסים אינו ידוע: ''$1''",
        "virus-scanfailed": "הסריקה נכשלה (קוד: $1)",
        "virus-unknownscanner": "אנטי־וירוס בלתי ידוע:",
-       "logouttext": "<strong>×\99צ×\90ת×\9d ×\96×\94 ×¢×ª×\94 ×\9e×\94×\97ש×\91×\95×\9f.</strong>\n\nש×\99×\9e×\95 ×\9c×\91 ×\9b×\99 ×\99×\99ת×\9b×\9f ×©×\93פ×\99×\9d ×\90×\97×\93×\99×\9d ×\99×\9eש×\99×\9b×\95 ×\9c×\94×\99×\95ת ×\9e×\95צ×\92×\99×\9d ×\9b×\90×\99×\9c×\95 ×\90ת×\9d ×¢×\93×\99×\99×\9f ×\9e×\97×\95×\91ר×\99×\9d ×\9c×\97ש×\91×\95×\9f עד שתנקו את המטמון של הדפדפן שלכם.",
+       "logouttext": "<strong>×\99צ×\90ת×\9d ×\9e×\94×\97ש×\91×\95×\9f.</strong>\n\nש×\99×\9e×\95 ×\9c×\91 ×©×\99×\99ת×\9b×\9f ×©×\93פ×\99×\9d ×\9eס×\95×\99×\9e×\99×\9d ×\99×\9eש×\99×\9b×\95 ×\9c×\94×\99×\95ת ×\9e×\95צ×\92×\99×\9d ×\9b×\90×\99×\9c×\95 ×\90ת×\9d ×¢×\93×\99×\99×\9f ×\9e×\97×\95×\91ר×\99×\9d ×\9c×\97ש×\91×\95×\9f, עד שתנקו את המטמון של הדפדפן שלכם.",
        "cannotlogoutnow-title": "לא ניתן לצאת מהחשבון עכשיו",
        "cannotlogoutnow-text": "היציאה אינה אפשרית בעת שימוש ב{{GRAMMAR:תחילית|$1}}.",
        "welcomeuser": "ברוך בואך, $1!",
        "password-change-forbidden": "אין באפשרותך לשנות סיסמאות באתר זה.",
        "externaldberror": "אירעה שגיאת אימות בבסיס הנתונים, או שאינך מורשה לעדכן את החשבון החיצוני שלך.",
        "login": "כניסה לחשבון",
+       "login-security": "אימות הזהות שלך",
        "nav-login-createaccount": "כניסה לחשבון / הרשמה",
        "userlogin": "כניסה לחשבון / הרשמה",
        "userloginnocreate": "כניסה לחשבון",
        "userlogin-resetpassword-link": "שכחת את הסיסמה?",
        "userlogin-helplink2": "עזרה בכניסה לחשבון",
        "userlogin-loggedin": "אתם כבר מחוברים לחשבון {{GENDER:$1|$1}}.\nהשתמשו בטופס שלהלן כדי להתחבר לחשבון אחר.",
+       "userlogin-reauth": "עליכם להיכנס לחשבון כדי לאמת שאתם באמת {{GENDER:$1|$1}}.",
        "userlogin-createanother": "יצירת חשבון אחר",
        "createacct-emailrequired": "כתובת דוא\"ל",
        "createacct-emailoptional": "כתובת דוא\"ל (לא חובה)",
        "createacct-email-ph": "יש להקליד את כתובת הדוא\"ל שלך",
        "createacct-another-email-ph": "יש להקליד כתובת דוא\"ל",
        "createaccountmail": "שימוש בסיסמה זמנית אקראית ושליחתה לכתובת הדוא\"ל שצוינה",
+       "createaccountmail-help": "יכול לשמש ליצירת חשבון לאדם אחר בלי לברר מה הססמה.",
        "createacct-realname": "שם אמיתי (לא חובה)",
        "createaccountreason": "סיבה:",
        "createacct-reason": "סיבה",
        "createacct-reason-ph": "סיבה ליצירת חשבון נוסף",
+       "createacct-reason-help": "הודעה שמוצגת ביומן רישום המשתמשים",
        "createacct-submit": "יצירת החשבון שלך",
        "createacct-another-submit": "יצירת חשבון",
+       "createacct-continue-submit": "המשך ביצירת החשבון",
+       "createacct-another-continue-submit": "המשך ביצירת החשבון",
        "createacct-benefit-heading": "אנשים כמוך יוצרים את {{SITENAME}}.",
        "createacct-benefit-body1": "{{PLURAL:$1|עריכה|עריכות}}",
        "createacct-benefit-body2": "{{PLURAL:$1|דף|דפים}}",
        "nocookiesnew": "חשבון המשתמש שלכם נוצר, אך לא נכנסתם כמשתמשים רשומים.\nכדי להכניס משתמשים למערכת עושה {{SITENAME}} שימוש בעוגיות.\nבדפדפן שלכם העוגיות מבוטלות.\nאנא הפעילו אותן מחדש, ולאחר מכן תוכלו להיכנס למערכת עם שם המשתמש והסיסמה החדשים שלכם.",
        "nocookieslogin": "{{SITENAME}} משתמש בעוגיות כדי להכניס משתמשים למערכת.\nבדפדפן שלכם העוגיות מבוטלות.\nאנא הפעילו אותן מחדש ונסו שוב.",
        "nocookiesfornew": "חשבון המשתמש לא נוצר, כיוון שלא יכולנו לוודא את מקורו.\nודאו שהעוגיות מופעלות בדפדפן שלכם, העלו מחדש דף זה ונסו שוב.",
+       "createacct-loginerror": "החשבון נוצר בהצלחה, אבל לא ניתן היה להיכנס אליו באופן אוטומטי. נא [[Special:UserLogin|להיכנס באופן ידני]].",
        "noname": "לא הכנסת שם משתמש תקין",
        "loginsuccesstitle": "נכנסת לחשבון",
        "loginsuccess": "'''נכנסת ל{{grammar:תחילית|{{SITENAME}}}} בשם \"$1\".'''",
-       "nosuchuser": "×\90×\99×\9f ×\9eשת×\9eש ×\91ש×\9d \"$1\".\n×\90× ×\90 ×\95×\93×\90×\95 ×©×\94×\90×\99×\95ת × ×\9b×\95×\9f (×\9b×\95×\9c×\9c ×\90×\95ת×\99×\95ת ×¨×\99ש×\99×\95ת ×\95ק×\98× ×\95ת), או [[Special:CreateAccount|צרו חשבון חדש]].",
-       "nosuchusershort": "×\90×\99×\9f ×\9eשת×\9eש ×\91ש×\9d \"$1\".\n×\90× ×\90 ×\95×\93×\90×\95 שהאיות נכון.",
+       "nosuchuser": "×\90×\99×\9f ×\9eשת×\9eש ×\91ש×\9d \"$1\".\nש×\99×\9e×\95 ×\9c×\91 ×©×©×\9e×\95ת ×\9eשת×\9eש×\99×\9d ×\94×\9d ×ª×\9c×\95×\99×\99־ר×\99ש×\99×\95ת.\n×\90× ×\90 ×\91Ö´×\93ק×\95 ×\90ת ×\94×\90×\99×\95ת ×©×\9c ×©×\9d ×\94×\9eשת×\9eש, או [[Special:CreateAccount|צרו חשבון חדש]].",
+       "nosuchusershort": "×\90×\99×\9f ×\9eשת×\9eש ×\91ש×\9d \"$1\".\n× ×\90 ×\9c×\95×\95×\93×\90 שהאיות נכון.",
        "nouserspecified": "יש לציין שם משתמש.",
        "login-userblocked": "משתמש זה חסום. אינכם מורשים להיכנס לחשבון.",
        "wrongpassword": "הסיסמה שהקלדתם שגויה.\nאנא נסו שוב.",
        "createacct-another-realname-tip": "השם האמיתי הוא אופציונאלי.\nאם תבחרו לספקו, הוא ישמש לייחוס עבודת המשתמש אליו.",
        "pt-login": "כניסה לחשבון",
        "pt-login-button": "כניסה לחשבון",
+       "pt-login-continue-button": "המשך כניסה לחשבון",
        "pt-createaccount": "יצירת חשבון",
        "pt-userlogout": "יציאה מהחשבון",
        "php-mail-error-unknown": "שגיאה לא ידועה בפונקציה mail()‎ של PHP",
        "botpasswords-invalid-name": "שם המשתמש שניתן אינו מכיל את תו הפרדת ססמאות הבוט (\"$1\").",
        "botpasswords-not-exist": "למשתמש \"$1\" אין ססמת בוט בשם \"$2\".",
        "resetpass_forbidden": "לא ניתן לשנות סיסמאות.",
+       "resetpass_forbidden-reason": "לא ניתן לשנות את הסיסמאות: $1",
        "resetpass-no-info": "נדרשת כניסה לחשבון כדי לגשת לדף זה באופן ישיר.",
        "resetpass-submit-loggedin": "שינוי סיסמה",
        "resetpass-submit-cancel": "ביטול",
        "passwordreset-emailsentusername": "אם יש כתובת דואר אלקטרוני שמשויכת לשם המשתמש הזה, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
        "passwordreset-emailsent-capture": "נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.",
        "passwordreset-emailerror-capture": "נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|דוא\"ל איפוס הסיסמה נשלח|הודעות דוא\"ל של איפוס הסיסמה נשלחו}}. {{PLURAL:$1|שם המשתמשים והסיסמה מוצגים|רשימה של שמות המשתמשים והסיסמאות מוצגת}} להלן.",
+       "passwordreset-emailerror-capture2": "לא ניתן היה לשלוח דוא\"ל ל{{GENDER:$2|משתמש|משתמשת}}: $1 {{PLURAL:$3|שם המשתמש והסיסמה מוצגים|רשימה של שמות המשתמשים והסיסמאות מוצגת}} להלן.",
+       "passwordreset-nocaller": "לא סופק הקורא הנדרש",
+       "passwordreset-nosuchcaller": "הקורא אינו קיים: $1",
+       "passwordreset-ignored": "איפוס הסיסמה לא בוצע. ייתכן שלא הוגדר ספק.",
+       "passwordreset-invalideamil": "כתובת דוא\"ל לא תקינה",
+       "passwordreset-nodata": "לא סופק שם משתמש או כתובת דוא\"ל",
        "changeemail": "שינוי או הסרת כתובת דוא\"ל",
        "changeemail-header": "יש למלא את הטופס הזה כדי לשנות את כתובת הדוא\"ל שלך. אם ברצונך להימנע משיוך כתובת דוא\"ל כלשהי לחשבון שלך, יש להשאיר את שדה כתובת הדוא\"ל החדשה ריק בעת שליחת הטופס.",
        "changeemail-passwordrequired": "יש להקליד את הסיסמה שלך כדי לאשר את השינוי.",
        "accmailtext": "סיסמה אקראית עבור [[User talk:$1|$1]] נשלחה אל $2. ניתן לשנותה בדף '''[[Special:ChangePassword|שינוי הסיסמה]]''' לאחר הכניסה.",
        "newarticle": "(חדש)",
        "newarticletext": "הגעתם לדף שעדיין אינו קיים.\nכדי ליצור את הדף הזה, התחילו להקליד בתיבת הטקסט שלמטה (ראו את [$1 דף העזרה] למידע נוסף).\nאם הגעתם לכאן בטעות, לחצו על כפתור ה<strong>חזרה</strong> (Back) בדפדפן שלכם.",
-       "anontalkpagetext": "----\n<em>זהו דף שיחה של משתמש אנונימי שעדיין לא יצר חשבון במערכת, או שהוא לא משתמש בו.</em>\nלכן עלינו להשתמש בכתובת ה־IP המספרית כדי לזהותו.\nייתכן שכתובת IP זו תהיה משותפת למספר משתמשים.\nאם אתם משתמשים אנונימיים ומרגישים שקיבלתם הודעות בלתי רלוונטיות, אנא [[Special:CreateAccount|צרו חשבון]] או [[Special:UserLogin|היכנסו לחשבון]] כדי להימנע מבלבול עתידי עם משתמשים אנונימיים נוספים.",
+       "anontalkpagetext": "----\n<em>זהו דף שיחה של משתמש אנונימי שעדיין לא יצר חשבון במערכת, או שהוא לא משתמש בו.</em>\nלכן עלינו להשתמש בכתובת ה־IP המספרית כדי לזהותו.\nייתכן שכתובת IP זו תהיה משותפת למספר משתמשים.\nאם אתם משתמשים אנונימיים ומרגישים שקיבלתם הודעות בלתי רלוונטיות, אנא [[Special:CreateAccount|צרו חשבון]] או [[Special:UserLogin|היכנסו לחשבון]] כדי להימנע מבלבולים עתידיים עם משתמשים אנונימיים נוספים.",
        "noarticletext": "אין כרגע טקסט בדף הזה.\nבאפשרותך [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים],\nאו [{{fullurl:{{FULLPAGENAME}}|action=edit}} ליצור את הדף]</span>.",
        "noarticletext-nopermission": "אין כרגע טקסט בדף הזה.\nבאפשרותך [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים או <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים]</span>, אך אין לך הרשאה ליצור את הדף.",
        "missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך כלל על־ידי לחיצה על קישור ישן לגרסה קודמת של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "session_fail_preview_html": "מצטערים! לא ניתן לבצע את עריכתם עקב אובדן מידע הכניסה.\n\n<em>כיוון שב{{grammar:תחילית|{{SITENAME}}}} אפשרות השימוש ב־HTML גולמי מופעלת, התצוגה המקדימה מוסתרת כדי למנוע התקפות JavaScript.</em>\n\n<strong>אם זהו ניסיון עריכה לגיטימי, אנא נסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
        "token_suffix_mismatch": "'''עריכתך נדחתה כיוון שהדפדפן שלך מחק את תווי הפיסוק באסימון העריכה.'''\nהעריכה נדחתה כדי למנוע בעיות כאלה בטקסט של הדף.\nלעתים התקלה מתרחשת עקב שימוש בשירות פרוקסי אנונימי פגום.",
        "edit_form_incomplete": "'''כמה חלקים מטופס העריכה לא הגיעו לשרת; בדקו היטב שעריכותיכם לא נפגעו ונסו שוב.'''",
-       "editing": "עריכת הדף $1",
-       "creating": "יצירת הדף $1",
-       "editingsection": "עריכת הדף $1 (פסקה)",
-       "editingcomment": "עריכת הדף $1 (פסקה חדשה)",
+       "editing": "עריכת הדף \"$1\"",
+       "creating": "יצירת הדף \"$1\"",
+       "editingsection": "עריכת הדף \"$1\" (פסקה)",
+       "editingcomment": "עריכת הדף \"$1\" (פסקה חדשה)",
        "editconflict": "התנגשות עריכה: $1",
        "explainconflict": "משתמש אחר שינה את הדף מאז שהתחלתם לערוך אותו.\nחלון העריכה העליון מציג את הטקסט בדף כפי שהוא כרגע.\nהשינויים שלכם מוצגים בחלון העריכה התחתון.\nעליכם למזג את השינויים שלכם לתוך הטקסט הקיים.\n<strong>רק</strong> הטקסט בחלון העריכה העליון יישמר כשתלחצו על \"{{int:savearticle}}\".",
        "yourtext": "הטקסט שלך",
        "search-error": "אירעה שגיאה במהלך החיפוש: $1",
        "preferences": "העדפות",
        "mypreferences": "העדפות",
-       "prefs-edits": "מספר עריכות:",
+       "prefs-edits": "×\9eספר ×\94ער×\99×\9b×\95ת:",
        "prefsnologintext2": "נדרשת כניסה לחשבון כדי לשנות העדפות משתמש.",
        "prefs-skin": "עיצוב",
        "skin-preview": "תצוגה מקדימה",
        "prefs-rc": "שינויים אחרונים",
        "prefs-watchlist": "רשימת המעקב",
        "prefs-editwatchlist": "עריכת רשימת המעקב",
-       "prefs-editwatchlist-label": "עריכת דפים ברשימת המעקב:",
+       "prefs-editwatchlist-label": "עריכת דפים ברשימת המעקב שלך:",
        "prefs-editwatchlist-edit": "הצגה או הסרה של דפים מרשימת המעקב",
        "prefs-editwatchlist-raw": "עריכת רשימת המעקב הגולמית",
        "prefs-editwatchlist-clear": "ניקוי רשימת המעקב",
        "prefs-help-recentchangescount": "ההעדפה הזאת כוללת את דף השינויים האחרונים, דפי היסטוריית גרסאות ויומנים.",
        "prefs-help-watchlist-token2": "זהו המפתח הסודי להזנה של רשימת המעקב שלך.\nכל מי שיודע אותו יוכל לקרוא את רשימת המעקב שלך, לכן אין לשתף אותו.\n[[Special:ResetTokens|אם יש בכך צורך, אפשר לאפס אותו כאן]].",
        "savedprefs": "ההעדפות שלך נשמרו.",
-       "savedrights": "×\94רש×\90×\95ת {{GENDER:$1|×\94×\9eשת×\9eש|×\94×\9eשת×\9eשת}} ×©×\9c $1 נשמרו.",
+       "savedrights": "×\94×\94רש×\90×\95ת ×©×\9c {{GENDER:$1|×\94×\9eשת×\9eש|×\94×\9eשת×\9eשת}} \"$1\" נשמרו.",
        "timezonelegend": "אזור זמן:",
        "localtime": "זמן מקומי:",
        "timezoneuseserverdefault": "ברירת המחדל של האתר ($1)",
        "timezoneregion-europe": "אירופה",
        "timezoneregion-indian": "האוקיינוס ההודי",
        "timezoneregion-pacific": "האוקיינוס השקט",
-       "allowemail": "×\9c×\90פשר ×§×\91×\9cת ×\93×\95×\90\"×\9c ×\9e×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d",
+       "allowemail": "×\9c×\90פשר ×\9c×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d ×\9cש×\9c×\95×\97 ×\9c×\99 ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99",
        "prefs-searchoptions": "חיפוש",
        "prefs-namespaces": "מרחבי שם",
        "default": "ברירת מחדל",
        "gender-unknown": "באזכורים שלך בממשק, המערכת תשתמש במידת האפשר בלשון שאינה תלוית־מגדר",
        "gender-male": "הוא עורך דפים בוויקי",
        "gender-female": "היא עורכת דפים בוויקי",
-       "prefs-help-gender": "אין חובה למלא העדפה זו.\nהמערכת משתמשת במידע זה כדי לפנות אליך/אלייך ולציין את שם המשתמש שלך במין הדקדוקי הנכון.\nהמידע יהיה ציבורי.",
+       "prefs-help-gender": "×\90×\99×\9f ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\94×¢×\93פ×\94 ×\96×\95.\n×\94×\9eער×\9bת ×\9eשת×\9eשת ×\91×\9e×\99×\93×¢ ×\94×\96×\94 ×\9b×\93×\99 ×\9cפנ×\95ת ×\90×\9c×\99×\9a\90×\9c×\99×\99×\9a ×\95×\9cצ×\99×\99×\9f ×\90ת ×©×\9d ×\94×\9eשת×\9eש ×©×\9c×\9a ×\91×\9e×\99×\9f ×\94×\93ק×\93×\95ק×\99 ×\94× ×\9b×\95×\9f.\n×\94×\9e×\99×\93×¢ ×\99×\94×\99×\94 ×¦×\99×\91×\95ר×\99.",
        "email": "דוא\"ל",
        "prefs-help-realname": "אין חובה למלא את השם האמיתי.\nהשם האמיתי עשוי לשמש כדי לייחס לך את עבודתך.",
        "prefs-help-email": "כתובת דואר אלקטרוני היא אופציונלית, אבל היא חיונית לאיפוס הסיסמה במקרה ש{{GENDER:|תשכח|תשכחי}} אותה.",
        "userrights": "ניהול הרשאות משתמש",
        "userrights-lookup-user": "ניהול קבוצות משתמש",
        "userrights-user-editname": "שם משתמש:",
-       "editusergroup": "ער×\99×\9bת ×§×\91×\95צ×\95ת {{GENDER:$1|×\9eשת×\9eש×\99×\9d}}",
+       "editusergroup": "ער×\99×\9bת ×\94ק×\91×\95צ×\95ת ×©×\9c ×\94{{GENDER:$1|×\9eשת×\9eש}}",
        "editinguser": "שינוי ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "עריכת קבוצות משתמש",
-       "saveusergroups": "ש×\9e×\99רת ×§×\91×\95צ×\95ת {{GENDER:$1|×\9eשת×\9eש}}",
+       "saveusergroups": "ש×\9e×\99רת ×\94ק×\91×\95צ×\95ת ×©×\9c ×\94{{GENDER:$1|×\9eשת×\9eש|×\9eשת×\9eשת}}",
        "userrights-groupsmember": "{{GENDER:$2|חבר|חברה}} ב{{PLURAL:$1|קבוצה|קבוצות}}:",
        "userrights-groupsmember-auto": "{{GENDER:$2|חבר|חברה}} אוטומטית ב{{PLURAL:$1|קבוצה|קבוצות}}:",
-       "userrights-groups-help": "×\91×\90פשר×\95ת×\9b×\9d ×\9cשנ×\95ת ×\90ת ×\94ק×\91×\95צ×\95ת ×©×\9eשת×\9eש ×\96×\94 ×\97×\91ר ×\91×\94×\9f:\n* ×ª×\99×\91×\94 ×\9eס×\95×\9eנת ×¤×\99ר×\95ש×\94 ×©×\94×\9eשת×\9eש ×\97×\91ר ×\91ק×\91×\95צ×\94.\n* ×ª×\99×\91×\94 ×\91×\9cת×\99 ×\9eס×\95×\9eנת ×¤×\99ר×\95ש×\94 ×©×\94×\9eשת×\9eש ×\90×\99× ×\95 ×\97×\91ר ×\91ק×\91×\95צ×\94.\n* ×¡×\99×\9e×\95×\9f * ×¤×\99ר×\95ש×\95 ×©×\9c×\90 ×ª×\95×\9b×\9c×\95 ×\9c×\94ס×\99ר ×\9eשת×\9eש ×\9e×\94ק×\91×\95צ×\94 ×\9eר×\92×¢ ×©×\94×\95ספת×\9d ×\90×\95ת×\95 אליה, או להפך.",
+       "userrights-groups-help": "×\91×\90פשר×\95ת×\9a ×\9cשנ×\95ת ×\90ת ×\94ק×\91×\95צ×\95ת ×©{{GENDER:$1|×\9eשת×\9eש ×\96×\94 ×\97×\91ר|×\9eשת×\9eשת ×\96×\95 ×\97×\91ר×\94}} ×\91×\94×\9f:\n* ×ª×\99×\91×\94 ×\9eס×\95×\9eנת ×¤×\99ר×\95ש×\94 ×©×\94{{GENDER:$1|×\9eשת×\9eש ×\9b×\91ר ×\97×\91ר|×\9eשת×\9eשת ×\9b×\91ר ×\97×\91ר×\94}} ×\91ק×\91×\95צ×\94.\n* ×ª×\99×\91×\94 ×\91×\9cת×\99 ×\9eס×\95×\9eנת ×¤×\99ר×\95ש×\94 ×©×\94{{GENDER:$1|×\9eשת×\9eש ×\90×\99× ×\95 ×\97×\91ר|×\9eשת×\9eשת ×\90×\99× ×\94 ×\97×\91ר×\94}} ×\91ק×\91×\95צ×\94.\n* ×¡×\99×\9e×\95×\9f * ×¤×\99ר×\95ש×\95 ×©×\9c×\90 ×\99×\94×\99×\94 ×\91×\90פשר×\95ת×\9a ×\9c×\94ס×\99ר ×\90ת ×\94{{GENDER:$1|×\9eשת×\9eש|×\9eשת×\9eשת}} ×\9e×\94ק×\91×\95צ×\94 ×\9c×\90×\97ר ×©×\94×\95ספת {{GENDER:$1|×\90×\95ת×\95\90×\95ת×\94}} אליה, או להפך.",
        "userrights-reason": "סיבה:",
        "userrights-no-interwiki": "אין לך הרשאה לערוך הרשאות משתמש באתרים אחרים.",
        "userrights-nodatabase": "בסיס הנתונים $1 אינו קיים או אינו מקומי.",
        "userrights-nologin": "עליכם [[Special:UserLogin|להיכנס לחשבון]] עם הרשאות מתאימות כדי לשנות הרשאות של משתמשים.",
        "userrights-notallowed": "אין לך הרשאה להוסיף או להסיר הרשאות של משתמשים.",
-       "userrights-changeable-col": "קבוצות שבאפשרותכם לשנות",
-       "userrights-unchangeable-col": "קבוצות שאין באפשרותכם לשנות",
+       "userrights-changeable-col": "{{PLURAL:$1|קבוצה|קבוצות}} שבאפשרותך לשנות",
+       "userrights-unchangeable-col": "{{PLURAL:$1|קבוצה|קבוצות}} שאין באפשרותך לשנות",
        "userrights-conflict": "התנגשות בין שינויי הרשאות משתמש! אנא בִּדקו את השינויים שלכם ואשרו אותם.",
        "userrights-removed-self": "הסרת את הרשאות המשתמש של עצמך. לכן אין לך כעת אפשרות לגשת לדף זה.",
        "group": "קבוצה:",
        "grant-viewmywatchlist": "צפייה ברשימת המעקב שלך",
        "newuserlogpage": "יומן רישום משתמשים",
        "newuserlogpagetext": "זהו יומן המכיל הרשמות של משתמשים.",
-       "rightslog": "×\99×\95×\9e×\9f ×ª×¤×§×\99×\93×\99×\9d",
-       "rightslogtext": "×\96×\94×\95 ×\99×\95×\9e×\9f ×\94ש×\99× ×\95×\99×\99×\9d ×\91תפק×\99×\93×\99 המשתמשים.",
+       "rightslog": "×\99×\95×\9e×\9f ×\94רש×\90×\95ת",
+       "rightslogtext": "×\99×\95×\9e×\9f ×\96×\94 ×\9eצ×\99×\92 ×\90ת ×\94ש×\99× ×\95×\99×\99×\9d ×\91×\94רש×\90×\95ת ×©×\9c המשתמשים.",
        "action-read": "לקרוא דף זה",
        "action-edit": "לערוך דף זה",
        "action-createpage": "ליצור דפים",
        "protectedpages-performer": "הוגן על־ידי",
        "protectedpages-params": "רמת ההגנה",
        "protectedpages-reason": "סיבה",
-       "protectedpages-submit": "הצגת דפים",
+       "protectedpages-submit": "×\94צ×\92ת ×\94×\93פ×\99×\9d",
        "protectedpages-unknown-timestamp": "לא ידוע",
        "protectedpages-unknown-performer": "משתמש לא ידוע",
        "protectedtitles": "כותרות מוגנות",
        "protectedtitles-summary": "בדף זה רשומות הכותרות שמוגנות כעת מפני יצירה. לרשימת הדפים הקיימים שמוגנים, ראו [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "אין כרגע כותרות מוגנות עם הפרמטרים האלה.",
-       "protectedtitles-submit": "×\94צ×\92ת ×\9b×\95תר×\95ת",
+       "protectedtitles-submit": "×\94צ×\92ת ×\94×\93פ×\99×\9d",
        "listusers": "רשימת משתמשים",
        "listusers-editsonly": "הצגת משתמשים עם עריכות בלבד",
        "listusers-creationsort": "מיון לפי תאריך היצירה",
        "wlheader-showupdated": "דפים שהשתנו מאז ביקורך האחרון בהם מוצגים ב'''הדגשה'''.",
        "wlnote": "להלן {{PLURAL:$1|השינוי האחרון|<strong>$1</strong> השינויים האחרונים}} {{PLURAL:$2|בשעה האחרונה|בשעתיים האחרונות|ב־<strong>$2</strong> השעות האחרונות}}, עד $4, $3.",
        "wlshowlast": "הצגת $1 שעות אחרונות $2 ימים אחרונים",
-       "watchlist-hide": "×\94סתר×\94",
+       "watchlist-hide": "×\94סתרת",
        "watchlist-submit": "הצגה",
        "wlshowtime": "תקופת זמן לצפייה:",
        "wlshowhideminor": "עריכות משניות",
        "restriction-level-all": "כל רמה",
        "undelete": "הצגה של דפים מחוקים",
        "undeletepage": "הצגה ושחזור של דפים מחוקים",
-       "undeletepagetitle": "'''זוהי רשימת הגרסאות המחוקות של [[:$1]]'''.",
+       "undeletepagetitle": "<strong>זוהי רשימת הגרסאות המחוקות של הדף [[:$1|$1]]</strong>.",
        "viewdeletedpage": "הצגה של דפים מחוקים",
        "undeletepagetext": "{{PLURAL:$1|הדף שלהלן נמחק, אך הוא עדיין בארכיון וניתן לשחזר אותו|הדפים שלהלן נמחקו, אך הם עדיין בארכיון וניתן לשחזר אותם}}.\nייתכן שהארכיון ינוקה מעת לעת.",
        "undelete-fieldset-title": "שחזור גרסאות",
-       "undeleteextrahelp": "×\9cש×\97×\96×\95ר ×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\92רס×\90×\95ת ×\94×\9e×\9c×\90×\94 ×©×\9c ×\94×\93×£, ×\90×\9c ×ª×¡×\9e× ×\95 ×©×\95×\9d ×ª×\99×\91ת ×¡×\99×\9e×\95×\9f ×\95×\9c×\97צ×\95 ×¢×\9c '''{{int:undeletebtn}}'''.\n×\9cש×\97×\96×\95ר ×©×\9c ×\92רס×\90×\95ת ×\9eס×\95×\99×\9e×\95ת ×\91×\9c×\91×\93, ×¡×\9e× ×\95 ×\90ת ×ª×\99×\91×\95ת ×\94ס×\99×\9e×\95×\9f ×©×\9c ×\94×\92רס×\90×\95ת ×\94×\9c×\9c×\95, ×\95×\9c×\97צ×\95 ×¢×\9c '''{{int:undeletebtn}}'''.",
+       "undeleteextrahelp": "×\9b×\93×\99 ×\9cש×\97×\96ר ×\90ת ×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\92רס×\90×\95ת ×\94×\9e×\9c×\90×\94 ×©×\9c ×\94×\93×£, ×\90×\9c {{GENDER:|תס×\9e×\9f|תס×\9e× ×\99|תס×\9e× ×\95}} ×©×\95×\9d ×ª×\99×\91ת ×¡×\99×\9e×\95×\9f; ×¤×©×\95×\98 {{GENDER:|×\9c×\97×¥|×\9c×\97צ×\99\9c×\97צ×\95}} ×¢×\9c <strong><em>{{int:undeletebtn}}</em></strong>.\n×\9b×\93×\99 ×\9cש×\97×\96ר ×\92רס×\90×\95ת ×\9eס×\95×\99×\9e×\95ת ×\91×\9c×\91×\93, {{GENDER:|ס×\9e×\9f|ס×\9e× ×\99|ס×\9e× ×\95}} ×\90ת ×\94×\92רס×\90×\95ת ×©{{GENDER:|×\91רצ×\95× ×\9a\91רצ×\95× ×\9a\91רצ×\95× ×\9b×\9d}} ×\9cש×\97×\96ר ×\95×\9c×\90×\97ר ×\9e×\9b×\9f {{GENDER:|×\9c×\97×¥|×\9c×\97צ×\99\9c×\97צ×\95}} ×¢×\9c <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "{{PLURAL:$1|גרסה אחת נמחקה|$1 גרסאות נמחקו}}",
-       "undeletehistory": "אם תשחזרו את הדף, כל הגרסאות תשוחזרנה להיסטוריית השינויים שלו.\nאם יש כבר דף חדש באותו השם, הגרסאות והשינויים יופיעו רק בדף ההיסטוריה שלו.",
-       "undeleterevdel": "×\94ש×\97×\96×\95ר ×\9c×\90 ×\99×\91×\95צע ×\90×\9d ×\94×\92רס×\94 ×\94× ×\95×\9b×\97×\99ת ×©×\9c ×\94×\93×£ ×\9e×\97×\95ק×\94 ×\91×\97×\9cק×\94. ×\91×\9eקר×\94 ×\9b×\96×\94, ×¢×\9c×\99×\9b×\9d ×\9c×\91×\98×\9c ×\90ת ×\94×\94סתר×\94 ×©×\9c ×\94×\92רס×\90×\95ת ×\94×\9e×\97×\95ק×\95ת ×\94×\97×\93ש×\95ת ×\91×\99×\95תר.",
-       "undeletehistorynoadmin": "דף זה נמחק. הסיבה למחיקה מוצגת בתקציר מטה, ביחד עם פרטים על המשתמשים שערכו את הדף לפני מחיקתו. הטקסט של גרסאות אלו זמין למפעילי מערכת בלבד.",
+       "undeletehistory": "אם {{GENDER:|תשחזר|תשחזרי|תשחזרו}} את הדף, כל הגרסאות ישוחזרו להיסטוריית השינויים שלו.\nאם הדף הזה נמחק בעבר ולאחר מכן נוצר שוב, הגרסאות ש{{GENDER:|תשחזר|תשחזרי|תשחזרו}} יופיעו בהיסטוריית השינויים בתור הגרסאות הישנות ביותר של הדף.",
+       "undeleterevdel": "×\94ש×\97×\96×\95ר ×\9c×\90 ×\99×\9b×\95×\9c ×\9c×\94ת×\91צע ×\90×\9d ×\94×\92רס×\94 ×\94×\90×\97ר×\95× ×\94 ×©×\9c ×\94×\93×£ ×\9e×\97×\95ק×\94 ×\90×\95 ×\9e×\95סתרת.\n×\91×\9eקר×\94 ×\9b×\96×\94, ×\99ש ×\9c×\91×\98×\9c ×§×\95×\93×\9d ×\90ת ×\94×\94סתר×\94 ×©×\9c ×\94×\92רס×\94 ×\94×\90×\97ר×\95× ×\94.",
+       "undeletehistorynoadmin": "דף זה נמחק.\nהסיבה למחיקה מוצגת בתקציר שלמטה, וגם פרטים על המשתמשים שערכו את הדף לפני שהוא נמחק.\nהטקסט של הגרסאות הללו זמין למפעילי מערכת בלבד.",
        "undelete-revision": "גרסה שנמחקה מהדף $1 (מ־$5, $4) מאת $3:",
        "undeleterevision-missing": "הגרסה שגויה או חסרה. ייתכן שמדובר בקישור שבור, או שהגרסה שוחזרה או הוסרה מהארכיון.",
        "undelete-nodiff": "לא נמצאה גרסה קודמת.",
        "undeletedfiles": "{{PLURAL:$1|שוחזר קובץ אחד|שוחזרו $1 קבצים}}",
        "cannotundelete": "השחזור נכשל:\n$1",
        "undeletedpage": "<strong>הדף $1 שוחזר</strong>\n\nראו את [[Special:Log/delete|יומן המחיקות]] לרשימה של המחיקות והשחזורים שבוצעו לאחרונה.",
-       "undelete-header": "ראו את [[Special:Log/delete|יומן המחיקות]] לדפים שנמחקו לאחרונה.",
+       "undelete-header": "{{GENDER:|ראה|ראי|ראו}} את [[Special:Log/delete|יומן המחיקות]] לרשימה של דפים שנמחקו לאחרונה.",
        "undelete-search-title": "חיפוש דפים שנמחקו",
        "undelete-search-box": "חיפוש דפים שנמחקו",
        "undelete-search-prefix": "הצגת דפים החל מ:",
        "mycontris": "תרומות",
        "anoncontribs": "תרומות",
        "contribsub2": "עבור {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "×\94×\97ש×\91×\95×\9f \"$1\" אינו רשום.",
+       "contributions-userdoesnotexist": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש \"$1\" אינו רשום.",
        "nocontribs": "לא נמצאו שינויים המתאימים לקריטריונים אלו.",
        "uctop": "(נוכחי)",
        "month": "עד החודש:",
        "whatlinkshere-prev": "{{PLURAL:$1|הקודם|$1 הקודמים}}",
        "whatlinkshere-next": "{{PLURAL:$1|הבא|$1 הבאים}}",
        "whatlinkshere-links": "→ קישורים",
-       "whatlinkshere-hideredirs": "הסתרת הפניות",
-       "whatlinkshere-hidetrans": "הסתרת הכללות",
-       "whatlinkshere-hidelinks": "הסתרת קישורים",
-       "whatlinkshere-hideimages": "הסתרת קישורי קבצים",
+       "whatlinkshere-hideredirs": "$1 הפניות",
+       "whatlinkshere-hidetrans": "$1 הכללות",
+       "whatlinkshere-hidelinks": "$1 קישורים",
+       "whatlinkshere-hideimages": "$1 קישורים לקובץ",
        "whatlinkshere-filters": "מסננים",
        "whatlinkshere-submit": "הצגה",
        "autoblockid": "חסימה אוטומטית #$1",
        "ipb-hardblock": "ביטול האפשרות של משתמשים רשומים לערוך מכתובת IP זו",
        "ipbcreateaccount": "חסימה של יצירת חשבונות",
        "ipbemailban": "חסימה של שליחת דואר אלקטרוני",
-       "ipbenableautoblock": "חסימה אוטומטית של כתובת ה־IP האחרונה שהמשתמש עשה בה שימוש וגם של כל כתובת IP שינסה להשתמש בה בעתיד",
+       "ipbenableautoblock": "חסימה אוטומטית של כתובת ה־IP האחרונה שהמשתמש עשה בה שימוש, וגם של כל כתובת IP שינסה להשתמש בה בעתיד",
        "ipbsubmit": "חסימת המשתמש",
        "ipbother": "זמן אחר:",
        "ipboptions": "שעתיים:2 hours,יום:1 day,שלושה ימים:3 days,שבוע:1 week,שבועיים:2 weeks,חודש:1 month,שלושה חודשים:3 months,שישה חודשים:6 months,שנה:1 year,זמן בלתי מוגבל:infinite",
        "ipb-confirmhideuser": "אתם עומדים לחסום משתמש עם האפשרות \"הסתרת משתמש\". זה יעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם אתם בטוחים שברצונכם לעשות זאת?",
        "ipb-confirmaction": "אם אתם באמת בטוחים שברצונכם לעשות זאת, אנא סמנו את השדה \"{{int:ipb-confirm}}\" שבתחתית.",
        "ipb-edit-dropdown": "עריכת סיבות החסימה",
-       "ipb-unblock-addr": "×\91×\99×\98×\95×\9c חסימה של $1",
-       "ipb-unblock": "×\94סרת ×\97ס×\99×\9e×\94 ×©×\9c ×©×\9d משתמש או כתובת IP",
+       "ipb-unblock-addr": "ש×\97ר×\95ר חסימה של $1",
+       "ipb-unblock": "ש×\97ר×\95ר ×\97ס×\99×\9e×\94 ×©×\9c משתמש או כתובת IP",
        "ipb-blocklist": "הצגת החסימות הנוכחיות",
        "ipb-blocklist-contribs": "תרומות של {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "נותרו $1",
-       "unblockip": "שחרור חסימה",
+       "unblockip": "שחרור חסימה של משתמש",
        "unblockiptext": "השתמשו בטופס שלהלן כדי להחזיר את הרשאות הכתיבה למשתמש או כתובת IP חסומים.",
-       "ipusubmit": "ש×\97ר×\95ר ×\97ס×\99×\9e×\94",
+       "ipusubmit": "×\94סרת ×\97ס×\99×\9e×\94 ×\96×\95",
        "unblocked": "[[User:$1|$1]] {{GENDER:$1|שוחרר מחסימתו|שוחררה מחסימתה}}.",
        "unblocked-range": "$1 שוחרר מחסימתו.",
        "unblocked-id": "חסימה מספר $1 שוחררה.",
        "blocklist": "משתמשים חסומים",
        "ipblocklist": "משתמשים חסומים",
        "ipblocklist-legend": "מציאת משתמש חסום",
-       "blocklist-userblocks": "×\94סתרת ×\97ס×\99×\9eת ×\97ש×\91×\95× ×\95ת",
+       "blocklist-userblocks": "×\94סתרת ×\97ס×\99×\9e×\95ת ×©×\9c ×\9eשת×\9eש×\99×\9d ×¨×©×\95×\9e×\99×\9d",
        "blocklist-tempblocks": "הסתרת חסימות זמניות",
-       "blocklist-addressblocks": "הסתרת חסימות IP בודד",
+       "blocklist-addressblocks": "הסתרת חסימות של כתובות IP בודדות",
        "blocklist-rangeblocks": "הסתרת חסימות טווחים",
        "blocklist-timestamp": "תאריך ושעה",
-       "blocklist-target": "×\99×¢×\93",
+       "blocklist-target": "×\94×\9eשת×\9eש ×©× ×\97ס×\9d",
        "blocklist-expiry": "זמן פקיעה",
        "blocklist-by": "נחסם על־ידי",
        "blocklist-params": "הגדרות החסימה",
        "ipblocklist-empty": "רשימת המשתמשים החסומים ריקה.",
        "ipblocklist-no-results": "שם המשתמש או כתובת ה־IP המבוקשים אינם חסומים.",
        "blocklink": "חסימה",
-       "unblocklink": "שחרור חסימה",
-       "change-blocklink": "שינוי חסימה",
+       "unblocklink": "ש×\97ר×\95ר ×\94×\97ס×\99×\9e×\94",
+       "change-blocklink": "ש×\99× ×\95×\99 ×\94×\97ס×\99×\9e×\94",
        "contribslink": "תרומות",
        "emaillink": "שליחת דוא\"ל",
        "autoblocker": "נחסמתם באופן אוטומטי משום שאתם חולקים את כתובת ה־IP שלכם עם [[User:$1|$1]].\nהסיבה שניתנה לחסימת $1 היא \"$2\"",
        "ipb_expiry_temp": "חסימות הכוללות הסתרת שם משתמש חייבות להיות לזמן בלתי מוגבל.",
        "ipb_hide_invalid": "לא ניתן להעלים את החשבון הזה; {{PLURAL:$1|בוצעה ממנו יותר מעריכה אחת|בוצעו ממנו יותר מ‏‏֫־$1 עריכות}}.",
        "ipb_already_blocked": "המשתמש \"$1\" כבר נחסם.",
-       "ipb-needreblock": "$1 כבר נחסם. האם ברצונך לשנות את הגדרות החסימה?",
+       "ipb-needreblock": "ה{{GENDER:$1|משתמש|משתמשת}} \"$1\" כבר {{GENDER:$1|חסום|חסומה}}. האם ברצונך לשנות את הגדרות החסימה?",
        "ipb-otherblocks-header": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
        "unblock-hideuser": "אין באפשרותך לשחרר את החסימה של המשתמש הזה, כיוון ששם המשתמש שלו הוסתר.",
        "ipb_cant_unblock": "שגיאה: חסימה מספר $1 לא נמצאה. ייתכן שהיא כבר שוחררה.",
        "tooltip-pt-logout": "יציאה מהחשבון",
        "tooltip-pt-createaccount": "מומלץ ליצור חשבון ולהיכנס אליו; עם זאת, אין חובה לעשות זאת",
        "tooltip-ca-talk": "שיחה על דף זה",
-       "tooltip-ca-edit": "עריכת דף זה באמצעות קוד ויקי",
+       "tooltip-ca-edit": "עריכת דף זה",
        "tooltip-ca-addsection": "הוספת פסקה חדשה",
-       "tooltip-ca-viewsource": "×\93×£ ×\96×\94 ×\9e×\95×\92×\9f.\n×\91×\90פשר×\95ת×\9a ×\9cצפ×\95ת ×\91×\98קס×\98 המקור שלו",
+       "tooltip-ca-viewsource": "×\93×£ ×\96×\94 ×\9e×\95×\92×\9f.\n×\91×\90פשר×\95ת×\9a ×\9cצפ×\95ת ×\91ק×\95×\93 המקור שלו",
        "tooltip-ca-history": "גרסאות קודמות של דף זה",
-       "tooltip-ca-protect": "הגנה על דף זה",
+       "tooltip-ca-protect": "×\94פע×\9cת ×\94×\92× ×\94 ×¢×\9c ×\93×£ ×\96×\94",
        "tooltip-ca-unprotect": "שינוי ההגנה על דף זה",
        "tooltip-ca-delete": "מחיקת דף זה",
        "tooltip-ca-undelete": "שחזור עריכות שנעשו בדף זה לפני שנמחק",
        "tooltip-ca-move": "העברת דף זה",
-       "tooltip-ca-watch": "הוספת דף זה לרשימת המעקב",
-       "tooltip-ca-unwatch": "הסרת דף זה מרשימת המעקב",
+       "tooltip-ca-watch": "הוספת דף זה לרשימת המעקב שלך",
+       "tooltip-ca-unwatch": "הסרת דף זה מרשימת המעקב שלך",
        "tooltip-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
        "tooltip-search-go": "מעבר לדף בשם הזה בדיוק, אם הוא קיים",
        "tooltip-search-fulltext": "חיפוש טקסט זה בדפים",
        "markedaspatrollederror": "לא ניתן לסמן כבדוק",
        "markedaspatrollederrortext": "יש לציין גרסה שברצונך לסמן כבדוקה.",
        "markedaspatrollederror-noautopatrol": "אינך מורשה לסמן שינויים של עצמך כבדוקים.",
-       "markedaspatrollednotify": "ער×\99×\9b×\94 ×\96×\95 ×\91×\93×£ \"$1\" ×¡×\95×\9e× ×\94 ×\9b×\91×\93×\95ק×\94.",
-       "markedaspatrollederrornotify": "ס×\99×\9e×\95×\9f ×\94ער×\99×\9b×\94 ×\9b×\91×\93×\95ק×\94 נכשל.",
+       "markedaspatrollednotify": "ש×\99× ×\95×\99 ×\96×\94 ×\91×\93×£ \"$1\" ×¡×\95×\9e×\9f ×\9b×\91×\93×\95ק.",
+       "markedaspatrollederrornotify": "ס×\99×\9e×\95×\9f ×\94ש×\99× ×\95×\99 ×\9b×\91×\93×\95ק נכשל.",
        "patrol-log-page": "יומן שינויים בדוקים",
        "patrol-log-header": "יומן זה מציג גרסאות שנבדקו.",
        "log-show-hide-patrol": "$1 יומן שינויים בדוקים",
        "confirm-purge-top": "לנקות את המטמון של דף זה?",
        "confirm-purge-bottom": "ניקוי המטמון של דף גורם לגרסה החדשה ביותר להופיע.",
        "confirm-watch-button": "אישור",
-       "confirm-watch-top": "×\9c×\94×\95ס×\99×£ ×\93×£ זה לרשימת המעקב שלך?",
+       "confirm-watch-top": "×\9c×\94×\95ס×\99×£ ×\90ת ×\94×\93×£ ×\94זה לרשימת המעקב שלך?",
        "confirm-unwatch-button": "אישור",
-       "confirm-unwatch-top": "×\9c×\94ס×\99ר ×\93×£ זה מרשימת המעקב שלך?",
+       "confirm-unwatch-top": "×\9c×\94ס×\99ר ×\90ת ×\94×\93×£ ×\94זה מרשימת המעקב שלך?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "→ לדף הקודם",
        "imgmultipagenext": "לדף הבא ←",
        "watchlisttools-clear": "ניקוי רשימת המעקב",
        "watchlisttools-view": "הצגת השינויים הרלוונטיים",
        "watchlisttools-edit": "הצגה ועריכה של רשימת המעקב",
-       "watchlisttools-raw": "ער×\99×\9bת ×\94רש×\99×\9e×\94 הגולמית",
+       "watchlisttools-raw": "ער×\99×\9bת ×¨×©×\99×\9eת ×\94×\9eעק×\91 הגולמית",
        "iranian-calendar-m1": "פרברדין",
        "iranian-calendar-m2": "אורדיבהשט",
        "iranian-calendar-m3": "חורדאד",
        "dberr-usegoogle": "באפשרותך לנסות לחפש באמצעות גוגל בינתיים.",
        "dberr-outofdate": "שימו לב שהתוכן שלנו כפי שנשמר במאגר שם עשוי שלא להיות מעודכן.",
        "dberr-cachederror": "זהו עותק שמור של המידע, והוא עשוי שלא להיות מעודכן.",
-       "htmlform-invalid-input": "×\99ש ×\91×¢×\99×\95ת ×¢×\9d ×\97×\9cק ×\9e×\94ק×\9c×\98 ×©×\94×\9bנסת",
+       "htmlform-invalid-input": "×\99ש ×\91×¢×\99×\95ת ×¢×\9d ×\97×\9cק ×\9e×\94ק×\9c×\98 ×©×\94×\95×\9bנס.",
        "htmlform-select-badoption": "הערך שציינת אינו אפשרות תקינה.",
        "htmlform-int-invalid": "הערך שציינת אינו מספר שלם.",
        "htmlform-float-invalid": "הערך שציינת אינו מספר.",
        "htmlform-int-toolow": "הערך שציינת הוא מתחת למינימום, $1",
        "htmlform-int-toohigh": "הערך שציינת הוא מעל למקסימום, $1",
-       "htmlform-required": "ער×\9a ×\96×\94 ×\93ר×\95ש",
+       "htmlform-required": "ש×\93×\94 ×\96×\94 ×\93ר×\95ש.",
        "htmlform-submit": "שליחה",
        "htmlform-reset": "ביטול השינויים",
        "htmlform-selectorother-other": "אחר",
        "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-block-reblock": "שינויים של חסימות",
+       "log-action-filter-block-unblock": "שחרורים של חסימות",
        "log-action-filter-contentmodel-change": "שינויים במודל תוכן",
        "log-action-filter-contentmodel-new": "יצירות דפים עם מודל תוכן לא־סטנדרטי",
        "log-action-filter-delete-delete": "מחיקת דפים",
        "log-action-filter-suppress-block": "העלמות של משתמשים באמצעות חסימה",
        "log-action-filter-suppress-reblock": "העלמות של משתמשים באמצעות חסימה מחדש",
        "log-action-filter-upload-upload": "העלאות חדשות",
-       "log-action-filter-upload-overwrite": "דריסת קבצים קיימים"
+       "log-action-filter-upload-overwrite": "דריסת קבצים קיימים",
+       "authmanager-authn-not-in-progress": "האימות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
+       "authmanager-authn-no-primary": "לא ניתן היה לאמת את האישורים שסופקו.",
+       "authmanager-authn-no-local-user": "האישורים שסופקו אינם שייכים לשום משתמש באתר זה.",
+       "authmanager-authn-no-local-user-link": "נתוני ההאמנה שניתנו תקינים, אבל אינם משויכים לשום משתמש בוויקי הזה. נא להיכנס לחשבון באופן שונה, או ליצור משתמש חדש ואז תהיה לך אפשרות לקשר את נתוני ההאמנה הקודמים שלך לחשבון ההוא.",
+       "authmanager-authn-autocreate-failed": "יצירה אוטומטית של חשבון מקומי נכשלה: $1",
+       "authmanager-change-not-supported": "לא ניתן לשנות את נתוני ההאמנה שניתנו, כי שום דבר לא ישתמש בהם.",
+       "authmanager-create-disabled": "אפשרות יצירת החשבונות מבוטלת.",
+       "authmanager-create-from-login": "כדי ליצור את החשבון, נא למלא את השדות שלהלן.",
+       "authmanager-create-not-in-progress": "יצירת החשבון נכשלה או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
+       "authmanager-create-no-primary": "האישורים שסופקו לא יכולים להיות בשימוש ביצירת חשבון.",
+       "authmanager-link-no-primary": "האישורים שסופקו לא יכולים להיות בשימוש בקישור חשבונות.",
+       "authmanager-link-not-in-progress": "קישור החשבונות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
+       "authmanager-authplugin-setpass-failed-title": "שינוי הסיסמה נכשל",
+       "authmanager-authplugin-setpass-failed-message": "תוסף האימות דחה את שינוי הסיסמה.",
+       "authmanager-authplugin-create-fail": "תוסף האימות דחה את יצירת החשבון.",
+       "authmanager-authplugin-setpass-denied": "תוסף האימות אינו מאפשר לשנות סיסמאות.",
+       "authmanager-authplugin-setpass-bad-domain": "דומיין לא תקין.",
+       "authmanager-autocreate-noperm": "אין אפשרות ליצור חשבונות באופן אוטומטי.",
+       "authmanager-autocreate-exception": "יצירת חשבונות אוטומטית מבוטלת באופן אוטומטי בשל שגיאות קודמות.",
+       "authmanager-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.",
+       "authmanager-userlogin-remembermypassword-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-temporarypassword": "סיסמה זמנית",
+       "authprovider-confirmlink-message": "בהתבסס על ניסיונות הכניסה האחרונים שלך, ניתן לקשר את החשבונות הבאים לחשבון שלך. לאחר שהחשבונות יקושרו, ניתן יהיה להיכנס לחשבון באמצעותם. נא לבחור את החשבונות שברצונך לקשר.",
+       "authprovider-confirmlink-request-label": "החשבונות שיקושרו",
+       "authprovider-confirmlink-success-line": "$1: הקישור בוצע בהצלחה.",
+       "authprovider-confirmlink-failed": "קישור החשבונות לא הושלם: $1",
+       "authprovider-confirmlink-ok-help": "להמשיך אחרי הודעות שגיאת קישור.",
+       "authprovider-resetpass-skip-label": "דילוג",
+       "authprovider-resetpass-skip-help": "לדלג על איפוס הסיסמה.",
+       "authform-nosession-login": "האימות הושלם בהצלחה, אבל הדפדפן שלך אינו \"זוכר\" את הכניסה שלך לחשבון.\n\n$1",
+       "authform-nosession-signup": "החשבון נוצר, אבל הדפדפן שלך אינו \"זוכר\" את הכניסה שלך לחשבון.\n\n$1",
+       "authform-newtoken": "אסימון חסר. $1",
+       "authform-notoken": "אסימון חסר",
+       "authform-wrongtoken": "אסימון שגוי",
+       "specialpage-securitylevel-not-allowed-title": "הגישה נדחתה",
+       "specialpage-securitylevel-not-allowed": "מצטערים, אין באפשרותך להשתמש בדף זה כי הזהות שלך לא אומתה.",
+       "authpage-cannot-login": "לא ניתן להתחיל את תהליך הכניסה לחשבון.",
+       "authpage-cannot-login-continue": "לא ניתן היה להיכנס לחשבון. כנראה שזמן ההמתנה של הפעולה חלף.",
+       "authpage-cannot-create": "לא ניתן להתחיל את תהליך יצירת החשבון.",
+       "authpage-cannot-create-continue": "לא ניתן להמשיך בתהליך יצירת החשבון. כנראה שזמן ההמתנה של הפעולה חלף.",
+       "authpage-cannot-link": "לא ניתן להתחיל את תהליך קישור החשבונות.",
+       "authpage-cannot-link-continue": "לא ניתן להמשיך בתהליך קישור החשבונות. כנראה שזמן ההמתנה של הפעולה חלף.",
+       "cannotauth-not-allowed-title": "הגישה נדחתה",
+       "cannotauth-not-allowed": "אינך מורשה להשתמש בדף זה",
+       "changecredentials": "שינוי האישורים",
+       "changecredentials-submit": "שינוי",
+       "changecredentials-submit-cancel": "ביטול",
+       "changecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
+       "changecredentials-success": "האישורים שלך שונו.",
+       "removecredentials": "הסרת האישורים",
+       "removecredentials-submit": "הסרה",
+       "removecredentials-submit-cancel": "ביטול",
+       "removecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
+       "removecredentials-success": "האישורים שלך הוסרו.",
+       "credentialsform-provider": "סוג האישורים:",
+       "credentialsform-account": "שם החשבון:",
+       "cannotlink-no-provider-title": "אין חשבונות שניתן לקשר",
+       "cannotlink-no-provider": "אין חשבונות שניתן לקשר.",
+       "linkaccounts": "קישור חשבונות",
+       "linkaccounts-success-text": "החשבון קושר.",
+       "linkaccounts-submit": "קישור החשבונות",
+       "unlinkaccounts": "ביטול הקישור של החשבונות",
+       "unlinkaccounts-success": "קישור החשבון בוטל."
 }
index 8d8024f..2becd67 100644 (file)
@@ -91,6 +91,7 @@
        "tog-watchdefault": "मेरे द्वारा सम्पादित पृष्ठों और फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchmoves": "मेरे द्वारा स्थानांतरित पृष्ठों एवं फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchdeletion": "मेरे द्वारा हटाए गए पृष्ठों एवं फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
+       "tog-watchuploads": "मेरे नए फ़ाइलों को मेरे ध्यानसूची में डालें।",
        "tog-watchrollback": "मेरे द्वारा प्रत्यापन्न (रोलबैक) किये हुये पृष्ठों को मेरी ध्यानसूची में जोड़ें।",
        "tog-minordefault": "मेरे सभी सम्पादनों को छोटे बदलाव के रूप में चिह्नित करें",
        "tog-previewontop": "सम्पादन सन्दूक से पहले झलक दिखायें",
        "passwordreset-emailsentusername": "यदि कोई ईमेल इस खाते से जुड़ी है तो पासवर्ड आपके ईमेल में भेज दिया जाएगा।",
        "passwordreset-emailsent-capture": "नीचे दिखाया गया कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
        "passwordreset-emailerror-capture": "नीचे दृष्टित कूटशब्द रीसेट ई-मेल उत्पन्न किया गया था, परंतु उसे {{GENDER:$2|सदस्य}} को भेजना असफल रहा।\nत्रुटि: $1",
+       "passwordreset-invalideamil": "अवैध ईमेल पता",
        "changeemail": "ई-मेल पता परिवर्तित करें",
        "changeemail-header": "अपना ईमेल पता परिवर्तन हेतु इसे पूरा करें। यदि आप अपना वर्तमान ईमेल पता हटाना चाहते हैं, तो इसे खाली छोड़ दें और इसे भेजें।",
        "changeemail-passwordrequired": "आपको इस परिवर्तन हेतु पासवर्ड (कूटशब्द) डालना होगा।",
        "minoredit": "यह एक छोटा बदलाव है",
        "watchthis": "इस पृष्ठ को ध्यानसूची में डालें",
        "savearticle": "पृष्ठ सहेजें",
+       "publishpage": "पृष्ठ प्रकाशित करें",
        "preview": "झलक",
        "showpreview": "झलक दिखाएँ",
        "showdiff": "बदलाव दिखाएँ",
        "whatlinkshere-hideredirs": "$1 पुनर्निर्देश",
        "whatlinkshere-hidetrans": "$1 ट्रान्स्क्ल्युजन्स",
        "whatlinkshere-hidelinks": "$1 कड़ियाँ",
-       "whatlinkshere-hideimages": "$1 à¤«à¤¼à¤¾à¤\87ल à¤²à¤¿à¤\82à¤\95",
+       "whatlinkshere-hideimages": "$1 à¤«à¤¼à¤¾à¤\87ल à¤\95ड़à¥\80",
        "whatlinkshere-filters": "छन्ने",
        "whatlinkshere-submit": "जायें",
        "autoblockid": "स्वतः अवरोध #$1",
        "lockdbsuccesstext": "डाटाबेस को ताला लगाया गया हैं।<br />\nआपके द्वारा मेंटेनन्स पूरा होने के बाद [[Special:UnlockDB|ताला खोलना]] याद रखें।",
        "unlockdbsuccesstext": "डाटाबेसका ताला खोल दिया गया हैं।",
        "lockfilenotwritable": "डाटाबेस के लॉक फ़ाईलमें लिख नहीं पा रहें हैं।\nडाटाबेस का ताला लगाने या खोलनेके लिये, इस फ़ाईलपर लिखा जाना जरूरी हैं।",
+       "databaselocked": "डाटाबेस पहले से बंद है।",
        "databasenotlocked": "डाटाबेस को ताला नहीं लगाया गया हैं।",
        "lockedbyandtime": "(द्वारा {{GENDER:$1|$1}} पर $2 यहां $3)",
        "move-page": "$1 ले जाएं",
        "tooltip-ca-nstab-category": "श्रेणियाँ पृष्ठ देखियें",
        "tooltip-minoredit": "इसे छोटे बदलाव के तौर पर दर्ज करें",
        "tooltip-save": "अपने बदलाव सँजोएँ",
+       "tooltip-publish": "आपके परिवर्तक प्रकाशित करें",
        "tooltip-preview": "अपने बदलावों की झलक देखें, कृपया सँजोने से पहले इसका इस्तेमाल करें!",
        "tooltip-diff": "इस पाठ्यमें आपने किये हुए बदलाव देखें।",
        "tooltip-compareselectedversions": "इस पृष्ठ के चुने हुए अवतरणों में अन्तर देखें।",
        "tags-delete-not-found": "टैग \"$1\" मौजूद नहीं है।",
        "tags-delete-too-many-uses": "टैग \"$1\" का प्रयोग $2 के {{PLURAL:$2|संशोधन|संशोधनों}} से अधिक है, जिसका अर्थ यह है कि उसे हटाया नहीं जा सकता है।",
        "tags-delete-warnings-after-delete": "टैग \"$1\" को सफलतापूर्वक हटाया गया, परन्तु निम्न लिखित {{PLURAL:$2|चेतावनी|चेतावनियाँ}} पाई गई:",
+       "tags-delete-no-permission": "आपको बदलाव टैग हटाने की अनुमति नहीं है।",
        "tags-activate-title": "टैग सक्रिय करें",
        "tags-activate-question": "आप टैग \"$1\" को सक्रिय करने जा रहे हैं।",
        "tags-activate-reason": "कारण:",
        "searchsuggest-containing": "...से युक्त",
        "api-error-badaccess-groups": "आपको इस विकि के लिए फ़ाइलें अपलोड करने की अनुमति नहीं है.",
        "api-error-badtoken": "आंतरिक त्रुटि: बुरी टोकन।",
+       "api-error-blocked": "आपको सम्पादन से अवरोधित किया गया है।",
        "api-error-copyuploaddisabled": "URL द्वारा इस सर्वर पर अपलोड अक्षम है।",
        "api-error-duplicate": "वहाँ {{PLURAL:$1| अन्य फ़ाइल | रहे हैं कुछ अन्य फ़ाइलों}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
        "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था कुछ अन्य फ़ाइल |were कुछ अन्य फ़ाइलें}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
        "randomrootpage": "अविशिष्ट मूल पृष्ठ",
        "log-action-filter-block": "प्रतिबंध के प्रकार:",
        "log-action-filter-delete": "हटाने के प्रकार:",
+       "log-action-filter-import": "आयात के प्रकार:",
+       "log-action-filter-move": "स्थानांतरण के प्रकार:",
+       "log-action-filter-newusers": "खाता निर्माण के प्रकार:",
        "log-action-filter-patrol": "परीक्षण के प्रकार:",
        "log-action-filter-protect": "सुरक्षा के प्रकार:",
+       "log-action-filter-rights": "अधिकार बदलाव के प्रकार",
        "log-action-filter-upload": "अपलोड के प्रकार:",
        "log-action-filter-all": "सभी",
        "log-action-filter-block-block": "अवरोध",
        "log-action-filter-delete-restore": "पृष्ठ न हटाना",
        "log-action-filter-delete-event": "पृष्ठ हटाने का लॉग",
        "log-action-filter-delete-revision": "अवतरण हटाना",
+       "log-action-filter-managetags-create": "टैग निर्मित",
+       "log-action-filter-newusers-autocreate": "स्वतः निर्मित",
        "log-action-filter-patrol-patrol": "अपने से परीक्षण",
        "log-action-filter-patrol-autopatrol": "स्वतः पुनरीक्षण",
        "log-action-filter-protect-protect": "सुरक्षा",
        "log-action-filter-protect-modify": "सुरक्षा परिवर्तन",
        "log-action-filter-protect-unprotect": "असुरक्षा",
+       "log-action-filter-protect-move_prot": "सुरक्षा स्थानांतरण",
+       "log-action-filter-rights-autopromote": "स्वतः परिवर्तन",
        "log-action-filter-upload-upload": "नया अपलोड",
-       "log-action-filter-upload-overwrite": "फिर से अपलोड"
+       "log-action-filter-upload-overwrite": "फिर से अपलोड",
+       "authmanager-create-disabled": "खाता निर्माण निष्क्रिय है।",
+       "authmanager-authplugin-setpass-failed-title": "पासवर्ड बदलाव विफल हुआ।",
+       "authmanager-userdoesnotexist": "सदस्य खाता \"$1\" पंजीकृत नहीं है।",
+       "authmanager-email-label": "ईमेल",
+       "authmanager-email-help": "ईमेल पता",
+       "authmanager-realname-label": "वास्तविक नाम",
+       "authmanager-provider-temporarypassword": "अस्थाई पासवर्ड",
+       "authprovider-confirmlink-success-line": "$1 : सफलतापूर्वक जुड़ा।",
+       "authprovider-resetpass-skip-label": "छोड़ें",
+       "authform-newtoken": "टोकन लापता है $1",
+       "authform-notoken": "टोकन लापता है",
+       "authform-wrongtoken": "गलत टोकन",
+       "cannotauth-not-allowed": "आपको इस पृष्ठ के उपयोग की अनुमति नहीं है।",
+       "changecredentials-submit": "बदलाव",
+       "changecredentials-submit-cancel": "रद्द करें",
+       "removecredentials-submit": "हटायें",
+       "removecredentials-submit-cancel": "रद्द करें",
+       "credentialsform-account": "खाते का नाम:",
+       "cannotlink-no-provider-title": "कोई जुड़ा खाता नहीं है।",
+       "cannotlink-no-provider": "कोई जुड़ा खाता नहीं है।",
+       "linkaccounts": "खाता जोड़ें",
+       "linkaccounts-success-text": "खाता जुड़ गया।",
+       "linkaccounts-submit": "खाता जोड़ें",
+       "unlinkaccounts": "खाता अलग करें",
+       "unlinkaccounts-success": "खाता अलग हो गया।"
 }
index 209dd30..3a25615 100644 (file)
@@ -51,6 +51,7 @@
        "tog-watchdefault": "Dodaj svaku stranicu koju uredim na moj popis praćenja",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj popis praćenja",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na popis praćenja",
+       "tog-watchuploads": "Dodaj datoteke koje postavim na moj popis praćenja",
        "tog-watchrollback": "Dodaj stranice na kojima sam vratio uređivanja na popis praćenja",
        "tog-minordefault": "Normalno označavaj sve moje izmjene kao manje",
        "tog-previewontop": "Prikaži kako će stranica izgledati iznad okvira za uređivanje",
        "title-invalid-talk-namespace": "Traženi naziv stranice odnosi se na stranicu rasprave koja ne može postojati.",
        "title-invalid-characters": "Traženi naziv stranice sadrži nevažeće znakove: \"$1\"",
        "perfcached": "Sljedeći podaci su iz međuspremnika i možda nisu najsvježiji. Međuspremnik sadrži $1 {{PLURAL:$1|rezultat|rezultata}} pretraživanja.",
-       "perfcachedts": "Sljedeći podaci su iz međuspremnika i posljednji puta su ažurirani u $1. Međuspremnik sadrži $4 {{PLURAL:$4|rezultat|rezultata}} pretraživanja.\n\nViše o ovoj [[Wikipedija:Posebne stranice|posebnoj stranici]] na [[Razgovor Wikipedija:Special:{{PAGENAME}}]].",
+       "perfcachedts": "Sljedeći podaci su iz međuspremnika i posljednji puta su ažurirani u $1. Međuspremnik sadrži $4 {{PLURAL:$4|rezultat|rezultata}} pretraživanja.",
        "querypage-no-updates": "Osvježavanje ove stranice je trenutačno onemogućeno. Nove promjene neće biti vidljive.",
        "viewsource": "Vidi izvornik",
        "viewsource-title": "Vidi kôd stranice $1",
        "actionthrottled": "Uređivanje je usporeno",
        "actionthrottledtext": "Kao anti-spam mjeru, ograničeni ste u broju ovih radnji u određenom vremenu, i trenutačno ste dosegli to ograničenje. Pokušajte opet za koju minutu.",
        "protectedpagetext": "Ova stranica je zaključana da bi se onemogućile izmjene.",
-       "viewsourcetext": "Možete pogledati i kopirati izvorni sadržaj ove stranice:",
-       "viewyourtext": "Možete vidjeti i kopirati tekst '''vaših uređivanja''' na ovoj stranici:",
+       "viewsourcetext": "Možete pogledati i kopirati izvorni sadržaj ove stranice.",
+       "viewyourtext": "Možete vidjeti i kopirati tekst <strong>vaših uređivanja</strong> na ovoj stranici.",
        "protectedinterface": "Ova stranica je zaštićena od izmjena jer sadrži tekst MediaWiki softvera.\nAko želite prevesti neprevedenu poruku ili popraviti prijevod neke druge poruke za sve MediaWiki wikije, posjetite [//translatewiki.net/  translatewiki.net], projekt za lokalizaciju MediaWiki softvera.",
        "editinginterface": "<strong>Upozorenje:</strong> Uređujete stranicu koja se rabi za prikaz teksta u sučelju softvera. Promjene učinjene na ovoj stranici odrazit će se na izgled korisničkog sučelja kod drugih suradnika na ovoj wiki.",
        "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
-       "cascadeprotected": "Ova je stranica zaključana za uređivanja jer je uključena u {{PLURAL:$1|slijedeću stranicu|slijedeće stranice}}, koje su zaštićene \"prenosivom zaštitom\":\n$2",
+       "cascadeprotected": "Ova je stranica zaključana za uređivanja jer je uključena u {{PLURAL:$1|sljedeću stranicu|sljedeće stranice}}, koje su zaštićene \"prenosivom zaštitom\":\n$2",
        "namespaceprotected": "Ne možete uređivati stranice u imenskom prostoru '''$1'''.",
        "customcssprotected": "Ne možete uređivati ovu CSS stranicu zato što ona sadrži osobne postavke drugog suradnika.",
        "customjsprotected": "Ne možete uređivati ovu JavaScript stranicu zato što ona sadrži osobne postavke drugog suradnika.",
        "passwordreset-emailtext-ip": "Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za Vaše detalje računa\nza {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru lozinku.",
        "passwordreset-emailtext-user": "Suradnik $1 na {{SITENAME}} zatražio podsjetnik o pojedinostima vašeg računa za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru lozinku.",
        "passwordreset-emailelement": "Suradničko ime: \n$1\n\nPrivremena lozinka: \n$2",
-       "passwordreset-emailsentemail": "E-mail podsjetnik zaporke je poslan.",
+       "passwordreset-emailsentemail": "Ako je ova adresa povezana s Vašim suradničkim računom, na nju će biti poslan podsjetnik na zaporku.",
        "passwordreset-emailsent-capture": "Poslan Vam je podsjetnik kao e-pošta (tekst je prikazan dolje).",
        "passwordreset-emailerror-capture": "Napravljena je e-poruka za ponovno postavljanje zaporke (prikazana ispod), ali njeno slanje suradniku nije uspjelo: $1",
        "changeemail": "Promijeni ili izbriši e-mail adresu",
index 4821bb6..ab79a03 100644 (file)
@@ -4,7 +4,8 @@
                        "Paul Beppler",
                        "Midnight Gambler",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Ghiutun"
                ]
        },
        "tog-underline": "Links (Verbinnunge) unnerstreiche:",
        "spam_reverting": "Letzte Version ohne Links zu $1 wiederheargestellt.",
        "spam_blanking": "Alle Versione mit enem Link zu $1 woorre bereinicht.",
        "spam_deleting": "Alle Versione mit enem Link zu $1 woorre abgewischt.",
-       "simpleantispam-label": "Spamschutzprüfung.\nHier '''NIX''' introohn!",
+       "simpleantispam-label": "Spamschutzprüfung.\nHier <strong>NIX</strong> introohn!",
        "pageinfo-title": "Informatione zu \"$1\"",
        "pageinfo-not-current": "Die Information kann leider net für alte Versione zur Verfüchung gestellt sin.",
        "pageinfo-header-basic": "Basisinformatione",
index f477ccb..ec08c26 100644 (file)
        "timezone-local": "Helyi",
        "duplicate-defaultsort": "Figyelem: a(z) „$2” rendezőkulcs felülírja a korábbit („$1”).",
        "duplicate-displaytitle": "<strong>Figyelmeztetés:</strong> A lapcímváltoztató (<tt>DISPLAYTITLE</tt>) „$2” felülírja a korábbi „$1”-t.",
+       "restricted-displaytitle": "<strong>Figyelmeztetés:</strong> A megjelenítendő cím „$1” figyelmen kívül lett hagyva, mert nem egyezik a lap tényleges címével.",
        "invalid-indicator-name": "<strong>Hiba:</strong> A lapstátuszjelző <code>name</code> attribútuma nem lehet üres.",
        "version": "Névjegy",
        "version-extensions": "Telepített kiterjesztések",
index ca80da8..edbaa7d 100644 (file)
@@ -14,7 +14,8 @@
                        "아라",
                        "Carlosedepaula",
                        "Macofe",
-                       "Karmwiki"
+                       "Karmwiki",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Sublinear ligamines:",
        "password-change-forbidden": "Non es possibile cambiar le contrasigno in iste wiki.",
        "externaldberror": "O il occurreva un error in le base de datos de authentication, o tu non ha le autorisation de actualisar tu conto externe.",
        "login": "Aperir session",
+       "login-security": "Verifica tu identitate",
        "nav-login-createaccount": "Aperir session / crear conto",
        "userlogin": "Aperir session / crear conto",
        "userloginnocreate": "Aperir session",
        "userlogin-resetpassword-link": "Contrasigno oblidate?",
        "userlogin-helplink2": "Adjuta al accesso",
        "userlogin-loggedin": "Tu ha jam aperite session como {{GENDER:$1|$1}}.\nUsa le formulario sequente pro aperir session como altere usator.",
+       "userlogin-reauth": "Tu debe reaperir session pro verificar que tu es {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crear un altere conto",
        "createacct-emailrequired": "Adresse de e-mail",
        "createacct-emailoptional": "Adresse de e-mail (optional)",
        "createacct-email-ph": "Entra tu adresse de e-mail",
        "createacct-another-email-ph": "Entra adresse de e-mail",
        "createaccountmail": "Usar un contrasigno aleatori temporari e inviar lo al adresse de e-mail specificate",
+       "createaccountmail-help": "Pro crear un conto pro un altere persona sin cognoscer le contrasigno.",
        "createacct-realname": "Nomine real (optional)",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Proque crea tu un altere conto?",
+       "createacct-reason-help": "Message pro le registro de creation de contos",
        "createacct-submit": "Crear tu conto",
        "createacct-another-submit": "Crear conto",
+       "createacct-continue-submit": "Continuar creation de conto",
+       "createacct-another-continue-submit": "Continuar creation de conto",
        "createacct-benefit-heading": "{{SITENAME}} es facite per gente como tu.",
        "createacct-benefit-body1": "{{PLURAL:$1|modification|modificationes}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|paginas}}",
        "nocookiesnew": "Le conto de usator ha essite create, sed tu non ha aperite un session.\n{{SITENAME}} usa ''cookies'' pro mantener le sessiones del usatores.\nTu ha disactivate le functionalitate del ''cookies''.\nPer favor activa lo, postea aperi un session con tu nove nomine de usator e contrasigno.",
        "nocookieslogin": "{{SITENAME}} usa ''cookies'' pro mantener le sessiones del usatores.\nTu ha disactivate le functionalitate del ''cookies''.\nPer favor activa lo e reprova.",
        "nocookiesfornew": "Le conto de usator non esseva create, proque nos non poteva confirmar su origine.\nVerifica que tu ha activate le \"cookies\", recarga iste pagina e reproba.",
+       "createacct-loginerror": "Le conto ha essite create, ma le systema non ha potite aperir session automaticamente. Per favor, [[Special:UserLogin|aperi session manualmente]].",
        "noname": "Tu non specificava un nomine de usator valide.",
        "loginsuccesstitle": "Session aperite",
        "loginsuccess": "'''Tu es ora authenticate in {{SITENAME}} como \"$1\".'''",
-       "nosuchuser": "Non existe un usator con le nomine \"$1\".\nIn le nomines de usator se distingue inter majusculas e minusculas.\nVerifica le orthographia, o [[Special:CreateAccount|crea un nove conto]].",
+       "nosuchuser": "Non existe un usator con le nomine \"$1\".\nLe nomines de usator distingue inter majusculas e minusculas.\nVerifica le orthographia, o [[Special:CreateAccount|crea un nove conto]].",
        "nosuchusershort": "Non existe un usator con le nomine \"$1\".\nVerifica le orthographia.",
        "nouserspecified": "Tu debe specificar un nomine de usator.",
        "login-userblocked": "Iste usator es blocate. Apertura de session non permittite.",
        "createacct-another-realname-tip": "Le nomine real es optional.\nSi tu opta pro dar lo, isto essera usate pro dar al usator attribution pro su contributiones.",
        "pt-login": "Aperir session",
        "pt-login-button": "Aperir session",
+       "pt-login-continue-button": "Continuar apertura de session",
        "pt-createaccount": "Crear conto",
        "pt-userlogout": "Clauder session",
        "php-mail-error-unknown": "Error incognite in le function mail() de PHP",
        "botpasswords-invalid-name": "Iste nomine de usator non contine le separator pro contrasigno de robot (\"$1\").",
        "botpasswords-not-exist": "Le usator \"$1\" non ha un contrasigno de robot del nomine \"$2\".",
        "resetpass_forbidden": "Le contrasignos non pote esser cambiate",
+       "resetpass_forbidden-reason": "Le contrasignos non pote esser cambiate: $1",
        "resetpass-no-info": "Tu debe aperir un session pro poter acceder directemente a iste pagina.",
        "resetpass-submit-loggedin": "Cambiar contrasigno",
        "resetpass-submit-cancel": "Cancellar",
        "passwordreset-emailsentusername": "Si il ha un adresse de e-mail associate a iste conto, alora un e-mail pro reinitialisar le contrasigno essera inviate.",
        "passwordreset-emailsent-capture": "Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate; iste message es monstrate hic infra.",
        "passwordreset-emailerror-capture": "Un e-mail pro le reinitialisation del contrasigno ha essite generate; iste message es monstrate hic infra, ma le invio al {{GENDER:$2|usator}} ha fallite: $1",
+       "passwordreset-emailsent-capture2": "Le {{PLURAL:$1|message|messages}} de e-mail pro reinitialisation de contrasigno ha essite inviate. Le {{PLURAL:$1|nomine de usator e contrasigno|lista de nomines de usator e contrasignos}} appare hic infra.",
+       "passwordreset-emailerror-capture2": "Le invio de e-mail al {{GENDER:$2|usator}} ha fallite: $1 Le {{PLURAL:$3|nomine de usator e contrasigno|lista de nomines de usator e contrasignos}} appare hic infra.",
+       "passwordreset-nocaller": "Un appellator debe esser fornite",
+       "passwordreset-nosuchcaller": "Appellator non existe: $1",
+       "passwordreset-ignored": "Le reinitialisation del contrasigno non ha essite realisate. Es possibile que nulle fornitor ha essite configurate?",
+       "passwordreset-invalideamil": "Adresse de e-mail invalide",
+       "passwordreset-nodata": "Ni un nomine de usator ni un adresse de e-mail ha essite fornite",
        "changeemail": "Cambiar o remover adresse de e-mail",
        "changeemail-header": "Completa iste formulario pro cambiar tu adresse de e-mail. Si tu vole remover le association de omne adresse de e-mail ab tu conto, lassa le campo pro le nove adresse de e-mail vacue quando tu submitte le formulario.",
        "changeemail-passwordrequired": "Essera necessari entrar tu contrasigno pro confirmar iste cambiamento.",
        "accmailtext": "Un contrasigno generate aleatorimente pro [[User talk:$1|$1]] ha essite inviate a $2. Illo pote esser cambiate in le pagina ''[[Special:ChangePassword|Cambiar contrasigno]]'' post que tu ha aperite un session.",
        "newarticle": "(Nove)",
        "newarticletext": "Tu ha sequite un ligamine verso un pagina que non existe ancora.\nPro crear iste pagina, comencia a scriber in le quadro infra (consulta le [$1 pagina de adjuta] pro plus informationes).\nSi tu ha arrivate a iste pagina per error, clicca le button '''Retornar''' de tu navigator.",
-       "anontalkpagetext": "---- ''Isto es le pagina de discussion pro un usator anonyme qui non ha ancora create un conto, o qui non lo usa. Consequentemente nos debe usar le adresse IP numeric pro identificar le/la.\nUn tal adresse IP pote esser usate in commun per varie personas.\nSi tu es un usator anonyme e pensa que commentos irrelevante ha essite dirigite a te, per favor [[Special:CreateAccount|crea un conto]] o [[Special:UserLogin|aperi un session]] pro evitar futur confusiones con altere usatores anonyme.''",
+       "anontalkpagetext": "----\n<em>Isto es le pagina de discussion pro un usator anonyme qui non ha ancora create un conto, o qui non lo usa.</em>\nConsequentemente nos debe usar le adresse IP numeric como identification.\nUn tal adresse IP pote esser usate in commun per varie personas.\nSi tu es un usator anonyme e pensa que commentos irrelevante ha essite dirigite a te, per favor [[Special:CreateAccount|crea un conto]] o [[Special:UserLogin|aperi un session]] pro evitar futur confusiones con altere usatores anonyme.",
        "noarticletext": "Al momento il non ha texto in iste pagina.\nTu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear iste pagina]</span>.",
        "noarticletext-nopermission": "In iste momento il non ha texto in iste pagina.\nTu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente], ma tu non ha le permission de crear iste pagina.</span>",
        "missing-revision": "Le version №$1 del pagina nominate \"{{FULLPAGENAME}}\" non existe.\n\nIsto es generalmente causate per sequer un ligamine de historia obsolete a un pagina que ha essite delite.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
        "whatlinkshere-prev": "{{PLURAL:$1|precedente|precedente $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|sequente|sequente $1}}",
        "whatlinkshere-links": "← ligamines",
-       "whatlinkshere-hideredirs": "Celar redirectiones",
-       "whatlinkshere-hidetrans": "Celar transclusiones",
-       "whatlinkshere-hidelinks": "Celar ligamines",
-       "whatlinkshere-hideimages": "Celar le ligamines a files",
+       "whatlinkshere-hideredirs": "$1 redirectiones",
+       "whatlinkshere-hidetrans": "$1 transclusiones",
+       "whatlinkshere-hidelinks": "$1 ligamines",
+       "whatlinkshere-hideimages": "$1 le ligamines a files",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Va",
        "autoblockid": "Auto-blocada №$1",
        "exif-sublocationcreated": "Sublocalitate del citate ubi le photo esseva prendite",
        "exif-worldregiondest": "Region del mundo monstrate",
        "exif-countrydest": "Pais monstrate",
-       "exif-countrycodedest": "Codice pro pais monstrate",
+       "exif-countrycodedest": "Codice del pais monstrate",
        "exif-provinceorstatedest": "Provincia o stato monstrate",
        "exif-citydest": "Citate monstrate",
        "exif-sublocationdest": "Sublocalitate del citate monstrate",
        "log-action-filter-suppress-block": "Suppression de usator per blocada",
        "log-action-filter-suppress-reblock": "Suppression de usator per re-blocada",
        "log-action-filter-upload-upload": "Nove file incargate",
-       "log-action-filter-upload-overwrite": "File re-incargate"
+       "log-action-filter-upload-overwrite": "File re-incargate",
+       "authmanager-authn-not-in-progress": "Le authentication non es in curso o le datos del session ha essite perdite. Per favor, recomencia ab initio.",
+       "authmanager-authn-no-primary": "Le credentiales fornite non poteva esse authenticate.",
+       "authmanager-authn-no-local-user": "Le credentiales fornite non es associate a alcun usator in iste wiki.",
+       "authmanager-authn-no-local-user-link": "Le credentiales fornite es in ordine, ma non es associate a alcun usator in iste wiki. Aperi session de altere maniera, o crea un nove conto, e tu haberea le possibilitate de ligar tu credentiales anterior a ille conto.",
+       "authmanager-authn-autocreate-failed": "Le creation automatic de un conto local ha fallite: $1",
+       "authmanager-change-not-supported": "Le credentiales fornite non pote esser cambiate perque nihil los usarea.",
+       "authmanager-create-disabled": "Le creation de contos es disactivate.",
+       "authmanager-create-from-login": "Pro crear tu conto, completa le campos hic infra.",
+       "authmanager-create-not-in-progress": "Nulle creation de conto es in curso, o le datos del session ha essite perdite. Per favor, recomencia ab initio.",
+       "authmanager-create-no-primary": "Le credentiales fornite non pote esser usate pro crear un conto.",
+       "authmanager-link-no-primary": "Le credentiales fornite non pote esser usate pro ligar un conto.",
+       "authmanager-link-not-in-progress": "Nulle ligation de conto es in curso, o le datos del session ha essite perdite. Per favor, recomencia ab initio.",
+       "authmanager-authplugin-setpass-failed-title": "Cambio de contrasigno fallite",
+       "authmanager-authplugin-setpass-failed-message": "Le modulo de authentication ha refusate le cambio de contrasigno.",
+       "authmanager-authplugin-create-fail": "Le modulo de authentication ha refusate le creation de conto.",
+       "authmanager-authplugin-setpass-denied": "Le modulo de authentication non permitte cambiar contrasignos.",
+       "authmanager-authplugin-setpass-bad-domain": "Dominio non valide.",
+       "authmanager-autocreate-noperm": "Le creation automatic de contos non es permittite.",
+       "authmanager-autocreate-exception": "Le creation automatic de contos ha essite temporarimente disactivate a causa de errores previe.",
+       "authmanager-userdoesnotexist": "Le conto de usator \"$1\" non es registrate.",
+       "authmanager-userlogin-remembermypassword-help": "Indica si le contrasigno debe esser memorisate ultra le durata del session.",
+       "authmanager-username-help": "Nomine de usator pro authentication.",
+       "authmanager-password-help": "Contrasigno pro authentication.",
+       "authmanager-domain-help": "Dominio pro authentication externe.",
+       "authmanager-retype-help": "Repetition del contrasigno pro confirmar.",
+       "authmanager-email-label": "E-mail",
+       "authmanager-email-help": "Adresse de e-mail",
+       "authmanager-realname-label": "Nomine real",
+       "authmanager-realname-help": "Le nomine real del usator",
+       "authmanager-provider-password": "Authentication per contrasigno",
+       "authmanager-provider-password-domain": "Authentication per contrasigno e dominio",
+       "authmanager-provider-temporarypassword": "Contrasigno temporari",
+       "authprovider-confirmlink-message": "Secundo tu recente aperturas de session, le sequente contos pote esser ligate a tu conto wiki. Ligar les te permittera aperir session per medio de ille contos. Per favor selige le contos que debe esser ligate.",
+       "authprovider-confirmlink-request-label": "Contos que debe esser ligate",
+       "authprovider-confirmlink-success-line": "$1: Ligation succedite.",
+       "authprovider-confirmlink-failed": "Le ligation del conto non ha ben succedite: $1",
+       "authprovider-confirmlink-ok-help": "Continuar post monstrar le messages de fallimento de ligation.",
+       "authprovider-resetpass-skip-label": "Saltar",
+       "authprovider-resetpass-skip-help": "Saltar le reinitialisation del contrasigno.",
+       "authform-nosession-login": "Le authentication ha succedite, ma tu navigator non pote \"memorisar\" que tu ha aperite session.\n\n$1",
+       "authform-nosession-signup": "Le conto ha essite create, ma tu navigator non pote \"memorisar\" que tu ha aperite session.\n\n$1",
+       "authform-newtoken": "Indicio mancante. $1",
+       "authform-notoken": "Indicio mancante",
+       "authform-wrongtoken": "Indicio incorrecte",
+       "specialpage-securitylevel-not-allowed-title": "Non permittite",
+       "specialpage-securitylevel-not-allowed": "Regrettabilemente, tu non pote usar iste pagina perque tu identitate non poteva esser verificate.",
+       "authpage-cannot-login": "Impossibile comenciar a aperir session.",
+       "authpage-cannot-login-continue": "Impossibile continuar a aperir session. Le session ha probabilemente expirate.",
+       "authpage-cannot-create": "Impossibile comenciar le creation de conto.",
+       "authpage-cannot-create-continue": "Impossibile continuar le creation de conto. Le session ha probabilemente expirate.",
+       "authpage-cannot-link": "Impossibile comenciar le ligation de conto.",
+       "authpage-cannot-link-continue": "Impossibile continuar le ligation de conto. Le session ha probabilemente expirate.",
+       "cannotauth-not-allowed-title": "Permission refusate",
+       "cannotauth-not-allowed": "Tu non es autorisate a usar iste pagina",
+       "changecredentials": "Cambiar credentiales",
+       "changecredentials-submit": "Cambiar",
+       "changecredentials-submit-cancel": "Cancellar",
+       "changecredentials-invalidsubpage": "$1 non es un typo de credential valide.",
+       "changecredentials-success": "Tu credentiales ha essite cambiate.",
+       "removecredentials": "Remover credentiales",
+       "removecredentials-submit": "Remover",
+       "removecredentials-submit-cancel": "Cancellar",
+       "removecredentials-invalidsubpage": "$1 non es un typo de credential valide.",
+       "removecredentials-success": "Tu credentiales ha essite removite.",
+       "credentialsform-provider": "Typo de credentiales:",
+       "credentialsform-account": "Nomine de conto:",
+       "cannotlink-no-provider-title": "Il non ha contos ligabile",
+       "cannotlink-no-provider": "Il non ha contos que pote esser ligate.",
+       "linkaccounts": "Ligar contos",
+       "linkaccounts-success-text": "Le conto ha essite ligate.",
+       "linkaccounts-submit": "Ligar contos",
+       "unlinkaccounts": "Disligar contos",
+       "unlinkaccounts-success": "Le conto ha essite disligate."
 }
index 20abcbd..ef604e0 100644 (file)
@@ -81,7 +81,7 @@
        "tog-watchlisthidebots": "Sembunyikan suntingan bot di daftar pantauan",
        "tog-watchlisthideminor": "Sembunyikan suntingan kecil di daftar pantauan",
        "tog-watchlisthideliu": "Sembunyikan suntingan pengguna masuk log di daftar pantauan",
-       "tog-watchlistreloadautomatically": "Muat ulang daftar pantauan secara otomatis ketika sebuah penyaring berubah (JavaScript diperlukan)",
+       "tog-watchlistreloadautomatically": "Muat ulang daftar pantauan secara otomatis ketika sebuah tapis berubah (JavaScript diperlukan)",
        "tog-watchlisthideanons": "Sembunyikan suntingan pengguna anonim di daftar pantauan",
        "tog-watchlisthidepatrolled": "Sembunyikan suntingan terpatroli di daftar pantauan",
        "tog-watchlisthidecategorization": "Sembunyikan pengategorian halaman",
        "password-change-forbidden": "Anda tidak dapat mengubah kata sandi pada wiki ini.",
        "externaldberror": "Telah terjadi kesalahan otentikasi basis data eksternal atau Anda tidak diizinkan melakukan kemaskini terhadap akun eksternal Anda.",
        "login": "Masuk log",
+       "login-security": "Buktikan identitas Anda",
        "nav-login-createaccount": "Masuk log / buat akun",
        "userlogin": "Masuk log / buat akun",
        "userloginnocreate": "Masuk log",
        "userlogin-resetpassword-link": "Lupa kata sandi?",
        "userlogin-helplink2": "Bantuan masuk log",
        "userlogin-loggedin": "Andan telah masuk log sebagai $1.\nGunakan formulir di bawah untuk masuk log sebagai pengguna lain.",
+       "userlogin-reauth": "Anda harus masuk log lagi untuk memeriksa bahwa Anda adalah {{GENDER:$1|$1}}",
        "userlogin-createanother": "Buat akun lain",
        "createacct-emailrequired": "Alamat surel",
        "createacct-emailoptional": "Alamat surel/email (sebaiknya diisi)",
        "createacct-email-ph": "Masukkan alamat surel Anda",
        "createacct-another-email-ph": "Masukkan alamat surel",
        "createaccountmail": "Gunakan kata sandi acak sementara dan kirimkan ke surel yang diinginkan",
+       "createaccountmail-help": "Dapat digunakan untuk membuat akun untuk orang lain tanpa mengetahui kata sandinya.",
        "createacct-realname": "Nama asli (opsional)",
        "createaccountreason": "Alasan:",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Mengapa Anda membuat akun lain",
+       "createacct-reason-help": "Pesan yang ditunjukkan dalam log pembuatan akun",
        "createacct-submit": "Buat akun Anda",
        "createacct-another-submit": "Buat akun",
+       "createacct-continue-submit": "Lanjutkan pembuatan akun",
+       "createacct-another-continue-submit": "Lanjutkan pembuatan akun",
        "createacct-benefit-heading": "{{SITENAME}} dibuat oleh orang-orang seperti Anda.",
        "createacct-benefit-body1": "{{PLURAL:$1|suntingan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|halaman}}",
        "nocookieslogin": "{{SITENAME}} menggunakan kuki untuk log penggunanya. Kuki pada peramban web Anda dimatikan. Silakan aktifkan dan coba lagi.",
        "nocookiesfornew": "Akun pengguna tidak dibuat karena kami tidak dapat memastikan sumbernya.\nPastikan Anda telah mengaktifkan kuki, lalu muat ulang halaman ini dan coba lagi.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Akun telah berhasil dibuat, namun Anda tidak dapat langsung masuk log secara otomatis. Silakan meneruskan ke  [[Special:UserLogin|masuk log manual]].",
        "noname": "Nama pengguna yang Anda masukkan tidak sah.",
        "loginsuccesstitle": "Berhasil masuk log",
        "loginsuccess": "'''Anda sekarang masuk log di {{SITENAME}} sebagai \"$1\".'''",
        "createacct-another-realname-tip": "Nama asli bersifat opsional.\nJika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.",
        "pt-login": "Masuk log",
        "pt-login-button": "Masuk log",
+       "pt-login-continue-button": "Lanjutkan masuk log",
        "pt-createaccount": "Buat akun baru",
        "pt-userlogout": "Keluar log",
        "php-mail-error-unknown": "Kesalahan yang tidak dikenal dalam fungsi mail() PHP",
        "botpasswords-insert-failed": "Gagal menambah nama bot \"$1\". Apakah sudah ditambahkan sebelum ini?",
        "botpasswords-update-failed": "Gagal memperbarui nama bot \"$1\". Apakah sebelumnya sudah pernah dihapus?",
        "botpasswords-created-title": "Kata sandi bot dibuat",
-       "botpasswords-created-body": "Kata sandi bot \"$1\" berhasil dibuat.",
+       "botpasswords-created-body": "Kata sandi bot \"$1\" dari pengguna \"$2\" berhasil dibuat.",
        "botpasswords-updated-title": "Kata sandi bot diperbarui",
-       "botpasswords-updated-body": "Kata sandi bot \"$1\" berhasil diperbarui.",
+       "botpasswords-updated-body": "Kata sandi bot \"$1\" dari pengguna \"$2\" berhasil diperbarui.",
        "botpasswords-deleted-title": "Kata sandi bot dihapus",
-       "botpasswords-deleted-body": "Kata sandi bot \"$1\" telah dihapus.",
+       "botpasswords-deleted-body": "Kata sandi bot \"$1\" dari pengguna \"$2\" telah dihapus.",
        "botpasswords-newpassword": "Kata sandi baru untuk masuk log dengan '''$1''' adalah '''$2'''. ''Mohon simpan untuk referensi di kemudian hari.''",
        "botpasswords-no-provider": "BotPasswordsSessionProvider tidak tersedia.",
        "botpasswords-restriction-failed": "Batasan kata sandi menghalangi masuk log ini.",
        "botpasswords-invalid-name": "Nama pengguna yang diberikan tidak mengandung pemisah kata sandi bot (\"$1\").",
        "botpasswords-not-exist": "Pengguna \"$1\" tidak memiliki kata sandi bot bernama \"$2\".",
        "resetpass_forbidden": "Kata sandi tidak dapat diubah",
+       "resetpass_forbidden-reason": "Kata sandi tidak dapat dubah: $1",
        "resetpass-no-info": "Anda harus masuk log untuk mengakses halaman ini secara langsung.",
        "resetpass-submit-loggedin": "Ganti kata sandi",
        "resetpass-submit-cancel": "Batalkan",
        "passwordreset-emailsentusername": "Jika ada alamat surel yang berkaitan dengan nama pengguna ini, maka surel untuk menyetel ulang kata sandi akan dikirim.",
        "passwordreset-emailsent-capture": "Surel setel ulang kata sandi telah dikirim, yang ditampilkan di bawah.",
        "passwordreset-emailerror-capture": "Surel setel ulang kata sandi telah dibuat, yang ditampilkan di bawah, namun pengiriman pada {{GENDER:$2|pengguna}} gagal: $1",
+       "passwordreset-invalideamil": "Alamat surel tidak sah",
+       "passwordreset-nodata": "Nama pengguna ataupun alamat surel tidak diberikan",
        "changeemail": "Ubah atau hapus alamat surel",
        "changeemail-header": "Lengkapi formulir ini untuk mengubah alamat surel Anda. Jika Anda ingin menghapus seluruh alamat surel yang berkaitan dengan akun Anda, kosongkan alamat surel ketika mengirim formulir.",
        "changeemail-passwordrequired": "Anda diharuskan memasukkan kata sandi untuk mengonfirmasikan perubahan ini.",
        "whatlinkshere-prev": "{{PLURAL:$1|sebelumnya $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|selanjutnya $1}}",
        "whatlinkshere-links": "← pranala",
-       "whatlinkshere-hideredirs": "Sembunyikan pengalihan",
-       "whatlinkshere-hidetrans": "Sembunyikan transklusi",
-       "whatlinkshere-hidelinks": "Sembunyikan pranala",
-       "whatlinkshere-hideimages": "Sembunyikan pranala berkas",
+       "whatlinkshere-hideredirs": "$1 pengalihan",
+       "whatlinkshere-hidetrans": "$1 transklusi",
+       "whatlinkshere-hidelinks": "$1 pranala",
+       "whatlinkshere-hideimages": "$1 pranala berkas",
        "whatlinkshere-filters": "Penyaring",
        "whatlinkshere-submit": "Tuju ke",
        "autoblockid": "Blokir otomatis #$1",
        "feedback-thanks-title": "Terima kasih!",
        "searchsuggest-search": "Cari",
        "searchsuggest-containing": "berisi...",
+       "api-error-autoblocked": "Alamat IP Anda telah diblokir secara otomatis, karena sebelumnya digunakan oleh pengguna yang diblokir.",
        "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
        "api-error-badtoken": "Kesalahan internal: token buruk.",
+       "api-error-blocked": "Anda telah diblokir dari penyuntingan.",
        "api-error-copyuploaddisabled": "Mengunggah melalui URL dilarang pada peladen ini.",
        "api-error-duplicate": "Sudah ada {{PLURAL:$1|berkas lain|berkas lain}} dengan isi yang sama di situs ini.",
        "api-error-duplicate-archive": "Ada {{PLURAL:$1|berkas lain|berkas lain}} di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
index 8ac3982..2b37f1d 100644 (file)
@@ -10,7 +10,8 @@
                        "아라",
                        "Shirayuki",
                        "ElizaMag",
-                       "Adam-Yourist"
+                       "Adam-Yourist",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "ТIахьожаярга кIала така хьакхар:",
        "june": "Этинга бутт",
        "july": "Баьцамеа бутт",
        "august": "Мяцхали бутт",
-       "september": "Тов\\Ð\9cиÑ\85ий Ð±Ñ\83Ñ\82Ñ\82",
-       "october": "Ð\90Ñ\80даÑ\80ий\\Ð\90Ñ\8cÑ\80Ñ\85Iий Ð±Ñ\83Ñ\82Ñ\82",
+       "september": "Михий бутт",
+       "october": "АьрхIий бутт",
        "november": "Лай чилла бутт",
        "december": "Чан-тар бутт",
        "january-gen": "АгIой бетт",
-       "february-gen": "Саь-кур бетт",
+       "february-gen": "Саь-кур",
        "march-gen": "Мутт-хьал бетт",
        "april-gen": "Тушоли бетт",
        "may-gen": "Села бетт",
        "mar": "Мутт-хьал",
        "apr": "Tушоли",
        "may": "Села",
-       "jun": "Ð\9cангал\\ЭÑ\82инга",
-       "jul": "Баьцамеа\\Меа",
+       "jun": "Этинга",
+       "jul": "Баьцамеа",
        "aug": "Мяцхали",
-       "sep": "Тов\\Ð\9cиÑ\85ий",
+       "sep": "Михий",
        "oct": "Ардарий\\АьрхIий",
        "nov": "Лай чилла",
        "dec": "Чан-тар",
        "pool-queuefull": "Хаттарий цӀа хьалдизад",
        "pool-errorunknown": "Довзаш доаца гӀалат",
        "poolcounter-usage-error": "Лелдара г|алат: $1",
-       "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьца",
+       "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьца дар",
        "aboutpage": "Project:Лоацам",
        "copyright": "$1 чулоацамаца тIакхоачаш да.",
        "copyrightpage": "{{ns:project}}:Автора бокъонаш",
        "disclaimerpage": "Project:Бехктокхам хьацаэцар",
        "edithelp": "Хувцам бара новкъостал",
        "helppage-top-gethelp": "ГӀо",
-       "mainpage": "Кертера оагӀув",
-       "mainpage-description": "Кертера оагӀув",
+       "mainpage": "Керттера оагӀув",
+       "mainpage-description": "Керттера оагӀув",
        "policy-url": "Project:Бокъонаш",
        "portal": "Юкъара ков",
        "portal-url": "Project:Юкъара ков",
        "page-rss-feed": "\"$1\" RSS мугӀ",
        "page-atom-feed": "«$1» — Atom-мугI",
        "red-link-title": "$1 (укх тайпара оагӀув яц)",
-       "nstab-main": "Ð\99оазÑ\83в",
+       "nstab-main": "СÑ\82аÑ\82Ñ\8cÑ\8f",
        "nstab-user": "Доакъашхо",
        "nstab-media": "Медифаг",
-       "nstab-special": "Ð\91алха оагӀув",
+       "nstab-special": "Ð\93\83лакха оагӀув",
        "nstab-project": "Проектах лаьца",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Хоам",
        "nstab-template": "Ло",
        "nstab-help": "ГӀо",
        "nstab-category": "Категори",
-       "mainpage-nstab": "Кертера оагӀув",
+       "mainpage-nstab": "Керттера",
        "nosuchaction": "Цу тайпара дулархIам бац",
        "nosuchspecialpage": "Изза мо гӀон оагӀув яц",
        "error": "ГӀалат",
        "createacct-another-username-ph": "Чуйоалае доакъашхочун цӀи",
        "yourpassword": "КъайладIоагӀа:",
        "userlogin-yourpassword": "Пароль",
+       "createacct-yourpassword-ph": "Iочуязъе пароль",
        "yourpasswordagain": "КъайладIоагӀа юха Ӏоязаде:",
+       "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Iочуязъе пароль",
        "remembermypassword": "(укх $1 {{PLURAL:$1|1=ден|деношкахь}}) мара са чувалара/чуялара дагалоаца дезаш дац",
        "yourdomainname": "Шун цӀеноагӀув:",
        "login": "Чувала/яла",
        "note": "'''ХӀамоалар:'''",
        "previewnote": "'''Хьалхе б|аргтассам мара бац.'''\nЯздам кхы яздаь дац!",
        "editing": "Хувцам: $1",
+       "creating": "«$1» оагIув хьакхоллар",
        "editingsection": "Хувцам: $1 (оагӀон дáкъа)",
        "editingcomment": "ГӀалатнийсдар $1 (керда декъам)",
        "editconflict": "ГӀалатнийсдара къовсам: $1",
        "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).",
        "rclistfrom": "$3 $2 денза даь хувцамаш хьахьокха",
        "rcshowhideminor": "$1 зIамига нийсдараш",
+       "rcshowhideminor-show": "Хьахьокха",
        "rcshowhideminor-hide": "ДIакъайладаккха",
        "rcshowhidebots": "$1 боташ",
        "rcshowhidebots-show": "Хьахьокха",
+       "rcshowhidebots-hide": "ДIакъайладаккха",
        "rcshowhideliu": "$1 бовзийтарчара доакъашхой",
        "rcshowhideliu-hide": "Къайлабаха",
        "rcshowhideanons": "$1 цIияккханза доакъашхой",
        "rcshowhideanons-hide": "Къайлабаха",
        "rcshowhidepatr": "$1 теркам даь хувцамаш",
        "rcshowhidemine": "$1 хьа нийсдараш",
+       "rcshowhidemine-show": "Хьахьокха",
        "rcshowhidemine-hide": "ДIакъайладаккха",
        "rclinks": "Хьахьокха $2 дийнахь даь хинна тIеххьара $1 хувцамаш\n<br />$3",
        "diff": "башхало",
        "sharedupload": "Ер паьла $1чера я, кхыча хьахьоадайтамча хьахайраде йийшайолаш я.",
        "sharedupload-desc-here": "Ер файл $1 чура я, иштта кхыйола проекташ чу пайда эца аьттув болаш я.\nЦун [$2 йоазонца сурт оттадара оагIон] информаци кIалхахь хьайоалаяй.",
        "uploadnewversion-linktext": "Укх паьлий керда бIаса чуяьккха",
+       "upload-disallowed-here": "Хьа бокъо яц ер файл юха дӀаязъе.",
        "filerevert-comment": "Бахьан:",
        "filedelete-comment": "Бахьан:",
        "filedelete-submit": "ДIадаккха",
        "filedelete-reason-otherlist": "Кхыдола бахьан",
        "download": "хьачуяьккха",
        "unwatchedpages": "Теркамза оагIувнаш",
-       "randompage": "Ца ховш нийсъенна йоазув",
+       "randompage": "Ца ховш нийсъенна статья",
        "statistics": "Дагара куц",
        "statistics-pages": "ОагIувнаш",
        "brokenredirects-edit": "хувца",
        "restriction-level": "Чувоала лагIа:",
        "restriction-edit": "ГIалатнийсдар",
        "restriction-move": "ЦIи хувцаp",
-       "restriction-create": "Ð\9aÑ\85оллам",
+       "restriction-create": "Ð¥Ñ\8cакÑ\85оллаÑ\80",
        "restriction-upload": "Чудаккхар",
        "undeletelink": "БIаргтасса/юхаметтаоттаде",
        "undeleteviewlink": "хьажа",
        "sp-contributions-username": "IP-моттиг е цIи:",
        "sp-contributions-toponly": "ТIехьара доржамаш лоархаш дола хувцамаш мара ма хьокха",
        "sp-contributions-submit": "Хьалáха",
-       "whatlinkshere": "Ð¥ьожаяргаш укхаза",
+       "whatlinkshere": "ТIаÑ\85ьожаяргаш укхаза",
        "whatlinkshere-title": "\"$1\" тIахьожавеш йола оагIонаш",
        "whatlinkshere-page": "ОагIув",
        "linkshere": "ТIехьайоагIа оагIонаш тIахьожаву «'''[[:$1]]'''»:",
        "whatlinkshere-prev": "{{PLURAL:$1|1=хьалхайоагIа|хьалхайоагIараш}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
        "whatlinkshere-links": "← тIахьожаяргаш",
-       "whatlinkshere-hideredirs": "ДIакъайладаккха дIа-сахьожадар",
-       "whatlinkshere-hidetrans": "ДIакъайладаккха юкъедахараш",
-       "whatlinkshere-hidelinks": "ДIакъайлаяккха тIахьожаяргаш",
+       "whatlinkshere-hideredirs": "$1 дIа-сахьожадараш",
+       "whatlinkshere-hidetrans": "$1 юкъейоалаяраш",
+       "whatlinkshere-hidelinks": "$1 тIахьожаяргаш",
        "whatlinkshere-hideimages": "$1 суртIинкаш",
        "whatlinkshere-filters": "Фильтры",
        "blockip": "Укх {{GENDER:$1|доакъошхочоа}} ч|ега бола",
        "allmessages-filter-all": "Дерригаш",
        "allmessages-language": "Мотт:",
        "allmessages-filter-submit": "Дехьа гӀо",
-       "thumbnail-more": "Ð\94оккÑ\85а де",
+       "thumbnail-more": "Ð¥Ñ\8cадоаккÑ\85аде",
        "thumbnail_error": "ЗIамигасуртанчий кхеллама гIалат: $1",
        "import-upload-filename": "ПаьлацIи:",
        "tooltip-pt-userpage": "{{GENDER:|Хьа}} доакъашхочун оагIув",
        "tooltip-search": "Хьалáха {{grammar:prepositional|{{SITENAME}}}} чу",
        "tooltip-search-go": "Изза мо цӀи йолаш оагӀув тӀa дехьавала",
        "tooltip-search-fulltext": "Изза мо яздар долаш оагӀувнаш лаха",
-       "tooltip-p-logo": "Кертера оагIув тIа дехьавала",
+       "tooltip-p-logo": "Керттера оагIон тIа дехьавала",
        "tooltip-n-mainpage": "Кертера оагIув тIа дехьавала",
-       "tooltip-n-mainpage-description": "Кертера оагIув тIа дехьавала",
+       "tooltip-n-mainpage-description": "Керттера оагIон тIа дехьавала",
        "tooltip-n-portal": "ГIалгIай Википедех лаьца дар а, укхаза де мегаш дар а, малагIа фуд а, мича да а",
        "tooltip-n-currentevents": "ХIанзара хинна хIамах бола хоам",
        "tooltip-n-recentchanges": "ТӀеххьара хувцамай список",
        "tooltip-n-randompage": "Башхало йоаца ца ховш нийсъенна оагӀув хьаела",
        "tooltip-n-help": "Новкъостал лаха мегаш йола моттиг",
-       "tooltip-t-whatlinkshere": "Укхаза тIахьожавеш йола оагIонай список",
+       "tooltip-t-whatlinkshere": "Укхаза тIахьожавеш йола оагIонаш",
        "tooltip-t-recentchangeslinked": "Укх оагIуво тIахьожавеш йолча оагIонай тIеххьара хувцамаш",
        "tooltip-feed-rss": "Укх оагIувна RSSчу гойтар",
        "tooltip-feed-atom": "Укх оаг|увна Atomчу гойтар",
        "tooltip-rollback": "Цкъа пIелг тоIабе дIадаккха тIехьара редакторас даь хувцамаш",
        "tooltip-undo": "Даь хувцар дIадаьккха, хьалххе бIаргтохар хьахьокха, дIадаккхара бахьан Iочуязде аьттув болаш.",
        "tooltip-summary": "Лоаца йоазонца сурт оттадар Iочуязде",
+       "simpleantispam-label": "Анти-спам тахкар.\n<strong>Цхьа</strong> хIама ма язъе укхаз!",
        "pageinfo-hidden-categories": "{{PLURAL:$1|1=Къайла категори|Къайла категореш}} ($1)",
        "pageinfo-toolboxlink": "ОагIонах бола хоам",
        "previousdiff": "← Хьалхара нийсдар",
        "file-nohires": "Укхал дуккхагIа доккхал долаш верси яц",
        "svg-long-desc": "SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель}}, файлан боарам: $3",
        "show-big-image": "ДIадолалу файл",
+       "show-big-image-preview": "Боарам хьалххе бIаргтохач хан: $1.",
+       "show-big-image-other": "{{PLURAL:$2|1=Кхыйола  разрешени|Кхыйола  разрешенеш}}: $1.",
        "show-big-image-size": "$1 × $2 пиксель",
        "noimages": "Суртaш бIаргагуш дац.",
        "ilsubmit": "Хьалáха",
        "bad_image_list": "Бустам цу тайпара хила беза:\n\nДагарлен хьаракъаш мара лоарх|аш хургьяц (укх тамагIалгацa * дувлашду мугIараш).\nМугIарен хьалхара Iинк, сурт Iоттае пурам доаца Iинка, хила еза. \nЦу мугIара тIехьайоагIа Iинкаш, арадаккхар мо лоарх|аш хургья, вешта аьлча, йоазувашка чуIоттаде мегаш дола сурт санна ларх|а мега.",
-       "metadata": "Метахоамаш",
+       "metadata": "Мета-дараш",
        "metadata-help": "Файлас кхыдола хоамаш чулоаца, цифровой суртдоакхарго е сканеро тIатохаш дола. Нагахьа файл чуякхачул тIехьа хийца хинна дале, цхьаццайола параметраш хIанзара сурта тара йоацаш хила мегаш я.",
        "metadata-expand": "Кхыдола хIамаш хьахьокха",
        "metadata-collapse": "Кхыдола хIамаш къайладаккха",
        "exif-imagewidth": "Шерал",
        "exif-imagelength": "Лакхал",
        "exif-orientation": "Сурта белгало",
+       "exif-xresolution": "ПхьорагIа разрешени",
+       "exif-yresolution": "УрагIа разрешени",
        "exif-imagedescription": "Сурта цIи",
        "exif-model": "Камера модель",
        "exif-software": "Программни Iалашдар",
        "tags-hitcount-header": "Белгалаяь хувцамаш",
        "tags-edit": "хувца",
        "tags-hitcount": "$1 {{PLURAL:$1|1=хувцам|хувцамаш}}",
+       "tags-create-submit": "Хьакхолла",
        "compare-page1": "1. ОагIув",
        "compare-page2": "2. ОагIув",
        "compare-rev1": "1. Доржам",
index 8908443..fe9bdca 100644 (file)
@@ -66,7 +66,7 @@
        "tog-ccmeonemails": "Senda mér afrit af tölvupóstum sem ég sendi öðrum notendum",
        "tog-diffonly": "Ekki sýna síðuefni undir mismunum",
        "tog-showhiddencats": "Sýna falda flokka",
-       "tog-norollbackdiff": "Sleppa breytingu eftir að endurvakning síðu hefur verið gerð.",
+       "tog-norollbackdiff": "Ekki sýna breytingu eftir að endurvakning síðu hefur verið gerð.",
        "tog-useeditwarning": "Vara mig við þegar ég fer frá breytingarsíðu með óvistaðar breytingar",
        "tog-prefershttps": "Alltaf nota örugga tengingu við innskráningu",
        "underline-always": "Alltaf",
        "noname": "Þú hefur ekki tilgreint gilt notandanafn.",
        "loginsuccesstitle": "Innskráning tókst",
        "loginsuccess": "'''Þú ert nú innskráð(ur) á {{SITENAME}} sem „$1“.'''",
-       "nosuchuser": "Það er enginn notandi með þetta nafn: \"$1\".\nGerður er greinarmunur á há- og lágstöfum.\nAthugaðu hvort um innsláttavillu er að ræða eða [[Special:CreateAccount|búðu til nýtt notandanafn]].",
+       "nosuchuser": "Það er enginn notandi með þetta nafn: „$1“.\nGerður er greinarmunur á há- og lágstöfum.\nAthugaðu hvort um innsláttavillu er að ræða eða [[Special:CreateAccount|búðu til nýtt notandanafn]].",
        "nosuchusershort": "Það er enginn notandi með nafnið „$1“. Athugaðu hvort nafnið sé ritað rétt.",
        "nouserspecified": "Þú verður að taka fram notandanafn.",
        "login-userblocked": "Þessi notandi hefur verið settur í bann.  Innskráning ekki leyfð.",
        "accmailtext": "Lykilorðið fyrir [[User talk:$1|$1]] hefur verið sent á $2. Hægt er að breyta því á síðunni ''[[Special:ChangePassword|breyta lykilorði]]'' þegar notandinn hefur skráð sig inn.",
        "newarticle": "(Ný)",
        "newarticletext": "Þú hefur fylgt tengli á síðu sem ekki er til ennþá.\nÞú getur búið til síðu með þessu nafni með því að skrifa í formið fyrir neðan\n(meiri upplýsingar í [$1 hjálpinni]).\nEf þú hefur óvart villst hingað geturðu notað '''til baka'''-hnappinn í vafranum þínum.",
-       "anontalkpagetext": "----''Þetta er spjallsíða fyrir óþekktan notanda sem hefur ekki búið til aðgang ennþá, eða notar hann ekki.\nÞar af leiðandi þurfum við að nota vistfang til að bera kennsli á hann/hana.\nNokkrir notendur geta deilt sama vistfangi.\nEf þú ert óþekktur notandi og finnst að óviðkomandi athugasemdum hafa verið beint að þér, gjörðu svo vel og [[Special:CreateAccount|búðu til aðgang]] eða [[Special:UserLogin|skráðu þig inn]] til þess að koma í veg fyrir þennan rugling við aðra óþekkta notendur í framtíðinni.''",
+       "anontalkpagetext": "----\n<em>Þetta er spjallsíða fyrir óþekktan notanda sem hefur ekki búið til aðgang ennþá, eða notar hann ekki.</em>\nÞar af leiðandi þurfum við að nota vistfang til að bera kennsli á hann/hana.\nNokkrir notendur geta deilt sama vistfangi.\nEf þú ert óþekktur notandi og finnst að óviðkomandi athugasemdum hafa verið beint að þér, gjörðu svo vel og [[Special:CreateAccount|búðu til aðgang]] eða [[Special:UserLogin|skráðu þig inn]] til þess að koma í veg fyrir þennan rugling við aðra óþekkta notendur í framtíðinni.",
        "noarticletext": "Enginn texti er á þessari síðu enn sem komið er.\nÞú getur [[Special:Search/{{PAGENAME}}|leitað að þessum titli]], í öðrum síðum,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} leitað í tengdum skrám], eða [{{fullurl:{{FULLPAGENAME}}|action=edit}} búið hana til]</span>.",
        "noarticletext-nopermission": "Það er enginn texti á þessari síðu eins og er.\nÞú getur [[Special:Search/{{PAGENAME}}|leitað að þessum titli]] í öðrum síðum, eða <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} leitað í tengdum skrám]</span>, en þú hefur ekki réttindi til þess að stofna þessa síðu.",
        "missing-revision": "Útgáfa #$1 síðunnar „{{FULLPAGENAME}}\" er ekki til.\n\nÞetta gerist oftast þegar úreld breytingaskrá tengir á síðu sem hefur verið eytt. Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].",
        "userpage-userdoesnotexist": "Notandaaðgangurinn „<nowiki>$1</nowiki>“ er ekki skráður.\nGjörðu svo vel og athugaðu hvort að þú viljir skapa/breyta þessari síðu.",
        "userpage-userdoesnotexist-view": "Notandinn \"$1\" er ekki skráður.",
        "blocked-notice-logextract": "Þessi notandi er í banni.\nSíðasta færsla notandans úr bannskrá er birt hér fyrir neðan til skýringar:",
-       "clearyourcache": "'''Athugaðu:''' Eftir vistun kann að vera að þú þurfir að komast hjá skyndiminni vafrans þíns til að sjá breytingarnar.\n* '''Firefox / Safari:''' Haltu ''Shift'' samtímis og þú smellir á ''Endurhlaða (Reload)'', eða ýttu á annaðhvort ''Ctrl-F5'' eða ''Ctrl-R'' (''⌘-R'' á Mac)\n* '''Google Chrome:''' Ýttu á ''Ctrl-Shift-R'' (''⌘-Shift-R'' á Mac)\n* '''Internet Explorer:''' Haltu ''Ctrl'' samtímis og þú smellir á ''Endurnýja (Refresh)'', eða ýttu á ''Ctrl-F5''\n* '''Opera:''' Hreinsaðu skyndiminnið í ''Verkfæri (Tools) → Stillingar (Preferences)''",
+       "clearyourcache": "<strong>Athugaðu:</strong> Eftir vistun kann að vera að þú þurfir að komast hjá skyndiminni vafrans þíns til að sjá breytingarnar.\n* <strong>Firefox / Safari:</strong> Haltu <em>Shift</em> samtímis og þú smellir á <em>Endurhlaða (Reload)</em>, eða ýttu á annaðhvort <em>Ctrl-F5</em> eða <em>Ctrl-R</em> (<em>⌘-R</em> á Mac)\n* <strong>Google Chrome:</strong> Ýttu á <em>Ctrl-Shift-R </em>(<em>⌘-Shift-R</em> á Mac)\n* <strong>Internet Explorer:</strong> Haltu <em>Ctrl</em> samtímis og þú smellir á <em>Endurnýja (Refresh)</em>, eða ýttu á <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Farðu í <em>Verkfæri (Tools) → Stillingar (Preferences)</em> og svo <em>Friðhelgi og öryggi (Privacy & security) → Hreinsa vafragögn (Clear browsing data) → Myndir og skrár í skyndiminni (Chached images and files)</em>",
        "usercssyoucanpreview": "'''Ath:''' Hægt er að nota „{{int:showpreview}}“ hnappinn til að prófa CSS-kóða áður en hann er vistaður.",
        "userjsyoucanpreview": "'''Ath:''' Hægt er að nota \"{{int:showpreview}}\" hnappinn til að prófa JavaScript-kóða áður en hann er vistaður.",
        "usercsspreview": "'''Mundu að þú ert aðeins að forskoða CSS-kóðann þinn.'''\n'''Hann hefur ekki enn verið vistaður!'''",
        "right-override-export-depth": "Flytja út síður með greinum þar sem allt að 5 greinar tengja þær saman.",
        "right-sendemail": "Senda tölvupóst til annara notenda",
        "right-passwordreset": "Skoða tölvupósta um endurstillingu lykilorðs",
-       "right-managechangetags": "Búa til og eyða [[Special:Tags|merkjum]] úr gagnagrunni",
+       "right-managechangetags": "Búa til og (af)virkja [[Special:Tags|merki]] úr gagnagrunni",
        "right-applychangetags": "Virkja [[Special:Tags|merki]] ásamt öðrum breytingum",
        "grant-group-email": "Senda tölvupóst",
        "grant-group-high-volume": "Framkvæma magnaðgerðir",
        "action-viewmywatchlist": "skoða vaktlistann þinn",
        "action-viewmyprivateinfo": "skoða persónuupplýsingar þínar",
        "action-editmyprivateinfo": "breyta persónuupplýsingum þínum",
-       "action-managechangetags": "búa til og eyða merkjum úr gagnagrunni",
+       "action-managechangetags": "búa til og (af)virkja merki úr gagnagrunni",
        "action-applychangetags": "virkja merki ásamt öðrum breytingum",
        "nchanges": "$1 {{PLURAL:$1|breyting|breytingar}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|síðan síðustu heimsókn}}",
        "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",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] og $2 [[Special:WhatLinksHere/$1|{{PLURAL:$2|síðu|síðum}}]] bætt við flokk",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] var bætt við flokk, [[Special:WhatLinksHere/$1|þessi síða innifalin í öðrum síðum]]",
        "recentchanges-page-removed-from-category": "[[:$1]] fjarlægð úr flokki",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] og $2 {{PLURAL:$2|síðu|síðum}} fjarlægð úr flokki",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] var fjarlægð úr flokki, [[Special:WhatLinksHere/$1|þessi síða innifalin í öðrum síðum]]",
        "autochange-username": "Sjálfvirk MediaWiki-breyting",
        "upload": "Hlaða inn skrá",
        "uploadbtn": "Hlaða inn skrá",
        "watchlistedit-raw-done": "Vaktlistinn þinn hefur verið uppfærður.",
        "watchlistedit-raw-added": "$1 {{PLURAL:$1|síðu|síðum}} var bætt við:",
        "watchlistedit-raw-removed": "$1 {{PLURAL:$1|síða var fjarlægð|síður voru fjarlægðar}}:",
-       "watchlistedit-clear-title": "Hreinsaður vaktlisti",
+       "watchlistedit-clear-title": "Hreinsa vaktlista",
        "watchlistedit-clear-legend": "Hreinsa vaktlista",
        "watchlistedit-clear-explain": "Allar síður verða fjarlægðar af vaktlistanum þínum",
        "watchlistedit-clear-titles": "Síður:",
        "timezone-local": "Staðartími",
        "duplicate-defaultsort": "<strong>Viðvörun:</strong> Sjálfgefni röðunarlykillinn \"$2\" er rétthærri en eldri sjálfgefinn röðunarlykill \"$1\".",
        "duplicate-displaytitle": "<strong>Viðvörun:</strong> Birtingartitillinn \"$2\" er rétthærri en eldri sjálfgefinn birtingartitill \"$1\".",
+       "restricted-displaytitle": "<strong>Viðvörun:</strong> Sýndi titillinn „$1“ var hunsaður þar sem hann samsvarast ekki raunverulegum titli síðunnar.",
        "version": "Útgáfa",
        "version-extensions": "Uppsettar viðbætur",
        "version-skins": "Uppsett skinn",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|fjarlægði}} verndun af $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|verndaði}} $3 $4",
        "logentry-protect-modify": "$1 {{GENDER:$2|breytti}} verndunarstigi fyrir $3 $4",
-       "logentry-rights-rights": "$1 {{GENDER:$2|breytti}} réttindum $3 frá $4 í $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|breytti}} réttindum {{GENDER:$6|$3}} frá $4 í $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|breytti}} réttindum $3",
        "logentry-rights-autopromote": "$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|hlóð inn}} $3",
index 7c5e869..c887479 100644 (file)
@@ -96,7 +96,8 @@
                        "V6rg",
                        "JackLantern",
                        "Mpiva",
-                       "Urielejh"
+                       "Urielejh",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "botpasswords-invalid-name": "Il nome utente indicato non contiene il separatore per password bot (\"$1\").",
        "botpasswords-not-exist": "L'utente \"$1\" non dispone di una password bot chiamata \"$2\".",
        "resetpass_forbidden": "Non è possibile modificare le password",
+       "resetpass_forbidden-reason": "Non è possibile modificare le password: $1",
        "resetpass-no-info": "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
        "resetpass-submit-loggedin": "Cambia password",
        "resetpass-submit-cancel": "Annulla",
        "accmailtext": "Una password generata casualmente per [[User talk:$1|$1]] è stata inviata a $2. Questa password può essere modificata nella pagina per ''[[Special:ChangePassword|cambiare la password]]'' subito dopo l'accesso.",
        "newarticle": "(Nuovo)",
        "newarticletext": "Il collegamento appena seguito corrisponde ad una pagina non ancora esistente.\nSe vuoi creare la pagina ora, basta cominciare a scrivere il testo nella casella qui sotto (vedi la [$1 pagina di aiuto] per maggiori informazioni).\nSe il collegamento è stato aperto per errore, è sufficiente fare clic sul pulsante <strong>Indietro</strong> del proprio browser.",
-       "anontalkpagetext": "----\n''Questa è la pagina di discussione di un utente anonimo, che non ha ancora creato un'utenza o comunque non la sta usando. Per identificarlo è quindi necessario usare il numero del suo indirizzo IP. Gli indirizzi IP possono però essere condivisi da più utenti. Se sei un utente anonimo e ritieni che i commenti presenti in questa pagina non si riferiscano a te, [[Special:CreateAccount|crea una nuova utenza]] o [[Special:UserLogin|entra con quella che già hai]] per evitare di essere confuso con altri utenti anonimi in futuro.''",
+       "anontalkpagetext": "----\n<em>Questa è la pagina di discussione di un utente anonimo, che non ha ancora creato un'utenza o comunque non la sta usando.</em>\nPer identificarlo è quindi necessario usare il numero del suo indirizzo IP.\nGli indirizzi IP possono però essere condivisi da più utenti.\nSe sei un utente anonimo e ritieni che i commenti presenti in questa pagina non si riferiscano a te, [[Special:CreateAccount|crea una nuova utenza]] o [[Special:UserLogin|entra con quella che già hai]] per evitare di essere confuso con altri utenti anonimi in futuro.",
        "noarticletext": "In questo momento la pagina richiesta è vuota.\nPuoi [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati] oppure [{{fullurl:{{FULLPAGENAME}}|action=edit}} creare questa pagina]</span>.",
        "noarticletext-nopermission": "In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati]</span>, ma non hai i permessi per creare questa pagina.",
        "missing-revision": "La versione #$1 della pagina \"{{FULLPAGENAME}}\" non esiste.\n\nQuesto si verifica solitamente seguendo un collegamento a una pagina cancellata, in una cronologia non aggiornata.\nI dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].",
        "upload-form-label-infoform-description-tooltip": "Descrivi sinteticamente tutto quanto sia degno di nota a proposito di quest'opera.\nPer le foto, indica le cose principali che vi sono rappresentate, l'occasione e/o il luogo in cui sono state scattate.",
        "upload-form-label-usage-title": "Utilizzo",
        "upload-form-label-usage-filename": "Nome del file",
-       "upload-form-label-own-work": "Questo è un mio lavoro",
+       "upload-form-label-own-work": "Questa è una mia opera creativa",
        "upload-form-label-infoform-categories": "Categorie",
        "upload-form-label-infoform-date": "Data",
        "upload-form-label-own-work-message-generic-local": "Confermo che sto caricando questo file seguendo le condizioni di servizio e le politiche sulle license di {{SITENAME}}.",
        "whatlinkshere-prev": "{{PLURAL:$1|precedente|precedenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|successivo|successivi $1}}",
        "whatlinkshere-links": "← collegamenti",
-       "whatlinkshere-hideredirs": "Nascondi redirect",
-       "whatlinkshere-hidetrans": "Nascondi inclusioni",
-       "whatlinkshere-hidelinks": "Nascondi collegamenti",
-       "whatlinkshere-hideimages": "Nascondi collegamenti da file",
+       "whatlinkshere-hideredirs": "$1 redirect",
+       "whatlinkshere-hidetrans": "$1 inclusioni",
+       "whatlinkshere-hidelinks": "$1 collegamenti",
+       "whatlinkshere-hideimages": "$1 collegamenti da file",
        "whatlinkshere-filters": "Filtri",
        "whatlinkshere-submit": "Vai",
        "autoblockid": "Autoblocco #$1",
        "log-action-filter-suppress-block": "Soppressione utente da blocco",
        "log-action-filter-suppress-reblock": "Soppressione utente da ri-blocco",
        "log-action-filter-upload-upload": "Nuovo caricamento",
-       "log-action-filter-upload-overwrite": "Ricaricamento"
+       "log-action-filter-upload-overwrite": "Ricaricamento",
+       "authmanager-userdoesnotexist": "L'utenza \"$1\" non è registrata.",
+       "authmanager-email-help": "Indirizzo email",
+       "authmanager-realname-help": "Nome reale dell'utente",
+       "authform-newtoken": "Token mancante. $1",
+       "changecredentials-submit-cancel": "Annulla",
+       "removecredentials-submit": "Rimuovi",
+       "removecredentials-submit-cancel": "Annulla"
 }
index 4f85d2c..bc063df 100644 (file)
@@ -70,7 +70,8 @@
                        "Azeha",
                        "Kana Higashikawa",
                        "Shield-9",
-                       "Waiesu"
+                       "Waiesu",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "リンクの下線:",
        "mytalk": "トーク",
        "anontalk": "トーク",
        "navigation": "案内",
-       "and": "&#32;ã\81¨",
+       "and": "&#32;ã\81\8aã\82\88ã\81³",
        "qbfind": "検索",
        "qbbrowse": "閲覧",
        "qbedit": "編集",
        "whatlinkshere-prev": "前の$1件",
        "whatlinkshere-next": "次の$1件",
        "whatlinkshere-links": "← リンク",
-       "whatlinkshere-hideredirs": "転送ページを非表示",
-       "whatlinkshere-hidetrans": "参照読み込みを非表示",
-       "whatlinkshere-hidelinks": "リンクを非表示",
-       "whatlinkshere-hideimages": "ファイルへのリンクを非表示",
+       "whatlinkshere-hideredirs": "転送ページを$1",
+       "whatlinkshere-hidetrans": "参照読み込みを$1",
+       "whatlinkshere-hidelinks": "リンクを$1",
+       "whatlinkshere-hideimages": "ファイルへのリンクを$1",
        "whatlinkshere-filters": "絞り込み",
        "whatlinkshere-submit": "実行",
        "autoblockid": "自動ブロック #$1",
index a8fd122..f446921 100644 (file)
@@ -9,7 +9,8 @@
                        "Midnight Gambler",
                        "아라",
                        "Jyllanj",
-                       "Ghiutun"
+                       "Ghiutun",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Unjestreg henwisnenge:",
index 874055f..72246d0 100644 (file)
@@ -37,8 +37,8 @@
        "tog-watchuploads": "Wuwuh barkas anyar unggahanku nyang pawawanganku",
        "tog-watchrollback": "Wuwuh kaca sing tak wurungaké nyang pawawanganku",
        "tog-minordefault": "Tengeri kabèh besutan minangka besutan cilik sacara baku",
-       "tog-previewontop": "Deleng prawuryan sadurungé besut kothak",
-       "tog-previewonfirst": "Tuduhaké prawuryan nalika mbesut pisanan",
+       "tog-previewontop": "Deleng pratuduh sadurungé mbesut kothak",
+       "tog-previewonfirst": "Delelng pratuduh nalika mbesut pisanan",
        "tog-enotifwatchlistpages": "Kirimi aku layangtronik yèn ana kaca utawa barkas ing pawawanganku sing diowah",
        "tog-enotifusertalkpages": "Kirimi aku layangtronik yèn kaca gegunemanku diowah",
        "tog-enotifminoredits": "Uga kirimi aku layangtronik yèn ana besutan cilik ing kaca lan barkas",
@@ -46,7 +46,7 @@
        "tog-shownumberswatching": "Tuduhaké cacah wong sing ngawasi",
        "tog-oldsig": "Tandha tangan sing ana:",
        "tog-fancysig": "Anggep tandha tangan minangka tulisan wiki (tanpa pranala otomatis)",
-       "tog-uselivepreview": "Trapaké prawuryan langsung",
+       "tog-uselivepreview": "Nganggo pratuduh langsung",
        "tog-forceeditsummary": "Élingna aku menawa kothak ringkesan suntingan isih kosong",
        "tog-watchlisthideown": "Dhelikaké besutanku saka pawawangan",
        "tog-watchlisthidebots": "Dhelikaké besutan bot saka pangawasan",
        "minoredit": "Iki besutan cilik",
        "watchthis": "Awasi kaca iki",
        "savearticle": "Simpen kaca",
-       "preview": "Prawuryan",
-       "showpreview": "Tuduhaké prawuryan",
+       "preview": "Pratuduh",
+       "showpreview": "Deleng pratuduh",
        "showdiff": "Tuduhaké owahan",
        "anoneditwarning": "<strong>Penget:</strong> Panjenengan boten mlebet log. Alamat IP Panjenengan badhe katingal dening publik manawi Panjenengan ngayahi ewah-ewahan. Manawi Panjenengan  <strong>[$1 mlebet log]</strong> utawai <strong>[$2 damel akun]</strong>, suntingan Panjenengan badhe kaatribusekaken dhumateng  nama pangangge Panjenengan, lan rupi-rupi  kauntungan sanesipun.",
        "anonpreviewwarning": "''Sampéyan durung mlebu log. Nyimpen bakal nyathet alamat IP Sampéyan nèng riwayat sunting kaca iki.''",
        "missingsummary": "'''Pènget:''' Panjenengan ora nglebokaké ringkesan panyuntingan. Menawa panjenengan mencèt tombol Simpen manèh, suntingan panjenengan bakal kasimpen tanpa ringkesan panyuntingan.",
        "missingcommenttext": "Tulung lebokna komentar ing ngisor iki.",
        "missingcommentheader": "'''Pangéling:''' Sampéyan durung nyadhiyakaké judhul/jejer kanggo tanggepan iki.\nYèn Sampéyan klik \"{{int:savearticle}}\" manèh, suntingan Sampéyan bakal kasimpen tanpa kuwi.",
-       "summary-preview": "Prawuryan tingkesan:",
+       "summary-preview": "Pratuduh tingkesan:",
        "subject-preview": "Prawuryaning jejer:",
        "blockedtitle": "Panganggo kapalangan",
-       "blockedtext": "'''Asma panganggo utawa alamat IP panjenengan diblokir.'''\n\nBlokir iki sing nglakoni $1.\nAlesané ''$2''.\n\n* Diblokir wiwit: $8\n* Kadaluwarsa pemblokiran ing: $6\n* Sing arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang e-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat e-mail sing sah ing [[Special:Preferences|préferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
-       "autoblockedtext": "Alamat IP panjenangan wis diblokir minangka otomatis amerga dienggo déning panganggo liyané. Pamblokiran dilakoni déning $1 mawa alesan:\n\n:''$2''\n\n* Diblokir wiwit: $8\n* Blokir kadaluwarsa ing: $6\n* Sing dikarepaké diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké perkara iki.\n\nPanjenengan ora bisa nganggo fitur \"kirim e-mail panganggo iki\" kejaba panjenengan wis nglebokaké alamat e-mail sing sah ing [[Special:Preferences|préferènsi]] panjenengan lan panjenengan wis diblokir kanggo nggunakaké.\n\nID pamblokiran panjenengan iku #$5 lan alamat IP panjenengan iku $3. Tulung sertakna informasi ing dhuwur kabèh iki saben ngajokaké pitakonan panjenengan. Matur nuwun.",
+       "blockedtext": "<b>Asma panganggo utawa alamat IP panjenengan diblokir.</b>\n\nBlokir iki sing nglakoni $1.\nAlesané <i>$2</i>.\n\n* Diblokir wiwit: $8\n* Kadaluwarsa pemblokiran ing: $6\n* Sing arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang é-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat é-mail sing sah ing [[Special:Preferences|prèferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
+       "autoblockedtext": "Alamat IP panjenangan wis diblokir minangka otomatis amerga dienggo déning panganggo liyané. Pamblokiran dilakoni déning $1 mawa alesan:\n\n:''$2''\n\n* Diblokir wiwit: $8\n* Blokir kadaluwarsa ing: $6\n* Sing dikarepaké diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké perkara iki.\n\nPanjenengan ora bisa nganggo fitur \"kirim e-mail panganggo iki\" kejaba panjenengan wis nglebokaké alamat e-mail sing sah ing [[Special:Preferences|prèferènsi]] panjenengan lan panjenengan wis diblokir kanggo nggunakaké.\n\nID pamblokiran panjenengan iku #$5 lan alamat IP panjenengan iku $3. Tulung sertakna informasi ing dhuwur kabèh iki saben ngajokaké pitakonan panjenengan. Matur nuwun.",
        "blockednoreason": "ora ana alesan sing diwènèhaké",
        "whitelistedittext": "Sampéyan kudu $1 murih bisa mbesut kaca.",
        "confirmedittext": "Panjenengan kudu ndhedhes alamat e-mail dhisik sadurungé pareng nyunting sawijining kaca. Mangga nglebokaké lan validasi alamat e-mail panjenengan sadurungé nglakoni panyuntingan. Alamat e-mail sawisé bisa diowahi liwat [[Special:Preferences|kaca préférènsi]]",
        "prefs-edits": "Gunggung besutan:",
        "prefsnologintext2": "Tulung $1 kanggo ngganti preferensi sampeyan.",
        "prefs-skin": "Kulit",
-       "skin-preview": "Prawuryan",
+       "skin-preview": "Pratuduh",
        "datedefault": "Ora ana pilihan",
        "prefs-labs": "Piranti lab",
        "prefs-user-pages": "Kacaning sing nganggo",
        "recentchangescount": "Cacahing besutan sing dituduhaké kanthi baku:",
        "prefs-help-recentchangescount": "Iki klebu owah-owahan pungkasan, kaca sajarah, lan log.",
        "prefs-help-watchlist-token2": "Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.\nSiapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.\n[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].",
-       "savedprefs": "Préferènsi Panjenengan wis disimpen",
+       "savedprefs": "Prèferènsi Panjenengan wis disimpen",
        "savedrights": "Haking panganggo {{GENDER:$1|$1}} wis kasimpen.",
        "timezonelegend": "Zona wektu:",
        "localtime": "Wektu saenggon:",
        "right-edituserjs": "Besut barkas-barkas JavaScript panganggo liya",
        "right-editmyusercss": "Owahi berkas CSS panganggo sampeyan",
        "right-editmyuserjs": "Owahi berkas JavaScript panganggo sampeyan",
-       "right-viewmywatchlist": "Dheleng daftar pangawasan sampeyan",
+       "right-viewmywatchlist": "Deleng pawawanganing sampéyan",
        "right-editmywatchlist": "Owahi daftar pangawasan sampeyan. Cathetan: ana cara liyane kanggo nambahi kaca menyang daftar, sanadyan ora duwe hak iki.",
        "right-viewmyprivateinfo": "Dheleng data pribadi sampeyan (kayata alamat layang elektronik, jeneng asli)",
        "right-editmyprivateinfo": "Owahi data pribadi sampeyan (kayata alamat layang elektronik, jeneng asli)",
        "usermessage-summary": "Tinggalaké layang sistem.",
        "usermessage-editor": "Pawartaning layang sistem",
        "watchlist": "Daptar pangawasan",
-       "mywatchlist": "Daftar pangawasan",
+       "mywatchlist": "Pawawangan",
        "watchlistfor2": "Kanggo $1 $2",
-       "nowatchlist": "Daftar pangawasan panjenengan kosong.",
+       "nowatchlist": "Ora ana apa-apa ing pawawanganing sampéyan.",
        "watchlistanontext": "Mangga $1 kanggo mirsani utawa nyunting daftar pangawasan panjenengan.",
        "watchnologin": "Durung mlebu log",
        "addwatch": "Tambah nèng daptar pangawasan",
        "wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
        "wlnote": "Ngisor iki {{PLURAL:$1|owahan pungkasan|'''$1''' owahan pungkasan}} {{PLURAL:$2|jam|'''$2''' jam}} kapungkur, per $3, $4.",
        "wlshowlast": "Tuduhna $1 jam $2 dina  pungkasan",
-       "watchlist-options": "Opsi daftar pangawasan",
+       "watchlist-options": "Pilihaning pawawangan",
        "watching": "Ngawasi...",
        "unwatching": "Ngilangi pangawasan...",
        "watcherrortext": "Ana kasalahan nalika ngganti pangaturan daptar pangawasan Sampéyan kanggo \"$1\".",
        "whatlinkshere-prev": "{{PLURAL:$1|sadurungé|$1 sadurungé}}",
        "whatlinkshere-next": "{{PLURAL:$1|sabanjuré|$1 sabanjuré}}",
        "whatlinkshere-links": "← pranala",
-       "whatlinkshere-hideredirs": "Dhelikaké lih-lihan",
-       "whatlinkshere-hidetrans": "Dhelikaké transklusi",
-       "whatlinkshere-hidelinks": "Dhelikaké pranala",
-       "whatlinkshere-hideimages": "Dhelikaké pranala barkas",
+       "whatlinkshere-hideredirs": "$1 lih-lihan",
+       "whatlinkshere-hidetrans": "$1 transklusi",
+       "whatlinkshere-hidelinks": "pranala-pranala $1",
+       "whatlinkshere-hideimages": "$1 pranala berkas",
        "whatlinkshere-filters": "Panyaringan",
        "autoblockid": "Blokir otomatis #$1",
        "block": "Blokir panganggo",
        "ipbnounblockself": "Sampéyan ora dililakaké mbukak blokirané Sampéyan",
        "lockdb": "Kunci basis data",
        "unlockdb": "Buka kunci basis data",
-       "lockdbtext": "Ngunci basis data bakal menggak kabèh panganggo kanggo nyunting kaca, ngowahi préferènsi panganggo, nyunting daftar pangawasan, lan prekara-prekara liyané sing merlokaké owah-owahan basis data. Pastèkna yèn iki pancèn panjenengan gayuh, lan yèn panjenengan ora lali mbuka kunci basis data sawisé pangopènan rampung.",
-       "unlockdbtext": "Mbuka kunci basis data bakal mbalèkaké kabèh panganggo bisa nyunting kaca manèh, ngowahi préferènsi panganggo, nyunting daftar pangawasan, lan prekara-prekara liyané sing merlokaké pangowahan marang basis data.\nTulung pastèkna yèn iki pancèn sing panjenengan gayuh.",
+       "lockdbtext": "Ngunci basis data bakal menggak kabèh panganggo kanggo nyunting kaca, ngowahi prèferènsi panganggo, nyunting daftar pangawasan, lan prekara-prekara liyané sing merlokaké owah-owahan basis data. Pastèkna yèn iki pancèn panjenengan gayuh, lan yèn panjenengan ora lali mbuka kunci basis data sawisé pangopènan rampung.",
+       "unlockdbtext": "Mbuka kunci basis data bakal mbalèkaké kabèh panganggo bisa nyunting kaca manèh, ngowahi prèferènsi panganggo, nyunting daftar pangawasan, lan prekara-prekara liyané sing merlokaké pangowahan marang basis data.\nTulung pastèkna yèn iki pancèn sing panjenengan gayuh.",
        "lockconfirm": "Iya, aku pancèn péngin ngunci basis data.",
        "unlockconfirm": "Iya, aku pancèn péngin tmbuka kunci basis data.",
        "lockbtn": "Kunci basis data",
        "tooltip-ca-undelete": "Balèkna suntingan ing kaca iki sadurungé kaca iki dibusak",
        "tooltip-ca-move": "Lih kaca iki",
        "tooltip-ca-watch": "Tambahaké kaca iki nyang pawawangan sapéyan",
-       "tooltip-ca-unwatch": "Busak kaca iki saka daftar pangawasan panjenengan",
+       "tooltip-ca-unwatch": "Busak kaca iki saka pawawanganing sampéyan",
        "tooltip-search": "Golèk nyang {{SITENAME}}",
        "tooltip-search-go": "Jujug kaca asesirah persis mangkéné yèn ana",
        "tooltip-search-fulltext": "Golèk kaca isi tulisan kaya mangkéné",
        "tooltip-ca-nstab-category": "Deleng kaca kategori",
        "tooltip-minoredit": "Tandhani iki minangka besutan cilik",
        "tooltip-save": "Simpen owah-owahaning sampéyan",
-       "tooltip-preview": "Prawuryan owah-owahaning sampéyan. Anggoa cara iki sadurungé nyimpen.",
+       "tooltip-preview": "Pratuduhing owah-owahaning sampéyan. Anggoa cara iki sadurungé nyimpen.",
        "tooltip-diff": "Tuduhaké owah-owahan endi sing sampéyan gawé tumrap tulisan iki",
        "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki sing dipilih.",
-       "tooltip-watch": "Tambahna kaca iki ing daftar pangawasan panjenengan",
+       "tooltip-watch": "Wuwuh kaca iki nyang pawawanganing sampéyan",
        "tooltip-watchlistedit-normal-submit": "Singkiraké judhul",
        "tooltip-watchlistedit-raw-submit": "Anyari daptar pangawasan",
        "tooltip-recreate": "Gawéa kaca iki manèh senadyan tau dibusak",
        "svg-long-desc-animated": "Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3",
        "svg-long-error": "Berkas SVG ora sah: $1",
        "show-big-image": "Barkas asli",
-       "show-big-image-preview": "Gedhéning prawuryan iki: $1",
+       "show-big-image-preview": "Gedhéning pratuduh iki: $1",
        "show-big-image-other": "{{PLURAL:$2|Résolusi|Résolusi}} liya: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "file-info-gif-looped": "mubeng",
        "namespacesall": "kabèh",
        "monthsall": "kabèh",
        "confirmemail": "Konfirmasi alamat e-mail",
-       "confirmemail_noemail": "Panjenengan ora maringi alamat e-mail sing absah ing [[Special:Preferences|préferènsi]] panjenengan.",
+       "confirmemail_noemail": "Panjenengan ora maringi alamat é-mail sing absah ing [[Special:Preferences|prèferènsi]] panjenengan.",
        "confirmemail_text": "{{SITENAME}} ngwajibaké panjenengan ndhedhes utawa konfirmasi alamat e-mail panjenengan sadurungé bisa nganggo fitur-fitur e-mail.\nPencèten tombol ing ngisor iki kanggo ngirim sawijining kode konfirmasi arupa sawijining pranala;\nTuladen pranala iki ing panjlajah wèb panjenengan kanggo ndhedhes yèn alamat e-mail panjenengan pancèn bener.",
        "confirmemail_pending": "Sawijining kode konfirmasi wis dikirim menyang alamat e-mail panjenengan;\nyèn panjenengan lagi waé nggawé akun utawa rékening panjenengan, mangga nunggu sawetara menit nganti layang iku tekan sadurungé nyuwun kode anyar manèh.",
        "confirmemail_send": "Kirim kode konfirmasi",
        "lag-warn-normal": "Owah-owahan pungkasan sing luwih anyar tinimbang $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing pratélan iki.",
        "lag-warn-high": "Amarga gedhéné ''lag'' basis data server, owah-owahan pungkasan sing luwih anyar saka $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing daftar iki.",
        "watchlistedit-normal-title": "Besut pawawangan",
-       "watchlistedit-normal-legend": "Busak irah-irahan saka daftar pangawasan",
+       "watchlistedit-normal-legend": "Busak sesirah saka pawawangan",
        "watchlistedit-normal-explain": "Irah-irahan utawa judhul ing daftar pangawasan panjenengan kapacak ing ngisor iki.\nKanggo mbusak sawijining irah-irahan, kliken kothak ing pinggiré, lan banjur kliken \"Busak judhul\".\nPanjenengan uga bisa [[Special:EditWatchlist/raw|nyunting daftar mentah]].",
        "watchlistedit-normal-submit": "Busak irah-irahan",
        "watchlistedit-normal-done": "Irah-irahan {{PLURAL:$1|siji|$1}} wis dibusak saka daftar pangawasan panjenengan:",
        "watchlistedit-raw-legend": "Besut pawawangan wantahan",
        "watchlistedit-raw-explain": "Irah-irahan ing daftar pangawasan panjenengan kapacak ing ngisor iki, lan bisa diowahi mawa nambahaké utawa mbusak daftar; sairah-irahan saban barisé.\nYèn wis rampung, anyarana kaca daftar pangawasan iki.\nPanjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan]].",
        "watchlistedit-raw-titles": "Irah-irahan:",
-       "watchlistedit-raw-submit": "Anyarana daftar pangawasan",
-       "watchlistedit-raw-done": "Daftar pangawasan panjenengan wis dianyari.",
+       "watchlistedit-raw-submit": "Anyari pawawangan",
+       "watchlistedit-raw-done": "Pawawanganing sampéyan wis dianyari.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 irah-irahan wis|$1 irah-irahan wis}} ditambahaké:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 irah-irahan wis|$1 irah-irahan wis}} diwetokaké:",
        "watchlisttools-view": "Tuduhna owah-owahan sing ana gandhèngané",
index b9885e0..4ee3c82 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|წინა|წინა $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|შემდეგი|შემდეგი $1}}",
        "whatlinkshere-links": "← ბმულები",
-       "whatlinkshere-hideredirs": "გადამისამართების $1",
-       "whatlinkshere-hidetrans": "$1 á\83©á\83\90á\83 á\83\97á\83\95á\83\94á\83\91ი",
-       "whatlinkshere-hidelinks": "ბმულების $1",
+       "whatlinkshere-hideredirs": "$1 გადამისამართება",
+       "whatlinkshere-hidetrans": "$1 á\83©á\83\90á\83\9cá\83\90á\83 á\83\97ი",
+       "whatlinkshere-hidelinks": "$1 ბმული",
        "whatlinkshere-hideimages": "$1 სურათის ბმულები",
        "whatlinkshere-filters": "ფილტრები",
        "whatlinkshere-submit": "წინ",
index dd471d5..38ef8c0 100644 (file)
        "recentchangeslinked-page": "Бет атауы:",
        "recentchangeslinked-to": "Керісінше, келтірілген бетке сілтейтін беттердегі өзгерістерді көрсет",
        "recentchanges-page-added-to-category": "[[:$1]] бетіне санат қосты",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] және [[Special:WhatLinksHere/$1|{{PLURAL:$2|бір бет|$2 бет}}]] санатқа қосылды",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] санатқа қосылды, [[Special:WhatLinksHere/$1|{{PLURAL:$1|бұл бет басқа беттердің ішіне кірістірілген}}]]",
        "recentchanges-page-removed-from-category": "[[:$1]] санаттан алынды",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] және [[Special:WhatLinksHere/$1|{{PLURAL:$2|бір бет|$2 бет}}]] санаттан алынды",
        "autochange-username": "МедиаУики өздікті өзгерісі",
index dbee372..a81ba1c 100644 (file)
@@ -61,7 +61,8 @@
                        "Mooozi",
                        "Ellif",
                        "HDNua",
-                       "Ykhwong"
+                       "Ykhwong",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "nosuchaction": "이러한 명령이 없습니다",
        "nosuchactiontext": "URL에 지정한 명령이 올바르지 않습니다.\nURL을 잘못 입력했거나, 올바르지 않은 링크를 따라갔을 수 있습니다.\n{{SITENAME}}에 사용하는 소프트웨어의 버그일 수도 있습니다.",
        "nosuchspecialpage": "해당하는 특수 문서가 없습니다",
-       "nospecialpagetext": "<strong>요청한 특수 문서가 존재하지 않습니다.</strong>\n\n특수 문서의 목록은 [[Special:SpecialPages|여기]]에서 볼 수 있습니다.",
+       "nospecialpagetext": "<strong>요청한 특수 문서가 존재하지 않습니다.</strong>\n\n유효한 특수 문서의 목록은 [[Special:SpecialPages|{{int:specialpages}}]]에서 볼 수 있습니다.",
        "error": "오류",
        "databaseerror": "데이터베이스 오류",
        "databaseerror-text": "데이터베이스 쿼리 오류가 발생했습니다.\n소프트웨어의 버그일 수 있습니다.",
        "password-change-forbidden": "이 위키에서 비밀번호를 바꿀 수 없습니다.",
        "externaldberror": "인증 데이터베이스에 오류가 있거나 바깥 계정을 새로 고칠 권한이 없습니다.",
        "login": "로그인",
+       "login-security": "사용자 정보 확인",
        "nav-login-createaccount": "로그인 / 계정 만들기",
        "userlogin": "로그인 / 계정 만들기",
        "userloginnocreate": "로그인",
        "userlogin-resetpassword-link": "비밀번호를 잊으셨나요?",
        "userlogin-helplink2": "로그인에 대한 도움말",
        "userlogin-loggedin": "이미 {{GENDER:$1|$1}} 사용자로 로그인되어 있습니다.\n다른 사용자로 로그인하려면 아래의 양식을 사용하세요.",
+       "userlogin-reauth": "사용자가 $1임을 확인하려면 다시 로그인해야 합니다.",
        "userlogin-createanother": "다른 계정 만들기",
        "createacct-emailrequired": "이메일 주소",
        "createacct-emailoptional": "이메일 주소 (선택 사항)",
        "createacct-email-ph": "이메일 주소를 입력하세요",
        "createacct-another-email-ph": "이메일 주소를 입력하세요",
        "createaccountmail": "임의의 임시 비밀번호를 이메일로 보내기",
+       "createaccountmail-help": "비밀번호를 기억하지 않고도 다른 사용자를 위한 계정을 만들 수 있습니다.",
        "createacct-realname": "실명 (선택 사항)",
        "createaccountreason": "이유:",
        "createacct-reason": "이유",
        "createacct-reason-ph": "왜 다른 계정을 만들어야 합니까",
+       "createacct-reason-help": "계정 생성 로그에 표시되는 메시지",
        "createacct-submit": "계정 만들기",
        "createacct-another-submit": "계정 만들기",
+       "createacct-continue-submit": "계정 만들기 계속",
+       "createacct-another-continue-submit": "계정 만들기 계속",
        "createacct-benefit-heading": "{{SITENAME}} 프로젝트는 여러분과 같은 사람들이 만듭니다.",
        "createacct-benefit-body1": "{{PLURAL:$1|편집}}",
        "createacct-benefit-body2": "{{PLURAL:$1|문서}}",
        "nocookiesnew": "사용자 계정을 만들었지만, 로그인되어 있지 않습니다.\n{{SITENAME}}에서는 로그인을 위해 쿠키를 사용합니다.\n사용자는 쿠키를 사용하지 않도록 설정되어 있습니다.\n쿠키를 사용하도록 설정한 다음 새로운 사용자 이름과 비밀번호로 로그인하세요.",
        "nocookieslogin": "{{SITENAME}}에서는 로그인을 위해 쿠키를 사용합니다.\n쿠키가 비활성되어 있습니다.\n쿠키 사용을 활성화한 다음 다시 시도하세요.",
        "nocookiesfornew": "요청의 출처를 확인할 수 없기 때문에 사용자 계정이 만들어지지 않았습니다.\n쿠키를 활성화한 것을 확인하고, 이 문서를 새로 고치고 나서 다시 시도하세요.",
+       "createacct-loginerror": "계정 만들기는 성공했으나 자동으로 로그인하지 못했습니다. [[Special:UserLogin|수동으로 로그인]]해 주십시오.",
        "noname": "사용자 계정 이름이 올바르지 않습니다.",
        "loginsuccesstitle": "로그인함",
        "loginsuccess": "<strong>{{SITENAME}}에 \"$1\" 계정으로 로그인했습니다.</strong>",
-       "nosuchuser": "이름이 \"$1\"인 사용자는 없습니다.\n사용자 계정 이름은 대소문자를 구별합니다.\n철자가 맞는지 확인해주세요. [[Special:CreateAccount|새 계정을 만들 수도 있습니다]].",
+       "nosuchuser": "이름이 \"$1\"인 사용자는 없습니다.\n사용자 이름은 대소문자를 구별합니다.\n철자가 맞는지 확인해주세요. [[Special:CreateAccount|새 계정을 만들 수도 있습니다]].",
        "nosuchusershort": "이름이 \"$1\"인 사용자는 없습니다.\n철자가 맞는지 확인하세요.",
        "nouserspecified": "사용자 계정 이름을 입력하지 않았습니다.",
        "login-userblocked": "이 사용자는 차단되었습니다. 로그인할 수 없습니다.",
        "createacct-another-realname-tip": "실명은 선택 사항입니다.\n실명을 입력하면 문서 기여에 사용자의 이름이 들어가게 됩니다.",
        "pt-login": "로그인",
        "pt-login-button": "로그인",
+       "pt-login-continue-button": "로그인 계속",
        "pt-createaccount": "계정 만들기",
        "pt-userlogout": "로그아웃",
        "php-mail-error-unknown": "PHP의 mail() 함수에서 알 수 없는 오류가 발생했습니다.",
        "botpasswords-invalid-name": "지정된 사용자 이름은 봇 비밀번호 구분자(\"$1\")를 포함하고 있지 않습니다.",
        "botpasswords-not-exist": "\"$1\" 사용자가 이름이 \"$2\"인 봇의 비밀번호를 가지고 있지 않습니다.",
        "resetpass_forbidden": "비밀번호를 바꿀 수 없습니다",
+       "resetpass_forbidden-reason": "암호를 변경할 수 없습니다: $1",
        "resetpass-no-info": "이 페이지에 직접 접근하려면 로그인해야 합니다.",
        "resetpass-submit-loggedin": "비밀번호 바꾸기",
        "resetpass-submit-cancel": "취소",
        "passwordreset-emailsentusername": "이 사용자 이름과 연결된 이메일 주소가 있다면 비밀번호 초기화 이메일이 전송됩니다.",
        "passwordreset-emailsent-capture": "비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.",
        "passwordreset-emailerror-capture": "비밀번호 재설정 이메일이 생성되어 아래에 나타나 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1",
+       "passwordreset-emailsent-capture2": "비밀번호 재설정 이메일을 보냈습니다. {{PLURAL:$1|사용자 이름과 비밀번호는|사용자 이름과 비밀번호의 목록은}} 아래에 나타납니다.",
+       "passwordreset-emailerror-capture2": "사용자 이메일 보내기 실패: $1 {{PLURAL:$3|사용자 이름과 비밀번호가|사용자 이름과 비밀번호의 목록이}} 아래에 나타납니다.",
+       "passwordreset-nocaller": "호출자를 지정해야 합니다",
+       "passwordreset-nosuchcaller": "호출자가 존재하지 않습니다: $1",
+       "passwordreset-ignored": "비밀번호 재설정을 처리하지 못했습니다. 제공자가 구성되지 않았기 때문일 수 있습니다.",
+       "passwordreset-invalideamil": "잘못된 이메일 주소",
+       "passwordreset-nodata": "사용자 이름이나 이메일 주소가 지정되지 않았습니다",
        "changeemail": "이메일 주소를 바꾸거나 제거하기",
        "changeemail-header": "이메일 주소를 바꾸려면 이 양식을 채우세요. 계정에서 이메일 연동을 취소하고 싶다면 양식을 제출할 때 새 이메일 주소를 공란으로 두세요.",
        "changeemail-passwordrequired": "변경을 적용하려면 비밀번호를 입력해야 합니다.",
        "showpreview": "미리 보기",
        "showdiff": "차이 보기",
        "blankarticle": "<strong>경고:</strong> 만들려는 문서가 비어 있습니다.\n\"{{int:savearticle}}\"을 다시 클릭하면, 아무 내용 없이 문서가 만들어집니다.",
-       "anoneditwarning": "<strong>경고:</strong> 로그인을 하고 있지 않습니다. 편집을 하게 되면 IP 주소가 공개적으로 보여집니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 생성하면]</strong>, 편집 시에 다른 이점과 함께 사용자 이름이 표시됩니다.",
+       "anoneditwarning": "<strong>경고:</strong> 로그인을 하고 있지 않습니다. 편집을 하면 IP 주소가 공개적으로 보이게 됩니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 생성하면]</strong>, 편집 시에 사용자 이름이 표시되며 더불어 다른 혜택들도 누릴 수 있습니다.",
        "anonpreviewwarning": "<em>로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서의 편집 역사에 남게 됩니다.</em>",
        "missingsummary": "'''알림:''' 편집 요약을 적지 않았습니다.\n이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
        "selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"{{int:savearticle}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
        "whatlinkshere-prev": "{{PLURAL:$1|이전|이전 $1개}}",
        "whatlinkshere-next": "{{PLURAL:$1|다음|다음 $1개}}",
        "whatlinkshere-links": "← 가리키는 문서 목록",
-       "whatlinkshere-hideredirs": "넘겨주기를 숨기기",
-       "whatlinkshere-hidetrans": "끼워넣기를 숨기기",
-       "whatlinkshere-hidelinks": "링크를 숨기기",
-       "whatlinkshere-hideimages": "파일 링크를 숨기기",
+       "whatlinkshere-hideredirs": "넘겨주기를 $1",
+       "whatlinkshere-hidetrans": "끼워넣기를 $1",
+       "whatlinkshere-hidelinks": "링크를 $1",
+       "whatlinkshere-hideimages": "파일 링크를 $1",
        "whatlinkshere-filters": "필터",
        "whatlinkshere-submit": "계속",
        "autoblockid": "자동 차단 #$1",
        "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": "간체",
        "variantname-zh-hant": "번체",
        "metadata": "메타데이터",
        "revdelete-unrestricted": "관리자에 대한 제한을 해제함",
        "logentry-block-block": "$1님이 {{GENDER:$4|$3}}님을 $5 {{GENDER:$2|차단했습니다}} $6",
        "logentry-block-unblock": "$1님이 {{GENDER:$4|$3}} 사용자의 {{GENDER:$2|차단을 해제했습니다}}",
-       "logentry-block-reblock": "$1님이 {{GENDER:$4|$3}} 사용자의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
+       "logentry-block-reblock": "$1 님이 {{GENDER:$4|$3}} 사용자의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
        "logentry-suppress-block": "$1님이 {{GENDER:$4|$3}} 사용자를 $5 {{GENDER:$2|차단했습니다}} $6",
-       "logentry-suppress-reblock": "$1님이 {{GENDER:$4|$3}} 사용자의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
+       "logentry-suppress-reblock": "$1 님이 {{GENDER:$4|$3}} 사용자의 차단 기간을 $5 설정으로 {{GENDER:$2|바꾸었습니다}} $6",
        "logentry-import-upload": "$1님이 $3 문서를 파일 올리기로 {{GENDER:$2|가져왔습니다}}",
        "logentry-import-upload-details": "$1님이 $3 문서 ({{PLURAL:$4|판}} $4개)를 파일 올리기로 {{GENDER:$2|가져왔습니다}}",
        "logentry-import-interwiki": "$1님이 $3 문서를 다른 위키에서 {{GENDER:$2|가져왔습니다}}",
        "log-action-filter-suppress-block": "차단을 통한 사용자 숨기기",
        "log-action-filter-suppress-reblock": "재차단을 통한 사용자 숨기기",
        "log-action-filter-upload-upload": "새로 업로드",
-       "log-action-filter-upload-overwrite": "다시 업로드"
+       "log-action-filter-upload-overwrite": "다시 업로드",
+       "authmanager-authn-not-in-progress": "인증이 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
+       "authmanager-authn-autocreate-failed": "로컬 계정 자동 생성 실패: $1",
+       "authmanager-create-disabled": "계정 만들기가 금지되어 있습니다.",
+       "authmanager-create-from-login": "계정을 만드려면, 아래의 칸들을 채워 주십시오.",
+       "authmanager-create-not-in-progress": "계정 만들기가 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
+       "authmanager-link-not-in-progress": "계정 연결이 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
+       "authmanager-authplugin-setpass-failed-title": "비밀번호 변경 실패",
+       "authmanager-authplugin-setpass-failed-message": "인증 플러그인이 비밀번호 변경을 거부했습니다.",
+       "authmanager-authplugin-create-fail": "인증 플러그인이 계정 만들기를 거부했습니다.",
+       "authmanager-authplugin-setpass-denied": "인증 플러그인이 비밀번호 변경을 허용하지 않습니다.",
+       "authmanager-authplugin-setpass-bad-domain": "잘못된 도메인.",
+       "authmanager-autocreate-noperm": "자동 계정 만들기는 허용되지 않습니다.",
+       "authmanager-autocreate-exception": "이전의 오류들로 인해 자동 계정 만들기를 일시적으로 사용할 수 없습니다.",
+       "authmanager-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
+       "authmanager-userlogin-remembermypassword-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-temporarypassword": "임시 비밀번호",
+       "authprovider-confirmlink-message": "최근의 로그인 시도를 참고하여 다음의 계정들을 사용자의 위키 계정에 연결할 수 있습니다. 이들을 연결하면 이 계정들을 통해 로그인이 가능해집니다. 연결하고자 하는 대상을 선택해 주십시오.",
+       "authprovider-confirmlink-request-label": "연결할 계정",
+       "authprovider-confirmlink-success-line": "$1: 연결을 성공했습니다.",
+       "authprovider-confirmlink-failed": "계정 연결을 완전히 성공하지 못했습니다: $1",
+       "authprovider-confirmlink-ok-help": "연결 실패 메시지를 보여준 뒤에도 계속합니다.",
+       "authprovider-resetpass-skip-label": "건너뛰기",
+       "authprovider-resetpass-skip-help": "비밀번호 재설정을 건너뜁니다.",
+       "authform-nosession-login": "인증은 성공했으나 사용자의 브라우저가 로그인 상태를 저장하지 못했습니다.\n\n$1",
+       "authform-nosession-signup": "계정은 생성되었으나 사용자의 브라우저가 로그인 상태를 저장하지 못했습니다.\n\n$1",
+       "authform-wrongtoken": "잘못된 토큰",
+       "specialpage-securitylevel-not-allowed-title": "허용하지 않음",
+       "authpage-cannot-login": "로그인을 시작할 수 없습니다.",
+       "authpage-cannot-login-continue": "로그인을 계속할 수 없습니다. 사용자 세션의 시간이 초과되었을 가능성이 높습니다.",
+       "authpage-cannot-create": "계정 만들기를 시작할 수 없습니다.",
+       "authpage-cannot-create-continue": "계정 만들기를 계속할 수 없습니다. 사용자 세션의 시간이 초과되었을 가능성이 높습니다.",
+       "authpage-cannot-link": "계정 연결을 시작할 수 없습니다.",
+       "authpage-cannot-link-continue": "계정 연결을 계속할 수 없습니다. 사용자 세션의 시간이 초과되었을 가능성이 높습니다.",
+       "cannotauth-not-allowed-title": "권한이 없음",
+       "cannotauth-not-allowed": "이 문서의 이용을 허용하지 않습니다.",
+       "changecredentials-submit": "수정",
+       "changecredentials-submit-cancel": "취소",
+       "removecredentials-submit": "제거",
+       "removecredentials-submit-cancel": "취소",
+       "credentialsform-account": "계정 이름:",
+       "cannotlink-no-provider-title": "연결할 수 있는 계정이 없음",
+       "cannotlink-no-provider": "연결할 수 있는 계정이 없습니다.",
+       "linkaccounts": "계정 연결",
+       "linkaccounts-success-text": "계정이 연결되었습니다.",
+       "linkaccounts-submit": "계정 연결",
+       "unlinkaccounts": "계정 연결 해제",
+       "unlinkaccounts-success": "계정의 연결이 해제되었습니다."
 }
index 0a3f3a3..a21f3e2 100644 (file)
        "createacct-reason-ph": "Woröm deihs De noch ene Zohjang aanlääje?",
        "createacct-submit": "Lohß Jonn!",
        "createacct-another-submit": "Donn jäz enne zohsäzlejje Zohjang aanlääje",
+       "createacct-continue-submit": "Wigger maache mem Aanmällde",
+       "createacct-another-continue-submit": "Wigger maache mem Aanmällde",
        "createacct-benefit-heading": "{{ucfirst:{{GRAMMAR:Nominative|{{ucfirst:{{SITENAME}}}}}}}} weed vun Minsche wi Dir jemaat.",
        "createacct-benefit-body1": "{{PLURAL:$1|Änderong|Änderonge|Änderonge }}",
        "createacct-benefit-body2": "{{PLURAL:$1|Sigg|Sigge|Sigge }}",
        "createacct-another-realname-tip": "Dä reschteje Nahme kam_mer fott lohße.\n\nWann dä aanjejovve es, weet_e jebruch, öm öffentlesch de Schriiver för Beidrääsch ze nänne.",
        "pt-login": "Enlogge",
        "pt-login-button": "Enlogge",
+       "pt-login-continue-button": "Wigger maache mem Ennlogge",
        "pt-createaccount": "Ene neue Zohjang aanmälde",
        "pt-userlogout": "Ußlogge",
        "php-mail-error-unknown": "Nit bekannte Fähler met dä Funxjohn <code lang=\"en\">mail()</code> vum PHP",
        "botpasswords-label-delete": "Fottschmiiße",
        "botpasswords-label-resetpassword": "Paßwoot neu säze",
        "botpasswords-label-restrictions": "Beschränkonge:",
+       "botpasswords-label-grants-column": "Zohjelohße",
        "botpasswords-bad-appid": "„$1“ es keine jölltejje Nahme för ene Bot.",
        "botpasswords-insert-failed": "Kunnt keine Bot mem Nahme „$1“ derbei donn. Wohr velleijsch ald doh.",
        "botpasswords-update-failed": "Kunnt keine Bot mem Nahme „$1“ veränndere. Es velleijsch fottjeschmeße?",
        "botpasswords-deleted-title": "Dat Bot-Paßwood es fott",
        "botpasswords-deleted-body": "Dat Bot-Paßwoot för dä Bot „$1“ {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ wood fott jeschmeße.",
        "resetpass_forbidden": "E Passwoot kann nit jeändert wääde.",
+       "resetpass_forbidden-reason": "Paßwööter kam_mer nit änndere: $1",
        "resetpass-no-info": "Do mööts ad enjelogg sin, öm tiräk op di Sigg jonn ze dörve",
        "resetpass-submit-loggedin": "Passwood tuusche",
        "resetpass-submit-cancel": "Nix donn!",
        "passwordreset-emailsentemail": "Wann dat en ennjedrahre <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun Der es, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> för der Zohjang heh verschek, öm e neu Paßwoot ze krijje.",
        "passwordreset-emailsent-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh es verschek woode. Heh dronger kanns De se lässe.",
        "passwordreset-emailerror-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh sullt verschek wääde, ävver dat Verscheke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1",
+       "passwordreset-invalideamil": "Dat es en onjöltejje Addräß fö de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
        "changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
        "changeemail-header": "Donn heh dat Fommulaa ußfölle, öm Ding Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze ändere. Wann De en Adräß loß wähde wells, maach dat Fäld läddesch, ih dat De dat Fommolaa loß scheks.",
        "changeemail-passwordrequired": "Do moß Ding Paßwood enjävve, öm di Änderong ze beschtähteje.",
        "parser-template-recursion-depth-warning": "Schablohne rohfe sesch zo öff sellver op ($1)",
        "language-converter-depth-warning": "Zoh vill Verschachtelonge (övver $1) beim Täx-Ömwandelle vun eine Schprohch udder Schrevv en en anndere.",
        "node-count-exceeded-category": "Sigge, woh dä <i lang=\"en\" xml:lang=\"en\">node-count</i> övverschredde es",
-       "node-count-exceeded-category-desc": "Di Sigg hät dä \"node-count\" övverschredde.",
-       "node-count-exceeded-warning": "Heh di Sigg hät dä \"node-count\" övverschredde",
-       "expansion-depth-exceeded-category": "Sigge, woh de \"expansion depth\" övverschredde es",
-       "expansion-depth-exceeded-category-desc": "Dat heh es de Saachjropp för Sigge, woh de \"expansion depth\" övverschreddde es.",
-       "expansion-depth-exceeded-warning": "Heh di Sigg hät de \"expansion depth\" övverschredde",
+       "node-count-exceeded-category-desc": "Di Sigg hät dä <i lang=\"en\" xml:lang=\"en\">node-count</i> övverschredde.",
+       "node-count-exceeded-warning": "Heh di Sigg hät dä <i lang=\"en\" xml:lang=\"en\">node-count</i> övverschredde",
+       "expansion-depth-exceeded-category": "Sigge, woh zoh vill automattesch ennjeföhsch weed",
+       "expansion-depth-exceeded-category-desc": "Dat heh es de Saachjropp för Sigge, woh zoh vill automattesch ennjeföhsch weed.",
+       "expansion-depth-exceeded-warning": "En heh di Sigg weed zoh vill automattesch ennjeföhsch.",
        "parser-unstrip-loop-warning": "Ene Befähl em Täx betrek sesch op sesch sällefs.",
        "parser-unstrip-recursion-limit": "Ene Befähl em Täx es mieh wi {{PLURAL:$1|eijmohl|$1 Mohl|jaa nit}} met  sesch sellef verschachtelt.",
        "converter-manual-rule-error": "Doh es ene Fähler en ene händesche Önwandelongsrääjel zwesche de Schprohche.",
        "mergehistory-empty": "Mer han kei Versione för zesammezeläje",
        "mergehistory-done": "{{PLURAL:$3|Ein Väsjohn es|$3 Väsjohn sen|Kei Väsjohn wood}} fun „$1“ noh „[[:$2]]“ övverdraare un domet zosamme jelaat.",
        "mergehistory-fail": "Dat Versione zesamme läje is nit müjjelisch. Don ens di Sigge un de Zigge pröfe!",
+       "mergehistory-fail-bad-timestamp": "Dattom odder Zigg udder beeds sin nit jöltesch",
+       "mergehistory-fail-invalid-source": "De Quällesigg es nit jöltesch",
+       "mergehistory-fail-invalid-dest": "De Zihlsigg es nit jöltesch",
+       "mergehistory-fail-permission": "Kein Berääschtejong, de vörreje Väsjohne zesamme ze lähle.",
        "mergehistory-fail-self-merge": "De Quell-Sigg un de Ziel-Sigg sin deselve Sigg.",
+       "mergehistory-fail-timestamps-overlap": "De Väjsohne vun de Quällesigg kumme övverkrüz udder noh de Väsjohne vun de Zihlsigg.",
        "mergehistory-fail-toobig": "Mih wi {{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein Väsjohne}} wöödte zesamme jelaat. Esu vill künne mer nit, un maache mer nit.",
        "mergehistory-no-source": "En Ursprungssigg „$1“ jidd_et nit.",
        "mergehistory-no-destination": "En Zielsigg „$1“ jidd_et nit.",
        "right-createpage": "Neu Sigge, ävver kein Klaafsigge, aanlääje",
        "right-createtalk": "Neu Klaafsigge, ävver kein nomaale Sigge, aanlääje",
        "right-createaccount": "Ene neue Metmaacher endraage lohße",
+       "right-autocreateaccount": "Automeattesch med enem Zohjang vun ußerhallev enlogge",
        "right-minoredit": "Eije Änderong als klein Mini-Änderong makkehre",
        "right-move": "Sigge ömnenne",
        "right-move-subpages": "Sigge, un ier Ungersigge, zosamme ömnenne",
        "right-override-export-depth": "Beim Sigge Expoteere de Sigge metnämme, woh Lingks drop jon — beß fönef Schredde wigk",
        "right-sendemail": "<i lang=\"en\">e-mail</i> aan ander Metmaacher schecke",
        "right-passwordreset": "De <i lang=\"en\">e-mails</i> vum Paßwoot neu Säze aanloore",
-       "right-managechangetags": "[[Special:Tags|Kännzeijsche]] en de Dahtebangk aanlähje udder fottschmiiße",
+       "right-managechangetags": "[[Special:Tags|Kännzeijsche]] aanlähje udder ußschallde",
        "right-applychangetags": "[[Special:Tags|Makehronge]] met de eije Änderonge zersamme verjävve",
        "right-changetags": "[[Special:Tags|Makehronge]] vun Väsjohne un Enndrähsche em Logbohch fott nämme un zohföhje",
+       "right-deletechangetags": "[[Special:Tags|Kännzeijsche]] uß de Dahtebangk fott schmihße",
+       "grant-generic": "Rääschte \"$1\"",
        "grant-group-page-interaction": "Met Sigge ömjonn",
        "grant-group-file-interaction": "Met Mehdeje_Datteije ömjonn",
        "grant-group-watchlist-interaction": "Met de eije Oppaßless ömjonn",
        "grant-sendemail": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> aan ander Metmaacher schecke",
        "grant-uploadeditmovefile": "Datteije uhlahde, ußtuusche un ömbenänne",
        "grant-uploadfile": "Neu datteije huhlahde",
+       "grant-basic": "Jrondlähje Rääsch",
        "grant-viewdeleted": "Fottjeschmeße Dahte un Sigge belohre",
        "grant-viewmywatchlist": "De eije Oppaßleß ze belooere",
        "newuserlogpage": "Logbohch för neu Metmaachere",
        "action-createpage": "di Sigg aanzeläje",
        "action-createtalk": "Klaafsigge aanzeläje",
        "action-createaccount": "hee dä neue Metmaacher aanzemelde",
+       "action-autocreateaccount": "automattesch heh dä Metmaacher vun Ußerhallf aanzelähje",
        "action-history": "de Leß met de fröhjere Väsohne vun heh dä Sigg ze belohre",
        "action-minoredit": "heh di Änderong als klein „mini“ ze makkehre",
        "action-move": "di Sigg ömzebenänne",
        "action-viewmyprivateinfo": "de eije päsöhnlesche Aanjahbe ze belooere",
        "action-editmyprivateinfo": "Ding päsöhnlesche Aanjahbe ze ändere",
        "action-editcontentmodel": "et Modäll vum Ennhald vun Sigge ze verändere",
-       "action-managechangetags": "Kännzeijsche en de Dahtebangk aanlähje udder fottschmiiße",
+       "action-managechangetags": "Kännzeijsche en de Dahtebangk aanlähje udder ußschallde",
        "action-applychangetags": "Makehronge met de eije Änderonge zersamme ze verjävve",
        "action-changetags": "Makehronge vun Väsjohne un Enndrähsche em Logbohch fott nämme un zohföhje",
+       "action-deletechangetags": "Kännzeijsche uß de Dahtebangk fottschmiiße",
        "nchanges": "{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderong}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|Ein|$1|Kein}} zigg_em läzde Aanloore",
        "enhancedrc-history": "Väsjohne",
        "apisandbox-jsonly": "Der ohne JavaSkrepp kam_mer de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> för zom erömprobehre nit bruche.",
        "apisandbox-api-disabled": "Dat <i lang=\"en\">API</i> es en heh dämm Wiki afjeschalldt.",
        "apisandbox-intro": "Op heh dä Sigg kanns De met dä <strong>MediaWiki web service <i lang=\"en\">API</i></strong> eröm schpelle.\nBeloor Der de Einzelheite, wi di jebruch weed, op dä iere [[mw:API:Main_page Sigg met de Verklieronge]].\nE Beiscpell: [//www.mediawiki.org/wiki/API#A_simple_example De Houpsigg holle].\nSöhk ene {{int:Apisb-label-action}} uß, öm mieh Beishpell aanjezeisch ze krijje.\nOch wann dat heh nor zom Ußprobeere es, kann dat, wat De heh mähß, et Wiki verändere.",
+       "apisandbox-unfullscreen": "Sigg aanzeije",
        "apisandbox-submit": "Lohß jonn!",
        "apisandbox-reset": "Läddesch maache",
        "apisandbox-retry": "Norr_ens versöhke",
+       "apisandbox-helpurls": "Lengks för Hölp",
        "apisandbox-examples": "Bäijshpelle",
        "apisandbox-dynamic-parameters": "Zohsäzlejje Parrameetere",
-       "apisandbox-results": "Erus jekumme es",
+       "apisandbox-dynamic-parameters-add-label": "Alle Parrammeetere:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Däm Parramehter singe Nahme",
+       "apisandbox-dynamic-error-exists": "Ne Parramehter mem Nahme „$1“ ham_mer ald.",
+       "apisandbox-deprecated-parameters": "Övverhollte Parramehtere",
+       "apisandbox-submit-invalid-fields-title": "Paa Flder sin nit jöltesch",
+       "apisandbox-results": "Erus jekumme:",
        "apisandbox-request-url-label": "Dä <i lang=\"en\">URL</i> vun dä Aanfrooch:",
        "apisandbox-request-time": "De Zigg vum Afroof: $1",
        "booksources": "Böcher",
        "whatlinkshere-prev": "de vörijje {{PLURAL:$1||$1|noll}} zeije",
        "whatlinkshere-next": "de nächste {{PLURAL:$1||$1|noll}} zeije",
        "whatlinkshere-links": "← Links",
-       "whatlinkshere-hideredirs": "De Ömleijdonge verschteijsche",
-       "whatlinkshere-hidetrans": "De Oproofe verschteijsche",
-       "whatlinkshere-hidelinks": "De nommahle Lengks verschteijsche",
-       "whatlinkshere-hideimages": "De Lengks op Datteihje verscheijsche",
+       "whatlinkshere-hideredirs": "de Ömleijdonge $1",
+       "whatlinkshere-hidetrans": "de Oproofe $1",
+       "whatlinkshere-hidelinks": "de nommahle Lengks $1",
+       "whatlinkshere-hideimages": "de Lengks op Datteihje $1",
        "whatlinkshere-filters": "Ußsööke",
        "whatlinkshere-submit": "Lohß jonn!",
        "autoblockid": "Automattesche Sperr Nommer $1",
        "api-error-overwrite": "En Dattei ze övverschrieve es nit zohjelohße.",
        "api-error-stashfailed": "Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.",
        "api-error-publishfailed": "Ene Fähler es em ẞööver opjetrodde. En zweschejescheischerte Dattei kunnt nit öffentlesch jemaat wääde.",
-       "api-error-stasherror": "Ene Fähler es opjetrodde, wi mer di Dattei en der \"stash\" huh aam lahde wohre.",
-       "api-error-stashedfilenotfound": "Di Dattei wohd em \"stash\" nit jefonge, wi mer se vun doh huh lahde wullte.",
-       "api-error-stashpathinvalid": "Di Dattei wohd em \"stash\" nit jefonge, weil dä Pad do hen nit jeschtemmp hät.",
-       "api-error-stashfilestorage": "Ene Fähler es opjetrodd, wi mer di Dattei en der \"stash\" donn wullte.",
-       "api-error-stashzerolength": "Dä ẞööver kunnt di Dattei nit en der \"stash\" donn, weil en dä Dattei nix dren schtund.",
-       "api-error-stashnotloggedin": "Do moß enjelogg sin, öm en Dattei en der \"stash\" huh ze lahde.",
-       "api-error-stashwrongowner": "Di Dattei em \"stash\" woh De draan wells, jehürt Der nit.",
-       "api-error-stashnosuchfilekey": "Di Dattei em \"stash\" woh De draan wells, jidd_et nit.",
+       "api-error-stasherror": "Ene Fähler es opjetrodde, wi mer di Dattei en der Bunker huh aam lahde wohre.",
+       "api-error-stashedfilenotfound": "Di Dattei wohd em Bunker nit jefonge, wi mer se vun doh huh lahde wullte.",
+       "api-error-stashpathinvalid": "Di Dattei wohd em Bunker nit jefonge, weil dä Pad do hen nit jeschtemmp hät.",
+       "api-error-stashfilestorage": "Ene Fähler es opjetrodd, wi mer di Dattei en der Bunker donn wullte.",
+       "api-error-stashzerolength": "Dä ẞööver kunnt di Dattei nit en der Bunker donn, weil en dä Dattei nix dren schtund.",
+       "api-error-stashnotloggedin": "Do moß enjelogg sin, öm huhjelahde Datteije en der Bunker ze donn.",
+       "api-error-stashwrongowner": "Di Dattei em Bunker woh De draan wells, di jehürt Der nit.",
+       "api-error-stashnosuchfilekey": "Dä Schlößel fö_di Dattei, woh De draan wells, em Bunker, di jidd_et nit.",
        "api-error-timeout": "Dä ẞööver hät en dä jewennde Zick nit jeantwoot.",
        "api-error-unclassified": "Ene Fähler es opjetrodde, der mer nit kenne.",
        "api-error-unknown-code": "Nit bekannte Fähler: „$1“",
        "mw-widgets-titleinput-description-redirect": "ömleijde op „$1“",
        "api-error-blacklisted": "Söhk Der ene anndere Nahme uß, dä mih drövver säht.",
        "randomrootpage": "Zofällige Aanfangs-Sigg",
-       "log-action-filter-delete-delete": "En Sigg wohd fott jeschmeße"
+       "log-action-filter-delete-delete": "En Sigg wohd fott jeschmeße",
+       "authmanager-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ es nit ennjedrahre."
 }
index f03072b..b95b31f 100644 (file)
@@ -17,7 +17,8 @@
                        "Bikarhêner",
                        "Uygar",
                        "MikaelF",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Xetekê di bin girêdanê de çêke:",
        "whatlinkshere-prev": "{{PLURAL:$1|yê|$1 yên}} berê",
        "whatlinkshere-next": "{{PLURAL:$1|yê|$1 yên}} din",
        "whatlinkshere-links": "← girêdan",
-       "whatlinkshere-hideredirs": "Beralîkirinan veşêre",
+       "whatlinkshere-hideredirs": "Beralîkirinan $1",
        "whatlinkshere-hidetrans": "Naverokan $1",
-       "whatlinkshere-hidelinks": "Girêdanan veşêre",
-       "whatlinkshere-hideimages": "Girêdanên wêneyan veşêre",
+       "whatlinkshere-hidelinks": "Girêdanan $1",
+       "whatlinkshere-hideimages": "Girêdanên wêneyan $1",
        "whatlinkshere-filters": "Parzûn",
        "block": "Bikarhêner asteng bike",
        "unblock": "Astengkirinê rake",
index f6c6e64..62ed2a3 100644 (file)
@@ -16,7 +16,8 @@
                        "Zinneke",
                        "לערי ריינהארט",
                        "아라",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Linken ënnersträichen:",
@@ -58,7 +59,7 @@
        "tog-ccmeonemails": "Schéck mir eng Kopie vun de Mailen, déi ech anere Benotzer schécken.",
        "tog-diffonly": "Weis bei Versiounsvergläicher just d'Ënnerscheeder an net déi ganz Säit",
        "tog-showhiddencats": "Verstoppt Kategorië weisen",
-       "tog-norollbackdiff": "Ënnerscheed nom Zrécksetzen ënnerdrécken",
+       "tog-norollbackdiff": "Ënnerscheed nom Zrécksetzen net weisen",
        "tog-useeditwarning": "Mech warne wann ech d'Ännerung vun enger Säit verloossen, ouni Ännerunge gespäichert ze hunn",
        "tog-prefershttps": "Ëmmer eng sécher Verbindung benotze wann ageloggt",
        "underline-always": "Ëmmer",
        "noname": "Dir hutt kee gëltege Benotzernumm uginn.",
        "loginsuccesstitle": "Ageloggt",
        "loginsuccess": "'''Dir sidd elo als \"$1\" op {{SITENAME}} ugemellt.'''",
-       "nosuchuser": "Et gëtt kee Benotzernumm mam Numm \"$1\".\nBeim Benotzernumm gëtt tëscht groussen a klenge Buschtawen ënnerscheet (casesensitive).\nKuckt w.e.g. op d'Schreifweis richteg ass, oder [[Special:CreateAccount|maacht en neie Benotzerkont op]].",
+       "nosuchuser": "Et gëtt kee Benotzer mam Numm \"$1\".\nBeim Benotzernumm gëtt tëscht groussen a klenge Buschtawen ënnerscheet (casesensitive).\nKuckt w.e.g. op d'Schreifweis richteg ass, oder [[Special:CreateAccount|maacht en neie Benotzerkont op]].",
        "nosuchusershort": "De Benotzernumm \"$1\" gëtt et net.\nKuckt w.e.g. op d'Schreifweis richteg ass.",
        "nouserspecified": "Gitt w.e.g. e Benotzernumm un.",
        "login-userblocked": "Dëse Benotzer ass gespaart. Aloggen ass net erlaabt.",
        "botpasswords-deleted-body": "D'Botpasswuert fir de Bot-Numm \"$1\" vum Benotzer ''$2'' gouf geläscht.",
        "botpasswords-not-exist": "De Benotzer \"$1\" huet kee Botpasswuert mam Numm \"$2\".",
        "resetpass_forbidden": "Passwierder kënnen net geännert ginn.",
+       "resetpass_forbidden-reason": "Passwierder kënnen net geännert ginn: $1",
        "resetpass-no-info": "Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.",
        "resetpass-submit-loggedin": "Passwuert änneren",
        "resetpass-submit-cancel": "Annulléieren",
        "passwordreset-emailsentusername": "Wann eng E-Mailadress mat dësem Benotzernumm associéiert ass, da gëtt Eng E-Mail fir d'Passwuert zeréckzesetze geschéckt.",
        "passwordreset-emailsent-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
        "passwordreset-emailerror-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de {{GENDER:$2|Benotzer}} konnt se net kréien: $1",
+       "passwordreset-invalideamil": "Net-valabel E-Mail-Adress",
        "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
        "changeemail-header": "Fëllt dëse Formulaire aus fir Är E-Mailadress z'änneren.  Wann Dir d'Verbindung tëscht Ärer E-Mailadress an Ärem Benotzerkont ewechhuele wëllt, da loosst d'Feld e-Mailadress eidel wann Dir de Formulaire späichert.",
        "changeemail-passwordrequired": "Dir musst Äert Passwuert agi fir dës Ännerung ze konfirméieren.",
        "whatlinkshere-prev": "{{PLURAL:$1|vireg|vireg $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|nächsten|nächst $1}}",
        "whatlinkshere-links": "← Linken",
-       "whatlinkshere-hideredirs": "Viruleedunge verstoppen",
-       "whatlinkshere-hidetrans": "Agebonne Schabloune verstoppen",
-       "whatlinkshere-hidelinks": "Linke verstoppen",
-       "whatlinkshere-hideimages": "Linken op Fichiere verstoppen",
+       "whatlinkshere-hideredirs": "$1 Viruleedungen",
+       "whatlinkshere-hidetrans": "Agebonne Schabloune $1",
+       "whatlinkshere-hidelinks": "$1 Linken",
+       "whatlinkshere-hideimages": "$1 Linken op Fichieren",
        "whatlinkshere-filters": "Filteren",
        "whatlinkshere-submit": "Lass",
        "autoblockid": "Automatesch Spär #$1",
        "log-action-filter-rights-rights": "Manuell Ännerung",
        "log-action-filter-rights-autopromote": "Automatesch Ännerung",
        "log-action-filter-upload-upload": "Neien Upload",
-       "log-action-filter-upload-overwrite": "Nees eroplueden"
+       "log-action-filter-upload-overwrite": "Nees eroplueden",
+       "authmanager-authplugin-setpass-failed-title": "Änner vum Passwuert huet net funktionéiert",
+       "authmanager-userdoesnotexist": "De Benotzerkont \"$1\" ass net registréiert.",
+       "authmanager-retype-help": "Passwuert nach eng Kéier fir ze konfirméieren",
+       "authmanager-email-label": "E-Mail",
+       "authmanager-email-help": "E-Mail-Adress",
+       "authmanager-realname-label": "Richtegen Numm",
+       "authmanager-realname-help": "Richtegen Numm vum Benotzer",
+       "authmanager-provider-temporarypassword": "Temporäert Passwuert:",
+       "authprovider-resetpass-skip-label": "Iwwersprangen",
+       "authprovider-resetpass-skip-help": "D'Zrécksetze vum Passwuert iwwersprangen",
+       "specialpage-securitylevel-not-allowed-title": "Net erlaabt",
+       "cannotauth-not-allowed-title": "Erlaabnes refuséiert",
+       "changecredentials-submit": "Änneren",
+       "changecredentials-submit-cancel": "Ofbriechen",
+       "changecredentials-success": "Är Idendifikatiounsinformatioune goufe geännert.",
+       "removecredentials-submit": "Ewechhuelen",
+       "removecredentials-submit-cancel": "Ofbriechen",
+       "credentialsform-account": "Numm vum Kont:",
+       "linkaccounts": "Benotzerkonte verbannen"
 }
index 915a875..377504b 100644 (file)
        "whatlinkshere-links": "← nuorodos",
        "whatlinkshere-hideredirs": "$1 nukreipimus",
        "whatlinkshere-hidetrans": "$1 įtraukimus",
-       "whatlinkshere-hidelinks": "Paslėpti nuorodas",
-       "whatlinkshere-hideimages": "Paslėpti failo nuorodas",
+       "whatlinkshere-hidelinks": "$1 nuorodas",
+       "whatlinkshere-hideimages": "$1 failų nuorodos",
        "whatlinkshere-filters": "Filtrai",
        "whatlinkshere-submit": "Eiti",
        "autoblockid": "Automatinis blokavimas # $1",
index c968a69..1d4966d 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|पहिलुका|पहिलुका $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|अगुलका|अगुलका $1}}",
        "whatlinkshere-links": "← जडीसभ",
-       "whatlinkshere-hideredirs": "$1 à¤\98à¥\81रबà¥\88à¤\8f",
+       "whatlinkshere-hideredirs": "$1 à¤¬à¤¦à¤²à¥\87न à¤¨à¥\81à¤\95ाà¤\8aà¤\81",
        "whatlinkshere-hidetrans": "$1 परागत",
        "whatlinkshere-hidelinks": "$1 सम्बन्ध सभ",
        "whatlinkshere-hideimages": "$1 फाइल जडी सभ",
index accb759..f889a84 100644 (file)
@@ -17,7 +17,8 @@
                        "아라",
                        "Milicevic01",
                        "Macofe",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Потцртување на врски:",
@@ -35,6 +36,7 @@
        "tog-watchdefault": "Додавај ги страниците и податотеките што ги уредувам во набљудуваните",
        "tog-watchmoves": "Додавај ги страниците и податотеките што ги преместувам во набљудуваните",
        "tog-watchdeletion": "Додавај ги страниците и податотеките што ги бришам во набљудуваните",
+       "tog-watchuploads": "Ставај ги податотеките што ги подигам во набљудуваните",
        "tog-watchrollback": "Додај ги страниците сум ги отповикал во набљудувани",
        "tog-minordefault": "Обележувај ги сите уредувања како ситни по основно",
        "tog-previewontop": "Прикажи го прегледот пред кутијата за уредување",
@@ -59,7 +61,7 @@
        "tog-ccmeonemails": "Испраќај ми мои примероци од писмата што ги праќам на другите корисници",
        "tog-diffonly": "Не ја покажувај содржината на страницата под разликите",
        "tog-showhiddencats": "Прикажи скриени категории",
-       "tog-norollbackdiff": "Ð\98зоÑ\81Ñ\82ави Ñ\98а разликата по извршено отповикување",
+       "tog-norollbackdiff": "Ð\9dе Ñ\98а Ð¿Ð¾ÐºÐ°Ð¶Ñ\83ваÑ\98 разликата по извршено отповикување",
        "tog-useeditwarning": "Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените",
        "tog-prefershttps": "Секогаш најавувај ме преку безбедна врска",
        "underline-always": "Секогаш",
        "password-change-forbidden": "Не можете да ја менувате лозинката на ова вики.",
        "externaldberror": "Настана грешка при надворешното најавување на базата или пак немате дозвола да ја подновите вашата надворешна сметка.",
        "login": "Најава",
+       "login-security": "Потврдете го вашиот идентитет",
        "nav-login-createaccount": "Најава / направи сметка",
        "userlogin": "Најава / направи сметка",
        "userloginnocreate": "Најава",
        "userlogin-resetpassword-link": "Ја заборавивте лозинката?",
        "userlogin-helplink2": "Помош за најава",
        "userlogin-loggedin": "Веќе сте најавени како {{GENDER:$1|$1}}.\nСо образецот подолу можете да се најавите како друг корисник.",
+       "userlogin-reauth": "Ќе мора да се најавите повторно за да потврдите дека сте {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Направи нова сметка",
        "createacct-emailrequired": "Е-пошта",
        "createacct-emailoptional": "Е-пошта (незадолжително)",
        "createacct-email-ph": "Внесете е-пошта",
        "createacct-another-email-ph": "Внесете е-пошта",
        "createaccountmail": "Дај привремена произволна лозинка и испрати ја на укажаната адреса",
+       "createaccountmail-help": "Може да се користи за создавање на сметка во туѓо име без да ја знаете лозинката.",
        "createacct-realname": "Вистинско име (незадолжително)",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зошто правите друга сметка",
+       "createacct-reason-help": "Порака што се прикажува во дневникот на создадени сметки",
        "createacct-submit": "Направи ја",
        "createacct-another-submit": "Создај сметка",
+       "createacct-continue-submit": "Продолжи со создавањето на сметката",
+       "createacct-another-continue-submit": "Продолжи со создавањето на сметката",
        "createacct-benefit-heading": "{{SITENAME}} е дело на луѓе како вас.",
        "createacct-benefit-body1": "{{PLURAL:$1|уредување|уредувања}}",
        "createacct-benefit-body2": "{{PLURAL:$1|страница|страници}}",
        "nocookieslogin": "{{SITENAME}} користи колачиња за најавување на корисници.\nВие го имате оневозможено користењето на колачиња на вашиот прелистувач.\nВе молиме активирајте ги и обидете се повторно.",
        "nocookiesfornew": "Корисничката сметка не е создадена бидејќи не можеше да се потврди нејзиниот извор.\nЗа оваа цел ќе ви требаат колачиња. Проверете дали се овозможени, превчитајте ја страницава и обидете се повторно.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Сметката е успешно создадена но не можев да ве најавам автоматски. Појдеете да се [[Special:UserLogin|најавите рачно]].",
        "noname": "Внесовте погрешно корисничко име.",
        "loginsuccesstitle": "Најавени сте",
        "loginsuccess": "Сега сте најавени на {{SITENAME}} како „$1“.",
        "createacct-another-realname-tip": "Вистинското име е незадолжително.\nДоколку изберете да го внесете, тоа може да се искористи за оддавање на заслуги за Вашата работа.",
        "pt-login": "Најава",
        "pt-login-button": "Најава",
+       "pt-login-continue-button": "Продолжи со најавата",
        "pt-createaccount": "Направи сметка",
        "pt-userlogout": "Одјава",
        "php-mail-error-unknown": "Непозната грешка во функцијата mail() на PHP",
        "listgrouprights-namespaceprotection-header": "Ограничувања за именски простори",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "listgrouprights-namespaceprotection-restrictedto": "Права што им овозможуваат на корисниците да уредуваат",
-       "listgrants-summary": "Ова е список на доделувања на OAuth, секое со своите права. Корисниците можат да овластуваат извршници што ќе ги користат сметки, но со ограничувања во дозволите што им се доделени. Покрај ова, извршникот што делува во име на корисникот е ограничен на нештата на кои има права самиот корисник.\nМоже да најдете [[{{MediaWiki:Listgrouprights-helppage}}|уште информации]] за поединечните права.",
+       "listgrants": "Доделувања",
+       "listgrants-summary": "Ова е список на доделувања, секое со своите права. Корисниците можат да овластуваат извршници што ќе ги користат сметки, но со ограничувања во дозволите што им се доделени. Покрај ова, извршникот што делува во име на корисникот е ограничен на нештата на кои има права самиот корисник.\nМоже да најдете [[{{MediaWiki:Listgrouprights-helppage}}|уште информации]] за поединечните права.",
        "listgrants-grant": "Доделување",
        "listgrants-rights": "Права",
        "trackingcategories": "Следечки категории",
        "delete-toobig": "Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|преработка|преработки}}.\nБришењето на ваквии страници е забрането со цел {{SITENAME}} да се заштити од оштетувања.",
        "delete-warning-toobig": "Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|преработка|преработки}}.\nБришењето може да предизвика проблеми при работењето на базата на податоци на {{SITENAME}};\nпродолжете доколку сте сигруни дека треба тоа да го сторите.",
        "deleteprotected": "Не можете да ја избришете страницава бидејќи е заштитена.",
-       "deleting-backlinks-warning": "'''Предупредување:''' До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.",
+       "deleting-backlinks-warning": "<strong>Предупредување:</strong>  До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.",
        "rollback": "Отповикај промени",
        "rollbacklink": "отповикај",
        "rollbacklinkcount": "отповикај $1 {{PLURAL:$1|уредување|уредувања}}",
        "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": "Дневник на измени во содржинските модели",
        "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": "отповикај",
        "whatlinkshere-prev": "{{PLURAL:$1|претходна|претходни $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|следна|следни $1}}",
        "whatlinkshere-links": "← врски",
-       "whatlinkshere-hideredirs": "Скриј пренасочувања",
-       "whatlinkshere-hidetrans": "Скриј превметнувања",
-       "whatlinkshere-hidelinks": "Скриј врски",
-       "whatlinkshere-hideimages": "$1 врски кон податотека",
+       "whatlinkshere-hideredirs": "$1 пренасочувања",
+       "whatlinkshere-hidetrans": "$1 превметнувања",
+       "whatlinkshere-hidelinks": "$1 врски",
+       "whatlinkshere-hideimages": "$1 врски кон податотеката",
        "whatlinkshere-filters": "Филтри",
        "whatlinkshere-submit": "Дај",
        "autoblockid": "Автоблок бр. $1",
        "ipb-unblock": "Одблокирај корисник или IP-адреса",
        "ipb-blocklist": "Преглед на активни блокирања",
        "ipb-blocklist-contribs": "Придонеси на {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "{{PLURAL:$1|преостанува уште $1|преостануваат уште $1}}",
        "unblockip": "Деблокирај корисник",
        "unblockiptext": "Користете го долниот образец да го вратите правото на пишување на претходно блокирана IP-адреса или корисничко име.",
        "ipusubmit": "Избриши го ова блокирање",
        "block-log-flags-hiddenname": "сокриено корисничко име",
        "range_block_disabled": "Администраторската можност да блокираат IP групи е исклучена.",
        "ipb_expiry_invalid": "Погрешен рок на истекување.",
+       "ipb_expiry_old": "Времето на истекување е постаро од тековното време.",
        "ipb_expiry_temp": "Скриените блокирања на корисникот мора да бидат перманентни.",
        "ipb_hide_invalid": "Оваа сметка не може да се потисне; има {{PLURAL:$1|повеќе од едно уредување|преку $1 уредувања}}..",
        "ipb_already_blocked": "„$1“ е веќе блокиран",
        "lockdbsuccesstext": "Базата е заклучена. <br />\nСетете се да ја [[Special:UnlockDB|отклучите]] кога ќе завршите со нејзиното одржување.",
        "unlockdbsuccesstext": "Базата е отклучена.",
        "lockfilenotwritable": "Податотеката за заклучување на базата не е отворена за пишување.\nЗа да ја заклучите или отклучите базата, податотеката мора да биде достапна за пишување од страна на семрежниот опслужувач.",
+       "databaselocked": "Базата е веќе заклучена.",
        "databasenotlocked": "Базата не е заклучена.",
        "lockedbyandtime": "(од $1 на $2 цо $3 ч.)",
        "move-page": "Премести $1",
        "tags-edit-revision-legend": "Додајте или отстранете ознаки од {{PLURAL:$1|преработкава|сите $1 преработки}}",
        "tags-edit-logentry-legend": "Додајте или отстранете ознаки од {{PLURAL:$1|овој дневнички запис|сите $1 дневнички записи}}",
        "tags-edit-existing-tags": "Постоечки ознаки",
-       "tags-edit-existing-tags-none": "''нема''",
+       "tags-edit-existing-tags-none": "<em>Нема</em>",
        "tags-edit-new-tags": "Нови ознаки:",
        "tags-edit-add": "Додај ги следниве ознаки:",
        "tags-edit-remove": "Отстрани ги следниве ознаки:",
        "tags-edit-reason": "Причина:",
        "tags-edit-revision-submit": "Примени измени врз {{PLURAL:$1|преработкава|$1 преработки}}",
        "tags-edit-logentry-submit": "Примени измени врз {{PLURAL:$1|овој дневнички запис|$1 дневнички записи}}",
-       "tags-edit-success": "Измените се успешно применети.",
+       "tags-edit-success": "Измените се применети.",
        "tags-edit-failure": "Не можев да ги применам измените:\n$1",
        "tags-edit-nooldid-title": "Неважечка целна преработка",
        "tags-edit-nooldid-text": "Немате укажано целна преработка врз која би се примениле измените, или пак укажаната преработка не постои.",
        "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-rights-rights": "$1 {{GENDER:$2|го измени}} групното членство на $3 од $4 во $5",
+       "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",
index cbf66c4..5b263ea 100644 (file)
        "password-change-forbidden": "Nun se ponno cagnà 'e password ncopp'a sta wiki.",
        "externaldberror": "Ce sta n'errore ch' 'e server d'autenticazione esterno, o pure nun v'è permesso accedere all'aghiurnamento d' 'o cunto sterno vuosto.",
        "login": "Tràse",
+       "login-security": "Cunferma l'identità",
        "nav-login-createaccount": "Trasite o criate n'acciesso nuovo",
        "userlogin": "Trasite o criate n'acciesso nuovo",
        "userloginnocreate": "Tràse",
        "userlogin-resetpassword-link": "Te sì scurdat' 'a password?",
        "userlogin-helplink2": "Aiuto cu l'accieso",
        "userlogin-loggedin": "Sì già {{GENDER:$1|connesso comme $1|connessa comme $1|connesso/a comme $1}}.\nUsa 'o modulo ccà abbascio pe trasì com'a n'atu utente.",
+       "userlogin-reauth": "Avit'a trasì n'ata vota pe' puté cuntrullà ca site overo {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crèa n'at'account",
        "createacct-emailrequired": "Indirizzo email",
        "createacct-emailoptional": "Indirizzo 'e posta elettronica (ozzionale)",
        "createacct-email-ph": "Scrivite 'o nderizzo mail vuosto",
        "createacct-another-email-ph": "Scrivite nderizzo mail",
        "createaccountmail": "Usa na password qualunque temporanea e manna sta password a l'indirizzo 'e posta e-mail specificato",
+       "createaccountmail-help": "Se putess'ausà pe' puté crià nu cunto pe' n'ata perzona senza mparà 'a password.",
        "createacct-realname": "Nomme riale (ozzionale)",
        "createaccountreason": "Mutivo:",
        "createacct-reason": "Mutivo",
        "createacct-reason-ph": "Pecché staje crianno n'at'utenza",
+       "createacct-reason-help": "Mmasciata mmustata dint'o riggistro 'e criazion' 'e cunte",
        "createacct-submit": "Crèa 'o cunto utente vuosto",
        "createacct-another-submit": "Crèa nu cunto",
+       "createacct-continue-submit": "Và avanti c' 'a criazion' 'e cunte",
+       "createacct-another-continue-submit": "Và avanti c' 'a criazion' 'e cunte",
        "createacct-benefit-heading": "{{SITENAME}} è fatta 'e perzone comme te.",
        "createacct-benefit-body1": "{{PLURAL:$1|càgnamiento|càgnamiente}}",
        "createacct-benefit-body2": "{{PLURAL:$1|paggena|paggene}}",
        "createacct-another-realname-tip": "'O nomme overo vuosto è ozzionale.\nSi sciglite 'e nzertà 'o nomme overo, chesto s'ausarrà pe' dà l'utente l'attribuzione d' 'a fatica fatta.",
        "pt-login": "Tràse",
        "pt-login-button": "Tràse",
+       "pt-login-continue-button": "Và annanze e tràse",
        "pt-createaccount": "Crèa nu cunto nuovo",
        "pt-userlogout": "Jèsce",
        "php-mail-error-unknown": "Errore scanusciuto dint'a funzione PHP mail()",
        "botpasswords-invalid-name": "'O nomme utente nnecato nun cuntenesse nu spartetóre 'e bot password (\"$1\").",
        "botpasswords-not-exist": "L'utente \"$1\" nun téne na password bot chiammata \"$2\".",
        "resetpass_forbidden": "'E password nun se ponno cagnà",
+       "resetpass_forbidden-reason": "'E password nun se ponno cagnà: $1",
        "resetpass-no-info": "Avite 'a trasì ('o login) pe ffà l'acciesso a sta paggena direttamente.",
        "resetpass-submit-loggedin": "Cagna password",
        "resetpass-submit-cancel": "Canciella",
index 49d1068..bb347df 100644 (file)
        "errorpagetitle": "Foutmelding",
        "returnto": "Weerumme naor $1.",
        "tagline": "Van {{SITENAME}}",
-       "help": "Hulpe en kontakt",
+       "help": "Hulpe",
        "search": "Zeuken",
        "searchbutton": "Zeuken",
        "go": "Artikel",
        "disclaimers": "Veurbehold",
        "disclaimerpage": "Project:Veurbehoud",
        "edithelp": "Hulpe mit bewarken",
+       "helppage-top-gethelp": "Hulpe",
        "mainpage": "Veurblad",
        "mainpage-description": "Veurblad",
        "policy-url": "Project:Beleid",
        "viewsourcetext": "Je kunnen de brontekste van disse zied bewarken en bekieken.",
        "viewyourtext": "Je kunnen <strong>joew bewarkingen</strong> an de brontekste van disse zied bekieken en kopiëren.",
        "protectedinterface": "Op disse zied steet tekste die gebruukt wördt veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.\nUm vertalingen veur alle wiki's derbie te zetten of te wiezigen, gebruuk [//translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
-       "editinginterface": "<strong>Waorschuwing:</strong> je bewarken n zied die gebruukt wörden deur de programmatuur. Wa'j hier wiezigen, is van invleud op de hele wiki. Um vertalingen derbie te zetten of te wiezigen veur alle wiki's, gebruuk [//translatewiki.net/wiki/Main_Page?setlang=nds-nl translatewiki.net], t vertalingsprojekt veur MediaWiki.",
+       "editinginterface": "<strong>Waorschuwing:</strong> je bewarken n zied die gebruukt wördt deur de programmatuur. \nWa'j disse zied wiezigen is van invleud op t gebrukersuterlik veur aander gebrukers van disse wiki.",
+       "translateinterface": "Um vertalingen veur alle wiki's te doon of te wiezigen ku'j gebruukmaken van [//translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
        "cascadeprotected": "Disse zied is beveiligd umdat t veurkömp in de volgende {{PLURAL:$1|zied|ziejen}}, die beveiligd {{PLURAL:$1|is|bin}} mit de \"kaskade\"-opsie:\n$2",
        "namespaceprotected": "Je maggen gien ziejen in de '''$1'''-naamruumte bewarken.",
        "customcssprotected": "Je kunnen disse CSS-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.",
        "preview": "Naokieken",
        "showpreview": "Bewarking naokieken",
        "showdiff": "Verschil bekieken",
+       "blankarticle": "<strong>Waorschuwing:</strong> de zied die'j anmaken willen is leeg.\nA'j noen weer op \"{{int:savearticle}}\" klikken, dan wördt de zied an-emaakt zonder enige inhoud.",
        "anoneditwarning": "<strong>Waorschuwing:</strong> je bin niet an-emeld.\nJoew IP-adres zal op-esleugen wörden a'j wiezigingen op disse zied anbrengen. A'j je eigen <strong>[$1 anmelden]</strong> of <strong>[$2 inschrieven]</strong> dan koemen joew bewarkingen onder joew gebrukersnaam te staon, samen mit aandere veurdelen.",
        "anonpreviewwarning": "''Je bin niet an-emeld.''\n''Deur de bewarking op te slaon wörden joew IP-adres op-esleugen in de ziedgeschiedenisse.''",
        "missingsummary": "'''Herinnering:''' je hebben gien samenvatting op-egeven veur de bewarking. A'j noen weer op ''Opslaon'' klikken wörden de bewarking zonder samenvatting op-esleugen.",
        "powersearch-togglelabel": "Selekteren:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Gien",
+       "powersearch-remember": "Keuze onthouwen veur toekomstige zeukopdrachten",
        "search-external": "Extern zeuken",
        "searchdisabled": "Zeuken in {{SITENAME}} is niet meugelik. Je kunnen gebruukmaken van Google. De gegevens over {{SITENAME}} bin misschien niet bie-ewörken.",
        "search-error": "Der is wat mis-egaon bie t zeuken: $1",
        "exbeforeblank": "veurdat disse zied leegemaakt wörden stung hier: '$1'",
        "delete-confirm": "\"$1\" vortdoon",
        "delete-legend": "Vortdoon",
-       "historywarning": "'''Waorschuwing''': de zied die'j vortdoon, hef $1 {{PLURAL:$1|versie|versies}}:",
+       "historywarning": "'''Waorschuwing''': de zied die'j vortdoon willen, hef $1 {{PLURAL:$1|versie|versies}}:",
        "historyaction-submit": "Bekiek",
        "confirmdeletetext": "Je staon op t punt n zied en de geschiedenisse dervan vort te doon.\nBevestig hieronder dat dit inderdaod de bedoeling is, da'j de gevolgen begriepen en dat t akkedeert mit t [[{{MediaWiki:Policy-url}}|beleid]].",
        "actioncomplete": "Uutevoerd",
        "delete-edit-reasonlist": "Redens veur t vortdoon bewarken",
        "delete-toobig": "Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.\nt Vortdoon van dit soort ziejen is mit rechten bepark um t per ongelok versteuren van de warking van {{SITENAME}} te veurkoemen.",
        "delete-warning-toobig": "Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.\nWoart je: t vortdoon van disse zied kan de warking van de databanke van {{SITENAME}} versteuren.\nWees veurzichtig",
+       "deleting-backlinks-warning": "<strong>Waorschuwing:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|aandere ziejen]] gebruken of verwiezen naor de zied die'j vortdoon willen.",
        "rollback": "Wiezigingen herstellen",
        "rollbacklink": "weerummedreien",
        "rollbacklinkcount": "{{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien",
        "whatlinkshere-prev": "{{PLURAL:$1|veurige|veurige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|volgende|volgende $1}}",
        "whatlinkshere-links": "← verwiezingen",
-       "whatlinkshere-hideredirs": "$1 deurverwiezingen",
-       "whatlinkshere-hidetrans": "$1 in-evoegden mallen",
-       "whatlinkshere-hidelinks": "$1 verwiezingen",
+       "whatlinkshere-hideredirs": "Redirects $1",
+       "whatlinkshere-hidetrans": "Vörlageninbinnungen $1",
+       "whatlinkshere-hidelinks": "Lenken $1",
        "whatlinkshere-hideimages": "$1 bestaandsverwiezingen",
        "whatlinkshere-filters": "Filters",
        "autoblockid": "Automatiese blokkering #$1",
index aa9052c..abe72dc 100644 (file)
        "actions": "Akschonen",
        "namespaces": "Naamrüüm",
        "variants": "Varianten",
+       "navigation-heading": "Navigatschoonsmenü",
        "errorpagetitle": "Fehler",
        "returnto": "Trüch to $1.",
        "tagline": "Vun {{SITENAME}}",
        "newarticle": "(Nee)",
        "newarticletext": "Du büst op en Sied kamen, de dat noch nich gifft.\nWenn du disse Sied opstellen wullt, schriev dien Text in dat Finster ünnen  (kiek op de [$1 Hülpsied] för mehr Infos).\nWenn du de Sied gornich ännern wullst, denn klick op den '''Trügg'''-Knoop in dien Webkieker.",
        "anontalkpagetext": "---- ''Dit is de Diskuschoonssiet vun en nich anmellt Bruker, de noch keen Brukerkonto anleggt hett oder dat jüst nich bruukt.\nWi mööt hier de numerische IP-Adress verwennen, üm den Bruker to identifizeern.\nSo en Adress kann vun verscheden Brukern bruukt warrn.\nWenn du en anonymen Bruker büst un meenst, dat disse Kommentaren nich an di richt sünd, denn [[Special:CreateAccount|legg di en Brukerkonto an]] oder [[Special:UserLogin|mell di an]], dat dat Problem nich mehr dor is.''",
-       "noarticletext": "Dor is opstunns keen Text op disse Sied. Du kannst [[Special:Search/{{PAGENAME}}|na dissen Utdruck in annere Sieden söken]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} in de Logböker söken],\noder [{{fullurl:{{FULLPAGENAME}}|action=edit}} disse Sied ännern]</span>.",
+       "noarticletext": "Dor is opstunns keen Text op disse Siet. \nDu kannst [[Special:Search/{{PAGENAME}}|na dissen Utdruck in annere Sieden söken]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} in de Logböker söken], oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} disse Siet ännern]</span>.",
        "noarticletext-nopermission": "Disse Sied hett opstunns keen Text.\nDu kannst in annere Sieden [[Special:Search/{{PAGENAME}}|na dissen Titel söken]]\noder <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} in de Logböker söken]</span>, man du hest nich dat Recht, de Sied optostellen.",
        "userpage-userdoesnotexist": "Dat Brukerkonto „<nowiki>$1</nowiki>“ gifft dat noch nich. Överlegg, wat du disse Siet würklich nee opstellen/ännern wullt.",
        "userpage-userdoesnotexist-view": "Dat Brukerkonto „$1“ gifft dat nich.",
        "session_fail_preview_html": "'''Deit uns leed! Wi kunnen dien Ännern nich spiekern, de Sitzungsdaten sünd verloren gahn.'''\n\n''In {{SITENAME}} is dat Spiekern vun rein HTML verlöövt, dorvun is de Vörschau utblennt, dat JavaScript-Angrepen nich mööglich sünd.''\n\n'''Versöök dat noch wedder un klick noch wedder op „Siet spiekern“. Wenn dat Problem noch jümmer dor is, [[Special:UserLogout|mell di af]] un denn wedder an.'''",
        "token_suffix_mismatch": "'''Dien Ännern sünd afwiest worrn. Dien Browser hett welk Teken in de Kuntrull-Tekenreeg kaputt maakt.\nWenn dat so spiekert warrt, kann dat angahn, dat noch mehr Teken in de Sied kaputt gaht.\nDat kann to’n Bispeel dor vun kamen, dat du en anonymen Proxy-Deenst bruukst, de wat verkehrt maakt.'''",
        "editing": "Ännern vun $1",
+       "creating": "Opstellen vun $1",
        "editingsection": "Ännern vun $1 (Afsatz)",
        "editingcomment": "Ännern vun $1 (nee Afsnidd)",
        "editconflict": "Konflikt bi’t Sied ännern: $1",
        "currentrev": "Aktuelle Version",
        "currentrev-asof": "Aktuelle Version vun’n $1",
        "revisionasof": "Version vun $1",
-       "revision-info": "Verschoon vun'n $4, Klock $5 vun $2",
+       "revision-info": "Verschoon vun'n $4, Klock $5 vun {{GENDER:$6|$2}}$7",
        "previousrevision": "Nächstöllere Version→",
        "nextrevision": "Ne’ere Version →",
        "currentrevisionlink": "aktuelle Version",
        "shown-title": "Wies $1 {{PLURAL:$1|Resultat|Resultaten}} per Sied",
        "viewprevnext": "Wies ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "* Sied '''[[$1]]'''",
-       "searchmenu-new": "'''Stell de Sied „[[:$1]]“ in dit Wiki nee op!'''",
+       "searchmenu-new": "<strong>Stell de Siet „[[:$1]]“ in dit Wiki nee op!</strong> {{PLURAL:$2|0=|Süh ok de Siet mit dien Sökresultat.|Süh ok de funnen Sökresultaten.}}",
        "searchprofile-articles": "Inholdsieden",
        "searchprofile-images": "Datein",
        "searchprofile-everything": "Allens",
        "powersearch-togglelabel": "Utwählen:",
        "powersearch-toggleall": "All",
        "powersearch-togglenone": "Keen",
+       "powersearch-remember": "Utwahl för latere sökanfragen marken",
        "search-external": "Externe Söök",
        "searchdisabled": "<p>De Vulltextsöök is wegen Överlast en Stoot deaktiveert. In disse Tied kannst du disse Google-Söök verwennen,\nde aver nich jümmer den aktuellsten Stand weerspegelt.<p>",
        "preferences": "Instellen",
        "action-userrights-interwiki": "de Rechten vun Brukers op annere Wikis to ännern",
        "action-siteadmin": "de Datenbank to sperren oder freetogeven",
        "nchanges": "{{PLURAL:$1|Een Ännern|$1 Ännern}}",
+       "enhancedrc-history": "Historie",
        "recentchanges": "Toletzt ännert",
        "recentchanges-legend": "Optionen för toletzt ännert",
        "recentchanges-summary": "Op disse Sied warrt de Sieden wiest, de toletzt ännert worrn sünd.",
        "recentchanges-label-minor": "Dat is en lütte Ännern",
        "recentchanges-label-bot": "Düsse Ännern worr maakt vun en Bot",
        "recentchanges-label-unpatrolled": "Düsse Ännern is noch nich kontrolleert worrn",
+       "recentchanges-label-plusminus": "Disse Siedengrött is mit dit Antall Bytes ännert",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (süh ok de [[Special:NewPages|List mit ne'e Sieden]])",
        "rcnotefrom": "Dit sünd de Ännern siet <b>$2</b> (bet to <b>$1</b> wiest).",
        "rclistfrom": "Wies ne’e Ännern siet $3 $2",
-       "rcshowhideminor": "$1 lütte Ännern",
-       "rcshowhidebots": "$1 Bots",
-       "rcshowhideliu": "$1 inloggte Brukers",
-       "rcshowhideanons": "$1 anonyme Brukers",
+       "rcshowhideminor": "lütte Ännern $1",
+       "rcshowhideminor-show": "wiesen",
+       "rcshowhideminor-hide": "versteken",
+       "rcshowhidebots": "Bots $1",
+       "rcshowhidebots-show": "wiesen",
+       "rcshowhidebots-hide": "versteken",
+       "rcshowhideliu": "registreerte Brukers $1",
+       "rcshowhideliu-show": "wiesen",
+       "rcshowhideliu-hide": "versteken",
+       "rcshowhideanons": "anonyme Brukers $1",
+       "rcshowhideanons-show": "wiesen",
+       "rcshowhideanons-hide": "versteken",
        "rcshowhidepatr": "$1 nakekene Ännern",
-       "rcshowhidemine": "$1 miene Ännern",
+       "rcshowhidepatr-show": "wiesen",
+       "rcshowhidepatr-hide": "versteken",
+       "rcshowhidemine": "miene Ännern $1",
+       "rcshowhidemine-show": "wiesen",
+       "rcshowhidemine-hide": "versteken",
+       "rcshowhidecategorization": "kategoriserung vun Sieden $1",
        "rclinks": "Wies de letzten '''$1''' Ännern vun de letzten '''$2''' Daag. ('''N''' - Ne’e Sieden; '''L''' - Lütte Ännern)<br />$3",
        "diff": "Ünnerscheed",
        "hist": "Versionen",
        "hide": "Nich wiesen",
-       "show": "Wiesen",
+       "show": "wiesen",
        "minoreditletter": "L",
        "newpageletter": "N",
        "boteditletter": "B",
        "pager-older-n": "{{PLURAL:$1|vörige|vörige $1}}",
        "suppress": "Oversight",
        "apisandbox-examples": "Bispeel",
-       "apisandbox-results": "Resultat",
+       "apisandbox-results": "Resultaten",
        "booksources": "Bookhannel",
        "booksources-search-legend": "Na Böker bi Bookhökers söken",
        "booksources-search": "Söken",
        "wlheader-showupdated": "Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
        "wlnote": "Ünnen {{PLURAL:$1|steiht de letzte Ännern|staht de letzten $1 Ännern}} vun de {{PLURAL:$2|letzte Stünn|letzten '''$2''' Stünnen}}.",
        "wlshowlast": "Wies de letzten $1 Stünnen $2 Daag",
+       "watchlist-hide": "Versteken",
        "watchlist-options": "Optionen för de Oppasslist",
        "watching": "warrt op de Oppasslist ropsett...",
        "unwatching": "warrt vun de Oppasslist rünnernahmen...",
        "undelete-show-file-submit": "Jo",
        "namespace": "Naamruum:",
        "invert": "Utwahl ümkehren",
+       "namespace_association": "Tohörige Naamruum",
        "blanknamespace": "(Hööft-)",
-       "contributions": "Bidrääg vun den Bruker",
+       "contributions": "Bidrääg vun den {{GENDER:$1|Bruker}}",
        "contributions-title": "Brukerbidrääg vun „$1“",
        "mycontris": "Mien Arbeid",
        "contribsub2": "För $1 ($2)",
        "whatlinkshere-prev": "{{PLURAL:$1|vörige|vörige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|nächste|nächste $1}}",
        "whatlinkshere-links": "← Lenken",
-       "whatlinkshere-hideredirs": "Redirects $1",
-       "whatlinkshere-hidetrans": "Vörlageninbinnungen $1",
-       "whatlinkshere-hidelinks": "Lenken $1",
-       "whatlinkshere-hideimages": "Dateilenken $1",
+       "whatlinkshere-hideredirs": "$1 deurverwiezingen",
+       "whatlinkshere-hidetrans": "$1 in-evoegden mallen",
+       "whatlinkshere-hidelinks": "$1 verwiezingen",
+       "whatlinkshere-hideimages": "$1 bestaandsverwiezingen",
        "whatlinkshere-filters": "Filters",
        "autoblockid": "Autoblock #$1",
        "block": "Bruker blocken",
        "importlogpagetext": "Administrativen Import vun Sieden mit Versionsgeschicht vun annere Wikis.",
        "import-logentry-upload-detail": "{{PLURAL:$1|ene Version|$1 Versionen}}",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|ene Version|$1 Versionen}} vun $2",
-       "tooltip-pt-userpage": "Dien Brukersied",
+       "tooltip-pt-userpage": "{{GENDER:|Dien}} Brukersiet",
        "tooltip-pt-anonuserpage": "De Brukersiet för de IP-Adress ünner de du schriffst",
-       "tooltip-pt-mytalk": "Dien Diskuschoonssied",
+       "tooltip-pt-mytalk": "{{GENDER:|Dien}} Diskuschoonssiet",
        "tooltip-pt-anontalk": "Diskuschoon över Ännern vun disse IP-Adress",
-       "tooltip-pt-preferences": "Mien Instellen",
+       "tooltip-pt-preferences": "{{GENDER:|Dien}} Instellen",
        "tooltip-pt-watchlist": "Mien Oppasslist",
-       "tooltip-pt-mycontris": "List vun dien Bidrääg",
+       "tooltip-pt-mycontris": "List vun {{GENDER:|dien}} Bidrääg",
        "tooltip-pt-login": "Du kannst di geern anmellen, dat is aver nich nödig, dat du Sieden ännern kannst.",
        "tooltip-pt-logout": "Afmellen",
        "tooltip-ca-talk": "Diskuschoon över disse Siet",
-       "tooltip-ca-edit": "Du kannst disse Siet ännern. Bruuk dat vör dat Spiekern.",
+       "tooltip-ca-edit": "Disse Siet ännern",
        "tooltip-ca-addsection": "En Afsnidd tofögen",
        "tooltip-ca-viewsource": "Disse Siet is schuult. Du kannst den Borntext ankieken.",
        "tooltip-ca-history": "Historie vun disse Siet.",
        "tooltip-t-recentchangeslinked": "Verlinkte Sieden",
        "tooltip-feed-rss": "RSS-Feed för disse Siet",
        "tooltip-feed-atom": "Atom-Feed för disse Siet",
-       "tooltip-t-contributions": "List vun de Bidreeg vun dissen Bruker",
+       "tooltip-t-contributions": "List vun de Bidrääg vun {{GENDER:$1|dissen Bruker}}",
        "tooltip-t-emailuser": "Dissen Bruker en E-Mail tostüren",
        "tooltip-t-upload": "Biller oder Mediendatein hoochladen",
        "tooltip-t-specialpages": "List vun alle Spezialsieden",
        "tooltip-ca-nstab-main": "Siet ankieken",
        "tooltip-ca-nstab-user": "Brukersiet ankieken",
        "tooltip-ca-nstab-media": "Mediensiet ankieken",
-       "tooltip-ca-nstab-special": "Dit is en Spezialsiet, du kannst disse Siet nich ännern.",
+       "tooltip-ca-nstab-special": "Dit is en Spezialsiet un kann nich ännert worrn.",
        "tooltip-ca-nstab-project": "Portalsiet ankieken",
        "tooltip-ca-nstab-image": "Bildsiet ankieken",
        "tooltip-ca-nstab-mediawiki": "Systemnarichten ankieken",
        "spambot_username": "MediaWiki Spam-Oprümen",
        "spam_reverting": "Trüchdreiht na de letzte Version ahn Lenken na $1.",
        "spam_blanking": "All Versionen harrn Lenken na $1, rein maakt.",
-       "simpleantispam-label": "Antispam-Kuntrull. Hier '''nix''' indragen!",
+       "simpleantispam-label": "Antispam-Kuntrull. \nHier '''nix''' indragen!",
        "pageinfo-title": "Informatschoon för \"$1\"",
        "pageinfo-article-id": "Sied-ID",
+       "pageinfo-toolboxlink": "Sieteninformatschonen",
        "pageinfo-redirectsto-info": "Info",
        "pageinfo-contentpage-yes": "Jo",
        "pageinfo-protect-cascading-yes": "Jo",
        "file-info-size": "$1 × $2 Pixel, Grött: $3, MIME-Typ: $4",
        "file-nohires": "Gifft dat Bild nich grötter.",
        "svg-long-desc": "SVG-Datei, Utgangsgrött: $1 × $2 Pixel, Dateigrött: $3",
-       "show-big-image": "Dat Bild wat grötter",
+       "show-big-image": "Originaldatei",
        "show-big-image-size": "$1 × $2 Pixels",
        "file-info-gif-looped": "löppt as Slööp",
        "file-info-gif-frames": "$1 {{PLURAL:$1|Bild|Biller}}",
        "htmlform-selectorother-other": "Annere",
        "sqlite-has-fts": "$1 mit Stöhn för Vulltext-Söök",
        "sqlite-no-fts": "$1 ahn Stöhn för Vulltext-Söök",
+       "logentry-delete-delete": "$1 {{GENDER:$2|wegsmeten}} Siet $3",
        "revdelete-restricted": "Inschränkungen för Administraters instellt",
        "revdelete-unrestricted": "Inschränkungen för Administraters rutnahmen",
        "logentry-block-block": "$1 {{GENDER:$2|block}} {{GENDER:$4|$3}} för en Tiedruum vun $5 $6",
index 172abe7..4520927 100644 (file)
        "userlogin-resetpassword-link": "Wachtwoord vergeten?",
        "userlogin-helplink2": "Hulp bij aanmelden",
        "userlogin-loggedin": "U bent al aangemeld als {{GENDER:$1|$1}}.\nGebruik het onderstaande formulier om aan te melden als een andere gebruiker.",
+       "userlogin-reauth": "U moet opnieuw inloggen om te bevestigen dat u {{GENDER:$1|$1}} bent.",
        "userlogin-createanother": "Een andere account registreren",
        "createacct-emailrequired": "E-mailadres",
        "createacct-emailoptional": "E-mailadres (optioneel)",
        "whatlinkshere-prev": "{{PLURAL:$1|vorige|vorige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|volgende|volgende $1}}",
        "whatlinkshere-links": "← koppelingen",
-       "whatlinkshere-hideredirs": "Verberg doorverwijzingen",
-       "whatlinkshere-hidetrans": "Verberg transclusies",
-       "whatlinkshere-hidelinks": "Verberg links",
+       "whatlinkshere-hideredirs": "doorverwijzingen $1",
+       "whatlinkshere-hidetrans": "Transclusies $1",
+       "whatlinkshere-hidelinks": "koppelingen $1",
        "whatlinkshere-hideimages": "Bestandskoppelingen $1",
        "whatlinkshere-filters": "Filters",
        "whatlinkshere-submit": "OK",
index 97c6921..18d8a84 100644 (file)
@@ -5,7 +5,9 @@
                        "Hiloin Natoi",
                        "Ilja.mos",
                        "Mashoi7",
-                       "Misosoof"
+                       "Misosoof",
+                       "Ghiutun",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Linkien alleviivuamine:",
        "whatlinkshere-links": "← linkat",
        "whatlinkshere-hideredirs": "$1 uvvellehohjavukset",
        "whatlinkshere-hidetrans": "$1 sižällyttämizet",
-       "whatlinkshere-hidelinks": "$1 linkat",
+       "whatlinkshere-hidelinks": "$1 linkit",
        "whatlinkshere-filters": "Filtrat",
        "blocklink": "Lukiče",
        "contribslink": "kohendukset",
index b00ef21..6862c00 100644 (file)
        "createacct-reason-ph": "Dlaczego zakładasz kolejne konto",
        "createacct-submit": "Utwórz konto",
        "createacct-another-submit": "Utwórz konto",
+       "createacct-another-continue-submit": "Kontynuuj tworzenie konta",
        "createacct-benefit-heading": "{{grammar:B.lp|{{SITENAME}}}} tworzą ludzie tacy jak Ty.",
        "createacct-benefit-body1": "{{PLURAL:$1|edycja|edycje|edycji}}",
        "createacct-benefit-body2": "{{PLURAL:$1|strona|strony|stron}}",
        "passwordreset-emailsentusername": "Jeśli z tym kontem powiązany jest adres e‐mail, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
        "passwordreset-emailsent-capture": "Wyświetlony poniżej e‐mail pozwalający na zresetowanie hasła został wysłany.",
        "passwordreset-emailerror-capture": "Poniżej wyświetlony e‐mail pozwalający na zresetowanie hasła został wygenerowany, ale nie udało się wysłać go do {{GENDER:$2|użytkownika|użytkowniczki}}: $1",
+       "passwordreset-invalideamil": "Nieprawidłowy adres e-mail",
+       "passwordreset-nodata": "Nie podano ani nazwy użytkownika, ani adresu e-mail",
        "changeemail": "Zmiana lub usunięcie adresu e‐mail",
        "changeemail-header": "Wypełnij ten formularz, aby zmienić swój adres e-mail. Jeśli chcesz usunąć swój adres e-mail, to przy wypełnianiu formularza pozostaw puste pole nowego adresu e-mail.",
        "changeemail-passwordrequired": "Musisz podać swoje hasło, aby potwierdzić tę zmianę.",
        "whatlinkshere-prev": "{{PLURAL:$1|poprzednie|poprzednie $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|następne|następne $1}}",
        "whatlinkshere-links": "← linkujące",
-       "whatlinkshere-hideredirs": "Ukryj przekierowania",
-       "whatlinkshere-hidetrans": "Ukryj dołączenia",
-       "whatlinkshere-hidelinks": "Ukryj linki",
-       "whatlinkshere-hideimages": "Ukryj linki z plików",
+       "whatlinkshere-hideredirs": "$1 przekierowania",
+       "whatlinkshere-hidetrans": "$1 dołączenia",
+       "whatlinkshere-hidelinks": "$1 linki",
+       "whatlinkshere-hideimages": "$1 linki z plików",
        "whatlinkshere-filters": "Filtry",
        "whatlinkshere-submit": "Dalej",
        "autoblockid": "automatyczna blokada nr $1",
        "log-action-filter-rights-rights": "Ręczna zmiana",
        "log-action-filter-rights-autopromote": "Automatyczna zmiana",
        "log-action-filter-upload-upload": "Nowe przesłane",
-       "log-action-filter-upload-overwrite": "Przesłane ponownie"
+       "log-action-filter-upload-overwrite": "Przesłane ponownie",
+       "authmanager-create-disabled": "Utworzenie konta jest wyłączone.",
+       "authmanager-create-from-login": "Aby utworzyć konto, wypełnij poniższe pola.",
+       "authmanager-authplugin-setpass-denied": "Wtyczka uwierzytelniania nie zezwala na zmianę haseł.",
+       "authmanager-authplugin-setpass-bad-domain": "Niepoprawna domena.",
+       "authmanager-autocreate-noperm": "Automatyczne tworzenie konta jest niedozwolone.",
+       "authmanager-autocreate-exception": "Automatyczne tworzenie konta tymczasowo wyłączone z powodu wcześniejszych błędów.",
+       "authmanager-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
+       "authmanager-password-help": "Hasło do uwierzytelniania.",
+       "authmanager-email-label": "E-mail",
+       "authmanager-email-help": "Adres e‐mail",
+       "authmanager-realname-help": "Prawdziwe imię i nazwisko użytkownika",
+       "authmanager-provider-password": "Uwierzytelnianie oparte na haśle",
+       "authmanager-provider-temporarypassword": "Hasło tymczasowe",
+       "authprovider-resetpass-skip-label": "Pomiń",
+       "authform-newtoken": "Brakujący token. $1",
+       "authform-notoken": "Brakujący token",
+       "authform-wrongtoken": "Nieprawidłowy token",
+       "specialpage-securitylevel-not-allowed": "Niestety, nie możesz korzystać z tej strony, ponieważ twoja tożsamość nie może zostać zweryfikowana.",
+       "authpage-cannot-login-continue": "Nie można kontynuować logowania. Sesja najprawdopodobniej wygasła.",
+       "cannotauth-not-allowed-title": "Brak dostępu",
+       "changecredentials-submit-cancel": "Anuluj",
+       "removecredentials-submit": "Usuń",
+       "removecredentials-submit-cancel": "Anuluj",
+       "credentialsform-account": "Nazwa konta:"
 }
index 68b47a3..37569e0 100644 (file)
        "accmailtext": "Na ciav generà a l'ancàpit për [[User talk:$1|$1]] a l'é stàita mandà a $2.\nA peul esse modificà an sla pàgina ''[[Special:ChangePassword|modìfica dla ciav]]'' apress esse rintrà ant ël sistema.",
        "newarticle": "(Neuv)",
        "newarticletext": "A l'é andaje dapress a na liura a na pàgina che a esist ancor nen.\nPër creé la pàgina, ch'a ancamin-a a scrive ant lë spassi sì-sota (vëdde la [$1 pàgina d'agiut] për savèjne ëd pì).\nS'a l'é rivà sì për eror, ch'a sgnaca ël boton '''andaré''' ëd sò navigador.",
-       "anontalkpagetext": "----''Costa a l'é la pàgina ëd ciaciarade për n'utent anònim che a l'é ancó pa dorbusse un cont, ò pura che a lo deuvra nen. Alora i l'oma da dovré ël nùmer d'adrëssa IP për deje n'identificassion a chiel o chila.\nN'adrëssa IP përparèj a peul esse partagià da vàire utent.\nSe chiel a l'é n'utent anònim e a l'ha l'impression d'arsèive dij coment sensa sust, për piasì [[Special:CreateAccount|ch'a crea un cont]] o [[Special:UserLogin|ch'a rintra ant ël sistema]] për evité dë fé confusion con d'àutri utent anònim.''",
+       "anontalkpagetext": "----\n<em>Costa a l'é la pàgina ëd ciaciarade për n'utent anònim che a l'é ancó pa duvertasse un cont, ò pura che a lo deuvra nen.</em>\nAlora i l'oma da dovré ël nùmer d'adrëssa IP për deje n'identificassion a chiel o chila.\nN'adrëssa IP përparèj a peul esse partagià da vàire utent.\nSe chiel a l'é n'utent anònim e a l'ha l'impression d'arsèive dij coment sensa sust, për piasì [[Special:CreateAccount|ch'a crea un cont]] o [[Special:UserLogin|ch'a rintra ant ël sistema]] për evité dë fé confusion con d'àutri utent anònim.''",
        "noarticletext": "Al moment costa pàgina a l'é veuida.\nA peul [[Special:Search/{{PAGENAME}}|sërché cost tìtol]] andrinta a d'àutre pàgine, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],\no purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} modìfiché sta pàgina]</span>.",
        "noarticletext-nopermission": "Al moment a-i é gnun test ansima a costa pàgina.\nA peul [[Special:Search/{{PAGENAME}}|sërché ës tìtol ëd pàgina]] an d'àutre pàgine,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant j'argistr colegà]</span>, ma a l'ha pa ël përmess ëd creé costa pàgina.",
        "missing-revision": "La revision nùmer $1 dla pàgina antitolà «{{FULLPAGENAME}}» a esist pa.\n\nSòn a l'é normalment causà da l'andèje dapress a na vej liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scancelament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
        "whatlinkshere-prev": "{{PLURAL:$1|d'un andré|andré ëd $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|d'un anans|anans ëd $1}}",
        "whatlinkshere-links": "← anliure",
-       "whatlinkshere-hideredirs": "Stërmé ridiression",
-       "whatlinkshere-hidetrans": "Stërmé transclusion",
-       "whatlinkshere-hidelinks": "Stërmé anliure",
+       "whatlinkshere-hideredirs": "$1 ridiression",
+       "whatlinkshere-hidetrans": "$1 anclusion",
+       "whatlinkshere-hidelinks": "$1 anliure",
        "whatlinkshere-hideimages": "$1 j'archivi lijà",
        "whatlinkshere-filters": "Filtr",
        "autoblockid": "Blocagi automàtich #$1",
        "javascripttest-qunit-intro": "Vëdde [$1 la documentassion dle preuve] dzora a mediawiki.org.",
        "tooltip-pt-userpage": "{{GENDER:|Soa}} pàgina utent",
        "tooltip-pt-anonuserpage": "La pàgina utent për l'IP con ël qual chiel a contribuiss",
-       "tooltip-pt-mytalk": "Soa pàgina ëd discussion e ciaciarade",
+       "tooltip-pt-mytalk": "{{GENDER:|Soa}} pàgina ëd discussion",
        "tooltip-pt-anontalk": "La pàgina ëd ciaciarade an sle contribussion da costa adrëssa IP",
-       "tooltip-pt-preferences": "Coma che i veuj mia {{SITENAME}}.",
+       "tooltip-pt-preferences": "{{GENDER:|Ij tò}} gust",
        "tooltip-pt-watchlist": "Lista dle pàgine che chiel as ten sot euj.",
        "tooltip-pt-mycontris": "Lista ëd {{GENDER:|soe}} contribussion",
        "tooltip-pt-login": "Un a l'é nen obligà a rintré ant al sistema, ma se a lo fa a l'é mej",
index cc3f168..d755f65 100644 (file)
@@ -7,7 +7,8 @@
                        "아라",
                        "عثمان خان شاہ",
                        "Macofe",
-                       "Amire80"
+                       "Amire80",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "کرښنې تړنې:",
        "passwordreset-emailelement": "کارن-نوم: \n$1\n\nلنډمهاله پټنوم: \n$2",
        "passwordreset-emailsentemail": "د پټنوم بيا پرځای کېدنې لپاره برېښليک درولېږل شو.",
        "passwordreset-emailsent-capture": "د پټنوم بياپرځای کېدنې لپار مو يو برېښليک درولېږه، برېښليک په لاندې توگه ښودل شوی.",
+       "passwordreset-invalideamil": "ناسمه برېښليک پته",
        "changeemail": "برېښليک پته بدلول يا ليرې کول",
        "changeemail-header": "د گڼون برېښليک پته بدلول",
        "changeemail-no-info": "دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.",
        "exif-primarychromaticities": "د لومړيتوبونو رنگينتوبونه",
        "exif-datetime": "د دوتنې د بدلون وخت او نېټه",
        "exif-imagedescription": "انځور سرليک",
-       "exif-make": "د کامرې جوړونکی",
+       "exif-make": "کامره جوړونکی",
        "exif-model": "د کامرې ماډل",
        "exif-software": "کارېدلې ساوترۍ",
        "exif-artist": "ليکوال",
        "exif-pixelydimension": "د انځور جگوالی",
        "exif-usercomment": "د کارن تبصرې",
        "exif-relatedsoundfile": "اړونده غږيزه دوتنه",
-       "exif-datetimeoriginal": "د Ø§Ù\88Ù\85تÙ\88Ú© Ø¯ Ø¬Ù\88Ú\93Û\90دÙ\86Û\90 Ù\88خت Ø§Ù\88 Ù\86Û\90Ù¼Ù\87",
-       "exif-datetimedigitized": "د گڼياليز کېدنې وخت او نېټه",
+       "exif-datetimeoriginal": "د اومتوک جوړېدنې وخت او نېټه",
+       "exif-datetimedigitized": "د گڼياليزېدنې وخت او نېټه",
        "exif-exposuretime": "رڼاغورځونې وخت",
        "exif-exposuretime-format": "$1 ثانيه ($2)",
        "exif-fnumber": "F شمېره",
        "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځېدنه",
        "randomrootpage": "د ناټاکلې ريښې مخ",
        "log-action-filter-all": "ټول",
-       "log-action-filter-block-block": "بنديز لگول"
+       "log-action-filter-block-block": "بنديز لگول",
+       "authmanager-email-label": "برېښليک",
+       "authmanager-email-help": "برېښليک پته",
+       "authmanager-realname-label": "اصلي نوم",
+       "authmanager-realname-help": "د کارن اصلي نوم",
+       "authprovider-resetpass-skip-label": "تېرېدل",
+       "changecredentials-submit": "بدلول",
+       "changecredentials-submit-cancel": "ناگارل",
+       "removecredentials-submit": "غورځول",
+       "removecredentials-submit-cancel": "ناگارل",
+       "credentialsform-account": "گڼون نوم:"
 }
index de3a243..4a73349 100644 (file)
@@ -95,7 +95,8 @@
                        "Caçador de Palavras",
                        "Luk3",
                        "Ryuu",
-                       "Luan"
+                       "Luan",
+                       "Anderson Costa"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "apisandbox": "Caixa de areia da API",
        "apisandbox-api-disabled": "A API está desabilitada neste site.",
        "apisandbox-intro": "Use esta página para realizar testes com o '''serviço web de API do MediaWiki'''.\nConsulte a [//www.mediawiki.org/wiki/API:Main_page a documentação API] para obter mais detalhes de uso da API.  Exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo de uma Página principal].  Selecione uma ação para mais exemplos.\n\nNote que, embora esta seja uma área de testes, as ações que executar nesta página podem modificar a wiki.",
+       "apisandbox-unfullscreen": "Mostrar página",
        "apisandbox-submit": "Fazer requisição",
        "apisandbox-reset": "Limpar",
        "apisandbox-retry": "Tentar novamente",
        "whatlinkshere-links": "← afluentes",
        "whatlinkshere-hideredirs": "$1 redirecionamentos",
        "whatlinkshere-hidetrans": "$1 transclusões",
-       "whatlinkshere-hidelinks": "$1 links",
-       "whatlinkshere-hideimages": "$1 links para arquivos",
+       "whatlinkshere-hidelinks": "$1 ligações",
+       "whatlinkshere-hideimages": "$1 ligações para ficheiros",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Avançar",
        "autoblockid": "Autobloqueio #$1",
        "timezone-local": "Local",
        "duplicate-defaultsort": "Aviso: A chave de ordenação padrão \"$2\" sobrepõe-se à anterior chave de ordenação padrão \"$1\".",
        "duplicate-displaytitle": "<strong>Aviso:</strong> O título exibido \"$2\" substituí o título anterior \"$1\".",
+       "restricted-displaytitle": "<Strong>Aviso:</Strong> O título de exibição “$1” foi ignorado devido a não ser equivalente ao título verdadeiro da página.",
        "invalid-indicator-name": "<strong>Erro:</strong> O atributo indicador do status da página <code>name</code> não deve estar vazio.",
        "version": "Versão",
        "version-extensions": "Extensões instaladas",
index 4881cf8..d2053db 100644 (file)
        "whatlinkshere-links": "← afluentes",
        "whatlinkshere-hideredirs": "$1 redirecionamentos",
        "whatlinkshere-hidetrans": "$1 transclusões",
-       "whatlinkshere-hidelinks": "$1 ligações",
-       "whatlinkshere-hideimages": "$1 ligações para ficheiros",
+       "whatlinkshere-hidelinks": "$1 links",
+       "whatlinkshere-hideimages": "$1 links para arquivos",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Ir",
        "autoblockid": "Bloqueio automático nº$1",
index 7a6a253..5e07644 100644 (file)
                        "Conquistador",
                        "Frigory",
                        "Psychoslave",
-                       "Guycn2"
+                       "Guycn2",
+                       "2axterix2"
                ]
        },
        "sidebar": "{{notranslate}}",
        "columns": "Used on [[Special:Preferences]], \"Editing\" section in the \"Size of editing window\" fieldset.\n{{Identical|Column}}",
        "searchresultshead": "Replaced by {{msg-mw|prefs-searchoptions}}, though may still be used in some extensions. DEPRECATED.\n\n{{Identical|Search}}",
        "stub-threshold": "Used in [[Special:Preferences]], \"Advanced options\" section. The setting allows the user to select a threshold value, in bytes, from a predefined list of options. Any links that lead to pages smaller than the threshold (\"stub links\") will be styled differently.\n\nParameters:\n* $1: the text of {{msg-mw|stub-threshold-sample-link}}, styled as a stub link",
-       "stub-threshold-sample-link": "Passed as a parameter to the {{msg-mw|stub-threshold}} message.",
+       "stub-threshold-sample-link": "Passed as a parameter to the {{msg-mw|stub-threshold}} message.\n{{Identical|Sample}}",
        "stub-threshold-disabled": "Used in [[Special:Preferences]].\n{{Identical|Disabled}}",
        "recentchangesdays": "Used in [[Special:Preferences]], tab \"Recent changes\".",
        "recentchangesdays-max": "Shown as hint in [[Special:Preferences]], tab \"Recent changes\". Parameters:\n* $1 - number of days\nSee also:\n* {{msg-mw|Prefs-watchlist-days-max}}",
        "trackingcategories-msg": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the mediawiki message that controls the tracking category in question.\n{{Identical|Tracking category}}",
        "trackingcategories-name": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the name of the tracking category in the content language.",
        "trackingcategories-desc": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the inclusion criteria for the category.",
+       "restricted-displaytitle-ignored": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if a page has an ignored display title.\n\nSee also:\n* {{msg-mw|restricted-displaytitle-ignored-desc}}\n*{{msg-mw|restricted-displaytitle}}",
+       "restricted-displaytitle-ignored-desc": "Pages with ignored display titles category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|restricted-displaytitle-ignored}}",
        "noindex-category-desc": "No-index category-description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Noindex-category}}",
        "index-category-desc": "Index category-description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Index-category}}",
        "post-expand-template-inclusion-category-desc": "Post expand template inclusion category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Post-expand-template-inclusion-category}}",
        "whatlinkshere-prev": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the first argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Prevn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-next}}\n{{Identical|Previous}}",
        "whatlinkshere-next": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Nextn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-prev}}\n{{Identical|Next}}",
        "whatlinkshere-links": "Used on [[Special:WhatLinksHere]]. It is a link to the WhatLinksHere page of that page.\n\nExample line:\n* [[Main Page]] ([[Special:WhatLinksHere/Main Page|{{int:whatlinkshere-links}}]])\n{{Identical|Link}}",
-       "whatlinkshere-hideredirs": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}",
+       "whatlinkshere-hideredirs": "Filter option in [[Special:WhatLinksHere]].",
        "whatlinkshere-hidetrans": "First filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}",
-       "whatlinkshere-hidelinks": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}",
-       "whatlinkshere-hideimages": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 - the {{msg-mw|Hide}} or {{msg-mw|Show}}\n\nSee also:\n*{{msg-mw|Isimage}}\n*{{msg-mw|Media tip}}",
+       "whatlinkshere-hidelinks": "Filter option in [[Special:WhatLinksHere]].",
+       "whatlinkshere-hideimages": "Filter option in [[Special:WhatLinksHere]].\n\nSee also:\n*{{msg-mw|Isimage}}\n*{{msg-mw|Media tip}}",
        "whatlinkshere-filters": "{{Identical|Filter}}",
        "whatlinkshere-submit": "Label for submit button in [[Special:WhatLinksHere]]\n{{Identical|Go}}",
        "autoblockid": "Used as name of autoblock, instead of autoblocked IPs. Parameters:\n* $1 - autoblock ID",
        "ipb-blocklist": "Used as link text in [[Special:Block]].\n\nThe link points to Specil:BlockList.",
        "ipb-blocklist-contribs": "Used in [[Special:Block]].\n* $1 - target username",
        "ipb-blocklist-duration-left": "Used on [[Special:BlockList]] to show the remaining time (years, months, days, hours, minutes) until the block expires.\n$1 - The duration left",
-       "unblockip": "Used as legend for the form in [[Special:Unblock]].",
+       "unblockip": "Used as title and legend for the form in [[Special:Unblock]].",
        "unblockiptext": "Used in the {{msg-mw|Unblockip}} form on [[Special:Unblock]].",
        "ipusubmit": "Used as button text on [{{canonicalurl:Special:BlockList|action=unblock}} Special:BlockList?action=unblock]. To see the message:\n* Go to [[Special:BlockList]]\n* Click \"unblock\" for any block (but you can only see \"unblock\" if you have administrator rights)\n* It is now the button below the form",
        "unblocked": "{{doc-important|Do not translate the namespace \"User:\".}}\nParameters:\n* $1 - the username that was unblocked\nSee also:\n* {{msg-mw|Unblocked-range}}\n* {{msg-mw|Unblocked-id}}\n*{{msg-mw|Unblocked-ip}}",
        "authmanager-password-help": "Description of the field with label {{msg-mw|userlogin-yourpassword}}.",
        "authmanager-domain-help": "Description of the field with label {{msg-mw|yourdomainname}}.",
        "authmanager-retype-help": "Description of the field with label {{msg-mw|createacct-yourpasswordagain}}.",
-       "authmanager-email-label": "Label for the email field.",
-       "authmanager-email-help": "Description of the field with label {{msg-mw|authmanager-email-label}}.",
-       "authmanager-realname-label": "Label for the realname field.",
+       "authmanager-email-label": "Label for the email field.\n{{Identical|E-mail}}",
+       "authmanager-email-help": "Description of the field with label {{msg-mw|authmanager-email-label}}.\n{{Identical|E-mail address}}",
+       "authmanager-realname-label": "Label for the realname field.\n{{Identical|Real name}}",
        "authmanager-realname-help": "Description of the field with label {{msg-mw|authmanager-realname-label}}.",
        "authmanager-provider-password": "Description for PasswordAuthenticationRequest. Will be used as $1 in messages such as {{msg-mw|authprovider-confirmlink-option}}.",
        "authmanager-provider-password-domain": "Description for PasswordDomainAuthenticationRequest. Will be used as $1 in messages such as {{msg-mw|authprovider-confirmlink-option}}.",
        "authprovider-confirmlink-failed-line": "Line to display that credentials were not linked successfully. Parameters:\n* $1 - Credentials that failed, formatted with {{msg-mw|authprovider-confirmlink-option}}\n* $2 - Failure message text.\n\nSee also:\n* {{msg-mw|authprovider-confirmlink-failed}}\n* {{msg-mw|authprovider-confirmlink-success-line}}",
        "authprovider-confirmlink-failed": "Used to prefix the list of individual link statuses when some did not succeed. Parameters:\n* $1 - Failure message, or a wikitext bulleted list of failure messages.\n\nSee also:\n* {{msg-mw|authprovider-confirmlink-success-line}}\n* {{msg-mw|authprovider-confirmlink-failed-line}}",
        "authprovider-confirmlink-ok-help": "Description of the \"ok\" field when ConfirmLinkSecondaryAuthenticationProvider needs to display link failure messages to the user.",
-       "authprovider-resetpass-skip-label": "Label for the \"Skip\" button when it's possible to skip resetting a password in ResetPasswordSecondaryAuthenticationProvider.",
+       "authprovider-resetpass-skip-label": "Label for the \"Skip\" button when it's possible to skip resetting a password in ResetPasswordSecondaryAuthenticationProvider.\n{{Identical|Skip}}",
        "authprovider-resetpass-skip-help": "Description of the option to skip resetting a password in ResetPasswordSecondaryAuthenticationProvider.",
        "authform-nosession-login": "Error message shown when the login was successful, but the session could not be reestablished on the next request. $1 is an explanation which depends on what session handler is being used, such as {{msg-mw|sessionprovider-nocookies}}.",
        "authform-nosession-signup": "Error message shown when the account creation was successful, but the session could not be reestablished on the next request. $1 is an explanation which depends on what session handler is being used, such as {{msg-mw|sessionprovider-nocookies}}.",
        "authpage-cannot-create-continue": "Error message shown on authentication-related special pages when account creation cannot continue. This most likely means a session timeout.",
        "authpage-cannot-link": "Error message shown on authentication-related special pages when account linking cannot start. This is not supposed to happen unless the site is misconfigured.",
        "authpage-cannot-link-continue": "Error message shown on authentication-related special pages when account linking cannot continue. This most likely means a session timeout.",
-       "cannotauth-not-allowed-title": "Title of the error page shown when the user tries t use an authentication-related page they should not have access to.",
+       "cannotauth-not-allowed-title": "Title of the error page shown when the user tries to use an authentication-related page they should not have access to.",
        "cannotauth-not-allowed": "Text of the error page shown when the user tries t use an authentication-related page they should not have access to.",
        "changecredentials": "Title of the special page [[Special:ChangeCredentials]] which allows changing authentication credentials (such as the password).",
-       "changecredentials-submit": "Used on [[Special:ChangeCredentials]].",
+       "changecredentials-submit": "Used on [[Special:ChangeCredentials]].\n{{Identical|Change}}",
        "changecredentials-submit-cancel": "Used on [[Special:ChangeCredentials]].\n{{Identical|Cancel}}",
        "changecredentials-invalidsubpage": "Error message shown when using [[Special:ChangeCredentials]] with an invalid type.\n\nParameters:\n* $1 - subpage name.",
        "changecredentials-success": "Success message after using [[Special:ChangeCredentials]].",
        "removecredentials": "Title of the special page [[Special:RemoveCredentials]] which allows removing authentication credentials (such as a two-factor token).",
-       "removecredentials-submit": "Used on [[Special:RemoveCredentials]].",
+       "removecredentials-submit": "Used on [[Special:RemoveCredentials]].\n{{Identical|Remove}}",
        "removecredentials-submit-cancel": "Used on [[Special:RemoveCredentials]].\n{{Identical|Cancel}}",
        "removecredentials-invalidsubpage": "Error message shown when using [[Special:RemoveCredentials]] with an invalid type.\n\nParameters:\n* $1 - subpage name.",
        "removecredentials-success": "Success message after using [[Special:RemoveCredentials]].",
index cecb1be..07166e6 100644 (file)
        "password-change-forbidden": "Nu puteți schimba parole pe acest wiki.",
        "externaldberror": "A fost fie o eroare de bază de date pentru o autentificare extenă sau nu aveți permisiunea să actualizați contul extern.",
        "login": "Autentificare",
+       "login-security": "Verificați-vă identitatea",
        "nav-login-createaccount": "Creare cont / Autentificare",
        "userlogin": "Creare cont / Autentificare",
        "userloginnocreate": "Autentificare",
        "noname": "Numele de utilizator pe care l-ați introdus nu este valid.",
        "loginsuccesstitle": "Autentificat(ă)",
        "loginsuccess": "'''Ați fost autentificat la {{SITENAME}} ca „$1”.'''",
-       "nosuchuser": "Nu există nici un utilizator cu numele „$1”.\nNumele de utilizatori sunt sensibile la majuscule.\nVerifică dacă ai scris corect sau [[Special:CreateAccount|creează un nou cont de utilizator]].",
+       "nosuchuser": "Nu există nici un utilizator cu numele „$1”.\nNumele de utilizatori sunt sensibile la majuscule.\nVerificați dacă ați scris corect sau [[Special:CreateAccount|creați un nou cont de utilizator]].",
        "nosuchusershort": "Nu există niciun utilizator cu numele „$1”.\nVerificați ortografierea.",
        "nouserspecified": "Trebuie să specificați un nume de utilizator.",
        "login-userblocked": "Acest utilizator este blocat. Autentificarea nu este permisă.",
        "right-override-export-depth": "Exportă inclusiv paginile legate până la o adâncime de 5",
        "right-sendemail": "Trimite e-mail altor utilizatori",
        "right-passwordreset": "Vizualizează e-mailurile de reinițializare a parolelor",
-       "right-managechangetags": "Creează și șterge [[Special:Tags|etichete]] din baza de date",
+       "right-managechangetags": "Creează și (dez)activează [[Special:Tags|etichete]]",
        "right-applychangetags": "Aplică [[Special:Tags|etichete]] asociate modificărilor unui utilizator",
        "right-changetags": "Adaugă și înlătură [[Special:Tags|etichete]] arbitrare din versiuni și intrări de jurnal individuale",
+       "right-deletechangetags": "Șterge [[Special:Tags|etichete]] din baza de date",
+       "grant-generic": "set de permisiuni „$1”",
+       "grant-group-page-interaction": "Interacționează cu paginile",
+       "grant-group-file-interaction": "Interacționează cu conținut media",
        "grant-basic": "Drepturi de bază",
        "newuserlogpage": "Jurnal utilizatori noi",
        "newuserlogpagetext": "Acesta este jurnalul creărilor conturilor de utilizator.",
        "action-viewmyprivateinfo": "vă vizualizați informațiile personale",
        "action-editmyprivateinfo": "să vă modificați informațiile personale",
        "action-editcontentmodel": "modificați modelul de conținut al unei pagini",
-       "action-managechangetags": "creați și să ștergeți etichete din baza de date",
+       "action-managechangetags": "creați și să (dez)activați etichete",
        "action-applychangetags": "aplicați etichete asociate modificărilor dumneavoastră",
        "action-changetags": "adăugați și să înlăturați etichete arbitrare din versiuni și intrări de jurnal individuale",
+       "action-deletechangetags": "ștergeți etichete din baza de date",
        "nchanges": "$1 {{PLURAL:$1|modificare|modificări|de modificări}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|de la ultima vizită}}",
        "enhancedrc-history": "istoric",
        "changecontentmodel-success-text": "Tipul de conținut al paginii [[:$1]] a fost modificat.",
        "changecontentmodel-cannot-convert": "Conținutul paginii [[:$1]] nu poate fi convertit în tipul $2.",
        "changecontentmodel-nodirectediting": "Modelul de conținut $1 nu acceptă editarea directă",
+       "changecontentmodel-emptymodels-title": "Nu sunt disponibile modele de conținut",
+       "changecontentmodel-emptymodels-text": "Conținutul paginii [[:$1]] nu poate fi convertit în alt tip.",
        "log-name-contentmodel": "Jurnal modificări model de conținut",
        "log-description-contentmodel": "Evenimente referitoare la modelele de conținut ale paginilor",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|a modificat}} modelul de conținut al paginii $3 din „$4” în „$5”",
index 2e0be53..e1e8ede 100644 (file)
        "createacct-reason-ph": "Зачем вы создаёте другую учетную запись",
        "createacct-submit": "Создать учётную запись",
        "createacct-another-submit": "Создать учётную запись",
+       "createacct-continue-submit": "Продолжить создание учётной записи",
+       "createacct-another-continue-submit": "Продолжить создание учётной записи",
        "createacct-benefit-heading": "{{SITENAME}} — совместный труд таких же людей, как вы.",
        "createacct-benefit-body1": "{{PLURAL:$1|правка|правки|правок}}",
        "createacct-benefit-body2": "{{PLURAL:$1|статья|статьи|статей}}",
        "botpasswords-invalid-name": "Указанное имя участника не содержит разделителя для пароля бота («$1»).",
        "botpasswords-not-exist": "У участника «$1» нет пароля для бота с названием «$2».",
        "resetpass_forbidden": "Пароль не может быть изменён",
+       "resetpass_forbidden-reason": "Пароли не могут быть изменены: $1",
        "resetpass-no-info": "Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.",
        "resetpass-submit-loggedin": "Изменить пароль",
        "resetpass-submit-cancel": "Отмена",
        "passwordreset-emailsentusername": "Если есть адрес электронной почты, связанный с этим именем участника, то будет отправлено письмо для восстановления пароля.",
        "passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
        "passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
+       "passwordreset-invalideamil": "Недопустимый адрес электронной почты",
        "changeemail": "Изменить или удалить адрес электронной почты",
        "changeemail-header": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Если вы хотите отвязать свой адрес электронной почты от учётной записи, то при заполнении формы оставьте пустым поле нового адреса электронной почты.",
        "changeemail-passwordrequired": "Чтобы подтвердить это изменение, вам нужно будет ввести свой пароль.",
        "accmailtext": "Сгенерированный случайным образом пароль для [[User talk:$1|$1]] выслан на адрес $2.\n\nПосле авторизации можно будет сменить пароль для этой учётной записи на ''[[Special:ChangePassword|специальной странице смены пароля]]''.",
        "newarticle": "(Новая)",
        "newarticletext": "Вы перешли по ссылке на страницу, которой пока не существует.\nЧтобы её создать, наберите текст в окне, расположенном ниже (подробнее см. [$1 справочную страницу]).\nЕсли вы оказались здесь по ошибке, просто нажмите кнопку '''назад''' своего браузера.",
-       "anontalkpagetext": "----''Эта страница обсуждения принадлежит анонимному участнику, который ещё не создал учётной записи, или не использует её.\nПоэтому для идентификации используется цифровой IP-адрес.\nЭтот же адрес может соответствовать нескольким другим участникам.\nЕсли вы анонимный участник и полагаете, что получили сообщения, адресованные не вам, пожалуйста, [[Special:CreateAccount|создайте учётную запись]] или [[Special:UserLogin|представьтесь системе]], чтобы впредь избежать возможной путаницы с другими анонимными участниками.''",
+       "anontalkpagetext": "----\n<em>Эта страница обсуждения анонимного участника, который ещё не создал учётной записи или не использует её.</em>\nПоэтому мы вынуждены для его/её идентификации использовать цифровой IP-адрес.\nЭтот же адрес может использоваться нескольким другим участникам.\nЕсли вы анонимный участник и полагаете, что получили сообщения, адресованные не вам, пожалуйста, [[Special:CreateAccount|создайте учётную запись]] или [[Special:UserLogin|представьтесь системе]], чтобы впредь избежать возможной путаницы с другими анонимными участниками.",
        "noarticletext": "В настоящий момент текст на данной странице отсутствует.\nВы можете [[Special:Search/{{PAGENAME}}|найти упоминание данного названия]] на других страницах,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} найти соответствующие записи журналов]\nили '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} создать страницу с таким названием]'''</span>.",
        "noarticletext-nopermission": "В настоящее время на этой странице нет текста.\nВы можете [[Special:Search/{{PAGENAME}}|найти упоминание данного названия]] на других страницах,\nили <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} найти соответствующие записи журналов].</span> У вас нет разрешения создать данную страницу.",
        "missing-revision": "Версия $1 страницы «{{FULLPAGENAME}}» не существует.\n\nЭто обычно бывает, если последовать по устаревшей ссылке на страницу, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "whatlinkshere-prev": "{{PLURAL:$1|1=предыдущая|предыдущие}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|1=следующая|следующие}} $1",
        "whatlinkshere-links": "← ссылки",
-       "whatlinkshere-hideredirs": "Скрыть перенаправления",
-       "whatlinkshere-hidetrans": "Скрыть включения",
-       "whatlinkshere-hidelinks": "Скрыть ссылки",
-       "whatlinkshere-hideimages": "Скрыть файловые ссылки",
+       "whatlinkshere-hideredirs": "$1 перенаправления",
+       "whatlinkshere-hidetrans": "$1 включения",
+       "whatlinkshere-hidelinks": "$1 ссылки",
+       "whatlinkshere-hideimages": "$1 файловые ссылки",
        "whatlinkshere-filters": "Фильтры",
        "whatlinkshere-submit": "Выполнить",
        "autoblockid": "Автоблокировка #$1",
        "log-action-filter-suppress-block": "Сокрытие пользователя через блокировки",
        "log-action-filter-suppress-reblock": "Сокрытие пользователя через повторное блокирование",
        "log-action-filter-upload-upload": "Новая загрузка",
-       "log-action-filter-upload-overwrite": "Повторно загрузить"
+       "log-action-filter-upload-overwrite": "Повторно загрузить",
+       "authmanager-authn-autocreate-failed": "Автоматическое создание локальной учётной записи не удалось: $1",
+       "authmanager-authplugin-setpass-bad-domain": "Неверный домен.",
+       "authmanager-autocreate-exception": "Автоматическое создание учётной записи временно отключено из-за предыдущих ошибок.",
+       "authmanager-userdoesnotexist": "Не зарегистрировано учётной записи «$1».",
+       "authmanager-email-label": "Электронная почта",
+       "authmanager-email-help": "Адрес электронной почты",
+       "authmanager-realname-label": "Настоящее имя",
+       "authmanager-realname-help": "Настоящее имя участника",
+       "authmanager-provider-temporarypassword": "Временный пароль",
+       "authprovider-resetpass-skip-label": "Пропустить",
+       "authprovider-resetpass-skip-help": "Пропустить сброс пароля.",
+       "cannotauth-not-allowed-title": "Доступ запрещён",
+       "cannotauth-not-allowed": "Вы не можете использовать эту страницу",
+       "changecredentials": "Изменение учётных данных",
+       "changecredentials-submit": "Изменить",
+       "changecredentials-submit-cancel": "Отмена",
+       "changecredentials-invalidsubpage": "$1 является недопустимым типом учётных данных.",
+       "changecredentials-success": "Ваши учётные данные были изменены.",
+       "removecredentials": "Удалить учётные данные",
+       "removecredentials-submit": "Удалить",
+       "removecredentials-submit-cancel": "Отмена"
 }
index 5570761..e2adcf4 100644 (file)
@@ -10,6 +10,7 @@
        "tog-hideminor": "Fasal kayney kaŋ hun barmayyaŋ korawey ra tugu",
        "tog-hidepatrolled": "Fasalyan kurantey tugu barmay korawey ra",
        "tog-newpageshidepatrolled": "Moo kurantey tugu moo taaga maašeedaa ra",
+       "tog-hidecategorization": "Moɲey kanandiyanoo tugu",
        "tog-extendwatchlist": "Hawgay maašeedaa hayandi ka barmawey kul cebe, manti ikokorantaa hinne",
        "tog-usenewrc": "Barmawey marga moo bande barmay korawey nda hawgayhayey ra",
        "tog-numberheadings": "Boŋdekerey boŋkabuyan",
@@ -20,6 +21,7 @@
        "tog-watchdefault": "Moɲey nda tukey kaŋ ay g'i fasal tonton ay hawgayhayey ga",
        "tog-watchmoves": "Moɲey nda tukey kaŋ ay g'i ganandi tonton ay hawgayhayey ga",
        "tog-watchdeletion": "Moɲey nda tukey kaŋ ay g'i tuusu tonton ay hawgayhayey ga",
+       "tog-watchuploads": "Tuku taagey kaŋ g'i zijandi tonton hawgayhayey ga",
        "tog-watchrollback": "Moɲey kaŋ ay n'i taagandi tonton ay hawgayhayey ga",
        "tog-minordefault": "Fasalyaney kul šilbay sanda ikaynayaŋ nda tilasu",
        "tog-previewontop": "Moofuryan cebe jina fasal bataa ra",
@@ -31,8 +33,8 @@
        "tog-shownumberswatching": "Goykey kaŋ ga moɲoo hawgay hinnaa cebe",
        "tog-oldsig": "Kanbežeeri barantaa:",
        "tog-fancysig": "Kanbežeero tee sanda wikihantum (bila nda nga boŋdobu)",
-       "tog-uselivepreview": "Moofuryan goywaati ra (šiiyan)",
-       "tog-forceeditsummary": "Ay šaawar nda ya na fasal durandiyan dam",
+       "tog-uselivepreview": "Cebe kaŋ a ga dira",
+       "tog-forceeditsummary": "Ay šaawar nda fasal durandiyan koonu ga huru",
        "tog-watchlisthideown": "Ay boŋ fasalyaney tugu hawgayhayey ra",
        "tog-watchlisthidebots": "Maršin fasalyaney tugu hawgayhayey ra",
        "tog-watchlisthideminor": "Fasalyan kayney tugu hawgayhayey ra",
diff --git a/languages/i18n/shn.json b/languages/i18n/shn.json
new file mode 100644 (file)
index 0000000..ceb8448
--- /dev/null
@@ -0,0 +1,1068 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Khun Sar",
+                       "Nemo bis",
+                       "Piangpha",
+                       "Saiddzone",
+                       "Saimawnkham",
+                       "Saosukham",
+                       "Sengwan"
+               ]
+       },
+       "tog-underline": "ႁဵင်းၵွင်ႉ ဢၼ်ထတ်းထႅဝ်တႂ်ႈဝႆႉ:",
+       "tog-hideminor": "လပ်ႉဝႆႉ ၶေႃႈထတ်းမႄးဢိတ်းဢွတ်း တီႈလွင်ႈလႅၵ်ႈလၢႆႊ ဢၼ်ၸင်ႇပူၼ်ႉမႃး",
+       "tog-hidepatrolled": "လပ်ႉဝႆႉ ၵၢၼ်ပႂ်ႉတူၺ်း ၶေႃႈထတ်းမႄး တီႈလွင်ႈလႅၵ်ႈလၢႆႊဢၼ်ၸင်ႇပူၼ်ႉမႃး",
+       "tog-newpageshidepatrolled": "လပ်ႉဝႆႉၼႃႈလိၵ်ႈဢၼ်ပႂ်ႉတူၺ်း ၵႃႊတီႈသဵၼ်ႈၸိုဝ်ႈၼႃႈလိၵ်ႈမႂ်ႇ",
+       "tog-hidecategorization": "သိူင်ႇၼႃႈလိၵ်ႈ လွင်ႈပၢႆး-",
+       "tog-extendwatchlist": "မႄႇၼႄ သဵၼ်ႈၸိုဝ်ႈ တႃႇၼႄလွင်ႈလႅၵ်ႈလၢႆႊတင်းသဵင်ႈ၊ ဢၼ်ဢမ်ႇၵႃး ၸိူဝ်းလႅၵ်ႈလၢႆႈပႆႇပေႃးႁိုင်",
+       "tog-usenewrc": "လွင်ႈလႅၵ်ႈလၢႆႊၼႃႈလိၵ်ႈၸုမ်း ၼႂ်းလွင်ႈလႅၵ်ႈလၢႆႊလႄႈသဵၼ်ႈၸိုဝ်ႈ ဢၼ်ပူၼ်ႉမႃးပႆႇႁိုင်",
+       "tog-numberheadings": "ႁူဝ်ၶေႃႈၶပ်ႉတူဝ်ၼပ်ႉဝႅၼ်ႊဝႅၼ်ႊ",
+       "tog-showtoolbar": "ၼႄပၼ် ႁၢဝ်းၶိူင်ႈထတ်းမႄး",
+       "tog-editondblclick": "ၼဵၵ်းၵူပ်ႉသေ ထတ်းမႄးၼႃႈလိၵ်ႈ",
+       "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-enotifminoredits": "လွင်ႈထတ်းမႄး ၼႃႈလိၵ်ႈလႄႈၾၢႆႇလ်ဢိတ်းဢီႈၵေႃႈ သူင်ႇဢီး​မေးလ်ၸူးၵဝ်ၶႃႈတႃႉ",
+       "tog-enotifrevealaddr": "ပိုတ်ႇၼႄပၼ် ႁဵင်းဢီးမဵလ်းၵဝ်ၶႃႈ တီႈလွင်ႈၾၢင်ႉတိူၼ်ဢီးမဵလ်း",
+       "tog-shownumberswatching": "ၼႄတၢင်းၼမ် ၵူၼ်းတူၺ်းလႄႈ",
+       "tog-oldsig": "လၢႆးမိုဝ်း ဢၼ်တိုၵ်ႉမီးဝႆႉ",
+       "tog-fancysig": "ႁဵတ်းႁႂ်ႈလၢႆးမိုဝ်း ပဵၼ်ၼင်ႇပိူင်ၾၢင်ဝီႇၶီႇ (လူၺ်ႈဢမ်ႇမီးၵွင်ႉဢၼ်ဝႅၼ်ႊ)",
+       "tog-uselivepreview": "ၸႂ်ႉတိုဝ်း ၵၢၼ်တူၺ်းလူင်ႈၼႃႈ ဢၼ်တူင်ႉဝႆ",
+       "tog-forceeditsummary": "ပေႃးဝႃႈ တီႈႁုဝ်ႁူပ်ႈမႄးထတ်းၼၼ်ႉ ဢမ်ႇသႂ်ႇသင်သေ ပဵၼ်လွၵ်းပဝ်ႇဝႆ့ၼႆ ပၼ်ၽၢင်ႉၶႃႈသေၵမ်း",
+       "tog-watchlisthideown": "လပ်ႉၵၢၼ်ထတ်းမႄးၵဝ်ၶႃႈ ၵႃႊတီႈသဵၼ်ႈမၢႆဝႆႉ",
+       "tog-watchlisthidebots": "သိူင်ႇ ၶေႃႈထတ်းၵဝ် တမ်ႈတီႈ သဵၼ်ႈပႂ်ႉတူၺ်း",
+       "tog-watchlisthideminor": "လပ်ႉၵၢၼ်ထတ်းမႄးဢိတ်းဢီႈ ၵႃႊတီႈသဵၼ်ႈမၢႆဝႆႉ",
+       "tog-watchlisthideliu": "လပ်ႉဝႆႉ ၵၢၼ်ထတ်းမႄး လူၺ်ႈၽူႈၸႂ်ႉတိုဝ်းဢၼ်ၶဝ်ႈဝႆႉ ၵႃႊတီႈသဵၼ်ႈမၢႆ",
+       "tog-watchlistreloadautomatically": "ပေႃးဝႃႈ တူဝ်ထွင်မီး လွင်ႈလႅၵ်ႈလၢႆႈၼႆ ၶိုၼ်းၽိုၼ်ႉပၼ် သဵၼ်ႈပႂ်ႉတူၺ်း ႁင်းမၼ်းလႄႈ။ (တေလူဝ်ႇ JavaScript)",
+       "tog-watchlisthideanons": "လပ်ႉဝႆႉ ၵၢၼ်ထတ်းမႄး လူၺ်ႈၽူႈၸႂ်ႉတိုဝ်းႁၢမ်းၸိုဝ်ႈ ၵႃႊတီႈသဵၼ်ႈမၢႆ",
+       "tog-watchlisthidepatrolled": "လပ်ႉဝႆႉ ၵၢၼ်ထတ်းမႄးဢၼ်ပႂ်ႉတူၺ်းဝႆႉၼၼ်ႉ ၵႃႊတီႈသဵၼ်ႈမၢႆ",
+       "tog-watchlisthidecategorization": "သိူင်ႇၼႃႈလိၵ်ႈ လွင်ႈပၢႆး-",
+       "tog-ccmeonemails": "သူင်ႇၽိုၼ်မိူၼ်ဢီးမဵလ်း ဢၼ်ၵဝ်ၶႃႈသူင်ႇၸူး ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉၶဝ်",
+       "tog-diffonly": "ယႃႇပေၼႄ လွင်ႈၶဝ်ႈပႃးၼႂ်း ၼႃႈလိၵ်ႈ ၸွမ်းၼင်ႇ လွၵ်းၽၢႆႇတႂ်ႈၼႆႉ",
+       "tog-showhiddencats": "ပိုတ်ႇၼႄ လိူင်ႈ ဢၼ်လပ်ႉဝႆႉ",
+       "tog-norollbackdiff": "ဝၢႆးသေႁဵတ်း ႁူၼ်လင်ၶိုၼ်းယဝ်ႉၼႆ ယႃႇပေၼႄ လွၵ်း diff လႃႈ",
+       "tog-useeditwarning": "ပေႃးပႆႇလႆႈ ၵဵပ်းသိမ်းၼႃႈလိၵ်ႈ ဢၼ်ၶႃႈမူၼ်ႉမႄးဝႆႉသေ သင်ၸိူဝ်ႉဝႃႈ ၶႃႈဢွၵ်ႇၵႂႃႇၼႆ ၽၢင်ႉတိူၼ်ႇပၼ်ၶႃႈ သေၵမ်း",
+       "tog-prefershttps": "ၽွင်းၶဝ်ႈၸႂ်ႉတိုဝ်းၼၼ်ႉ ၸႂ်ႉတိုဝ်းၶွၼ်ႇၼႅၵ်ႉသျိၼ်ႇ ဢၼ်ႁူမ်ႇလူမ်ႈ",
+       "underline-always": "ၵူႊယၢမ်း",
+       "underline-never": "ဢမ်ႇႁဵတ်းသေပွၵ်ႈ",
+       "underline-default": "ပိူင်ၵႅဝ်ႈၾၢင်ႁၢင်ႊတၢင်းၼွၵ်ႈ ဢမ်ႇၼၼ် ပြၢဝ်းသိူဝ်ႇ",
+       "editfont-style": "ဢွင်ႈတီႈဢၼ်ထတ်းမႄး ဝႅပ်ႇယၢင်ႇၾွၼ်ႉ",
+       "editfont-default": "ပၵ်းၵဝ်ႇပိူင်ၵဝ်ႇပြၢဝ်းသိူဝ်ႇ",
+       "editfont-monospace": "ၾွၼ်ႉ မူဝ်ႇၼူဝ်သပဵတ်ႉ",
+       "editfont-sansserif": "ၾွၼ်ႉ San-serif",
+       "editfont-serif": "ၾွၼ်ႉဢၼ်သဵၼ်ႈတိူဝ်းၸႅင်ႈ",
+       "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": "တီႇ",
+       "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": "AM ပွတ်းၸဝ်ႉ",
+       "period-pm": "PM ပွတ်းလႃႈ",
+       "pagecategories": "{{PLURAL:$1|လိူင်ႈ|လိူင်ႈတင်းလၢႆ}}",
+       "category_header": "ၼႃႈလိၵ်ႈၼႂ်းလိူင်ႈ \"$1\"",
+       "subcategories": "ၵိင်ႇၽႄလိူင်ႈ",
+       "category-media-header": "သိုဝ်ႇၼႂ်းလိူင်ႈ \"$1\"",
+       "category-empty": "<em> လိူင်ႈဢၼ်ၼႆႉ ၸင်ႇၼႆႉ ဢမ်ႇမီးၼႃႈလိၵ်ႈ ဢမ်ႇၼၼ် သိုဝ်ႈဢီႈသင်ဝႆႉ</em>",
+       "hidden-categories": "{{PLURAL:$1|လိူင်ႈဢၼ်လပ်ႉဝႆႉ |လိူင်ႈၸိူဝ်း ဢၼ်လပ်ႉဝႆႉ}}",
+       "hidden-category-category": "လိူင်ႈ ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
+       "category-subcat-count": "{{PLURAL:$2|ၼႂ်းလိူင်ႈဢၼ်ၼႆႉ မီးၵိင်ႇၽႄလိူင်ႈၼႆႉ ၸိူင်ႉၼႆၵွၺ်း|ၼႂ်းလိူင်ႈၼႆႉ မီး This category has the following {{PLURAL:$1|ၵိင်ႇၽႄလိူင်ႈ|$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆး}}, ၼႂ်းၵႃႊ $2 တင်းသဵင်ႈတင်းမူတ်း}}",
+       "category-subcat-count-limited": "ၼႂ်းလိူင်ႈၼႆႉ မီးဝႆႉလိူင်ႈၼင်ႇၼႆ {{PLURAL:$1| ၵိင်ႇၽႄလိူင်ႈ |$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆ}}",
+       "category-article-count": "{{PLURAL:$2| လိူင်ႈဢၼ်ၼႆႉ ပႃးဝႆႉၼႃႈလိၵ်ႈၼင်ႇပႃႈတႂ်ႈၼႆႉၵွၺ်း |တၢင်းပႃႈတႂ်ႈၼႆႉ{{PLURAL:$1| ၼႃႈလိၵ်ႈ }} မီးၼႂ်းလိူင်ႈၼႆႉ ၵႃႊၼႂ်း $2 တင်းသဵင်ႈတင်းမူတ်း}}",
+       "category-article-count-limited": "တၢင်းပႃႈတႂ်ႈၼႆႉ  {{PLURAL:$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": "လွင်ႈတၢင်း",
+       "article": "ၼမ်းၼႂ်း",
+       "newwindow": "(ပိုတ်ႇၼင်ႇဝိၼ်းတူဝ်း ဢၼ်မႂ်ႇ)",
+       "cancel": "ဢမ်ႇႁဵတ်း",
+       "moredotdotdot": "ထႅင်ႈ...",
+       "morenotlisted": "သဵၼ်ႈမၢႆဢၼ်ၼႆႉ ဢမ်ႇတဵမ်ထူၼ်ႈ။",
+       "mypage": "ၼႃႈလိၵ်ႈ",
+       "mytalk": "တွၼ်ႈဢုပ်ႇ",
+       "anontalk": "တွၼ်ႈဢုပ်ႇ",
+       "navigation": "ၼႄတၢင်း",
+       "and": "&#32;လႄႈ",
+       "qbfind": "ႁႃ",
+       "qbbrowse": "ပိုတ်ႇႁႃ",
+       "qbedit": "မူၼ်ႉမႄး",
+       "qbpageoptions": "ၼႃႈလိၵ်ႈၼႆ့",
+       "qbmyoptions": "ၼႃႈလိၵ်ႈၵဝ်ၶႃႈ",
+       "faq": "ၶေႃႈထၢမ်ၵႆႉႁူပ်ႉ",
+       "faqpage": "Project:တွၼ်ႈတွင်ႈထၢမ်",
+       "actions": "ၵၢၼ်ႁဵတ်းသၢင်ႈ",
+       "namespaces": "ဢွင်ႈတီႈၸိုဝ်ႈ",
+       "variants": "လွင်ႈပႅၵ်ႇပိူင်ႈ",
+       "navigation-heading": "သဵၼ်ႈၵၢၼ်ၼႄတၢင်း",
+       "errorpagetitle": "ၽိတ်း",
+       "returnto": "ၶိုၼ်းဝၢႆႇၸူး $1.",
+       "tagline": "လုၵ်ႉတီႈ {{SITENAME}} မႃး",
+       "help": "ၸွႆႈထႅမ်",
+       "search": "ၶူၼ်ႉႁႃ",
+       "searchbutton": "ၶူၼ်ႉႁႃ",
+       "go": "သိုပ်ႇၵႂႃႇ",
+       "searcharticle": "သိုပ်ႇၵႂႃႇ",
+       "history": "ပိုၼ်းၼႃႈလိၵ်ႈ",
+       "history_short": "ပိုၼ်း",
+       "updatedmarker": "ပဵၼ်ဢၢပ်ႉတိတ်ႉဝႆႉ ၸဵမ်မိူဝ်ႈၶႃႈၵႂႃႇဢႅဝ်ႇၵမ်းလိုၼ်းသုတ်း",
+       "printableversion": "တွၼ်ႈတႃႇဢိတ်ႇဢွၵ်ႇ",
+       "permalink": "ႁဵင်းၵွင်ႉ မၼ်ႈၵိုမ်း",
+       "print": "ထုတ်ႇဢွၵ်ႇ",
+       "view": "လူတူၺ်း",
+       "view-foreign": "တူၺ်းတီႈ $1",
+       "edit": "မူၼ်ႉမႄး",
+       "edit-local": "မႄးထတ်း ၶေႃႈသပ်းလႅင်းလူဝ်ႇၵႄႇ",
+       "create": "သၢင်ႈ",
+       "create-local": "ထႅမ်သႂ်ႇ ၶေႃႈသပ်းလႅင်းလူဝ်ႇၵႄႇ",
+       "editthispage": "မူၼ်ႉမႄး ၼႃႈလိၵ်ႈၼႆႉ",
+       "create-this-page": "သၢင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "delete": "ယႃႉ",
+       "deletethispage": "ယႃႉ ၼႃႈလိၵ်ႈၼႆႉ",
+       "undeletethispage": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈၼႆ့",
+       "undelete_short": "ဢဝ်ၶိုၼ်း {{PLURAL:$1|ဢၼ် ထတ်းသၢင်ႈ |$1 ၸိူဝ်းထတ်းသၢင်ႈ}}",
+       "viewdeleted_short": "တူၺ်း {{PLURAL:$1|လွင်ႈထတ်းသၢင်ႈ ဢၼ်မွတ်ႇပႅတ်ႈ|$1 ၸိူဝ်းထတ်းသၢင်ႈ ဢၼ်မွတ်ႇပႅတ်ႈ}}",
+       "protect": "ႁေႉၵင်ႈ",
+       "protect_change": "လႅၵ်ႈလၢႆႈ",
+       "protectthispage": "ႁေႉၵင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "unprotect": "လႅၵ်ႈလၢႆႊ ၵၢၼ်ႁေႉၵင်ႈ",
+       "unprotectthispage": "လႅၵ်ႈလၢႆႊ ၵၢၼ်ႁေႉၵင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "newpage": "ၼႃႈလိၵ်ႈမႂ်ႇ",
+       "talkpage": "ဢုပ်ႇလိူၺ်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "talkpagelinktext": "တွၼ်ႊဢုပ်ႇ",
+       "specialpage": "ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
+       "personaltools": "ၶိူင်ႈ​သုၼ်ႇ​လဵ​ဝ်",
+       "articlepage": "တူၺ်း ၼႃႈလိၵ်ႈ ၼမ်းၼႂ်း",
+       "talk": "တႃႇဢုပ်ႇ",
+       "views": "လူတူၺ်း",
+       "toolbox": "ၶိူင်ႈၵမ်ႉၵႅမ်",
+       "userpage": "တူၺ်းၼႃႈလိၵ်ႈၽူႈၸႂ်ႉတိုဝ်း",
+       "projectpage": "တူၺ်းၼႃႈလိၵ်ႈ ပရေႃးၵျႅၵ်ႉ",
+       "imagepage": "တူၺ်းၼႃႈလိၵ်ႈၾၢႆႇ",
+       "mediawikipage": "တူၺ်းၼႃႈလိၵ်ႈ ၶေႃႈၶၢဝ်ႇ",
+       "templatepage": "တူၺ်းၼႃႈလိၵ်ႈ လွၵ်းပိူင်",
+       "viewhelppage": "တူၺ်းၼႃႈလိၵ်ႈ ၸွႆႈထႅမ်",
+       "categorypage": "တူၺ်းၼႃႈလိၵ်ႈထၢၼ်ႈ",
+       "viewtalkpage": "တူၺ်း တွၼ်ႈဢုပ်ႇဢူဝ်း",
+       "otherlanguages": "ၼႂ်း​လိၵ်ႈ​တၢင်ႇဢၼ်",
+       "redirectedfrom": "(လုၵ်ႉတီး $1 ၼႆႈသေ ၶိုၼ်းပိၼ်ႇဝၢႆႇမႃး)",
+       "redirectpagesub": "ပိၼ်ႇႁူဝ်ၼႃႈလိၵ်ႈ",
+       "redirectto": "ဝိၼ်ႇၵႂႃႇၸူး:",
+       "lastmodifiedat": "ၼႃႈ​လိၵ်ႈၼႆ့ မႄး​ဝႆႉ ၼင်ႇ​ၵမ်း​လိုၼ်း​သုတ်း မိူဝ်ႈ ဝၼ်း​တီႈ $1 ၶၢဝ်းယၢမ်း $2",
+       "viewcount": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇၸႂ်ႉဝႆႉ {{PLURAL:$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",
+       "copyrightpage": "{{ns:project}}:သုၼ်ႇထုတ်ႇ",
+       "currentevents": "ၵၢၼ်ႁဵတ်းသၢင်ႈယၢမ်းလဵဝ်",
+       "currentevents-url": "Project:ၵၢၼ်ႁဵတ်းသၢင်ႈ ယၢမ်းလဵဝ်",
+       "disclaimers": "ၶေႃႈထဵင်",
+       "disclaimerpage": "Project:ၵၢၼ်ထဵင်ၶိုၼ်းၵူႈလွင်ႈလွင်ႈ",
+       "edithelp": "မႄးထတ်းၵၼ်ၸွႆႈထႅမ်",
+       "helppage-top-gethelp": "ၸွႆႈထႅမ်",
+       "mainpage": "ၼႃႈႁူဝ်ႁႅၵ်ႈ",
+       "mainpage-description": "ၼႃႈႁူဝ်ႁႅၵ်ႈ",
+       "policy-url": "Project:လၢႆးငၢၼ်း",
+       "portal": "ၽွတ်ႇတိူဝ်ႇ တူင်ႇဝိူင်း",
+       "portal-url": "Project:ၽွတ်ႇတိူဝ်ႇ တူင်ႇဝိူင်း",
+       "privacy": "လၵ်း​ၼမ်း လွင်ႈ​ႁူမ်ႇ​လူမ်ႈ သုၼ်ႇ​လဵဝ်",
+       "privacypage": "Project:လၵ်း​ၼမ်း လွင်ႈ​ႁူမ်ႈ​လူမ်ႈ သုၼ်ႇ​လဵဝ်",
+       "badaccess": "ၵၢၼ်လူတ်းပွႆႇ ၽိတ်းပိူင်ႈ",
+       "badaccess-group0": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇထုၵ်ႇၶႂၢင်းပၼ်တႃႇတေၸႂ်ႉ လွင်ႈႁဵတ်းသၢင်ႈ ဢၼ်ၸဝ်ႈၵဝ်ႇ တုၵ်းယွၼ်းဝႆႉၼၼ်ႉ။",
+       "badaccess-groups": "လွင်ႈႁဵတ်သၢင်ႈ ဢၼ်ၸဝ်ႈၵဝ်ႇ တုၵ်းယွၼ်းဝႆႉၼၼ်ႉ မၼ်းထုၵ်ႇ မၵ်းၶႅၼ်ႈဝႆႉတႃႇ ၽူႈၸႂ်ႉတိုဝ်းၶဝ် တီႈၼႂ်း  {{PLURAL:$2|ၸုမ်း |ၸုမ်းၸိူဝ်းၼႆႉ}}: $1.",
+       "versionrequired": "တေလူဝ်ႇ ပိူဝ်းသျိၼ်း မၢႆဢွၵ်ႇ ဝီႇၶီႇမီႇတီႇယႃႇ $1",
+       "versionrequiredtext": "တႃႇတေၸႂ်ႉ ၼႃႈလိၵ်ႈၼႆ့ၼႆ တေလူဝ်ႇ ပိူဝ်းသျိၼ်း မႆဢွၵ်ႇ ဝီႇၶီႇမီႇတီႇယႃႇ $1  ဢေႃႈ။ တူၺ်းပႃး [[Special:Version|ၼႃးလိၵ်ႈ မၢႆဢွၵ်ႇ]].",
+       "ok": "ဢူဝ်ႇၶေႇ",
+       "retrievedfrom": "ဢဝ်ၶိုၼ်းမႃးတီႈ \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|ၸဝ်ႈၵဝ်ႇ လႆႈႁပ်ႉဝႆႉ}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|ၸဝ်ႈၵဝ်ႇလႆႈႁပ်ႉဝႆႉ}} $1 ၵႃႈတီႈ {{PLURAL:$3|ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၵေႃႉ |$3 ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း}} ($2).",
+       "youhavenewmessagesmanyusers": "ၸဝ်ႈၵဝ်ႇလႆႈႁၢပ်ႉဝႆႉ $1 ၵႃႈတီႈၽူႈၸႂ်ႉတိုဝ်းတၢင်းၼမ် ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|ၶေႃႈၶၢဝ်ႇမႂ်ႇ|999=ၶေႃႈၶၢဝ်ႇမႂ်ႇ}}",
+       "newmessagesdifflinkplural": "ဢၼ် {{PLURAL:$1|လႅၵ်ႈလၢႆႈ|999=လႅၵ်ႈလၢႆႈ}} ၵမ်းလိုၼ်းသုတ်း",
+       "youhavenewmessagesmulti": "ၸဝ်ႈၵဝ်ႇႁပ်ႉလႆႈၶေႃႈၶၢဝ်ႇမႂ်ႇ ၵႃႈတီႈ $1",
+       "editsection": "မူၼ်ႉမႄး",
+       "editold": "မူၼ်ႉမႄး",
+       "viewsourceold": "တူၺ်း ငဝ်ႈငႃႇ",
+       "editlink": "မႄးထတ်း",
+       "viewsourcelink": "တူၺ်း ငဝ်ႈငႃႇ",
+       "editsectionhint": "မူၼ်ႉမႄး တွၼ်ႊ :$1",
+       "toc": "ၼမ်းၼႂ်း",
+       "showtoc": "ၼႄ",
+       "hidetoc": "သိူင်ႇ",
+       "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": "$1 ၶၢဝ်ႇၶီး RSS",
+       "site-atom-feed": "ၾိတ်ႉဢတွမ်ႊ $1 ဢၼ်",
+       "page-rss-feed": "\"$1\" ၶၢဝ်ႇၶီး RSS",
+       "page-atom-feed": "ၾိတ်ႉဢတွမ်ႊ $1 ဢၼ်",
+       "red-link-title": "ၼႃႈလိၵ်ႈ $1 ၼႆႉ ဢမ်ႇမီးယဝ်ႉ",
+       "sort-descending": "ၶပ်ႉတၢမ်းလူင်း",
+       "sort-ascending": "ၶပ်ႉတၢမ်းၶိုၼ်ႈ",
+       "nstab-main": "ၼႃႈလိၵ်ႈ",
+       "nstab-user": "ၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "nstab-media": "ၼႃႈလိၵ်ႈ သိုဝ်ႇၶၢဝ်ႇ",
+       "nstab-special": "ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
+       "nstab-project": "ၼႃႈလိၵ်ႈ ၶူင်းၵၢၼ်",
+       "nstab-image": "ၾၢႆႇ",
+       "nstab-mediawiki": "ၶေႃႈၽၢၵ်ႇ",
+       "nstab-template": "ပိူင်",
+       "nstab-help": "ၼႃႈလိၵ်ႈ ၸွႆႈထႅမ်",
+       "nstab-category": "လိူင်ႈ",
+       "mainpage-nstab": "ၼႃႈႁူဝ်ႁႅၵ်ႈ",
+       "nosuchaction": "ဢမ်ႇမီး လွင်ႈတူင်ႉၼိုင်",
+       "nosuchactiontext": "လွင်ႈတူင်ႉၼိုင်ဢၼ် URL မၵ်းမၼ်ႈဝႆႉၼၼ်ႉ မၼ်းဢမ်ႇမီးဝႆႉ။\n ၸဝ်ႈၵဝ်ႇတေပေႃႉ URL မၼ်းၽိတ်းဝႆႉ ဢမ်ႇၼၼ် လႆႈၸွမ်းဝႆႉ ႁဵင်းၵွင်ႉ ဢၼ်ၽိတ်းဝႆ့။ ပေႃးၸႂ်ႉ  {{SITENAME}} ၼႆ မၼ်းတေၸီ့ၼႄပၼ် ၶေႃႈယုင်ႈယၢင်ႈ တီႈၼႂ်း သွပ်ႉၾ်ဝႄးယူႇ။",
+       "nosuchspecialpage": "ဢမ်ႇမီး ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်း",
+       "nospecialpagetext": "<strong>ၸဝ်ႈၵဝ်ႇ တုၵ်းယွၼ်းဝႆႉ ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်း ဢၼ်ဢမ်ႇပႆႇမီး</strong>\n\nသဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်း ၸိူဝ်းဢၼ်ၸၢင်ႈဢဝ်လႆႈၼႆႉ တေလႆႈႁၼ်ၵႃႈတီႈ [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "ၽိတ်းပိူင်ႈ",
+       "databaseerror": "ယွင်ၶေႃႈမုၼ်း ၽိတ်းပိူင်ႈ",
+       "databaseerror-text": "လႆႈပဵၼ်ဝႆႉ လွင်ႈၽိတ်းပိူင်ႈ ၵၢၼ်ၶူၼ်ႉႁႃ ယွင်ၶေႃႈမုၼ်း ။ ၼႆႉမၼ်းတေ ၼႄပၼ် လွင်ႈယုင်ႈယၢင်ႈ ၵႃႈတီႈၼႂ်း သွပ်ႉၾ်ဝႄး",
+       "databaseerror-textcl": "ၵၢၼ်ၶူၼ်ႉႁႃ ယွင်ၶေႃႈမုၼ်း လႆႈပဵၼ် လွင်ႈၽိတ်းပိူင်ႈဝႆႉ။",
+       "databaseerror-query": "ၶူၼ်ႉႁႃ : $1",
+       "databaseerror-function": "ၼႃႈၵၢၼ် : $1",
+       "databaseerror-error": "လွင်ႈၽိတ်းပိူင် : $1",
+       "transaction-duration-limit-exceeded": "တႃတေဝႄႈလႆႈ လွင်ႈသၢင်ႈၼႃႈလိၵ်ႈ မႃးမိူၼ်ၵၼ်ၼၼ်ႉ ၵၢၼ်လၢႆႈတီႈဢၼ်ၼႆႉ ထုၵ်ႇၵိုတ်းယင်ႉပႅတ်ႈ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၶၢဝ်းယၢမ်းတႅမ်ႈ ($1) ၼႆႉ မၼ်းပူၼ်ႉလိူဝ်သေ $2 {{PLURAL:$2|ၸႅတ်ႉၵၢၼ်ႉ|ၸႅတ်ႉၵၢၼ်ႉလိူဝ်}} ဢၼ်မၵ်းၶႅၼ်ႈဝႆႉ။\nသင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ လႅၵ်ႈလၢႆႈလၢႆဢၼ်ႁူမ်ႈမိူဝ်ႈလဵဝ်ၵၼ်ၼႆ၊ ၶႂ်ႈႁႂ်ႈၶတ်းၸႂ်ႁဵတ်းတူၺ်း တင်း multiple smaller operation ဢေႃႈ။",
+       "laggedslavemode": "<strong>ၶေႃႈၽၢင်ႉ:</strong>ၼႃႈလိၵ်ႈ တေဢမ်ႇဢၢပ်ႈၶဝ်ႈပႃး ဢၢပ်ႉတိတ်ႉ",
+       "readonly": "ယွင်ၶေႃႈမုၼ်း ထုၵ်ႇၶတ်းဝႆႉ",
+       "enterlockreason": "ပေႃႉသႂ်ႇပၼ် လွင်ႈတၢင်းတႃႇ တေၶတ်းဝႆႉ၊ ႁႂ်ႈပႃးပၼ် ၸဵမ်ၶၢဝ်းယၢမ်း လၢမ်းဢၼ်ဝႃႈ လွင်ႈၶတ်းဝႆႉၼႆႉ တေဢၢပ်ႈၶိုၼ်းပိုတ်ႇပၼ် မိူဝ်ႈလႂ် ဢၼ်ဝႃႈၼၼ်ႉ။",
+       "readonlytext": "ယွင်ၶေႃႈမုၼ်းၼႆႉ ယၢမ်းလဵဝ် ထုၵ်ႇၶတ်းဝႆႉတႃႇ တေထႅမ်သႂ်ႇဢၼ်မႂ်ႇ လႄႈ တႃႇမူၼ်ႉမႄး တၢင်ႇလွင်ႈတၢင်ႇၸိူဝ်း၊ မၼ်းတေဢၢပ်ႈပဵၼ်လူၺ်ႈ လွင်ႈဝႃႈ တိုၵ်ႉမူၼ်ႉမႄး ယွင်ၶေႃႈမုၼ်း ၼင်ႇၵႆႉႁဵတ်း။ ဝၢႆးသေၼၼ်ႉတႄႉ တေၶိုၼ်းႁဵတ်းၵၢၼ် မိူၼ်ၵဝ်ႇယူႇ။\n\nဢၼ်ပဵၼ် ၽူႈၵုမ်းၵမ်ပိူင်ႈသၢင်ႈ ၵေႃႉဢၼ်လႆႈ ၶတ်းၼႆႉဝႆႉၼၼ်ႉ မၼ်းပၼ်လွင်ႈသပ်းလႅင်းဝႆႉဝႃႈ : $1",
+       "missing-article": "ယွင်ၶေႃႈမုၼ်း ဢမ်ႇသွၵ်ႈႁႃႁၼ်လႆႈ ၽိုၼ်ၼႃႈလိၵ်ႈ ဢၼ်ထုၵ်ႇလီသွၵ်ႈထူပ်းႁၼ် ဢၼ်မီးၸိုဝ်ႈဝႃႈ \"$1\" $2 ။\n\nၼႆႉမၼ်းဢၢပ်ႈပဵၼ်ဝႆႉ ဢၼ်ၸိူဝ်းၼၼ်ႉ မၼ်းၵဝ်ႇၵႄႇၼႃႇလႄႈသင် ဢၼ်ပဵၼ် ပိုၼ်းႁဵင်းၵွင်ႉ ၸူးၼႃႈလိၵ်ႈၼၼ်ႉ ထုၵ်ႇမွတ်ႇပႅတ်ႈယဝ်ႉလႄႈသင် ​ၼႆဢေႃႈ။\n\nပေႃးဢမ်ႇၸႂ်ၸိူင်ႉၼၼ်တႄႉ ၸဝ်ႈၵဝ်ႇ တေလႆႈႁၼ် လွင်ႈယုင်ႈယၢင်ႈၼႆႉ တေၼႄဝႆႉ တီႈၼႂ်း သွပ်ႉၾ်ဝႄး ယူႇ။\nၶႅၼ်းတေႃႈ လဝ်ႈထိုင်ၼႆႉၸူး ၵႃႈတီႈ  [[Special:ListUsers/sysop|administrator]] သေ မၢႆတွင်းဝႆႉပႃး ႁဵင်းလိၵ်ႈ URL မၼ်းသေၶႃႈလႄႈ။",
+       "missingarticle-rev": "(ၵၢၼ်ၶူၼ်ႉၶိုၼ်း#: $1)",
+       "missingarticle-diff": "(ၼိူင်း: $1, $2)",
+       "readonly_lag": "ယွင်ၶေႃႈမုၼ်းၼႆႉ မၼ်းထုၵ်ႇၶတ်းၵႂႃႇ ႁင်းမၼ်း ၽွင်းမိူဝ်ႈ သႃႇပိူဝ်ႇယွင်ၶေႃႈမုၼ်း ဢၼ်ၵႅမ်မၼ်း ထုၵ်ႇတီႉၸပ်းၸူး သႃႇပိူဝ်ႇ​ယွင်ၶေႃႈမုၼ်း ငဝ်ႈမၼ်း။",
+       "nonwrite-api-promise-error": "ဢၼ်ပဵၼ်​ႁူဝ်ၶေႃႈ HTTP ၼင်ႇ 'Promise-Non-Write-API-Action' ၼၼ်ႉထုၵ်ႇ သူင်ႇၸူးယဝ်ႉသေတႃႉ လွင်ႈတုၵ်းယွၼ်း မၼ်းတႄႉ တိုၵ်ႉမီးယူႇတီႈ API write module ။",
+       "internalerror": "ၽိတ်းၽၢႆႇၼႂ်း",
+       "internalerror_info": "ၽိတ်းပိူင်ႈၽၢႆႇၼႂ်း : $1",
+       "internalerror-fatal-exception": "လွင်ႈတၢင်း လွင်ႈလူႉလႅဝ် ၶွင်လိူင်ႈ \"$1\"",
+       "filecopyerror": "ဢမ်ႇၸၢင်ႈထုတ်ႇဢဝ် ၾၢႆႇ \"$1\" ၸူး \"$2\".",
+       "filerenameerror": "ဢမ်ႇၸၢင်ႈမႄးလၢႆႈၸိုဝ်ႈ \"$1\" ၸူး \"$2\".",
+       "filedeleteerror": "ဢမ်ႇၸၢင်ႈမွတ်ႇပႅတ်ႈ ၾၢႆႇ \"$1\".",
+       "directorycreateerror": "ဢမ်ႇၸၢင်ႈသၢင်ႈ ၾူဝ်ႇတႃႇဢွင်ႈသိမ်း \"$1\".",
+       "directoryreadonlyerror": "ၾူဝ်ႇတႃႇဢွင်ႈသိမ်း \"$1\" ၼႆႉပဵၼ် တႃႇလူႇၵူၺ်း။",
+       "directorynotreadableerror": "ၾူဝ်ႇတႃႇဢွင်ႈသိမ်း \"$1\" ၼႆႉ လူဢမ်ႇလႆႈ။",
+       "filenotfound": "ဢမ်ႇၸၢင်ႈသွၵ်ႈႁႃၾၢႆႇ \"$1\"",
+       "unexpected": "မၢႆၶၼ် ဢၼ်ဢမ်ႇမုင်ႈမွင်းဝႆႉ \"$1\"=\"$2\".",
+       "formerror": "လွင်ႈၽိတ်းပိူင်ႈ : ဢမ်ႇၸၢင်ႈယိုၼ်ႈသူင်ႇ ၽိုၼ်တမ်း",
+       "badarticleerror": "လွင်ႈႁဵတ်းသၢင်ႈ ဢၼ်ၼႆႉ တေဢမ်ႇၸၢင်ႈ ႁဵတ်းလႆႈ တီႈ ၼႃႈလိၵ်ႈၼႆႉ။",
+       "cannotdelete": "ၼႃႈလိၵ်ႈ ဢမ်ႇၼၼ် ၾၢႆႇ \"$1\" ၼႆႉ ဢမ်ႇၸၢင်ႈ မွတ်ႇပႅတ်ႈလႆႈ။\nမၼ်းဢၢပ်ႈပဵၼ် ၵူၼ်းသေၵေႃႉၵေႃႉ မွတ်ႇပႅတ်ႈၵႂႃႇယဝ်ႉ။",
+       "cannotdelete-title": "ဢမ်ႇၸၢင်ႈ မွတ်ႇပႅတ်ႈ ၼႃႈ လိၵ်ႈ \"$1\"",
+       "delete-hook-aborted": "လွင်ႈမွတ်ႇပႅတ်ႈ ထုၵ်ႇ ၵိုတ်းပႅတ်ႈ။\nမၼ်းဢမ်ႇမီး လွင်ႈ သပ်းလႅင်းၼႄသင်ဝႆႉ။",
+       "no-null-revision": "ဢမ်ႇၸၢင်ႈၵေႃႇသၢင်ႈ တူဝ်ၶူၼ်ႉၶိုၼ်းပဝ်ႇမႂ်ႇ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈ \"$1\"",
+       "badtitle": "ႁူဝ်ၶေႃႈႁၢႆႉၸႃႉ",
+       "badtitletext": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈဢၼ် တုၵ်းယွၼ်းဝႆႉၼႆႉ မၼ်းဢမ်ႇၸႂ်ႉလႆႈ၊ ပဝ်ႇဝႆ့ ဢမ်ႇၼၼ် မၼ်းၵွင်ႉၽိတ်းပိူင်ႈဝႆႉတင်း ၽႃႇသႃႇၵႂၢမ်းတၢင်ႇဢၼ် ဢမ်ႇၼၼ် ႁူဝ်ၶေႃႈၼႂ်းၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆ့။",
+       "title-invalid-empty": "ၼႃႈလိၵ်ႈဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းဢမ်ႇပႃးဝႆႉႁူဝ်ၶေႃႈမၼ်း ဢမ်ႇၼၼ် မၼ်းတေပႃးဝႃႈ ၸိုဝ်ႈဢၼ်ပဵၼ် လွၵ်းပဝ်ႇဝႆႉၼၼ်ႉၵူၺ်း။",
+       "title-invalid-utf8": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းဝႆႉၼႆႉ မၼ်းပႃးဝႆႉ သၢႆသဵၼ်ႈ UTF-8 ဢၼ်ဢမ်ႇပဵၼ်လႆႈ။",
+       "title-invalid-interwiki": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းပႃးဝႆႉ ႁဵင်းၵွင်ႉ တူဝ်ၼႂ်းဝီႇၶီႇ ဢၼ်ဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈ တႃႇႁူဝ်ၶေႃႈ။",
+       "title-invalid-talk-namespace": "ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းမၢႆထိုင်ၸူး ၼႃႈလိၵ်ႈဢုပ်ႇဢူဝ်း ဢၼ်ဢမ်ႇၸၢင်ႈ မီးလႆႈၼၼ်ႉ။",
+       "title-invalid-characters": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းၶဝ်ႈပႃးဝႆႉ တူဝ်လိၵ်ႈ ဢၼ်ဢမ်ႇ ၸႂ်ႉလႆႈ : \"$1\"",
+       "viewsource": "တူၺ်း ငဝ်ႈငႃႇ",
+       "viewsource-title": "တူၺ်းငဝ်ႈငႃႇ တွၼ်ႈတႃႇ $1",
+       "protectedpagetext": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ တႃႇၵႅတ်ႇၶႄ လွင်ႈမူၼ်ႉမႄး ဢမ်ႇၼၼ် လွင်ႈႁဵတ်းသၢင်ႈ တၢင်ႇၸိူဝ်း",
+       "viewsourcetext": "ၸဝ်ႈၵဝ်ႇ ၸၢင်ႈတူၺ်း သေ ထုတ်ႇဢဝ်လႆႈ ငဝ်ႈငႃႇ တႃႇၼႃႈလိၵ်ႈၼႆႉ",
+       "viewyourtext": "ၸဝ်ႈၵဝ်ႇ ၸၢင်ႈတူၺ်းသေ ထုတ်ႇဢဝ်လႆႈ ငဝ်ႈငႃႇ တွၼ်ႈတႃႇ <strong>လွင်ႈမႄးထတ်းၸဝ်ႈၵဝ်ႇ</strong> ၸူး ၼႃႈလိၵ်ႈၼႆႉ",
+       "translateinterface": "တႃႇတေထႅမ်သႂ်ႇ ဢမ်ႇၼၼ် မႄး​လႅၵ်ႈလၢႆႈ လွင်ႈပိၼ်ႇၽႃႇသႃႇ တႃႇ ဝီႇၶီႇၼႆ ၶႅၼ်းတေႃႈ ၸႂ်ႉပၼ်  [//translatewiki.net/ translatewiki.net] ဢၼ်ပဵၼ် ၼႃႈၵၢၼ် ပိၼ်ႇၽႃႇသႃႇ မီႇတီႇယႃႇဝီႇၶီႇ ၼႆႉၶႃႈ။",
+       "namespaceprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တႃႇတေမႄးထတ်း ၼႃႈလိၵ်ႈၸိူဝ်းၼႆႉ ၵႃႈတီႈၼႂ်း <strong>$1</strong> ၸိုဝ်ႈၼႆႉ။",
+       "customcssprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ CSS ဢၼ်ၼႆႉ။ ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းပႃးဝႆႉ ၵၢၼ်တင်ႈ လွင်ႈသုၼ်ႇတူဝ် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉဢေႃႈ။",
+       "customjsprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ JavaScript ဢၼ်ၼႆႉ။ ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းပႃးဝႆႉ ၵၢၼ်တင်ႈ လွင်ႈသုၼ်ႇတူဝ် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉဢေႃႈ။",
+       "mycustomcssprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ CSS ဢၼ်ၼႆႉ။",
+       "mycustomjsprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ JavaScript ဢၼ်ၼႆႉ။",
+       "ns-specialprotected": "ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်းၸိူဝ်းၼႆႉ တေဢမ်ႇၸၢင်ႈ မႄးထတ်းလႆႈ",
+       "titleprotected": "ႁူဝ်ၶေႃႈဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ ၽူႈၸႂ်ႉတိုဝ်း [[User:$1|$1]] ၵေႃႉၼႆႉ ႁႄႉၵင်ႈဝႆႉ။ လွင်ႈတၢင်း ဢၼ်မၼ်းပၼ်ဝႆႉတႄႉ <em>$2</em>.",
+       "exception-nologin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
+       "cannotlogoutnow-title": "ဢမ်ႇၸၢင်ႈ လွၵ်ႉဢွၵ်ႇ ယၢမ်းလဵဝ်",
+       "cannotlogoutnow-text": "တေဢမ်ႇၸၢင်ႈ လွၵ်ႉၶဝ်ႈ ၽွင်းမိူဝ်ႈၸႂ်ႉ $1",
+       "welcomeuser": "ႁပ်ႉတွၼ်ႈယူႇ, $1!",
+       "welcomecreation-msg": "ဢၶွင်ႉၸဝ်ႈၵဝ်ႇၼႆႉ ထုၵ်ႇၵေႃႇသၢင်ႈၵႂႃႇယဝ်ႉ။\nပေႃးၸဝ်ႈၵဝ်ႇ မီးၵၢင်ၸႂ်ၼႆ ၸဝ်ႈၵဝ်ႇၸၢင်ႈလႅၵ်ႈလၢႆး  {{SITENAME}} [[Special:Preferences|preferences]] လႆႈယူႇ။",
+       "yourname": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း",
+       "userlogin-yourname": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း",
+       "userlogin-yourname-ph": "ပေႃႇသႂ်ႇပၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ၸဝ်ႈၵဝ်ႇ",
+       "createacct-another-username-ph": "ပေႃႇသႂ်ႇပၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း",
+       "yourpassword": "ၶေႃႈလပ်ႉ",
+       "userlogin-yourpassword": "ၶေႃႈလပ်ႉ",
+       "userlogin-yourpassword-ph": "ပေႃႉသႂ်ႇၶေႃႈလပ်ႉ",
+       "createacct-yourpassword-ph": "ပေႃႉသႂ်ႇၶေႃႈလပ်ႉ",
+       "yourpasswordagain": "ၶိုၼ်းပေႃႉပၼ် ၶေႃႈလပ်ႉ :",
+       "createacct-yourpasswordagain": "ၼႄႉၼွၼ်းပၼ် ၶေႃႈလပ်ႉ",
+       "createacct-yourpasswordagain-ph": "ပေႃႉသႂ်ႇၶေႃႈလပ်ႉထႅင်ႈၵမ်းၼိုင်ႈ",
+       "remembermypassword": "တွင်းဝႆႉပၼ် လွၵ်ႉဢိၼ်ႇၵဝ်ၶႃႈ တီႈၼႂ်း ၶိူင်ႈပိုတ်ႇဝႆႉၼႆႉ  (တီႈႁိုင်ႁိုင်မၼ်း $1 {{PLURAL:$1|ၼိုင်ႈဝၼ်း|ဝၼ်း}})",
+       "userlogin-remembermypassword": "သိုပ်ႇဢဝ်ၵဝ်ၶႃႈ လွၵ်ႉဢိၼ်ႇဝႆႉလႄႈ",
+       "userlogin-signwithsecure": "ၸႂ်ႉၵွင်ႉသၢၼ် ႁူမ်ႇလူမ်ႈ",
+       "cannotloginnow-title": "ဢမ်ႇၸၢင်ႈၶဝ်ႈ လွၵ်ႉဢိၼ်ႇ ယၢမ်းလဵဝ်",
+       "cannotloginnow-text": "တေဢမ်ႇၸၢင်ႈ လွၵ်ႉၶဝ်ႈ ၽွင်းမိူဝ်ႈၸႂ်ႉ $1",
+       "yourdomainname": "တူဝ်ႇမဵင်း ၸဝ်ႈၵဝ်ႇ :",
+       "password-change-forbidden": "ၸဝ်ႈၵဝ်ႇတေဢမ်ႇၸၢင်ႈ ​လႅၵ်ႈလၢႆႈ ၶေႃႈလပ်ႉ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇၼႆႉ",
+       "login": "လွၵ်ႉဢိၼ်ႇ",
+       "login-security": "ၼႄႉၼွၼ်း မၢႆၽၢင်ၸဝ်ႈၵဝ်ႇ",
+       "nav-login-createaccount": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
+       "userlogin": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
+       "userloginnocreate": "လွၵ်ႉဢိၼ်ႇ",
+       "logout": "လွၵ်ႉဢဝ်ႉ",
+       "userlogout": "လွၵ်ႉဢဝ်ႉ",
+       "notloggedin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
+       "userlogin-noaccount": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ?",
+       "userlogin-joinproject": "ႁူမ်ႈ {{SITENAME}}",
+       "nologin": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ? $1",
+       "nologinlink": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
+       "createaccount": "ႁဵတ်းဢၶွင်ႉ",
+       "gotaccount": "မီးဢၶွင်ႉဝႆႉယဝ်ႉႁႃႉ? $1",
+       "gotaccountlink": "လွၵ်ႉဢိၼ်ႇ",
+       "userlogin-resetlink": "လိုမ်းပႅတ်ႈၵႂႃႇ ႁူဝ်ယွႆႈ လွၵ်ႉဢိၼ်ႉၸဝ်ႈၵဝ်ႇယဝ်ႉႁႃႉ?",
+       "userlogin-resetpassword-link": "လိုမ်းၵႂႃႇ ၶေႃႈလပ်ႉၸဝ်ႈၵဝ်ႇႁႃႉ?",
+       "userlogin-helplink2": "ၸွႆႈထႅမ်တင်း ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ",
+       "userlogin-loggedin": "​ၸဝ်ႈၵဝ်ႇပေႃး ၶဝ်ႈၸႂ်ႉဝႆႉ ၼင်ႇ{{GENDER:$1|$1}} ယဝ်ႈ။\nၸႂ်ႉပၼ် လၢႆးၼင်ႇပႃႈတႂ်ႈၼႆႉသေ လွၵ်ႉဢိၼ်ႇၼင်ႇ ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉ",
+       "userlogin-reauth": "ၸဝ်ႈၵဝ်ႇတေလႆႈ လွၵ်ႉဢိၼ်ႇထႅင်ႈၵမ်းၼိုင်ႈသေ တႃႇၼႄႉၼွၼ်းဝႃႈ ၸဝ်ႈၵဝ်ႇၼႆႉ ပဵၼ် {{GENDER:$1|$1}}.",
+       "userlogin-createanother": "ၵေႃႇသၢင်ႈဢၶွင်ႉ တၢင်ႇဢၼ်",
+       "createacct-emailrequired": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်",
+       "createacct-emailoptional": "ႁဵင်းလိၵ်ႈဢီးမေး (သႂ်ႇၵေႃႈလႆႈ၊ ဢမ်ႇသႂ်ႇၵေႃႈလႆႈ)",
+       "createacct-email-ph": "ပေႃႉသႂ်ႇပၼ် ႁဵင်းလိၵ်ႈ ဢီးမေးၸဝ်ႈၵဝ်ႇ",
+       "createacct-another-email-ph": "ပေႃႉသႂ်ႇပၼ် ႁဵင်းလိၵ်ႈ ဢီးမေးလ်",
+       "createaccountmail": "ၸႂ်ႉပၼ် ၶေႃႈလပ်ႉၸူဝ်ႈၵႅပ်ႉ သူင်ႇၼၼ်ႉၵႂႃႇၸူး ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်မၵ်းမၼ်ႈဝႆႉ ပၼ်ၼၼ်ႉ။",
+       "createacct-realname": "ၸိုဝ်ႈတႄႉတႄႉ (ဢဝ်ၸႂ်ဝႃႈ)",
+       "createaccountreason": "လွင်ႈတၢင်း :",
+       "createacct-reason": "လွင်ႈတၢင်း :",
+       "createacct-reason-ph": "ယွၼ်ႉပိူဝ်ႈသင်လႄႈ ၸဝ်ႈၵဝ်ႇ ၵေႃႇသၢင်ႈဢၶွင်ႉတၢင်ႇဢၼ်",
+       "createacct-reason-help": "ၶေႃႈၶၢဝ်ႇၼႄဝႆႉ ၵႃႈတီႈၼႂ်း သဵၼ်ႈ​မၢႆၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "createacct-submit": "ၵေႃႇသၢင်ႈ ဢၶွင်ႉၸဝ်ႈၵဝ်ႇ",
+       "createacct-another-submit": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
+       "createacct-continue-submit": "သိုပ်ႇၼႃႈ ၵၢၼ်ၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "createacct-another-continue-submit": "သိုပ်ႇၼႃႈ ၵၢၼ်ၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "createacct-benefit-heading": "{{SITENAME}} ၵူၼ်းၼင်ႇၸဝ်ႈၵဝ်ႇ ၵေႃႉႁဵတ်းဝႆႉ",
+       "createacct-benefit-body1": "{{PLURAL:$1|edit|မႄးထတ်း}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|page|ၼႃႈလိၵ်ႈ}}",
+       "createacct-benefit-body3": "မိူဝ်ႈဢၼ်ပႆႇပေႃးႁိုင် {{PLURAL:$1|contributor|ၽူႈၶဝ်ႈႁူမ်ႈ}}",
+       "badretype": "ၶေႃႈလပ်ႉ ဢၼ်ၸဝ်ႈၵဝ်ႇပေႃႉသႂ်ႇၼၼ်ႉ မၼ်းဢမ်ႇၶူပ်းၵၼ်",
+       "usernameinprogress": "ၵၢၼ်ၵေႃႇသၢင်ႈ ဢၶွင်ႉတွၼ်ႈတႃႇ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ တိုၵ်ႉႁဵတ်းၵၢၼ်ဝႆႉယူႇ။ ၶႅၼ်းတေႃႈပႂ်ႉပၼ်ၵမ်းၼိုင်ႈ။",
+       "userexists": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ပေႃႉသႂ်ႇဝႆႉၼၼ်ႉ မၼ်းထုၵ်ႇၸႂ်ႉဝႆႉယဝ်ႉ။\nၶႅၼ်းတေႃႈ လိူၵ်ႈပၼ် ၸိုဝ်ႈတၢင်ႇဢၼ်ၶႃႈလႄႈ။",
+       "loginerror": "လွၵ်ႉဢိၼ်ႇ ၽိတ်းပိူင်ႈ",
+       "createacct-error": "ၵၢၼ်ၵေႃႇသၢင်ႈ ဢၶွင်ႉ ၽိတ်းပိူင်ႈ",
+       "createaccounterror": "ဢမ်ႇၸၢင်ႈၵေႃႇသၢင်ႈ ဢၶွင်ႉ : $1",
+       "noname": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇလႆႈ မၵ်းမၼ်ႈဝႆႉပၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၸႂ်ႉလႆႈ။",
+       "loginsuccesstitle": "လွၵ်ႉဢိၼ်ႇဝႆႉယဝ်ႉ",
+       "loginsuccess": "<strong>ၸဝ်ႈၵဝ်ႇ လွၵ်ႉဢိၼ်ႇၶဝ်ႈၸူး  {{SITENAME}} ၼင်ႇ \"$1\".</strong> ယဝ်ႉဢေႃႈ ယၢမ်းလဵဝ်",
+       "nosuchusershort": "ဢၼ်ပဵၼ်ၸိုဝ်ႈ ၽူႈၸႂ်ႉတိုဝ်း \"$1\" ဢၼ်ၼႆႉ မၼ်းဢမ်ႇမီး။\nမႄးၵူတ်ႇတူၺ်း တူဝ်လိၵ်ႈမၼ်းလီလီလႄႈ။",
+       "nouserspecified": "ၸဝ်ႈၵဝ်ႇ ထုၵ်ႇလီမၵ်းမၼ်ႈ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း",
+       "login-userblocked": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇႁႄႉတတ်းဝႆႉ။ ဢမ်ႇမီးသုၼ်ႇတႃႇ လွၵ်ႉဢိၼ်ႇ",
+       "wrongpassword": "ၶေႃႈလပ်ႉဢၼ်ပေႃႉသႂ်ႇ ၽိတ်းပိူင်ႈဝႆႉ။\nၶတ်းၸႂ်တူၺ်းထႅင်ႈၵမ်းၼိုင်ႈ။",
+       "wrongpasswordempty": "ၶေႃႈလပ်ႉဢၼ်ပေႃႉသႂ်ႇၵႂႃႇၼၼ်ႉ မၼ်းပဵၼ်လွၵ်းပဝ်ႇဝႆႉ။\nၶတ်းၸႂ်တူၺ်း ထႅင်ႈၵမ်းၼိုင်ႈလႄႈ။",
+       "passwordtooshort": "ၶေႃႈလပ်ႉၼႆႉ တီႈဢေႇသုတ်းမၼ်း တေလႆႈမီး {{PLURAL:$1|1 တူဝ်|$1 တူဝ်}}.",
+       "passwordtoolong": "ၶေႃႈလပ်ႉၼႆႉ တေဢမ်ႇလႆႈ ယၢဝ်းပူၼ်ႉလိူဝ် {{PLURAL:$1|1 တူဝ်|$1 တူဝ်}}.",
+       "passwordtoopopular": "ၶေႃႈလပ်ႉၸိူဝ်းၵူၼ်းၸႂ်ႉၼမ်ၼၼ်ႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉ။ ၶႅၼ်းတေႃႈ လိူၵ်ႈပၼ် ၶေႃႈလပ်ႉ ဢၼ်ပႅၵ်ႇပိူၼ်ႈၼၼ်ႉလႄႈ။",
+       "password-name-match": "ၶေႃႈလပ်ႉၸဝ်ႈၵဝ်ႇၼႆႉ တေလႆႈပႅၵ်ႇပိူင်ႈၵၼ်တင်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်းၸဝ်ႈၵဝ်ႇ။",
+       "password-login-forbidden": "လွင်ႈဢဝ်ၸႂ်ႉ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၼႆႉလႄႈ ၶေႃႈလပ်ႉဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇႁၢမ်ႈသီး ဝႆႉဢေႃႈ။",
+       "mailmypassword": "ၶိုၼ်းမႄးတင်ႈ ၶေႃႈလပ်ႉ",
+       "passwordremindertitle": "ၶေႃႈလပ်ႉၸူဝ်ႈၵႅပ်ႉ ဢၼ်မႂ်ႇ တွၼ်ႈတႃႇ {{SITENAME}}",
+       "noemail": "ဢမ်ႇမီးႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်မၢႆတွင်းဝႆႉတႃႇ ၽူႈၸႂ်ႉတိုဝ်း \"$1\" ၼႆႉ",
+       "noemailcreate": "ၸဝ်ႈၵဝ်ႇ တေလႆႈသႂ်ႇပၼ်ႇ ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်ၸၢင်ႈၸႂ်ႉလႆႈၼၼ်ႉ။",
+       "passwordsent": "ၶေႃႈလပ်ႉဢၼ်မႂ်ႇ ထုၵ်ႇလႆႈသူင်ႇၵႂႃႇၸူး ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်တၢင်ႇမၢႆၽၢင်ႇဝႆႉ တႃႇ \"$1\" ။\nပေႃးဝႃႈ ႁပ်ႉလႆႈယဝ်ႉၼႆ ၶႅၼ်းတေႃႈ လွၵ်ႉဢိၼ်ႇၶဝ်ႈၸူး ထႅင်ႈၵမ်းၼိုင်ႈၶႃႈ။",
+       "blocked-mailpassword": "ႁဵင်းလိၵ်ႈ ဢၢႆႇပီႇ IP ၸဝ်ႈၵဝ်ႇၼၼ်ႉ ထုၵ်ႇႁႄႉတတ်းဝႃႈ တႃႇတေ​​ မႄးထတ်း။ လႆႈႁႄႉၵင်ႈဝႆႉ တွၼ်ႈတႃႇ ယႃႇႁႂ်းမီး လွင်ႈလူလၢႆၵၼ်လႄႈ လုၵ်ႉတီႈ မၢႆဢၢႆႇပီႇ IP ၼႆႉသေ တေဢမ်ႇၸၢင်ႈ ဢဝ်ၶိုၼ်းလႆႈ မၢႆလပ်ႉ။",
+       "eauthentsent": "ဢီးမေးလ်ၶေႃႈၼႄႉၼွၼ်း ၼၼ်ႉ ထုၵ်ႇသူင်ႇၵႂႃႇၸူးတီႈ ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်လႆႈ မၵ်းမၼ်ႈပၼ်ဝႆႉၼၼ်ႉယဝ်ႉ။ မိူဝ်ႈဢီးမေးလ်တၢင်ႇဢၼ် ပႆႇတၼ်းသူင်ႇၶဝ်ႈမႃး ၸူးတီႈဢၶွင်ႉဢၼ်ၼႆႉၼႆႉ ၸဝ်ႈၵဝ်ႇ ထုၵ်ႇလီႁဵတ်းၸွမ်းၼင်ႇ ၶေႃႈၸီႉသင်ႇ ဢၼ်ပႃး ၵႃႈတီႈၼႂ်း ဢီးမေးလ်ၼၼ်ႉယူႇ။ ၼၼ်ႉမၼ်းပဵၼ်တႃႇၼႄႉၼွၼ်းဝႃႈ ဢၶွင်ႉဢၼ်ၼႆႉ မၼ်းပဵၼ်ႁင်းၸဝ်ႈၵဝ်ႇယူႇတႄႉ ၼႆဢေႃႈ။",
+       "throttled-mailpassword": "ဢီးမေးလ်တႃႇ ၶိုၼ်းတင်ႈၶေႃႈလပ်ႉၼႆႉ ထုၵ်ႇသူင်ႇၵႂႃႇ မိူဝ်ႈပူၼ်ႉမႃး\n{{PLURAL:$1|မူင်း|$1 မူင်း}}.\nတွၼ်ႈတႃႇႁႄႉၵင်ႈ လွင်ႈလူလၢႆၵၼ်ၼႆ ၼႂ်းၵႃႈ \n{{PLURAL:$1| ၸူဝ်ႈမူင်း|$1 ၸူဝ်ႈမူင်း}} တေသူင်ႇပၼ် ဢီးမေးလ် ၶိုၼ်းတင်ႈၶေႃႈလပ်ႉ ၼိုင်ႈပွၵ်ႈၵူၺ်း။",
+       "mailerror": "လွင်ႈသူင်ႇ ဢီးမေးလ် ၽိတ်းပိူင်ႈ : $1",
+       "emailauthenticated": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ၸဝ်ႈၵဝ်ႇၼႆႉ ထုၵ်ႇၼႄႉၼွၼ်း မိူဝ်ႈ ဝၼ်းထီႉ $2 ၶၢဝ်းယၢဝ်း $3",
+       "emailnotauthenticated": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ၸဝ်ႈၵဝ်ႇ ၼႆႉ ဢမ်ႇပႆႇလႆႈ ၼႄႉၼွၼ်း။\nဢီးမေးလ် တွၼ်ႈတႃႇ ၽၢင်ႈႁၢင်ႈၵၢၼ် ၸွမ်းၼင်ႇၼႄဝႆႉၼၼ်ႉတႄႉ တေဢမ်ႇသူင်ႇ ပၼ်သေဢၼ်။",
+       "noemailprefs": "တႃႇႁႂ်ႈ ၽၢင်ႁၢင်ႈၵၢၼ်ၸိူဝ်းၼႆႉ ႁဵတ်းၵၢၼ်ပၼ်ၼႆ ၵႂႃႇမၵ်းမၼ်ႈပၼ် ႁဵင်းလိၵ်ႈ ဢီးမေးလ် ၵႃႈတီႈ ငဝ်ႈၵုမ်းပိူင် ၸဝ်ႈၵဝ်ႇၼၼ်ႉလႄႈ။",
+       "emailconfirmlink": "ၼႄႉၼွၼ်း ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ၸဝ်ႈၵဝ်ႇ။",
+       "cannotchangeemail": "ႁဵင်းလိၵ်ႈဢီးမေး ဢၶွင်ႉၼႆႉ တေဢမ်ႇၸၢင်ႈ လႅၵ်ႈလၢႆႈလႆႈ ၵႃႈတီႈဝီႇၶီႇၼႆႉ။",
+       "emaildisabled": "သၢႆႉဢၼ်ၼႆႉ တေဢမ်ႇၸၢင်ႈသူင်ႇလႆႈ ဢီးမေးလ်",
+       "accountcreated": "ၵေႃႇသၢင်ႈ ဢၶွင်ႉ ယဝ်ႉယဝ်ႈ",
+       "accountcreatedtext": "ဢၶွင်ႉ ၽူႈၸႂ်ႉတိုဝ်း တွၼ်ႈတႃႇ  [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ၼႆႉ ထုၵ်ႇၵေႃႇသၢင်ႈယဝ်ႉယဝ်ႈ။",
+       "createaccount-title": "ၵေႃႇသၢင်ႈဢၶွင်ႉ တွၼ်ႈတႃႇ {{SITENAME}}",
+       "login-abort-generic": "ၸဝ်ႈၵဝ်ႇ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ ဢမ်ႇၶႅမ်ႉလႅၵ်ႈ - မၼ်းလႆႈ ယင်ႉၵိုတ်ႈၵႂႃႇယဝ်ႉ။",
+       "login-migrated-generic": "ဢၶွင်ႉၸဝ်ႈၵဝ်ႇၼႆႉ ထုၵ်ႇလႆႈ ၶၢႆႉၵႂႃႇတၢင်ႇတီႈယဝ်ႉ။ ယဝ်ႉၵေႃႈ ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ၸဝ်ႈၵဝ်ႇၼႆႉ မၼ်းဢမ်ႇသိုပ်ႇမီးဝႆႉ ၵႃႈတီႈ ဝီႇၶီႇၼႆႉယဝ်ႈ။",
+       "loginlanguagelabel": "ၽႃႇသႃႇၵႂၢမ်း: $1",
+       "pt-login": "လွၵ်ႉဢိၼ်ႇ",
+       "pt-login-button": "လွၵ်ႉဢိၼ်ႇ",
+       "pt-login-continue-button": "သိုပ်ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ",
+       "pt-createaccount": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
+       "pt-userlogout": "လွၵ်ႉဢဝ်ႉ",
+       "php-mail-error-unknown": "ဢမ်ႇႁူႉ လွင်ႈၽိတ်းပိူင်ႈ ၵႃႈတီႈ PHP's mail() function ၼၼ်ႉ။",
+       "user-mail-no-addy": "ဢမ်ႇပႃး ႁဵင်းလိၵ်ႈဢီးမေးလ်သေ ၶတ်းၸႂ်သူင်ႇ ဢီးမေးလ်",
+       "user-mail-no-body": "ၶတ်းၸႂ်သူင်ႇဢီးမေးလ် လူၺ်ႈ လွင်ႈတၢင်းပဝ်ႇ ဢမ်ႇၼၼ် ပွင်ႈလိၵ်ႈ ဢၼ်ဢမ်ႇမီး တီႈပွင်ႇ",
+       "changepassword": "လႅၵ်ႈလၢႆႈ ၶေႃႈလပ်ႉ",
+       "resetpass_announce": "တႃႇႁႂ်ႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇယဝ်ႉတူဝ်ႈၼႆ ၸဝ်ႈၵဝ်ႇ တေလႆႈမၵ်းသႂ်ႇပၼ် ၶေႃႈလပ်ႉဢၼ်မႂ်ႇ",
+       "resetpass_header": "လႅၵ်ႈလၢႆႈ ၶေႃႈလပ်ႉဢၶွင်ႉ",
+       "oldpassword": "ၶေႃႈလပ်ႉဢၼ်ၵဝ်ႇ",
+       "newpassword": "ၶေႃႈလပ်ႉဢၼ်မႂ်ႇ",
+       "retypenew": "ၶိုၼ်းပေႃႉပၼ် ၶေႃႈလပ်ႉ ဢၼ်မႂ်ႇ :",
+       "resetpass_submit": "မၵ်းသႂ်ႇ ၶေႃႈလပ်ႉ လႄႈ လွၵ်ႉဢိၼ်ႇ",
+       "changepassword-success": "ၶေႃႈလပ်ႉၸဝ်ႈၵဝ်ႇ လႅၵ်ႈလၢႆႈၵႂႃႇယဝ်ႉ!",
+       "changepassword-throttled": "ၸဝ်ႈၵဝ်ႇ ႁႃၶဝ်ႈ လွၵ်ႉဢိၼ် လၢႆပွၵ်ႈၼႅၼ်ႇယဝ်ႉ။\nမိူဝ်ႈပႆႇၶတ်းၸႂ်ၶဝ်ႈတူၺ်းထႅင်ႈၼၼ်ႉ ၶႅၼ်းတေႃႈ ပႂ်ႉပၼ် $1 ။",
+       "botpasswords": "ၶေႃႈလပ်ႉ ပွတ်ႉ",
+       "botpasswords-disabled": "ၶေႃႈလပ်ႉပွတ်ႉၼၼ်ႉ ဢမ်ႇၸႂ်ႉလႆႈယဝ်ႉဝႃႈ",
+       "botpasswords-no-central-id": "တႃႇတေၸႂ်ႉ ၶေႃႈလပ်ႉပွတ်ႉၼၼ်ႉ ၸဝ်ႈၵဝ်ႇ တေလႆႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ ဢၼ်ပဵၼ် ဢၶွင်ႉ ၽုင်ႇၼၼ်ႉဢေႃႈ။",
+       "botpasswords-existing": "ၶေႃႈလပ်ႉပွတ်ႉ ဢၼ်မီးယူႇယၢမ်းလဵဝ်",
+       "botpasswords-createnew": "ၵေႃႇသၢင်ႈ ၶေႃႈလပ်ႉပွတ်ႉ ဢၼ်မႂ်ႇ",
+       "botpasswords-editexisting": "မႄးထတ်း ၶေႃႈလပ်ႉပွတ်ႉ ဢၼ်တိုၵ်ႉမီးယူႇ ယၢမ်းလဵဝ်",
+       "botpasswords-label-appid": "ၸိုဝ်ႈ ပွတ်ႉ :",
+       "botpasswords-label-create": "ၵေႃႇသၢင်ႈ",
+       "botpasswords-label-update": "ဢၢပ်ႉတိတ်ႉ",
+       "botpasswords-label-cancel": "ဢမ်ႇႁဵတ်း",
+       "botpasswords-label-delete": "ယႃႉ",
+       "botpasswords-label-resetpassword": "ၶိုၼ်းမႄးတင်ႈ ၶေႃႈလပ်ႉ",
+       "botpasswords-bad-appid": "ၸိုဝ်ႈပွတ်ႉ \"$1\" ၼႆႉ ဢမ်ႇၸႂ်ႉလႆႈ။",
+       "botpasswords-insert-failed": "တႃႇထႅမ်သႂ်ႇၸႂ်ႉ ပွတ်ႉ \"$1\" ၼႆ့ ဢမ်ႇၶႅမ်ႉလႅပ်ႈ။ သႂ်ႇဝႆႉယဝ်ႉႁႃႈ ဝႃႈလႃး?",
+       "botpasswords-update-failed": "တႃႇႁဵတ်း ဢၢပ်ႉတိတ်ႉ ၸိုဝ်ႈပွတ်ႉ \"$1\" ၼႆႉ ဢမ်ႇၶႅမ်ႉလႅပ်ႈ။ မွတ်ႇပႅတ်ႈမၼ်းယဝ်ႉႁႃႈ ဝႃႈလႃး?",
+       "botpasswords-created-title": "ၶေႃႈလပ်ႉပွတ်ႉ ၵေႃႇသၢင်ႈယဝ်ႉယဝ်ႈ။",
+       "botpasswords-created-body": "ၶေႃႈလပ်ႉပွတ်ႉ တွၼ်ႈတႃႇ ၸိုဝ်ႈပွတ်ႉ \"$1\" ဢၼ်ပဵၼ်ၶွင် ၽူႈၸႂ်ႉတိုဝ်း \"$2\" ၼၼ်ႉ ထုၵ်ႇၵေႃႇသၢင်ႈ ယဝ်ႉယဝ်ႈ။",
+       "botpasswords-updated-title": "​ၶေႃႈလပ်ႉ ပွတ်ႉ ပဵၼ်ဢၢပ်ႉတိတ်ႉယဝ်ႈ။",
+       "botpasswords-updated-body": "ၶေႃႈလပ်ႉပွတ်ႉ တွၼ်ႈတႃႇ ၸိုဝ်ႈပွတ်ႉ \"$1\" ဢၼ်ပဵၼ်ၶွင် ၽူႈၸႂ်ႉတိုဝ်း \"$2\" ၼၼ်ႉ ပဵၼ် ဢၢပ်ႉတိတ်ႉယဝ်ႈ။",
+       "botpasswords-deleted-title": "ၶေႃႈလပ်ႉပွတ်ႉၼၼ်ႉ မွတ်ႇပႅတ်ႈယဝ်ႉယဝ်ႈ။",
+       "botpasswords-deleted-body": "ၶေႃႈလပ်ႉပွတ်ႉ တွၼ်ႈတႃႇ ၸိုဝ်ႈပွတ်ႉ \"$1\" ဢၼ်ပဵၼ်ၶွင် ၽူႈၸႂ်ႉတိုဝ်း \"$2\" ၼၼ်ႉ မွတ်ႇပႅတ်ႈယဝ်ႉယဝ်ႈ။",
+       "botpasswords-newpassword": "ၶေႃႈလပ်ႉဢၼ်မႂ်ႇ တႃႇတေၶဝ်ႈ လွၵ်ႉဢိၼ်ႇၸွမ်း  <strong>$1</strong> ပဵၼ် <strong>$2</strong>. <em>ၶႅၼ်းတေႃႈ မၢႆတွင်းၼႆႉဝႆႉ တွၼ်ႈတႃႇ ပဵၼ် ၽိုၼ်ဢိင်မိူဝ်းၼႃႈ</em>",
+       "botpasswords-no-provider": "ၵၼ်တူဝ်ၵမ်ႉထႅမ်ၶေႃႈလပ်ႉပွတ်ႉၼႆ မၼ်းဢမ်ႇၸႂ်ႉလႆႈ။",
+       "botpasswords-restriction-failed": "ၵၼ်ၵႅတ်ႇၶေႃႈလပ်ႉပွတ်ႉ ၼႆႉ ႁႄႉၵင်ႈလွင်ႈ လွၵ်ႉဢိၼ်ႇဢၼ်ၼႆႉ။",
+       "botpasswords-invalid-name": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်ႈ ဢၼ်မၵ်းမၼ်ႈဝႆႉၼႆႉ မၼ်းဢမ်ႇၶဝ်ႈပႃးဝႆႉ တူဝ်ၸႅၵ်ႇၶေႃႈလပ်ႉ ပွတ်ႉ (\"$1\") ။",
+       "botpasswords-not-exist": "ၽူႈၸႂ်ႉတိုဝ်း \"$1\" ၼႆႉမၼ်းဢမ်ႇမီး ၶေႃႈလပ်ႉပွတ်ႉ ဢၼ်လႆႈၸိုဝ်ႈဝႃႈ \"$2\" ။",
+       "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-expired": "ၶေႃႈလပ်ႉၸဝ်ႈၵဝ်ႇၼႆႉ မၼ်းၵဝ်ႇသႃးၵႂႃႇယဝ်ႉ။ တႃႇတေၶဝ်ႈ လွၵ်ႉဢိၼ်ၼႆ ၶႅၼ်းတေႃႈ မၵ်းသႂ်ႇပၼ် ၶေႃႈလပ်ႉ ဢၼ်မႂ်ႇလႄႈ။",
+       "passwordreset": "ၶိုၼ်းမႄးတင်ႈ ၶေႃႈလပ်ႉ",
+       "passwordreset-disabled": "ၵၢၼ်တိုင်ႈၶိုၼ်း ၶေႃႈလပ်ႉၼႆႉ ထုၵ်ႇဢိုတ်းဝႆႉၵႃႈ တီႈ ဝီႇၶီႇၼႆႉ။",
+       "passwordreset-emaildisabled": "ၽၢင်ႁဵတ်းၵၢၼ် ဢီးမေးလ် ထုၵ်ႇဢိုတ်းဝႆႉ ၵႃႈတီႈ ဝီႇၶီႇၼႆႉ။",
+       "passwordreset-username": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း",
+       "passwordreset-domain": "တူဝ်ႇမဵင်း :",
+       "passwordreset-capture": "တေတူၺ်း ဢီးမေးလ်ၽွၼ်းလႆႈ?",
+       "passwordreset-capture-help": "ပေႃးၸဝ်ႈၵဝ်ႇ ၶိုၼ်ႇလွၵ်ႈၼႆႉၼႆ ဢီးမေးလ် (ဢၼ်ၸႂ်ႉၶေႃႈလပ်ႉၸူဝ်ႈၵႅပ်ႉ) တေၼႄဝႆႉဝႃႈ  မၼ်းသူင်ႇၸူး ၽူႈၸႂ်ႉတိုဝ်း ဝႆႉယဝ်ႉ ၼႆဢေႃႈ.",
+       "passwordreset-email": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ် :",
+       "passwordreset-emailtitle": "လွင်ႈႁူဝ်ယွႆႈ ဢၶွင်ႉ ၵႃႈတီႈ {{SITENAME}}",
+       "passwordreset-emailelement": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း:\n$1\n\nၶေႃႈလပ်ႉ ၸူဝ်ႈၵႅပ်ႉ:\n$2",
+       "passwordreset-emailsentemail": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ဢၼ်ၼႆႉၼႆႉ မၼ်းၵပ်းၵၢႆႇၵၼ်တင်း ဢၶွင်ႉၸဝ်ႈၵဝ်ႇ၊ ဢၼ်ပဵၼ် ဢီးမေးလ် တႃႇတင်ႈၶိုၼ်းမၢႆလပ်ႉၼၼ်ႉ တေထုၵ်ႇသူင်ႇၸူးယူႇ.",
+       "passwordreset-emailsentusername": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ဢၼ်ၼႆႉၼႆႉ မၼ်းၵပ်းၵၢႆႇၵၼ်တင်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၼႆႉ၊ ဢၼ်ပဵၼ် ဢီးမေးလ် တႃႇတင်ႈၶိုၼ်းမၢႆလပ်ႉၼၼ်ႉ တေထုၵ်ႇသူင်ႇၸူးယူႇ.",
+       "passwordreset-emailsent-capture": "ဢီးမေးလ် ၵၢၼ်တင်ႈၶိုၼ်း ​မၢႆလပ်ႉၼၼ်ႉ ထုၵ်ႇသူင်ႇၵႂႃႇၸူး ဢၼ်ၼႄဝႆႉၼင်ႇ ၽၢႆႇတႂ်ႈၼႆႉ။",
+       "passwordreset-invalideamil": "ႁဵင်းလိၵ်ႈ ဢီႈမေးလ် ၽိတ်းဝႆႉ။",
+       "passwordreset-nodata": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်းလႄႈ ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢမ်ႇလႆႈၵမ်ႉထႅမ်ဝႆႉ သေဢၼ်။",
+       "changeemail": "လႅၵ်ႈလၢႆႈ ဢမ်ႇၼၼ် ထွၼ်ပႅတ်ႈ ႁဵင်းလိၵ်ႈ ဢီးမေးလ်",
+       "changeemail-no-info": "တႃႇၸဝ်ႈၵဝ်ႇ တေၸၢင်ႈၸႂ်ႉလႆႈ ၼႃႈလိၵ်ႈၼႆႉ ၵမ်းသိုဝ်ၼၼ်ႉၼႆ ၸဝ်ႈၵဝ်ႇ တေလႆႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉဢေႃႈ။",
+       "changeemail-oldemail": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ် ဢၼ်ၸႂ်ႉဝႆႉ ယၢမ်းလဵဝ် :",
+       "changeemail-newemail": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ် ဢၼ်မႂ်ႇ :",
+       "changeemail-none": "(ဢမ်ႇမီးသင်)",
+       "changeemail-password": "ၶေႃႈလပ်ႉ {{SITENAME}} ၸဝ်ႈၵဝ်ႇ :",
+       "changeemail-submit": "လႅၵ်ႈလၢႆႈ ဢီးမေးလ်",
+       "changeemail-throttled": "ၸဝ်ႈၵဝ်ႇ ႁႃၶဝ်ႈ လွၵ်ႉဢိၼ် လၢႆပွၵ်ႈၼႅၼ်ႇယဝ်ႉ။\nမိူဝ်ႈပႆႇၶတ်းၸႂ်ၶဝ်ႈတူၺ်းထႅင်ႈၼၼ်ႉ ၶႅၼ်းတေႃႈ ပႂ်ႉပၼ် $1 ။",
+       "changeemail-nochange": "ၶႅၼ်းတေႃႇ ပေႃႉထႅမ်သႂ်ႇပၼ် ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်မႂ်ႇ ဢၼ်ပႅၵ်ႇပိူင်ႈဢၼ်ၼႆ့။",
+       "resettokens": "ၶိုၼ်းတင်ႈ မၢႆၶပ်ႉ",
+       "resettokens-no-tokens": "မၼ်းဢမ်ႇမီး တူဝ်ၶပ်ႉတၢမ်း တႃႇတေ တင်ႈၶိုၼ်း",
+       "resettokens-tokens": "မၢႆၶပ်ႉ :",
+       "resettokens-token-label": "$1 (ၵႃႈၶၼ် ယၢမ်းလဵဝ်: $2)",
+       "resettokens-done": "ၶိုၼ်းတင်ႈ မၢႆၶပ်ႉ",
+       "resettokens-resetbutton": "ၶိုၼ်းတင်ႈ မၢႆၶပ်ႉ ဢၼ်လိူၵ်ႈဝႆႉၼႆႉ",
+       "bold_sample": "တူဝ်လိၵ်ႈၼႃ",
+       "bold_tip": "တူဝ်လိၵ်ႈၼႃ",
+       "italic_sample": "တူဝ်လိၵ်ႈၵိူင်း",
+       "italic_tip": "တူဝ်လိၵ်ႈၵိူင်း",
+       "link_sample": "ႁူဝ်ၶေႃႈႁဵင်းၵွင်ႉ",
+       "link_tip": "ႁဵင်းၵွင်ႉတၢင်းၼႂ်း",
+       "extlink_sample": "http://www.example.com ႁူဝ်ၶေႃႈႁဵင်းၵွင်ႉ",
+       "extlink_tip": "ႁဵင်းၵွင်ႉၵႂႃႇတၢင်ႇတီႈ (ယႃႇလိုမ်းသႂ်ႇ http:// ပႃႈၼႃႈသုတ်း)",
+       "headline_sample": "လိၵ်ႈ​ႁူဝ်ၶေႃႈ",
+       "headline_tip": "ႁူဝ်ၶေႃႈ ထၢၼ်ႈ ႒",
+       "nowiki_sample": "ဢဝ်လိၵ်ႈဢၼ်ဢမ်ႇမီးပိူင် သႂ်ႇပၼ်တီႈၼႆႈ",
+       "nowiki_tip": "ၶၢမ်ႈပႅတ်ႈပိူင် wiki",
+       "image_tip": "ၾၢႆႇၽင်ဝႆႉ",
+       "media_tip": "ႁဵင်းၵွင်ႉၾၢႆႇ",
+       "sig_tip": "လၢႆးမိုဝ်းၸဝ်ႈၵဝ်ႇ ၸွမ်း ၸုမ်ႈၶၢဝ်းယၢမ်း",
+       "hr_tip": "သၢႆၼႃႈသုင် - ၸႂ်ႉဢၼ်ၵႅမ်",
+       "summary": "ႁူဝ်ႁုပ်ႈ :",
+       "subject": "ႁူဝ်ၶေႃႈ :",
+       "minoredit": "ပဵၼ်လွင်ႈမူၼ်ႉမႄးဢိတ်းဢီႈ",
+       "watchthis": "တူၺ်းၼႃႈလိၵ်ႈၼႆႉ",
+       "savearticle": "ၵဵပ်းသိမ်း ၼႃႈလိၵ်ႈ",
+       "publishpage": "ပိုၼ်ဢွၵ်ႇ ၼႃႈလိၵ်ႈ",
+       "preview": "တူၺ်းလူင်ႈၼႃႈ",
+       "showpreview": "ၼႄတူဝ်ယၢင်ႇ",
+       "showdiff": "ၼႄလွင်ႈလႅၵ်ႈလၢႆႈ",
+       "blankarticle": "<strong>ၽၢင်ႉ:</strong> ၼႃႈလိၵ်ႈ ဢၼ်ၸဝ်ႈၵဝ်ႇ ၵေႃႇသၢင်ႈဝႆႉၼႆႉ မၼ်းတိုၵ်ႉပဵၼ် ဢၼ်ပဝ်ႇဝႆႉၵူၺ်း။ ပေႃးၸဝ်ႈၵဝ်ႇ ၼဵၵ်း \"{{int:savearticle}}\" ထႅင်ႈၵမ်းၼိုင်ႈၼႆ, ၼႃႈလိၵ်ႈၼႆႉ မၼ်းတေၵေႃႇသၢင်ႈၵႂႃႇ ၼင်ႇ ဢၼ်ပဝ်ႇ ဢၼ်ဢမ်ႇမီးသင်ၼၼ်ႉယဝ်ႈ။",
+       "anoneditwarning": "<strong>ၽၢင်ႉပၼ်:</strong> ၸဝ်ႈၵဝ်ႇဢမ်ႇလႆႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉ။ သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ ႁဵတ်းလွင်ႈလႅၵ်ႈလၢႆႈသေဢၼ်ၼႆႉ ဢၼ်ပဵၼ် မၢႆသၢႆၼႅတ်ႇ - IP address ၸဝ်ႈၵဝ်ႇၼၼ်ႉ တေဢွၵ်ႇၼႄဝႆႉ ႁႂ်ႈၵူၼ်းတၢင်းၼမ်ႁၼ်ၸွမ်း။ သင်ၸိူဝ်ႉၸဝ်ႈၵဝ်ႇ <strong>[$1 log in]</strong> ဢမ်ႇၼၼ် <strong>[$2 create an account]</strong>, ၵၢၼ်ၸဝ်ႈၵဝ်ႇ ႁဵတ်းၼၼ်ႉၵေႃႈ မၼ်းတေၵႂႃႇၶဝ်ႈပဵၼ် လွင်ႈႁူမ်ႈသၢင်ႈ ၵႃႈတီႈ ၸိုဝ်ႈၸဝ်ႈၵဝ်ႇသေ ၸဝ်ႈၵဝ်ႇ ႁူမ်ႈသၢင်ႈသင်ၼႆၵေႃႈ ၵူႈၵေႃႉ တေလႆႈႁၼ်ၵိုၵ်းၸိုဝ်ႈ ၸဝ်ႈၵဝ်ႇယူႇ။",
+       "anonpreviewwarning": "<em>ၸဝ်ႈၵဝ်ႇၼႆႉ ဢမ်ႇပႆႇလႆႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉ။ တေဢဝ် မၢႆဢၢႆႇပီၸဝ်ႈၵဝ်ႇသေ သိမ်းပၼ်ၵႂႃႇ တီႈၼႂ်း ပိုၼ်းမႄးထတ်း ၼႃႈလိၵ်ႈၼႆႉၶႃႈ။",
+       "missingsummary": "<strong>ၶေႃႈၵိုတ်းလိူဝ်:</strong> ၸဝ်ႈၵဝ်ႇဢမ်ႇလႆႈၵမ်ႉထႅမ်ပၼ်ဝႆႉ ႁူဝ်ႁုပ်ၵၢၼ်မႄးထတ်း။ သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ ၼဵၵ်း \"{{int:savearticle}}\" ထႅင်ႈၵမ်းၼိုင်ႈၼႆ ၵၢၼ်မႄးထတ်းၸဝ်ႈၵဝ်ႇ ႁဵတ်းဝႆႉၼၼ်ႉ မၼ်းတေသိမ်းၵႂႃႇ ၼင်ႇဢမ်ႇမီးပႃး လွင်ႈႁူဝ်ႁုပ်မၼ်းၼၼ်ႉယဝ်ႈ။",
+       "missingcommenttext": "ၶႅၼ်းတေႃႈ ပေႃႉသႂ်ႇပၼ် တၢင်းၶႆႈၸႂ် ၵႃႈတီႈတႂ်ႈၼႆႉ",
+       "previewerrortext": "မိူဝ်ႈၽွင်းၶတ်းၸႂ်ၼႄ တႃႇတူၺ်းလူင်ႈၼႃႈ လွင်ႈလႅၵ်ႈလၢႆႈ ဢၼ်ၸဝ်ႈၵဝ်ႇ ႁဵတ်းမႃးၼၼ်ႉ လႆႈမီးလွင်ႈၽိတ်းပိူင်ႈ ဢွၵ်ႇပဵၼ်ဝႆႉ။",
+       "blockedtitle": "ၽူႈၸႂ်ႉတိုဝ်းၼႆႉ ထုၵ်ႇတတ်းၶၢတ်ႇဝႆ့",
+       "blockednoreason": "ဢမ်ႇလႆႈပၼ်ဝႆႉ လွင်ႈတၢင်းသင်။",
+       "whitelistedittext": "တႃႇတေမႄးထတ်း ၼႃႈလိၵ်ႈၼႆႉ ၶႅၼ်းတေႃႈ $1 ။",
+       "loginreqtitle": "လူဝ်ႇလႆႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ",
+       "loginreqlink": "လွၵ်ႉဢိၼ်ႇ",
+       "loginreqpagetext": "တႃႇတေတူၺ်းၼႃႈလိၵ်ႈၼႆ ၶႅၼ်းတေႃႈ $1",
+       "accmailtitle": "ၶေႃႈလပ်ႉ သူင်ႇၵႂႃႇယဝ်ႉယဝ်ႈ။",
+       "newarticle": "(ဢၼ်မႂ်ႇ)",
+       "newarticletext": "ၸဝ်ႈၵဝ်ႇလႆႈၸွမ်းလင်ဝႆႉ ႁႅင်းၵွင်ႉ ၼႃႈလိၵ်ႈ ဢၼ်ဢမ်ႇမီးဝႆႉၼၼ်ႉ။\nတႃႇတေၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ၊ တႄႇပေႃႉသႂ်ႇၵႃႈတီႈ လွၵ်ႈပႃႈတႂ်ႈ \n (တွၼ်ႈတႃႇ လွၼ်ႉၶၢဝ်ႇ တၢင်ႇၸိူဝ်း တူၺ်းၵႃႈတီႈ [$1 help page] ).\nသင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ ၽိတ်းတၢင်းသေ ၽႅဝ်မႃးတီႈၼႆႈၼႆ၊ ၼဵၵ်း ပၼ်တူဝ် <strong>ၼဵၼ်ႁူၼ်လင်</strong> ၶွင် တူဝ်ပိုတ်ႇဝႅပ်ႉ ၸဝ်ႈၵဝ်ႇလႄႈ။",
+       "noarticletext": "ၼႂ်းၼႃႈၼႆႉယင်းဢမ်ႇမီးလိၵ်ႈသင်တေႃႈလဵဝ်။\nသူၸၢင်ႈ [[Special:Search/{{PAGENAME}}|ႁႃ ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈၼႆႉ]] ၼႂ်းတၢင်ႇၼႃႈ၊\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ၶူၼ်ႉႁႃ logs ဢၼ်ၵွင်ႉၵၢႆၵၼ်],\nဢမ်ႇၼၼ် [{{fullurl:{{FULLPAGENAME}}|action=edit}} သၢင်ႈၼႃႈၼႆႉ]</span>။",
+       "noarticletext-nopermission": "ၼႂ်းၼႃႈၼႆႉယင်းဢမ်ႇမီးလိၵ်ႈသင်တေႃႈလဵဝ်။\nသူၸၢင်ႈ [[Special:Search/{{PAGENAME}}|ႁႃ ႁူဝ်ၶေႃႈၼႆႉ]] ၼႂ်းတၢင်ႇၼႃႈ၊\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ၶူၼ်ႉႁႃ logs ဢၼ်ၵဵဝ်ႇၵွင်ႉၵၼ်],\nဢမ်ႇၼၼ် [{{fullurl:{{FULLPAGENAME}}|action=edit}} မူၼ်ႉမႄးၼႃႈၼႆႉ]</span>။",
+       "userpage-userdoesnotexist-view": "ဢၶွင်ႉ ၽူႈၸႂ်ႉတိုဝ်း \"$1\" ၼႆႉ ဢမ်ႇပႆႇလႆႈ တၢင်ႇမၢႆၽၢင်ဝႆႉ။",
+       "blocked-notice-logextract": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇတတ်းၶၢတ်ႇဝႆႉဢေႃႈ ယၢမ်းလဵဝ်။\nသဵၼ်ႈမၢႆတတ်းၶၢတ်ႇ ၵမ်းလိုၼ်းသုတ်းၼႆႉ ၼႄဝႆႉယူႇၵႃႈတီႈ သဵၼ်ႈမၢႆၽိုၼ်ဢိင် ပႃႈတႂ်ႈၼႆႉ။",
+       "updated": "(ဢၢပ်ႉတိတ်ႉ)",
+       "note": "<strong>မၢႆတွင်း:</strong>",
+       "previewnote": "<strong>တွင်းဝႆႉပၼ်ဝႃႈ ၼႆႉပဵၼ် ဢၼ်တူၺ်းလူင်ႈၼႃႈၵူၺ်း</strong>\nဢၼ်ၸဝ်ႈၵဝ်ႇ ႁဵတ်းလွင်ႈလႅၵ်ႈလၢႆႈမႃးၸိူဝ်းၼၼ်ႉ ပႆႇလႆႈသိမ်းၵွၼ်ႇ။",
+       "continue-editing": "ၵႂႃႇၸူးတီႈ ဢွင်ႈမႄးထတ်း",
+       "editing": "တိုၵ်ႉမူၼ်ႉမႄး $1",
+       "creating": "တိုၵ်ႉၵေႃႇသၢင်ႈ $1",
+       "editingsection": "မႄးထတ်း $1 (ၵၼ်)",
+       "editconflict": "မႄးထတ်း လွင်ႈယုင်ႈယၢင်ႈ : $1",
+       "yourtext": "လိၵ်ႈၸဝ်ႈၵဝ်ႇ",
+       "storedversion": "ၵၢၼ်ၶူၼ်ႉလူ ဢၼ်ဢဝ်ၶိုၼ်း",
+       "yourdiff": "ၸိူဝ်းပႅၵ်ႇပိူင်ႈ",
+       "templatesused": "{{PLURAL:$1|Template|ပိူင်တမ်း}} ၸႂ်ႉဝႆႉတီႈၼႃႈလိၵ်ႈၼႆႉ:",
+       "template-protected": "ႁႄႉၵင်ႈဝႆႉ",
+       "template-semiprotected": "(ႁႄႉၵၼ်ႈဝႆႉ ၵမ်ႈၽွင်ႈ)",
+       "hiddencategories": "ၼႃႈလိၵ်ႈဢၼ်ၼႆႉ မၼ်းပဵၼ် ၼႃႈလိၵ်ႈၶဝ်ႈၸုမ်း {{PLURAL:$1|1 hidden category|$1 ၵၼ်သိူင်ႇဝႆႉ}}:",
+       "permissionserrors": "ၵၢၼ်လူတ်းပွႆႇ ၽိတ်းပိူင်ႈ",
+       "permissionserrorstext": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇႁဵတ်းဢၼ်ၼၼ်ႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ {{PLURAL:$1|လွင်ႈတၢင်း|လွင်ႈတၢင်းၸိူဝ်း}} ၼႆႉ:",
+       "permissionserrorstext-withaction": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇ $2, တွၼ်ႈတႃႇ ၸိူဝ်း ဢၼ်ပဵၼ် {{PLURAL:$1|reason|လွင်ႈတၢင်း}}:",
+       "contentmodelediterror": "ၸဝ်ႈၵဝ်ႇတေဢမ်ႇၸၢင်ႈ မႄးထတ်း ၵၢၼ်ၶူၼ်ႉလူဢၼ်ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး မၼ်းၼႆႉပဵၼ်  <code>$1</code>, ဢၼ် ပႅၵ်ႇပိူင်ႈၵၼ်တၢင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး ၶွင်ႈၼႃႈလိၵ်ႈ <code>$2</code> ၼႆႉ။",
+       "moveddeleted-notice": "ၼႃႈလိၵ်ႈၼႆႉ မွတ်ႇပႅတ်ႈၵႂႃႇယဝ်ႉ။ လွင်ႈမွတ်ႇပႅတ်ႈလႄႈ လွင်ႈၶၢႆႉသၢႆမၢႆ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၼင်ႇပႃႈတႂ်ႈၼႆႉယူႇ။ မၼ်းပဵၼ် တွၼ်ႈတႃႇ ႁဵတ်းၽိုၼ်ဢိင်ယဝ်ႉ။",
+       "edit-conflict": "မႄးထတ်း လွင်ႈယုင်ႈယၢင်ႈ",
+       "postedit-confirmation-created": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇၵေႃႇသၢင်ႈယဝ်ႉယဝ်ႈ။",
+       "postedit-confirmation-restored": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇဢဝ်ၶိုၼ်းယဝ်ႉယဝ်ႈ။",
+       "postedit-confirmation-saved": "လွင်ႈမႄးထတ်းၸဝ်ႈၵဝ်ႇ သိမ်းပၼ်ယဝ်ႉယဝ်ႈ။",
+       "edit-already-exists": "ဢမ်ႇၸၢင်ႈ ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇ။\nမၼ်းမီးဝႆႉထႃႈယဝ်ႈ။",
+       "defaultmessagetext": "လိၵ်ႈၶေႃႈၶၢဝ်ႇ ပိူင်ႇၵႅဝ်ႈ",
+       "invalid-content-data": "ၶေႃႈမုၼ်းၶဝ်ႈပႃး ၽိတ်းပိူင်ႈဝႆႉ",
+       "content-not-allowed-here": "\"$1\" ၶေႃႈၶဝ်ႈပႃးၼႆႉ ဢမ်ႇၶႂၢင်းပၼ်ဝႆႉ တီႈၼႃႈ လိၵ်ႈ [[$2]]",
+       "editpage-notsupportedcontentformat-title": "ပိူင်ၶေႃႈၶဝ်ႈပႃး ၼႆႉ ဢမ်ႇၵမ်ႉထႅမ်ဝႆႉပၼ်။",
+       "editpage-notsupportedcontentformat-text": "ပိူင်ၶေႃႈၶဝ်ႈပႃး $1 ၼႆႉ မၼ်းဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ဝႆႉပၼ် တင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး $2",
+       "content-model-wikitext": "လိၵ်ႈဝီႇၶီႇ",
+       "content-model-text": "လိၵ်ႈလွၼ်ႉလွၼ်ႉ",
+       "content-model-javascript": "ၵျႃႇပႃးသၶလႂိပ်ႉ",
+       "content-json-empty-object": "ၵၢၼ်ပဝ်ႇ",
+       "content-json-empty-array": "ထႅဝ်ပဝ်ႇ",
+       "post-expand-template-inclusion-warning": "<strong>ၶေႃႈၽၢင်ႉ</strong> - ပိူင်ဢဝ်မႃးႁူမ်ႈၼၼ်ႉယႂ်ႇပူၼ်ႉၼႃႇ။\nပိူင်မၢင်ၼႃႈတေဢမ်ႇႁူမ်ႈပႃးၸွမ်း။",
+       "viewpagelogs": "တူၺ်းသၢႆမၢႆ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ",
+       "currentrev": "ၵၢၼ်ၶူၼ်ႉလူ ၵမ်းလိုၼ်းသုတ်း",
+       "currentrev-asof": "ၵၢၼ်ၶူၼ်ႉလူ ၵမ်းလိုၼ်းသုတ်းၼင်ႇ  $1",
+       "revisionasof": "ၶိုၼ်းၶူၼ်ႉလူၼင်ႇ $1",
+       "revision-info": "ၶူၼ်ႉလူၼင်ႇ  $1 ၼင်ႇ {{GENDER:$6|$2}}$7",
+       "previousrevision": "← ၸိူဝ်းဢၼ်ၵဝ်ႇ",
+       "nextrevision": "ၵၢၼ်ၶူၼ်ႉလူဢၼ်မႂ်ႇ",
+       "currentrevisionlink": "ၵၢၼ်ၶူၼ်ႉလူ ၵမ်းလိုၼ်းသုတ်း",
+       "cur": "ယၢမ်းလဵဝ်",
+       "next": "ၵႂႃႇၼႃႈ",
+       "last": "ဢွၼ်တၢင်း",
+       "page_first": "ဢွၼ်တၢင်း",
+       "page_last": "လိုတ်းသုတ်း",
+       "history-fieldset-title": "ပိုၼ်းပိုတ်ႇႁႃ",
+       "history-show-deleted": "ဢၼ်​ယႃႉ​ဝႆႉ​ၼၼ်ႉၵွၺ်း",
+       "histfirst": "ၵဝ်ႇသုတ်း",
+       "histlast": "မႂ်ႇသုတ်း",
+       "historysize": "({{PLURAL:$1|1 ပၢႆႉ|$1 ပၢႆႉ}})",
+       "historyempty": "(ပဝ်ႇ)",
+       "history-feed-title": "ပိုၼ်းၶူၼ်ႉလူ",
+       "history-feed-description": "ပိုၼ်းၶူၼ်ႉလူ တႃႇၼႃႈလိၵ်ႈၼႆႉ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇ",
+       "history-feed-item-nocomment": "$1 တီႈ $2",
+       "history-edit-tags": "မႄးထတ်း ၶႅပ်းတိင် ၶွင် ၶူၼ်ႉလူၸိူဝ်းလိူၵ်ႈဝႆႉၼၼ်ႉ။",
+       "rev-deleted-comment": "(ႁူဝ်ႁုပ်ႈၵၢၼ်ထတ်းသၢင် ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ)",
+       "rev-deleted-user": "(ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ)",
+       "rev-deleted-event": "(သဵၼ်ႈမၢႆ ႁူဝ်ယွႆႈ ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ)",
+       "rev-deleted-user-contribs": "[ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢမ်ႇၼၼ် မၢႆဢၢႆႇပီႇ ထွၼ်ဢွၵ်ႇပႅတ်ႈယဝ်ႉ  - ၵၢၼ်မႄးထတ်း ၸိူဝ်းၼၼ်ႉ ထုၵ်ႇလပ်ႉဝႆႉ ၵႃႈတီႈ ၵၢၼ်ႁူမ်ႈသၢင်ႈ]",
+       "rev-deleted-text-permission": "ၼႃႈလိၵ်ႈၶူၼ်ႉလူၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။",
+       "rev-suppressed-text-permission": "ၼႃႈလိၵ်ႈ ၶူၼ်ႉလူဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
+       "rev-deleted-text-unhide": "ၼႃႈလိၵ်ႈၶူၼ်ႉလူၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈၶႃႈ။\nပေႃးဝႃႈ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉမီးၵၢင်ၸႂ် ၶႂ်ႈသိုပ်ႇ ႁဵတ်းၵႂႃႇၼႆ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉ  [$1 တူၺ်း လွင်ႈၶူၼ်ႉလူၼႆႉ] ။",
+       "rev-suppressed-text-unhide": "ၼႃႈလိၵ်ႈ ၶူၼ်ႉလူဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။\nပေႃးဝႃႈ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉမီးၵၢင်ၸႂ် ၶႂ်ႈသိုပ်ႇ ႁဵတ်းၵႂႃႇၼႆ ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉ  [$1 တူၺ်း လွင်ႈၶူၼ်ႉလူၼႆႉ] ။",
+       "rev-deleted-text-view": "ၼႃႈလိၵ်ႈ ၶူၼ်ႉလူဢၼ်ၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်ႈမၼ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
+       "rev-suppressed-text-view": "ၼႃႈလိၵ်ႈ ၶူၼ်ႉလူဢၼ်ၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ပႅတ်ႈယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇတိုၵ်ႉၸၢင်ႈတူၺ်းသေ လွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
+       "rev-deleted-no-diff": "ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈတူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈဢၼ်ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၼႂ်ႈၵႃႈ ၵၢၼ်ၶူၼ်ႉလူဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
+       "rev-suppressed-no-diff": "ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈတူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈဢၼ်ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၼႂ်ႈၵႃႈ ၵၢၼ်ၶူၼ်ႉလူဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။",
+       "rev-deleted-unhide-diff": "ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈတူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈဢၼ်ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၼႂ်ႈၵႃႈ ၵၢၼ်ၶူၼ်ႉလူဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ<strong>မွတ်ႇပႅတ်ႈ</strong> ၵႂႃႇယဝ်ႉ။\nလွင်ႈႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။\nပေႃးၸဝ်ႈၵဝ်ႇတိုၵ်ႉၶႂ်ႈ သိုပ်ႇႁဵတ်းၵႂႃႇယူႇၼႆ ၸဝ်ႈၵဝ်ႇတေၸၢင်ႈ [$1တူၺ်း လွင်ႈပႅၵ်ႈပိူင်ႈ] ၼႆႉလႆႈ။",
+       "rev-suppressed-unhide-diff": "ၼႂ်းၵႃႈ ၵၢၼ်ၶူၼ်ႉလူ လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼိုင်ႈၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ၵႂႃႇယဝ်ႉ။\nႁူဝ်ယွႆႈမၼ်း တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။\nပေႃးၸဝ်ႈၵဝ်ႇတိုၵ်ႉၶႂ်ႈ သိုပ်ႇႁဵတ်းၵႂႃႇယူႇၼႆ ၸဝ်ႈၵဝ်ႇတေၸၢင်ႈ [$1တူၺ်း လွင်ႈပႅၵ်ႈပိူင်ႈ] ၼႆႉလႆႈ။",
+       "rev-deleted-diff-view": "ၼႂ်းၵႃႈ ၵၢၼ်ၶူၼ်ႉလူ လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ <strong>မွတ်ႇပႅတ်ႈ</strong>ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇၸၢင်ႈတူၺ်းလႆႈ လွင်ႈပႅၵ်ႇပိူင်ႈသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] ၼႆႈယူႇ။",
+       "rev-suppressed-diff-view": "ၼႂ်းၵႃႈ ၵၢၼ်ၶူၼ်ႉလူ လွင်ႈပႅၵ်ႇပိူင်ႈ ဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ <strong>တဵၵ်းၵိုတ်း</strong> ၵႂႃႇယဝ်ႉ။\nၸဝ်ႈၵဝ်ႇ ၸၢင်ႈတူၺ်း လွင်ႈပႅၵ်ႇပိူင်ႈသေ လွင်ႈႁူဝ်ယွႆႈမၼ်းတႄႉ တေၸၢင်ႈႁၼ်လႆႈ ၵႃႈတီႈ  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] ၼႆႈယူႇ။",
+       "rev-delundel": "ၼႄ/သိူင်ႇ",
+       "rev-showdeleted": "ၼႄ",
+       "revisiondelete": "မွတ်ႇပႅတ်ႈ/ ဢမ်ႇမွတ်ႇ ၵၢၼ်ၶူၼ်ႉလူ",
+       "revdelete-nooldid-title": "ၵၢၼ်ၶူၼ်ႉလူ ဢၼ်ယိူင်းၸူးၼၼ်ႉ ၽိတ်းဝႆႉ",
+       "revdelete-no-file": "ၾၢႆႇဢၼ်မၵ်းမၼ်ႈဝႆႉၼၼ်ႉ မၼ်းဢမ်ႇလႆႈမီးဝႆႉ",
+       "revdelete-show-file-confirm": "ၸဝ်ႈၵဝ်ႇ လပ်ႉလွင်းယဝ်ႉႁႃႈဝႃႈ တေၶႂ်ႈတူၺ်း ၵၢၼ်ၶူၼ်ႉလူ ၶွင်ၾၢႆႇ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ။ \"<nowiki>$1</nowiki>\" ၵႃႇတီႈ $2 တေႃႇ $3?",
+       "revdelete-show-file-submit": "ၸႂ်ႈယဝ်ႉ",
+       "revdelete-selected-text": "{{PLURAL:$1|ၵၢၼ်ၶူၼ်ႉလူ ဢၼ်လိူၵ်ႈဝႆႉ|ၵၢၼ်ၶူၼ်ႉလူ ၸိူဝ်းလိူၵ်ႈဝႆႉ}} ၶွင် [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|ၾၢႆပိူဝ်းသျိၼ်း ဢၼ်လိူၵ်ႈဝႆႉ|ၾၢႆႇပိူဝ်းသျိၼ်း ၸိူဝ်းလိူၵ်ႈဝႆႉ}} ၶွင် [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|သဵၼ်ႈမၢႆ လွင်ႈႁဵတ်းသၢင်ႈ ဢၼ်လိူၵ်ႈဝႆႉ|သဵၼ်ႈမၢႆ လွင်ႈႁဵတ်းသၢင်ႈ ၸိူဝ်းလိူၵ်ႈဝႆႉ}}:",
+       "revdelete-text-text": "ၵၢၼ်ၶူၼ်ႉလူ ဢၼ်မွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ ပိုၼ်း ၼႃႈလိၵ်ႈ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
+       "revdelete-text-file": "ၾၢႆႇပိူဝ်းသျိၼ်း ဢၼ်မွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ ပိုၼ်း ၾၢႆႇ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
+       "logdelete-text": "သဵၼ်ႈမၢႆ လွင်ႈႁဵတ်းသၢင်ႈ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇၼၼ်ႉ မၼ်း​တိုၵ်ႉတေ ဢွၵ်ႇၼႄဝႆႉၵႃႈတီႈ သဵၼ်ႈမၢႆ၊ ၵူၺ်းၵႃႈဝႃႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်ၵိုၵ်းဝႆႉမၼ်းၼၼ်ႉတႄႉ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈၵႃႈတီႈ ၵူၼ်းတင်းၼမ်ယဝ်ႉ။",
+       "revdelete-text-others": "သင်ၸိူဝ်ႉဝႃႈ ဢမ်ႇလႆႈ မၵ်ႈသႂ်ႇဝႆႉ လွင်ႈႁႄႉတၢပ်ႈသင်ၼႆတႄႉ ၽူႈၵုမ်းထိင်း မၢင်ၸိူဝ်းၼႆႉ တိုၵ်ႉတေဢဝ်ၸႂ်ႉလႆႈ ၶေႃႈၶဝ်ႈပႃး ဢၼ်လပ်ႉဝႆႉသေ တႃႇတေၶိုၼ်းဢမ်ႇမွတ်ႇ ဢၼ်ၼၼ်ႉ။",
+       "revdelete-confirm": "ၶႅၼ်းတေႃႈ ၼႄႉၼွၼ်းပၼ်ဝႃႈ ၸဝ်ႈၵဝ်ႇ ယိူင်းဢၢၼ်း ၶႂ်ႈႁဵတ်းဢၼ်ၼႆႉယူႇတႄႉ ဢၼ်ဝႃႈၼၼ်ႉ၊ ယဝ်ႉၵေႃႈ ၸဝ်ႈၵဝ်ႇႁူႉပွင်ႇပႃးဝႃႈ လွင်ႈတေသိုပ်ႇပဵၼ်ၸွမ်းၽၢႆႇလင်လႄႈ လွင်ႈဝႃႈၸဝ်ႈၵဝ်ႇ ႁဵတ်းဢၼ်ၼႆႉၸွမ်းၼင်ႇ လွင်ႈလႆႈၸႂ်ၵၼ်တင်း \n [[{{MediaWiki:Policy-url}}|the policy]].",
+       "revdelete-suppress-text": "လွင်ႈတဵၵ်းၵိုတ်း ၼႆႉ  <strong>ထုၵ်ႇလီ ၸႂ်ႉ</strong>  တွၼ်ႈတႃႇ လွင်ႈတၢင်း ၸိူင်ႉၼင်ႇ ပႃႈတႂ်ႈၼႆႉၵူၺ်း။\n* ၶေႃႈပူင်လွၼ်ႉၶၢဝ်ႇ ဢၼ်ဢၢပ်ႈပဵၼ်လႆႈ\n* လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ် ဢၼ်ဢမ်ႇဢၢပ်ႈ သၢင်ႇတေႃႇ\n*: <em>ႁဵင်းလိၵ်ႈႁိူၼ်း လႄႈ မၢႆၾူင်း၊ မၢႆၶႅပ်းၽၢင်တူဝ် ၸၵႂႃႇၸိူဝ်းၼႆႉ</em>",
+       "revdelete-legend": "မၵ်းသႂ်ႇပၼ် လွင်ႈႁႄႉၵင်ႈ တႃႇႁၼ်လႆႈ",
+       "revdelete-hide-text": "လိၵ်ႈၶူၼ်ႉလူ",
+       "revdelete-hide-image": "လပ်ႉ ၶေႃႈပႃးၼႂ်း ၾၢႆႇ",
+       "revdelete-hide-name": "လပ်ႉ ၶေႃႈယိူင်း လႄႈ ၽၢင်ၵိုၵ်း",
+       "revdelete-hide-comment": "မႄးထတ်း ႁုဝ်ႁုပ်ႈ",
+       "revdelete-hide-user": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း/ ႁဵင်းလိၵ်ႈဢၢႆႇပီႇ  ၶွင် ၽူႈမႄးထတ်း",
+       "revdelete-hide-restricted": "တဵၵ်းၵိုတ်းၶေႃႈမုၼ်း ၸိူဝ်းလုၵ်ႈတီႈ ၽူႈၵုမ်းၵၢၼ်ၶဝ် လႄႈ တၢင်ႇၸိူဝ်း",
+       "revdelete-radio-same": "(ဢမ်ႇလႅၵ်ႈလၢႆႈ)",
+       "revdelete-radio-set": "လပ်ႉဝႆႉ",
+       "revdelete-radio-unset": "ႁၼ်လႆႈ",
+       "revdelete-suppress": "တဵၵ်းၵိုတ်းၶေႃႈမုၼ်း ၸိူဝ်းလုၵ်ႈတီႈ ၽူႈၵုမ်းၵၢၼ်ၶဝ် လႄႈ တၢင်ႇၸိူဝ်း",
+       "revdelete-unsuppress": "ထွၼ်ပႅတ်ႈ လွင်ႈၵႅတ်ႇႁႄႉ ဢၼ်မီးတီႈ ၵၢၼ်ၶူၼ်ႉလူ ဢၼ်ဢဝ်ဝႆႉၶိုၼ်းၼၼ်ႉ။",
+       "revdelete-log": "လွင်ႈတၢင်း :",
+       "revdelete-submit": "သိုပ်ႇႁဵတ်း တွၼ်ႈတႃႇ {{PLURAL:$1|ၵၢၼ်ၶူၼ်ႉလူ|ၵၢၼ်ၶူၼ်ႉလူၸိူဝ်း}}ဢၼ်လိူၵ်ႈဝႆႉ",
+       "revdelete-success": "လွင်ႈႁၼ်လႆႈ ၵၢၼ်ၶူၼ်ႉလူၼႆႉ ပဵၼ် ဢၢပ်ႉတိတ်ႉၵႂႃႇယဝ်ႉ။",
+       "revdelete-failure": "လွင်ႈႁၼ်လႆႈ ၵၢၼ်ၶူၼ်ႉလူၼႆႉ ဢမ်ႇပႆႇပဵၼ် ဢၢပ်ႉတိတ်ႉလႆႈ။\n$1",
+       "logdelete-success": "မၵ်းသႂ်ႇ လွင်ႈႁၼ်လႆႈ သဵၼ်ႈမၢႆ",
+       "logdelete-failure": "လွင်ႈႁၼ်လႆႈ သဵၼ်ႈၵၢၼ်ၼႆႉ ဢမ်ႇၸၢင်ႈမၵ်းသႂ်ႇလႆႈ။\n$1",
+       "revdel-restore": "လႅၵ်ႈလၢႆႈ ၵၢၼ်ႁၼ်လႆႈ",
+       "pagehist": "ပိုၼ်းၼႃႈလိၵ်ႈ",
+       "deletedhist": "ပိုၼ်း ၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ။",
+       "revdelete-reasonotherlist": "လွင်ႈတၢင်းတၢင်ႇၸိူဝ်း",
+       "revdelete-edit-reasonlist": "မႄးထတ်း လွင်ႈတၢင်း တႃႇမွတ်ႇ",
+       "revdelete-offender": "ၽူႈတႅမ်ႈ ၶေႃႈၶူၼ်ႉဢၢၼ်ႇ :",
+       "suppressionlog": "သဵၼ်ႈမၢႆ တဵၵ်းၵိုတ်း",
+       "mergehistory": "ပိုၼ်းၸိူဝ်း ႁူမ်ႈၼႃႈလိၵ်ႈ",
+       "mergehistory-box": "ဢဝ်ၶေႃႈၶူၼ်ႉဢၢၼ်ႇၶွင် သွင်ၼႃႈလိၵ်ႈၼႆႉ ႁူမ်ႈၵၼ်",
+       "mergehistory-from": "ၼႃႈလိၵ်ႈ ငဝ်ႈငႃႇ :",
+       "mergehistory-into": "ၼႃႈလိၵ်ႈ ယိူင်းၸူး :",
+       "mergehistory-list": "ပိုၼ်းမႄးထတ်း ဢၼ်ၸၢင်ႈႁူမ်ႈလႆႈ",
+       "mergehistory-go": "ၼႄပၼ် ၵၢၼ်မႄးထတ်း ဢၼ်ၸၢင်ႈႁူမ်ႈၵၼ်လႆႈ",
+       "mergehistory-submit": "ၶေႃႈၶူၼ်ႉဢၢၼ်ႇ ႁူမ်ႈၵၼ်",
+       "mergehistory-empty": "ၶေႃႈၶူၼ်ႉဢၢၼ်ႇ ဢၼ်တေၸၢင်ႈႁူမ်ႈၵၼ်လႆႈၼၼ်ႉ ဢမ်ႇမီး",
+       "mergehistory-fail-bad-timestamp": "မိၵ်ႈၶၢဝ်းယၢမ်း ၼႆႉဢမ်ႇၸႂ်ႉလႆႈ",
+       "mergehistory-fail-invalid-source": "ၼႃးလိၵ်ႈငဝ်ႈငႃႇ ၼႆႉ ဢမ်ႇၸႂ်ႉလႆႈ။",
+       "mergehistory-fail-invalid-dest": "ၼႃႈလိၵ်ႈယိူင်းၸူးၼၼ်ႉ ဢမ်ႇၸႂ်ႉလႆႈ",
+       "mergehistory-no-source": "ၼႃႈလိၵ်ႈငဝ်ႈငႃႇ $1 ၼႆႉ ဢမ်ႇမီးဝႆ့",
+       "mergehistory-no-destination": "ၼႃႈလိၵ်ႈ ယိူင်းၸူး $1 ၼႆႉ ဢမ်ႇမီးဝႆႉ။",
+       "mergehistory-invalid-source": "ၼႃႈလိၵ်ႈငဝ်ႈငႃႇၼႆႉ တေလႆႈလီပဵၼ် ႁူဝ်ၶေႃႈ ဢၼ်ၸႂ်ႉလႆႈ။",
+       "mergehistory-invalid-destination": "ၼႃႈလိၵ်ႈယိူင်းၸူးၼႆႉ​ တေလႆႈပဵၼ် ႁူဝ်ၶေႃႈ ဢၼ်ၸႂ်ႉလႆႈ။",
+       "mergehistory-autocomment": "ႁူမ်ဢဝ် [[:$1]] ၸူး [[:$2]]",
+       "mergehistory-comment": "ႁူမ်ႈယဝ်ႉ [[:$1]] ၸူး [[:$2]]: $3",
+       "mergehistory-same-destination": "ၼႃႈလိၵ်ႈငဝ်ႈငႃႇလႄႈ ၼႃႈလိၵ်ႈယိူင်းၸူးၼၼ်ႉ တေဢမ်ႇၸၢင်ႈမိူၼ်ၵၼ်လႆႈ။",
+       "mergehistory-reason": "လွင်ႈတၢင်း :",
+       "mergelog": "သဵၼ်ႈမၢႆ ႁူမ်ႈၵၼ်",
+       "revertmerge": "ၶိုၼ်းၸႅၵ်ႇဢွၵ်ႇ",
+       "mergelogpagetext": "သဵၼ်ႈမၢႆ ၸိူဝ်းမီးတႂ်ႈၼႆႉ မၼ်းပဵၼ် သဵၼ်ႈမၢႆ ဢၼ်တိုၵ်ႉဢဝ်ပိုၼ်း ၼႃႈလိၵ်ႈဢၼ်ၼိုင်ႈ ၵႂႃႇလေႃႈၵၼ် ထႅင်ႈတၢင်ႇဢၼ်။",
+       "history-title": "ပိုၼ်းၶူၼ်ႉလူတွၼ်ႈတႃႇ \"$1\"",
+       "difference-title": "လွင်ႈပႅၵ်ႇပိူင်ႈ ၼႂ်းၵႄႈ လွင်ႈၶူၼ်ႉလူ တင်း \"$1\"",
+       "difference-title-multipage": "လွင်ႈပႅၵ်ႇပိူင်ႈ ၼႂ်းၵႄႈ ၼႃႈလိၵ်ႈ \"$1\" လႄႈ \"$2\"",
+       "difference-multipage": "(လွင်ႈပႅၵ်ႇပိူင်ႈ ၼႂ်းၵႄႈ ၼႃႈလိၵ်ႈ)",
+       "lineno": "ထႅဝ် $1:",
+       "compareselectedversions": "ၼိူင်းၵၼ်တူၺ်း ၶေႃႈၶူၼ်ႉဢၢၼ်ႇ ၸိူဝ်းလိူၵ်ႈဝႆႉ",
+       "showhideselectedversions": "လႅၵ်ႈလၢႆႈ ၵၢၼ်ႁၼ်လႆႈ ၶွင် ၶေႃႈၶူၼ်ႉဢၢၼ်ႇ ၸိူဝ်းလိူၵ်ႈဝႆႉ",
+       "editundo": "ၶိုၼ်ၶိုၼ်း",
+       "diff-empty": "(ဢမ်ႇမီးလွင်ႈပႅၵ်ႇပိူင်ႈ)",
+       "diff-multi-sameuser": "({{PLURAL:$1|လွင်ႈမႄး ပၢၼ်ၵၢင် |$1 လွင်ႈၸိူဝ်းမႄး ပၢၼ်ၵၢင်}} ​ပေႃးတႃႇ ၽူႈၸႂ်တိုဝ်းမိူၼ်ၵၼ် တေဢမ်ႇၼႄပၼ်)",
+       "searchresults": "ၶူၼ်ႉႁႃၺႃး",
+       "searchresults-title": "ၶူၼ်ႉႁႃၺႃးတွၼ်ႈတႃႇ \"$1\"",
+       "prevn": "ပႃႈၼႃႈ {{PLURAL:$1|$1}}",
+       "nextn": "တေႃႇထႅင်ႈ {{PLURAL:$1|$1}}",
+       "nextn-title": "သိုပ်ႇၵႂႃႇၸူး $1 {{PLURAL:$1|result|ၽွၼ်းလႆႈ}}",
+       "shown-title": "ၼႄ $1 {{PLURAL:$1|result|results}} ၼိူဝ်​ၼႃႈ​လိၵ်ႈ​ၼိူင်ႈၼႃႈ",
+       "viewprevnext": "တူၺ်း ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong> ၶူင်သၢင်ႈၼႃႈလိၵ်ႈ \"[[:$1]]\" တီႈဝီႇၶီႇၼႆႉ </strong> {{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-redirect": "(ပိၼ်ႇသဵၼ်ႈတၢင်းၸူး $1)",
+       "search-section": "(တွၼ်ႈၵၼ် $1)",
+       "search-suggest": "ၶႂ်ႈဝႃႈ $1 - ၼႆႁႃႉ",
+       "searchall": "တင်းမူတ်း",
+       "search-showingresults": "{{PLURAL:$4|ၽွၼ်းလႆႈ <strong>$1</strong> တႃႇ <strong>$3</strong>|ၽွၼ်းလႆႈ <strong>$1 - $2</strong> တႃႇ <strong>$3</strong>}}",
+       "search-nonefound": "ဢမ်ႇမီးၽွၼ်းလႆႈ ၼိူဝ်ၵၢၼ် လွင်ႈသွၵ်ႈႁႃ",
+       "powersearch-legend": "သွၵ်ႈႁႃ ၶိုၵ်ႉတွၼ်း",
+       "powersearch-ns": "သွၵ်ႈႁႃ ၸွမ်းၸိုဝ်ႈသဵင် :",
+       "powersearch-togglelabel": "ၵူတ်ႇတူၺ်း :",
+       "powersearch-toggleall": "တင်းမူတ်း",
+       "powersearch-togglenone": "ဢမ်ႇမီးသင်",
+       "powersearch-remember": "တွင်းဝႆႉၵၼ်လိူၵ်ႈၸိူဝ်းၼႆႉ တွၼ်ႈတႃႇ ၸႂ်ႉၵၢၼ်သွၵ်ႈႁႃ မိူဝ်းၼႃႈ",
+       "search-external": "သွၵ်ႈႁႃႈ ၽၢႆၼွၵ်ႈ",
+       "search-error": "မိူဝ်ႈၽွင်းသွၵ်ႈႁႃၼၼ်ႉ မီးလွင်ႈၽိတ်းပိူင်ႈ : $1",
+       "preferences": "ငဝ်ႈၵုမ်းပိူင်",
+       "mypreferences": "လွင်ႈလႆႈၸႂ်လိူဝ်",
+       "prefs-edits": "ၵမ်းၸိူဝ်း မႄးထတ်းမႃး :",
+       "prefsnologintext2": "တႃႇတေလႅၵ်ႈလၢႆႈ ငဝ်ႈၵုမ်းပိူင်ၸဝ်ႈၵဝ်ႇၼၼ်ႉ ၶႅၼ်းတေႃႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇလႄႈ။",
+       "prefs-skin": "ၽိဝ်",
+       "skin-preview": "တူၺ်းလူင်ႈၼႃႈ",
+       "prefs-user-pages": "ၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "prefs-personal": "ပိုၼ်းၵႅပ်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "prefs-rc": "လွင်ႈလႅၵ်ႈလၢႆႈမႂ်ႇမႂ်ႇ",
+       "prefs-watchlist": "သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "prefs-editwatchlist": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "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-max": "တီႈၼမ်သုတ်းမၼ်း : 1000",
+       "prefs-watchlist-token": "မၢႆၶပ်ႉ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း :",
+       "prefs-misc": "ဢၼ်ယွႆႈဢၼ်ယမ်း",
+       "prefs-resetpass": "လႅၵ်ႈလၢႆႈ ၶေႃႈလပ်ႉ",
+       "prefs-changeemail": "လႅၵ်ႈလၢႆႈ ဢမ်ႇၼၼ် ထွၼ်ပႅတ်ႈ ႁဵင်းလိၵ်ႈ ဢီးမေးလ်",
+       "prefs-setemail": "ပေႃႉသႂ်ႇပၼ် ႁဵင်းလိၵ်ႈ ဢီးမေးလ်",
+       "prefs-email": "ၵၢၼ်လိူၵ်ႈသၢင်ႈ တႃႇဢီးမေးလ်",
+       "prefs-rendering": "ၽၢင်ႁၢင်ႈ",
+       "saveprefs": "ၵဵပ်းသိမ်း",
+       "restoreprefs": "ၶိုၼ်းတမ်း ၵၢၼ်တင်ႈတင်းမူတ်း ႁႂ်ႈမိူၼ်ၵဝ်ႇၶိုၼ်း (ၵႃႈတီႈ တွၼ်ႈၵၼ်ၵူႈဢၼ်)",
+       "prefs-editing": "တိုၵ်ႉမႄးထတ်းယူႇ",
+       "rows": "သၢႆတမ်း :",
+       "columns": "သၢႆၸုၵ်း :",
+       "searchresultshead": "ၶူၼ်ႉႁႃ",
+       "stub-threshold-sample-link": "တူဝ်ယၢင်ႇ",
+       "stub-threshold-disabled": "ဢိုတ်းဝႆႉ",
+       "recentchangesdays": "ဝၼ်းၸိူဝ်းဢၼ်တေၼႄ ၵႃႈတီႈၼႂ်း လွင်ႈလႅၵ်ႈလၢႆႈ မႂ်ႇမႂ်ႇ",
+       "recentchangesdays-max": "တီႈၼမ်သုတ်း $1 {{PLURAL:$1|ဝၼ်း|ဝၼ်း}}",
+       "recentchangescount": "တၢင်းၼမ်ၵၢၼ်မႄးထတ်း ဢၼ်တေၼႄဝႆႉၼင်ႇ ပိူင်ၵႅဝ်ႈ :",
+       "prefs-help-recentchangescount": "ၼႆ့မၼ်းၶဝ်ႈပႃးဝႆႉ လွင်ႈလႅၵ်ႈလၢႆႈ မႂ်ႇမႂ်ႇ၊ ပိုၼ်းၼႃႈလိၵ်ႈ လႄႈ သဵၼ်ႈမၢႆ။",
+       "savedprefs": "လွင်ႈလႆႈၸႂ်ၸဝ်ႈၵဝ်ႇၸိူဝ်းၼၼ်ႉ ထုၵ်ႇသိမ်းဝႆႉပၼ်ယဝ်ႉ။",
+       "savedrights": "သုၼ်ႇလႆႈၽူႈၸႂ်ႉတိုဝ်း {{GENDER:$1|$1}} ၼႆႉ ထုၵ်ႇသိမ်းဝႆႉပၼ်ယဝ်ႉ။",
+       "timezonelegend": "ၼႃႈလိၼ် ၶၢဝ်းယၢမ်း :",
+       "localtime": "ၶၢဝ်းယၢဝ်း ၼႂ်းမိူင်း :",
+       "timezoneuseserverdefault": "ၸႂ်ႉပိူင်ၵႅဝ်ႈ ဝီႇၶီႇ ($1)",
+       "timezoneuseoffset": "တၢင်ႇၸိူဝ်း (မၵ်းမၼ်ႈ ႁႂ်ႈမီးၼမ်ႉတွၼ်း)",
+       "servertime": "ၶၢဝ်းယၢမ်း သႃႇပိူဝ်ႇ :",
+       "guesstimezone": "လုၵ်ႉတီႈ ၶိူင်ႈပိုတ်ႇဝႅပ်ႉသေ ထႅမ်သႂ်ႇ",
+       "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": "ၾၢႆႇ",
+       "prefs-custom-css": "CSS ႁင်းတူဝ်",
+       "prefs-custom-js": "JavaScript ႁင်းတူဝ်",
+       "prefs-common-css-js": "CSS/Javascript ၸိူဝ်းၽႄႈၸႂ်ႉဝႆႉ တႃႇ ၽိဝ်ၼင်တင်းသဵင်ႈ :",
+       "prefs-reset-intro": "ၸဝ်ႈၵဝ်ႇ တေၸၢင်ႈၸႂ်ႉၼႃႈလိၵ်ႈၼႆႉ တွၼ်ႈတႃႇ တင်ႈၶိုၼ်း လွင်ႈလႆႈၸႂ်ၸဝ်ႈၵဝ်ႇ ၸူးၵႃႈတီႈ သၢႆႉ ပိူင်ၵႅဝ်ႈ။ ၼႆႉမၼ်းတေဢမ်ႇၸၢင်ႈ ၶိုၼ်းမႄးၶိုင်ၶိုၼ်း။",
+       "prefs-emailconfirm-label": "ၶေႃႈၼႄႉၼွၼ်း ဢီးမေးလ် :",
+       "youremail": "ဢီးမေးလ် :",
+       "username": "{{GENDER:$1|ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း}}:",
+       "prefs-memberingroups": "{{GENDER:$2|ၽူႈၶဝ်ႈၸုမ်း}} of {{PLURAL:$1|ၸုမ်း|ၸုမ်း}}:",
+       "prefs-registration": "ၶၢဝ်းယၢမ်းတၢင်ႇမၢႆၽၢင် :",
+       "yourrealname": "ၶၢဝ်းယၢမ်း တႄႉတႄႉ :",
+       "yourlanguage": "ၽႃႇသႃႇၵႂၢမ်း :",
+       "yournick": "လၢႆးမိုဝ်းမႂ်ႇ :",
+       "gender-male": "မၼ်းမႄးထတ်း ၼႃႈလိၵ်ႈ ဝီႇၶီႇ",
+       "gender-female": "မၼ်းၼၢင်း မႄးထတ်း ၼႃႈလိၵ်ႈဝီႇၶီႇ",
+       "email": "ဢီးမေးလ်",
+       "prefs-help-realname": "ၸိုဝ်ႈတႄႉတႄႉၼၼ်ႉ ပဵၼ်ဢဝ်ၸႂ်ဝႃႈၵူၺ်ႈ။\nသင်ၸိူဝ်ႉဝႃႈ သႂ်ႇပၼ်ၼႆ မၼ်းတေၸၢင်ႈဢဝ်ၵႂႃႇၸႂ်ႉၵႃႈတီႈ ၼႃႈၵၢၼ်ဢၼ်ၸဝ်ႈၵဝ်ႇ ၶဝ်ႈႁူမ်ႈသၢင်ႈဝႆႉၼၼ်ႉဢေႃႈ။",
+       "prefs-help-email": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ၵေႃႈ ၵေႃႈ ပဵၼ်ဢဝ်ၸႂ်ဝႃႈၵူၺ်း။ ၵူၺ်းၵႃႈဝႃႈ ပေႃးဝႃႈ ​ၸဝ်ႈၵဝ်ႇ လိုမ်းၶေႃႈလပ်ႉလႄႈ တေၶႂ်ႈတင်ႈၶိုၼ်း ၶေႃႈလပ်ႉမႂ်ႇၼႆတႄႉ တေလူဝ်ႇ ႁဵင်းလိၵ်ႈဢီးမေးလ်ယဝ်ႉ။",
+       "right-writeapi": "ၸႂ်ႉတိုဝ်း လွင်ႈတႅမ်ႈ API",
+       "newuserlogpage": "သၢႆမၢႆလွင်ႈၵေႃႇသၢင်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "action-edit": "မူၼ်ႉမႄး ၼႃႈလိၵ်ႈၼႆႉ",
+       "enhancedrc-history": "ပိုၼ်း",
+       "recentchanges": "မီးလွင်ႈလႅၵ်ႈလၢႆႈပႆႇႁိုင်",
+       "recentchanges-legend": "ၵၼ်လိူၵ်ႈသၢင်ႈ လွင်ႈလႅၵ်ႈလၢႆႈဢၼ်ပူၼ်ႉမႃး",
+       "recentchanges-summary": "ၸွမ်းတူၺ်းႁွႆး ဢၼ်ပဵၼ်ၵၢၼ် တိုၵ်ႉႁႃလႅၵ်ႈလၢႆႈၵႂႃႇ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆႉ။",
+       "recentchanges-label-newpage": "လွင်ႈမႄးထတ်းဢၼ်ၼႆႉ ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇယဝ်ႉ",
+       "recentchanges-label-minor": "ပဵၼ်လွင်ႈမူၼ်ႉမႄးဢိတ်းဢီႈ",
+       "recentchanges-label-bot": "လွင်ႈမႄးထတ်းဢၼ်ၼႆႉ ပမၼ်းပဵၼ် bot ၵေႃႉႁဵတ်းၵႂႃႇ",
+       "recentchanges-label-unpatrolled": "ၶေႃႈထတ်းၼႆႉ ပႆႉၼႅၼ်ႈၼႃ",
+       "recentchanges-label-plusminus": "သႅၼ်းၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇလႅၵ်ႈလၢႆႈ ၸွမ်းၼင်ႇ မၢႆ bytes ဢၼ်ၼႆႉ",
+       "recentchanges-legend-heading": "<strong>ဢပုမ်ႇ:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (တူၺ်းပႃးထႅင်ႈ [[Special:NewPages|သဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇ]])",
+       "rclistfrom": "ၼႄ လွင်ႈ​လႅၵ်ႈလၢႆႈဢၼ်မႂ်ႇ တႄႇတီႈ $2, $3",
+       "rcshowhideminor": "$1 လွင်ႈမူၼ်ႉမႄး ဢိတ်းဢီႈ",
+       "rcshowhideminor-show": "ၼႄ",
+       "rcshowhideminor-hide": "သိူင်ႇ",
+       "rcshowhidebots": "$1 ၿွတ်ႉ",
+       "rcshowhidebots-show": "ၼႄ",
+       "rcshowhidebots-hide": "သိူင်ႇ",
+       "rcshowhideliu": "$1 ၽူႈၸႂ်ႉ ဢၼ်တၢင်ႇမၢႆၽၢင်ဝႆႉ",
+       "rcshowhideliu-hide": "သိူင်ႇ",
+       "rcshowhideanons": "$1 ၽူႈၸႂ်ႉတိုဝ်းဢမ်ႇသႂ်ႇၸိုဝ်ႈ",
+       "rcshowhideanons-show": "ၼႄ",
+       "rcshowhideanons-hide": "သိူင်ႇ",
+       "rcshowhidemine": "$1 ဢၼ်ၵဝ်ၶႃႈ မူၼ်ႉမႄး",
+       "rcshowhidemine-show": "ၼႄ",
+       "rcshowhidemine-hide": "သိူင်ႇ",
+       "rcshowhidecategorization": "$1 ၼႃႈလိၵ်ႈ ပၢႆး-",
+       "rcshowhidecategorization-show": "ၼႄ",
+       "rcshowhidecategorization-hide": "သိူင်ႇ",
+       "rclinks": "ၼႄလွင်ႈလႅၵ်ႈလၢႆႈ ၵမ်းလိုၼ်းသုတ်း $1 ဢၼ်လႅၵ်ႈလၢႆႈမႃး မိူဝ်ႈ $2 ဝၼ်းၼၼ်ႉ<br />$3",
+       "diff": "ပႅၵ်ႇပိူင်ႈ",
+       "hist": "ပိုၼ်း",
+       "hide": "သိူင်ႇ",
+       "show": "ၼႄ",
+       "minoreditletter": "m",
+       "newpageletter": "N",
+       "boteditletter": "b",
+       "rc_categories_any": "လိူၵ်ႈသေဢၼ်ဢၼ်",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ဝၢႆးသေလႅၵ်ႈလၢႆႈ",
+       "recentchangeslinked": "တၢင်း​လႅၵ်ႈ​လၢႆႈ ဢၼ်​ၵဵဝ်ႇ​ၵွင်ႉ",
+       "recentchangeslinked-toolbox": "တၢင်း​လႅၵ်ႈ​လၢႆႈ ဢၼ်​ၵဵဝ်ႇ​ၵွင်ႉ",
+       "recentchangeslinked-title": "ၵၢၼ်လႅၵ်ႈလၢႆႈ ဢၼ်ၵပ်းၵၢႆႇလူၺ်ႈ  \"$1\"",
+       "recentchangeslinked-summary": "ဢၼ်ၼႆႉၼႆႉပဵၼ် သဵၼ်ႈမၢႆ လွင်ႈလႅၵ်ႈလၢႆႈ ၸိူဝ်းဢၼ်တိုၵ်ႉႁႃ လႅၵ်ႈလၢႆႈမႃးၸူး ၼႃႈလိၵ်ႈ ဢၼ်မၵ်းမၼ်ႈဝႆႉၼႆႉ (ဢမ်ႇၼၼ် ၸူး ၽူႈၶဝ်ႈၸုမ်း ဢၼ်မီးၼႂ်း ၵၼ် ဢၼ်လႆႈမၵ်းမၼ်ႈဝႆႉ).\nၼႃးလိၵ်ႈ ၸိူဝ်းမီးၼိူဝ် [[Special:Watchlist|your watchlist]] ၼႆႉ <strong>တေလမ်ၼႃႈ</strong>ဝႆ့။",
+       "recentchangeslinked-page": "ၸိုဝ်ႈၼႃႈလိၵ်ႈ",
+       "recentchangeslinked-to": "ၼႄပၼ် လွၵ်ႈလႅၵ်ႈလၢႆႈ ၸူး ၼႃႈလိၵ်ႈ ဢၼ်ၵွင်ႉသိုပ်ႇ",
+       "recentchanges-page-added-to-category": "[[:$1]] သႂ်ႇၼႂ်း ပၢႆးယဝ်ႉ",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] and [[Special:WhatLinksHere/$1|{{PLURAL:$2|one page|$2 pages}}]] ဢဝ်သႂ်ႇၼႂ်း ပၢႆး",
+       "recentchanges-page-removed-from-category": "[[:$1]] ဢဝ်ဢွၵ်ႇတမ်ႈတီႈ ပၢႆး",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} ဢဝ်ဢွၵ်ႇ တမ်ႈတီႈ ၼႂ်းပၢႆး",
+       "upload": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
+       "filedesc": "ႁူဝ်ႁုပ်ႈ",
+       "upload-dialog-title": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
+       "upload-dialog-button-cancel": "ဢမ်ႇႁဵတ်း",
+       "upload-dialog-button-done": "ယဝ်ႉ",
+       "upload-dialog-button-save": "ၵဵပ်းသိမ်း",
+       "upload-dialog-button-upload": "လူတ်ႇၶိုၼ်ႈ",
+       "upload-form-label-infoform-title": "ႁူဝ်ယွႆႈ",
+       "upload-form-label-infoform-name": "ၸိုဝ်ႈ",
+       "upload-form-label-infoform-description": "ၶေႃႈသပ်းလႅင်း",
+       "upload-form-label-usage-title": "ၶေႃႈၸႂ်ႉ",
+       "upload-form-label-usage-filename": "ၸိုဝ်ႈၾၢႆႇ",
+       "license-header": "ဝႆၶႂၢင်း",
+       "imgfile": "ၾၢႆႇ",
+       "file-anchor-link": "ၾၢႆႇ",
+       "filehist": "ပိုၼ်းၾၢႆႇ",
+       "filehist-help": "တဵၵ်းၼိူဝ် ဝၼ်းထိ/ၶၢဝ်းယၢမ်း တႃႇႁၼ်ၾၢႆႇ ၼႂ်းဝၼ်းၼၼ်ႉ",
+       "filehist-current": "ယၢမ်းလဵဝ်",
+       "filehist-datetime": "ဝၼ်းထီႉ/ၶၢဝ်းယၢမ်း",
+       "filehist-thumb": "ႁၢင်ႈလဵၵ်ႉ",
+       "filehist-thumbtext": "ၽၢင်ယဵမ်ႈ တွၼ်ႈတႃႇ ပိူဝ်းသျိၼ်းၼင်ႇ  $1",
+       "filehist-user": "ၽူႈၸႂ်ႉတိုဝ်း",
+       "filehist-dimensions": "သႅၼ်းမၼ်း",
+       "filehist-comment": "တၢင်းႁၼ်ထိုင်",
+       "imagelinks": "လွင်ႈၸႂ်ႉတိုဝ်း ၾၢႆႇ",
+       "linkstoimage": "{{PLURAL:$1|ၼႃႈလိၵ်ႈ|$1 ၼႃႈလိၵ်ႈ}} ၵွင်ႉမႃးၸူးၾၢႆႇၼႆႉ:",
+       "nolinkstoimage": "ဢမ်ႇမီးၼႃႈလိၵ်ႈဢၼ်ၵွင်ႉၸူး ၾၢႆႇဢၼ်ၼႆႉ",
+       "sharedupload-desc-here": "ၾၢႆႇဢၼ်ၼႆႉ လုၵ်ႉတီႈ $1 သေ တေၸၢင်ႈၵႂႃႇၸႂ်ႉ တီႈပရေႃးၵျႅၵ်ႉတၢင်ႇဢၼ်။\nဢၼ်တႅမ်ႈၼႄ တီႈၼႂ်း [$2 file description page] ၼၼ်ႉ တေၼႄပၼ် တီႈတႂ်ႈၼႆႉ။",
+       "upload-disallowed-here": "ၸဝ်ႈၵဝ်ႇတေဢမ်ႇၸၢင်ႈ တႅမ်တၢင်သႂ်ႇၼိူဝ် ၾၢႆႇဢၼ်ၼႆႉ",
+       "randompage": "ဢဝ်ၼႃႈလိၵ်ႈသၢင်ႇထုၵ်ႇဝႃႈ",
+       "nbytes": "$1 {{PLURAL:$1|ၿႆႉ|ၿႆႉ}}",
+       "nmembers": "$1 {{PLURAL:$1|member|ၽူႈၶဝ်ႈၸုမ်း}}",
+       "usercreated": "သၢင်ႈ​ဝႆႉ မိူဝ်ႈ $2 ဝၼ်း​ထီႉ $1",
+       "newpages": "ၼႃႈလိၵ်ႈမႂ်ႇ",
+       "pager-older-n": "{{PLURAL:$1|older 1|ဢၼ်ၵဝ်ႇၵဝ်ႇ $1}}",
+       "booksources": "ငဝ်ႈငႃႇ ပပ်ႉလိၵ်ႈ",
+       "booksources-search-legend": "ၶူၼ်ႉႁႃတႃႇ ငဝ်ႇငႃႇပပ်ႉ",
+       "booksources-search": "ၶူၼ်ႉႁႃ",
+       "log": "သၢႆမၢႆ",
+       "allpages": "ၼႃႈ​လိၵ်ႈ​တင်း​သဵင်ႈ",
+       "allarticles": "ၼႃႈ​လိၵ်ႈ​တင်း​သဵင်ႈ",
+       "allpagessubmit": "ၶူၼ်ႉႁႃ",
+       "categories": "လိူင်ႈ",
+       "mywatchlist": "သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "watch": "ပႂ်ႉတူၺ်း",
+       "dellogpage": "မွတ်ႇပႅတ်ႈ သၢႆမၢႆ",
+       "rollbacklink": "ထွႆပွၵ်ႈၶိုၼ်း",
+       "rollbacklinkcount": "ၵိင်ႈၶိုၼ်းလင် $1 {{PLURAL:$1|edit|မႄးထတ်း}}",
+       "protectlogpage": "မၢႆတမ်း ၵၢၼ်ႁေႉၵင်ႈ",
+       "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} မွတ်ႇပႅတ်ႈယဝ်ႉ",
+       "undeletelink": "တူၺ်း/ၶိုၼ်းမိူၼ်ၵဝ်ႇ",
+       "undeleteviewlink": "တူၺ်း",
+       "namespace": "ဢွင်ႈတီႈၸိုဝ်ႈ",
+       "invert": "ပဵၼ်ႇၽၢႆႇ လွင်ႈလိူၵ်ႈသၢင်ႈ",
+       "tooltip-invert": "လိူၵ်ႈပၼ် လွၵ်းၼႆႉဝႃႈ တႃႇတေလပ်ႉဝႆႉ လွင်ႈလႅၵ်ႈလၢႆႈ ဢၼ်ႁဵတ်းၸူး ၼႃႈလိၵ်ႈၸိူဝ်းၼႆႉ ၸွမ်းၼင်ႇ ၸိုဝ်ႈ ၸိူဝ်းလိူၵ်ႈဝႆႉ (လႄႈ ၸွမ်းၼင်ႇၸိုဝ်ႈ ၸိူဝ်းဢၼ်လိူၵ်ႈဝႆႉယဝ်ႉၼၼ်ႉ)",
+       "namespace_association": "ဢွင်ႈတီႈၸိုဝ်ႈ ဢၼ်ၵွင်ႉၵၢႆႇဝႆႉ",
+       "tooltip-namespace_association": "လိူၵ်ႈပၼ် လွၵ်းၼႆႉ တႃႇတေႁႂ်ႈပႃး ၶေႃႈဢုပ်ႇဢူဝ်း ဢမ်ႇၼၼ် ၸိုဝ်ႈႁူဝ်ၶေႃႈ ဢၼ်ၵပ်းၵၢႆႇလူၺ်ႈ ႁူဝ်ၶေႃႈ ဢၼ်လိူၵ်ႈဝႆႉၼၼ်ႉ။",
+       "blanknamespace": "ႁူဝ်ႁႅၵ်ႇ",
+       "contributions": "{{GENDER:$1|User}} ၶဝ်ႈႁူမ်ႈပႃး",
+       "mycontris": "လွင်ႈၶဝ်ႈႁူမ်ႈ",
+       "anoncontribs": "လွင်ႈၶဝ်ႈႁူမ်ႈ",
+       "month": "တႄႇဢဝ်လိူၼ် (လႄႈ ဢၼ်ပူၼ်ႉမႃး):",
+       "year": "တႄႇဢဝ်ပီ (လႄႈ ဢၼ်ပူၼ်ႉမႃး):",
+       "whatlinkshere": "ႁဵင်းၵွင်ႉ ဢၼ်မီးတီႈၼႆႉ ပဵၼ်သင်",
+       "whatlinkshere-title": "ၼႃႈလိၵ်ႈၸိူဝ်းလိင်ႉၸူး \"$1\"",
+       "whatlinkshere-page": "ၼႃႈလိၵ်ႈ",
+       "linkshere": "ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ မၼ်းၵွင်ႉသၢၼ် ဝႆႉၸူး <strong>[[:$1]]</strong>:",
+       "isredirect": "ပိၼ်ႇႁူဝ်ၼႃႈလိၵ်ႈ",
+       "istemplate": "တူဝ်ၶဝ်ႈပႃး",
+       "isimage": "ၾၢႆႇၵွင်ႉ",
+       "whatlinkshere-prev": "{{PLURAL:$1|ဢၼ်ပူၼ်ႉမႃး|ဢၼ်ပူၼ်ႉမႃး $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|သိုပ်ႇၼႃႈ|သိုပ်ႇၼႃႈ $1}}",
+       "whatlinkshere-links": "ႁဵင်းၵွင်ႉ",
+       "whatlinkshere-hideredirs": "$1 လၢႆႈၽၢႆႇ",
+       "whatlinkshere-hidetrans": "သိူင်ႇတူဝ်ၶဝ်ႈပႃး",
+       "whatlinkshere-hidelinks": "$1 လိင်ႉၵွင်ႉ",
+       "whatlinkshere-filters": "တူဝ်ထွင်",
+       "blocklink": "ႁႄႉတတ်း",
+       "unblocklink": "ဢမ်ႇႁႄႉႁၢမ်ႈ",
+       "contribslink": "ၶဝ်ႈႁူမ်ႈ",
+       "movelogpage": "ၶၢႆႉသၢႆမၢႆ",
+       "revertmove": "ပိၼ်ႇပွၵ်ႈၶိုၼ်း",
+       "export": "သူင်ႇၼႃႈလိၵ်ႈဢွၵ်ႇ",
+       "thumbnail-more": "ႁၢင်ႈယႂ်ႇ",
+       "tooltip-pt-userpage": "ၼႃႈလိၵ်ႈသုၼ်ႇတူဝ်ၸဝ်ႈၵဝ်ႇ",
+       "tooltip-pt-mytalk": "ၼႃႈလိၵ်ႈသပ်းလႅင်းၸဝ်ႈၵဝ်ႇ",
+       "tooltip-pt-preferences": "{{GENDER:|ၸဝ်ႈၵဝ်ႇ}} ငဝ်ႈၵုမ်းပိူင်",
+       "tooltip-pt-watchlist": "သဵၼ်ႈမၢႆၼႃႈလိၵ်ႈ ဢၼ်ပႂ်ႉတူၺ်း တႃႇလႅၵ်ႈလၢႆႈ",
+       "tooltip-pt-mycontris": "သဵၼ်ႈမၢႆ ၶေႃႈလိၵ်ႈၸဝ်ႈၵဝ်ႇ",
+       "tooltip-pt-login": "ဢမ်ႇလွၵ်ႉဢိၼ်ႇၵေႃႈမူၼ်ႉမႄးလႆႈ ၵူၺ်း တိုၵ်းသူၼ်းႁႂ်ႈလွၵ်ႉဢိၼ်ႇ",
+       "tooltip-pt-logout": "လွၵ်ႉဢဝ်ႉ",
+       "tooltip-pt-createaccount": "ၸဝ်ႈၵဝ်ႇထုၵ်ႇပၼ်ႁႅင်း တွၼ်ႈတႃႇၵေႃႇသၢင်ႈ ဢၶွင်ႉလႄႈ လွၵ်ႉဢိၼ်ႇ။ ႁူမ်ႈဝႃႈၼၼ်သေတႃႉ ဢမ်ႇၸႂ်ႈဝႃႈ ဢမ်ႇႁဵတ်းဢမ်ႇလႆႈၼင်ႇၵဝ်ႇ။",
+       "tooltip-ca-talk": "ဢုပ်ႇဢူဝ်းလွင်ႈပႃးဝႆႉၼႂ်းၼႃႈလိၵ်ႈ",
+       "tooltip-ca-edit": "မႄးထတ်း ၼႃးလိၵ်ႈၼႆႉ",
+       "tooltip-ca-addsection": "တႄႇပွတ်းတွၼ်ႈမႂ်ႇ",
+       "tooltip-ca-viewsource": "ၼႃႈ​လိၵ်ႈ​ၼႆႉ ထုၵ်ႇ​ႁေႉ​ၵင်ႈ​ဝႆႉ။ သူ​ၸၢင်ႊ​တူၺ်း​ င​ဝ်ႈငႃႇမၼ်းလႆႈ",
+       "tooltip-ca-history": "လွင်ႈၶူၼ်ႉလူဢၼ်ပူၼ်ႉမႃး တႃႇၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-protect": "ႁေႉၵင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-delete": "ယႃႉ ၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-move": "ၶၢႆႉ ၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-ca-watch": "ဢဝ်ၼႃႈလိၵ်ႈၼႆႉ သႂ်ႇၼႂ်းသဵၼ်ႈမၢႆပႂ်ႉတူၺ်း",
+       "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": "ၾိတ်ႉဢတွမ်ႊ(Atom) ၶွင်ႈၼႃႈလိၵ်ႈၼႆႉ",
+       "tooltip-t-contributions": "သဵၼ်ႈမၢႆလွင်ႈၶဝ်ႈႁူမ်ႈ တွၼ်ႈတႃႇ {{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-template": "တူၺ်း ပိူင်တမ်း",
+       "tooltip-ca-nstab-category": "တူၺ်းလိူင်ႈမၼ်း",
+       "tooltip-save": "ၵဵပ်းသိမ်း လွင်ႈလႅၵ်ႈလၢႆႈ",
+       "tooltip-preview": "လူင်ႈၼႃႈတူၺ်း လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇ၊ ၶႅၼ်းတေႃႈၸႂ်ႉပၼ် မိူဝ်ႈပႆႇသိမ်း",
+       "tooltip-diff": "ၼႄပၼ် လွင်ႈလႅၵ်ႈလၢႆႈ ၸိူဝ်းၸဝ်ႈၵဝ်ႇ ႁဵတ်းၵႂႃႇတီႈ တူဝ်လိၵ်ႈ",
+       "tooltip-rollback": "\"ႁူၼ်လင်ၶိုၼ်း\" ၼႆႉ မၼ်းတေဢဝ် ၼႃႈလိၵ်ႈၼႆႉ ၶိုၼ်းပိၼ်ႇဝၢႆႇၸူး ၸွမ်းၼင်ႇ ၽူႈႁူမ်ႈသၢင်ႈ ၵေႃႉလိုၼ်းသုတ်းၼၼ်ႉ ထတ်းသၢင်မႃး။",
+       "tooltip-undo": "\"Undo\" ၼႆ့ မၼ်းတေဢဝ် ၵၢၼ်ထတ်းသၢင်ဢၼ်ၼႆႉ ၶိုၼ်းပိၼ်ႇၸူးသေ ၶိုၼ်းပၼ် ပၼ် လၢႆးတူၺ်းလူင်ႈၼႃႈ တႃႇၵၢၼ်ထတ်းသၢင်ႈဢၼ်ၼႆႉ။ မၼ်းတေႁဵတ်းႁႂ်ႈၸဝ်ႈၵဝ်ႇ ထႅမ်သႂ်ႇ လွင်ႈတၢင်းမၼ်း ၵႃႈတီႈ လွၵ်းႁူဝ်ႁုပ်ႇမၼ်းၼၼ်ႉယူႇ။",
+       "tooltip-summary": "ထႅမ်သႂ်ႇ ၶေႃႈသပ်းလႅင်း ဢၼ်ၵႅပ်ႈ",
+       "simpleantispam-label": "ၵူတ်ႇထတ်း Anti-spam.\n<strong>ယႃႇပေ</strong>ထႅမ်ဢၼ်ၼႆႉသႂ်ႇ!",
+       "pageinfo-toolboxlink": "လွၼ်ႉၶၢဝ်ႇၼႃႈလိၵ်ႈ",
+       "previousdiff": "ၵၢၼ်မႄးထတ်း ဢၼ်ၵဝ်ႇ",
+       "nextdiff": "ထတ်းသၢင်ႈဢၼ်မႂ်ႇမႂ်ႇ",
+       "file-info-size": "$1 × $2 pixels, တၢင်းလဵၵ်ႉတၢင်းယႂ်ႇ ၾၢႆႇ: $3, ယိူင်ႈ MIME: $4",
+       "file-nohires": "ဢမ်ႇမီး ဢၼ်ႁႅင်းၸိုၼ်ႈသႂ်ႇမၼ်း သုင်သုင်",
+       "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 ၽိၵ်ႉသိူဝ်ႇ",
+       "metadata": "ၶေႃႈမုၼ်းၼႅပ်ႇ",
+       "metadata-help": "ၾၢႆႇဢၼ်ၼႆႉ မၼ်းၶဝ်ႈပႃးဝႆႉလွၼ်ႉၶၢဝ်ႇ ထႅမ်သႂ်ႇမႂ်ႇ၊ ဢၼ်ဢၢပ်ႈထုၵ်ႉတီႈ ၵွင်ႈထႆႇ digital ဢမ်ႇၼၼ် တူဝ်ၵူတ်ႇ scanner ​ထႅမ်သႂ်ႇသေ သၢင်ႈဝႆႉ ဢမ်ႇၼၼ် လႅၵ်ႈလၢႆႈဝႆႉ။\nသင်ၸိူဝ်ႉၾၢႆႇဢၼ်ၼႆႉ ထုၵ်ႇမႄးၶိုၼ်းဝႆႉၵႃႈတီႈ ၾၢႆႇငဝ်ႈတိုၼ်းမၼ်းၼႆ ၼႂ်းၵႃႈ ၸဝ်ႈၵဝ်ႇမႄးဝႆႉၼၼ်ႉ မၼ်းတေဢမ်ႇထၢင်ႇႁၢင်ႈလႆႈ ၵူႈလွင်ႈ။",
+       "metadata-fields": "ၸိူဝ်းပဵၼ် လွၵ်းၶေႃႈမုၼ်းႁူဝ်ယွႆႈ တႃႇၶႅပ်းႁၢင်ႈ ဢၼ်မီးဝႆႉတီႈၼႂ်း ၶေႃႈၶၢဝ်ႇပွတ်း message ၼႆႉၼႆ မၼ်းတေၶဝ်ႈပႃးဝႆႉ ၵႃႈတီႈ ၼႃႈလိၵ်ႈၶႅပ်းႁၢင်ႈ ဢၼ်တေၼႄပၼ် ၽွင်းမိူဝ်ႈ လွၵ်းၶေႃႈမုၼ်းႁူဝ်ယွႆႈ လၼ်ႇၼႄပၼ်။\nဢၼ်ၵိုတ်းလိူဝ်ၸိူဝ်းၼၼ်ႉတႄႉ တေထုၵ်ႇလပ်ႉဝႆႉ ၸွမ်းၼင်ႇ ပိူင်ၵႅဝ်ႈမၼ်း။\n\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "ၼႃႈဝၢႆႇ",
+       "exif-xresolution": "ႁႅင်းၸိုၼ်ႈသႂ် ၼႃႈသုင်",
+       "exif-yresolution": "ႁႅင်းၸိုၼ်ႈသႂ် ၼႃႈယၢဝ်း",
+       "exif-datetime": "ဝၼ်းထီႉ လႄႈ ၶၢဝ်းယၢမ်း လႅၵ်ႈလၢႆႈၾၢႆႇ",
+       "exif-make": "ႁူင်းၵၢၼ်ႁဵတ်းဢွၵ်ႇ ၵွင်ႈထႆႇ",
+       "exif-model": "မေႃႇတႄႇ ၵွင်ႈထႆႇ",
+       "exif-software": "သွပ်ႉဝႄးၸိူဝ်းၸႂ်ႉမႃး",
+       "exif-exifversion": "ဢွၵ်ႇဝိူဝ်းသျိၼ်း",
+       "exif-colorspace": "ဢွင်ႈတီႈသီ",
+       "exif-datetimeoriginal": "ဝၼ်းလႄႈၶၢဝ်းယၢမ်း တမ်ႈတီႈ ၶေႃႈမုၼ်းမႂ်ႇ",
+       "exif-datetimedigitized": "ဝၼ်းထီႉလႄႈ ၶၢဝ်းယၢမ်းတႃႇ digitizing",
+       "exif-orientation-1": "သႃမၺ်း",
+       "namespacesall": "တင်းမူတ်း",
+       "monthsall": "တင်းမူတ်း",
+       "watchlistedit-normal-done": "{{PLURAL:$1|A single title was|$1 titles were}} ဢဝ်ဢွၵ်ႇ တမ်ႈတီႈ သဵၼ်ႈဢၼ်ၸဝ်ႈၵဝ်ႇ ပႂ်ႉတူၺ်း",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "specialpages": "ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
+       "tag-filter": "ၶတ်းလိူၵ်ႈဢဝ်[[Special:Tags|Tag]]:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|မွတ်ႇယဝ်ႉ}} ၼႃႈလိၵ်ႈ $3",
+       "logentry-move-move": "$1 {{GENDER:$2|ၶၢႆႉယဝ်ႉ}} ၼႃႈလိၵ်ႈ $3 တေႃႇ $4",
+       "logentry-newusers-create": "ဢၶွင်ႉၽူႈၸႂ်ႉတိုဝ်း $1 ၼႆႉ လႆႈ  {{GENDER:$2|ၵေႃႇသၢင်ႈယဝ်ႉ}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|လူတ်ႇၶိုၼ်ႈၵႂႃႇယဝ်ႉ}} $3",
+       "searchsuggest-search": "ၶူၼ်ႉႁႃ",
+       "mw-widgets-dateinput-no-date": "ပႆႇလိူၵ်ႈဝၼ်းယၢမ်း"
+}
index ac9345e..e522f97 100644 (file)
@@ -11,7 +11,8 @@
                        "아라",
                        "MaGa",
                        "Skalcaa",
-                       "Janezdrilc"
+                       "Janezdrilc",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podčrtavanje povezav:",
        "accmailtext": "Naključno generirano geslo za [[User talk:$1|$1]] smo poslali na $2. Po prijavi ga lahko spremenite na strani za ''[[Special:ChangePassword|spremembo gesla]]''.",
        "newarticle": "(Nov)",
        "newarticletext": "Sledili ste povezavi na stran, ki še ne obstaja.\nDa bi stran ustvarili, vnesite v spodnji obrazec besedilo\n(za več informacij glej [$1 pomoč]).\nČe ste sem prišli po pomoti, v svojem brskalniku kliknite gumb ''Nazaj''.",
-       "anontalkpagetext": "---- ''To je pogovorna stran brezimnega uporabnika, ki si še ni ustvaril računa ali pa ga ne uporablja. Zaradi tega moramo uporabiti IP-naslov za njegovo/njeno ugotavljanje istovetnosti. Takšen IP-naslov si lahko deli več uporabnikov. Če ste brezimni uporabnik in menite, da so nepomembne pripombe namenjene vam, prosimo [[Special:UserLogin|ustvarite račun]] ali pa se [[Special:CreateAccount|vpišite]], da preprečite zmedo z drugimi nepodpisanimi uporabniki.''",
+       "anontalkpagetext": "----\n<em>To je pogovorna stran brezimnega uporabnika, ki si še ni ustvaril računa ali pa ga ne uporablja.</em>\nZaradi tega moramo uporabiti IP-naslov za njegovo/njeno ugotavljanje istovetnosti.\nTakšen IP-naslov si lahko deli več uporabnikov.\nČe ste brezimni uporabnik in menite, da so nepomembne pripombe namenjene vam, prosimo [[Special:CreateAccount|ustvarite račun]] ali pa se [[Special:UserLogin|vpišite]], da preprečite zmedo z drugimi nepodpisanimi uporabniki.",
        "noarticletext": "Na tej strani ni trenutno nobenega besedila. Naslov strani lahko poskusite [[Special:Search/{{PAGENAME}}|poiskati]] na drugih straneh, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} v dnevniških zapisih] ali pa [{{fullurl:{{FULLPAGENAME}}|action=edit}} stran ustvarite]</span>.",
        "noarticletext-nopermission": "Na strani trenutno ni nobenega besedila.\nLahko poskusite [[Special:Search/{{PAGENAME}}|poiskati naslov strani]] na drugih straneh ali <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} v povezanih dnevniških zapisih]</span>, vendar za ustvarjanje strani nimate zadostnih dovoljenj.",
        "missing-revision": "Redakcija št. $1 strani »{{FULLPAGENAME}}« ne obstaja.\n\nPo navadi se to zgodi, ko sledite zastareli povezavi na zgodovino strani, ki jo je nekdo izbrisal.\nPodrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "whatlinkshere-prev": "{{PLURAL:$1|prejšnji|prejšnja $1|prejšnji $1|prejšnjih $1|prejšnjih $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|naslednji|naslednja $1|naslednji $1|naslednjih $1|naslednjih $1}}",
        "whatlinkshere-links": "← povezave",
-       "whatlinkshere-hideredirs": "Skrij preusmeritve",
-       "whatlinkshere-hidetrans": "Skrij vključitve",
-       "whatlinkshere-hidelinks": "Skrij povezave",
-       "whatlinkshere-hideimages": "Skrij povezave datotek",
+       "whatlinkshere-hideredirs": "$1 preusmeritve",
+       "whatlinkshere-hidetrans": "$1 vključitve",
+       "whatlinkshere-hidelinks": "$1 povezave",
+       "whatlinkshere-hideimages": "$1 povezave datotek",
        "whatlinkshere-filters": "Filtri",
        "whatlinkshere-submit": "Pojdi",
        "autoblockid": "Samodejna blokada št. $1",
index b804acd..4cae151 100644 (file)
        "october-date": "$1 tetor",
        "november-date": "$1 nëntor",
        "december-date": "$1 dhjetor",
+       "period-am": "PD",
+       "period-pm": "PD",
        "pagecategories": "{{PLURAL:$1|Kategoria|Kategoritë}}",
        "category_header": "Faqet në kategorinë \"$1\"",
        "subcategories": "Nënkategoritë",
        "morenotlisted": "Kjo listë nuk është e plotë.",
        "mypage": "Faqja",
        "mytalk": "Diskuto",
-       "anontalk": "Diskutimet për këtë IP",
+       "anontalk": "Diskutimi",
        "navigation": "Navigimi",
        "and": "&#32;dhe",
        "qbfind": "Gjeni",
        "pool-timeout": "Mbaroi koha duke pritur për kyçin",
        "pool-queuefull": "Radha e proceseve është mbushur",
        "pool-errorunknown": "Gabim i panjohur",
-       "pool-servererror": "Pishinë e  numerimit  te shërbimit nuk është në dispozicion (<span class=\"notranslate\" translate=\"asnjë\">$1</span>).",
+       "pool-servererror": "Shërbimi i pellgut të numërimit nuk është në dispozicion ($1).",
        "poolcounter-usage-error": "Gabim përdorimi: $1",
        "aboutsite": "Rreth {{SITENAME}}",
        "aboutpage": "Project:Rreth",
        "databaseerror-text": "\nKjo mund të tregojë një gabim në software.",
        "databaseerror-textcl": " ka ndodhur  një   gabim ne query te bazën të dhënash",
        "databaseerror-query": "\nPyetje: $ 1",
-       "databaseerror-function": "Funksioni: <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
-       "databaseerror-error": "Gabim: <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
+       "databaseerror-function": "Funksioni: $1",
+       "databaseerror-error": "Gabim: $1",
        "laggedslavemode": "'''Kujdes:''' Kjo faqe nuk mund të ketë përditësime të kohëve të fundit.",
        "readonly": "Databaza e kyçur",
        "enterlockreason": "Shëno arsyen e kyçjes, gjithashtu shëno se kur mund të hapet.",
        "filerenameerror": "I pamundur riemërtimi i skedës \"$1\" në \"$2\".",
        "filedeleteerror": "E pamundur fshirja e skedës \"$1\".",
        "directorycreateerror": "I pamundur krijimi i direktorisë \"$1\".",
-       "directoryreadonlyerror": "Direktoria \"<span class=\"notranslate\" translate=\"asnjë\">$1</span>\" është vetëm e lexueshme",
-       "directorynotreadableerror": "Direktoria \"<span class=\"notranslate\" translate=\"asnjë\">$1</span>\" nuk është e lexueshme.",
+       "directoryreadonlyerror": "Direktoria \"$1\" është vetëm e lexueshme",
+       "directorynotreadableerror": "Direktoria \"$1\" nuk është e lexueshme.",
        "filenotfound": "E pamundur gjetja e skedës \"$1\".",
        "unexpected": "Vlerë e papritur: \"$1\"=\"$2\".",
        "formerror": "Gabim: Formulari nuk mund të dërgohet.",
        "invalidtitle-unknownnamespace": "Titull jo i vlefshëm me numrin e panjohur të hapësirës së emrit $1 dhe tekstit \"$2\"",
        "exception-nologin": "I paqasur",
        "exception-nologin-text": "Ju lutem [[Special:Userlogin|hyni brënda]] për të qenë  në gjendje të hyni në këtë faqe ose veprim.",
-       "exception-nologin-text-manual": "Ju lutem <span class=\"notranslate\" translate=\"asnjë\">$1</span> që të jeni në gjendje për të hyrë në këtë faqe ose të veproni.",
+       "exception-nologin-text-manual": "Ju lutem $1 që të jeni në gjendje për të hyrë në këtë faqe ose të veproni.",
        "virus-badscanner": "Konfiguracion i parregullt: Skaner i panjohur virusesh: ''$1''",
        "virus-scanfailed": "skanimi dështoi (code $1)",
        "virus-unknownscanner": "antivirus i pa njohur:",
        "password-change-forbidden": "Ju nuk mund të ndryshoni fjalëkalimet në këtë wiki.",
        "externaldberror": "Ose kishte një gabim tek regjistri i identifikimit të jashtëm, ose nuk ju lejohet të përtërini llogarinë tuaje të jashtme.",
        "login": "Hyni",
+       "login-security": "Verifiko identitetin tuaj",
        "nav-login-createaccount": "Hyni ose hapni një llogari",
        "userlogin": "Hyni / hapni llogari",
        "userloginnocreate": "Hyni",
        "userlogin-resetlink": "Ke harruar të dhënat e tua të identifikimit?",
        "userlogin-resetpassword-link": "Keni harruar fjalëkalimin?",
        "userlogin-helplink2": "Ndihmë rreth identifikimit",
-       "userlogin-loggedin": "Ju tashmë janë të regjistruar si <span class=\"notranslate\" translate=\"asnjë\">{{GJINIA:$1|</span><span class=\"notranslate\" translate=\"asnjë\">$1</span>}}.\nPërdorim formularin më poshtë që të hyni në si një përdorues tjetër.",
+       "userlogin-loggedin": "Ju tashmë jeni i regjistruar si {{GENDER:$1|$1}}.\nPërdore formularin më poshtë për të hyrë si një përdorues tjetër.",
        "userlogin-createanother": "Krijo një llogari tjeter",
        "createacct-emailrequired": "Posta elektronike",
        "createacct-emailoptional": "Adresa Elektronike (me dëshirë)",
        "resetpass-validity-soft": "Fjalëkalimi juaj ka skaduar dhe duhet të rivendoset. Ju lutem zgjidhni një fjalëkalim të ri tani, ose klikoni \"{{int:resetpass-submit-cancel}}\" për ta rivendosur më vonë.",
        "passwordreset": "Ndrysho fjalkalimin",
        "passwordreset-text-one": "Plotësoni këtë formular për të marrë një fjalëkalim të përkohshëm nëpërmjet postës elektronike.",
-       "passwordreset-text-many": "<span class=\"notranslate\" translate=\"asnjë\">{{PLURAL:$1|</span>Mbush një nga fushat për të marrë një fjalëkalim të përkohshëm nëpërmjet postës elektronike.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Mbush një nga fushat për të marrë një fjalëkalim të përkohshëm nëpërmjet postës elektronike.}}",
        "passwordreset-disabled": "Rivendosja e fjalëkalimit është deaktivizuar në këtë wiki.",
        "passwordreset-emaildisabled": "Karakteristikat e  Email janë të paaftë në këtë wiki.",
        "passwordreset-username": "Nofka:",
        "newarticle": "(I ri)",
        "newarticletext": "Ti ke ndjekur nje lidhje drejt një faqeje që nuk ekziston.\nPër ta krijuar këtë faqe, fillo të shkruash në kutinë e mëposhtme (shih [$1 faqen e ndihmës] për më shumë informacion).\nNëse ti ke mbërritur këtu gabimisht, atëherë kliko butonin '''pas''' të shfletuesit tënd.",
        "anontalkpagetext": "----'' Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë. \n Prandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\n Në qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:CreateAccount|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim .''",
-       "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mund [[Special:Search/{{PAGENAME}}|ta kërkoni këtë titull]] në faqe tjera,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} të kërkoni ngjarjet e ngjashme në regjistër],\nose [{{fullurl:{{FULLPAGENAME}}|action=edit}} të redaktoni këtë faqe]</span>.",
+       "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mund [[Special:Search/{{PAGENAME}}|ta kërkoni këtë titull]] në faqe tjera,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} të kërkoni ngjarjet e ngjashme në regjistër],\nose [{{fullurl:{{FULLPAGENAME}}|action=edit}} të krijoni këtë faqe]</span>.",
        "noarticletext-nopermission": "Për momentin faqja e kërkuar është bosh.\nJu mund të [[Special:Search/{{PAGENAME}}|kërkoni këtë titiull]] në faqet e tjera, ose të <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} këtkoni regjistrat e ngjashëm]</span>, por ju nuk mundeni ta krijoni këtë faqe.",
        "missing-revision": "Inspektimi #$1 i faqes me emrin \"{{FULLPAGENAME}}\" nuk ekziston.\n\nKjo zakonisht shkaktuar duke ndjekur një lidhje të vjetër tek një faqe që është fshirë. Hollësitë mund të gjenden në [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regjistrin e fshirjeve].",
        "userpage-userdoesnotexist": "Llogaria e përdoruesit \"<nowiki>$1</nowiki>\" nuk është e regjistruar. \nJu lutem kontrolloni nëse dëshironi të krijoni/redaktoni këtë faqe.",
        "contributions": "Kontributet e {{GENDER:$1|përdoruesit|përdorueses}}",
        "contributions-title": "Kontributet e përdoruesit për $1",
        "mycontris": "Kontributet",
+       "anoncontribs": "Kontribute",
        "contribsub2": "Për $1 ($2)",
        "nocontribs": "Nuk ka asnjë ndryshim që përputhet me këto kritere.",
        "uctop": "(aktual)",
        "whatlinkshere-prev": "{{PLURAL:$1|e kaluara|të kaluarat $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|tjetra|tjerat $1}}",
        "whatlinkshere-links": "← lidhje",
-       "whatlinkshere-hideredirs": "$1 përcjellimet",
+       "whatlinkshere-hideredirs": "$1 përcjellime",
        "whatlinkshere-hidetrans": "$1 përfshirjet",
        "whatlinkshere-hidelinks": "$1 lidhjet",
        "whatlinkshere-hideimages": "$1 lidhjet me skedat",
index 59e50e2..31aab75 100644 (file)
@@ -30,7 +30,8 @@
                        "Srdjan m",
                        "Macofe",
                        "Сербијана",
-                       "Xð"
+                       "Xð",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "whatlinkshere-prev": "{{PLURAL:$1|претходни|претходних $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|следећи|следећих $1}}",
        "whatlinkshere-links": "← везе",
-       "whatlinkshere-hideredirs": "Сакриј преусмерења",
-       "whatlinkshere-hidetrans": "Сакриј укључивања",
-       "whatlinkshere-hidelinks": "Сакриј везе",
+       "whatlinkshere-hideredirs": "$1 преусмерења",
+       "whatlinkshere-hidetrans": "$1 укључивања",
+       "whatlinkshere-hidelinks": "$1 везе",
        "whatlinkshere-hideimages": "$1 везе до датотеке",
        "whatlinkshere-filters": "Филтери",
        "whatlinkshere-submit": "Иди",
index e786f12..2bbfa54 100644 (file)
@@ -21,7 +21,8 @@
                        "Srdjan m",
                        "Macofe",
                        "Сербијана",
-                       "Xð"
+                       "Xð",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "whatlinkshere-prev": "{{PLURAL:$1|prethodni|prethodnih $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|sledeći|sledećih $1}}",
        "whatlinkshere-links": "← veze",
-       "whatlinkshere-hideredirs": "Sakrij preusmerenja",
-       "whatlinkshere-hidetrans": "Sakrij uključivanja",
-       "whatlinkshere-hidelinks": "Sakrij veze",
+       "whatlinkshere-hideredirs": "$1 preusmerenja",
+       "whatlinkshere-hidetrans": "$1 uključivanja",
+       "whatlinkshere-hidelinks": "$1 veze",
        "whatlinkshere-hideimages": "$1 veze do datoteke",
        "whatlinkshere-filters": "Filteri",
        "whatlinkshere-submit": "Idi",
index 50a8700..940e00e 100644 (file)
@@ -69,7 +69,9 @@
                        "Josve05a",
                        "Pipetricker",
                        "Dammråtta",
-                       "Mgr"
+                       "Mgr",
+                       "Matma Rex",
+                       "McDutchie"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "password-change-forbidden": "Du kan inte ändra lösenord på denna wiki.",
        "externaldberror": "Antingen inträffade autentiseringsproblem med en extern databas, eller så får du inte uppdatera ditt externa konto.",
        "login": "Logga in",
+       "login-security": "Verifiera din identitet",
        "nav-login-createaccount": "Logga in / skapa konto",
        "userlogin": "Logga in / skapa konto",
        "userloginnocreate": "Logga in",
        "userlogin-resetpassword-link": "Glömt ditt lösenord?",
        "userlogin-helplink2": "Hjälp med inloggning",
        "userlogin-loggedin": "Du är redan inloggad som {{GENDER:$1|$1}}.\nAnvänd formuläret nedan för att logga in som en annan användare.",
+       "userlogin-reauth": "Du måste logga in igen för att verifiera att du är {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Skapa ett annat konto",
        "createacct-emailrequired": "E-postadress",
        "createacct-emailoptional": "E-postadress (valfritt)",
        "createacct-email-ph": "Bekräfta din e-postadress",
        "createacct-another-email-ph": "Skriv in e-postadress",
        "createaccountmail": "Använd ett tillfälligt slumpvis valt lösenord och skicka det till den angivna e-postadressen",
+       "createaccountmail-help": "Kan användas för att skapa ett konto åt en annan person utan att kunna lösenordet.",
        "createacct-realname": "Riktigt namn (valfritt)",
        "createaccountreason": "Orsak:",
        "createacct-reason": "Orsak",
        "createacct-reason-ph": "Varför du skapar ett annat konto",
+       "createacct-reason-help": "Meddelande som visas i loggen för skapade konton",
        "createacct-submit": "Skapa ditt konto",
        "createacct-another-submit": "Skapa konto",
+       "createacct-continue-submit": "Fortsätt att skapa konto",
+       "createacct-another-continue-submit": "Fortsätt att skapa konto",
        "createacct-benefit-heading": "{{SITENAME}} är skapad av människor som dig.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringar}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sida|sidor}}",
        "nocookiesnew": "Användarkontot skapades, men du är inte inloggad.\n{{SITENAME}} använder kakor för att logga in användare.\nDu har kakor inaktiverade.\nAktivera dem, och logga sedan in med ditt nya användarnamn och lösenord.",
        "nocookieslogin": "{{SITENAME}} använder kakor för att logga in användare. Du har stängt av kakor i din webbläsare. Försök igen med stöd för kakor aktiverat.",
        "nocookiesfornew": "Användarkontot skapades inte, eftersom vi inte kunde bekräfta dess källa.\nSe till att du har aktiverat kakor, ladda om denna sida och försök igen.",
+       "createacct-loginerror": "Kontot skapades men du kunde inte loggas in automatiskt. Var god [[Special:UserLogin|logga in manuellt]].",
        "noname": "Du har angett ett ogiltigt användarnamn.",
        "loginsuccesstitle": "Inloggad",
        "loginsuccess": "'''Du är nu inloggad på {{SITENAME}} som \"$1\".'''",
        "createacct-another-realname-tip": "Riktigt namn behöver inte anges.\nOm du väljer att ange det, kommer det att användas för att tillskriva dig ditt arbete.",
        "pt-login": "Logga in",
        "pt-login-button": "Logga in",
+       "pt-login-continue-button": "Fortsätt att logga in",
        "pt-createaccount": "Skapa konto",
        "pt-userlogout": "Logga ut",
        "php-mail-error-unknown": "Okänt fel i PHP:s mail()-funktion",
        "botpasswords-invalid-name": "Det angivna användarnamnet innehåller inte separatorn för botlösenord (\"$1\").",
        "botpasswords-not-exist": "Användaren \"$1\" har inte ett botlösenord som är \"$2\".",
        "resetpass_forbidden": "Lösenord kan inte ändras",
+       "resetpass_forbidden-reason": "Lösenorden kan inte ändras: $1",
        "resetpass-no-info": "Du måste vara inloggad för att komma åt den här sidan direkt.",
        "resetpass-submit-loggedin": "Ändra lösenord",
        "resetpass-submit-cancel": "Avbryt",
        "passwordreset-emailsentusername": "Om det finns en e-postadress som associeras med detta användarnamn kommer en lösenordsåterställning skickas via e-post.",
        "passwordreset-emailsent-capture": "En lösenordsåterställning via e-post har skickats, som visas nedan.",
        "passwordreset-emailerror-capture": "En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till {{GENDER:$2|användaren}}: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|E-postmeddelande|E-postmeddelanden}} för återställning av lösenord har skickats. {{PLURAL:$1|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} visas nedan.",
+       "passwordreset-emailerror-capture2": "Kunde inte skicka e-post till {{GENDER:$2|användaren}}: $1 {{PLURAL:$3|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} listas nedan.",
+       "passwordreset-invalideamil": "Ogiltig e-postadress",
+       "passwordreset-nodata": "Varken ett användarnamn eller en e-postadress angavs",
        "changeemail": "Ändra eller ta bort e-postadress",
        "changeemail-header": "Fyll i detta formulär för att ändra din e-postadress. Lämna fältet för ny e-postadress tomt när du skickar in formuläret om du vill ta bort en associerad e-postadress från ditt konto.",
        "changeemail-passwordrequired": "Du måste ange ditt lösenord för att bekräfta denna ändring.",
        "accmailtext": "Ett slumpgenererat lösenord för [[User talk:$1|$1]] har skickats till $2. Det kan ändras på sidan ''[[Special:ChangePassword|ändra lösenord]]'' när du loggar in.",
        "newarticle": "(Ny)",
        "newarticletext": "Du har klickat på en länk till en sida som inte finns ännu. För att skapa sidan, börja att skriva i fältet nedan (du kan läsa mer på [$1 hjälpsidan]). Om du kom hit av misstag kan du bara trycka på <strong>tillbaka</strong>-knappen i din webbläsare.",
-       "anontalkpagetext": "----''Detta är diskussionssidan för en anonym användare som inte ännu skapat ett konto, eller som inte använder det.\nDärför måste vi använda den numeriska IP-adressen för att identifiera honom/henne.\nEn sådan IP-adress kan delas av flera användare.\nOm du är en anonym användare och känner att irrelevanta kommentarer har riktats mot dig, vänligen [[Special:CreateAccount|skapa ett konto]] eller [[Special:UserLogin|logga in]] för att undvika framtida förväxlingar med andra anonyma användare.''",
+       "anontalkpagetext": "----<em>Detta är diskussionssidan för en anonym användare som inte ännu skapat ett konto, eller som inte använder det.</em>\nDärför måste vi använda den numeriska IP-adressen för att identifiera honom/henne.\nEn sådan IP-adress kan delas av flera användare.\nOm du är en anonym användare och känner att irrelevanta kommentarer har riktats mot dig, vänligen [[Special:CreateAccount|skapa ett konto]] eller [[Special:UserLogin|logga in]] för att undvika framtida förväxlingar med andra anonyma användare.",
        "noarticletext": "Det finns just nu ingen text på denna sida.\nDu kan [[Special:Search/{{PAGENAME}}|söka efter denna sidtitel]] på andra sidor, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar], eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} skapa denna sida]</span>.",
        "noarticletext-nopermission": "Det finns för tillfället ingen text på denna sida.\nDu kan [[Special:Search/{{PAGENAME}}|söka efter denna sidas titel]] på andra sidor,\neller <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade loggar]</span> men du har inte behörighet att skapa sidan.",
        "missing-revision": "Revisionen #$1 av sidan med namnet \"{{FULLPAGENAME}}\" finns inte.\n\nDetta orsakas vanligen av efter en gammal historiklänk till en sida som har raderats.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "whatlinkshere-prev": "{{PLURAL:$1|förra|förra $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|nästa|nästa $1}}",
        "whatlinkshere-links": "← länkar",
-       "whatlinkshere-hideredirs": "Dölj omdirigeringar",
-       "whatlinkshere-hidetrans": "Dölj inkluderingar",
-       "whatlinkshere-hidelinks": "Dölj länkar",
-       "whatlinkshere-hideimages": "Dölj fillänkar",
+       "whatlinkshere-hideredirs": "$1 omdirigeringar",
+       "whatlinkshere-hidetrans": "$1 inkluderingar",
+       "whatlinkshere-hidelinks": "$1 länkar",
+       "whatlinkshere-hideimages": "$1 fillänkar",
        "whatlinkshere-filters": "Filter",
        "whatlinkshere-submit": "Gå",
        "autoblockid": "Autoblockera #$1",
        "log-action-filter-suppress-block": "Användarcensur efter blockering",
        "log-action-filter-suppress-reblock": "Användarcensur efter återblockering",
        "log-action-filter-upload-upload": "Ny uppladdning",
-       "log-action-filter-upload-overwrite": "Återuppladdning"
+       "log-action-filter-upload-overwrite": "Återuppladdning",
+       "authmanager-authn-no-primary": "De angivna inloggningsuppgifterna kunde inte autentiseras.",
+       "authmanager-authn-no-local-user": "De angivna inloggningsuppgifterna är inte associerade med någon användare på denna wiki.",
+       "authmanager-authn-no-local-user-link": "De angivna inloggningsuppgifterna är giltiga, men inte associerade med någon användare på denna wiki. Logga in på ett annat sätt eller skapa en ny användare och du kommer att få välja att länka dina föregående inloggningsuppgifter till det kontot.",
+       "authmanager-authn-autocreate-failed": "Kunde inte skapa ett lokalt konto automatiskt: $1",
+       "authmanager-change-not-supported": "De angivna inloggningsuppgifterna kan inte ändras, då ingenting kan använda dem.",
+       "authmanager-create-disabled": "Kontoregistrering är inaktiverat.",
+       "authmanager-create-from-login": "Fyll i fälten nedan för att skapa ditt konto.",
+       "authmanager-create-no-primary": "De angivna inloggningsuppgifterna kunde inte användas för att skapa ett konto.",
+       "authmanager-link-no-primary": "De angivna inloggningsuppgifterna kunde inte användas för att länka ett konto.",
+       "authmanager-authplugin-setpass-failed-title": "Kunde inte ändra lösenordet",
+       "authmanager-authplugin-setpass-bad-domain": "Ogiltig domän.",
+       "authmanager-autocreate-noperm": "Det är inte tillåtet att skapa konton automatiskt.",
+       "authmanager-autocreate-exception": "P.g.a. tidigare fel har automatiskt skapande av konton inaktiverats.",
+       "authmanager-userdoesnotexist": "Användarkontot \"$1\" är inte registrerat.",
+       "authmanager-username-help": "Användarnamn för autentisering.",
+       "authmanager-password-help": "Lösenord för autentisering.",
+       "authmanager-domain-help": "Domän för extern autentisering.",
+       "authmanager-retype-help": "Lösenord igen för att bekräfta.",
+       "authmanager-email-label": "E-post",
+       "authmanager-email-help": "E-postadress",
+       "authmanager-realname-label": "Riktigt namn",
+       "authmanager-realname-help": "Användarens riktiga namnet",
+       "authmanager-provider-password": "Lösenordsbaserad autentisering",
+       "authmanager-provider-password-domain": "Lösenord- och domänbaserad autentisering",
+       "authmanager-provider-temporarypassword": "Tillfälligt lösenord",
+       "authprovider-confirmlink-message": "Baserat på dina nyliga inloggningsförsök kan följande konton länkas till ditt wikikonto. Om dessa konton länkas kan du logga in via dem. Välj vilka som bör länkas.",
+       "authprovider-confirmlink-request-label": "Konton som bör vara länkade",
+       "authprovider-confirmlink-success-line": "$1: Länkning genomförd.",
+       "authprovider-confirmlink-failed": "Konto kunde inte länkas helt och hållet: $1",
+       "authprovider-resetpass-skip-label": "Hoppa över",
+       "authprovider-resetpass-skip-help": "Hoppa över återställningen av lösenord.",
+       "authform-nosession-login": "Autentiseringen lyckades, men din webbläsare kan inte \"komma ihåg\" att du är inloggad.\n\n$1",
+       "authform-nosession-signup": "Kontot skapades, men din webbläsare kan inte \"komma ihåg\" att du är inloggad.\n\n$1",
+       "specialpage-securitylevel-not-allowed-title": "Inte tillåtet",
+       "specialpage-securitylevel-not-allowed": "Tyvärr, du har inte tillåtelse att använda denna sida eftersom din identitet inte kunde verifieras.",
+       "cannotauth-not-allowed-title": "Tillgång nekad",
+       "cannotauth-not-allowed": "Du har inte behörighet att använda denna sida",
+       "changecredentials": "Ändra inloggningsuppgifter",
+       "changecredentials-submit": "Ändra",
+       "changecredentials-submit-cancel": "Avbryt",
+       "changecredentials-invalidsubpage": "$1 är inte en giltig typ av inloggningsuppgift.",
+       "changecredentials-success": "Dina inloggningsuppgifter har ändrats.",
+       "removecredentials": "Ta bort inloggningsuppgifter",
+       "removecredentials-submit": "Ta bort",
+       "removecredentials-submit-cancel": "Avbryt",
+       "removecredentials-invalidsubpage": "$1 är inte en giltig typ av inloggningsuppgift.",
+       "removecredentials-success": "Dina inloggningsuppgifter har tagits bort.",
+       "credentialsform-provider": "Typ av inloggningsuppgifter:",
+       "credentialsform-account": "Kontonamn:",
+       "cannotlink-no-provider-title": "Det finns inga konton som kan länkas",
+       "cannotlink-no-provider": "Det finns inga konton som kan länkas.",
+       "linkaccounts": "Länka konton",
+       "linkaccounts-success-text": "Kontot länkades.",
+       "linkaccounts-submit": "Länka konton",
+       "unlinkaccounts": "Avlänka konton",
+       "unlinkaccounts-success": "Kontot avlänkades."
 }
index 0a71f3f..50b7f59 100644 (file)
        "unprotectthispage": "ಈ ಪುಟೊತ ರಕ್ಷಣೆನ್ ಬದಲ್‍ಪುಲೆ",
        "newpage": "ಪೊಸ ಪುಟೊ",
        "talkpage": "ಪುಟದ ಬಗ್ಗೆ ಚರ್ಚೆ ಮನ್ಪುಲೆ",
-       "talkpagelinktext": "ಪಾತೆರ್ಲೆ",
+       "talkpagelinktext": "ಪಾತೆರ",
        "specialpage": "ವಿಶೇಷ ಪುಟ",
        "personaltools": "ಸ್ವಂತೊ ಉಪಕರಣೊಲು",
        "articlepage": "ಲೇಖನ ಪುಟೊನು ತೂಲೆ",
        "copyright": "ವಿಸೇಸವಾದ್ ಪಂಡ್‍ಜಂಡ ಉಂದು \"$1\" ಈ ಕಾಪಿರೈಟ್‌ಡ್ ಲಭ್ಯವುಂಡು.",
        "copyrightpage": "{{ns:project}}:ಕೃತಿ ಸ್ವಾಮ್ಯತೆಲು",
        "currentevents": "ಇತ್ತೆದ ಸಂಗತಿಲು",
-       "currentevents-url": "Project:ಇತ್ತೆದ ಸಂಗತಿಲು",
+       "currentevents-url": "ಯೋಜನೆ:ಇತ್ತೆದ ಸಂಗತಿಲು",
        "disclaimers": "ಹಕ್ಕ್‌ ಬುಡ್‍ನ",
        "disclaimerpage": "Project:ಸಾಮಾನ್ಯೊ ಹಕ್ಕ್‌ ಬುಡ್‌ನ",
        "edithelp": "ಸಂಪಾದನೆಗ್ ಸಹಾಯೊ",
        "mainpage-description": "ಮುಖ್ಯ ಪುಟ",
        "policy-url": "Project:ನಿಯಮಾವಳಿ",
        "portal": "ಸಮುದಾಯೊ ಪುಟೊ",
-       "portal-url": "Project:ಸಮುದಾಯೊ ಪುಟೊ",
+       "portal-url": "ಯೋಜನೆ:ಸಮುದಾಯೊ ಪುಟೊ",
        "privacy": "ಕಾಸಗಿ ಕಾರ್ಯೊನೀತಿ",
        "privacypage": "Project:ಕಾಸಗಿ ಕಾರ್ಯೊನೀತಿ",
        "badaccess": "ಅನುಮತಿ ದೋಷ",
        "page-atom-feed": "\"$1\" ಪುಟೊತ Atom ಫೀಡ್",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
-       "red-link-title": "$1 (à²\88 à²ªà³\81à²\9fà³\8a à²¨à²¨à²² à²\85ಸà³\8dತಿತà³\8dವà³\8aಡà³\8d à²\87ದà³\8dದಿ)",
+       "red-link-title": "$1 (à²\88 à²ªà³\81à²\9fà³\8a à²¨à²¨à²² à²\85ಸà³\8dತಿತà³\8dವà³\8aಡà³\8d à²\87à²\9cà³\8dà²\9cಿ)",
        "sort-descending": "ಇಳಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ",
        "sort-ascending": "ಏರಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ",
        "nstab-main": "ಪುಟೊ",
        "loginlanguagelabel": "ಬಾಸೆ: $1",
        "pt-login": "ಲಾಗ್ ಇನ್",
        "pt-login-button": "ಲಾಗಿನ್ ಆಲೆ",
-       "pt-createaccount": "ಪà³\8aಸ à²\95ಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+       "pt-createaccount": "ಪà³\8aಸ à²\96ಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "pt-userlogout": "ಲಾಗ್ ಔಟ್",
        "changepassword": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass_header": "ಈ ಖಾತೆದ ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್‌ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
        "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"<nowiki>$1</nowiki>\" ದಾಖಲಾತ್‘ಜ್ಜಿ. ಈರ್ ಉಂದುವೇ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪರ ಉಂಡಾಂದ್ ಖಾತ್ರಿ ಮಲ್ತೊನಿ.",
        "previewnote": "'''ಉಂದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟೊನು ನನಲ ಒರಿಪಾದಿಜಿ ಪನ್ಪುನೇನ್ ಮರಪೊರ್ಚಿ!'''",
-       "editing": "$1 ಲೇಕನೊನು ಈರ್ ಸಂಪದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
+       "editing": "$1 à²²à³\87à²\95ನà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪಾದನà³\86 à²®à²²à³\8dತà³\8aà²\82ದà³\81ಲà³\8dಲರà³\8d",
        "creating": "$1 ನ್ನು ಸ್ರಿಸ್ಟಿಸವೊಂದುಂಡು",
        "editingsection": "$1(ವಿಬಾಗೊನು) ಸಂಪದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
        "yourtext": "ಇರೆನ ಸಂಪಾದನೆ",
        "upload-disallowed-here": "ಈರ್ ಈ ಫೈಲ್‍ನ್ ಕುಡೊರೊ ಬರೆವರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
        "filedelete-comment": "ಕಾರಣ",
        "filedelete-submit": "ಮಾಜಾಲೆ",
-       "randompage": "à²\87à²\9aà³\8dà²\9aà³\86ದ ಪುಟೊ",
+       "randompage": "ಯಾದà³\83à²\9aà³\8dà²\9bಿà²\95 ಪುಟೊ",
        "statistics": "ಅಂಕಿ ಅಂಶೊಲು",
        "statistics-header-pages": "ಪುಟೊತ ಅಂಕಿ ಅಂಶಲು",
        "nbytes": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}",
        "whatlinkshere-prev": "{{PLURAL:$1|ದುಂಬುದ|ದುಂಬುದ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|ಬೊಕ್ಕದ|ಬೊಕ್ಕದ $1}}",
        "whatlinkshere-links": "← ಕೊಂಡಿಲು",
-       "whatlinkshere-hideredirs": "$1 ಪಿರ ನಿರ್ದೇಶನೊಲು",
-       "whatlinkshere-hidetrans": "$1 à²¸à³\87ರಾವà³\81ನà³\86",
-       "whatlinkshere-hidelinks": "$1 ಕೊಂಡಿಲು",
+       "whatlinkshere-hideredirs": "$1 ಪಿರನಿರ್ದೇಶನೊಲು",
+       "whatlinkshere-hidetrans": "$1 à²¸à³\87ರಾವà³\81ನವà³\81",
+       "whatlinkshere-hidelinks": "$1 à²\95à³\8aà²\82ಡಿà²\95à³\81ಲà³\81",
        "whatlinkshere-filters": "ಅರಿಪೆಲು",
        "blockip": "ಈ ಸದಸ್ಯೆರೆನ್ ಬ್ಲಾಕ್ ಮಲ್ಪುಲೆ",
        "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",
        "tooltip-t-contributions": "{{GENDER:$1|ಈ ಬಳಕೆದಾರೆರ್}}ಈ ಸದಸ್ಯೆರ್ನ ಕಾಣಿಕೆದ ಪಟ್ಟಿನ್ ತೋಜಾವು",
        "tooltip-t-emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೇಲ್ ಕಡಪುಡ್ಲೆ",
        "tooltip-t-upload": "ಫೈಲನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
-       "tooltip-t-specialpages": "ಪೂರ ಪುಟೊಲೆನ ವಿಸೇಸೊ ಪಟ್ಟಿ",
+       "tooltip-t-specialpages": "ಪೂರ  ವಿಸೇಸೊ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
        "tooltip-t-print": "ಈ ಪುಟೊದ ಮುದ್ರಣೊ ಮಲ್ಪುನ ಆವೃತ್ತಿ",
        "tooltip-t-permalink": "ಪುಟೊದ ಈ ಆವೃತ್ತಿಗ್ ಸಾಸಿತೊ ಕೊಂಡಿ",
        "tooltip-ca-nstab-main": "ಮಾಹಿತಿ ಪುಟೊನ್ ತೂಲೆ",
index 2070932..5c695df 100644 (file)
@@ -23,7 +23,8 @@
                        "아라",
                        "Pphongpan355",
                        "Macofe",
-                       "Pilarbini"
+                       "Pilarbini",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "การขีดเส้นใต้ลิงก์:",
        "whatlinkshere-prev": "{{PLURAL:$1|ก่อนหน้า|ก่อนหน้า $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|ถัดไป|ถัดไป $1}}",
        "whatlinkshere-links": "← ลิงก์",
-       "whatlinkshere-hideredirs": "ซ่อนการเปลี่ยนทาง",
-       "whatlinkshere-hidetrans": "Hide transclusions",
-       "whatlinkshere-hidelinks": "ซ่อนลิงก์",
-       "whatlinkshere-hideimages": "ซ่อนลิงก์ไฟล์",
+       "whatlinkshere-hideredirs": "$1การเปลี่ยนทาง",
+       "whatlinkshere-hidetrans": "$1 ถูกรวมอยู่",
+       "whatlinkshere-hidelinks": "$1 ลิงก์",
+       "whatlinkshere-hideimages": "$1ลิงก์ไฟล์",
        "whatlinkshere-filters": "ตัวกรอง",
        "whatlinkshere-submit": "ไป",
        "autoblockid": "บล็อกอัตโนมัติ #$1",
index 16f13b9..76c0a1d 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|önceki|önceki $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|sonraki|sonraki $1}}",
        "whatlinkshere-links": "← bağlantılar",
-       "whatlinkshere-hideredirs": "Yönlendirmeleri gizle",
-       "whatlinkshere-hidetrans": "Dönüştürmeleri gizle",
-       "whatlinkshere-hidelinks": "Bağlantıları gizle",
+       "whatlinkshere-hideredirs": "Yönlendirmeleri $1",
+       "whatlinkshere-hidetrans": "Dönüştürmeleri $1",
+       "whatlinkshere-hidelinks": "Bağlantıları $1",
        "whatlinkshere-hideimages": "Dosya bağlantılarını $1",
        "whatlinkshere-filters": "Süzgeçler",
        "autoblockid": "Otomatik engelleme #$1",
index cee7a0d..e6771bf 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|1=алдагы}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|1=киләсе}} $1",
        "whatlinkshere-links": "← сылтамалар",
-       "whatlinkshere-hideredirs": "Юнәлтүләрне яшер",
-       "whatlinkshere-hidetrans": "Кертүләрне яшер",
-       "whatlinkshere-hidelinks": "Сылтамаларны яшер",
-       "whatlinkshere-hideimages": "Файл сылтамаларын яшер",
+       "whatlinkshere-hideredirs": "Юнәлтүләрне $1",
+       "whatlinkshere-hidetrans": "Кертүләрне $1",
+       "whatlinkshere-hidelinks": "Сылтамаларны $1",
+       "whatlinkshere-hideimages": "$1 файл сылтамалары",
        "whatlinkshere-filters": "Фильтрлар",
        "whatlinkshere-submit": "Башкару",
        "autoblockid": "Автотыю #$1",
index 3e57c4e..c8964aa 100644 (file)
        "rcnotefrom": "Alemba oma anttud toižetused '''$2'''-späi ( '''$1'''-hesai).",
        "rclistfrom": "Ozutada uded toižetused dataspäi $3 $2 augotaden",
        "rcshowhideminor": "$1 pened redakcijad",
+       "rcshowhideminor-show": "Ozutada",
        "rcshowhideminor-hide": "Peitta",
        "rcshowhidebots": "$1 botad",
        "rcshowhidebots-show": "Ozutada",
+       "rcshowhidebots-hide": "Peitta",
        "rcshowhideliu": "$1 sistemha kirjutadud kävutajad",
        "rcshowhideliu-hide": "Peitta",
        "rcshowhideanons": "$1 anonimišt kävutajad",
        "rcshowhideanons-hide": "Peitta",
        "rcshowhidepatr": "$1 kodvdud toižetust",
        "rcshowhidemine": "$1 ičein redakcijad",
+       "rcshowhidemine-show": "Ozutada",
        "rcshowhidemine-hide": "Peitta",
        "rclinks": "Ozutada jäl'gmäižed $1 toižetust $2 päiväs<br />$3",
        "diff": "erod",
        "booksources": "Kirjpurtked",
        "booksources-search-legend": "Ectä kirjpurtkid",
        "booksources-isbn": "ISBN:",
+       "booksources-search": "Ectä",
        "booksources-text": "Naku om kosketusid saitoile, kudambil mödas uzid da kuluid kirjoid. Niilpäi voib löuta ližainformacijad ectud kirjoiš:",
        "booksources-invalid-isbn": "Nece ISBN, näguse, om vär; Kodvgat, oikti-k oled kopiruinuded sidä originaližes purtkespäi.",
        "specialloguserlabel": "Kävutai:",
index 67005f6..65cae9d 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|kết quả trước|$1 kết quả trước}}",
        "whatlinkshere-next": "{{PLURAL:$1|kết quả sau|$1 kết quả sau}}",
        "whatlinkshere-links": "← liên kết",
-       "whatlinkshere-hideredirs": "Ẩn trang đổi hướng",
+       "whatlinkshere-hideredirs": "$1 trang đổi hướng",
        "whatlinkshere-hidetrans": "$1 trang nhúng",
-       "whatlinkshere-hidelinks": "Ẩn liên kết",
-       "whatlinkshere-hideimages": "Ẩn liên kết tập tin",
+       "whatlinkshere-hidelinks": "$1 liên kết",
+       "whatlinkshere-hideimages": "$1 liên kết tập tin",
        "whatlinkshere-filters": "Bộ lọc",
        "whatlinkshere-submit": "Xem",
        "autoblockid": "Cấm tự động #$1",
index f563ad9..6a3f2cd 100644 (file)
@@ -10,7 +10,8 @@
                        "Kolega2357",
                        "아라",
                        "MarcoAurelio",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Bagisa ha ilarom an mga sumpay:",
        "whatlinkshere-prev": "{{PLURAL:$1|nahiuna|nahiuna $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|masunod|masunod $1}}",
        "whatlinkshere-links": "← mga sumpay",
-       "whatlinkshere-hideredirs": "Igtago an mga redirect",
-       "whatlinkshere-hidetrans": "Igtago an mga tranclusion",
-       "whatlinkshere-hidelinks": "Igtago an mga sumpay",
-       "whatlinkshere-hideimages": "Igtago an mga sumpay han file",
+       "whatlinkshere-hideredirs": "$1 nga mga redirek",
+       "whatlinkshere-hidetrans": "$1 nga mga transklusyon",
+       "whatlinkshere-hidelinks": "$1 an mga sumpay",
+       "whatlinkshere-hideimages": "$1 an mga sumpay han paypay",
        "whatlinkshere-filters": "Mga panara",
        "whatlinkshere-submit": "Kadto-a",
        "block": "Pugngi an gumaramit",
index 3064aa8..01d980f 100644 (file)
        "accmailtext": "已经为[[User talk:$1|$1]]产生只随机密码,并且已经发送到$2。登录之后,侬可以垃拉<em>[[Special:ChangePassword|箇只页面]]</em>更改密码。",
        "newarticle": "(新)",
        "newarticletext": "倷跟著链接来着一个还弗勒里个页面。要创建该页面呢,就勒下底个框里向开始写([$1 帮助页面]浪有更加多个信息)。要是倷是弗用心到该𡍲个说话,请点击浏览器个<strong>返回</strong>揿钮。",
-       "anontalkpagetext": "---- ''箇是一个还弗曾建立账户个匿名用户个讨论页, 箇咾我伲只好用IP地址来搭渠联络。该IP地址可能由几名用户共享。如果侬是一名匿名用户并认为箇只页面高头个评语搭侬弗搭界,请 [[Special:CreateAccount|创建新账户]]或[[Special:UserLogin|登录]]来避免垃拉将来搭其他匿名用户混淆。''",
+       "anontalkpagetext": "----\n<em>箇是一位还弗曾建立账号或者呒不使用账号个匿名用户个讨论页。</em>箇咾我伲只好用数字IP地址来识别渠。该IP地址可能由几名用户共享。如果侬是一名匿名用户并认为箇只页面高头个评语搭侬弗搭界,请[[Special:CreateAccount|创建只账号]]或[[Special:UserLogin|登录]]来避免垃拉将来搭其他匿名用户混淆。",
        "noarticletext": "箇只页面目前呒没文本。侬可以垃拉其他页面高头[[Special:Search/{{PAGENAME}}|寻该只标题]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 寻相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此页]</span>。",
        "noarticletext-nopermission": "箇只页面目前呒不文本。侬可以垃拉其他页面高头[[Special:Search/{{PAGENAME}}|寻箇页标题]],或者<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 寻相关日志]</span>,但必过侬呒不权限建立箇只页面。",
        "userpage-userdoesnotexist": "用户账户“<nowiki>$1</nowiki>”弗曾创建。请垃拉创建/编辑迭个页面前头先检查一记。",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已经畀查封。<br />\n参看[[Special:BlockList|查封列表]]来复审查封。",
        "ipblocklist": "封脱个用户",
        "infiniteblock": "永远",
+       "blocklist-nousertalk": "弗准编辑自家个讨论页",
        "blocklink": "封禁",
        "unblocklink": "解封",
        "change-blocklink": "改变封禁",
        "blocklogtext": "该个是用户查封搭著解封操作个记录。自动查封个IP地址弗会列勒该𡍲。到[[Special:BlockList|封禁列表]]去看当前生效个查封。",
        "unblocklogentry": "$1已经拨解封",
        "block-log-flags-nocreate": "建账号禁用哉",
+       "block-log-flags-nousertalk": "弗准编辑自家个讨论页",
        "lockdb": "鎖數據庫",
        "unlockdb": "開鎖數據庫",
        "lockbtn": "鎖數據庫",
index 6ea0b36..f227aaa 100644 (file)
        "nstab-template": "თანგი",
        "nstab-help": "დახმარება",
        "nstab-category": "კატეგორია",
+       "mainpage-nstab": "დუდხასჷლა",
        "nosuchaction": "მოქმედება არ არსებობს",
        "nosuchactiontext": "URL-ის მიერ მითითებული მოქმედება მცდარია.\nშესაძლოა შეცდომით აკრიფეთ URL, ან არასწორ ბმულზე გადახვედით.\nაგრეთვე შესაძლოა, {{SITENAME}}-ს მიერ გამოყენებულ პროგრამულ უზრუნველყოფაში იყოს შეცდომა.",
        "nosuchspecialpage": "თეჯგუა გჷშაკერძაფილი ხასჷლეფი ვარსებენს",
        "newarticle": "(ახალ)",
        "newarticletext": "თქვა გეჸუნელჷ რეთ ხასჷლაშ რცხის, ნამუთ დიო ვა რე დორცხუაფილი.\nხასჷლაშ დარცხუაფალო გემშეჸონით ტექსტი თუდონ ოჭკორიეშა. (ქოძირით[$1 მოხვარაშ ხასჷლა] უმოს ინფორმაციაშო).\nთე ხასჷლას ჩილათირო მოხვადით–და, ქიგუნჭირით თქვან ბრაუზერიშ კონჭის '''უკახალე'''.\"",
        "anontalkpagetext": "----\n<em>ეს არის ანონიმური მომხმარებლის განხილვის გვერდი, რომელსაც ანგარიში ჯერ არ შეუქმნია ან არ იყენებს მას.</em>\n\nშესაბამისად, ჩვენ მისი ციფრული IP მისამართი უნდა გამოვიყენოთ მისი იდენტიფიცირებისთვის.\n\nამგვარი მისამართი შეიძლება რამდენიმე მომხმარებელმა გამოიყენოს.\n\nთუ თქვენ ანონიმური მომხმარებელი ხართ და თვლით, რომ სხვისთვის გამიზნული მითითება მიიღეთ, გთხოვთ [[Special:CreateAccount|შექმენით ანგარიში ან დარეგისტრირდით]] მომავალში გაუგებრობის თავიდან ასაცილებლად.",
-       "noarticletext": "á\83\90á\83¡á\83\94 á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¡ á\83¢á\83\94á\83¥á\83¡á\83¢á\83\98 á\83\95á\83\90 á\83 á\83\94. \ná\83\97á\83¥á\83\95á\83\90 á\83¨á\83\94á\83\98á\83\9aá\83\94á\83\91á\83£á\83\9cá\83\90 [[Special:Search/{{PAGENAME}}|á\83\92á\83\9dá\83 á\83\90á\83\97 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83¯á\83\9dá\83®á\83\9d]] á\83¨á\83®á\83\95á\83\90 á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83¡,\n<span class=\\\"plainlinks\\\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} á\83\93á\83\9dá\83\92á\83\9dá\83 á\83\90á\83\97 á\83\9bá\83\94á\83®á\83£á\83¯á\83\90á\83¤á\83\98á\83\9a á\83\9fá\83£á\83 á\83\9cá\83\90á\83\9aá\83\94á\83¤á\83\98],\ná\83\95á\83\90á\83 á\83\90 [{{fullurl:{{FULLPAGENAME}}|action=edit}} á\83\93á\83\98á\83­á\83§á\83\90á\83\97 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\90á\83¤ა]</span>.",
+       "noarticletext": "á\83\90á\83¡á\83\94 á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¡ á\83¢á\83\94á\83¥á\83¡á\83¢á\83\98 á\83\95á\83\90 á\83 á\83\94. \ná\83\97á\83¥á\83\95á\83\90 á\83¨á\83\94á\83\98á\83\9aá\83\94á\83\91á\83£á\83\9cá\83\90 [[Special:Search/{{PAGENAME}}|á\83\92á\83\9dá\83 á\83\90á\83\97 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83¯á\83\9dá\83®á\83\9d]] á\83¨á\83®á\83\95á\83\90 á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83¡,\n<span class=\\\"plainlinks\\\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} á\83\93á\83\9dá\83\92á\83\9dá\83 á\83\90á\83\97 á\83\9bá\83\94á\83®á\83£á\83¯á\83\90á\83¤á\83\98á\83\9a á\83\9fá\83£á\83 á\83\9cá\83\90á\83\9aá\83\94á\83¤á\83\98],\ná\83\95á\83\90á\83 á\83\90 [{{fullurl:{{FULLPAGENAME}}|action=edit}} á\83\93á\83\98á\83­á\83§á\83\90á\83\97 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83\90á\83\99á\83\9dá\83¥á\83\98á\83\9bá\83\98á\83\9cá\83£ა]</span>.",
        "noarticletext-nopermission": "ათე ხასჷლას ასე ტექსტი ვა რე. თქვა შეილებუნა [[Special:Search/{{PAGENAME}}|დოგორათ თე ხასჷლაშ დუდჯოხო]] შხვა ხასჷლეფს,\nვარდა <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} დოგორათ გინორცხილ ჟურნალეფი]</span>.",
        "missing-revision": "ვერსია $1 გვერდისათვის „{{FULLPAGENAME}}“ არ არსებობს.\n\nეს ჩვეულებრივ ხდება მაშინ, თუ მოძველებული ბმულით გადადიხართ გვერდზე, რომელიც წაიშალა.\nდეტალური ინფორმაცია შესაძლებელია იყოს [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} წაშლების ჟურნალში].",
        "userpage-userdoesnotexist": "მახვარებუშ ანგარიში „$1“ ვაარსებენს. დერწმუნით, ნამჷ-და დასურო გოკონა თე ანგარიშიშ დორსხუაფა ვარდა მიშათინუა.",
        "contributions": "{{GENDER:$1|მახვარებუშ}} მიშნაღელ თია",
        "contributions-title": "$1-შა მახვარებუშ მიშაღალირ თია",
        "mycontris": "ჩქიმ მიშნაღელ თია",
+       "anoncontribs": "მიშნაღელი თიეფი",
        "contribsub2": "$1 ($2) შენი",
        "uctop": "(დუდ)",
        "month": "ათე თუთაშე (დო უადრაშე):",
        "whatlinkshere-next": "{{PLURAL:$1|უკულიან|უკულიან $1}}",
        "whatlinkshere-links": "← რცხიეფ",
        "whatlinkshere-hideredirs": "გინოწურაფა $1",
-       "whatlinkshere-hidetrans": "$1 ტრანსკლუზიეფ",
-       "whatlinkshere-hidelinks": "$1 რცხუეფ",
+       "whatlinkshere-hidetrans": "$1 ტრანსკლუზიეფ",
+       "whatlinkshere-hidelinks": "$1 რცხუეფ",
        "whatlinkshere-hideimages": "$1 ფაილიშ რცხუეფი",
        "whatlinkshere-filters": "ტკიბირეფი",
        "autoblockid": "ავტომატური ბლოკირება #$1",
        "import-upload-filename": "ფაილის სახელი:",
        "import-comment": "კომენტარეფი:",
        "importlogpage": "იმპორტიშ ჟურნალ",
-       "tooltip-pt-userpage": "თქვანი მახვარებუშ ხასჷლა",
-       "tooltip-pt-mytalk": "თქვან სხუნუაშ ხასჷლა",
-       "tooltip-pt-preferences": "ჩქიმ კონფიგურაციეფი",
+       "tooltip-pt-userpage": "{{GENDER:|თქვანი მახვარებუშ}} ხასჷლა",
+       "tooltip-pt-mytalk": "{{GENDER:|თქვანი}} სხუნუაშ ხასჷლა",
+       "tooltip-pt-preferences": "{{GENDER:|თქვანი}} კონფიგურაცია",
        "tooltip-pt-watchlist": "ხასჷლეფიშ ერკებულ, ნამუშ მონიტორინგის ორთუთ თირაფაშ ღანკით",
-       "tooltip-pt-mycontris": "თქვან მიშნაღელ თიეფიშ ერკებულ",
+       "tooltip-pt-mycontris": "{{GENDER:|თქვანი}} მიშნაღელი თიაშ ერკებული",
        "tooltip-pt-login": "ჯგირ იჸი გემშურთუ–და, მარა თენა ვა რე უციო",
        "tooltip-pt-logout": "გიშულა",
        "tooltip-pt-createaccount": "ჩქი გიზალუთ, გონწყათ ანგარიში დო გენშართათ სისტემაშა; მარა თენა ვა რე უციო",
        "tooltip-t-permalink": "პერმანენტულ რცხი ხასილაშ თე ვერსიაშა",
        "tooltip-ca-nstab-main": "დინორეშ ხასჷლაშ ძირაფა",
        "tooltip-ca-nstab-user": "მახვარებუშ ხასჷლაშ ძირაფა",
-       "tooltip-ca-nstab-special": "თქვა ასე რეთ სპეციალურ ხასჷლას, თქვა ვა შეილებუნა ათე ხასჷლაშ რედაქტირაფა",
+       "tooltip-ca-nstab-special": "თქვა ასე რეთ სპეციალურ ხასჷლას დო თქვა შეილებუნა თიშ რედაქტირაფა",
        "tooltip-ca-nstab-project": "პროექტიშ ხასჷლაშ ძირაფა",
        "tooltip-ca-nstab-image": "ფაილიშ ხასჷლაშ ძირაფა",
        "tooltip-ca-nstab-template": "თანგიშ ძირაფა",
index 12e1da8..1b9fbf3 100644 (file)
@@ -89,7 +89,8 @@
                        "Nbdd0121",
                        "Apflu",
                        "飞舞回堂前",
-                       "Cosine02"
+                       "Cosine02",
+                       "Arthur2e5"
                ]
        },
        "tog-underline": "链接下划线:",
        "password-change-forbidden": "您不能在本wiki上更改密码。",
        "externaldberror": "验证数据库出错或您被禁止更新您的外部账号。",
        "login": "登录",
+       "login-security": "证明您的身份",
        "nav-login-createaccount": "登录/创建账户",
        "userlogin": "登录/创建账户",
        "userloginnocreate": "登录",
        "userlogin-resetpassword-link": "忘记密码?",
        "userlogin-helplink2": "登录帮助",
        "userlogin-loggedin": "您已经以{{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": "真实姓名(可选)",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您为什么要创建另一个账户",
+       "createacct-reason-help": "在账户创建日志中显示的消息",
        "createacct-submit": "创建您的账户",
        "createacct-another-submit": "创建账户",
-       "createacct-benefit-heading": "{{SITENAME}}是由同你一样的人们构筑的。",
+       "createacct-continue-submit": "继续账户创建",
+       "createacct-another-continue-submit": "继续账户创建",
+       "createacct-benefit-heading": "{{SITENAME}}是由像您一样的人们构筑的。",
        "createacct-benefit-body1": "{{PLURAL:$1|编辑}}",
        "createacct-benefit-body2": "{{PLURAL:$1|页面}}",
        "createacct-benefit-body3": "最近{{PLURAL:$1|贡献者}}",
        "nocookiesnew": "该用户帐户已被创建,但登录失败。{{SITENAME}}使用Cookie实现用户登录。您已禁用Cookie,请启用Cookie,然后使用您的新用户名与密码登录。",
        "nocookieslogin": "{{SITENAME}}使用Cookie实现用户登录。您已停用Cookie。请启用Cookie后再试。",
        "nocookiesfornew": "该用户账户未被创建,我们不能确认它的来源。请确保你已启用Cookie,刷新本页后再试。",
+       "createacct-loginerror": "账户已成功创建,但您不能自动登录。请继续[[Special:UserLogin|手动登录]]。",
        "noname": "未指定有效的用户名。",
        "loginsuccesstitle": "已登录",
        "loginsuccess": "<strong>您现在已经以\"$1\"的身份登录了{{SITENAME}}。</strong>",
-       "nosuchuser": "没有名为“$1”的用户。用户名区分大小写。请检查的拼写或[[Special:CreateAccount|创建新账户]]。",
+       "nosuchuser": "没有名为“$1”的用户。用户名区分大小写。请检查的拼写或[[Special:CreateAccount|创建新账户]]。",
        "nosuchusershort": "没有名为“$1”的用户。请检查您的拼写。",
        "nouserspecified": "您必须指定一个用户名。",
        "login-userblocked": "该用户已被封禁,禁止登录。",
        "createacct-another-realname-tip": "真实姓名是选填项目。\n如果你选择提供它,它将会用于贡献署名。",
        "pt-login": "登录",
        "pt-login-button": "登录",
+       "pt-login-continue-button": "继续登录",
        "pt-createaccount": "创建账户",
        "pt-userlogout": "退出",
        "php-mail-error-unknown": "在 PHP 的 mail() 函数中的未知错误",
        "botpasswords-invalid-name": "指定的用户名不包含机器人密码分隔符(“$1”)。",
        "botpasswords-not-exist": "用户“$1”没有名叫“$2”的机器人密码。",
        "resetpass_forbidden": "无法更改密码",
+       "resetpass_forbidden-reason": "密码不能更改:$1",
        "resetpass-no-info": "您必须登录后直接进入这个页面。",
        "resetpass-submit-loggedin": "更改密码",
        "resetpass-submit-cancel": "取消",
        "passwordreset-emailsentusername": "如果有邮件地址与此用户名相关联的话,将发送一封密码重置邮件。",
        "passwordreset-emailsent-capture": "密码重设电子邮件已发送,并在下面显示。",
        "passwordreset-emailerror-capture": "重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1",
+       "passwordreset-emailsent-capture2": "密码重置{{PLURAL:$1|邮件}}已发送。{{PLURAL:$1|用户名和密码|用户名和密码列表}}在下方显示。",
+       "passwordreset-emailerror-capture2": "向{{GENDER:$2|用户}}发送电子邮件失败:$1 {{PLURAL:$3|用户名和密码|用户名和密码列表}}在下方显示。",
+       "passwordreset-nocaller": "必须提供一个调用方",
+       "passwordreset-nosuchcaller": "调用方不存在:$1",
+       "passwordreset-ignored": "密码重置没有处理。也许没有配置提供者?",
+       "passwordreset-invalideamil": "无效的电子邮件地址",
+       "passwordreset-nodata": "用户名和电子邮件地址均未提供",
        "changeemail": "更改或移除电子邮件地址",
        "changeemail-header": "完成此表格以更改您的电子邮件地址。如果您希望从您的账户中移除任何关联的电子邮件地址,请在提交表格时将新电子邮件地址留空。",
        "changeemail-passwordrequired": "您需要输入您的密码以确认此次更改。",
        "userpage-userdoesnotexist": "用户账户“$1”没有注册。请在创建/编辑本页前检查。",
        "userpage-userdoesnotexist-view": "用户账户“$1”没有被注册。",
        "blocked-notice-logextract": "这位用户目前已被封禁。以下提供最近的封禁日志以供参考:",
-       "clearyourcache": "<strong>注意:</strong>在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* <strong>Firefox或Safari:</strong>按住<em>Shift</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>或<em>Ctrl-R</em>(Mac为<em>⌘-R</em>)\n* <strong>Google Chrome:</strong>按<em>Ctrl-Shift-R</em>(Mac为<em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong>按住<em>Ctrl</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>\n* <strong>Opera:</strong>前往<em>菜单 → 设置</em>(Mac为<em>Opera → Preferences</em>),然后em>隐私和安全 → 清除浏览数据 → 缓存的图片和文件</em>。",
+       "clearyourcache": "<strong>注意:</strong>在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* <strong>Firefox或Safari:</strong>按住<em>Shift</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>或<em>Ctrl-R</em>(Mac为<em>⌘-R</em>)\n* <strong>Google Chrome:</strong>按<em>Ctrl-Shift-R</em>(Mac为<em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong>按住<em>Ctrl</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>\n* <strong>Opera:</strong>前往<em>菜单 → 设置</em>(Mac为<em>Opera → Preferences</em>),然后<em>隐私和安全 → 清除浏览数据 → 缓存的图片和文件</em>。",
        "usercssyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
        "userjsyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
        "usercsspreview": "<strong>请记住您现在只是在预览你的用户CSS。它尚未保存!</strong>",
        "rows": "行数:",
        "columns": "列数:",
        "searchresultshead": "搜索",
-       "stub-threshold": "链接格式阈值($1):",
+       "stub-threshold": "小作品链接格式阈值($1):",
        "stub-threshold-sample-link": "样例",
        "stub-threshold-disabled": "停用",
        "recentchangesdays": "最近更改中显示的天数:",
        "whatlinkshere-prev": "{{PLURAL:$1|前|前$1个}}",
        "whatlinkshere-next": "{{PLURAL:$1|后|后$1个}}",
        "whatlinkshere-links": "←链接",
-       "whatlinkshere-hideredirs": "隐藏重定向",
-       "whatlinkshere-hidetrans": "隐藏嵌入",
-       "whatlinkshere-hidelinks": "隐藏链接",
-       "whatlinkshere-hideimages": "隐藏文件链接",
+       "whatlinkshere-hideredirs": "$1重定向",
+       "whatlinkshere-hidetrans": "$1嵌入",
+       "whatlinkshere-hidelinks": "$1链接",
+       "whatlinkshere-hideimages": "$1文件链接",
        "whatlinkshere-filters": "过滤器",
        "whatlinkshere-submit": "提交",
        "autoblockid": "自动封禁#$1",
        "log-action-filter-suppress-block": "通过封禁的用户屏蔽",
        "log-action-filter-suppress-reblock": "通过再封禁的用户屏蔽",
        "log-action-filter-upload-upload": "新上传",
-       "log-action-filter-upload-overwrite": "重新上传"
+       "log-action-filter-upload-overwrite": "重新上传",
+       "authmanager-authn-not-in-progress": "身份验证尚未进行,或会话数据丢失。请从头重新开始。",
+       "authmanager-authn-no-primary": "提供的证书不能被验证。",
+       "authmanager-authn-no-local-user": "提供的证书没有与该wiki上的任何用户相关联。",
+       "authmanager-authn-no-local-user-link": "提供的证书有效,但没有与该wiki上的任何用户相关联。请通过不同方式登录,或创建一个新用户,然后您将拥有一个把您之前的证书链接到对应账户的选项。",
+       "authmanager-authn-autocreate-failed": "所有账户的自动创建失败:$1",
+       "authmanager-change-not-supported": "提供的证书不能被更改,因为没有东西会使用它们。",
+       "authmanager-create-disabled": "账户创建已停用。",
+       "authmanager-create-from-login": "要创建您的账户,请填写下方的字段。",
+       "authmanager-create-not-in-progress": "账户创建尚未进行,或会话数据丢失。请从头重新开始。",
+       "authmanager-create-no-primary": "提供的证书不能用于账户创建。",
+       "authmanager-link-no-primary": "提供的证书不能用于账户链接。",
+       "authmanager-link-not-in-progress": "账户链接尚未进行,或会话数据丢失。请从头重新开始。",
+       "authmanager-authplugin-setpass-failed-title": "密码更改失败",
+       "authmanager-authplugin-setpass-failed-message": "身份验证插件拒绝了密码更改。",
+       "authmanager-authplugin-create-fail": "身份验证插件拒绝了账户创建。",
+       "authmanager-authplugin-setpass-denied": "身份验证插件不允许更改密码。",
+       "authmanager-authplugin-setpass-bad-domain": "无效域。",
+       "authmanager-autocreate-noperm": "不允许自动账户创建。",
+       "authmanager-autocreate-exception": "由于之前的错误,自动账户创建已临时停用。",
+       "authmanager-userdoesnotexist": "用户帐户“$1”尚未注册。",
+       "authmanager-userlogin-remembermypassword-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-temporarypassword": "临时密码",
+       "authprovider-confirmlink-message": "基于您最近的登录尝试,以下账户可被链接至您的wiki账户。链接它们会启用通过这些账户的登录。请选择应链接的账户。",
+       "authprovider-confirmlink-request-label": "应被链接的账户",
+       "authprovider-confirmlink-success-line": "$1:已成功连接。",
+       "authprovider-confirmlink-failed": "账户链接未完全成功:$1",
+       "authprovider-confirmlink-ok-help": "在显示链接失败消息后继续。",
+       "authprovider-resetpass-skip-label": "跳过",
+       "authprovider-resetpass-skip-help": "跳过重置密码。",
+       "authform-nosession-login": "身份验证已成功,但您的浏览器不能“记住”其登录。\n\n$1",
+       "authform-nosession-signup": "账户已创建,但您的浏览器不能“记住”其登录。\n\n$1",
+       "authform-newtoken": "丢失令牌。$1",
+       "authform-notoken": "丢失令牌",
+       "authform-wrongtoken": "错误令牌",
+       "specialpage-securitylevel-not-allowed-title": "不允许",
+       "specialpage-securitylevel-not-allowed": "对不起,您未被允许使用此页面,因为您的身份不能被验证。",
+       "authpage-cannot-login": "无法开始登录。",
+       "authpage-cannot-login-continue": "无法继续登录。您的会话大概已超时。",
+       "authpage-cannot-create": "无法开始账户创建。",
+       "authpage-cannot-create-continue": "无法继续账户创建。您的会话大概已超时。",
+       "authpage-cannot-link": "无法开始账户链接。",
+       "authpage-cannot-link-continue": "无法继续账户链接。您的会话大概已超时。",
+       "cannotauth-not-allowed-title": "权限被拒绝",
+       "cannotauth-not-allowed": "您不被允许使用此页面",
+       "changecredentials": "更改证书",
+       "changecredentials-submit": "更改",
+       "changecredentials-submit-cancel": "取消",
+       "changecredentials-invalidsubpage": "$1不是有效的证书类型。",
+       "changecredentials-success": "您的证书已被更改。",
+       "removecredentials": "移除证书",
+       "removecredentials-submit": "移除",
+       "removecredentials-submit-cancel": "取消",
+       "removecredentials-invalidsubpage": "$1不是有效的证书类型。",
+       "removecredentials-success": "您的证书已被移除。",
+       "credentialsform-provider": "证书类型:",
+       "credentialsform-account": "帐户名称:",
+       "cannotlink-no-provider-title": "没有可链接账户",
+       "cannotlink-no-provider": "没有可链接账户。",
+       "linkaccounts": "链接账户",
+       "linkaccounts-success-text": "账户已链接。",
+       "linkaccounts-submit": "链接帐户",
+       "unlinkaccounts": "取消链接账户",
+       "unlinkaccounts-success": "账户已取消链接。"
 }
index fbe0e55..9a52c63 100644 (file)
        "password-change-forbidden": "您不可變更此 Wiki 上的密碼。",
        "externaldberror": "這可能是由於資料庫驗證錯誤,或是不允許您更新外部帳號。",
        "login": "登入",
+       "login-security": "驗証您的 ID",
        "nav-login-createaccount": "登入/建立帳號",
        "userlogin": "登入/建立帳號",
        "userloginnocreate": "登入",
        "userlogin-resetpassword-link": "忘記密碼?",
        "userlogin-helplink2": "登入協助",
        "userlogin-loggedin": "您目前已登入 {{GENDER:$1|$1}} 使用者,\n請使用下列表單改登入另一位使用者。",
+       "userlogin-reauth": "您必須再登入一次來驗証您為 {{GENDER:$1|$1}}。",
        "userlogin-createanother": "建立另一個帳號",
        "createacct-emailrequired": "電子郵件地址",
        "createacct-emailoptional": "電子郵件地址 (選填)",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您為什麼要建立另一個帳號",
+       "createacct-reason-help": "顯示於帳號建立日誌的訊息",
        "createacct-submit": "建立您的帳號",
        "createacct-another-submit": "建立帳號",
+       "createacct-continue-submit": "繼續帳號建立",
+       "createacct-another-continue-submit": "繼續帳號建立",
        "createacct-benefit-heading": "{{SITENAME}} 是由像您一樣貢獻的人所建立的。",
        "createacct-benefit-body1": "{{PLURAL:$1|次編輯}}",
        "createacct-benefit-body2": "$1 頁",
        "nocookiesnew": "使用者帳號已建立成功,但您尚未登入。\n要登入 {{SITENAME}} 使用者需使用 Cookies,\n您的 Cookies 未尚開啟。\n請在開啟後使用您新的使用者名稱及密碼登入。",
        "nocookieslogin": "要登入 {{SITENAME}} 使用者需使用 Cookies,\n您的 Cookies 未尚開啟。\n請在開啟後重試。",
        "nocookiesfornew": "這個使用者的帳號未建立,我們不能確認它的來源。\n請確認您已開啟 Cookie,重新載入後再試。",
+       "createacct-loginerror": "已成功建立帳號,但無法自動登入。\n請繼續 [[Special:UserLogin|手動登入]]。",
        "noname": "您輸入的使用者名稱無效。",
        "loginsuccesstitle": "已登入",
        "loginsuccess": "<strong>{{GENDER:|您|妳|你}}現在已經以 \"$1\" 的身分登入了 {{SITENAME}}。</strong>",
-       "nosuchuser": "查無使用者 \"$1\"。\n使用者名稱有大小寫區分,\n請檢查您拼寫是否正確,或者 [[Special:CreateAccount|建立新帳號]]。",
+       "nosuchuser": "查無名稱為 \"$1\" 的使用者。\n使用者名稱有大小寫區分,\n請檢查您拼寫是否正確,或者 [[Special:CreateAccount|建立新帳號]]。",
        "nosuchusershort": "查無使用者 \"$1\",\n請檢查您拼寫是否正確。",
        "nouserspecified": "您必須指定一個使用者名稱。",
        "login-userblocked": "這位使用者已被封鎖,不允許登入。",
        "createacct-another-realname-tip": "真實姓名為選填欄位。\n若您提供真實姓名,它會用於使用者貢獻署名。",
        "pt-login": "登入",
        "pt-login-button": "登入",
+       "pt-login-continue-button": "繼續登入",
        "pt-createaccount": "建立帳號",
        "pt-userlogout": "登出",
        "php-mail-error-unknown": "PHP 的 mail() 函數發生不明錯誤。",
        "botpasswords-invalid-name": "指定的使用者名稱未包含機器人密碼分隔字元 (\"$1\")。",
        "botpasswords-not-exist": "使用者 \"$1\" 並沒有名稱為 \"$2\" 的機器人密碼。",
        "resetpass_forbidden": "無法變更密碼",
+       "resetpass_forbidden-reason": "無法變更密碼:$1",
        "resetpass-no-info": "您必須直接登入存取這個頁面。",
        "resetpass-submit-loggedin": "變更密碼",
        "resetpass-submit-cancel": "取消",
        "whatlinkshere-prev": "前 $1 筆",
        "whatlinkshere-next": "{{PLURAL:$1|下筆|後 $1 筆}}",
        "whatlinkshere-links": "← 連結",
-       "whatlinkshere-hideredirs": "隱藏重定向",
-       "whatlinkshere-hidetrans": "隱藏引用",
-       "whatlinkshere-hidelinks": "隱藏連結",
+       "whatlinkshere-hideredirs": "$1 重新導向",
+       "whatlinkshere-hidetrans": "$1 引用",
+       "whatlinkshere-hidelinks": "$1 連結",
        "whatlinkshere-hideimages": "$1 檔案連結",
        "whatlinkshere-filters": "搜尋",
        "whatlinkshere-submit": "前往",
        "log-action-filter-suppress-block": "由封鎖禁止顯示使用者",
        "log-action-filter-suppress-reblock": "由重新封鎖禁止顯示使用者",
        "log-action-filter-upload-upload": "新上傳",
-       "log-action-filter-upload-overwrite": "重新上傳"
+       "log-action-filter-upload-overwrite": "重新上傳",
+       "authmanager-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
+       "authmanager-username-help": "認証用的使用者名稱。",
+       "authmanager-password-help": "認証用的密碼。",
+       "authmanager-domain-help": "外部認証用的網域。",
+       "authmanager-retype-help": "再輸入一次密碼確認。",
+       "authmanager-email-label": "電子郵件",
+       "authmanager-email-help": "電子郵件地址",
+       "authmanager-realname-label": "真實姓名",
+       "authmanager-realname-help": "使用者的真實姓名",
+       "authmanager-provider-password": "Password-based 認証",
+       "authmanager-provider-password-domain": "Password- 及 domain-based 認証",
+       "authmanager-provider-temporarypassword": "臨時密碼",
+       "authprovider-resetpass-skip-label": "略過",
+       "authprovider-resetpass-skip-help": "略過重設密碼。",
+       "specialpage-securitylevel-not-allowed-title": "不允許",
+       "cannotauth-not-allowed-title": "權限不足",
+       "cannotauth-not-allowed": "您不被允許使用此頁面",
+       "changecredentials": "更改憑證",
+       "changecredentials-submit": "更改",
+       "changecredentials-submit-cancel": "取消",
+       "changecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
+       "changecredentials-success": "已更改您的憑證。",
+       "removecredentials": "移除憑證",
+       "removecredentials-submit": "移除",
+       "removecredentials-submit-cancel": "取消",
+       "removecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
+       "removecredentials-success": "已移除您的憑證。",
+       "credentialsform-provider": "憑證類型:",
+       "credentialsform-account": "帳號名稱:",
+       "cannotlink-no-provider-title": "沒有可連結的帳號",
+       "cannotlink-no-provider": "沒有可連結的帳號。",
+       "linkaccounts": "連結帳號",
+       "linkaccounts-success-text": "已連結帳號。",
+       "linkaccounts-submit": "連結帳號",
+       "unlinkaccounts": "取消連結帳號",
+       "unlinkaccounts-success": "已取消連結帳號。"
 }
index f9dd58c..aab2087 100644 (file)
@@ -94,6 +94,9 @@ class ConvertExtensionToRegistration extends Maintenance {
                $globalSettings = $this->getAllGlobals();
                foreach ( $vars as $name => $value ) {
                        $realName = substr( $name, 2 ); // Strip 'wg'
+                       if ( $realName === false ) {
+                               continue;
+                       }
 
                        // If it's an empty array that we likely set, skip it
                        if ( is_array( $value ) && count( $value ) === 0 && in_array( $realName, $__settings ) ) {
index 2f414df..292a25d 100644 (file)
@@ -59,7 +59,7 @@ class RecompressTracked {
        public $reportingInterval = 10;
        public $numProcs = 1;
        public $numBatches = 0;
-       public $useDiff, $pageBlobClass, $orphanBlobClass;
+       public $pageBlobClass, $orphanBlobClass;
        public $slavePipes, $slaveProcs, $prevSlaveId;
        public $copyOnly = false;
        public $isChild = false;
@@ -112,8 +112,8 @@ class RecompressTracked {
                } elseif ( $this->slaveId !== false ) {
                        $GLOBALS['wgDebugLogPrefix'] = "RCT {$this->slaveId}: ";
                }
-               $this->useDiff = function_exists( 'xdiff_string_bdiff' );
-               $this->pageBlobClass = $this->useDiff ? 'DiffHistoryBlob' : 'ConcatenatedGzipHistoryBlob';
+               $this->pageBlobClass = function_exists( 'xdiff_string_bdiff' ) ?
+                       'DiffHistoryBlob' : 'ConcatenatedGzipHistoryBlob';
                $this->orphanBlobClass = 'ConcatenatedGzipHistoryBlob';
        }
 
index ecd10fa..f9c6117 100644 (file)
@@ -5,12 +5,12 @@
 body {
        margin: 0;
        background: #eee;
-       font-family: Verdana;
+       font-family: 'Verdana';
        color: #333;
 }
 
 #main {
-       border: 1px solid #D0D0D0;
+       border: 1px solid #d0d0d0;
        background: #fff;
        margin: 0.5em;
 }
@@ -25,7 +25,7 @@ body {
        border-left: 1px dotted #ccc;
        float: right;
        width: 230px;
-       background: white;
+       background: #fff;
        margin: 0 0 10px 10px;
 }
 
index 0e0b304..9cfc40f 100644 (file)
@@ -84,7 +84,7 @@
        display: list-item;
        line-height: 1.5em;
        /* @embed */
-       list-style-image: url(images/bullet.gif);
+       list-style-image: url( images/bullet.gif );
        list-style-type: square;
 }
 
 }
 
 .error {
-       color: red;
+       color: #f00;
        background-color: #fff;
        font-weight: bold;
        left: 1em;
 .success-message {
        font-weight: bold;
        font-size: 110%;
-       color: green;
+       color: #0f0;
 }
 
 .success-box {
 }
 
 .config-download-link a {
-       background: url(images/download-32.png) no-repeat center left;
+       background: url( images/download-32.png ) no-repeat center left;
        padding-left: 40px; /* 32 px for the image (above), plus some breathing room */
        height: 32px; /* provide enough vertical room for the image */
        display: inline-block; /* allow the height property (above) to work */
        margin-bottom: -8px;
        padding: 0 0 0 15px;
        /* @embed */
-       background-image: url(images/help-question.gif);
+       background-image: url( images/help-question.gif );
        background-position: left center;
        background-repeat: no-repeat;
        cursor: pointer;
 
 .config-help-field-hint:hover {
        /* @embed */
-       background-image: url(images/help-question-hover.gif);
+       background-image: url( images/help-question-hover.gif );
 }
 
 .config-help-field-data {
index 394f36e..8bc9ca4 100644 (file)
     "grunt-contrib-watch": "1.0.0",
     "grunt-jscs": "2.8.0",
     "grunt-jsonlint": "1.0.7",
-    "grunt-karma": "0.12.2",
+    "grunt-karma": "1.0.0",
+    "grunt-stylelint": "0.3.0",
     "karma": "0.13.22",
-    "karma-chrome-launcher": "0.2.2",
-    "karma-firefox-launcher": "0.1.7",
-    "karma-qunit": "0.1.9",
-    "qunitjs": "1.22.0"
+    "karma-chrome-launcher": "1.0.1",
+    "karma-firefox-launcher": "1.0.0",
+    "karma-qunit": "1.0.0",
+    "qunitjs": "1.22.0",
+    "stylelint-config-wikimedia": "0.1.0"
   }
 }
index 3fc5801..9a5931f 100644 (file)
@@ -756,6 +756,7 @@ return [
                        'de' => 'resources/lib/moment/locale/de.js',
                        'de-at' => 'resources/lib/moment/locale/de-at.js',
                        'el' => 'resources/lib/moment/locale/el.js',
+                       'en' => 'resources/src/moment-dmy.js',
                        'en-au' => 'resources/lib/moment/locale/en-au.js',
                        'en-ca' => 'resources/lib/moment/locale/en-ca.js',
                        'en-gb' => 'resources/lib/moment/locale/en-gb.js',
index b2e2bd4..b31fe82 100644 (file)
@@ -88,9 +88,6 @@ return call_user_func( function () {
                'skipFunction' => 'resources/src/oojs-ui-styles-skip.js',
        ];
 
-       // Deprecated old name for the module 'oojs-ui-core.styles'.
-       $modules['oojs-ui.styles'] = $modules['oojs-ui-core.styles'];
-
        // Additional widgets and layouts module.
        $modules['oojs-ui-widgets'] = [
                'scripts' => 'resources/lib/oojs-ui/oojs-ui-widgets.js',
index 33d9a00..9036dd3 100644 (file)
@@ -7,9 +7,9 @@
 .tipsy-inner {
        padding: 5px 8px 4px 8px;
        /*background-color: #e8f2f8;*/
-       background-color: #ffffff;
+       background-color: #fff;
        border: solid 1px #a7d7f9;
-       color: black;
+       color: #000;
        max-width: 15em;
        border-radius: 4px;
        /*
@@ -23,7 +23,7 @@
 .tipsy-arrow {
        position: absolute;
        /* @embed */
-       background: url('images/tipsy.png') no-repeat top left;
+       background: url( images/tipsy.png ) no-repeat top left;
        width: 11px;
        height: 6px;
 }
index f8f6e95..d24fcc9 100644 (file)
@@ -1,7 +1,7 @@
 .arrowSteps {
        list-style-type: none;
        list-style-image: none;
-       border: 1px solid #666666;
+       border: 1px solid #666;
        position: relative;
 }
 
 
 .arrowSteps li.arrow div {
        /* @embed */
-       background: url(images/jquery.arrowSteps.divider-ltr.png) no-repeat right center;
+       background: url( images/jquery.arrowSteps.divider-ltr.png ) no-repeat right center;
 }
 
 /* applied to the element preceding the highlighted step */
 .arrowSteps li.arrow.tail div {
        /* @embed */
-       background: url(images/jquery.arrowSteps.tail-ltr.png) no-repeat right center;
+       background: url( images/jquery.arrowSteps.tail-ltr.png ) no-repeat right center;
 }
 
 /* this applies to all highlighted, including the last */
 .arrowSteps li.head div {
        /* @embed */
-       background: url(images/jquery.arrowSteps.head-ltr.png) no-repeat left center;
+       background: url( images/jquery.arrowSteps.head-ltr.png ) no-repeat left center;
        font-weight: bold;
 }
 
@@ -41,5 +41,5 @@
 .arrowSteps li.arrow.head div {
        /* TODO: eliminate duplication of jquery.arrowSteps.head.png embedding */
        /* @embed */
-       background: url(images/jquery.arrowSteps.head-ltr.png) no-repeat right center;
+       background: url( images/jquery.arrowSteps.head-ltr.png ) no-repeat right center;
 }
index 34cdf76..8b4bd7b 100644 (file)
@@ -11,9 +11,9 @@
 
 .mw-badge-content {
        font-weight: bold;
-       color: white;
+       color: #fff;
        vertical-align: baseline;
-       text-shadow: 0 1px rgba(0, 0, 0, 0.4);
+       text-shadow: 0 1px rgba( 0, 0, 0, 0.4 );
 }
 
 .mw-badge-inline {
@@ -32,5 +32,5 @@
 }
 
 .mw-badge-important {
-       background-color: #cc0000;
+       background-color: #c00;
 }
index de69072..78c4c04 100644 (file)
@@ -20,9 +20,9 @@
 }
 
 .jquery-confirmable-element {
-       transition: margin 250ms cubic-bezier(0.2, 0.8, 0.2, 0.8);
+       transition: margin 250ms cubic-bezier( 0.2, 0.8, 0.2, 0.8 );
 }
 
 .jquery-confirmable-interface {
-       transition: width 250ms cubic-bezier(0.2, 0.8, 0.2, 0.8);
+       transition: width 250ms cubic-bezier( 0.2, 0.8, 0.2, 0.8 );
 }
index baba348..b7e0af5 100644 (file)
 }
 .farbtastic .wheel {
        /* @embed */
-       background: url(images/wheel.png) no-repeat;
+       background: url( images/wheel.png ) no-repeat;
        width: 195px;
        height: 195px;
 }
 .farbtastic .overlay {
        /* @embed */
-       background: url(images/mask.png) no-repeat;
+       background: url( images/mask.png ) no-repeat;
 }
 .farbtastic .marker {
        width: 17px;
@@ -49,5 +49,5 @@
        margin: -8px 0 0 -8px;
        overflow: hidden;
        /* @embed */
-       background: url(images/marker.png) no-repeat;
+       background: url( images/marker.png ) no-repeat;
 }
index a9e06db..76b4845 100644 (file)
@@ -6,7 +6,7 @@
 
 .mw-spinner-small {
        /* @embed */
-       background-image: url(images/spinner.gif);
+       background-image: url( images/spinner.gif );
        height: 20px;
        width: 20px;
        /* Avoid issues with .mw-spinner-block when floated without width. */
@@ -15,7 +15,7 @@
 
 .mw-spinner-large {
        /* @embed */
-       background-image: url(images/spinner-large.gif);
+       background-image: url( images/spinner-large.gif );
        height: 32px;
        width: 32px;
        /* Avoid issues with .mw-spinner-block when floated without width. */
index 15cd926..f6b4fd1 100644 (file)
@@ -14,9 +14,9 @@
 
 .suggestions-special {
        position: relative;
-       background-color: white;
+       background-color: #fff;
        cursor: pointer;
-       border: solid 1px #aaaaaa;
+       border: solid 1px #aaa;
        padding: 0;
        margin: 0;
        margin-top: -2px;
 }
 
 .suggestions-results {
-       background-color: white;
+       background-color: #fff;
        cursor: pointer;
-       border: solid 1px #aaaaaa;
+       border: solid 1px #aaa;
        padding: 0;
        margin: 0;
 }
 
 .suggestions-result {
-       color: black;
+       color: #000;
        margin: 0;
        line-height: 1.5em;
        padding: 0.01em 0.25em;
 }
 
 .suggestions-result-current {
-       background-color: #4C59A6;
-       color: white;
+       background-color: #4c59a6;
+       color: #fff;
 }
 
 .suggestions-special .special-label {
-       color: gray;
+       color: #808080;
        text-align: left;
 }
 
 .suggestions-special .special-query {
-       color: black;
+       color: #000;
        font-style: italic;
        text-align: left;
 }
 
 .suggestions-special .special-hover {
-       background-color: silver;
+       background-color: #c0c0c0;
 }
 
 .suggestions-result-current .special-label,
 .suggestions-result-current .special-query {
-       color: white;
+       color: #fff;
 }
 
 .highlight {
index 603a965..835383e 100644 (file)
@@ -2,3 +2,8 @@
 #pagehistory li.after input[name="diff"] {
        visibility: hidden;
 }
+
+span.updatedmarker {
+       color: #000;
+       background-color: #0f0;
+}
index 0887476..9db6777 100644 (file)
@@ -72,7 +72,7 @@ td.diff-deletedline {
 td.diff-context {
        background: #f9f9f9;
        border-color: #e6e6e6;
-       color: #333333;
+       color: #333;
 }
 
 .diffchange {
index 5112728..99982e3 100644 (file)
@@ -38,7 +38,7 @@ table.filehistory td.filehistory-selected {
 .filehistory a img,
 #file img:hover {
        /* @embed */
-       background: white url(images/checker.png) repeat;
+       background: #fff url( images/checker.png ) repeat;
 }
 
 /*
@@ -46,7 +46,7 @@ table.filehistory td.filehistory-selected {
  */
 ul#filetoc {
        text-align: center;
-       border: 1px solid #aaaaaa;
+       border: 1px solid #aaa;
        background-color: #f9f9f9;
        padding: 5px;
        font-size: 95%;
index db89990..9a8edef 100644 (file)
@@ -21,7 +21,7 @@
        color: #626465;
        background-color: #f4f4f4;
        border: 1px solid #dcd9d9;
-       text-shadow: 0 0.0625em 0 rgba(255, 255, 255, 0.5);
+       text-shadow: 0 0.0625em 0 rgba( 255, 255, 255, 0.5 );
        border-radius: 5px;
        box-shadow: 0 2px 5px 0 #ccc;
        -webkit-transition: all 0.25s ease-in-out;
@@ -49,7 +49,7 @@
 
 .postedit-icon-checkmark {
        /* @embed */
-       background-image: url(images/green-checkmark.png);
+       background-image: url( images/green-checkmark.png );
        background-position: left;
 }
 
        font-size: 1.25em;
        font-weight: bold;
        line-height: 2.3em;
-       color: black;
-       text-shadow: 0 0.0625em 0 white;
+       color: #000;
+       text-shadow: 0 0.0625em 0 #fff;
        text-decoration: none;
        opacity: 0.2;
-       filter: alpha(opacity=20);
+       filter: alpha( opacity=20 );
 }
 
 .postedit-close:hover {
-       color: black;
+       color: #000;
        text-decoration: none;
        opacity: 0.4;
-       filter: alpha(opacity=40);
+       filter: alpha( opacity=40 );
 }
index 03a9f76..b791db8 100644 (file)
        margin: 0;
        padding: 0;
        padding-left: 42px;
-       background: transparent url(images/nextredirect-ltr.png) bottom left no-repeat;
+       background: transparent url( images/nextredirect-ltr.png ) bottom left no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/nextredirect-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/nextredirect-ltr.svg );
 }
 
 /* @noflip */
 .mw-content-ltr .redirectText li:first-child {
        padding-left: 47px;
-       background: transparent url(images/redirect-ltr.png) bottom left no-repeat;
+       background: transparent url( images/redirect-ltr.png ) bottom left no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/redirect-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/redirect-ltr.svg );
 }
 
 /* @noflip */
        margin: 0;
        padding: 0;
        padding-right: 42px;
-       background: transparent url(images/nextredirect-rtl.png) bottom right no-repeat;
+       background: transparent url( images/nextredirect-rtl.png ) bottom right no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/nextredirect-rtl.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/nextredirect-rtl.svg );
 }
 
 /* @noflip */
 .mw-content-rtl .redirectText li:first-child {
        padding-right: 47px;
-       background: transparent url(images/redirect-rtl.png) bottom right no-repeat;
+       background: transparent url( images/redirect-rtl.png ) bottom right no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/redirect-rtl.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/redirect-rtl.svg );
 }
index 9adfba1..c1b671b 100644 (file)
@@ -80,7 +80,7 @@ table.rimage {
 div.thumb {
        margin-bottom: .5em;
        border-style: solid;
-       border-color: white;
+       border-color: #fff;
        width: auto;
 }
 
@@ -121,9 +121,9 @@ div.magnify a {
        width: 15px;
        height: 11px;
        /* Use same SVG support hack as mediawiki.legacy's shared.css */
-       background: url(images/magnify-clip-ltr.png) center center no-repeat;
+       background: url( images/magnify-clip-ltr.png ) center center no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/magnify-clip-ltr.svg );
        /* Don't annoy people who copy-paste everything too much */
        -moz-user-select: none;
        -webkit-user-select: none;
@@ -147,7 +147,7 @@ div.tleft {
 }
 
 img.thumbborder {
-       border: 1px solid #dddddd;
+       border: 1px solid #ddd;
 }
 
 /* Page history styling */
@@ -212,7 +212,7 @@ table.toc td {
 }
 
 .error {
-       color: red;
+       color: #f00;
        font-size: larger;
 }
 
@@ -224,12 +224,12 @@ table.toc td {
 }
 
 #preftoc li {
-       border: 1px solid White;
+       border: 1px solid #fff;
 }
 
 #preftoc li.selected {
        background-color: #f9f9f9;
-       border: 1px dashed #aaaaaa;
+       border: 1px dashed #aaa;
 }
 
 #preftoc a,
@@ -272,14 +272,14 @@ table.small {
 
 /* use this instead of #toc for page content */
 .toccolours {
-       border: 1px solid #aaaaaa;
+       border: 1px solid #aaa;
        background-color: #f9f9f9;
        padding: 5px;
        font-size: 95%;
 }
 
 #siteNotice {
-       border: 1px solid #aaaaaa;
+       border: 1px solid #aaa;
        padding-left: 0.5em;
        padding-right: 0.5em;
 }
@@ -290,12 +290,11 @@ table.small {
 
 span.unpatrolled {
        font-weight: bold;
-       color: red;
+       color: #f00;
 }
 
-span.updatedmarker {
-       color: black;
-       background-color: #00FF00;
+.updatedmarker {
+       background-color: #b7f430;
 }
 
 div.gallerybox {
@@ -308,14 +307,14 @@ span.comment {
 
 .previewnote {
        text-align: center;
-       color: #cc0000;
+       color: #c00;
 }
 
 .editExternally {
        border-style: solid;
        border-width: 1px;
-       border-color: gray;
-       background: #ffffff;
+       border-color: #808080;
+       background: #fff;
        padding: 3px;
        margin-top: 0.5em;
        float: left;
@@ -325,7 +324,7 @@ span.comment {
 
 .editExternallyHelp {
        font-style: italic;
-       color: gray;
+       color: #808080;
 }
 
 li span.deleted {
@@ -358,7 +357,7 @@ table.mw_metadata {
 
 table.mw_metadata td,
 table.mw_metadata th {
-       border: 1px solid #aaaaaa;
+       border: 1px solid #aaa;
        padding-left: 4px;
        padding-right: 4px;
 }
@@ -403,7 +402,7 @@ table.mw_metadata td.spacer {
 }
 
 div.multipageimagenavbox {
-       border: solid 1px silver;
+       border: solid 1px #c0c0c0;
        padding: 4px;
        margin: 1em;
        background: #f0f0f0;
@@ -450,7 +449,7 @@ body {
 }
 
 body.ns-0 {
-       background-color: white;
+       background-color: #fff;
 }
 
 /** RTL specific CSS starts here **/
index ec6cee4..4ff403a 100644 (file)
@@ -44,8 +44,8 @@
 
 /* User-Agent styles for new HTML5 elements */
 mark {
-       background-color: yellow;
-       color: black;
+       background-color: #ff0;
+       color: #000;
 }
 
 /* Helper for wbr element on IE 8+; in HTML5, but not supported by default as of IE 11. */
@@ -156,7 +156,7 @@ span.history-deleted {
 
 .unpatrolled {
        font-weight: bold;
-       color: red;
+       color: #f00;
 }
 
 div.patrollink {
@@ -246,7 +246,7 @@ input#wpSummary {
 .catlinks li {
        display: inline-block;
        line-height: 1.25em;
-       border-left: 1px solid #AAA;
+       border-left: 1px solid #aaa;
        margin: 0.125em 0;
        padding: 0 0.5em;
        zoom: 1;
@@ -288,7 +288,7 @@ p.mw-delete-editreasons {
 
 /* The auto-generated edit comments */
 .autocomment {
-       color: gray;
+       color: #808080;
 }
 
 #pagehistory .history-user {
@@ -297,7 +297,7 @@ p.mw-delete-editreasons {
 }
 
 #pagehistory li {
-       border: 1px solid white;
+       border: 1px solid #fff;
 }
 
 #pagehistory li.selected {
@@ -325,7 +325,7 @@ p.mw-delete-editreasons {
 div.mw-warning-with-logexcerpt {
        padding: 3px;
        margin-bottom: 3px;
-       border: 2px solid #2F6FAB;
+       border: 2px solid #2f6fab;
        clear: both;
 }
 
@@ -352,7 +352,7 @@ th.mw-revdel-checkbox {
 
 /* red links; see bug 36276 */
 a.new {
-       color: #BA0000;
+       color: #ba0000;
 }
 
 /* Plainlinks - this can be used to switch
@@ -378,7 +378,7 @@ table.wikitable {
        background-color: #f9f9f9;
        border: 1px solid #aaa;
        border-collapse: collapse;
-       color: black;
+       color: #000;
 }
 
 table.wikitable > tr > th,
@@ -407,7 +407,7 @@ table.wikitable > caption {
 }
 
 .error {
-       color: #cc0000;
+       color: #c00;
 }
 
 .warning {
@@ -441,7 +441,7 @@ table.wikitable > caption {
 }
 
 .errorbox {
-       color: #cc0000;
+       color: #c00;
        border-color: #fac5c5;
        background-color: #fae3e3;
 }
@@ -504,20 +504,20 @@ table.wikitable > caption {
 .mw-datatable,
 .mw-datatable td,
 .mw-datatable th {
-       border: 1px solid #aaaaaa;
+       border: 1px solid #aaa;
        padding: 0 0.15em 0 0.15em;
 }
 
 .mw-datatable th {
-       background-color: #ddddff;
+       background-color: #ddf;
 }
 
 .mw-datatable td {
-       background-color: #ffffff;
+       background-color: #fff;
 }
 
 .mw-datatable tr:hover td {
-       background-color: #eeeeff;
+       background-color: #eef;
 }
 
 /* Classes for Exif data display */
@@ -548,7 +548,7 @@ table.mw_metadata {
 
 table.mw_metadata td,
 table.mw_metadata th {
-       border: 1px solid #aaaaaa;
+       border: 1px solid #aaa;
        padding-left: 5px;
        padding-right: 5px;
 }
@@ -613,7 +613,7 @@ table.mw_metadata ul.metadata-langlist {
 }
 
 .mw-ajax-loader {
-       background-image: url(images/ajax-loader.gif);
+       background-image: url( images/ajax-loader.gif );
        background-position: center center;
        background-repeat: no-repeat;
        padding: 16px;
@@ -624,7 +624,7 @@ table.mw_metadata ul.metadata-langlist {
 .mw-small-spinner {
        padding: 10px !important;
        margin-right: 0.6em;
-       background-image: url(images/spinner.gif);
+       background-image: url( images/spinner.gif );
        background-position: center center;
        background-repeat: no-repeat;
 }
@@ -763,7 +763,7 @@ ol:lang(or) li {
        margin-left: 2px;
        margin-bottom: -8px;
        padding: 0 0 0 15px;
-       background-image: url(images/help-question.gif);
+       background-image: url( images/help-question.gif );
        background-position: left center;
        background-repeat: no-repeat;
        cursor: pointer;
@@ -773,7 +773,7 @@ ol:lang(or) li {
 }
 
 .mw-help-field-hint:hover {
-       background-image: url(images/help-question-hover.gif);
+       background-image: url( images/help-question-hover.gif );
 }
 
 .mw-help-field-data {
index 89f8745..3dacf64 100644 (file)
@@ -187,9 +187,9 @@ div.magnify a {
        /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
 
        /* Use same SVG support hack as mediawiki.legacy's shared.css */
-       background-image: url(images/magnify-clip-ltr.png);
+       background-image: url( images/magnify-clip-ltr.png );
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/magnify-clip-ltr.svg );
        /* Don't annoy people who copy-paste everything too much */
        -moz-user-select: none;
        -webkit-user-select: none;
@@ -198,7 +198,7 @@ div.magnify a {
 }
 
 img.thumbborder {
-       border: 1px solid #dddddd;
+       border: 1px solid #ddd;
 }
 
 /* Directionality-specific styles for thumbnails - their positioning depends on content language */
@@ -218,9 +218,9 @@ img.thumbborder {
 /* @noflip */
 .mw-content-ltr div.magnify a {
        /* Use same SVG support hack as mediawiki.legacy's shared.css */
-       background-image: url(images/magnify-clip-ltr.png);
+       background-image: url( images/magnify-clip-ltr.png );
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/magnify-clip-ltr.svg );
 }
 
 /* @noflip */
@@ -238,9 +238,9 @@ img.thumbborder {
 /* @noflip */
 .mw-content-rtl div.magnify a {
        /* Use same SVG support hack as mediawiki.legacy's shared.css */
-       background-image: url(images/magnify-clip-rtl.png);
+       background-image: url( images/magnify-clip-rtl.png );
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-rtl.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/magnify-clip-rtl.svg );
 }
 
 /* @noflip */
index 8890cbb..b7cc6ed 100644 (file)
@@ -6,41 +6,41 @@
  * and using the .background-image-svg mixin. */
 
 /* SVG support using a transparent gradient to guarantee cross-browser
- * compatibility (browsers able to understand gradient syntax support also SVG).
+ * compatibility ( browsers able to understand gradient syntax support also SVG ).
  * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
 
 .mw-body a.external,
 .link-https {
-       background: url(images/external-ltr.png) center right no-repeat;
+       background: url( images/external-ltr.png ) center right no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/external-ltr.svg);
+       background-image: -webkit-linear-gradient( transparent, transparent ), url( images/external-ltr.svg );
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/external-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/external-ltr.svg );
        padding-right: 15px;
 }
 
 .mw-body a.external[href^="mailto:"],
 .link-mailto {
-       background: url(images/mail.png) center right no-repeat;
+       background: url( images/mail.png ) center right no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/mail.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/mail.svg );
        padding-right: 15px;
 }
 
 .mw-body a.external[href^="ftp://"],
 .link-ftp {
-       background: url(images/ftp-ltr.png) center right no-repeat;
+       background: url( images/ftp-ltr.png ) center right no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/ftp-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/ftp-ltr.svg );
        padding-right: 15px;
 }
 
 .mw-body a.external[href^="irc://"],
 .mw-body a.external[href^="ircs://"],
 .link-irc {
-       background: url(images/chat-ltr.png) center right no-repeat;
+       background: url( images/chat-ltr.png ) center right no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/chat-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/chat-ltr.svg );
        padding-right: 15px;
 }
 
@@ -51,9 +51,9 @@
 .mw-body a.external[href$=".wav"], .mw-body a.external[href$=".WAV"],
 .mw-body a.external[href$=".wma"], .mw-body a.external[href$=".WMA"],
 .link-audio {
-       background: url(images/audio-ltr.png) center right no-repeat;
+       background: url( images/audio-ltr.png ) center right no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/audio-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/audio-ltr.svg );
        padding-right: 15px;
 }
 
@@ -62,9 +62,9 @@
 .mw-body a.external[href$=".mpeg"], .mw-body a.external[href$=".MPEG"],
 .mw-body a.external[href$=".mpg"], .mw-body a.external[href$=".MPG"],
 .link-video {
-       background: url(images/video.png) center right no-repeat;
+       background: url( images/video.png ) center right no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/video.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/video.svg );
        padding-right: 15px;
 }
 
@@ -72,9 +72,9 @@
 .mw-body a.external[href*=".pdf#"], .mw-body a.external[href*=".PDF#"],
 .mw-body a.external[href*=".pdf?"], .mw-body a.external[href*=".PDF?"],
 .link-document {
-       background: url(images/document-ltr.png) center right no-repeat;
+       background: url( images/document-ltr.png ) center right no-repeat;
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/document-ltr.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/document-ltr.svg );
        padding-right: 15px;
 }
 
index 99d465b..346771f 100644 (file)
@@ -15,7 +15,7 @@
 }
 
 .mw-body-content a[rel~="mw:ExtLink"]:empty:after {
-       content: "[" counter(mw-NumberedExtLink) "]";
+       content: "[" counter( mw-NumberedExtLink ) "]";
        counter-increment: mw-NumberedExtLink;
 }
 
@@ -126,7 +126,7 @@ figure[typeof~='mw:Image/Frame'] {
 figure[typeof~='mw:Image/Thumb'] > *:first-child > img,
 figure[typeof~='mw:Image/Frame'] > *:first-child > img,
 .mw-image-border > *:first-child > img {
-       border: 1px solid #cccccc;
+       border: 1px solid #ccc;
        margin: 3px;
 }
 
index 7872085..7b0b071 100644 (file)
@@ -34,7 +34,7 @@ a:lang(ur) {
 }
 
 a.stub {
-       color: #772233;
+       color: #723;
 }
 
 a.new, #p-personal a.new {
@@ -97,7 +97,7 @@ h3,
 h4,
 h5,
 h6 {
-       color: black;
+       color: #000;
        background: none;
        font-weight: normal;
        margin: 0;
@@ -195,11 +195,11 @@ pre, code, tt, kbd, samp, .mw-code {
         * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
         * Specifying any valid, second value will trigger correct behavior without forcing a different font.
         */
-       font-family: monospace, Courier;
+       font-family: monospace, 'Courier';
 }
 
 code {
-       color: black;
+       color: #000;
        background-color: #f9f9f9;
        border: 1px solid #ddd;
        border-radius: 2px;
@@ -208,7 +208,7 @@ code {
 
 pre,
 .mw-code {
-       color: black;
+       color: #000;
        background-color: #f9f9f9;
        border: 1px solid #ddd;
        padding: 1em;
index b57ee36..8b07721 100644 (file)
@@ -16,8 +16,8 @@
 }
 
 .editOptions {
-       background-color: #F0F0F0;
-       border: 1px solid silver;
+       background-color: #f0f0f0;
+       border: 1px solid #c0c0c0;
        border-top: none;
        padding: 1em 1em 1.5em 1em;
        margin-bottom: 2em;
@@ -26,7 +26,7 @@
 .usermessage {
        background-color: #ffce7b;
        border: 1px solid #ffa500;
-       color: black;
+       color: #000;
        font-weight: bold;
        margin: 2em 0 1em;
        padding: .5em 1em;
index 15f4e4d..f2019e7 100644 (file)
@@ -103,7 +103,7 @@ span.mw-protectedpages-actions {
        font-size: 90%;
 }
 span.mw-protectedpages-unknown {
-       color: grey;
+       color: #808080;
        font-size: 90%;
 }
 
index e05d163..4c9c41e 100644 (file)
@@ -3,7 +3,7 @@
 .mw-email-none .mw-input{
        border: 1px solid #fde29b;
        background-color: #fdf1d1;
-       color: #000000;
+       color: #000;
 }
 /* Authenticated email field has its own class too. Unstyled by default */
 /*
old mode 100755 (executable)
new mode 100644 (file)
index 1ce9569..1e99361
@@ -44,13 +44,13 @@ div.searchresult {
        font-size: 108%;
 }
 .mw-search-result-data {
-       color: green;
+       color: #0f0;
        font-size: 97%;
 }
 .mw-search-profile-tabs {
        background-color: #f3f3f3;
        margin-top: 1em;
-       border: 1px solid silver;
+       border: 1px solid #c0c0c0;
 }
 .mw-search-profile-tabs div.search-types {
        float: left;
@@ -71,7 +71,7 @@ div.searchresult {
        padding: 0.5em;
 }
 .mw-search-profile-tabs div.search-types ul li.current a {
-       color: #333333;
+       color: #333;
        cursor: default;
 }
 .mw-search-profile-tabs div.search-types ul li.current a:hover {
@@ -90,7 +90,7 @@ fieldset#mw-searchoptions {
        padding: 0.5em 0.75em 0.75em 0.75em;
        border: none;
        background-color: #f9f9f9;
-       border: 1px solid silver;
+       border: 1px solid #c0c0c0;
        border-top-width: 0;
 }
 fieldset#mw-searchoptions legend {
@@ -121,18 +121,18 @@ fieldset#mw-searchoptions table td {
 }
 fieldset#mw-searchoptions div.divider {
        clear: both;
-       border-bottom: 1px solid #DDDDDD;
+       border-bottom: 1px solid #ddd;
        padding-top: 0.5em;
        margin-bottom: 0.5em;
 }
 td#mw-search-menu {
-       padding-left:6em;
-       font-size:85%;
+       padding-left: 6em;
+       font-size: 85%;
 }
 div#mw-search-interwiki {
        float: right;
        width: 18em;
-       border: 1px solid #AAAAAA;
+       border: 1px solid #aaa;
        margin-top: 2ex;
 }
 div#mw-search-interwiki li {
@@ -152,7 +152,7 @@ div#mw-search-interwiki-caption {
        text-align: left;
        padding: 0.15em 0.15em 0.2em 0.2em;
        background-color: #ececec;
-       border-top: 1px solid #BBBBBB;
+       border-top: 1px solid #bbb;
 }
 span.searchalttitle {
        font-size: 95%;
index 620c83a..753f774 100644 (file)
@@ -13,7 +13,7 @@
        color: #347bff;
 }
 #mw-createaccount-join:hover {
-       background-color: #ebf2ff; /* rgba(52, 123, 255, 0.1); */
+       background-color: #ebf2ff; /* rgba( 52, 123, 255, 0.1 ); */
        border-color: #859ecc;
        box-shadow: none;
 }
index 0998d4c..19aee1e 100644 (file)
@@ -23,17 +23,17 @@ div.mw-createacct-benefits-container h2 {
 
 .mw-number-text.icon-edits {
        /* @embed */
-       background: url(images/icon-edits.png) no-repeat left center;
+       background: url( images/icon-edits.png ) no-repeat left center;
 }
 
 .mw-number-text.icon-pages {
        /* @embed */
-       background: url(images/icon-pages.png) no-repeat left center;
+       background: url( images/icon-pages.png ) no-repeat left center;
 }
 
 .mw-number-text.icon-contributors {
        /* @embed */
-       background: url(images/icon-contributors.png) no-repeat left center;
+       background: url( images/icon-contributors.png ) no-repeat left center;
 }
 
 /*
@@ -45,7 +45,7 @@ div.mw-createacct-benefits-container h2 {
        margin: 0;
        padding: 0;
        color: #252525;
-       font-family: "Linux Libertine", Georgia, Times, serif;
+       font-family: 'Linux Libertine', 'Georgia', 'Times', serif;
        font-weight: normal;
        font-size: 2.2em;
        line-height: 1.2;
index f86a41d..ceb93c2 100644 (file)
@@ -43,5 +43,5 @@
 
 // Awful workaround for T113868, while it awaits a better fix.
 #mw-t113868 {
-       background-image: url(images/ar/button_bold.png), url(images/ar/button_headline.png), url(images/ar/button_italic.png), url(images/ar/button_link.png), url(images/ar/button_nowiki.png), url(images/be-tarask/button_bold.png), url(images/be-tarask/button_italic.png), url(images/be-tarask/button_link.png), url(images/de/button_bold.png), url(images/de/button_italic.png), url(images/en/button_bold.png), url(images/en/button_extlink.png), url(images/en/button_headline.png), url(images/en/button_hr.png), url(images/en/button_image.png), url(images/en/button_italic.png), url(images/en/button_link.png), url(images/en/button_media.png), url(images/en/button_nowiki.png), url(images/en/button_sig.png), url(images/fa/button_bold.png), url(images/fa/button_headline.png), url(images/fa/button_italic.png), url(images/fa/button_link.png), url(images/fa/button_nowiki.png), url(images/ksh/button_italic.png), url(images/ru/button_bold.png), url(images/ru/button_italic.png), url(images/ru/button_link.png);
+       background-image: url( images/ar/button_bold.png ), url( images/ar/button_headline.png ), url( images/ar/button_italic.png ), url( images/ar/button_link.png ), url( images/ar/button_nowiki.png ), url( images/be-tarask/button_bold.png ), url( images/be-tarask/button_italic.png ), url( images/be-tarask/button_link.png ), url( images/de/button_bold.png ), url( images/de/button_italic.png ), url( images/en/button_bold.png ), url( images/en/button_extlink.png ), url( images/en/button_headline.png ), url( images/en/button_hr.png ), url( images/en/button_image.png ), url( images/en/button_italic.png ), url( images/en/button_link.png ), url( images/en/button_media.png ), url( images/en/button_nowiki.png ), url( images/en/button_sig.png ), url( images/fa/button_bold.png ), url( images/fa/button_headline.png ), url( images/fa/button_italic.png ), url( images/fa/button_link.png ), url( images/fa/button_nowiki.png ), url( images/ksh/button_italic.png ), url( images/ru/button_bold.png ), url( images/ru/button_italic.png ), url( images/ru/button_link.png );
 }
index a7beb0d..77f87f7 100644 (file)
                }
        }
 
-       background-color: white;
+       background-color: #fff;
        border: 1px solid #ccc;
 
        &.mw-widgets-datetime-calendarWidget-dependent {
                margin-top: -1px;
-               border-top: 1px solid white;
+               border-top: 1px solid #fff;
        }
 
        &-heading {
@@ -51,7 +51,7 @@
 
                        .oo-ui-buttonElement-button {
                                width: 100%;
-                               border: 1px dotted rgba(255,255,255,0.0);
+                               border: 1px dotted rgba( 255, 255, 255, 0.0 );
                                .oo-ui-box-sizing( border-box );
                        }
 
@@ -69,6 +69,6 @@
        }
 
        &:focus &-grid &-cell&-focused .oo-ui-buttonElement-button {
-               border-color: rgba(0,0,0,0.3);
+               border-color: rgba( 0, 0, 0, 0.3 );
        }
 }
index bc387df..84788d2 100644 (file)
@@ -51,7 +51,7 @@
                padding: 0 1em;
                margin: 0;
                background-color: #fff;
-               color: black;
+               color: #000;
                border: solid 1px #ccc;
                box-shadow: inset 0 0 0 0 @progressive;
                border-radius: 0.1em;
 
                &.oo-ui-flaggedElement-invalid {
                        .mw-widgets-datetime-dateTimeInputWidget-handle {
-                               border-color: red;
-                               box-shadow: inset 0 0 0 0 red;
+                               border-color: #f00;
+                               box-shadow: inset 0 0 0 0 #f00;
                        }
 
                        .mw-widgets-datetime-dateTimeInputWidget-handle:focus {
-                               border-color: red;
-                               box-shadow: inset 0 0 0 0.1em red;
+                               border-color: #f00;
+                               box-shadow: inset 0 0 0 0.1em #f00;
                        }
                }
        }
        }
 
        &-editField.mw-widgets-datetime-dateTimeInputWidget-invalid {
-               border: 1px solid red;
-               box-shadow: inset 0 0 0 0 red;
+               border: 1px solid #f00;
+               box-shadow: inset 0 0 0 0 #f00;
 
                &:focus {
-                       border: 1px solid red;
-                       box-shadow: inset 0 0 0 0.1em red;
+                       border: 1px solid #f00;
+                       box-shadow: inset 0 0 0 0.1em #f00;
                }
        }
 
index ee0e66e..84c086f 100644 (file)
 }
 
 .oo-ui-transition( @value1, @value2: X, ... ) {
-       @value: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`;
+       @value: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after
        -webkit-transition: @value;
        -moz-transition: @value;
        transition: @value;
 }
 
-@indicator-size: unit(12 / 16 / 0.8, em);
-@icon-size: unit(24 / 16 / 0.8, em);
+@indicator-size: unit( 12 / 16 / 0.8, em );
+@icon-size: unit( 24 / 16 / 0.8, em );
 @quick-ease: 100ms ease;
 @progressive: #347bff;
index 873cca1..7b7ef3d 100644 (file)
@@ -26,7 +26,7 @@
        }
 }
 
-@indicator-size: unit(12 / 16 / 0.8, em);
+@indicator-size: unit( 12 / 16 / 0.8, em );
 
 .mw-widget-dateInputWidget {
        display: inline-block;
@@ -74,7 +74,7 @@
                border: 1px solid #ccc;
                border-radius: 0.1em;
                line-height: 1.275em;
-               background-color: white;
+               background-color: #fff;
        }
 
        &.oo-ui-indicatorElement .mw-widget-dateInputWidget-handle > .oo-ui-indicatorElement-indicator {
@@ -91,7 +91,7 @@
        }
 
        &-calendar {
-               background-color: white;
+               background-color: #fff;
                margin-top: -2px;
 
                &:focus {
 
        &.oo-ui-flaggedElement-invalid {
                .mw-widget-dateInputWidget-handle {
-                       border-color: red;
-                       box-shadow: inset 0 0 0 0 red;
+                       border-color: #f00;
+                       box-shadow: inset 0 0 0 0 #f00;
                }
        }
 
index cf9496f..ecfc880 100644 (file)
@@ -20,8 +20,8 @@
 
 .mw-widgets-stashedFileWidget-info {
        height: 2.4em;
-       background-color: #ffffff;
-       border: 1px solid #cccccc;
+       background-color: #fff;
+       border: 1px solid #ccc;
        border-radius: 2px;
        width: 100%;
        display: table-cell;
@@ -51,7 +51,7 @@
                        float: left;
                }
                > .mw-widgets-stashedFileWidget-fileType {
-                       color: #888888;
+                       color: #888;
                        float: right;
                }
        }
@@ -79,9 +79,9 @@
 
        &.oo-ui-widget-disabled {
                .mw-widgets-stashedFileWidget-info {
-                       color: #cccccc;
-                       text-shadow: 0 1px 1px #ffffff;
-                       border-color: #dddddd;
+                       color: #ccc;
+                       text-shadow: 0 1px 1px #fff;
+                       border-color: #ddd;
                        background-color: #f3f3f3;
 
                        > .oo-ui-iconElement-icon,
@@ -97,8 +97,8 @@
        height: 5.5em;
        text-align: left;
        padding: 0;
-       background-color: #ffffff;
-       border: 1px solid #cccccc;
+       background-color: #fff;
+       border: 1px solid #ccc;
        margin-bottom: 0.5em;
        vertical-align: middle;
        overflow: hidden;
 
                > .mw-widgets-stashedFileWidget-noThumbnail-icon {
                        opacity: 0.4;
-                       background-color: #cccccc;
+                       background-color: #ccc;
                        height: 5.5em;
                        width: 5.5em;
                }
        }
 
        .mw-widgets-stashedFileWidget-label {
-               color: #cccccc;
+               color: #ccc;
                right: 0.5em;
        }
 
index a35ce7a..365e988 100644 (file)
@@ -28,7 +28,7 @@ div.apihelp-linktrail {
 .apihelp-flags {
        font-size: smaller;
        float: right;
-       border: 1px solid black;
+       border: 1px solid #000;
        padding: 0.25em;
        width: 20em;
 }
@@ -36,7 +36,7 @@ div.apihelp-linktrail {
 .apihelp-deprecated, .apihelp-flag-deprecated,
 .apihelp-flag-internal strong {
        font-weight: bold;
-       color: red;
+       color: #f00;
 }
 
 .apihelp-unknown {
index 9e20264..91fa02a 100644 (file)
@@ -13,7 +13,7 @@
 
 .mw-json th,
 .mw-json td {
-       border: 1px solid gray;
+       border: 1px solid #808080;
        font-size: 16px;
        padding: 0.5em 1em;
 }
@@ -50,7 +50,7 @@
 }
 
 .mw-json table caption {
-       color: gray;
+       color: #808080;
        display: inline-block;
        font-size: 10px;
        font-style: italic;
index 949c558..54620f4 100644 (file)
@@ -65,7 +65,7 @@
        font-size: 13px;
        /* IE-hack for display: inline-block */
        zoom: 1;
-       *display:inline;
+       *display: inline;
 }
 
 .mw-debug-panelink {
@@ -115,7 +115,7 @@ a.mw-debug-panelabel:visited {
        th,
        td,
        table {
-               border: 1px solid #D0DBB3;
+               border: 1px solid #d0dbb3;
                border-collapse: collapse;
                margin: 0;
        }
@@ -127,12 +127,12 @@ a.mw-debug-panelabel:visited {
        }
 
        th {
-               background-color: #F1F7E2;
+               background-color: #f1f7e2;
                font-weight: bold;
        }
 
        td {
-               background-color: white;
+               background-color: #fff;
        }
 }
 
index f2859db..c392f2a 100644 (file)
@@ -3,7 +3,7 @@
        zoom: 1;
        *display: inline; /* IE7 and below */
        /* @embed */
-       background: url(mediawiki.feedback.spinner.gif);
+       background: url( mediawiki.feedback.spinner.gif );
        width: 18px;
        height: 18px;
 }
index 4a2a367..37808d5 100644 (file)
@@ -4,9 +4,9 @@ a.feedlink {
        /* SVG support using a transparent gradient to guarantee cross-browser
         * compatibility (browsers able to understand gradient syntax support also SVG).
         * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-       background-image: url(images/feed-icon.png);
+       background-image: url( images/feed-icon.png );
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/feed-icon.svg );
        background-position: center left;
        background-repeat: no-repeat;
        background-size: 12px 12px;
index f4af4ba..89efae3 100644 (file)
@@ -9,7 +9,7 @@
        }
 
        .mediawiki-filewarning-footer {
-               color: #888888;
+               color: #888;
        }
 
        .empty {
index adcb810..1662f0f 100644 (file)
        counter-increment: list-item;
 }
 .hlist ol > li:before {
-       content: counter(list-item) " ";
+       content: counter( list-item ) " ";
 }
 .hlist dd ol > li:first-child:before,
 .hlist dt ol > li:first-child:before,
 .hlist li ol > li:first-child:before {
-       content: "(" counter(list-item) " ";
+       content: "(" counter( list-item ) " ";
 }
index c3341bb..1603130 100644 (file)
@@ -5,7 +5,7 @@ table.mw-htmlform-nolabel td.mw-label {
 }
 
 .mw-htmlform-invalid-input td.mw-input input {
-       border-color: red;
+       border-color: #f00;
 }
 
 .mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
@@ -29,9 +29,9 @@ tr.mw-htmlform-vertical-label td.mw-label {
        /* SVG support using a transparent gradient to guarantee cross-browser
         * compatibility (browsers able to understand gradient syntax support also SVG).
         * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-       background-image: url(images/question.png);
+       background-image: url( images/question.png );
        /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/question.svg);
+       background-image: linear-gradient( transparent, transparent ), url( images/question.svg );
        background-repeat: no-repeat;
        background-size: 13px 13px;
        display: inline-block;
@@ -43,7 +43,7 @@ tr.mw-htmlform-vertical-label td.mw-label {
 .mw-icon-question:lang(ar),
 .mw-icon-question:lang(fa),
 .mw-icon-question:lang(ur) {
-       -webkit-transform: scaleX(-1);
-       -ms-transform: scaleX(-1);
-       transform: scaleX(-1);
+       -webkit-transform: scaleX( -1 );
+       -ms-transform: scaleX( -1 );
+       transform: scaleX( -1 );
 }
index 4aad2ba..1203b6a 100644 (file)
                                 */
                                jobs = [],
 
-                               // Selector cache for the marker element. Use getMarker() to get/use the marker!
-                               $marker = null,
+                               // For getMarker()
+                               marker = null,
 
-                               // For #addEmbeddedCSS
+                               // For addEmbeddedCSS()
                                cssBuffer = '',
                                cssBufferTimer = null,
-                               cssCallbacks = $.Callbacks();
+                               cssCallbacks = $.Callbacks(),
+                               isIEto9 = 'documentMode' in document && document.documentMode <= 9,
+                               isIE9 = document.documentMode === 9;
 
                        function getMarker() {
-                               if ( !$marker ) {
+                               if ( !marker ) {
                                        // Cache
-                                       $marker = $( 'meta[name="ResourceLoaderDynamicStyles"]' );
-                                       if ( !$marker.length ) {
-                                               mw.log( 'No <meta name="ResourceLoaderDynamicStyles"> found, inserting dynamically' );
-                                               $marker = $( '<meta>' ).attr( 'name', 'ResourceLoaderDynamicStyles' ).appendTo( 'head' );
+                                       marker = document.querySelector( 'meta[name="ResourceLoaderDynamicStyles"]' );
+                                       if ( !marker ) {
+                                               mw.log( 'Create <meta name="ResourceLoaderDynamicStyles"> dynamically' );
+                                               marker = $( '<meta>' ).attr( 'name', 'ResourceLoaderDynamicStyles' ).appendTo( 'head' )[ 0 ];
                                        }
                                }
-                               return $marker;
+                               return marker;
                        }
 
                        /**
                         *
                         * @private
                         * @param {string} text CSS text
-                        * @param {HTMLElement|jQuery} [nextnode=document.head] The element where the style tag
+                        * @param {Node} [nextNode] The element where the style tag
                         *  should be inserted before
                         * @return {HTMLElement} Reference to the created style element
                         */
-                       function newStyleTag( text, nextnode ) {
+                       function newStyleTag( text, nextNode ) {
                                var s = document.createElement( 'style' );
                                // Support: IE
-                               // Must attach to document before setting cssText (bug 33305)
-                               if ( nextnode ) {
-                                       $( nextnode ).before( s );
+                               // Must attach style element to the document before setting cssText (T35305)
+                               if ( nextNode && nextNode.parentNode ) {
+                                       nextNode.parentNode.insertBefore( s, nextNode );
                                } else {
                                        document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
                                }
                                        cssBuffer = '';
                                }
 
-                               // By default, always create a new <style>. Appending text to a <style>
-                               // tag is bad as it means the contents have to be re-parsed (bug 45810).
+                               // By default, always create a new <style>. Appending text to a <style> tag is
+                               // is a performance anti-pattern as it requires CSS to be reparsed (T47810).
                                //
-                               // Except, of course, in IE 9 and below. In there we default to re-using and
-                               // appending to a <style> tag due to the IE stylesheet limit (bug 31676).
-                               if ( 'documentMode' in document && document.documentMode <= 9 ) {
-
-                                       $style = getMarker().prev();
-                                       // Verify that the element before the marker actually is a
-                                       // <style> tag and one that came from ResourceLoader
-                                       // (not some other style tag or even a `<meta>` or `<script>`).
+                               // Support: IE 6-9
+                               // Try to re-use existing <style> tags due to the IE stylesheet limit (T33676).
+                               if ( isIEto9 ) {
+                                       $style = $( getMarker() ).prev();
+                                       // Verify that the element before the marker actually is a <style> tag created
+                                       // by mw.loader (not some other style tag, or e.g. a <meta> tag).
                                        if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) ) {
-                                               // There's already a dynamic <style> tag present and
-                                               // we are able to append more to it.
-                                               styleEl = $style.get( 0 );
-                                               // Support: IE6-10
+                                               styleEl = $style[ 0 ];
+                                               // Support: IE 6-10
                                                if ( styleEl.styleSheet ) {
                                                        try {
-                                                               // Support: IE9
-                                                               // We can't do styleSheet.cssText += cssText, since IE9 mangles this property on
-                                                               // write, dropping @media queries from the CSS text. If we read it and used its
-                                                               // value, we would accidentally apply @media-specific styles to all media. (T108727)
-                                                               if ( document.documentMode === 9 ) {
+                                                               // Support: IE 9
+                                                               // We can't do styleSheet.cssText += cssText in IE9 because it mangles cssText on
+                                                               // write (removes @media queries). If we read it and used its value, we'd
+                                                               // accidentally apply @media-specific styles to all media. (T108727)
+                                                               if ( isIE9 ) {
                                                                        newCssText = $style.data( 'ResourceLoaderDynamicStyleTag' ) + cssText;
                                                                        styleEl.styleSheet.cssText = newCssText;
                                                                        $style.data( 'ResourceLoaderDynamicStyleTag', newCssText );
                                                fireCallbacks();
                                                return;
                                        }
+                                       // Else: No existing tag to reuse. Continue below and create the first one.
                                }
 
                                $style = $( newStyleTag( cssText, getMarker() ) );
 
-                               if ( document.documentMode === 9 ) {
-                                       // Support: IE9
-                                       // Preserve original CSS text because IE9 mangles it on write
-                                       $style.data( 'ResourceLoaderDynamicStyleTag', cssText );
-                               } else {
-                                       $style.data( 'ResourceLoaderDynamicStyleTag', true );
+                               if ( isIEto9 ) {
+                                       if ( isIE9 ) {
+                                               $style.data( 'ResourceLoaderDynamicStyleTag', cssText );
+                                       } else {
+                                               $style.data( 'ResourceLoaderDynamicStyleTag', true );
+                                       }
                                }
 
                                fireCallbacks();
                                var el = document.createElement( 'link' );
                                // Support: IE
                                // Insert in document *before* setting href
-                               getMarker().before( el );
+                               $( getMarker() ).before( el );
                                el.rel = 'stylesheet';
                                if ( media && media !== 'all' ) {
                                        el.media = media;
index 188af6a..147de92 100644 (file)
        cursor: pointer;
 
        opacity: 0;
-       -webkit-transform: translateX(35px);
-       transform: translateX(35px);
+       -webkit-transform: translateX( 35px );
+       transform: translateX( 35px );
        -webkit-transition: opacity 0.35s ease-in-out, -webkit-transform 0.35s ease-in-out;
        transition: opacity 0.35s ease-in-out, transform 0.35s ease-in-out;
 }
 
 .mw-notification-visible {
        opacity: 1;
-       -webkit-transform: translateX(0);
-       transform: translateX(0);
+       -webkit-transform: translateX( 0 );
+       transform: translateX( 0 );
 }
 
 .mw-notification-replaced {
        opacity: 0;
-       -webkit-transform: translateY(-35px);
-       transform: translateY(-35px);
+       -webkit-transform: translateY( -35px );
+       transform: translateY( -35px );
        pointer-events: none;
 }
 
 }
 
 .mw-notification-type-warn {
-       border-color: #F5BE00; /* yellow */
-       background-color: #FFFFE8;
+       border-color: #f5be00; /* yellow */
+       background-color: #ffffe8;
 }
 
 .mw-notification-type-error {
-       border-color: #EB3941; /* red */
-       background-color: #FFF8F8;
+       border-color: #eb3941; /* red */
+       background-color: #fff8f8;
 }
index df144ce..ce3cfbd 100644 (file)
@@ -4,7 +4,7 @@
 .suggestions a.mw-searchSuggest-link:hover,
 .suggestions a.mw-searchSuggest-link:active,
 .suggestions a.mw-searchSuggest-link:focus {
-       color: black;
+       color: #000;
        text-decoration: none;
 }
 
@@ -12,7 +12,7 @@
 .suggestions-result-current a.mw-searchSuggest-link:hover,
 .suggestions-result-current a.mw-searchSuggest-link:active,
 .suggestions-result-current a.mw-searchSuggest-link:focus {
-       color: white;
+       color: #fff;
 }
 
 .suggestions a.mw-searchSuggest-link .special-query {
index cccc468..8dc8a61 100644 (file)
                                RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])',
                                RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
 
-                       return address.search( new RegExp( '^' + RE_IP_ADD + block + '$' ) ) !== -1;
+                       return ( new RegExp( '^' + RE_IP_ADD + block + '$' ).test( address ) );
                },
 
                /**
                        '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' +
                        ')';
 
-                       if ( address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) !== -1 ) {
+                       if ( new RegExp( '^' + RE_IPV6_ADD + block + '$' ).test( address ) ) {
                                return true;
                        }
 
-                       RE_IPV6_ADD = // contains one "::" in the middle (single '::' check below)
-                               '[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}';
+                       // contains one "::" in the middle (single '::' check below)
+                       RE_IPV6_ADD = '[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}';
 
-                       return address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) !== -1
-                               && address.search( /::/ ) !== -1 && address.search( /::.*::/ ) === -1;
+                       return (
+                               new RegExp( '^' + RE_IPV6_ADD + block + '$' ).test( address )
+                               && /::/.test( address )
+                               && !/::.*::/.test( address )
+                       );
                },
 
                /**
index 3c80bbb..4d43e6a 100644 (file)
@@ -84,7 +84,7 @@ ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
 ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
 ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
        position: absolute;
-       background: white;
+       background: #fff;
        background: rgba(255, 255, 255, 0.8);
        padding: 5px 10px;
        bottom: 0;
index a63202f..e78bd4e 100644 (file)
@@ -12,9 +12,9 @@
                return;
        }
        $( function () {
-               var $patrolLinks = $( '.patrollink a' );
+               var $patrolLinks = $( '.patrollink[data-mw="interface"] a' );
                $patrolLinks.on( 'click', function ( e ) {
-                       var $spinner, href, rcid, apiRequest;
+                       var $spinner, rcid, apiRequest;
 
                        // Start preloading the notification module (normally loaded by mw.notify())
                        mw.loader.load( 'mediawiki.notification' );
@@ -26,8 +26,7 @@
                        } );
                        $( this ).hide().after( $spinner );
 
-                       href = $( this ).attr( 'href' );
-                       rcid = mw.util.getParamValue( 'rcid', href );
+                       rcid = mw.util.getParamValue( 'rcid', this.href );
                        apiRequest = new mw.Api();
 
                        apiRequest.postWithToken( 'patrol', {
diff --git a/resources/src/moment-dmy.js b/resources/src/moment-dmy.js
new file mode 100644 (file)
index 0000000..c67b93e
--- /dev/null
@@ -0,0 +1,16 @@
+// Use DMY date format for Moment.js, in accordance with MediaWiki's date formatting routines.
+// This affects English only (and languages without localisations, that fall back to English).
+// http://momentjs.com/docs/#/customization/long-date-formats/
+/*global moment */
+moment.locale( 'en', {
+       longDateFormat: {
+               // Unchanged, but have to be repeated here:
+               LT: 'h:mm A',
+               LTS: 'h:mm:ss A',
+               // Customized:
+               L: 'DD/MM/YYYY',
+               LL: 'D MMMM YYYY',
+               LLL: 'D MMMM YYYY LT',
+               LLLL: 'dddd, D MMMM YYYY LT'
+       }
+} );
index d49fcdc..9af0598 100644 (file)
@@ -1,19 +1,4 @@
-// Use DMY date format for Moment.js, in accordance with MediaWiki's date formatting routines.
-// This affects English only (and languages without localisations, that fall back to English).
-// http://momentjs.com/docs/#/customization/long-date-formats/
 /*global moment, mw */
-moment.locale( 'en', {
-       longDateFormat: {
-               // Unchanged, but have to be repeated here:
-               LT: 'h:mm A',
-               LTS: 'h:mm:ss A',
-               // Customized:
-               L: 'DD/MM/YYYY',
-               LL: 'D MMMM YYYY',
-               LLL: 'D MMMM YYYY LT',
-               LLLL: 'dddd, D MMMM YYYY LT'
-       }
-} );
 
 // HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
 // wgTranslateNumerals is respected.
index ade6914..0a5d3cd 100644 (file)
@@ -1,4 +1,4 @@
-@chrome @firefox @vagrant
+@chrome @firefox @skip @vagrant
 Feature: Edit Page
 
   Scenario: Create and edit page
index 95136d2..8e72bcf 100644 (file)
@@ -1,4 +1,4 @@
-@chrome @firefox @vagrant
+@chrome @firefox @skip @vagrant
 Feature: View History
 
   Scenario: Edit page and view history
index 7051b4f..5fffde3 100644 (file)
@@ -2265,6 +2265,15 @@ Entities inside <pre>
 
 !! end
 
+!! test
+<nowiki> inside of #tag:pre
+!! wikitext
+{{#tag:pre|Foo <nowiki>&rarr;bar</nowiki>}}
+!! html
+<pre>Foo &#8594;bar</pre>
+
+!! end
+
 !! test
 <nowiki> and <pre> preference (first one wins)
 !! wikitext
@@ -13150,7 +13159,7 @@ Image with link parameter, wgExternalLinkTarget
 !! config
 wgExternalLinkTarget='foobar'
 !! html/php
-<p><a href="http://example.com/" target="foobar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" target="foobar" rel="nofollow noreferrer noopener"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
@@ -13184,7 +13193,7 @@ Image with link parameter, wgExternalLinkTarget, unnamed parameter
 !! config
 wgExternalLinkTarget='foobar'
 !! html/php
-<p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow noreferrer noopener"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
index 9f3aa11..9672cdc 100644 (file)
@@ -221,6 +221,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $defaultOverrides->set( 'ObjectCaches', $objectCaches );
                $defaultOverrides->set( 'MainCacheType', CACHE_NONE );
 
+               // Use a fast hash algorithm to hash passwords.
+               $defaultOverrides->set( 'PasswordDefault', 'A' );
+
                $testConfig = $customOverrides
                        ? new MultiConfig( [ $customOverrides, $defaultOverrides, $baseConfig ] )
                        : new MultiConfig( [ $defaultOverrides, $baseConfig ] );
@@ -597,6 +600,29 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
+       /**
+        * Check if we can back up a value by performing a shallow copy.
+        * Values which fail this test are copied recursively.
+        *
+        * @param mixed $value
+        * @return bool True if a shallow copy will do; false if a deep copy
+        *  is required.
+        */
+       private static function canShallowCopy( $value ) {
+               if ( is_scalar( $value ) || $value === null ) {
+                       return true;
+               }
+               if ( is_array( $value ) ) {
+                       foreach ( $value as $subValue ) {
+                               if ( !is_scalar( $subValue ) && $subValue !== null ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               }
+               return false;
+       }
+
        /**
         * Stashes the global, will be restored in tearDown()
         *
@@ -632,13 +658,22 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                // NOTE: we serialize then unserialize the value in case it is an object
                                // this stops any objects being passed by reference. We could use clone
                                // and if is_object but this does account for objects within objects!
-                               try {
-                                       $this->mwGlobals[$globalKey] = unserialize( serialize( $GLOBALS[$globalKey] ) );
-                               }
-                                       // NOTE; some things such as Closures are not serializable
-                                       // in this case just set the value!
-                               catch ( Exception $e ) {
+                               if ( self::canShallowCopy( $GLOBALS[$globalKey] ) ) {
                                        $this->mwGlobals[$globalKey] = $GLOBALS[$globalKey];
+                               } elseif (
+                                       // Many MediaWiki types are safe to clone. These are the
+                                       // ones that are most commonly stashed.
+                                       $GLOBALS[$globalKey] instanceof Language ||
+                                       $GLOBALS[$globalKey] instanceof User ||
+                                       $GLOBALS[$globalKey] instanceof FauxRequest
+                               ) {
+                                       $this->mwGlobals[$globalKey] = clone $GLOBALS[$globalKey];
+                               } else {
+                                       try {
+                                               $this->mwGlobals[$globalKey] = unserialize( serialize( $GLOBALS[$globalKey] ) );
+                                       } catch ( Exception $e ) {
+                                               $this->mwGlobals[$globalKey] = $GLOBALS[$globalKey];
+                                       }
                                }
                        }
                }
index a01f2f5..4721793 100644 (file)
@@ -46,7 +46,7 @@ class HtmlTest extends MediaWikiTestCase {
                $this->assertEquals(
                        '<img/>',
                        Html::element( 'img', null, '' ),
-                       'No close tag for short-tag elements'
+                       'Self-closing tag for short-tag elements'
                );
 
                $this->assertEquals(
@@ -60,12 +60,6 @@ class HtmlTest extends MediaWikiTestCase {
                        Html::element( 'element', [], '' ),
                        'Close tag for empty element (array, string)'
                );
-
-               $this->assertEquals(
-                       '<img/>',
-                       Html::element( 'img', null, '' ),
-                       'Self-closing tag for short-tag elements'
-               );
        }
 
        public function dataXmlMimeType() {
@@ -140,12 +134,6 @@ class HtmlTest extends MediaWikiTestCase {
                        Html::expandAttributes( [ 'selected' ] ),
                        'Boolean attributes have no value when value is true (passed as numerical array)'
                );
-
-               $this->assertEquals(
-                       ' selected=""',
-                       Html::expandAttributes( [ 'selected' => true ] ),
-                       'Boolean attributes have empty string value when value is true'
-               );
        }
 
        /**
index 6edf034..1bf8729 100644 (file)
@@ -15,8 +15,10 @@ class LinkerTest extends MediaWikiLangTestCase {
                        'wgArticlePath' => '/wiki/$1',
                ] );
 
-               $this->assertEquals( $expected,
-                       Linker::userLink( $userId, $userName, $altUserName, $msg )
+               $this->assertEquals(
+                       $expected,
+                       Linker::userLink( $userId, $userName, $altUserName ),
+                       $msg
                );
        }
 
index 51ef9d7..0e646ea 100644 (file)
@@ -1,6 +1,9 @@
 <?php
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
+use MediaWiki\Interwiki\InterwikiLookup;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Services\DestructibleService;
+use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceDisabledException;
 
 /**
@@ -8,7 +11,7 @@ use MediaWiki\Services\ServiceDisabledException;
  *
  * @group MediaWiki
  */
-class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
+class MediaWikiServicesTest extends MediaWikiTestCase {
 
        /**
         * @return Config
@@ -65,9 +68,69 @@ class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
+               $service1 = $this->getMock( SalvageableService::class );
+               $service1->expects( $this->never() )
+                       ->method( 'salvage' );
+
+               $newServices->defineService(
+                       'Test',
+                       function() use ( $service1 ) {
+                               return $service1;
+                       }
+               );
+
+               // force instantiation
+               $newServices->getService( 'Test' );
+
                MediaWikiServices::resetGlobalInstance( $this->newTestConfig() );
                $theServices = MediaWikiServices::getInstance();
 
+               $this->assertSame(
+                       $service1,
+                       $theServices->getService( 'Test' ),
+                       'service definition should survive reset'
+               );
+
+               $this->assertNotSame( $theServices, $newServices );
+               $this->assertNotSame( $theServices, $oldServices );
+
+               MediaWikiServices::forceGlobalInstance( $oldServices );
+       }
+
+       public function testResetGlobalInstance_quick() {
+               $newServices = $this->newMediaWikiServices();
+               $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
+
+               $service1 = $this->getMock( SalvageableService::class );
+               $service1->expects( $this->never() )
+                       ->method( 'salvage' );
+
+               $service2 = $this->getMock( SalvageableService::class );
+               $service2->expects( $this->once() )
+                       ->method( 'salvage' )
+                       ->with( $service1 );
+
+               // sequence of values the instantiator will return
+               $instantiatorReturnValues = [
+                       $service1,
+                       $service2,
+               ];
+
+               $newServices->defineService(
+                       'Test',
+                       function() use ( &$instantiatorReturnValues ) {
+                               return array_shift( $instantiatorReturnValues );
+                       }
+               );
+
+               // force instantiation
+               $newServices->getService( 'Test' );
+
+               MediaWikiServices::resetGlobalInstance( $this->newTestConfig(), 'quick' );
+               $theServices = MediaWikiServices::getInstance();
+
+               $this->assertSame( $service2, $theServices->getService( 'Test' ) );
+
                $this->assertNotSame( $theServices, $newServices );
                $this->assertNotSame( $theServices, $oldServices );
 
@@ -109,35 +172,42 @@ class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
                }
 
                MediaWikiServices::forceGlobalInstance( $oldServices );
+               $newServices->destroy();
        }
 
        public function testResetChildProcessServices() {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
-               $lbFactory = $this->getMockBuilder( 'LBFactorySimple' )
-                       ->disableOriginalConstructor()
-                       ->getMock();
+               $service1 = $this->getMock( DestructibleService::class );
+               $service1->expects( $this->once() )
+                       ->method( 'destroy' );
 
-               $lbFactory->expects( $this->once() )
+               $service2 = $this->getMock( DestructibleService::class );
+               $service2->expects( $this->never() )
                        ->method( 'destroy' );
 
-               $newServices->redefineService(
-                       'DBLoadBalancerFactory',
-                       function() use ( $lbFactory ) {
-                               return $lbFactory;
+               // sequence of values the instantiator will return
+               $instantiatorReturnValues = [
+                       $service1,
+                       $service2,
+               ];
+
+               $newServices->defineService(
+                       'Test',
+                       function() use ( &$instantiatorReturnValues ) {
+                               return array_shift( $instantiatorReturnValues );
                        }
                );
 
                // force the service to become active, so we can check that it does get destroyed
-               $oldLBFactory = $newServices->getService( 'DBLoadBalancerFactory' );
+               $oldTestService = $newServices->getService( 'Test' );
 
                MediaWikiServices::resetChildProcessServices();
                $finalServices = MediaWikiServices::getInstance();
 
-               $newLBFactory = $finalServices->getService( 'DBLoadBalancerFactory' );
-
-               $this->assertNotSame( $oldLBFactory, $newLBFactory );
+               $newTestService = $finalServices->getService( 'Test' );
+               $this->assertNotSame( $oldTestService, $newTestService );
 
                MediaWikiServices::forceGlobalInstance( $oldServices );
        }
@@ -235,6 +305,7 @@ class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
                        'SiteStore' => [ 'SiteStore', SiteStore::class ],
                        'SiteLookup' => [ 'SiteLookup', SiteLookup::class ],
                        'StatsdDataFactory' => [ 'StatsdDataFactory', StatsdDataFactory::class ],
+                       'InterwikiLookup' => [ 'InterwikiLookup', InterwikiLookup::class ],
                        'EventRelayerGroup' => [ 'EventRelayerGroup', EventRelayerGroup::class ],
                        'SearchEngineFactory' => [ 'SearchEngineFactory', SearchEngineFactory::class ],
                        'SearchEngineConfig' => [ 'SearchEngineConfig', SearchEngineConfig::class ],
index 933777c..f22e123 100644 (file)
@@ -166,6 +166,55 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( 'Bar!', $services->getService( 'Bar' ) );
        }
 
+       public function testImportWiring() {
+               $services = $this->newServiceContainer();
+
+               $wiring = [
+                       'Foo' => function() {
+                               return 'Foo!';
+                       },
+                       'Bar' => function() {
+                               return 'Bar!';
+                       },
+                       'Car' => function() {
+                               return 'FUBAR!';
+                       },
+               ];
+
+               $services->applyWiring( $wiring );
+
+               $newServices = $this->newServiceContainer();
+
+               // define a service before importing, so we can later check that
+               // existing service instances survive importWiring()
+               $newServices->defineService( 'Car', function() {
+                       return 'Car!';
+               } );
+
+               // force instantiation
+               $newServices->getService( 'Car' );
+
+               // Define another service, so we can later check that extra wiring
+               // is not lost.
+               $newServices->defineService( 'Xar', function() {
+                       return 'Xar!';
+               } );
+
+               // import wiring, but skip `Bar`
+               $newServices->importWiring( $services, [ 'Bar' ] );
+
+               $this->assertNotContains( 'Bar', $newServices->getServiceNames(), 'Skip `Bar` service' );
+               $this->assertSame( 'Foo!', $newServices->getService( 'Foo' ) );
+
+               // import all wiring, but preserve existing service instance
+               $newServices->importWiring( $services );
+
+               $this->assertContains( 'Bar', $newServices->getServiceNames(), 'Import all services' );
+               $this->assertSame( 'Bar!', $newServices->getService( 'Bar' ) );
+               $this->assertSame( 'Car!', $newServices->getService( 'Car' ), 'Use existing service instance' );
+               $this->assertSame( 'Xar!', $newServices->getService( 'Xar' ), 'Predefined services are kept' );
+       }
+
        public function testLoadWiringFiles() {
                $services = $this->newServiceContainer();
 
@@ -220,6 +269,27 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( $theService1, $services->getService( $name ) );
        }
 
+       public function testRedefineService_disabled() {
+               $services = $this->newServiceContainer( [ 'Foo' ] );
+
+               $theService1 = new stdClass();
+               $name = 'TestService92834576';
+
+               $services->defineService( $name, function() {
+                       return 'Foo';
+               } );
+
+               // disable the service. we should be able to redefine it anyway.
+               $services->disableService( $name );
+
+               $services->redefineService( $name, function() use ( $theService1 ) {
+                       return $theService1;
+               } );
+
+               // force instantiation, check result
+               $this->assertSame( $theService1, $services->getService( $name ) );
+       }
+
        public function testRedefineService_fail_undefined() {
                $services = $this->newServiceContainer();
 
@@ -294,13 +364,6 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $this->assertContains( 'Bar', $services->getServiceNames() );
                $this->assertContains( 'Qux', $services->getServiceNames() );
 
-               // re-enable Bar service
-               $services->redefineService( 'Bar', function() {
-                       return new stdClass();
-               } );
-
-               $services->getService( 'Bar' );
-
                $this->setExpectedException( 'MediaWiki\Services\ServiceDisabledException' );
                $services->getService( 'Qux' );
        }
index 142c77f..247b6e4 100644 (file)
@@ -129,17 +129,28 @@ class TestUser {
                        throw new MWException( "Passed User has not been added to the database yet!" );
                }
 
-               $passwordFactory = new PasswordFactory();
-               $passwordFactory->init( RequestContext::getMain()->getConfig() );
-               // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
-               $passwordFactory->setDefaultType( 'A' );
-               $pwhash = $passwordFactory->newFromPlaintext( $password );
-               wfGetDB( DB_MASTER )->update(
+               $dbw = wfGetDB( DB_MASTER );
+               $row = $dbw->selectRow(
                        'user',
-                       [ 'user_password' => $pwhash->toString() ],
+                       [ 'user_password' ],
                        [ 'user_id' => $user->getId() ],
                        __METHOD__
                );
+               if ( !$row ) {
+                       throw new MWException( "Passed User has an ID but is not in the database?" );
+               }
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               if ( !$passwordFactory->newFromCiphertext( $row->user_password )->equals( $password ) ) {
+                       $passwordHash = $passwordFactory->newFromPlaintext( $password );
+                       $dbw->update(
+                               'user',
+                               [ 'user_password' => $passwordHash->toString() ],
+                               [ 'user_id' => $user->getId() ],
+                               __METHOD__
+                       );
+               }
        }
 
        /**
index f34af61..61b62aa 100644 (file)
@@ -106,7 +106,7 @@ class WatchedItemStoreIntegrationTest extends MediaWikiTestCase {
                );
        }
 
-       public function testUpdateAndResetNotificationTimestamp() {
+       public function testUpdateResetAndSetNotificationTimestamp() {
                $user = $this->getUser();
                $otherUser = ( new TestUser( 'WatchedItemStoreIntegrationTestUser_otherUser' ) )->getUser();
                $title = Title::newFromText( 'WatchedItemStoreIntegrationTestPage' );
@@ -172,6 +172,24 @@ class WatchedItemStoreIntegrationTest extends MediaWikiTestCase {
                                [ [ $title, '20150202020202' ] ], $initialVisitingWatchers + 1
                        )
                );
+
+               // setNotificationTimestampsForUser specifying a title
+               $this->assertTrue(
+                       $store->setNotificationTimestampsForUser( $user, '20200202020202', [ $title ] )
+               );
+               $this->assertEquals(
+                       '20200202020202',
+                       $store->getWatchedItem( $user, $title )->getNotificationTimestamp()
+               );
+
+               // setNotificationTimestampsForUser not specifying a title
+               $this->assertTrue(
+                       $store->setNotificationTimestampsForUser( $user, '20210202020202' )
+               );
+               $this->assertEquals(
+                       '20210202020202',
+                       $store->getWatchedItem( $user, $title )->getNotificationTimestamp()
+               );
        }
 
        public function testDuplicateAllAssociatedEntries() {
index 6c4a6f0..2d2e726 100644 (file)
@@ -2366,6 +2366,81 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                ScopedCallback::consume( $scopedOverrideRevision );
        }
 
+       public function testSetNotificationTimestampsForUser_anonUser() {
+               $store = $this->newWatchedItemStore(
+                       $this->getMockLoadBalancer( $this->getMockDb() ),
+                       $this->getMockCache()
+               );
+               $this->assertFalse( $store->setNotificationTimestampsForUser( $this->getAnonUser(), '' ) );
+       }
+
+       public function testSetNotificationTimestampsForUser_allRows() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+               $timestamp = '20100101010101';
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'update' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_notificationtimestamp' => 'TS' . $timestamp . 'TS' ],
+                               [ 'wl_user' => 1 ]
+                       )
+                       ->will( $this->returnValue( true ) );
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'timestamp' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return 'TS' . $value . 'TS';
+                       } ) );
+
+               $store = $this->newWatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $this->getMockCache()
+               );
+
+               $this->assertTrue(
+                       $store->setNotificationTimestampsForUser( $user, $timestamp )
+               );
+       }
+
+       public function testSetNotificationTimestampsForUser_specificTargets() {
+               $user = $this->getMockNonAnonUserWithId( 1 );
+               $timestamp = '20100101010101';
+               $targets = [ new TitleValue( 0, 'Foo' ), new TitleValue( 0, 'Bar' ) ];
+
+               $mockDb = $this->getMockDb();
+               $mockDb->expects( $this->once() )
+                       ->method( 'update' )
+                       ->with(
+                               'watchlist',
+                               [ 'wl_notificationtimestamp' => 'TS' . $timestamp . 'TS' ],
+                               [ 'wl_user' => 1, 0 => 'makeWhereFrom2d return value' ]
+                       )
+                       ->will( $this->returnValue( true ) );
+               $mockDb->expects( $this->exactly( 1 ) )
+                       ->method( 'timestamp' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return 'TS' . $value . 'TS';
+                       } ) );
+               $mockDb->expects( $this->once() )
+                       ->method( 'makeWhereFrom2d' )
+                       ->with(
+                               [ [ 'Foo' => 1, 'Bar' => 1 ] ],
+                               $this->isType( 'string' ),
+                               $this->isType( 'string' )
+                       )
+                       ->will( $this->returnValue( 'makeWhereFrom2d return value' ) );
+
+               $store = $this->newWatchedItemStore(
+                       $this->getMockLoadBalancer( $mockDb ),
+                       $this->getMockCache()
+               );
+
+               $this->assertTrue(
+                       $store->setNotificationTimestampsForUser( $user, $timestamp, $targets )
+               );
+       }
+
        public function testUpdateNotificationTimestamp_watchersExist() {
                $mockDb = $this->getMockDb();
                $mockDb->expects( $this->once() )
index e9afd45..2f8ffcc 100644 (file)
@@ -228,8 +228,7 @@ class ApiLoginTest extends ApiTestCase {
                $passwordFactory = new PasswordFactory();
                $passwordFactory->init( RequestContext::getMain()->getConfig() );
                // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
-               $passwordFactory->setDefaultType( 'A' );
-               $pwhash = $passwordFactory->newFromPlaintext( 'foobaz' );
+               $passwordHash = $passwordFactory->newFromPlaintext( 'foobaz' );
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->insert(
@@ -237,7 +236,7 @@ class ApiLoginTest extends ApiTestCase {
                        [
                                'bp_user' => $centralId,
                                'bp_app_id' => 'foo',
-                               'bp_password' => $pwhash->toString(),
+                               'bp_password' => $passwordHash->toString(),
                                'bp_token' => '',
                                'bp_restrictions' => MWRestrictions::newDefault()->toJson(),
                                'bp_grants' => '["test"]',
index 06e7962..334e3b8 100644 (file)
@@ -253,4 +253,33 @@ class ApiMainTest extends ApiTestCase {
                ];
        }
 
+       /**
+        * @covers ApiMain::lacksSameOriginSecurity
+        */
+       public function testLacksSameOriginSecurity() {
+               // Basic test
+               $main = new ApiMain( new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] ) );
+               $this->assertFalse( $main->lacksSameOriginSecurity(), 'Basic test, should have security' );
+
+               // JSONp
+               $main = new ApiMain(
+                       new FauxRequest( [ 'action' => 'query', 'format' => 'xml', 'callback' => 'foo' ] )
+               );
+               $this->assertTrue( $main->lacksSameOriginSecurity(), 'JSONp, should lack security' );
+
+               // Header
+               $request = new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] );
+               $request->setHeader( 'TrEaT-As-UnTrUsTeD', '' ); // With falsey value!
+               $main = new ApiMain( $request );
+               $this->assertTrue( $main->lacksSameOriginSecurity(), 'Header supplied, should lack security' );
+
+               // Hook
+               $this->mergeMwGlobalArrayValue( 'wgHooks', [
+                       'RequestHasSameOriginSecurity' => [ function () {
+                               return false;
+                       } ]
+               ] );
+               $main = new ApiMain( new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] ) );
+               $this->assertTrue( $main->lacksSameOriginSecurity(), 'Hook, should lack security' );
+       }
 }
diff --git a/tests/phpunit/includes/api/ApiSetNotificationTimestampIntegrationTest.php b/tests/phpunit/includes/api/ApiSetNotificationTimestampIntegrationTest.php
new file mode 100644 (file)
index 0000000..ef4f513
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @author Addshore
+ * @covers ApiSetNotificationTimestamp
+ * @group API
+ * @group medium
+ * @group Database
+ */
+class ApiSetNotificationTimestampIntegrationTest extends ApiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               self::$users[__CLASS__] = new TestUser( __CLASS__ );
+               $this->doLogin( __CLASS__ );
+       }
+
+       public function testStuff() {
+               $user = self::$users[__CLASS__]->getUser();
+               $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
+
+               $user->addWatch( $page->getTitle() );
+
+               $result = $this->doApiRequestWithToken(
+                       [
+                               'action' => 'setnotificationtimestamp',
+                               'timestamp' => '20160101020202',
+                               'pageids' => $page->getId(),
+                       ],
+                       null,
+                       $user
+               );
+
+               $this->assertEquals(
+                       [
+                               'batchcomplete' => true,
+                               'setnotificationtimestamp' => [
+                                       [ 'ns' => 0, 'title' => 'UTPage', 'notificationtimestamp' => '2016-01-01T02:02:02Z' ]
+                               ],
+                       ],
+                       $result[0]
+               );
+
+               $watchedItemStore = MediaWikiServices::getInstance()->getWatchedItemStore();
+               $this->assertEquals(
+                       $watchedItemStore->getNotificationTimestampsBatch( $user, [ $page->getTitle() ] ),
+                       [ [ 'UTPage' => '20160101020202' ] ]
+               );
+       }
+
+}
index 8437228..7eb2a35 100644 (file)
@@ -67,7 +67,7 @@ class ApiFormatJsonTest extends ApiFormatTestBase {
                                [ [ 1 ], '/**/myCallback([1])', [ 'callback' => 'myCallback' ] ],
 
                                // Cross-domain mangling
-                               [ [ '< Cross-Domain-Policy >' ], '["\u003C Cross-Domain-Policy \u003E"]' ],
+                               [ [ '< Cross-Domain-Policy >' ], '["\u003C Cross-Domain-Policy >"]' ],
                        ] ),
                        self::addFormatVersion( 2, [
                                // Basic types
@@ -121,7 +121,7 @@ class ApiFormatJsonTest extends ApiFormatTestBase {
                                [ [ 1 ], '/**/myCallback([1])', [ 'callback' => 'myCallback' ] ],
 
                                // Cross-domain mangling
-                               [ [ '< Cross-Domain-Policy >' ], '["\u003C Cross-Domain-Policy \u003E"]' ],
+                               [ [ '< Cross-Domain-Policy >' ], '["\u003C Cross-Domain-Policy >"]' ],
                        ] )
                );
        }
index 2c1d1e6..f42cb95 100644 (file)
@@ -44,6 +44,42 @@ class ConfigFactoryTest extends MediaWikiTestCase {
                $this->assertNotSame( $config1, $config2 );
        }
 
+       /**
+        * @covers ConfigFactory::register
+        */
+       public function testSalvage() {
+               $oldFactory = new ConfigFactory();
+               $oldFactory->register( 'foo', 'GlobalVarConfig::newInstance' );
+               $oldFactory->register( 'bar', 'GlobalVarConfig::newInstance' );
+               $oldFactory->register( 'quux', 'GlobalVarConfig::newInstance' );
+
+               // instantiate two of the three defined configurations
+               $foo = $oldFactory->makeConfig( 'foo' );
+               $bar = $oldFactory->makeConfig( 'bar' );
+               $quux = $oldFactory->makeConfig( 'quux' );
+
+               // define new config instance
+               $newFactory = new ConfigFactory();
+               $newFactory->register( 'foo', 'GlobalVarConfig::newInstance' );
+               $newFactory->register( 'bar', function() {
+                       return new HashConfig();
+               } );
+
+               // "foo" and "quux" are defined in the old and the new factory.
+               // The old factory has instances for "foo" and "bar", but not "quux".
+               $newFactory->salvage( $oldFactory );
+
+               $newFoo = $newFactory->makeConfig( 'foo' );
+               $this->assertSame( $foo, $newFoo, 'existing instance should be salvaged' );
+
+               $newBar = $newFactory->makeConfig( 'bar' );
+               $this->assertNotSame( $bar, $newBar, 'don\'t salvage if callbacks differ' );
+
+               // the new factory doesn't have quux defined, so the quux instance should not be salvaged
+               $this->setExpectedException( 'ConfigException' );
+               $newFactory->makeConfig( 'quux' );
+       }
+
        /**
         * @covers ConfigFactory::register
         */
index 9c2bc75..5c65483 100644 (file)
@@ -4,20 +4,20 @@ class MWDebugTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               // Make sure MWDebug class is enabled
-               static $MWDebugEnabled = false;
-               if ( !$MWDebugEnabled ) {
-                       MWDebug::init();
-                       $MWDebugEnabled = true;
-               }
                /** Clear log before each test */
                MWDebug::clearLog();
+       }
+
+       public static function setUpBeforeClass() {
+               parent::setUpBeforeClass();
+               MWDebug::init();
                MediaWiki\suppressWarnings();
        }
 
-       protected function tearDown() {
+       public static function tearDownAfterClass() {
+               parent::tearDownAfterClass();
+               MWDebug::deinit();
                MediaWiki\restoreWarnings();
-               parent::tearDown();
        }
 
        /**
diff --git a/tests/phpunit/includes/interwiki/ClassicInterwikiLookupTest.php b/tests/phpunit/includes/interwiki/ClassicInterwikiLookupTest.php
new file mode 100644 (file)
index 0000000..db6d002
--- /dev/null
@@ -0,0 +1,236 @@
+<?php
+/**
+ * @covers MediaWiki\Interwiki\ClassicInterwikiLookup
+ *
+ * @group MediaWiki
+ * @group Database
+ */
+class ClassicInterwikiLookupTest extends MediaWikiTestCase {
+
+       private function populateDB( $iwrows ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'interwiki', '*', __METHOD__ );
+               $dbw->insert( 'interwiki', array_values( $iwrows ), __METHOD__ );
+               $this->tablesUsed[] = 'interwiki';
+       }
+
+       public function testDatabaseStorage() {
+               // NOTE: database setup is expensive, so we only do
+               //  it once and run all the tests in one go.
+               $dewiki = [
+                       'iw_prefix' => 'de',
+                       'iw_url' => 'http://de.wikipedia.org/wiki/',
+                       'iw_api' => 'http://de.wikipedia.org/w/api.php',
+                       'iw_wikiid' => 'dewiki',
+                       'iw_local' => 1,
+                       'iw_trans' => 0
+               ];
+
+               $zzwiki = [
+                       'iw_prefix' => 'zz',
+                       'iw_url' => 'http://zzwiki.org/wiki/',
+                       'iw_api' => 'http://zzwiki.org/w/api.php',
+                       'iw_wikiid' => 'zzwiki',
+                       'iw_local' => 0,
+                       'iw_trans' => 0
+               ];
+
+               $this->populateDB( [ $dewiki, $zzwiki ] );
+               $lookup = new \MediaWiki\Interwiki\ClassicInterwikiLookup(
+                       Language::factory( 'en' ),
+                       WANObjectCache::newEmpty(),
+                       60*60,
+                       false,
+                       3,
+                       'en'
+               );
+
+               $this->assertEquals(
+                       [ $dewiki, $zzwiki ],
+                       $lookup->getAllPrefixes(),
+                       'getAllPrefixes()'
+               );
+               $this->assertEquals(
+                       [ $dewiki ],
+                       $lookup->getAllPrefixes( true ),
+                       'getAllPrefixes()'
+               );
+               $this->assertEquals(
+                       [ $zzwiki ],
+                       $lookup->getAllPrefixes( false ),
+                       'getAllPrefixes()'
+               );
+
+               $this->assertTrue( $lookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertFalse( $lookup->isValidInterwiki( 'xyz' ), 'unknown prefix is valid' );
+
+               $this->assertNull( $lookup->fetch( null ), 'no prefix' );
+               $this->assertFalse( $lookup->fetch( 'xyz' ), 'unknown prefix' );
+
+               $interwiki = $lookup->fetch( 'de' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+               $this->assertSame( $interwiki, $lookup->fetch( 'de' ), 'in-process caching' );
+
+               $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( 'http://de.wikipedia.org/w/api.php', $interwiki->getAPI(), 'getAPI' );
+               $this->assertSame( 'dewiki', $interwiki->getWikiID(), 'getWikiID' );
+               $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
+               $this->assertSame( false, $interwiki->isTranscludable(), 'isTranscludable' );
+
+               $lookup->invalidateCache( 'de' );
+               $this->assertNotSame( $interwiki, $lookup->fetch( 'de' ), 'invalidate cache' );
+       }
+
+       /**
+        * @param string $thisSite
+        * @param string[] $local
+        * @param string[] $global
+        *
+        * @return string[]
+        */
+       private function populateHash( $thisSite, $local, $global ) {
+               $hash = [];
+               $hash[ '__sites:' . wfWikiID() ] = $thisSite;
+
+               $globals = [];
+               $locals = [];
+
+               foreach ( $local as $row ) {
+                       $prefix = $row['iw_prefix'];
+                       $data = $row['iw_local'] . ' ' . $row['iw_url'];
+                       $locals[] = $prefix;
+                       $hash[ "_{$thisSite}:{$prefix}" ] = $data;
+               }
+
+               foreach ( $global as $row ) {
+                       $prefix = $row['iw_prefix'];
+                       $data = $row['iw_local'] . ' ' . $row['iw_url'];
+                       $globals[] = $prefix;
+                       $hash[ "__global:{$prefix}" ] = $data;
+               }
+
+               $hash[ '__list:__global' ] = implode( ' ', $globals );
+               $hash[ '__list:_' . $thisSite ] = implode( ' ', $locals );
+
+               return $hash;
+       }
+
+       private function populateCDB( $thisSite, $local, $global ) {
+               $cdbFile = tempnam( wfTempDir(), 'MW-ClassicInterwikiLookupTest-' ) . '.cdb';
+               $cdb = \Cdb\Writer::open( $cdbFile );
+
+               $hash = $this->populateHash( $thisSite, $local, $global );
+
+               foreach ( $hash as $key => $value ) {
+                       $cdb->set( $key, $value );
+               }
+
+               $cdb->close();
+               return $cdbFile;
+       }
+
+       public function testCDBStorage() {
+               // NOTE: CDB setup is expensive, so we only do
+               //  it once and run all the tests in one go.
+
+               $dewiki = [
+                       'iw_prefix' => 'de',
+                       'iw_url' => 'http://de.wikipedia.org/wiki/',
+                       'iw_local' => 1
+               ];
+
+               $zzwiki = [
+                       'iw_prefix' => 'zz',
+                       'iw_url' => 'http://zzwiki.org/wiki/',
+                       'iw_local' => 0
+               ];
+
+               $cdbFile = $this->populateCDB(
+                       'en',
+                       [ $dewiki ],
+                       [ $zzwiki ]
+               );
+               $lookup = new \MediaWiki\Interwiki\ClassicInterwikiLookup(
+                       Language::factory( 'en' ),
+                       WANObjectCache::newEmpty(),
+                       60*60,
+                       $cdbFile,
+                       3,
+                       'en'
+               );
+
+               $this->assertEquals(
+                       [ $dewiki, $zzwiki ],
+                       $lookup->getAllPrefixes(),
+                       'getAllPrefixes()'
+               );
+
+               $this->assertTrue( $lookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertTrue( $lookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
+
+               $interwiki = $lookup->fetch( 'de' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+               $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
+
+               $interwiki = $lookup->fetch( 'zz' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+               $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
+
+               // cleanup temp file
+               unlink( $cdbFile );
+       }
+
+       public function testArrayStorage() {
+               $dewiki = [
+                       'iw_prefix' => 'de',
+                       'iw_url' => 'http://de.wikipedia.org/wiki/',
+                       'iw_local' => 1
+               ];
+
+               $zzwiki = [
+                       'iw_prefix' => 'zz',
+                       'iw_url' => 'http://zzwiki.org/wiki/',
+                       'iw_local' => 0
+               ];
+
+               $hash = $this->populateHash(
+                       'en',
+                       [ $dewiki ],
+                       [ $zzwiki ]
+               );
+               $lookup = new \MediaWiki\Interwiki\ClassicInterwikiLookup(
+                       Language::factory( 'en' ),
+                       WANObjectCache::newEmpty(),
+                       60*60,
+                       $hash,
+                       3,
+                       'en'
+               );
+
+               $this->assertEquals(
+                       [ $dewiki, $zzwiki ],
+                       $lookup->getAllPrefixes(),
+                       'getAllPrefixes()'
+               );
+
+               $this->assertTrue( $lookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertTrue( $lookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
+
+               $interwiki = $lookup->fetch( 'de' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+               $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
+
+               $interwiki = $lookup->fetch( 'zz' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+               $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
+       }
+
+}
index 411d6a3..137dfb7 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * @covers Interwiki
  *
@@ -47,7 +49,15 @@ class InterwikiTest extends MediaWikiTestCase {
                $this->tablesUsed[] = 'interwiki';
        }
 
+       private function setWgInterwikiCache( $interwikiCache ) {
+               $this->overrideMwServices();
+               MediaWikiServices::getInstance()->resetServiceForTesting( 'InterwikiLookup' );
+               $this->setMwGlobals( 'wgInterwikiCache', $interwikiCache );
+       }
+
        public function testDatabaseStorage() {
+               $this->markTestSkipped( 'Needs I37b8e8018b3 <https://gerrit.wikimedia.org/r/#/c/270555/>' );
+
                // NOTE: database setup is expensive, so we only do
                //  it once and run all the tests in one go.
                $dewiki = [
@@ -70,8 +80,7 @@ class InterwikiTest extends MediaWikiTestCase {
 
                $this->populateDB( [ $dewiki, $zzwiki ] );
 
-               Interwiki::resetLocalCache();
-               $this->setMwGlobals( 'wgInterwikiCache', false );
+               $this->setWgInterwikiCache( false );
 
                $this->assertEquals(
                        [ $dewiki, $zzwiki ],
@@ -179,8 +188,7 @@ class InterwikiTest extends MediaWikiTestCase {
                        [ $zzwiki ]
                );
 
-               Interwiki::resetLocalCache();
-               $this->setMwGlobals( 'wgInterwikiCache', $cdbFile );
+               $this->setWgInterwikiCache( $cdbFile );
 
                $this->assertEquals(
                        [ $dewiki, $zzwiki ],
@@ -226,8 +234,7 @@ class InterwikiTest extends MediaWikiTestCase {
                        [ $zzwiki ]
                );
 
-               Interwiki::resetLocalCache();
-               $this->setMwGlobals( 'wgInterwikiCache', $cdbData );
+               $this->setWgInterwikiCache( $cdbData );
 
                $this->assertEquals(
                        [ $dewiki, $zzwiki ],
index edab0dc..d4b1587 100644 (file)
@@ -65,9 +65,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
        public function addDBDataOnce() {
                $passwordFactory = new \PasswordFactory();
                $passwordFactory->init( \RequestContext::getMain()->getConfig() );
-               // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
-               $passwordFactory->setDefaultType( 'A' );
-               $pwhash = $passwordFactory->newFromPlaintext( 'foobaz' );
+               $passwordHash = $passwordFactory->newFromPlaintext( 'foobaz' );
 
                $userId = \CentralIdLookup::factory( 'local' )->centralIdFromName( 'UTSysop' );
 
@@ -82,7 +80,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                        [
                                'bp_user' => $userId,
                                'bp_app_id' => 'BotPasswordSessionProvider',
-                               'bp_password' => $pwhash->toString(),
+                               'bp_password' => $passwordHash->toString(),
                                'bp_token' => 'token!',
                                'bp_restrictions' => '{"IPAddresses":["127.0.0.0/8"]}',
                                'bp_grants' => '["test"]',
index ee74957..287af29 100644 (file)
@@ -374,7 +374,12 @@ class UploadBaseTest extends MediaWikiTestCase {
                                false,
                                'SVG with external entity'
                        ],
-
+                       [
+                               "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"> <g> <a xlink:href=\"javascript:alert('1&#10;https://google.com')\"> <rect width=\"300\" height=\"100\" style=\"fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,2)\" /> </a> </g> </svg>",
+                               true,
+                               true,
+                               'SVG with javascript <a> link with newline (T122653)'
+                       ],
                        // Test good, but strange files that we want to allow
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g> <a xlink:href="http://en.wikipedia.org/wiki/Main_Page"> <path transform="translate(0,496)" id="path6706" d="m 112.09375,107.6875 -5.0625,3.625 -4.3125,5.03125 -0.46875,0.5 -4.09375,3.34375 -9.125,5.28125 -8.625,-3.375 z" style="fill:#cccccc;fill-opacity:1;stroke:#6e6e6e;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;display:inline" /> </a> </g> </svg>',
index 27ce287..629c6e5 100644 (file)
@@ -49,9 +49,7 @@ class BotPasswordTest extends MediaWikiTestCase {
        public function addDBData() {
                $passwordFactory = new \PasswordFactory();
                $passwordFactory->init( \RequestContext::getMain()->getConfig() );
-               // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
-               $passwordFactory->setDefaultType( 'A' );
-               $pwhash = $passwordFactory->newFromPlaintext( 'foobaz' );
+               $passwordHash = $passwordFactory->newFromPlaintext( 'foobaz' );
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete(
@@ -65,7 +63,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                                [
                                        'bp_user' => 42,
                                        'bp_app_id' => 'BotPassword',
-                                       'bp_password' => $pwhash->toString(),
+                                       'bp_password' => $passwordHash->toString(),
                                        'bp_token' => 'token!',
                                        'bp_restrictions' => '{"IPAddresses":["127.0.0.0/8"]}',
                                        'bp_grants' => '["test"]',
@@ -73,7 +71,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                                [
                                        'bp_user' => 43,
                                        'bp_app_id' => 'BotPassword',
-                                       'bp_password' => $pwhash->toString(),
+                                       'bp_password' => $passwordHash->toString(),
                                        'bp_token' => 'token!',
                                        'bp_restrictions' => '{"IPAddresses":["127.0.0.0/8"]}',
                                        'bp_grants' => '["test"]',
@@ -311,8 +309,6 @@ class BotPasswordTest extends MediaWikiTestCase {
        public function testSave( $password ) {
                $passwordFactory = new \PasswordFactory();
                $passwordFactory->init( \RequestContext::getMain()->getConfig() );
-               // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
-               $passwordFactory->setDefaultType( 'A' );
 
                $bp = BotPassword::newUnsaved( [
                        'centralId' => 42,
@@ -325,9 +321,9 @@ class BotPasswordTest extends MediaWikiTestCase {
                        BotPassword::newFromCentralId( 42, 'TestSave', BotPassword::READ_LATEST ), 'sanity check'
                );
 
-               $pwhash = $password ? $passwordFactory->newFromPlaintext( $password ) : null;
-               $this->assertFalse( $bp->save( 'update', $pwhash ) );
-               $this->assertTrue( $bp->save( 'insert', $pwhash ) );
+               $passwordHash = $password ? $passwordFactory->newFromPlaintext( $password ) : null;
+               $this->assertFalse( $bp->save( 'update', $passwordHash ) );
+               $this->assertTrue( $bp->save( 'insert', $passwordHash ) );
                $bp2 = BotPassword::newFromCentralId( 42, 'TestSave', BotPassword::READ_LATEST );
                $this->assertInstanceOf( 'BotPassword', $bp2 );
                $this->assertEquals( $bp->getUserCentralId(), $bp2->getUserCentralId() );
@@ -356,9 +352,9 @@ class BotPasswordTest extends MediaWikiTestCase {
                        $this->assertTrue( $pw->equals( $password ) );
                }
 
-               $pwhash = $passwordFactory->newFromPlaintext( 'XXX' );
+               $passwordHash = $passwordFactory->newFromPlaintext( 'XXX' );
                $token = $bp->getToken();
-               $this->assertTrue( $bp->save( 'update', $pwhash ) );
+               $this->assertTrue( $bp->save( 'update', $passwordHash ) );
                $this->assertNotEquals( $token, $bp->getToken() );
                $pw = TestingAccessWrapper::newFromObject( $bp )->getPassword();
                $this->assertTrue( $pw->equals( 'XXX' ) );
index 63f5de0..ed18205 100644 (file)
@@ -16,7 +16,7 @@
        beStrictAboutTestsThatDoNotTestAnything="true"
        beStrictAboutOutputDuringTests="true"
        beStrictAboutTestSize="true"
-       verbose="true">
+       verbose="false">
        <testsuites>
                <testsuite name="includes">
                        <directory>includes</directory>